three.module.js 3.9 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154391553915639157391583915939160391613916239163391643916539166391673916839169391703917139172391733917439175391763917739178391793918039181391823918339184391853918639187391883918939190391913919239193391943919539196391973919839199392003920139202392033920439205392063920739208392093921039211392123921339214392153921639217392183921939220392213922239223392243922539226392273922839229392303923139232392333923439235392363923739238392393924039241392423924339244392453924639247392483924939250392513925239253392543925539256392573925839259392603926139262392633926439265392663926739268392693927039271392723927339274392753927639277392783927939280392813928239283392843928539286392873928839289392903929139292392933929439295392963929739298392993930039301393023930339304393053930639307393083930939310393113931239313393143931539316393173931839319393203932139322393233932439325393263932739328393293933039331393323933339334393353933639337393383933939340393413934239343393443934539346393473934839349393503935139352393533935439355393563935739358393593936039361393623936339364393653936639367393683936939370393713937239373393743937539376393773937839379393803938139382393833938439385393863938739388393893939039391393923939339394393953939639397393983939939400394013940239403394043940539406394073940839409394103941139412394133941439415394163941739418394193942039421394223942339424394253942639427394283942939430394313943239433394343943539436394373943839439394403944139442394433944439445394463944739448394493945039451394523945339454394553945639457394583945939460394613946239463394643946539466394673946839469394703947139472394733947439475394763947739478394793948039481394823948339484394853948639487394883948939490394913949239493394943949539496394973949839499395003950139502395033950439505395063950739508395093951039511395123951339514395153951639517395183951939520395213952239523395243952539526395273952839529395303953139532395333953439535395363953739538395393954039541395423954339544395453954639547395483954939550395513955239553395543955539556395573955839559395603956139562395633956439565395663956739568395693957039571395723957339574395753957639577395783957939580395813958239583395843958539586395873958839589395903959139592395933959439595395963959739598395993960039601396023960339604396053960639607396083960939610396113961239613396143961539616396173961839619396203962139622396233962439625396263962739628396293963039631396323963339634396353963639637396383963939640396413964239643396443964539646396473964839649396503965139652396533965439655396563965739658396593966039661396623966339664396653966639667396683966939670396713967239673396743967539676396773967839679396803968139682396833968439685396863968739688396893969039691396923969339694396953969639697396983969939700397013970239703397043970539706397073970839709397103971139712397133971439715397163971739718397193972039721397223972339724397253972639727397283972939730397313973239733397343973539736397373973839739397403974139742397433974439745397463974739748397493975039751397523975339754397553975639757397583975939760397613976239763397643976539766397673976839769397703977139772397733977439775397763977739778397793978039781397823978339784397853978639787397883978939790397913979239793397943979539796397973979839799398003980139802398033980439805398063980739808398093981039811398123981339814398153981639817398183981939820398213982239823398243982539826398273982839829398303983139832398333983439835398363983739838398393984039841398423984339844398453984639847398483984939850398513985239853398543985539856398573985839859398603986139862398633986439865398663986739868398693987039871398723987339874398753987639877398783987939880398813988239883398843988539886398873988839889398903989139892398933989439895398963989739898398993990039901399023990339904399053990639907399083990939910399113991239913399143991539916399173991839919399203992139922399233992439925399263992739928399293993039931399323993339934399353993639937399383993939940399413994239943399443994539946399473994839949399503995139952399533995439955399563995739958399593996039961399623996339964399653996639967399683996939970399713997239973399743997539976399773997839979399803998139982399833998439985399863998739988399893999039991399923999339994399953999639997399983999940000400014000240003400044000540006400074000840009400104001140012400134001440015400164001740018400194002040021400224002340024400254002640027400284002940030400314003240033400344003540036400374003840039400404004140042400434004440045400464004740048400494005040051400524005340054400554005640057400584005940060400614006240063400644006540066400674006840069400704007140072400734007440075400764007740078400794008040081400824008340084400854008640087400884008940090400914009240093400944009540096400974009840099401004010140102401034010440105401064010740108401094011040111401124011340114401154011640117401184011940120401214012240123401244012540126401274012840129401304013140132401334013440135401364013740138401394014040141401424014340144401454014640147401484014940150401514015240153401544015540156401574015840159401604016140162401634016440165401664016740168401694017040171401724017340174401754017640177401784017940180401814018240183401844018540186401874018840189401904019140192401934019440195401964019740198401994020040201402024020340204402054020640207402084020940210402114021240213402144021540216402174021840219402204022140222402234022440225402264022740228402294023040231402324023340234402354023640237402384023940240402414024240243402444024540246402474024840249402504025140252402534025440255402564025740258402594026040261402624026340264402654026640267402684026940270402714027240273402744027540276402774027840279402804028140282402834028440285402864028740288402894029040291402924029340294402954029640297402984029940300403014030240303403044030540306403074030840309403104031140312403134031440315403164031740318403194032040321403224032340324403254032640327403284032940330403314033240333403344033540336403374033840339403404034140342403434034440345403464034740348403494035040351403524035340354403554035640357403584035940360403614036240363403644036540366403674036840369403704037140372403734037440375403764037740378403794038040381403824038340384403854038640387403884038940390403914039240393403944039540396403974039840399404004040140402404034040440405404064040740408404094041040411404124041340414404154041640417404184041940420404214042240423404244042540426404274042840429404304043140432404334043440435404364043740438404394044040441404424044340444404454044640447404484044940450404514045240453404544045540456404574045840459404604046140462404634046440465404664046740468404694047040471404724047340474404754047640477404784047940480404814048240483404844048540486404874048840489404904049140492404934049440495404964049740498404994050040501405024050340504405054050640507405084050940510405114051240513405144051540516405174051840519405204052140522405234052440525405264052740528405294053040531405324053340534405354053640537405384053940540405414054240543405444054540546405474054840549405504055140552405534055440555405564055740558405594056040561405624056340564405654056640567405684056940570405714057240573405744057540576405774057840579405804058140582405834058440585405864058740588405894059040591405924059340594405954059640597405984059940600406014060240603406044060540606406074060840609406104061140612406134061440615406164061740618406194062040621406224062340624406254062640627406284062940630406314063240633406344063540636406374063840639406404064140642406434064440645406464064740648406494065040651406524065340654406554065640657406584065940660406614066240663406644066540666406674066840669406704067140672406734067440675406764067740678406794068040681406824068340684406854068640687406884068940690406914069240693406944069540696406974069840699407004070140702407034070440705407064070740708407094071040711407124071340714407154071640717407184071940720407214072240723407244072540726407274072840729407304073140732407334073440735407364073740738407394074040741407424074340744407454074640747407484074940750407514075240753407544075540756407574075840759407604076140762407634076440765407664076740768407694077040771407724077340774407754077640777407784077940780407814078240783407844078540786407874078840789407904079140792407934079440795407964079740798407994080040801408024080340804408054080640807408084080940810408114081240813408144081540816408174081840819408204082140822408234082440825408264082740828408294083040831408324083340834408354083640837408384083940840408414084240843408444084540846408474084840849408504085140852408534085440855408564085740858408594086040861408624086340864408654086640867408684086940870408714087240873408744087540876408774087840879408804088140882408834088440885408864088740888408894089040891408924089340894408954089640897408984089940900409014090240903409044090540906409074090840909409104091140912409134091440915409164091740918409194092040921409224092340924409254092640927409284092940930409314093240933409344093540936409374093840939409404094140942409434094440945409464094740948409494095040951409524095340954409554095640957409584095940960409614096240963409644096540966409674096840969409704097140972409734097440975409764097740978409794098040981409824098340984409854098640987409884098940990409914099240993409944099540996409974099840999410004100141002410034100441005410064100741008410094101041011410124101341014410154101641017410184101941020410214102241023410244102541026410274102841029410304103141032410334103441035410364103741038410394104041041410424104341044410454104641047410484104941050410514105241053410544105541056410574105841059410604106141062410634106441065410664106741068410694107041071410724107341074410754107641077410784107941080410814108241083410844108541086410874108841089410904109141092410934109441095410964109741098410994110041101411024110341104411054110641107411084110941110411114111241113411144111541116411174111841119411204112141122411234112441125411264112741128411294113041131411324113341134411354113641137411384113941140411414114241143411444114541146411474114841149411504115141152411534115441155411564115741158411594116041161411624116341164411654116641167411684116941170411714117241173411744117541176411774117841179411804118141182411834118441185411864118741188411894119041191411924119341194411954119641197411984119941200412014120241203412044120541206412074120841209412104121141212412134121441215412164121741218412194122041221412224122341224412254122641227412284122941230412314123241233412344123541236412374123841239412404124141242412434124441245412464124741248412494125041251412524125341254412554125641257412584125941260412614126241263412644126541266412674126841269412704127141272412734127441275412764127741278412794128041281412824128341284412854128641287412884128941290412914129241293412944129541296412974129841299413004130141302413034130441305413064130741308413094131041311413124131341314413154131641317413184131941320413214132241323413244132541326413274132841329413304133141332413334133441335413364133741338413394134041341413424134341344413454134641347413484134941350413514135241353413544135541356413574135841359413604136141362413634136441365413664136741368413694137041371413724137341374413754137641377413784137941380413814138241383413844138541386413874138841389413904139141392413934139441395413964139741398413994140041401414024140341404414054140641407414084140941410414114141241413414144141541416414174141841419414204142141422414234142441425414264142741428414294143041431414324143341434414354143641437414384143941440414414144241443414444144541446414474144841449414504145141452414534145441455414564145741458414594146041461414624146341464414654146641467414684146941470414714147241473414744147541476414774147841479414804148141482414834148441485414864148741488414894149041491414924149341494414954149641497414984149941500415014150241503415044150541506415074150841509415104151141512415134151441515415164151741518415194152041521415224152341524415254152641527415284152941530415314153241533415344153541536415374153841539415404154141542415434154441545415464154741548415494155041551415524155341554415554155641557415584155941560415614156241563415644156541566415674156841569415704157141572415734157441575415764157741578415794158041581415824158341584415854158641587415884158941590415914159241593415944159541596415974159841599416004160141602416034160441605416064160741608416094161041611416124161341614416154161641617416184161941620416214162241623416244162541626416274162841629416304163141632416334163441635416364163741638416394164041641416424164341644416454164641647416484164941650416514165241653416544165541656416574165841659416604166141662416634166441665416664166741668416694167041671416724167341674416754167641677416784167941680416814168241683416844168541686416874168841689416904169141692416934169441695416964169741698416994170041701417024170341704417054170641707417084170941710417114171241713417144171541716417174171841719417204172141722417234172441725417264172741728417294173041731417324173341734417354173641737417384173941740417414174241743417444174541746417474174841749417504175141752417534175441755417564175741758417594176041761417624176341764417654176641767417684176941770417714177241773417744177541776417774177841779417804178141782417834178441785417864178741788417894179041791417924179341794417954179641797417984179941800418014180241803418044180541806418074180841809418104181141812418134181441815418164181741818418194182041821418224182341824418254182641827418284182941830418314183241833418344183541836418374183841839418404184141842418434184441845418464184741848418494185041851418524185341854418554185641857418584185941860418614186241863418644186541866418674186841869418704187141872418734187441875418764187741878418794188041881418824188341884418854188641887418884188941890418914189241893418944189541896418974189841899419004190141902419034190441905419064190741908419094191041911419124191341914419154191641917419184191941920419214192241923419244192541926419274192841929419304193141932419334193441935419364193741938419394194041941419424194341944419454194641947419484194941950419514195241953419544195541956419574195841959419604196141962419634196441965419664196741968419694197041971419724197341974419754197641977419784197941980419814198241983419844198541986419874198841989419904199141992419934199441995419964199741998419994200042001420024200342004420054200642007420084200942010420114201242013420144201542016420174201842019420204202142022420234202442025420264202742028420294203042031420324203342034420354203642037420384203942040420414204242043420444204542046420474204842049420504205142052420534205442055420564205742058420594206042061420624206342064420654206642067420684206942070420714207242073420744207542076420774207842079420804208142082420834208442085420864208742088420894209042091420924209342094420954209642097420984209942100421014210242103421044210542106421074210842109421104211142112421134211442115421164211742118421194212042121421224212342124421254212642127421284212942130421314213242133421344213542136421374213842139421404214142142421434214442145421464214742148421494215042151421524215342154421554215642157421584215942160421614216242163421644216542166421674216842169421704217142172421734217442175421764217742178421794218042181421824218342184421854218642187421884218942190421914219242193421944219542196421974219842199422004220142202422034220442205422064220742208422094221042211422124221342214422154221642217422184221942220422214222242223422244222542226422274222842229422304223142232422334223442235422364223742238422394224042241422424224342244422454224642247422484224942250422514225242253422544225542256422574225842259422604226142262422634226442265422664226742268422694227042271422724227342274422754227642277422784227942280422814228242283422844228542286422874228842289422904229142292422934229442295422964229742298422994230042301423024230342304423054230642307423084230942310423114231242313423144231542316423174231842319423204232142322423234232442325423264232742328423294233042331423324233342334423354233642337423384233942340423414234242343423444234542346423474234842349423504235142352423534235442355423564235742358423594236042361423624236342364423654236642367423684236942370423714237242373423744237542376423774237842379423804238142382423834238442385423864238742388423894239042391423924239342394423954239642397423984239942400424014240242403424044240542406424074240842409424104241142412424134241442415424164241742418424194242042421424224242342424424254242642427424284242942430424314243242433424344243542436424374243842439424404244142442424434244442445424464244742448424494245042451424524245342454424554245642457424584245942460424614246242463424644246542466424674246842469424704247142472424734247442475424764247742478424794248042481424824248342484424854248642487424884248942490424914249242493424944249542496424974249842499425004250142502425034250442505425064250742508425094251042511425124251342514425154251642517425184251942520425214252242523425244252542526425274252842529425304253142532425334253442535425364253742538425394254042541425424254342544425454254642547425484254942550425514255242553425544255542556425574255842559425604256142562425634256442565425664256742568425694257042571425724257342574425754257642577425784257942580425814258242583425844258542586425874258842589425904259142592425934259442595425964259742598425994260042601426024260342604426054260642607426084260942610426114261242613426144261542616426174261842619426204262142622426234262442625426264262742628426294263042631426324263342634426354263642637426384263942640426414264242643426444264542646426474264842649426504265142652426534265442655426564265742658426594266042661426624266342664426654266642667426684266942670426714267242673426744267542676426774267842679426804268142682426834268442685426864268742688426894269042691426924269342694426954269642697426984269942700427014270242703427044270542706427074270842709427104271142712427134271442715427164271742718427194272042721427224272342724427254272642727427284272942730427314273242733427344273542736427374273842739427404274142742427434274442745427464274742748427494275042751427524275342754427554275642757427584275942760427614276242763427644276542766427674276842769427704277142772427734277442775427764277742778427794278042781427824278342784427854278642787427884278942790427914279242793427944279542796427974279842799428004280142802428034280442805428064280742808428094281042811428124281342814428154281642817428184281942820428214282242823428244282542826428274282842829428304283142832428334283442835428364283742838428394284042841428424284342844428454284642847428484284942850428514285242853428544285542856428574285842859428604286142862428634286442865428664286742868428694287042871428724287342874428754287642877428784287942880428814288242883428844288542886428874288842889428904289142892428934289442895428964289742898428994290042901429024290342904429054290642907429084290942910429114291242913429144291542916429174291842919429204292142922429234292442925429264292742928429294293042931429324293342934429354293642937429384293942940429414294242943429444294542946429474294842949429504295142952429534295442955429564295742958429594296042961429624296342964429654296642967429684296942970429714297242973429744297542976429774297842979429804298142982429834298442985429864298742988429894299042991429924299342994429954299642997429984299943000430014300243003430044300543006430074300843009430104301143012430134301443015430164301743018430194302043021430224302343024430254302643027430284302943030430314303243033430344303543036430374303843039430404304143042430434304443045430464304743048430494305043051430524305343054430554305643057430584305943060430614306243063430644306543066430674306843069430704307143072430734307443075430764307743078430794308043081430824308343084430854308643087430884308943090430914309243093430944309543096430974309843099431004310143102431034310443105431064310743108431094311043111431124311343114431154311643117431184311943120431214312243123431244312543126431274312843129431304313143132431334313443135431364313743138431394314043141431424314343144431454314643147431484314943150431514315243153431544315543156431574315843159431604316143162431634316443165431664316743168431694317043171431724317343174431754317643177431784317943180431814318243183431844318543186431874318843189431904319143192431934319443195431964319743198431994320043201432024320343204432054320643207432084320943210432114321243213432144321543216432174321843219432204322143222432234322443225432264322743228432294323043231432324323343234432354323643237432384323943240432414324243243432444324543246432474324843249432504325143252432534325443255432564325743258432594326043261432624326343264432654326643267432684326943270432714327243273432744327543276432774327843279432804328143282432834328443285432864328743288432894329043291432924329343294432954329643297432984329943300433014330243303433044330543306433074330843309433104331143312433134331443315433164331743318433194332043321433224332343324433254332643327433284332943330433314333243333433344333543336433374333843339433404334143342433434334443345433464334743348433494335043351433524335343354433554335643357433584335943360433614336243363433644336543366433674336843369433704337143372433734337443375433764337743378433794338043381433824338343384433854338643387433884338943390433914339243393433944339543396433974339843399434004340143402434034340443405434064340743408434094341043411434124341343414434154341643417434184341943420434214342243423434244342543426434274342843429434304343143432434334343443435434364343743438434394344043441434424344343444434454344643447434484344943450434514345243453434544345543456434574345843459434604346143462434634346443465434664346743468434694347043471434724347343474434754347643477434784347943480434814348243483434844348543486434874348843489434904349143492434934349443495434964349743498434994350043501435024350343504435054350643507435084350943510435114351243513435144351543516435174351843519435204352143522435234352443525435264352743528435294353043531435324353343534435354353643537435384353943540435414354243543435444354543546435474354843549435504355143552435534355443555435564355743558435594356043561435624356343564435654356643567435684356943570435714357243573435744357543576435774357843579435804358143582435834358443585435864358743588435894359043591435924359343594435954359643597435984359943600436014360243603436044360543606436074360843609436104361143612436134361443615436164361743618436194362043621436224362343624436254362643627436284362943630436314363243633436344363543636436374363843639436404364143642436434364443645436464364743648436494365043651436524365343654436554365643657436584365943660436614366243663436644366543666436674366843669436704367143672436734367443675436764367743678436794368043681436824368343684436854368643687436884368943690436914369243693436944369543696436974369843699437004370143702437034370443705437064370743708437094371043711437124371343714437154371643717437184371943720437214372243723437244372543726437274372843729437304373143732437334373443735437364373743738437394374043741437424374343744437454374643747437484374943750437514375243753437544375543756437574375843759437604376143762437634376443765437664376743768437694377043771437724377343774437754377643777437784377943780437814378243783437844378543786437874378843789437904379143792437934379443795437964379743798437994380043801438024380343804438054380643807438084380943810438114381243813438144381543816438174381843819438204382143822438234382443825438264382743828438294383043831438324383343834438354383643837438384383943840438414384243843438444384543846438474384843849438504385143852438534385443855438564385743858438594386043861438624386343864438654386643867438684386943870438714387243873438744387543876438774387843879438804388143882438834388443885438864388743888438894389043891438924389343894438954389643897438984389943900439014390243903439044390543906439074390843909439104391143912439134391443915439164391743918439194392043921439224392343924439254392643927439284392943930439314393243933439344393543936439374393843939439404394143942439434394443945439464394743948439494395043951439524395343954439554395643957439584395943960439614396243963439644396543966439674396843969439704397143972439734397443975439764397743978439794398043981439824398343984439854398643987439884398943990439914399243993439944399543996439974399843999440004400144002440034400444005440064400744008440094401044011440124401344014440154401644017440184401944020440214402244023440244402544026440274402844029440304403144032440334403444035440364403744038440394404044041440424404344044440454404644047440484404944050440514405244053440544405544056440574405844059440604406144062440634406444065440664406744068440694407044071440724407344074440754407644077440784407944080440814408244083440844408544086440874408844089440904409144092440934409444095440964409744098440994410044101441024410344104441054410644107441084410944110441114411244113441144411544116441174411844119441204412144122441234412444125441264412744128441294413044131441324413344134441354413644137441384413944140441414414244143441444414544146441474414844149441504415144152441534415444155441564415744158441594416044161441624416344164441654416644167441684416944170441714417244173441744417544176441774417844179441804418144182441834418444185441864418744188441894419044191441924419344194441954419644197441984419944200442014420244203442044420544206442074420844209442104421144212442134421444215442164421744218442194422044221442224422344224442254422644227442284422944230442314423244233442344423544236442374423844239442404424144242442434424444245442464424744248442494425044251442524425344254442554425644257442584425944260442614426244263442644426544266442674426844269442704427144272442734427444275442764427744278442794428044281442824428344284442854428644287442884428944290442914429244293442944429544296442974429844299443004430144302443034430444305443064430744308443094431044311443124431344314443154431644317443184431944320443214432244323443244432544326443274432844329443304433144332443334433444335443364433744338443394434044341443424434344344443454434644347443484434944350443514435244353443544435544356443574435844359443604436144362443634436444365443664436744368443694437044371443724437344374443754437644377443784437944380443814438244383443844438544386443874438844389443904439144392443934439444395443964439744398443994440044401444024440344404444054440644407444084440944410444114441244413444144441544416444174441844419444204442144422444234442444425444264442744428444294443044431444324443344434444354443644437444384443944440444414444244443444444444544446444474444844449444504445144452444534445444455444564445744458444594446044461444624446344464444654446644467444684446944470444714447244473444744447544476444774447844479444804448144482444834448444485444864448744488444894449044491444924449344494444954449644497444984449944500445014450244503445044450544506445074450844509445104451144512445134451444515445164451744518445194452044521445224452344524445254452644527445284452944530445314453244533445344453544536445374453844539445404454144542445434454444545445464454744548445494455044551445524455344554445554455644557445584455944560445614456244563445644456544566445674456844569445704457144572445734457444575445764457744578445794458044581445824458344584445854458644587445884458944590445914459244593445944459544596445974459844599446004460144602446034460444605446064460744608446094461044611446124461344614446154461644617446184461944620446214462244623446244462544626446274462844629446304463144632446334463444635446364463744638446394464044641446424464344644446454464644647446484464944650446514465244653446544465544656446574465844659446604466144662446634466444665446664466744668446694467044671446724467344674446754467644677446784467944680446814468244683446844468544686446874468844689446904469144692446934469444695446964469744698446994470044701447024470344704447054470644707447084470944710447114471244713447144471544716447174471844719447204472144722447234472444725447264472744728447294473044731447324473344734447354473644737447384473944740447414474244743447444474544746447474474844749447504475144752447534475444755447564475744758447594476044761447624476344764447654476644767447684476944770447714477244773447744477544776447774477844779447804478144782447834478444785447864478744788447894479044791447924479344794447954479644797447984479944800448014480244803448044480544806448074480844809448104481144812448134481444815448164481744818448194482044821448224482344824448254482644827448284482944830448314483244833448344483544836448374483844839448404484144842448434484444845448464484744848448494485044851448524485344854448554485644857448584485944860448614486244863448644486544866448674486844869448704487144872448734487444875448764487744878448794488044881448824488344884448854488644887448884488944890448914489244893448944489544896448974489844899449004490144902449034490444905449064490744908449094491044911449124491344914449154491644917449184491944920449214492244923449244492544926449274492844929449304493144932449334493444935449364493744938449394494044941449424494344944449454494644947449484494944950449514495244953449544495544956449574495844959449604496144962449634496444965449664496744968449694497044971449724497344974449754497644977449784497944980449814498244983449844498544986449874498844989449904499144992449934499444995449964499744998449994500045001450024500345004450054500645007450084500945010450114501245013450144501545016450174501845019450204502145022450234502445025450264502745028450294503045031450324503345034450354503645037450384503945040450414504245043450444504545046450474504845049450504505145052450534505445055450564505745058450594506045061450624506345064450654506645067450684506945070450714507245073450744507545076450774507845079450804508145082450834508445085450864508745088450894509045091450924509345094450954509645097450984509945100451014510245103451044510545106451074510845109451104511145112451134511445115451164511745118451194512045121451224512345124451254512645127451284512945130451314513245133451344513545136451374513845139451404514145142451434514445145451464514745148451494515045151451524515345154451554515645157451584515945160451614516245163451644516545166451674516845169451704517145172451734517445175451764517745178451794518045181451824518345184451854518645187451884518945190451914519245193451944519545196451974519845199452004520145202452034520445205452064520745208452094521045211452124521345214452154521645217452184521945220452214522245223452244522545226452274522845229452304523145232452334523445235452364523745238452394524045241452424524345244452454524645247452484524945250452514525245253452544525545256452574525845259452604526145262452634526445265452664526745268452694527045271452724527345274452754527645277452784527945280452814528245283452844528545286452874528845289452904529145292452934529445295452964529745298452994530045301453024530345304453054530645307453084530945310453114531245313453144531545316453174531845319453204532145322453234532445325453264532745328453294533045331453324533345334453354533645337453384533945340453414534245343453444534545346453474534845349453504535145352453534535445355453564535745358453594536045361453624536345364453654536645367453684536945370453714537245373453744537545376453774537845379453804538145382453834538445385453864538745388453894539045391453924539345394453954539645397453984539945400454014540245403454044540545406454074540845409454104541145412454134541445415454164541745418454194542045421454224542345424454254542645427454284542945430454314543245433454344543545436454374543845439454404544145442454434544445445454464544745448454494545045451454524545345454454554545645457454584545945460454614546245463454644546545466454674546845469454704547145472454734547445475454764547745478454794548045481454824548345484454854548645487454884548945490454914549245493454944549545496454974549845499455004550145502455034550445505455064550745508455094551045511455124551345514455154551645517455184551945520455214552245523455244552545526455274552845529455304553145532455334553445535455364553745538455394554045541455424554345544455454554645547455484554945550455514555245553455544555545556455574555845559455604556145562455634556445565455664556745568455694557045571455724557345574455754557645577455784557945580455814558245583455844558545586455874558845589455904559145592455934559445595455964559745598455994560045601456024560345604456054560645607456084560945610456114561245613456144561545616456174561845619456204562145622456234562445625456264562745628456294563045631456324563345634456354563645637456384563945640456414564245643456444564545646456474564845649456504565145652456534565445655456564565745658456594566045661456624566345664456654566645667456684566945670456714567245673456744567545676456774567845679456804568145682456834568445685456864568745688456894569045691456924569345694456954569645697456984569945700457014570245703457044570545706457074570845709457104571145712457134571445715457164571745718457194572045721457224572345724457254572645727457284572945730457314573245733457344573545736457374573845739457404574145742457434574445745457464574745748457494575045751457524575345754457554575645757457584575945760457614576245763457644576545766457674576845769457704577145772457734577445775457764577745778457794578045781457824578345784457854578645787457884578945790457914579245793457944579545796457974579845799458004580145802458034580445805458064580745808458094581045811458124581345814458154581645817458184581945820458214582245823458244582545826458274582845829458304583145832458334583445835458364583745838458394584045841458424584345844458454584645847458484584945850458514585245853458544585545856458574585845859458604586145862458634586445865458664586745868458694587045871458724587345874458754587645877458784587945880458814588245883458844588545886458874588845889458904589145892458934589445895458964589745898458994590045901459024590345904459054590645907459084590945910459114591245913459144591545916459174591845919459204592145922459234592445925459264592745928459294593045931459324593345934459354593645937459384593945940459414594245943459444594545946459474594845949459504595145952459534595445955459564595745958459594596045961459624596345964459654596645967459684596945970459714597245973459744597545976459774597845979459804598145982459834598445985459864598745988459894599045991459924599345994459954599645997459984599946000460014600246003460044600546006460074600846009460104601146012460134601446015460164601746018460194602046021460224602346024460254602646027460284602946030460314603246033460344603546036460374603846039460404604146042460434604446045460464604746048460494605046051460524605346054460554605646057460584605946060460614606246063460644606546066460674606846069460704607146072460734607446075460764607746078460794608046081460824608346084460854608646087460884608946090460914609246093460944609546096460974609846099461004610146102461034610446105461064610746108461094611046111461124611346114461154611646117461184611946120461214612246123461244612546126461274612846129461304613146132461334613446135461364613746138461394614046141461424614346144461454614646147461484614946150461514615246153461544615546156461574615846159461604616146162461634616446165461664616746168461694617046171461724617346174461754617646177461784617946180461814618246183461844618546186461874618846189461904619146192461934619446195461964619746198461994620046201462024620346204462054620646207462084620946210462114621246213462144621546216462174621846219462204622146222462234622446225462264622746228462294623046231462324623346234462354623646237462384623946240462414624246243462444624546246462474624846249462504625146252462534625446255462564625746258462594626046261462624626346264462654626646267462684626946270462714627246273462744627546276462774627846279462804628146282462834628446285462864628746288462894629046291462924629346294462954629646297462984629946300463014630246303463044630546306463074630846309463104631146312463134631446315463164631746318463194632046321463224632346324463254632646327463284632946330463314633246333463344633546336463374633846339463404634146342463434634446345463464634746348463494635046351463524635346354463554635646357463584635946360463614636246363463644636546366463674636846369463704637146372463734637446375463764637746378463794638046381463824638346384463854638646387463884638946390463914639246393463944639546396463974639846399464004640146402464034640446405464064640746408464094641046411464124641346414464154641646417464184641946420464214642246423464244642546426464274642846429464304643146432464334643446435464364643746438464394644046441464424644346444464454644646447464484644946450464514645246453464544645546456464574645846459464604646146462464634646446465464664646746468464694647046471464724647346474464754647646477464784647946480464814648246483464844648546486464874648846489464904649146492464934649446495464964649746498464994650046501465024650346504465054650646507465084650946510465114651246513465144651546516465174651846519465204652146522465234652446525465264652746528465294653046531465324653346534465354653646537465384653946540465414654246543465444654546546465474654846549465504655146552465534655446555465564655746558465594656046561465624656346564465654656646567465684656946570465714657246573465744657546576465774657846579465804658146582465834658446585465864658746588465894659046591465924659346594465954659646597465984659946600466014660246603466044660546606466074660846609466104661146612466134661446615466164661746618466194662046621466224662346624466254662646627466284662946630466314663246633466344663546636466374663846639466404664146642466434664446645466464664746648466494665046651466524665346654466554665646657466584665946660466614666246663466644666546666466674666846669466704667146672466734667446675466764667746678466794668046681466824668346684466854668646687466884668946690466914669246693466944669546696466974669846699467004670146702467034670446705467064670746708467094671046711467124671346714467154671646717467184671946720467214672246723467244672546726467274672846729467304673146732467334673446735467364673746738467394674046741467424674346744467454674646747467484674946750467514675246753467544675546756467574675846759467604676146762467634676446765467664676746768467694677046771467724677346774467754677646777467784677946780467814678246783467844678546786467874678846789467904679146792467934679446795467964679746798467994680046801468024680346804468054680646807468084680946810468114681246813468144681546816468174681846819468204682146822468234682446825468264682746828468294683046831468324683346834468354683646837468384683946840468414684246843468444684546846468474684846849468504685146852468534685446855468564685746858468594686046861468624686346864468654686646867468684686946870468714687246873468744687546876468774687846879468804688146882468834688446885468864688746888468894689046891468924689346894468954689646897468984689946900469014690246903469044690546906469074690846909469104691146912469134691446915469164691746918469194692046921469224692346924469254692646927469284692946930469314693246933469344693546936469374693846939469404694146942469434694446945469464694746948469494695046951469524695346954469554695646957469584695946960469614696246963469644696546966469674696846969469704697146972469734697446975469764697746978469794698046981469824698346984469854698646987469884698946990469914699246993469944699546996469974699846999470004700147002470034700447005470064700747008470094701047011470124701347014470154701647017470184701947020470214702247023470244702547026470274702847029470304703147032470334703447035470364703747038470394704047041470424704347044470454704647047470484704947050470514705247053470544705547056470574705847059470604706147062470634706447065470664706747068470694707047071470724707347074470754707647077470784707947080470814708247083470844708547086470874708847089470904709147092470934709447095470964709747098470994710047101471024710347104471054710647107471084710947110471114711247113471144711547116471174711847119471204712147122471234712447125471264712747128471294713047131471324713347134471354713647137471384713947140471414714247143471444714547146471474714847149471504715147152471534715447155471564715747158471594716047161471624716347164471654716647167471684716947170471714717247173471744717547176471774717847179471804718147182471834718447185471864718747188471894719047191471924719347194471954719647197471984719947200472014720247203472044720547206472074720847209472104721147212472134721447215472164721747218472194722047221472224722347224472254722647227472284722947230472314723247233472344723547236472374723847239472404724147242472434724447245472464724747248472494725047251472524725347254472554725647257472584725947260472614726247263472644726547266472674726847269472704727147272472734727447275472764727747278472794728047281472824728347284472854728647287472884728947290472914729247293472944729547296472974729847299473004730147302473034730447305473064730747308473094731047311473124731347314473154731647317473184731947320473214732247323473244732547326473274732847329473304733147332473334733447335473364733747338473394734047341473424734347344473454734647347473484734947350473514735247353473544735547356473574735847359473604736147362473634736447365473664736747368473694737047371473724737347374473754737647377473784737947380473814738247383473844738547386473874738847389473904739147392473934739447395473964739747398473994740047401474024740347404474054740647407474084740947410474114741247413474144741547416474174741847419474204742147422474234742447425474264742747428474294743047431474324743347434474354743647437474384743947440474414744247443474444744547446474474744847449474504745147452474534745447455474564745747458474594746047461474624746347464474654746647467474684746947470474714747247473474744747547476474774747847479474804748147482474834748447485474864748747488
  1. // Polyfills
  2. if ( Number.EPSILON === undefined ) {
  3. Number.EPSILON = Math.pow( 2, - 52 );
  4. }
  5. if ( Number.isInteger === undefined ) {
  6. // Missing in IE
  7. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
  8. Number.isInteger = function ( value ) {
  9. return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value;
  10. };
  11. }
  12. //
  13. if ( Math.sign === undefined ) {
  14. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign
  15. Math.sign = function ( x ) {
  16. return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;
  17. };
  18. }
  19. if ( 'name' in Function.prototype === false ) {
  20. // Missing in IE
  21. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name
  22. Object.defineProperty( Function.prototype, 'name', {
  23. get: function () {
  24. return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ];
  25. }
  26. } );
  27. }
  28. if ( Object.assign === undefined ) {
  29. // Missing in IE
  30. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
  31. ( function () {
  32. Object.assign = function ( target ) {
  33. if ( target === undefined || target === null ) {
  34. throw new TypeError( 'Cannot convert undefined or null to object' );
  35. }
  36. var output = Object( target );
  37. for ( var index = 1; index < arguments.length; index ++ ) {
  38. var source = arguments[ index ];
  39. if ( source !== undefined && source !== null ) {
  40. for ( var nextKey in source ) {
  41. if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {
  42. output[ nextKey ] = source[ nextKey ];
  43. }
  44. }
  45. }
  46. }
  47. return output;
  48. };
  49. } )();
  50. }
  51. /**
  52. * https://github.com/mrdoob/eventdispatcher.js/
  53. */
  54. function EventDispatcher() {}
  55. Object.assign( EventDispatcher.prototype, {
  56. addEventListener: function ( type, listener ) {
  57. if ( this._listeners === undefined ) this._listeners = {};
  58. var listeners = this._listeners;
  59. if ( listeners[ type ] === undefined ) {
  60. listeners[ type ] = [];
  61. }
  62. if ( listeners[ type ].indexOf( listener ) === - 1 ) {
  63. listeners[ type ].push( listener );
  64. }
  65. },
  66. hasEventListener: function ( type, listener ) {
  67. if ( this._listeners === undefined ) return false;
  68. var listeners = this._listeners;
  69. return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;
  70. },
  71. removeEventListener: function ( type, listener ) {
  72. if ( this._listeners === undefined ) return;
  73. var listeners = this._listeners;
  74. var listenerArray = listeners[ type ];
  75. if ( listenerArray !== undefined ) {
  76. var index = listenerArray.indexOf( listener );
  77. if ( index !== - 1 ) {
  78. listenerArray.splice( index, 1 );
  79. }
  80. }
  81. },
  82. dispatchEvent: function ( event ) {
  83. if ( this._listeners === undefined ) return;
  84. var listeners = this._listeners;
  85. var listenerArray = listeners[ event.type ];
  86. if ( listenerArray !== undefined ) {
  87. event.target = this;
  88. var array = listenerArray.slice( 0 );
  89. for ( var i = 0, l = array.length; i < l; i ++ ) {
  90. array[ i ].call( this, event );
  91. }
  92. }
  93. }
  94. } );
  95. var REVISION = '95';
  96. var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };
  97. var CullFaceNone = 0;
  98. var CullFaceBack = 1;
  99. var CullFaceFront = 2;
  100. var CullFaceFrontBack = 3;
  101. var FrontFaceDirectionCW = 0;
  102. var FrontFaceDirectionCCW = 1;
  103. var BasicShadowMap = 0;
  104. var PCFShadowMap = 1;
  105. var PCFSoftShadowMap = 2;
  106. var FrontSide = 0;
  107. var BackSide = 1;
  108. var DoubleSide = 2;
  109. var FlatShading = 1;
  110. var SmoothShading = 2;
  111. var NoColors = 0;
  112. var FaceColors = 1;
  113. var VertexColors = 2;
  114. var NoBlending = 0;
  115. var NormalBlending = 1;
  116. var AdditiveBlending = 2;
  117. var SubtractiveBlending = 3;
  118. var MultiplyBlending = 4;
  119. var CustomBlending = 5;
  120. var AddEquation = 100;
  121. var SubtractEquation = 101;
  122. var ReverseSubtractEquation = 102;
  123. var MinEquation = 103;
  124. var MaxEquation = 104;
  125. var ZeroFactor = 200;
  126. var OneFactor = 201;
  127. var SrcColorFactor = 202;
  128. var OneMinusSrcColorFactor = 203;
  129. var SrcAlphaFactor = 204;
  130. var OneMinusSrcAlphaFactor = 205;
  131. var DstAlphaFactor = 206;
  132. var OneMinusDstAlphaFactor = 207;
  133. var DstColorFactor = 208;
  134. var OneMinusDstColorFactor = 209;
  135. var SrcAlphaSaturateFactor = 210;
  136. var NeverDepth = 0;
  137. var AlwaysDepth = 1;
  138. var LessDepth = 2;
  139. var LessEqualDepth = 3;
  140. var EqualDepth = 4;
  141. var GreaterEqualDepth = 5;
  142. var GreaterDepth = 6;
  143. var NotEqualDepth = 7;
  144. var MultiplyOperation = 0;
  145. var MixOperation = 1;
  146. var AddOperation = 2;
  147. var NoToneMapping = 0;
  148. var LinearToneMapping = 1;
  149. var ReinhardToneMapping = 2;
  150. var Uncharted2ToneMapping = 3;
  151. var CineonToneMapping = 4;
  152. var UVMapping = 300;
  153. var CubeReflectionMapping = 301;
  154. var CubeRefractionMapping = 302;
  155. var EquirectangularReflectionMapping = 303;
  156. var EquirectangularRefractionMapping = 304;
  157. var SphericalReflectionMapping = 305;
  158. var CubeUVReflectionMapping = 306;
  159. var CubeUVRefractionMapping = 307;
  160. var RepeatWrapping = 1000;
  161. var ClampToEdgeWrapping = 1001;
  162. var MirroredRepeatWrapping = 1002;
  163. var NearestFilter = 1003;
  164. var NearestMipMapNearestFilter = 1004;
  165. var NearestMipMapLinearFilter = 1005;
  166. var LinearFilter = 1006;
  167. var LinearMipMapNearestFilter = 1007;
  168. var LinearMipMapLinearFilter = 1008;
  169. var UnsignedByteType = 1009;
  170. var ByteType = 1010;
  171. var ShortType = 1011;
  172. var UnsignedShortType = 1012;
  173. var IntType = 1013;
  174. var UnsignedIntType = 1014;
  175. var FloatType = 1015;
  176. var HalfFloatType = 1016;
  177. var UnsignedShort4444Type = 1017;
  178. var UnsignedShort5551Type = 1018;
  179. var UnsignedShort565Type = 1019;
  180. var UnsignedInt248Type = 1020;
  181. var AlphaFormat = 1021;
  182. var RGBFormat = 1022;
  183. var RGBAFormat = 1023;
  184. var LuminanceFormat = 1024;
  185. var LuminanceAlphaFormat = 1025;
  186. var RGBEFormat = RGBAFormat;
  187. var DepthFormat = 1026;
  188. var DepthStencilFormat = 1027;
  189. var RGB_S3TC_DXT1_Format = 33776;
  190. var RGBA_S3TC_DXT1_Format = 33777;
  191. var RGBA_S3TC_DXT3_Format = 33778;
  192. var RGBA_S3TC_DXT5_Format = 33779;
  193. var RGB_PVRTC_4BPPV1_Format = 35840;
  194. var RGB_PVRTC_2BPPV1_Format = 35841;
  195. var RGBA_PVRTC_4BPPV1_Format = 35842;
  196. var RGBA_PVRTC_2BPPV1_Format = 35843;
  197. var RGB_ETC1_Format = 36196;
  198. var RGBA_ASTC_4x4_Format = 37808;
  199. var RGBA_ASTC_5x4_Format = 37809;
  200. var RGBA_ASTC_5x5_Format = 37810;
  201. var RGBA_ASTC_6x5_Format = 37811;
  202. var RGBA_ASTC_6x6_Format = 37812;
  203. var RGBA_ASTC_8x5_Format = 37813;
  204. var RGBA_ASTC_8x6_Format = 37814;
  205. var RGBA_ASTC_8x8_Format = 37815;
  206. var RGBA_ASTC_10x5_Format = 37816;
  207. var RGBA_ASTC_10x6_Format = 37817;
  208. var RGBA_ASTC_10x8_Format = 37818;
  209. var RGBA_ASTC_10x10_Format = 37819;
  210. var RGBA_ASTC_12x10_Format = 37820;
  211. var RGBA_ASTC_12x12_Format = 37821;
  212. var LoopOnce = 2200;
  213. var LoopRepeat = 2201;
  214. var LoopPingPong = 2202;
  215. var InterpolateDiscrete = 2300;
  216. var InterpolateLinear = 2301;
  217. var InterpolateSmooth = 2302;
  218. var ZeroCurvatureEnding = 2400;
  219. var ZeroSlopeEnding = 2401;
  220. var WrapAroundEnding = 2402;
  221. var TrianglesDrawMode = 0;
  222. var TriangleStripDrawMode = 1;
  223. var TriangleFanDrawMode = 2;
  224. var LinearEncoding = 3000;
  225. var sRGBEncoding = 3001;
  226. var GammaEncoding = 3007;
  227. var RGBEEncoding = 3002;
  228. var LogLuvEncoding = 3003;
  229. var RGBM7Encoding = 3004;
  230. var RGBM16Encoding = 3005;
  231. var RGBDEncoding = 3006;
  232. var BasicDepthPacking = 3200;
  233. var RGBADepthPacking = 3201;
  234. var TangentSpaceNormalMap = 0;
  235. var ObjectSpaceNormalMap = 1;
  236. //xst
  237. var Matrix = {
  238. type: Float32Array,
  239. create: function(a, c, b, d, e, f, g, h, k, n, m, l, p, r, s, u) {
  240. var q = new Matrix.type(16);
  241. q[0] = a;
  242. q[4] = c;
  243. q[8] = b;
  244. q[12] = d;
  245. q[1] = e;
  246. q[5] = f;
  247. q[9] = g;
  248. q[13] = h;
  249. q[2] = k;
  250. q[6] = n;
  251. q[10] = m;
  252. q[14] = l;
  253. q[3] = p;
  254. q[7] = r;
  255. q[11] = s;
  256. q[15] = u;
  257. return q
  258. },
  259. empty: function() {
  260. return new Matrix.type(16)
  261. },
  262. identity: function() {
  263. var a = new Matrix.type(16);
  264. a[0] = 1;
  265. a[4] = 0;
  266. a[8] = 0;
  267. a[12] = 0;
  268. a[1] = 0;
  269. a[5] = 1;
  270. a[9] = 0;
  271. a[13] = 0;
  272. a[2] = 0;
  273. a[6] = 0;
  274. a[10] = 1;
  275. a[14] = 0;
  276. a[3] = 0;
  277. a[7] = 0;
  278. a[11] = 0;
  279. a[15] = 1;
  280. return a
  281. },
  282. set: function(a, c, b, d, e, f, g, h, k, n, m, l, p, r, s, u, q) {
  283. a[0] = c;
  284. a[4] = b;
  285. a[8] = d;
  286. a[12] = e;
  287. a[1] = f;
  288. a[5] = g;
  289. a[9] = h;
  290. a[13] = k;
  291. a[2] = n;
  292. a[6] = m;
  293. a[10] = l;
  294. a[14] = p;
  295. a[3] = r;
  296. a[7] = s;
  297. a[11] = u;
  298. a[15] = q;
  299. },
  300. translation: function(a, c, b, d) {
  301. Matrix.set(a, 1, 0, 0, c, 0, 1, 0, b, 0, 0, 1, d, 0, 0, 0, 1);
  302. return a
  303. },
  304. rotation: function(a, c, b) {
  305. a[0] = 1;
  306. a[4] = 0;
  307. a[8] = 0;
  308. a[12] = 0;
  309. a[1] = 0;
  310. a[5] = 1;
  311. a[9] = 0;
  312. a[13] = 0;
  313. a[2] = 0;
  314. a[6] = 0;
  315. a[10] = 1;
  316. a[14] = 0;
  317. a[3] = 0;
  318. a[7] = 0;
  319. a[11] = 0;
  320. a[15] = 1;
  321. var d = 0.0174532925 * c;
  322. c = Math.sin(d);
  323. d = Math.cos(d);
  324. switch (b) {
  325. case 0:
  326. a[5] = d;
  327. a[9] = -c;
  328. a[6] = c;
  329. a[10] = d;
  330. break;
  331. case 1:
  332. a[0] = d;
  333. a[8] = c;
  334. a[2] = -c;
  335. a[10] = d;
  336. break;
  337. case 2:
  338. a[0] = d,
  339. a[4] = -c,
  340. a[1] = c,
  341. a[5] = d;
  342. }
  343. return a
  344. },
  345. mul: function(a, c, b) {
  346. var d = c[0]
  347. , e = c[1]
  348. , f = c[2]
  349. , g = c[3]
  350. , h = c[4]
  351. , k = c[5]
  352. , n = c[6]
  353. , m = c[7]
  354. , l = c[8]
  355. , p = c[9]
  356. , r = c[10]
  357. , s = c[11]
  358. , u = c[12]
  359. , q = c[13]
  360. , x = c[14];
  361. c = c[15];
  362. var w = b[0]
  363. , v = b[1]
  364. , t = b[2]
  365. , y = b[3];
  366. a[0] = w * d + v * h + t * l + y * u;
  367. a[1] = w * e + v * k + t * p + y * q;
  368. a[2] = w * f + v * n + t * r + y * x;
  369. a[3] = w * g + v * m + t * s + y * c;
  370. w = b[4];
  371. v = b[5];
  372. t = b[6];
  373. y = b[7];
  374. a[4] = w * d + v * h + t * l + y * u;
  375. a[5] = w * e + v * k + t * p + y * q;
  376. a[6] = w * f + v * n + t * r + y * x;
  377. a[7] = w * g + v * m + t * s + y * c;
  378. w = b[8];
  379. v = b[9];
  380. t = b[10];
  381. y = b[11];
  382. a[8] = w * d + v * h + t * l + y * u;
  383. a[9] = w * e + v * k + t * p + y * q;
  384. a[10] = w * f + v * n + t * r + y * x;
  385. a[11] = w * g + v * m + t * s + y * c;
  386. w = b[12];
  387. v = b[13];
  388. t = b[14];
  389. y = b[15];
  390. a[12] = w * d + v * h + t * l + y * u;
  391. a[13] = w * e + v * k + t * p + y * q;
  392. a[14] = w * f + v * n + t * r + y * x;
  393. a[15] = w * g + v * m + t * s + y * c;
  394. return a
  395. },
  396. invert: function(a, c) {
  397. var b = c[0]
  398. , d = c[1]
  399. , e = c[2]
  400. , f = c[3]
  401. , g = c[4]
  402. , h = c[5]
  403. , k = c[6]
  404. , n = c[7]
  405. , m = c[8]
  406. , l = c[9]
  407. , p = c[10]
  408. , r = c[11]
  409. , s = c[12]
  410. , u = c[13]
  411. , q = c[14]
  412. , x = c[15]
  413. , w = b * h - d * g
  414. , v = b * k - e * g
  415. , t = b * n - f * g
  416. , y = d * k - e * h
  417. , E = d * n - f * h
  418. , F = e * n - f * k
  419. , A = m * u - l * s
  420. , B = m * q - p * s
  421. , z = m * x - r * s
  422. , C = l * q - p * u
  423. , G = l * x - r * u
  424. , H = p * x - r * q
  425. , D = w * H - v * G + t * C + y * z - E * B + F * A;
  426. if (!D)
  427. return null;
  428. D = 1 / D;
  429. a[0] = (h * H - k * G + n * C) * D;
  430. a[1] = (e * G - d * H - f * C) * D;
  431. a[2] = (u * F - q * E + x * y) * D;
  432. a[3] = (p * E - l * F - r * y) * D;
  433. a[4] = (k * z - g * H - n * B) * D;
  434. a[5] = (b * H - e * z + f * B) * D;
  435. a[6] = (q * t - s * F - x * v) * D;
  436. a[7] = (m * F - p * t + r * v) * D;
  437. a[8] = (g * G - h * z + n * A) * D;
  438. a[9] = (d * z - b * G - f * A) * D;
  439. a[10] = (s * E - u * t + x * w) * D;
  440. a[11] = (l * t - m * E - r * w) * D;
  441. a[12] = (h * B - g * C - k * A) * D;
  442. a[13] = (b * C - d * B + e * A) * D;
  443. a[14] = (u * v - s * y - q * w) * D;
  444. a[15] = (m * y - l * v + p * w) * D;
  445. return a
  446. },
  447. transpose: function(a, c) {
  448. a[0] = c[0];
  449. a[4] = c[1];
  450. a[8] = c[2];
  451. a[12] = c[3];
  452. a[1] = c[4];
  453. a[5] = c[5];
  454. a[9] = c[6];
  455. a[13] = c[7];
  456. a[2] = c[8];
  457. a[6] = c[9];
  458. a[10] = c[10];
  459. a[14] = c[11];
  460. a[3] = c[12];
  461. a[7] = c[13];
  462. a[11] = c[14];
  463. a[15] = c[15];
  464. return a
  465. },
  466. mul4: function(a, c, b, d, e, f) {
  467. a[0] = c[0] * b + c[4] * d + c[8] * e + c[12] * f;
  468. a[1] = c[1] * b + c[5] * d + c[9] * e + c[13] * f;
  469. a[2] = c[2] * b + c[6] * d + c[10] * e + c[14] * f;
  470. a[3] = c[3] * b + c[7] * d + c[11] * e + c[15] * f;
  471. return a
  472. },
  473. mulPoint: function(a, c, b, d, e) {
  474. a[0] = c[0] * b + c[4] * d + c[8] * e + c[12];
  475. a[1] = c[1] * b + c[5] * d + c[9] * e + c[13];
  476. a[2] = c[2] * b + c[6] * d + c[10] * e + c[14];
  477. return a
  478. },
  479. mulVec: function(a, c, b, d, e) {
  480. a[0] = c[0] * b + c[4] * d + c[8] * e;
  481. a[1] = c[1] * b + c[5] * d + c[9] * e;
  482. a[2] = c[2] * b + c[6] * d + c[10] * e;
  483. return a
  484. },
  485. perspective: function(a, c, b, d, e, f) {
  486. f = f || 0;
  487. c = 1 / Math.tan(0.00872664625 * c);
  488. a[0] = c / b;
  489. a[1] = a[2] = a[3] = 0;
  490. a[5] = c;
  491. a[4] = a[6] = a[7] = 0;
  492. a[8] = a[9] = 0;
  493. a[10] = (e + d) / (d - e) - 3.0518044E-5 * f;
  494. a[11] = -1;
  495. a[14] = 2 * e * d / (d - e);
  496. a[12] = a[13] = a[15] = 0;
  497. return a
  498. },
  499. perspectiveInfinite: function(a, c, b, d, e) {
  500. e = e || 0;
  501. c = 1 / Math.tan(0.00872664625 * c);
  502. a[0] = c / b;
  503. a[1] = a[2] = a[3] = 0;
  504. a[5] = c;
  505. a[4] = a[6] = a[7] = 0;
  506. a[8] = a[9] = 0;
  507. a[10] = a[11] = -1 - 3.0518044E-5 * e;
  508. a[14] = -2 * d;
  509. a[12] = a[13] = a[15] = 0;
  510. return a
  511. },
  512. ortho: function(a, c, b, d, e, f, g, h) {
  513. var k = 1 / (b - c)
  514. , n = 1 / (e - d)
  515. , m = 1 / (g - f);
  516. a[0] = k + k;
  517. a[1] = a[2] = a[3] = 0;
  518. a[5] = n + n;
  519. a[4] = a[6] = a[7] = 0;
  520. a[12] = -(b + c) * k;
  521. a[13] = -(e + d) * n;
  522. a[10] = -(m + m) - 3.0518044E-5 * (h || 0);
  523. a[14] = -(g + f) * m;
  524. a[8] = a[9] = a[11] = 0;
  525. a[15] = 1;
  526. return a
  527. },
  528. lookAt: function(a, c, b, d) {
  529. var e = a.subarray(0, 3)
  530. , f = a.subarray(4, 7)
  531. , g = a.subarray(8, 11);
  532. Vect.sub(g, c, b);
  533. Vect.cross(e, d, g);
  534. Vect.normalize(g, g);
  535. Vect.normalize(e, e);
  536. Vect.cross(f, g, e);
  537. Matrix.set(a, e[0], e[1], e[2], -Vect.dot(e, c), f[0], f[1], f[2], -Vect.dot(f, c), g[0], g[1], g[2], -Vect.dot(g, c), 0, 0, 0, 1);
  538. },
  539. copy: function(a, c) {
  540. for (var b = 0; 16 > b; ++b)
  541. a[b] = c[b];
  542. },
  543. copyToBuffer: function(a, c, b) {
  544. for (var d = 0; 16 > d; ++d)
  545. a[c + d] = b[d];
  546. }
  547. };
  548. /**
  549. * @author alteredq / http://alteredqualia.com/
  550. * @author mrdoob / http://mrdoob.com/
  551. */
  552. var _Math = {
  553. DEG2RAD: Math.PI / 180,
  554. RAD2DEG: 180 / Math.PI,
  555. generateUUID: ( function () {
  556. // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136
  557. var lut = [];
  558. for ( var i = 0; i < 256; i ++ ) {
  559. lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );
  560. }
  561. return function generateUUID() {
  562. var d0 = Math.random() * 0xffffffff | 0;
  563. var d1 = Math.random() * 0xffffffff | 0;
  564. var d2 = Math.random() * 0xffffffff | 0;
  565. var d3 = Math.random() * 0xffffffff | 0;
  566. var uuid = lut[ d0 & 0xff ] + lut[ d0 >> 8 & 0xff ] + lut[ d0 >> 16 & 0xff ] + lut[ d0 >> 24 & 0xff ] + '-' +
  567. lut[ d1 & 0xff ] + lut[ d1 >> 8 & 0xff ] + '-' + lut[ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24 & 0xff ] + '-' +
  568. lut[ d2 & 0x3f | 0x80 ] + lut[ d2 >> 8 & 0xff ] + '-' + lut[ d2 >> 16 & 0xff ] + lut[ d2 >> 24 & 0xff ] +
  569. lut[ d3 & 0xff ] + lut[ d3 >> 8 & 0xff ] + lut[ d3 >> 16 & 0xff ] + lut[ d3 >> 24 & 0xff ];
  570. // .toUpperCase() here flattens concatenated strings to save heap memory space.
  571. return uuid.toUpperCase();
  572. };
  573. } )(),
  574. clamp: function ( value, min, max ) {
  575. return Math.max( min, Math.min( max, value ) );
  576. },
  577. // compute euclidian modulo of m % n
  578. // https://en.wikipedia.org/wiki/Modulo_operation
  579. euclideanModulo: function ( n, m ) {
  580. return ( ( n % m ) + m ) % m;
  581. },
  582. // Linear mapping from range <a1, a2> to range <b1, b2>
  583. mapLinear: function ( x, a1, a2, b1, b2 ) {
  584. return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );
  585. },
  586. // https://en.wikipedia.org/wiki/Linear_interpolation
  587. lerp: function ( x, y, t ) {
  588. return ( 1 - t ) * x + t * y;
  589. },
  590. // http://en.wikipedia.org/wiki/Smoothstep
  591. smoothstep: function ( x, min, max ) {
  592. if ( x <= min ) return 0;
  593. if ( x >= max ) return 1;
  594. x = ( x - min ) / ( max - min );
  595. return x * x * ( 3 - 2 * x );
  596. },
  597. smootherstep: function ( x, min, max ) {
  598. if ( x <= min ) return 0;
  599. if ( x >= max ) return 1;
  600. x = ( x - min ) / ( max - min );
  601. return x * x * x * ( x * ( x * 6 - 15 ) + 10 );
  602. },
  603. // Random integer from <low, high> interval
  604. randInt: function ( low, high ) {
  605. return low + Math.floor( Math.random() * ( high - low + 1 ) );
  606. },
  607. // Random float from <low, high> interval
  608. randFloat: function ( low, high ) {
  609. return low + Math.random() * ( high - low );
  610. },
  611. // Random float from <-range/2, range/2> interval
  612. randFloatSpread: function ( range ) {
  613. return range * ( 0.5 - Math.random() );
  614. },
  615. degToRad: function ( degrees ) {
  616. return degrees * _Math.DEG2RAD;
  617. },
  618. radToDeg: function ( radians ) {
  619. return radians * _Math.RAD2DEG;
  620. },
  621. isPowerOfTwo: function ( value ) {
  622. return ( value & ( value - 1 ) ) === 0 && value !== 0;
  623. },
  624. ceilPowerOfTwo: function ( value ) {
  625. return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );
  626. },
  627. floorPowerOfTwo: function ( value ) {
  628. return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );
  629. }
  630. };
  631. /**
  632. * @author mrdoob / http://mrdoob.com/
  633. * @author philogb / http://blog.thejit.org/
  634. * @author egraether / http://egraether.com/
  635. * @author zz85 / http://www.lab4games.net/zz85/blog
  636. */
  637. function Vector2( x, y ) {
  638. this.x = x || 0;
  639. this.y = y || 0;
  640. }
  641. Object.defineProperties( Vector2.prototype, {
  642. "width": {
  643. get: function () {
  644. return this.x;
  645. },
  646. set: function ( value ) {
  647. this.x = value;
  648. }
  649. },
  650. "height": {
  651. get: function () {
  652. return this.y;
  653. },
  654. set: function ( value ) {
  655. this.y = value;
  656. }
  657. }
  658. } );
  659. Object.assign( Vector2.prototype, {
  660. isVector2: true,
  661. set: function ( x, y ) {
  662. this.x = x;
  663. this.y = y;
  664. return this;
  665. },
  666. setScalar: function ( scalar ) {
  667. this.x = scalar;
  668. this.y = scalar;
  669. return this;
  670. },
  671. setX: function ( x ) {
  672. this.x = x;
  673. return this;
  674. },
  675. setY: function ( y ) {
  676. this.y = y;
  677. return this;
  678. },
  679. setComponent: function ( index, value ) {
  680. switch ( index ) {
  681. case 0: this.x = value; break;
  682. case 1: this.y = value; break;
  683. default: throw new Error( 'index is out of range: ' + index );
  684. }
  685. return this;
  686. },
  687. getComponent: function ( index ) {
  688. switch ( index ) {
  689. case 0: return this.x;
  690. case 1: return this.y;
  691. default: throw new Error( 'index is out of range: ' + index );
  692. }
  693. },
  694. clone: function () {
  695. return new this.constructor( this.x, this.y );
  696. },
  697. copy: function ( v ) {
  698. this.x = v.x;
  699. this.y = v.y;
  700. return this;
  701. },
  702. add: function ( v, w ) {
  703. if ( w !== undefined ) {
  704. console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
  705. return this.addVectors( v, w );
  706. }
  707. this.x += v.x;
  708. this.y += v.y;
  709. return this;
  710. },
  711. addScalar: function ( s ) {
  712. this.x += s;
  713. this.y += s;
  714. return this;
  715. },
  716. addVectors: function ( a, b ) {
  717. this.x = a.x + b.x;
  718. this.y = a.y + b.y;
  719. return this;
  720. },
  721. addScaledVector: function ( v, s ) {
  722. this.x += v.x * s;
  723. this.y += v.y * s;
  724. return this;
  725. },
  726. sub: function ( v, w ) {
  727. if ( w !== undefined ) {
  728. console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
  729. return this.subVectors( v, w );
  730. }
  731. this.x -= v.x;
  732. this.y -= v.y;
  733. return this;
  734. },
  735. subScalar: function ( s ) {
  736. this.x -= s;
  737. this.y -= s;
  738. return this;
  739. },
  740. subVectors: function ( a, b ) {
  741. this.x = a.x - b.x;
  742. this.y = a.y - b.y;
  743. return this;
  744. },
  745. multiply: function ( v ) {
  746. this.x *= v.x;
  747. this.y *= v.y;
  748. return this;
  749. },
  750. multiplyScalar: function ( scalar ) {
  751. this.x *= scalar;
  752. this.y *= scalar;
  753. return this;
  754. },
  755. divide: function ( v ) {
  756. this.x /= v.x;
  757. this.y /= v.y;
  758. return this;
  759. },
  760. divideScalar: function ( scalar ) {
  761. return this.multiplyScalar( 1 / scalar );
  762. },
  763. applyMatrix3: function ( m ) {
  764. var x = this.x, y = this.y;
  765. var e = m.elements;
  766. this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];
  767. this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];
  768. return this;
  769. },
  770. min: function ( v ) {
  771. this.x = Math.min( this.x, v.x );
  772. this.y = Math.min( this.y, v.y );
  773. return this;
  774. },
  775. max: function ( v ) {
  776. this.x = Math.max( this.x, v.x );
  777. this.y = Math.max( this.y, v.y );
  778. return this;
  779. },
  780. clamp: function ( min, max ) {
  781. // assumes min < max, componentwise
  782. this.x = Math.max( min.x, Math.min( max.x, this.x ) );
  783. this.y = Math.max( min.y, Math.min( max.y, this.y ) );
  784. return this;
  785. },
  786. clampScalar: function () {
  787. var min = new Vector2();
  788. var max = new Vector2();
  789. return function clampScalar( minVal, maxVal ) {
  790. min.set( minVal, minVal );
  791. max.set( maxVal, maxVal );
  792. return this.clamp( min, max );
  793. };
  794. }(),
  795. clampLength: function ( min, max ) {
  796. var length = this.length();
  797. return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
  798. },
  799. floor: function () {
  800. this.x = Math.floor( this.x );
  801. this.y = Math.floor( this.y );
  802. return this;
  803. },
  804. ceil: function () {
  805. this.x = Math.ceil( this.x );
  806. this.y = Math.ceil( this.y );
  807. return this;
  808. },
  809. round: function () {
  810. this.x = Math.round( this.x );
  811. this.y = Math.round( this.y );
  812. return this;
  813. },
  814. roundToZero: function () {
  815. this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
  816. this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
  817. return this;
  818. },
  819. negate: function () {
  820. this.x = - this.x;
  821. this.y = - this.y;
  822. return this;
  823. },
  824. dot: function ( v ) {
  825. return this.x * v.x + this.y * v.y;
  826. },
  827. cross: function ( v ) {
  828. return this.x * v.y - this.y * v.x;
  829. },
  830. lengthSq: function () {
  831. return this.x * this.x + this.y * this.y;
  832. },
  833. length: function () {
  834. return Math.sqrt( this.x * this.x + this.y * this.y );
  835. },
  836. manhattanLength: function () {
  837. return Math.abs( this.x ) + Math.abs( this.y );
  838. },
  839. normalize: function () {
  840. return this.divideScalar( this.length() || 1 );
  841. },
  842. angle: function () {
  843. // computes the angle in radians with respect to the positive x-axis
  844. var angle = Math.atan2( this.y, this.x );
  845. if ( angle < 0 ) angle += 2 * Math.PI;
  846. return angle;
  847. },
  848. distanceTo: function ( v ) {
  849. return Math.sqrt( this.distanceToSquared( v ) );
  850. },
  851. distanceToSquared: function ( v ) {
  852. var dx = this.x - v.x, dy = this.y - v.y;
  853. return dx * dx + dy * dy;
  854. },
  855. manhattanDistanceTo: function ( v ) {
  856. return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );
  857. },
  858. setLength: function ( length ) {
  859. return this.normalize().multiplyScalar( length );
  860. },
  861. lerp: function ( v, alpha ) {
  862. this.x += ( v.x - this.x ) * alpha;
  863. this.y += ( v.y - this.y ) * alpha;
  864. return this;
  865. },
  866. lerpVectors: function ( v1, v2, alpha ) {
  867. return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
  868. },
  869. equals: function ( v ) {
  870. return ( ( v.x === this.x ) && ( v.y === this.y ) );
  871. },
  872. fromArray: function ( array, offset ) {
  873. if ( offset === undefined ) offset = 0;
  874. this.x = array[ offset ];
  875. this.y = array[ offset + 1 ];
  876. return this;
  877. },
  878. toArray: function ( array, offset ) {
  879. if ( array === undefined ) array = [];
  880. if ( offset === undefined ) offset = 0;
  881. array[ offset ] = this.x;
  882. array[ offset + 1 ] = this.y;
  883. return array;
  884. },
  885. fromBufferAttribute: function ( attribute, index, offset ) {
  886. if ( offset !== undefined ) {
  887. console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );
  888. }
  889. this.x = attribute.getX( index );
  890. this.y = attribute.getY( index );
  891. return this;
  892. },
  893. rotateAround: function ( center, angle ) {
  894. var c = Math.cos( angle ), s = Math.sin( angle );
  895. var x = this.x - center.x;
  896. var y = this.y - center.y;
  897. this.x = x * c - y * s + center.x;
  898. this.y = x * s + y * c + center.y;
  899. return this;
  900. }
  901. } );
  902. /**
  903. * @author mrdoob / http://mrdoob.com/
  904. * @author supereggbert / http://www.paulbrunt.co.uk/
  905. * @author philogb / http://blog.thejit.org/
  906. * @author jordi_ros / http://plattsoft.com
  907. * @author D1plo1d / http://github.com/D1plo1d
  908. * @author alteredq / http://alteredqualia.com/
  909. * @author mikael emtinger / http://gomo.se/
  910. * @author timknip / http://www.floorplanner.com/
  911. * @author bhouston / http://clara.io
  912. * @author WestLangley / http://github.com/WestLangley
  913. */
  914. function Matrix4() {
  915. this.elements = [
  916. 1, 0, 0, 0,
  917. 0, 1, 0, 0,
  918. 0, 0, 1, 0,
  919. 0, 0, 0, 1
  920. ];
  921. if ( arguments.length > 0 ) {
  922. console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );
  923. }
  924. }
  925. Object.assign( Matrix4.prototype, {
  926. isMatrix4: true,
  927. set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {
  928. var te = this.elements;
  929. te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;
  930. te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;
  931. te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;
  932. te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;
  933. return this;
  934. },
  935. identity: function () {
  936. this.set(
  937. 1, 0, 0, 0,
  938. 0, 1, 0, 0,
  939. 0, 0, 1, 0,
  940. 0, 0, 0, 1
  941. );
  942. return this;
  943. },
  944. clone: function () {
  945. return new Matrix4().fromArray( this.elements );
  946. },
  947. copy: function ( m ) {
  948. var te = this.elements;
  949. var me = m.elements;
  950. te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];
  951. te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];
  952. te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];
  953. te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];
  954. return this;
  955. },
  956. copyPosition: function ( m ) {
  957. var te = this.elements, me = m.elements;
  958. te[ 12 ] = me[ 12 ];
  959. te[ 13 ] = me[ 13 ];
  960. te[ 14 ] = me[ 14 ];
  961. return this;
  962. },
  963. extractBasis: function ( xAxis, yAxis, zAxis ) {
  964. xAxis.setFromMatrixColumn( this, 0 );
  965. yAxis.setFromMatrixColumn( this, 1 );
  966. zAxis.setFromMatrixColumn( this, 2 );
  967. return this;
  968. },
  969. makeBasis: function ( xAxis, yAxis, zAxis ) {
  970. this.set(
  971. xAxis.x, yAxis.x, zAxis.x, 0,
  972. xAxis.y, yAxis.y, zAxis.y, 0,
  973. xAxis.z, yAxis.z, zAxis.z, 0,
  974. 0, 0, 0, 1
  975. );
  976. return this;
  977. },
  978. extractRotation: function () {
  979. var v1 = new Vector3();
  980. return function extractRotation( m ) {
  981. // this method does not support reflection matrices
  982. var te = this.elements;
  983. var me = m.elements;
  984. var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();
  985. var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();
  986. var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();
  987. te[ 0 ] = me[ 0 ] * scaleX;
  988. te[ 1 ] = me[ 1 ] * scaleX;
  989. te[ 2 ] = me[ 2 ] * scaleX;
  990. te[ 3 ] = 0;
  991. te[ 4 ] = me[ 4 ] * scaleY;
  992. te[ 5 ] = me[ 5 ] * scaleY;
  993. te[ 6 ] = me[ 6 ] * scaleY;
  994. te[ 7 ] = 0;
  995. te[ 8 ] = me[ 8 ] * scaleZ;
  996. te[ 9 ] = me[ 9 ] * scaleZ;
  997. te[ 10 ] = me[ 10 ] * scaleZ;
  998. te[ 11 ] = 0;
  999. te[ 12 ] = 0;
  1000. te[ 13 ] = 0;
  1001. te[ 14 ] = 0;
  1002. te[ 15 ] = 1;
  1003. return this;
  1004. };
  1005. }(),
  1006. makeRotationFromEuler: function ( euler ) {
  1007. if ( ! ( euler && euler.isEuler ) ) {
  1008. console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );
  1009. }
  1010. var te = this.elements;
  1011. var x = euler.x, y = euler.y, z = euler.z;
  1012. var a = Math.cos( x ), b = Math.sin( x );
  1013. var c = Math.cos( y ), d = Math.sin( y );
  1014. var e = Math.cos( z ), f = Math.sin( z );
  1015. if ( euler.order === 'XYZ' ) {
  1016. var ae = a * e, af = a * f, be = b * e, bf = b * f;
  1017. te[ 0 ] = c * e;
  1018. te[ 4 ] = - c * f;
  1019. te[ 8 ] = d;
  1020. te[ 1 ] = af + be * d;
  1021. te[ 5 ] = ae - bf * d;
  1022. te[ 9 ] = - b * c;
  1023. te[ 2 ] = bf - ae * d;
  1024. te[ 6 ] = be + af * d;
  1025. te[ 10 ] = a * c;
  1026. } else if ( euler.order === 'YXZ' ) {
  1027. var ce = c * e, cf = c * f, de = d * e, df = d * f;
  1028. te[ 0 ] = ce + df * b;
  1029. te[ 4 ] = de * b - cf;
  1030. te[ 8 ] = a * d;
  1031. te[ 1 ] = a * f;
  1032. te[ 5 ] = a * e;
  1033. te[ 9 ] = - b;
  1034. te[ 2 ] = cf * b - de;
  1035. te[ 6 ] = df + ce * b;
  1036. te[ 10 ] = a * c;
  1037. } else if ( euler.order === 'ZXY' ) {
  1038. var ce = c * e, cf = c * f, de = d * e, df = d * f;
  1039. te[ 0 ] = ce - df * b;
  1040. te[ 4 ] = - a * f;
  1041. te[ 8 ] = de + cf * b;
  1042. te[ 1 ] = cf + de * b;
  1043. te[ 5 ] = a * e;
  1044. te[ 9 ] = df - ce * b;
  1045. te[ 2 ] = - a * d;
  1046. te[ 6 ] = b;
  1047. te[ 10 ] = a * c;
  1048. } else if ( euler.order === 'ZYX' ) {
  1049. var ae = a * e, af = a * f, be = b * e, bf = b * f;
  1050. te[ 0 ] = c * e;
  1051. te[ 4 ] = be * d - af;
  1052. te[ 8 ] = ae * d + bf;
  1053. te[ 1 ] = c * f;
  1054. te[ 5 ] = bf * d + ae;
  1055. te[ 9 ] = af * d - be;
  1056. te[ 2 ] = - d;
  1057. te[ 6 ] = b * c;
  1058. te[ 10 ] = a * c;
  1059. } else if ( euler.order === 'YZX' ) {
  1060. var ac = a * c, ad = a * d, bc = b * c, bd = b * d;
  1061. te[ 0 ] = c * e;
  1062. te[ 4 ] = bd - ac * f;
  1063. te[ 8 ] = bc * f + ad;
  1064. te[ 1 ] = f;
  1065. te[ 5 ] = a * e;
  1066. te[ 9 ] = - b * e;
  1067. te[ 2 ] = - d * e;
  1068. te[ 6 ] = ad * f + bc;
  1069. te[ 10 ] = ac - bd * f;
  1070. } else if ( euler.order === 'XZY' ) {
  1071. var ac = a * c, ad = a * d, bc = b * c, bd = b * d;
  1072. te[ 0 ] = c * e;
  1073. te[ 4 ] = - f;
  1074. te[ 8 ] = d * e;
  1075. te[ 1 ] = ac * f + bd;
  1076. te[ 5 ] = a * e;
  1077. te[ 9 ] = ad * f - bc;
  1078. te[ 2 ] = bc * f - ad;
  1079. te[ 6 ] = b * e;
  1080. te[ 10 ] = bd * f + ac;
  1081. }
  1082. // bottom row
  1083. te[ 3 ] = 0;
  1084. te[ 7 ] = 0;
  1085. te[ 11 ] = 0;
  1086. // last column
  1087. te[ 12 ] = 0;
  1088. te[ 13 ] = 0;
  1089. te[ 14 ] = 0;
  1090. te[ 15 ] = 1;
  1091. return this;
  1092. },
  1093. makeRotationFromQuaternion: function () {
  1094. var zero = new Vector3( 0, 0, 0 );
  1095. var one = new Vector3( 1, 1, 1 );
  1096. return function makeRotationFromQuaternion( q ) {
  1097. return this.compose( zero, q, one );
  1098. };
  1099. }(),
  1100. lookAt: function () {
  1101. var x = new Vector3();
  1102. var y = new Vector3();
  1103. var z = new Vector3();
  1104. return function lookAt( eye, target, up ) {
  1105. var te = this.elements;
  1106. z.subVectors( eye, target );
  1107. if ( z.lengthSq() === 0 ) {
  1108. // eye and target are in the same position
  1109. z.z = 1;
  1110. }
  1111. z.normalize();
  1112. x.crossVectors( up, z );
  1113. if ( x.lengthSq() === 0 ) {
  1114. // up and z are parallel
  1115. if ( Math.abs( up.z ) === 1 ) {
  1116. z.x += 0.0001;
  1117. } else {
  1118. z.z += 0.0001;
  1119. }
  1120. z.normalize();
  1121. x.crossVectors( up, z );
  1122. }
  1123. x.normalize();
  1124. y.crossVectors( z, x );
  1125. te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;
  1126. te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;
  1127. te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;
  1128. return this;
  1129. };
  1130. }(),
  1131. multiply: function ( m, n ) {
  1132. if ( n !== undefined ) {
  1133. console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );
  1134. return this.multiplyMatrices( m, n );
  1135. }
  1136. return this.multiplyMatrices( this, m );
  1137. },
  1138. premultiply: function ( m ) {
  1139. return this.multiplyMatrices( m, this );
  1140. },
  1141. multiplyMatrices: function ( a, b ) {
  1142. var ae = a.elements;
  1143. var be = b.elements;
  1144. var te = this.elements;
  1145. var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];
  1146. var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];
  1147. var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];
  1148. var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];
  1149. var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];
  1150. var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];
  1151. var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];
  1152. var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];
  1153. te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
  1154. te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
  1155. te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
  1156. te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
  1157. te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
  1158. te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
  1159. te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
  1160. te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
  1161. te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
  1162. te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
  1163. te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
  1164. te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
  1165. te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
  1166. te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
  1167. te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
  1168. te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
  1169. return this;
  1170. },
  1171. multiplyScalar: function ( s ) {
  1172. var te = this.elements;
  1173. te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;
  1174. te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;
  1175. te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;
  1176. te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;
  1177. return this;
  1178. },
  1179. applyToBufferAttribute: function () {
  1180. var v1 = new Vector3();
  1181. return function applyToBufferAttribute( attribute ) {
  1182. for ( var i = 0, l = attribute.count; i < l; i ++ ) {
  1183. v1.x = attribute.getX( i );
  1184. v1.y = attribute.getY( i );
  1185. v1.z = attribute.getZ( i );
  1186. v1.applyMatrix4( this );
  1187. attribute.setXYZ( i, v1.x, v1.y, v1.z );
  1188. }
  1189. return attribute;
  1190. };
  1191. }(),
  1192. determinant: function () {
  1193. var te = this.elements;
  1194. var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];
  1195. var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];
  1196. var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];
  1197. var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];
  1198. //TODO: make this more efficient
  1199. //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
  1200. return (
  1201. n41 * (
  1202. + n14 * n23 * n32
  1203. - n13 * n24 * n32
  1204. - n14 * n22 * n33
  1205. + n12 * n24 * n33
  1206. + n13 * n22 * n34
  1207. - n12 * n23 * n34
  1208. ) +
  1209. n42 * (
  1210. + n11 * n23 * n34
  1211. - n11 * n24 * n33
  1212. + n14 * n21 * n33
  1213. - n13 * n21 * n34
  1214. + n13 * n24 * n31
  1215. - n14 * n23 * n31
  1216. ) +
  1217. n43 * (
  1218. + n11 * n24 * n32
  1219. - n11 * n22 * n34
  1220. - n14 * n21 * n32
  1221. + n12 * n21 * n34
  1222. + n14 * n22 * n31
  1223. - n12 * n24 * n31
  1224. ) +
  1225. n44 * (
  1226. - n13 * n22 * n31
  1227. - n11 * n23 * n32
  1228. + n11 * n22 * n33
  1229. + n13 * n21 * n32
  1230. - n12 * n21 * n33
  1231. + n12 * n23 * n31
  1232. )
  1233. );
  1234. },
  1235. transpose: function () {
  1236. var te = this.elements;
  1237. var tmp;
  1238. tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;
  1239. tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;
  1240. tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;
  1241. tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;
  1242. tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;
  1243. tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;
  1244. return this;
  1245. },
  1246. setPosition: function ( v ) {
  1247. var te = this.elements;
  1248. te[ 12 ] = v.x;
  1249. te[ 13 ] = v.y;
  1250. te[ 14 ] = v.z;
  1251. return this;
  1252. },
  1253. getInverse: function ( m, throwOnDegenerate ) {
  1254. // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
  1255. var te = this.elements,
  1256. me = m.elements,
  1257. n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],
  1258. n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],
  1259. n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],
  1260. n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],
  1261. t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
  1262. t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
  1263. t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
  1264. t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;
  1265. var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
  1266. if ( det === 0 ) {
  1267. var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0";
  1268. if ( throwOnDegenerate === true ) {
  1269. throw new Error( msg );
  1270. } else {
  1271. console.warn( msg );
  1272. }
  1273. return this.identity();
  1274. }
  1275. var detInv = 1 / det;
  1276. te[ 0 ] = t11 * detInv;
  1277. te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;
  1278. te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;
  1279. te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;
  1280. te[ 4 ] = t12 * detInv;
  1281. te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;
  1282. te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;
  1283. te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;
  1284. te[ 8 ] = t13 * detInv;
  1285. te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;
  1286. te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;
  1287. te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;
  1288. te[ 12 ] = t14 * detInv;
  1289. te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;
  1290. te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;
  1291. te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;
  1292. return this;
  1293. },
  1294. scale: function ( v ) {
  1295. var te = this.elements;
  1296. var x = v.x, y = v.y, z = v.z;
  1297. te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;
  1298. te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;
  1299. te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;
  1300. te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;
  1301. return this;
  1302. },
  1303. getMaxScaleOnAxis: function () {
  1304. var te = this.elements;
  1305. var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];
  1306. var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];
  1307. var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];
  1308. return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );
  1309. },
  1310. makeTranslation: function ( x, y, z ) {
  1311. this.set(
  1312. 1, 0, 0, x,
  1313. 0, 1, 0, y,
  1314. 0, 0, 1, z,
  1315. 0, 0, 0, 1
  1316. );
  1317. return this;
  1318. },
  1319. makeRotationX: function ( theta ) {
  1320. var c = Math.cos( theta ), s = Math.sin( theta );
  1321. this.set(
  1322. 1, 0, 0, 0,
  1323. 0, c, - s, 0,
  1324. 0, s, c, 0,
  1325. 0, 0, 0, 1
  1326. );
  1327. return this;
  1328. },
  1329. makeRotationY: function ( theta ) {
  1330. var c = Math.cos( theta ), s = Math.sin( theta );
  1331. this.set(
  1332. c, 0, s, 0,
  1333. 0, 1, 0, 0,
  1334. - s, 0, c, 0,
  1335. 0, 0, 0, 1
  1336. );
  1337. return this;
  1338. },
  1339. makeRotationZ: function ( theta ) {
  1340. var c = Math.cos( theta ), s = Math.sin( theta );
  1341. this.set(
  1342. c, - s, 0, 0,
  1343. s, c, 0, 0,
  1344. 0, 0, 1, 0,
  1345. 0, 0, 0, 1
  1346. );
  1347. return this;
  1348. },
  1349. makeRotationAxis: function ( axis, angle ) {
  1350. // Based on http://www.gamedev.net/reference/articles/article1199.asp
  1351. var c = Math.cos( angle );
  1352. var s = Math.sin( angle );
  1353. var t = 1 - c;
  1354. var x = axis.x, y = axis.y, z = axis.z;
  1355. var tx = t * x, ty = t * y;
  1356. this.set(
  1357. tx * x + c, tx * y - s * z, tx * z + s * y, 0,
  1358. tx * y + s * z, ty * y + c, ty * z - s * x, 0,
  1359. tx * z - s * y, ty * z + s * x, t * z * z + c, 0,
  1360. 0, 0, 0, 1
  1361. );
  1362. return this;
  1363. },
  1364. makeScale: function ( x, y, z ) {
  1365. this.set(
  1366. x, 0, 0, 0,
  1367. 0, y, 0, 0,
  1368. 0, 0, z, 0,
  1369. 0, 0, 0, 1
  1370. );
  1371. return this;
  1372. },
  1373. makeShear: function ( x, y, z ) {
  1374. this.set(
  1375. 1, y, z, 0,
  1376. x, 1, z, 0,
  1377. x, y, 1, 0,
  1378. 0, 0, 0, 1
  1379. );
  1380. return this;
  1381. },
  1382. compose: function ( position, quaternion, scale ) {
  1383. var te = this.elements;
  1384. var x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;
  1385. var x2 = x + x, y2 = y + y, z2 = z + z;
  1386. var xx = x * x2, xy = x * y2, xz = x * z2;
  1387. var yy = y * y2, yz = y * z2, zz = z * z2;
  1388. var wx = w * x2, wy = w * y2, wz = w * z2;
  1389. var sx = scale.x, sy = scale.y, sz = scale.z;
  1390. te[ 0 ] = ( 1 - ( yy + zz ) ) * sx;
  1391. te[ 1 ] = ( xy + wz ) * sx;
  1392. te[ 2 ] = ( xz - wy ) * sx;
  1393. te[ 3 ] = 0;
  1394. te[ 4 ] = ( xy - wz ) * sy;
  1395. te[ 5 ] = ( 1 - ( xx + zz ) ) * sy;
  1396. te[ 6 ] = ( yz + wx ) * sy;
  1397. te[ 7 ] = 0;
  1398. te[ 8 ] = ( xz + wy ) * sz;
  1399. te[ 9 ] = ( yz - wx ) * sz;
  1400. te[ 10 ] = ( 1 - ( xx + yy ) ) * sz;
  1401. te[ 11 ] = 0;
  1402. te[ 12 ] = position.x;
  1403. te[ 13 ] = position.y;
  1404. te[ 14 ] = position.z;
  1405. te[ 15 ] = 1;
  1406. return this;
  1407. },
  1408. decompose: function () {
  1409. var vector = new Vector3();
  1410. var matrix = new Matrix4();
  1411. return function decompose( position, quaternion, scale ) {
  1412. var te = this.elements;
  1413. var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();
  1414. var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();
  1415. var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();
  1416. // if determine is negative, we need to invert one scale
  1417. var det = this.determinant();
  1418. if ( det < 0 ) sx = - sx;
  1419. position.x = te[ 12 ];
  1420. position.y = te[ 13 ];
  1421. position.z = te[ 14 ];
  1422. // scale the rotation part
  1423. matrix.copy( this );
  1424. var invSX = 1 / sx;
  1425. var invSY = 1 / sy;
  1426. var invSZ = 1 / sz;
  1427. matrix.elements[ 0 ] *= invSX;
  1428. matrix.elements[ 1 ] *= invSX;
  1429. matrix.elements[ 2 ] *= invSX;
  1430. matrix.elements[ 4 ] *= invSY;
  1431. matrix.elements[ 5 ] *= invSY;
  1432. matrix.elements[ 6 ] *= invSY;
  1433. matrix.elements[ 8 ] *= invSZ;
  1434. matrix.elements[ 9 ] *= invSZ;
  1435. matrix.elements[ 10 ] *= invSZ;
  1436. quaternion.setFromRotationMatrix( matrix );
  1437. scale.x = sx;
  1438. scale.y = sy;
  1439. scale.z = sz;
  1440. return this;
  1441. };
  1442. }(),
  1443. makePerspective: function ( left, right, top, bottom, near, far ) {
  1444. if ( far === undefined ) {
  1445. console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );
  1446. }
  1447. var te = this.elements;
  1448. var x = 2 * near / ( right - left );
  1449. var y = 2 * near / ( top - bottom );
  1450. var a = ( right + left ) / ( right - left );
  1451. var b = ( top + bottom ) / ( top - bottom );
  1452. var c = - ( far + near ) / ( far - near );
  1453. var d = - 2 * far * near / ( far - near );
  1454. te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0;
  1455. te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0;
  1456. te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d;
  1457. te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0;
  1458. return this;
  1459. },
  1460. makeOrthographic: function ( left, right, top, bottom, near, far ) {
  1461. var te = this.elements;
  1462. var w = 1.0 / ( right - left );
  1463. var h = 1.0 / ( top - bottom );
  1464. var p = 1.0 / ( far - near );
  1465. var x = ( right + left ) * w;
  1466. var y = ( top + bottom ) * h;
  1467. var z = ( far + near ) * p;
  1468. te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x;
  1469. te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y;
  1470. te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z;
  1471. te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1;
  1472. return this;
  1473. },
  1474. equals: function ( matrix ) {
  1475. var te = this.elements;
  1476. var me = matrix.elements;
  1477. for ( var i = 0; i < 16; i ++ ) {
  1478. if ( te[ i ] !== me[ i ] ) return false;
  1479. }
  1480. return true;
  1481. },
  1482. fromArray: function ( array, offset ) {
  1483. if ( offset === undefined ) offset = 0;
  1484. for ( var i = 0; i < 16; i ++ ) {
  1485. this.elements[ i ] = array[ i + offset ];
  1486. }
  1487. return this;
  1488. },
  1489. toArray: function ( array, offset ) {
  1490. if ( array === undefined ) array = [];
  1491. if ( offset === undefined ) offset = 0;
  1492. var te = this.elements;
  1493. array[ offset ] = te[ 0 ];
  1494. array[ offset + 1 ] = te[ 1 ];
  1495. array[ offset + 2 ] = te[ 2 ];
  1496. array[ offset + 3 ] = te[ 3 ];
  1497. array[ offset + 4 ] = te[ 4 ];
  1498. array[ offset + 5 ] = te[ 5 ];
  1499. array[ offset + 6 ] = te[ 6 ];
  1500. array[ offset + 7 ] = te[ 7 ];
  1501. array[ offset + 8 ] = te[ 8 ];
  1502. array[ offset + 9 ] = te[ 9 ];
  1503. array[ offset + 10 ] = te[ 10 ];
  1504. array[ offset + 11 ] = te[ 11 ];
  1505. array[ offset + 12 ] = te[ 12 ];
  1506. array[ offset + 13 ] = te[ 13 ];
  1507. array[ offset + 14 ] = te[ 14 ];
  1508. array[ offset + 15 ] = te[ 15 ];
  1509. return array;
  1510. },
  1511. //toolbag里的Matrix.rotation
  1512. rotation:function(a,c, b){
  1513. a[0] = 1;
  1514. a[4] = 0;
  1515. a[8] = 0;
  1516. a[12] = 0;
  1517. a[1] = 0;
  1518. a[5] = 1;
  1519. a[9] = 0;
  1520. a[13] = 0;
  1521. a[2] = 0;
  1522. a[6] = 0;
  1523. a[10] = 1;
  1524. a[14] = 0;
  1525. a[3] = 0;
  1526. a[7] = 0;
  1527. a[11] = 0;
  1528. a[15] = 1;
  1529. var d = 0.0174532925 * c;
  1530. c = Math.sin(d);
  1531. d = Math.cos(d);
  1532. switch (b) {
  1533. case 0:
  1534. a[5] = d;
  1535. a[9] = -c;
  1536. a[6] = c;
  1537. a[10] = d;
  1538. break;
  1539. case 1:
  1540. a[0] = d;
  1541. a[8] = c;
  1542. a[2] = -c;
  1543. a[10] = d;
  1544. break;
  1545. case 2:
  1546. a[0] = d,
  1547. a[4] = -c,
  1548. a[1] = c,
  1549. a[5] = d;
  1550. }
  1551. return a
  1552. },
  1553. mul:function(a,c, b){
  1554. var d = c[0]
  1555. , e = c[1]
  1556. , f = c[2]
  1557. , g = c[3]
  1558. , h = c[4]
  1559. , k = c[5]
  1560. , n = c[6]
  1561. , m = c[7]
  1562. , l = c[8]
  1563. , p = c[9]
  1564. , r = c[10]
  1565. , s = c[11]
  1566. , u = c[12]
  1567. , q = c[13]
  1568. , x = c[14];
  1569. c = c[15];
  1570. var w = b[0]
  1571. , v = b[1]
  1572. , t = b[2]
  1573. , y = b[3];
  1574. a[0] = w * d + v * h + t * l + y * u;
  1575. a[1] = w * e + v * k + t * p + y * q;
  1576. a[2] = w * f + v * n + t * r + y * x;
  1577. a[3] = w * g + v * m + t * s + y * c;
  1578. w = b[4];
  1579. v = b[5];
  1580. t = b[6];
  1581. y = b[7];
  1582. a[4] = w * d + v * h + t * l + y * u;
  1583. a[5] = w * e + v * k + t * p + y * q;
  1584. a[6] = w * f + v * n + t * r + y * x;
  1585. a[7] = w * g + v * m + t * s + y * c;
  1586. w = b[8];
  1587. v = b[9];
  1588. t = b[10];
  1589. y = b[11];
  1590. a[8] = w * d + v * h + t * l + y * u;
  1591. a[9] = w * e + v * k + t * p + y * q;
  1592. a[10] = w * f + v * n + t * r + y * x;
  1593. a[11] = w * g + v * m + t * s + y * c;
  1594. w = b[12];
  1595. v = b[13];
  1596. t = b[14];
  1597. y = b[15];
  1598. a[12] = w * d + v * h + t * l + y * u;
  1599. a[13] = w * e + v * k + t * p + y * q;
  1600. a[14] = w * f + v * n + t * r + y * x;
  1601. a[15] = w * g + v * m + t * s + y * c;
  1602. return a
  1603. },
  1604. invert: function(a, c) {
  1605. var b = c[0]
  1606. , d = c[1]
  1607. , e = c[2]
  1608. , f = c[3]
  1609. , g = c[4]
  1610. , h = c[5]
  1611. , k = c[6]
  1612. , n = c[7]
  1613. , m = c[8]
  1614. , l = c[9]
  1615. , p = c[10]
  1616. , r = c[11]
  1617. , s = c[12]
  1618. , u = c[13]
  1619. , q = c[14]
  1620. , x = c[15]
  1621. , w = b * h - d * g
  1622. , v = b * k - e * g
  1623. , t = b * n - f * g
  1624. , y = d * k - e * h
  1625. , E = d * n - f * h
  1626. , F = e * n - f * k
  1627. , A = m * u - l * s
  1628. , B = m * q - p * s
  1629. , z = m * x - r * s
  1630. , C = l * q - p * u
  1631. , G = l * x - r * u
  1632. , H = p * x - r * q
  1633. , D = w * H - v * G + t * C + y * z - E * B + F * A;
  1634. if (!D)
  1635. return null;
  1636. D = 1 / D;
  1637. a[0] = (h * H - k * G + n * C) * D;
  1638. a[1] = (e * G - d * H - f * C) * D;
  1639. a[2] = (u * F - q * E + x * y) * D;
  1640. a[3] = (p * E - l * F - r * y) * D;
  1641. a[4] = (k * z - g * H - n * B) * D;
  1642. a[5] = (b * H - e * z + f * B) * D;
  1643. a[6] = (q * t - s * F - x * v) * D;
  1644. a[7] = (m * F - p * t + r * v) * D;
  1645. a[8] = (g * G - h * z + n * A) * D;
  1646. a[9] = (d * z - b * G - f * A) * D;
  1647. a[10] = (s * E - u * t + x * w) * D;
  1648. a[11] = (l * t - m * E - r * w) * D;
  1649. a[12] = (h * B - g * C - k * A) * D;
  1650. a[13] = (b * C - d * B + e * A) * D;
  1651. a[14] = (u * v - s * y - q * w) * D;
  1652. a[15] = (m * y - l * v + p * w) * D;
  1653. return a
  1654. }
  1655. } );
  1656. /**
  1657. * @author mikael emtinger / http://gomo.se/
  1658. * @author alteredq / http://alteredqualia.com/
  1659. * @author WestLangley / http://github.com/WestLangley
  1660. * @author bhouston / http://clara.io
  1661. */
  1662. function Quaternion( x, y, z, w ) {
  1663. this._x = x || 0;
  1664. this._y = y || 0;
  1665. this._z = z || 0;
  1666. this._w = ( w !== undefined ) ? w : 1;
  1667. }
  1668. Object.assign( Quaternion, {
  1669. slerp: function ( qa, qb, qm, t ) {
  1670. return qm.copy( qa ).slerp( qb, t );
  1671. },
  1672. slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {
  1673. // fuzz-free, array-based Quaternion SLERP operation
  1674. var x0 = src0[ srcOffset0 + 0 ],
  1675. y0 = src0[ srcOffset0 + 1 ],
  1676. z0 = src0[ srcOffset0 + 2 ],
  1677. w0 = src0[ srcOffset0 + 3 ],
  1678. x1 = src1[ srcOffset1 + 0 ],
  1679. y1 = src1[ srcOffset1 + 1 ],
  1680. z1 = src1[ srcOffset1 + 2 ],
  1681. w1 = src1[ srcOffset1 + 3 ];
  1682. if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {
  1683. var s = 1 - t,
  1684. cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,
  1685. dir = ( cos >= 0 ? 1 : - 1 ),
  1686. sqrSin = 1 - cos * cos;
  1687. // Skip the Slerp for tiny steps to avoid numeric problems:
  1688. if ( sqrSin > Number.EPSILON ) {
  1689. var sin = Math.sqrt( sqrSin ),
  1690. len = Math.atan2( sin, cos * dir );
  1691. s = Math.sin( s * len ) / sin;
  1692. t = Math.sin( t * len ) / sin;
  1693. }
  1694. var tDir = t * dir;
  1695. x0 = x0 * s + x1 * tDir;
  1696. y0 = y0 * s + y1 * tDir;
  1697. z0 = z0 * s + z1 * tDir;
  1698. w0 = w0 * s + w1 * tDir;
  1699. // Normalize in case we just did a lerp:
  1700. if ( s === 1 - t ) {
  1701. var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );
  1702. x0 *= f;
  1703. y0 *= f;
  1704. z0 *= f;
  1705. w0 *= f;
  1706. }
  1707. }
  1708. dst[ dstOffset ] = x0;
  1709. dst[ dstOffset + 1 ] = y0;
  1710. dst[ dstOffset + 2 ] = z0;
  1711. dst[ dstOffset + 3 ] = w0;
  1712. }
  1713. } );
  1714. Object.defineProperties( Quaternion.prototype, {
  1715. x: {
  1716. get: function () {
  1717. return this._x;
  1718. },
  1719. set: function ( value ) {
  1720. this._x = value;
  1721. this.onChangeCallback();
  1722. }
  1723. },
  1724. y: {
  1725. get: function () {
  1726. return this._y;
  1727. },
  1728. set: function ( value ) {
  1729. this._y = value;
  1730. this.onChangeCallback();
  1731. }
  1732. },
  1733. z: {
  1734. get: function () {
  1735. return this._z;
  1736. },
  1737. set: function ( value ) {
  1738. this._z = value;
  1739. this.onChangeCallback();
  1740. }
  1741. },
  1742. w: {
  1743. get: function () {
  1744. return this._w;
  1745. },
  1746. set: function ( value ) {
  1747. this._w = value;
  1748. this.onChangeCallback();
  1749. }
  1750. }
  1751. } );
  1752. Object.assign( Quaternion.prototype, {
  1753. set: function ( x, y, z, w ) {
  1754. this._x = x;
  1755. this._y = y;
  1756. this._z = z;
  1757. this._w = w;
  1758. this.onChangeCallback();
  1759. return this;
  1760. },
  1761. clone: function () {
  1762. return new this.constructor( this._x, this._y, this._z, this._w );
  1763. },
  1764. copy: function ( quaternion ) {
  1765. this._x = quaternion.x;
  1766. this._y = quaternion.y;
  1767. this._z = quaternion.z;
  1768. this._w = quaternion.w;
  1769. this.onChangeCallback();
  1770. return this;
  1771. },
  1772. setFromEuler: function ( euler, update ) {
  1773. if ( ! ( euler && euler.isEuler ) ) {
  1774. throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );
  1775. }
  1776. var x = euler._x, y = euler._y, z = euler._z, order = euler.order;
  1777. // http://www.mathworks.com/matlabcentral/fileexchange/
  1778. // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
  1779. // content/SpinCalc.m
  1780. var cos = Math.cos;
  1781. var sin = Math.sin;
  1782. var c1 = cos( x / 2 );
  1783. var c2 = cos( y / 2 );
  1784. var c3 = cos( z / 2 );
  1785. var s1 = sin( x / 2 );
  1786. var s2 = sin( y / 2 );
  1787. var s3 = sin( z / 2 );
  1788. if ( order === 'XYZ' ) {
  1789. this._x = s1 * c2 * c3 + c1 * s2 * s3;
  1790. this._y = c1 * s2 * c3 - s1 * c2 * s3;
  1791. this._z = c1 * c2 * s3 + s1 * s2 * c3;
  1792. this._w = c1 * c2 * c3 - s1 * s2 * s3;
  1793. } else if ( order === 'YXZ' ) {
  1794. this._x = s1 * c2 * c3 + c1 * s2 * s3;
  1795. this._y = c1 * s2 * c3 - s1 * c2 * s3;
  1796. this._z = c1 * c2 * s3 - s1 * s2 * c3;
  1797. this._w = c1 * c2 * c3 + s1 * s2 * s3;
  1798. } else if ( order === 'ZXY' ) {
  1799. this._x = s1 * c2 * c3 - c1 * s2 * s3;
  1800. this._y = c1 * s2 * c3 + s1 * c2 * s3;
  1801. this._z = c1 * c2 * s3 + s1 * s2 * c3;
  1802. this._w = c1 * c2 * c3 - s1 * s2 * s3;
  1803. } else if ( order === 'ZYX' ) {
  1804. this._x = s1 * c2 * c3 - c1 * s2 * s3;
  1805. this._y = c1 * s2 * c3 + s1 * c2 * s3;
  1806. this._z = c1 * c2 * s3 - s1 * s2 * c3;
  1807. this._w = c1 * c2 * c3 + s1 * s2 * s3;
  1808. } else if ( order === 'YZX' ) {
  1809. this._x = s1 * c2 * c3 + c1 * s2 * s3;
  1810. this._y = c1 * s2 * c3 + s1 * c2 * s3;
  1811. this._z = c1 * c2 * s3 - s1 * s2 * c3;
  1812. this._w = c1 * c2 * c3 - s1 * s2 * s3;
  1813. } else if ( order === 'XZY' ) {
  1814. this._x = s1 * c2 * c3 - c1 * s2 * s3;
  1815. this._y = c1 * s2 * c3 - s1 * c2 * s3;
  1816. this._z = c1 * c2 * s3 + s1 * s2 * c3;
  1817. this._w = c1 * c2 * c3 + s1 * s2 * s3;
  1818. }
  1819. if ( update !== false ) this.onChangeCallback();
  1820. return this;
  1821. },
  1822. setFromAxisAngle: function ( axis, angle ) {
  1823. // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
  1824. // assumes axis is normalized
  1825. var halfAngle = angle / 2, s = Math.sin( halfAngle );
  1826. this._x = axis.x * s;
  1827. this._y = axis.y * s;
  1828. this._z = axis.z * s;
  1829. this._w = Math.cos( halfAngle );
  1830. this.onChangeCallback();
  1831. return this;
  1832. },
  1833. setFromRotationMatrix: function ( m ) {
  1834. // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
  1835. // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
  1836. var te = m.elements,
  1837. m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
  1838. m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
  1839. m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],
  1840. trace = m11 + m22 + m33,
  1841. s;
  1842. if ( trace > 0 ) {
  1843. s = 0.5 / Math.sqrt( trace + 1.0 );
  1844. this._w = 0.25 / s;
  1845. this._x = ( m32 - m23 ) * s;
  1846. this._y = ( m13 - m31 ) * s;
  1847. this._z = ( m21 - m12 ) * s;
  1848. } else if ( m11 > m22 && m11 > m33 ) {
  1849. s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );
  1850. this._w = ( m32 - m23 ) / s;
  1851. this._x = 0.25 * s;
  1852. this._y = ( m12 + m21 ) / s;
  1853. this._z = ( m13 + m31 ) / s;
  1854. } else if ( m22 > m33 ) {
  1855. s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );
  1856. this._w = ( m13 - m31 ) / s;
  1857. this._x = ( m12 + m21 ) / s;
  1858. this._y = 0.25 * s;
  1859. this._z = ( m23 + m32 ) / s;
  1860. } else {
  1861. s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );
  1862. this._w = ( m21 - m12 ) / s;
  1863. this._x = ( m13 + m31 ) / s;
  1864. this._y = ( m23 + m32 ) / s;
  1865. this._z = 0.25 * s;
  1866. }
  1867. this.onChangeCallback();
  1868. return this;
  1869. },
  1870. setFromUnitVectors: function () {
  1871. // assumes direction vectors vFrom and vTo are normalized
  1872. var v1 = new Vector3();
  1873. var r;
  1874. var EPS = 0.000001;
  1875. return function setFromUnitVectors( vFrom, vTo ) {
  1876. if ( v1 === undefined ) v1 = new Vector3();
  1877. r = vFrom.dot( vTo ) + 1;
  1878. if ( r < EPS ) {
  1879. r = 0;
  1880. if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {
  1881. v1.set( - vFrom.y, vFrom.x, 0 );
  1882. } else {
  1883. v1.set( 0, - vFrom.z, vFrom.y );
  1884. }
  1885. } else {
  1886. v1.crossVectors( vFrom, vTo );
  1887. }
  1888. this._x = v1.x;
  1889. this._y = v1.y;
  1890. this._z = v1.z;
  1891. this._w = r;
  1892. return this.normalize();
  1893. };
  1894. }(),
  1895. angleTo: function ( q ) {
  1896. return 2 * Math.acos( Math.abs( _Math.clamp( this.dot( q ), - 1, 1 ) ) );
  1897. },
  1898. rotateTowards: function ( q, step ) {
  1899. var angle = this.angleTo( q );
  1900. if ( angle === 0 ) return this;
  1901. var t = Math.min( 1, step / angle );
  1902. this.slerp( q, t );
  1903. return this;
  1904. },
  1905. inverse: function () {
  1906. // quaternion is assumed to have unit length
  1907. return this.conjugate();
  1908. },
  1909. conjugate: function () {
  1910. this._x *= - 1;
  1911. this._y *= - 1;
  1912. this._z *= - 1;
  1913. this.onChangeCallback();
  1914. return this;
  1915. },
  1916. dot: function ( v ) {
  1917. return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
  1918. },
  1919. lengthSq: function () {
  1920. return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
  1921. },
  1922. length: function () {
  1923. return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );
  1924. },
  1925. normalize: function () {
  1926. var l = this.length();
  1927. if ( l === 0 ) {
  1928. this._x = 0;
  1929. this._y = 0;
  1930. this._z = 0;
  1931. this._w = 1;
  1932. } else {
  1933. l = 1 / l;
  1934. this._x = this._x * l;
  1935. this._y = this._y * l;
  1936. this._z = this._z * l;
  1937. this._w = this._w * l;
  1938. }
  1939. this.onChangeCallback();
  1940. return this;
  1941. },
  1942. multiply: function ( q, p ) {
  1943. if ( p !== undefined ) {
  1944. console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );
  1945. return this.multiplyQuaternions( q, p );
  1946. }
  1947. return this.multiplyQuaternions( this, q );
  1948. },
  1949. premultiply: function ( q ) {
  1950. return this.multiplyQuaternions( q, this );
  1951. },
  1952. multiplyQuaternions: function ( a, b ) {
  1953. // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
  1954. var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;
  1955. var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;
  1956. this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
  1957. this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
  1958. this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
  1959. this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
  1960. this.onChangeCallback();
  1961. return this;
  1962. },
  1963. slerp: function ( qb, t ) {
  1964. if ( t === 0 ) return this;
  1965. if ( t === 1 ) return this.copy( qb );
  1966. var x = this._x, y = this._y, z = this._z, w = this._w;
  1967. // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
  1968. var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
  1969. if ( cosHalfTheta < 0 ) {
  1970. this._w = - qb._w;
  1971. this._x = - qb._x;
  1972. this._y = - qb._y;
  1973. this._z = - qb._z;
  1974. cosHalfTheta = - cosHalfTheta;
  1975. } else {
  1976. this.copy( qb );
  1977. }
  1978. if ( cosHalfTheta >= 1.0 ) {
  1979. this._w = w;
  1980. this._x = x;
  1981. this._y = y;
  1982. this._z = z;
  1983. return this;
  1984. }
  1985. var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;
  1986. if ( sqrSinHalfTheta <= Number.EPSILON ) {
  1987. var s = 1 - t;
  1988. this._w = s * w + t * this._w;
  1989. this._x = s * x + t * this._x;
  1990. this._y = s * y + t * this._y;
  1991. this._z = s * z + t * this._z;
  1992. return this.normalize();
  1993. }
  1994. var sinHalfTheta = Math.sqrt( sqrSinHalfTheta );
  1995. var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );
  1996. var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,
  1997. ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;
  1998. this._w = ( w * ratioA + this._w * ratioB );
  1999. this._x = ( x * ratioA + this._x * ratioB );
  2000. this._y = ( y * ratioA + this._y * ratioB );
  2001. this._z = ( z * ratioA + this._z * ratioB );
  2002. this.onChangeCallback();
  2003. return this;
  2004. },
  2005. equals: function ( quaternion ) {
  2006. return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );
  2007. },
  2008. fromArray: function ( array, offset ) {
  2009. if ( offset === undefined ) offset = 0;
  2010. this._x = array[ offset ];
  2011. this._y = array[ offset + 1 ];
  2012. this._z = array[ offset + 2 ];
  2013. this._w = array[ offset + 3 ];
  2014. this.onChangeCallback();
  2015. return this;
  2016. },
  2017. toArray: function ( array, offset ) {
  2018. if ( array === undefined ) array = [];
  2019. if ( offset === undefined ) offset = 0;
  2020. array[ offset ] = this._x;
  2021. array[ offset + 1 ] = this._y;
  2022. array[ offset + 2 ] = this._z;
  2023. array[ offset + 3 ] = this._w;
  2024. return array;
  2025. },
  2026. onChange: function ( callback ) {
  2027. this.onChangeCallback = callback;
  2028. return this;
  2029. },
  2030. onChangeCallback: function () {}
  2031. } );
  2032. /**
  2033. * @author mrdoob / http://mrdoob.com/
  2034. * @author kile / http://kile.stravaganza.org/
  2035. * @author philogb / http://blog.thejit.org/
  2036. * @author mikael emtinger / http://gomo.se/
  2037. * @author egraether / http://egraether.com/
  2038. * @author WestLangley / http://github.com/WestLangley
  2039. */
  2040. function Vector3( x, y, z ) {
  2041. this.x = x || 0;
  2042. this.y = y || 0;
  2043. this.z = z || 0;
  2044. }
  2045. Object.assign( Vector3.prototype, {
  2046. isVector3: true,
  2047. set: function ( x, y, z ) {
  2048. this.x = x;
  2049. this.y = y;
  2050. this.z = z;
  2051. return this;
  2052. },
  2053. setScalar: function ( scalar ) {
  2054. this.x = scalar;
  2055. this.y = scalar;
  2056. this.z = scalar;
  2057. return this;
  2058. },
  2059. setX: function ( x ) {
  2060. this.x = x;
  2061. return this;
  2062. },
  2063. setY: function ( y ) {
  2064. this.y = y;
  2065. return this;
  2066. },
  2067. setZ: function ( z ) {
  2068. this.z = z;
  2069. return this;
  2070. },
  2071. setComponent: function ( index, value ) {
  2072. switch ( index ) {
  2073. case 0: this.x = value; break;
  2074. case 1: this.y = value; break;
  2075. case 2: this.z = value; break;
  2076. default: throw new Error( 'index is out of range: ' + index );
  2077. }
  2078. return this;
  2079. },
  2080. getComponent: function ( index ) {
  2081. switch ( index ) {
  2082. case 0: return this.x;
  2083. case 1: return this.y;
  2084. case 2: return this.z;
  2085. default: throw new Error( 'index is out of range: ' + index );
  2086. }
  2087. },
  2088. clone: function () {
  2089. return new this.constructor( this.x, this.y, this.z );
  2090. },
  2091. copy: function ( v ) {
  2092. this.x = v.x;
  2093. this.y = v.y;
  2094. this.z = v.z;
  2095. return this;
  2096. },
  2097. add: function ( v, w ) {
  2098. if ( w !== undefined ) {
  2099. console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
  2100. return this.addVectors( v, w );
  2101. }
  2102. this.x += v.x;
  2103. this.y += v.y;
  2104. this.z += v.z;
  2105. return this;
  2106. },
  2107. addScalar: function ( s ) {
  2108. this.x += s;
  2109. this.y += s;
  2110. this.z += s;
  2111. return this;
  2112. },
  2113. addVectors: function ( a, b ) {
  2114. this.x = a.x + b.x;
  2115. this.y = a.y + b.y;
  2116. this.z = a.z + b.z;
  2117. return this;
  2118. },
  2119. addScaledVector: function ( v, s ) {
  2120. this.x += v.x * s;
  2121. this.y += v.y * s;
  2122. this.z += v.z * s;
  2123. return this;
  2124. },
  2125. sub: function ( v, w ) {
  2126. if ( w !== undefined ) {
  2127. console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
  2128. return this.subVectors( v, w );
  2129. }
  2130. this.x -= v.x;
  2131. this.y -= v.y;
  2132. this.z -= v.z;
  2133. return this;
  2134. },
  2135. subScalar: function ( s ) {
  2136. this.x -= s;
  2137. this.y -= s;
  2138. this.z -= s;
  2139. return this;
  2140. },
  2141. subVectors: function ( a, b ) {
  2142. this.x = a.x - b.x;
  2143. this.y = a.y - b.y;
  2144. this.z = a.z - b.z;
  2145. return this;
  2146. },
  2147. multiply: function ( v, w ) {
  2148. if ( w !== undefined ) {
  2149. console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );
  2150. return this.multiplyVectors( v, w );
  2151. }
  2152. this.x *= v.x;
  2153. this.y *= v.y;
  2154. this.z *= v.z;
  2155. return this;
  2156. },
  2157. multiplyScalar: function ( scalar ) {
  2158. this.x *= scalar;
  2159. this.y *= scalar;
  2160. this.z *= scalar;
  2161. return this;
  2162. },
  2163. multiplyVectors: function ( a, b ) {
  2164. this.x = a.x * b.x;
  2165. this.y = a.y * b.y;
  2166. this.z = a.z * b.z;
  2167. return this;
  2168. },
  2169. applyEuler: function () {
  2170. var quaternion = new Quaternion();
  2171. return function applyEuler( euler ) {
  2172. if ( ! ( euler && euler.isEuler ) ) {
  2173. console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );
  2174. }
  2175. return this.applyQuaternion( quaternion.setFromEuler( euler ) );
  2176. };
  2177. }(),
  2178. applyAxisAngle: function () {
  2179. var quaternion = new Quaternion();
  2180. return function applyAxisAngle( axis, angle ) {
  2181. return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );
  2182. };
  2183. }(),
  2184. applyMatrix3: function ( m ) {
  2185. var x = this.x, y = this.y, z = this.z;
  2186. var e = m.elements;
  2187. this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;
  2188. this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;
  2189. this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;
  2190. return this;
  2191. },
  2192. applyMatrix4: function ( m ) {
  2193. var x = this.x, y = this.y, z = this.z;
  2194. var e = m.elements;
  2195. var w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );
  2196. this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;
  2197. this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;
  2198. this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;
  2199. return this;
  2200. },
  2201. applyQuaternion: function ( q ) {
  2202. var x = this.x, y = this.y, z = this.z;
  2203. var qx = q.x, qy = q.y, qz = q.z, qw = q.w;
  2204. // calculate quat * vector
  2205. var ix = qw * x + qy * z - qz * y;
  2206. var iy = qw * y + qz * x - qx * z;
  2207. var iz = qw * z + qx * y - qy * x;
  2208. var iw = - qx * x - qy * y - qz * z;
  2209. // calculate result * inverse quat
  2210. this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;
  2211. this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;
  2212. this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;
  2213. return this;
  2214. },
  2215. project: function () {
  2216. var matrix = new Matrix4();
  2217. return function project( camera ) {
  2218. matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );
  2219. return this.applyMatrix4( matrix );
  2220. };
  2221. }(),
  2222. unproject: function () {
  2223. var matrix = new Matrix4();
  2224. return function unproject( camera ) {
  2225. matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );
  2226. return this.applyMatrix4( matrix );
  2227. };
  2228. }(),
  2229. transformDirection: function ( m ) {
  2230. // input: THREE.Matrix4 affine matrix
  2231. // vector interpreted as a direction
  2232. var x = this.x, y = this.y, z = this.z;
  2233. var e = m.elements;
  2234. this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;
  2235. this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;
  2236. this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;
  2237. return this.normalize();
  2238. },
  2239. divide: function ( v ) {
  2240. this.x /= v.x;
  2241. this.y /= v.y;
  2242. this.z /= v.z;
  2243. return this;
  2244. },
  2245. divideScalar: function ( scalar ) {
  2246. return this.multiplyScalar( 1 / scalar );
  2247. },
  2248. min: function ( v ) {
  2249. this.x = Math.min( this.x, v.x );
  2250. this.y = Math.min( this.y, v.y );
  2251. this.z = Math.min( this.z, v.z );
  2252. return this;
  2253. },
  2254. max: function ( v ) {
  2255. this.x = Math.max( this.x, v.x );
  2256. this.y = Math.max( this.y, v.y );
  2257. this.z = Math.max( this.z, v.z );
  2258. return this;
  2259. },
  2260. clamp: function ( min, max ) {
  2261. // assumes min < max, componentwise
  2262. this.x = Math.max( min.x, Math.min( max.x, this.x ) );
  2263. this.y = Math.max( min.y, Math.min( max.y, this.y ) );
  2264. this.z = Math.max( min.z, Math.min( max.z, this.z ) );
  2265. return this;
  2266. },
  2267. clampScalar: function () {
  2268. var min = new Vector3();
  2269. var max = new Vector3();
  2270. return function clampScalar( minVal, maxVal ) {
  2271. min.set( minVal, minVal, minVal );
  2272. max.set( maxVal, maxVal, maxVal );
  2273. return this.clamp( min, max );
  2274. };
  2275. }(),
  2276. clampLength: function ( min, max ) {
  2277. var length = this.length();
  2278. return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
  2279. },
  2280. floor: function () {
  2281. this.x = Math.floor( this.x );
  2282. this.y = Math.floor( this.y );
  2283. this.z = Math.floor( this.z );
  2284. return this;
  2285. },
  2286. ceil: function () {
  2287. this.x = Math.ceil( this.x );
  2288. this.y = Math.ceil( this.y );
  2289. this.z = Math.ceil( this.z );
  2290. return this;
  2291. },
  2292. round: function () {
  2293. this.x = Math.round( this.x );
  2294. this.y = Math.round( this.y );
  2295. this.z = Math.round( this.z );
  2296. return this;
  2297. },
  2298. roundToZero: function () {
  2299. this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
  2300. this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
  2301. this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
  2302. return this;
  2303. },
  2304. negate: function () {
  2305. this.x = - this.x;
  2306. this.y = - this.y;
  2307. this.z = - this.z;
  2308. return this;
  2309. },
  2310. dot: function ( v ) {
  2311. return this.x * v.x + this.y * v.y + this.z * v.z;
  2312. },
  2313. // TODO lengthSquared?
  2314. lengthSq: function () {
  2315. return this.x * this.x + this.y * this.y + this.z * this.z;
  2316. },
  2317. length: function () {
  2318. return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );
  2319. },
  2320. manhattanLength: function () {
  2321. return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );
  2322. },
  2323. normalize: function () {
  2324. return this.divideScalar( this.length() || 1 );
  2325. },
  2326. setLength: function ( length ) {
  2327. return this.normalize().multiplyScalar( length );
  2328. },
  2329. lerp: function ( v, alpha ) {
  2330. this.x += ( v.x - this.x ) * alpha;
  2331. this.y += ( v.y - this.y ) * alpha;
  2332. this.z += ( v.z - this.z ) * alpha;
  2333. return this;
  2334. },
  2335. lerpVectors: function ( v1, v2, alpha ) {
  2336. return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
  2337. },
  2338. cross: function ( v, w ) {
  2339. if ( w !== undefined ) {
  2340. console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );
  2341. return this.crossVectors( v, w );
  2342. }
  2343. return this.crossVectors( this, v );
  2344. },
  2345. crossVectors: function ( a, b ) {
  2346. var ax = a.x, ay = a.y, az = a.z;
  2347. var bx = b.x, by = b.y, bz = b.z;
  2348. this.x = ay * bz - az * by;
  2349. this.y = az * bx - ax * bz;
  2350. this.z = ax * by - ay * bx;
  2351. return this;
  2352. },
  2353. projectOnVector: function ( vector ) {
  2354. var scalar = vector.dot( this ) / vector.lengthSq();
  2355. return this.copy( vector ).multiplyScalar( scalar );
  2356. },
  2357. projectOnPlane: function () {
  2358. var v1 = new Vector3();
  2359. return function projectOnPlane( planeNormal ) {
  2360. v1.copy( this ).projectOnVector( planeNormal );
  2361. return this.sub( v1 );
  2362. };
  2363. }(),
  2364. reflect: function () {
  2365. // reflect incident vector off plane orthogonal to normal
  2366. // normal is assumed to have unit length
  2367. var v1 = new Vector3();
  2368. return function reflect( normal ) {
  2369. return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );
  2370. };
  2371. }(),
  2372. angleTo: function ( v ) {
  2373. var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );
  2374. // clamp, to handle numerical problems
  2375. return Math.acos( _Math.clamp( theta, - 1, 1 ) );
  2376. },
  2377. distanceTo: function ( v ) {
  2378. return Math.sqrt( this.distanceToSquared( v ) );
  2379. },
  2380. distanceToSquared: function ( v ) {
  2381. var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;
  2382. return dx * dx + dy * dy + dz * dz;
  2383. },
  2384. manhattanDistanceTo: function ( v ) {
  2385. return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );
  2386. },
  2387. setFromSpherical: function ( s ) {
  2388. var sinPhiRadius = Math.sin( s.phi ) * s.radius;
  2389. this.x = sinPhiRadius * Math.sin( s.theta );
  2390. this.y = Math.cos( s.phi ) * s.radius;
  2391. this.z = sinPhiRadius * Math.cos( s.theta );
  2392. return this;
  2393. },
  2394. setFromCylindrical: function ( c ) {
  2395. this.x = c.radius * Math.sin( c.theta );
  2396. this.y = c.y;
  2397. this.z = c.radius * Math.cos( c.theta );
  2398. return this;
  2399. },
  2400. setFromMatrixPosition: function ( m ) {
  2401. var e = m.elements;
  2402. this.x = e[ 12 ];
  2403. this.y = e[ 13 ];
  2404. this.z = e[ 14 ];
  2405. return this;
  2406. },
  2407. setFromMatrixScale: function ( m ) {
  2408. var sx = this.setFromMatrixColumn( m, 0 ).length();
  2409. var sy = this.setFromMatrixColumn( m, 1 ).length();
  2410. var sz = this.setFromMatrixColumn( m, 2 ).length();
  2411. this.x = sx;
  2412. this.y = sy;
  2413. this.z = sz;
  2414. return this;
  2415. },
  2416. setFromMatrixColumn: function ( m, index ) {
  2417. return this.fromArray( m.elements, index * 4 );
  2418. },
  2419. equals: function ( v ) {
  2420. return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );
  2421. },
  2422. fromArray: function ( array, offset ) {
  2423. if ( offset === undefined ) offset = 0;
  2424. this.x = array[ offset ];
  2425. this.y = array[ offset + 1 ];
  2426. this.z = array[ offset + 2 ];
  2427. return this;
  2428. },
  2429. toArray: function ( array, offset ) {
  2430. if ( array === undefined ) array = [];
  2431. if ( offset === undefined ) offset = 0;
  2432. array[ offset ] = this.x;
  2433. array[ offset + 1 ] = this.y;
  2434. array[ offset + 2 ] = this.z;
  2435. return array;
  2436. },
  2437. fromBufferAttribute: function ( attribute, index, offset ) {
  2438. if ( offset !== undefined ) {
  2439. console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );
  2440. }
  2441. this.x = attribute.getX( index );
  2442. this.y = attribute.getY( index );
  2443. this.z = attribute.getZ( index );
  2444. return this;
  2445. }
  2446. } );
  2447. /**
  2448. * @author alteredq / http://alteredqualia.com/
  2449. * @author WestLangley / http://github.com/WestLangley
  2450. * @author bhouston / http://clara.io
  2451. * @author tschw
  2452. */
  2453. function Matrix3() {
  2454. this.elements = [
  2455. 1, 0, 0,
  2456. 0, 1, 0,
  2457. 0, 0, 1
  2458. ];
  2459. if ( arguments.length > 0 ) {
  2460. console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );
  2461. }
  2462. }
  2463. Object.assign( Matrix3.prototype, {
  2464. isMatrix3: true,
  2465. set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {
  2466. var te = this.elements;
  2467. te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;
  2468. te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;
  2469. te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;
  2470. return this;
  2471. },
  2472. identity: function () {
  2473. this.set(
  2474. 1, 0, 0,
  2475. 0, 1, 0,
  2476. 0, 0, 1
  2477. );
  2478. return this;
  2479. },
  2480. clone: function () {
  2481. return new this.constructor().fromArray( this.elements );
  2482. },
  2483. copy: function ( m ) {
  2484. var te = this.elements;
  2485. var me = m.elements;
  2486. te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];
  2487. te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];
  2488. te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];
  2489. return this;
  2490. },
  2491. setFromMatrix4: function ( m ) {
  2492. var me = m.elements;
  2493. this.set(
  2494. me[ 0 ], me[ 4 ], me[ 8 ],
  2495. me[ 1 ], me[ 5 ], me[ 9 ],
  2496. me[ 2 ], me[ 6 ], me[ 10 ]
  2497. );
  2498. return this;
  2499. },
  2500. applyToBufferAttribute: function () {
  2501. var v1 = new Vector3();
  2502. return function applyToBufferAttribute( attribute ) {
  2503. for ( var i = 0, l = attribute.count; i < l; i ++ ) {
  2504. v1.x = attribute.getX( i );
  2505. v1.y = attribute.getY( i );
  2506. v1.z = attribute.getZ( i );
  2507. v1.applyMatrix3( this );
  2508. attribute.setXYZ( i, v1.x, v1.y, v1.z );
  2509. }
  2510. return attribute;
  2511. };
  2512. }(),
  2513. multiply: function ( m ) {
  2514. return this.multiplyMatrices( this, m );
  2515. },
  2516. premultiply: function ( m ) {
  2517. return this.multiplyMatrices( m, this );
  2518. },
  2519. multiplyMatrices: function ( a, b ) {
  2520. var ae = a.elements;
  2521. var be = b.elements;
  2522. var te = this.elements;
  2523. var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];
  2524. var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];
  2525. var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];
  2526. var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];
  2527. var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];
  2528. var b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];
  2529. te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;
  2530. te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;
  2531. te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;
  2532. te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;
  2533. te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;
  2534. te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;
  2535. te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;
  2536. te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;
  2537. te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;
  2538. return this;
  2539. },
  2540. multiplyScalar: function ( s ) {
  2541. var te = this.elements;
  2542. te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;
  2543. te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;
  2544. te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;
  2545. return this;
  2546. },
  2547. determinant: function () {
  2548. var te = this.elements;
  2549. var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],
  2550. d = te[ 3 ], e = te[ 4 ], f = te[ 5 ],
  2551. g = te[ 6 ], h = te[ 7 ], i = te[ 8 ];
  2552. return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;
  2553. },
  2554. getInverse: function ( matrix, throwOnDegenerate ) {
  2555. if ( matrix && matrix.isMatrix4 ) {
  2556. console.error( "THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument." );
  2557. }
  2558. var me = matrix.elements,
  2559. te = this.elements,
  2560. n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],
  2561. n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],
  2562. n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],
  2563. t11 = n33 * n22 - n32 * n23,
  2564. t12 = n32 * n13 - n33 * n12,
  2565. t13 = n23 * n12 - n22 * n13,
  2566. det = n11 * t11 + n21 * t12 + n31 * t13;
  2567. if ( det === 0 ) {
  2568. var msg = "THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0";
  2569. if ( throwOnDegenerate === true ) {
  2570. throw new Error( msg );
  2571. } else {
  2572. console.warn( msg );
  2573. }
  2574. return this.identity();
  2575. }
  2576. var detInv = 1 / det;
  2577. te[ 0 ] = t11 * detInv;
  2578. te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;
  2579. te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;
  2580. te[ 3 ] = t12 * detInv;
  2581. te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;
  2582. te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;
  2583. te[ 6 ] = t13 * detInv;
  2584. te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;
  2585. te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;
  2586. return this;
  2587. },
  2588. transpose: function () {
  2589. var tmp, m = this.elements;
  2590. tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;
  2591. tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;
  2592. tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;
  2593. return this;
  2594. },
  2595. getNormalMatrix: function ( matrix4 ) {
  2596. return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();
  2597. },
  2598. transposeIntoArray: function ( r ) {
  2599. var m = this.elements;
  2600. r[ 0 ] = m[ 0 ];
  2601. r[ 1 ] = m[ 3 ];
  2602. r[ 2 ] = m[ 6 ];
  2603. r[ 3 ] = m[ 1 ];
  2604. r[ 4 ] = m[ 4 ];
  2605. r[ 5 ] = m[ 7 ];
  2606. r[ 6 ] = m[ 2 ];
  2607. r[ 7 ] = m[ 5 ];
  2608. r[ 8 ] = m[ 8 ];
  2609. return this;
  2610. },
  2611. setUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) {
  2612. var c = Math.cos( rotation );
  2613. var s = Math.sin( rotation );
  2614. this.set(
  2615. sx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,
  2616. - sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,
  2617. 0, 0, 1
  2618. );
  2619. },
  2620. scale: function ( sx, sy ) {
  2621. var te = this.elements;
  2622. te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;
  2623. te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;
  2624. return this;
  2625. },
  2626. rotate: function ( theta ) {
  2627. var c = Math.cos( theta );
  2628. var s = Math.sin( theta );
  2629. var te = this.elements;
  2630. var a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];
  2631. var a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];
  2632. te[ 0 ] = c * a11 + s * a21;
  2633. te[ 3 ] = c * a12 + s * a22;
  2634. te[ 6 ] = c * a13 + s * a23;
  2635. te[ 1 ] = - s * a11 + c * a21;
  2636. te[ 4 ] = - s * a12 + c * a22;
  2637. te[ 7 ] = - s * a13 + c * a23;
  2638. return this;
  2639. },
  2640. translate: function ( tx, ty ) {
  2641. var te = this.elements;
  2642. te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];
  2643. te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];
  2644. return this;
  2645. },
  2646. equals: function ( matrix ) {
  2647. var te = this.elements;
  2648. var me = matrix.elements;
  2649. for ( var i = 0; i < 9; i ++ ) {
  2650. if ( te[ i ] !== me[ i ] ) return false;
  2651. }
  2652. return true;
  2653. },
  2654. fromArray: function ( array, offset ) {
  2655. if ( offset === undefined ) offset = 0;
  2656. for ( var i = 0; i < 9; i ++ ) {
  2657. this.elements[ i ] = array[ i + offset ];
  2658. }
  2659. return this;
  2660. },
  2661. toArray: function ( array, offset ) {
  2662. if ( array === undefined ) array = [];
  2663. if ( offset === undefined ) offset = 0;
  2664. var te = this.elements;
  2665. array[ offset ] = te[ 0 ];
  2666. array[ offset + 1 ] = te[ 1 ];
  2667. array[ offset + 2 ] = te[ 2 ];
  2668. array[ offset + 3 ] = te[ 3 ];
  2669. array[ offset + 4 ] = te[ 4 ];
  2670. array[ offset + 5 ] = te[ 5 ];
  2671. array[ offset + 6 ] = te[ 6 ];
  2672. array[ offset + 7 ] = te[ 7 ];
  2673. array[ offset + 8 ] = te[ 8 ];
  2674. return array;
  2675. }
  2676. } );
  2677. /**
  2678. * @author mrdoob / http://mrdoob.com/
  2679. * @author alteredq / http://alteredqualia.com/
  2680. * @author szimek / https://github.com/szimek/
  2681. */
  2682. var ImageUtils = {
  2683. getDataURL: function ( image ) {
  2684. var canvas;
  2685. if ( image instanceof HTMLCanvasElement ) {
  2686. canvas = image;
  2687. } else {
  2688. if ( typeof OffscreenCanvas !== 'undefined' ) {
  2689. canvas = new OffscreenCanvas( image.width, image.height );
  2690. } else {
  2691. canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
  2692. canvas.width = image.width;
  2693. canvas.height = image.height;
  2694. }
  2695. var context = canvas.getContext( '2d' );
  2696. if ( image instanceof ImageData ) {
  2697. context.putImageData( image, 0, 0 );
  2698. } else {
  2699. context.drawImage( image, 0, 0, image.width, image.height );
  2700. }
  2701. }
  2702. if ( canvas.width > 2048 || canvas.height > 2048 ) {
  2703. return canvas.toDataURL( 'image/jpeg', 0.6 );
  2704. } else {
  2705. return canvas.toDataURL( 'image/png' );
  2706. }
  2707. }
  2708. };
  2709. /**
  2710. * @author mrdoob / http://mrdoob.com/
  2711. * @author alteredq / http://alteredqualia.com/
  2712. * @author szimek / https://github.com/szimek/
  2713. */
  2714. var textureId = 0;
  2715. function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {
  2716. Object.defineProperty( this, 'id', { value: textureId ++ } );
  2717. this.uuid = _Math.generateUUID();
  2718. this.name = '';
  2719. this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;
  2720. this.mipmaps = [];
  2721. this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;
  2722. this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;
  2723. this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;
  2724. this.magFilter = magFilter !== undefined ? magFilter : LinearFilter;
  2725. this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;
  2726. this.anisotropy = anisotropy !== undefined ? anisotropy : 1;
  2727. this.format = format !== undefined ? format : RGBAFormat;
  2728. this.type = type !== undefined ? type : UnsignedByteType;
  2729. this.offset = new Vector2( 0, 0 );
  2730. this.repeat = new Vector2( 1, 1 );
  2731. this.center = new Vector2( 0, 0 );
  2732. this.rotation = 0;
  2733. this.matrixAutoUpdate = true;
  2734. this.matrix = new Matrix3();
  2735. this.generateMipmaps = true;
  2736. this.premultiplyAlpha = false;
  2737. this.flipY = true;
  2738. this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)
  2739. // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.
  2740. //
  2741. // Also changing the encoding after already used by a Material will not automatically make the Material
  2742. // update. You need to explicitly call Material.needsUpdate to trigger it to recompile.
  2743. this.encoding = encoding !== undefined ? encoding : LinearEncoding;
  2744. this.version = 0;
  2745. this.onUpdate = null;
  2746. }
  2747. Texture.DEFAULT_IMAGE = undefined;
  2748. Texture.DEFAULT_MAPPING = UVMapping;
  2749. Texture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
  2750. constructor: Texture,
  2751. isTexture: true,
  2752. updateMatrix: function () {
  2753. this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );
  2754. },
  2755. clone: function () {
  2756. return new this.constructor().copy( this );
  2757. },
  2758. copy: function ( source ) {
  2759. this.name = source.name;
  2760. this.image = source.image;
  2761. this.mipmaps = source.mipmaps.slice( 0 );
  2762. this.mapping = source.mapping;
  2763. this.wrapS = source.wrapS;
  2764. this.wrapT = source.wrapT;
  2765. this.magFilter = source.magFilter;
  2766. this.minFilter = source.minFilter;
  2767. this.anisotropy = source.anisotropy;
  2768. this.format = source.format;
  2769. this.type = source.type;
  2770. this.offset.copy( source.offset );
  2771. this.repeat.copy( source.repeat );
  2772. this.center.copy( source.center );
  2773. this.rotation = source.rotation;
  2774. this.matrixAutoUpdate = source.matrixAutoUpdate;
  2775. this.matrix.copy( source.matrix );
  2776. this.generateMipmaps = source.generateMipmaps;
  2777. this.premultiplyAlpha = source.premultiplyAlpha;
  2778. this.flipY = source.flipY;
  2779. this.unpackAlignment = source.unpackAlignment;
  2780. this.encoding = source.encoding;
  2781. return this;
  2782. },
  2783. toJSON: function ( meta ) {
  2784. var isRootObject = ( meta === undefined || typeof meta === 'string' );
  2785. if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {
  2786. return meta.textures[ this.uuid ];
  2787. }
  2788. var output = {
  2789. metadata: {
  2790. version: 4.5,
  2791. type: 'Texture',
  2792. generator: 'Texture.toJSON'
  2793. },
  2794. uuid: this.uuid,
  2795. name: this.name,
  2796. mapping: this.mapping,
  2797. repeat: [ this.repeat.x, this.repeat.y ],
  2798. offset: [ this.offset.x, this.offset.y ],
  2799. center: [ this.center.x, this.center.y ],
  2800. rotation: this.rotation,
  2801. wrap: [ this.wrapS, this.wrapT ],
  2802. format: this.format,
  2803. minFilter: this.minFilter,
  2804. magFilter: this.magFilter,
  2805. anisotropy: this.anisotropy,
  2806. flipY: this.flipY
  2807. };
  2808. if ( this.image !== undefined ) {
  2809. // TODO: Move to THREE.Image
  2810. var image = this.image;
  2811. if ( image.uuid === undefined ) {
  2812. image.uuid = _Math.generateUUID(); // UGH
  2813. }
  2814. if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) {
  2815. var url;
  2816. if ( Array.isArray( image ) ) {
  2817. // process array of images e.g. CubeTexture
  2818. url = [];
  2819. for ( var i = 0, l = image.length; i < l; i ++ ) {
  2820. url.push( ImageUtils.getDataURL( image[ i ] ) );
  2821. }
  2822. } else {
  2823. // process single image
  2824. url = ImageUtils.getDataURL( image );
  2825. }
  2826. meta.images[ image.uuid ] = {
  2827. uuid: image.uuid,
  2828. url: url
  2829. };
  2830. }
  2831. output.image = image.uuid;
  2832. }
  2833. if ( ! isRootObject ) {
  2834. meta.textures[ this.uuid ] = output;
  2835. }
  2836. return output;
  2837. },
  2838. dispose: function () {
  2839. this.dispatchEvent( { type: 'dispose' } );
  2840. },
  2841. transformUv: function ( uv ) {
  2842. if ( this.mapping !== UVMapping ) return;
  2843. uv.applyMatrix3( this.matrix );
  2844. if ( uv.x < 0 || uv.x > 1 ) {
  2845. switch ( this.wrapS ) {
  2846. case RepeatWrapping:
  2847. uv.x = uv.x - Math.floor( uv.x );
  2848. break;
  2849. case ClampToEdgeWrapping:
  2850. uv.x = uv.x < 0 ? 0 : 1;
  2851. break;
  2852. case MirroredRepeatWrapping:
  2853. if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {
  2854. uv.x = Math.ceil( uv.x ) - uv.x;
  2855. } else {
  2856. uv.x = uv.x - Math.floor( uv.x );
  2857. }
  2858. break;
  2859. }
  2860. }
  2861. if ( uv.y < 0 || uv.y > 1 ) {
  2862. switch ( this.wrapT ) {
  2863. case RepeatWrapping:
  2864. uv.y = uv.y - Math.floor( uv.y );
  2865. break;
  2866. case ClampToEdgeWrapping:
  2867. uv.y = uv.y < 0 ? 0 : 1;
  2868. break;
  2869. case MirroredRepeatWrapping:
  2870. if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {
  2871. uv.y = Math.ceil( uv.y ) - uv.y;
  2872. } else {
  2873. uv.y = uv.y - Math.floor( uv.y );
  2874. }
  2875. break;
  2876. }
  2877. }
  2878. if ( this.flipY ) {
  2879. uv.y = 1 - uv.y;
  2880. }
  2881. }
  2882. } );
  2883. Object.defineProperty( Texture.prototype, "needsUpdate", {
  2884. set: function ( value ) {
  2885. if ( value === true ) this.version ++;
  2886. }
  2887. } );
  2888. /**
  2889. * @author supereggbert / http://www.paulbrunt.co.uk/
  2890. * @author philogb / http://blog.thejit.org/
  2891. * @author mikael emtinger / http://gomo.se/
  2892. * @author egraether / http://egraether.com/
  2893. * @author WestLangley / http://github.com/WestLangley
  2894. */
  2895. function Vector4( x, y, z, w ) {
  2896. this.x = x || 0;
  2897. this.y = y || 0;
  2898. this.z = z || 0;
  2899. this.w = ( w !== undefined ) ? w : 1;
  2900. }
  2901. Object.assign( Vector4.prototype, {
  2902. isVector4: true,
  2903. set: function ( x, y, z, w ) {
  2904. this.x = x;
  2905. this.y = y;
  2906. this.z = z;
  2907. this.w = w;
  2908. return this;
  2909. },
  2910. setScalar: function ( scalar ) {
  2911. this.x = scalar;
  2912. this.y = scalar;
  2913. this.z = scalar;
  2914. this.w = scalar;
  2915. return this;
  2916. },
  2917. setX: function ( x ) {
  2918. this.x = x;
  2919. return this;
  2920. },
  2921. setY: function ( y ) {
  2922. this.y = y;
  2923. return this;
  2924. },
  2925. setZ: function ( z ) {
  2926. this.z = z;
  2927. return this;
  2928. },
  2929. setW: function ( w ) {
  2930. this.w = w;
  2931. return this;
  2932. },
  2933. setComponent: function ( index, value ) {
  2934. switch ( index ) {
  2935. case 0: this.x = value; break;
  2936. case 1: this.y = value; break;
  2937. case 2: this.z = value; break;
  2938. case 3: this.w = value; break;
  2939. default: throw new Error( 'index is out of range: ' + index );
  2940. }
  2941. return this;
  2942. },
  2943. getComponent: function ( index ) {
  2944. switch ( index ) {
  2945. case 0: return this.x;
  2946. case 1: return this.y;
  2947. case 2: return this.z;
  2948. case 3: return this.w;
  2949. default: throw new Error( 'index is out of range: ' + index );
  2950. }
  2951. },
  2952. clone: function () {
  2953. return new this.constructor( this.x, this.y, this.z, this.w );
  2954. },
  2955. copy: function ( v ) {
  2956. this.x = v.x;
  2957. this.y = v.y;
  2958. this.z = v.z;
  2959. this.w = ( v.w !== undefined ) ? v.w : 1;
  2960. return this;
  2961. },
  2962. add: function ( v, w ) {
  2963. if ( w !== undefined ) {
  2964. console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
  2965. return this.addVectors( v, w );
  2966. }
  2967. this.x += v.x;
  2968. this.y += v.y;
  2969. this.z += v.z;
  2970. this.w += v.w;
  2971. return this;
  2972. },
  2973. addScalar: function ( s ) {
  2974. this.x += s;
  2975. this.y += s;
  2976. this.z += s;
  2977. this.w += s;
  2978. return this;
  2979. },
  2980. addVectors: function ( a, b ) {
  2981. this.x = a.x + b.x;
  2982. this.y = a.y + b.y;
  2983. this.z = a.z + b.z;
  2984. this.w = a.w + b.w;
  2985. return this;
  2986. },
  2987. addScaledVector: function ( v, s ) {
  2988. this.x += v.x * s;
  2989. this.y += v.y * s;
  2990. this.z += v.z * s;
  2991. this.w += v.w * s;
  2992. return this;
  2993. },
  2994. sub: function ( v, w ) {
  2995. if ( w !== undefined ) {
  2996. console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
  2997. return this.subVectors( v, w );
  2998. }
  2999. this.x -= v.x;
  3000. this.y -= v.y;
  3001. this.z -= v.z;
  3002. this.w -= v.w;
  3003. return this;
  3004. },
  3005. subScalar: function ( s ) {
  3006. this.x -= s;
  3007. this.y -= s;
  3008. this.z -= s;
  3009. this.w -= s;
  3010. return this;
  3011. },
  3012. subVectors: function ( a, b ) {
  3013. this.x = a.x - b.x;
  3014. this.y = a.y - b.y;
  3015. this.z = a.z - b.z;
  3016. this.w = a.w - b.w;
  3017. return this;
  3018. },
  3019. multiplyScalar: function ( scalar ) {
  3020. this.x *= scalar;
  3021. this.y *= scalar;
  3022. this.z *= scalar;
  3023. this.w *= scalar;
  3024. return this;
  3025. },
  3026. applyMatrix4: function ( m ) {
  3027. var x = this.x, y = this.y, z = this.z, w = this.w;
  3028. var e = m.elements;
  3029. this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;
  3030. this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;
  3031. this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;
  3032. this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;
  3033. return this;
  3034. },
  3035. divideScalar: function ( scalar ) {
  3036. return this.multiplyScalar( 1 / scalar );
  3037. },
  3038. setAxisAngleFromQuaternion: function ( q ) {
  3039. // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
  3040. // q is assumed to be normalized
  3041. this.w = 2 * Math.acos( q.w );
  3042. var s = Math.sqrt( 1 - q.w * q.w );
  3043. if ( s < 0.0001 ) {
  3044. this.x = 1;
  3045. this.y = 0;
  3046. this.z = 0;
  3047. } else {
  3048. this.x = q.x / s;
  3049. this.y = q.y / s;
  3050. this.z = q.z / s;
  3051. }
  3052. return this;
  3053. },
  3054. setAxisAngleFromRotationMatrix: function ( m ) {
  3055. // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm
  3056. // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
  3057. var angle, x, y, z, // variables for result
  3058. epsilon = 0.01, // margin to allow for rounding errors
  3059. epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees
  3060. te = m.elements,
  3061. m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
  3062. m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
  3063. m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];
  3064. if ( ( Math.abs( m12 - m21 ) < epsilon ) &&
  3065. ( Math.abs( m13 - m31 ) < epsilon ) &&
  3066. ( Math.abs( m23 - m32 ) < epsilon ) ) {
  3067. // singularity found
  3068. // first check for identity matrix which must have +1 for all terms
  3069. // in leading diagonal and zero in other terms
  3070. if ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&
  3071. ( Math.abs( m13 + m31 ) < epsilon2 ) &&
  3072. ( Math.abs( m23 + m32 ) < epsilon2 ) &&
  3073. ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {
  3074. // this singularity is identity matrix so angle = 0
  3075. this.set( 1, 0, 0, 0 );
  3076. return this; // zero angle, arbitrary axis
  3077. }
  3078. // otherwise this singularity is angle = 180
  3079. angle = Math.PI;
  3080. var xx = ( m11 + 1 ) / 2;
  3081. var yy = ( m22 + 1 ) / 2;
  3082. var zz = ( m33 + 1 ) / 2;
  3083. var xy = ( m12 + m21 ) / 4;
  3084. var xz = ( m13 + m31 ) / 4;
  3085. var yz = ( m23 + m32 ) / 4;
  3086. if ( ( xx > yy ) && ( xx > zz ) ) {
  3087. // m11 is the largest diagonal term
  3088. if ( xx < epsilon ) {
  3089. x = 0;
  3090. y = 0.707106781;
  3091. z = 0.707106781;
  3092. } else {
  3093. x = Math.sqrt( xx );
  3094. y = xy / x;
  3095. z = xz / x;
  3096. }
  3097. } else if ( yy > zz ) {
  3098. // m22 is the largest diagonal term
  3099. if ( yy < epsilon ) {
  3100. x = 0.707106781;
  3101. y = 0;
  3102. z = 0.707106781;
  3103. } else {
  3104. y = Math.sqrt( yy );
  3105. x = xy / y;
  3106. z = yz / y;
  3107. }
  3108. } else {
  3109. // m33 is the largest diagonal term so base result on this
  3110. if ( zz < epsilon ) {
  3111. x = 0.707106781;
  3112. y = 0.707106781;
  3113. z = 0;
  3114. } else {
  3115. z = Math.sqrt( zz );
  3116. x = xz / z;
  3117. y = yz / z;
  3118. }
  3119. }
  3120. this.set( x, y, z, angle );
  3121. return this; // return 180 deg rotation
  3122. }
  3123. // as we have reached here there are no singularities so we can handle normally
  3124. var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +
  3125. ( m13 - m31 ) * ( m13 - m31 ) +
  3126. ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize
  3127. if ( Math.abs( s ) < 0.001 ) s = 1;
  3128. // prevent divide by zero, should not happen if matrix is orthogonal and should be
  3129. // caught by singularity test above, but I've left it in just in case
  3130. this.x = ( m32 - m23 ) / s;
  3131. this.y = ( m13 - m31 ) / s;
  3132. this.z = ( m21 - m12 ) / s;
  3133. this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );
  3134. return this;
  3135. },
  3136. min: function ( v ) {
  3137. this.x = Math.min( this.x, v.x );
  3138. this.y = Math.min( this.y, v.y );
  3139. this.z = Math.min( this.z, v.z );
  3140. this.w = Math.min( this.w, v.w );
  3141. return this;
  3142. },
  3143. max: function ( v ) {
  3144. this.x = Math.max( this.x, v.x );
  3145. this.y = Math.max( this.y, v.y );
  3146. this.z = Math.max( this.z, v.z );
  3147. this.w = Math.max( this.w, v.w );
  3148. return this;
  3149. },
  3150. clamp: function ( min, max ) {
  3151. // assumes min < max, componentwise
  3152. this.x = Math.max( min.x, Math.min( max.x, this.x ) );
  3153. this.y = Math.max( min.y, Math.min( max.y, this.y ) );
  3154. this.z = Math.max( min.z, Math.min( max.z, this.z ) );
  3155. this.w = Math.max( min.w, Math.min( max.w, this.w ) );
  3156. return this;
  3157. },
  3158. clampScalar: function () {
  3159. var min, max;
  3160. return function clampScalar( minVal, maxVal ) {
  3161. if ( min === undefined ) {
  3162. min = new Vector4();
  3163. max = new Vector4();
  3164. }
  3165. min.set( minVal, minVal, minVal, minVal );
  3166. max.set( maxVal, maxVal, maxVal, maxVal );
  3167. return this.clamp( min, max );
  3168. };
  3169. }(),
  3170. clampLength: function ( min, max ) {
  3171. var length = this.length();
  3172. return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
  3173. },
  3174. floor: function () {
  3175. this.x = Math.floor( this.x );
  3176. this.y = Math.floor( this.y );
  3177. this.z = Math.floor( this.z );
  3178. this.w = Math.floor( this.w );
  3179. return this;
  3180. },
  3181. ceil: function () {
  3182. this.x = Math.ceil( this.x );
  3183. this.y = Math.ceil( this.y );
  3184. this.z = Math.ceil( this.z );
  3185. this.w = Math.ceil( this.w );
  3186. return this;
  3187. },
  3188. round: function () {
  3189. this.x = Math.round( this.x );
  3190. this.y = Math.round( this.y );
  3191. this.z = Math.round( this.z );
  3192. this.w = Math.round( this.w );
  3193. return this;
  3194. },
  3195. roundToZero: function () {
  3196. this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
  3197. this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
  3198. this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
  3199. this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );
  3200. return this;
  3201. },
  3202. negate: function () {
  3203. this.x = - this.x;
  3204. this.y = - this.y;
  3205. this.z = - this.z;
  3206. this.w = - this.w;
  3207. return this;
  3208. },
  3209. dot: function ( v ) {
  3210. return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
  3211. },
  3212. lengthSq: function () {
  3213. return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
  3214. },
  3215. length: function () {
  3216. return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );
  3217. },
  3218. manhattanLength: function () {
  3219. return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );
  3220. },
  3221. normalize: function () {
  3222. return this.divideScalar( this.length() || 1 );
  3223. },
  3224. setLength: function ( length ) {
  3225. return this.normalize().multiplyScalar( length );
  3226. },
  3227. lerp: function ( v, alpha ) {
  3228. this.x += ( v.x - this.x ) * alpha;
  3229. this.y += ( v.y - this.y ) * alpha;
  3230. this.z += ( v.z - this.z ) * alpha;
  3231. this.w += ( v.w - this.w ) * alpha;
  3232. return this;
  3233. },
  3234. lerpVectors: function ( v1, v2, alpha ) {
  3235. return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
  3236. },
  3237. equals: function ( v ) {
  3238. return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );
  3239. },
  3240. fromArray: function ( array, offset ) {
  3241. if ( offset === undefined ) offset = 0;
  3242. this.x = array[ offset ];
  3243. this.y = array[ offset + 1 ];
  3244. this.z = array[ offset + 2 ];
  3245. this.w = array[ offset + 3 ];
  3246. return this;
  3247. },
  3248. toArray: function ( array, offset ) {
  3249. if ( array === undefined ) array = [];
  3250. if ( offset === undefined ) offset = 0;
  3251. array[ offset ] = this.x;
  3252. array[ offset + 1 ] = this.y;
  3253. array[ offset + 2 ] = this.z;
  3254. array[ offset + 3 ] = this.w;
  3255. return array;
  3256. },
  3257. fromBufferAttribute: function ( attribute, index, offset ) {
  3258. if ( offset !== undefined ) {
  3259. console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );
  3260. }
  3261. this.x = attribute.getX( index );
  3262. this.y = attribute.getY( index );
  3263. this.z = attribute.getZ( index );
  3264. this.w = attribute.getW( index );
  3265. return this;
  3266. }
  3267. } );
  3268. /**
  3269. * @author szimek / https://github.com/szimek/
  3270. * @author alteredq / http://alteredqualia.com/
  3271. * @author Marius Kintel / https://github.com/kintel
  3272. */
  3273. /*
  3274. In options, we can specify:
  3275. * Texture parameters for an auto-generated target texture
  3276. * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers
  3277. */
  3278. function WebGLRenderTarget( width, height, options ) {
  3279. this.width = width;
  3280. this.height = height;
  3281. this.scissor = new Vector4( 0, 0, width, height );
  3282. this.scissorTest = false;
  3283. this.viewport = new Vector4( 0, 0, width, height );
  3284. options = options || {};
  3285. if ( options.minFilter === undefined ) options.minFilter = LinearFilter;
  3286. this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );
  3287. this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : true;
  3288. this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;
  3289. this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;
  3290. this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;
  3291. }
  3292. WebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
  3293. constructor: WebGLRenderTarget,
  3294. isWebGLRenderTarget: true,
  3295. setSize: function ( width, height ) {
  3296. if ( this.width !== width || this.height !== height ) {
  3297. this.width = width;
  3298. this.height = height;
  3299. this.dispose();
  3300. }
  3301. this.viewport.set( 0, 0, width, height );
  3302. this.scissor.set( 0, 0, width, height );
  3303. },
  3304. clone: function () {
  3305. return new this.constructor().copy( this );
  3306. },
  3307. copy: function ( source ) {
  3308. this.width = source.width;
  3309. this.height = source.height;
  3310. this.viewport.copy( source.viewport );
  3311. this.texture = source.texture.clone();
  3312. this.depthBuffer = source.depthBuffer;
  3313. this.stencilBuffer = source.stencilBuffer;
  3314. this.depthTexture = source.depthTexture;
  3315. return this;
  3316. },
  3317. dispose: function () {
  3318. this.dispatchEvent( { type: 'dispose' } );
  3319. }
  3320. } );
  3321. /**
  3322. * @author alteredq / http://alteredqualia.com
  3323. */
  3324. function WebGLRenderTargetCube( width, height, options ) {
  3325. WebGLRenderTarget.call( this, width, height, options );
  3326. this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5
  3327. this.activeMipMapLevel = 0;
  3328. }
  3329. WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );
  3330. WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;
  3331. WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;
  3332. /**
  3333. * @author alteredq / http://alteredqualia.com/
  3334. */
  3335. function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {
  3336. Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );
  3337. this.image = { data: data, width: width, height: height };
  3338. this.magFilter = magFilter !== undefined ? magFilter : NearestFilter;
  3339. this.minFilter = minFilter !== undefined ? minFilter : NearestFilter;
  3340. this.generateMipmaps = false;
  3341. this.flipY = false;
  3342. this.unpackAlignment = 1;
  3343. }
  3344. DataTexture.prototype = Object.create( Texture.prototype );
  3345. DataTexture.prototype.constructor = DataTexture;
  3346. DataTexture.prototype.isDataTexture = true;
  3347. /**
  3348. * @author bhouston / http://clara.io
  3349. * @author WestLangley / http://github.com/WestLangley
  3350. */
  3351. function Box3( min, max ) {
  3352. this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );
  3353. this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );
  3354. }
  3355. Object.assign( Box3.prototype, {
  3356. isBox3: true,
  3357. set: function ( min, max ) {
  3358. this.min.copy( min );
  3359. this.max.copy( max );
  3360. return this;
  3361. },
  3362. setFromArray: function ( array ) {
  3363. var minX = + Infinity;
  3364. var minY = + Infinity;
  3365. var minZ = + Infinity;
  3366. var maxX = - Infinity;
  3367. var maxY = - Infinity;
  3368. var maxZ = - Infinity;
  3369. for ( var i = 0, l = array.length; i < l; i += 3 ) {
  3370. var x = array[ i ];
  3371. var y = array[ i + 1 ];
  3372. var z = array[ i + 2 ];
  3373. if ( x < minX ) minX = x;
  3374. if ( y < minY ) minY = y;
  3375. if ( z < minZ ) minZ = z;
  3376. if ( x > maxX ) maxX = x;
  3377. if ( y > maxY ) maxY = y;
  3378. if ( z > maxZ ) maxZ = z;
  3379. }
  3380. this.min.set( minX, minY, minZ );
  3381. this.max.set( maxX, maxY, maxZ );
  3382. return this;
  3383. },
  3384. setFromBufferAttribute: function ( attribute ) {
  3385. var minX = + Infinity;
  3386. var minY = + Infinity;
  3387. var minZ = + Infinity;
  3388. var maxX = - Infinity;
  3389. var maxY = - Infinity;
  3390. var maxZ = - Infinity;
  3391. for ( var i = 0, l = attribute.count; i < l; i ++ ) {
  3392. var x = attribute.getX( i );
  3393. var y = attribute.getY( i );
  3394. var z = attribute.getZ( i );
  3395. if ( x < minX ) minX = x;
  3396. if ( y < minY ) minY = y;
  3397. if ( z < minZ ) minZ = z;
  3398. if ( x > maxX ) maxX = x;
  3399. if ( y > maxY ) maxY = y;
  3400. if ( z > maxZ ) maxZ = z;
  3401. }
  3402. this.min.set( minX, minY, minZ );
  3403. this.max.set( maxX, maxY, maxZ );
  3404. return this;
  3405. },
  3406. setFromPoints: function ( points ) {
  3407. this.makeEmpty();
  3408. for ( var i = 0, il = points.length; i < il; i ++ ) {
  3409. this.expandByPoint( points[ i ] );
  3410. }
  3411. return this;
  3412. },
  3413. setFromCenterAndSize: function () {
  3414. var v1 = new Vector3();
  3415. return function setFromCenterAndSize( center, size ) {
  3416. var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
  3417. this.min.copy( center ).sub( halfSize );
  3418. this.max.copy( center ).add( halfSize );
  3419. return this;
  3420. };
  3421. }(),
  3422. setFromObject: function ( object ) {
  3423. this.makeEmpty();
  3424. return this.expandByObject( object );
  3425. },
  3426. clone: function () {
  3427. return new this.constructor().copy( this );
  3428. },
  3429. copy: function ( box ) {
  3430. this.min.copy( box.min );
  3431. this.max.copy( box.max );
  3432. return this;
  3433. },
  3434. makeEmpty: function () {
  3435. this.min.x = this.min.y = this.min.z = + Infinity;
  3436. this.max.x = this.max.y = this.max.z = - Infinity;
  3437. return this;
  3438. },
  3439. isEmpty: function () {
  3440. // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
  3441. return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );
  3442. },
  3443. getCenter: function ( target ) {
  3444. if ( target === undefined ) {
  3445. console.warn( 'THREE.Box3: .getCenter() target is now required' );
  3446. target = new Vector3();
  3447. }
  3448. return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
  3449. },
  3450. getSize: function ( target ) {
  3451. if ( target === undefined ) {
  3452. console.warn( 'THREE.Box3: .getSize() target is now required' );
  3453. target = new Vector3();
  3454. }
  3455. return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );
  3456. },
  3457. expandByPoint: function ( point ) {
  3458. this.min.min( point );
  3459. this.max.max( point );
  3460. return this;
  3461. },
  3462. expandByVector: function ( vector ) {
  3463. this.min.sub( vector );
  3464. this.max.add( vector );
  3465. return this;
  3466. },
  3467. expandByScalar: function ( scalar ) {
  3468. this.min.addScalar( - scalar );
  3469. this.max.addScalar( scalar );
  3470. return this;
  3471. },
  3472. expandByObject: function () {
  3473. // Computes the world-axis-aligned bounding box of an object (including its children),
  3474. // accounting for both the object's, and children's, world transforms
  3475. var scope, i, l;
  3476. var v1 = new Vector3();
  3477. function traverse( node ) {
  3478. var geometry = node.geometry;
  3479. if ( geometry !== undefined ) {
  3480. if ( geometry.isGeometry ) {
  3481. var vertices = geometry.vertices;
  3482. for ( i = 0, l = vertices.length; i < l; i ++ ) {
  3483. v1.copy( vertices[ i ] );
  3484. v1.applyMatrix4( node.matrixWorld );
  3485. scope.expandByPoint( v1 );
  3486. }
  3487. } else if ( geometry.isBufferGeometry ) {
  3488. var attribute = geometry.attributes.position;
  3489. if ( attribute !== undefined ) {
  3490. for ( i = 0, l = attribute.count; i < l; i ++ ) {
  3491. v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );
  3492. scope.expandByPoint( v1 );
  3493. }
  3494. }
  3495. }
  3496. }
  3497. }
  3498. return function expandByObject( object ) {
  3499. scope = this;
  3500. object.updateMatrixWorld( true );
  3501. object.traverse( traverse );
  3502. return this;
  3503. };
  3504. }(),
  3505. containsPoint: function ( point ) {
  3506. return point.x < this.min.x || point.x > this.max.x ||
  3507. point.y < this.min.y || point.y > this.max.y ||
  3508. point.z < this.min.z || point.z > this.max.z ? false : true;
  3509. },
  3510. containsBox: function ( box ) {
  3511. return this.min.x <= box.min.x && box.max.x <= this.max.x &&
  3512. this.min.y <= box.min.y && box.max.y <= this.max.y &&
  3513. this.min.z <= box.min.z && box.max.z <= this.max.z;
  3514. },
  3515. getParameter: function ( point, target ) {
  3516. // This can potentially have a divide by zero if the box
  3517. // has a size dimension of 0.
  3518. if ( target === undefined ) {
  3519. console.warn( 'THREE.Box3: .getParameter() target is now required' );
  3520. target = new Vector3();
  3521. }
  3522. return target.set(
  3523. ( point.x - this.min.x ) / ( this.max.x - this.min.x ),
  3524. ( point.y - this.min.y ) / ( this.max.y - this.min.y ),
  3525. ( point.z - this.min.z ) / ( this.max.z - this.min.z )
  3526. );
  3527. },
  3528. intersectsBox: function ( box ) {
  3529. // using 6 splitting planes to rule out intersections.
  3530. return box.max.x < this.min.x || box.min.x > this.max.x ||
  3531. box.max.y < this.min.y || box.min.y > this.max.y ||
  3532. box.max.z < this.min.z || box.min.z > this.max.z ? false : true;
  3533. },
  3534. intersectsSphere: ( function () {
  3535. var closestPoint = new Vector3();
  3536. return function intersectsSphere( sphere ) {
  3537. // Find the point on the AABB closest to the sphere center.
  3538. this.clampPoint( sphere.center, closestPoint );
  3539. // If that point is inside the sphere, the AABB and sphere intersect.
  3540. return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );
  3541. };
  3542. } )(),
  3543. intersectsPlane: function ( plane ) {
  3544. // We compute the minimum and maximum dot product values. If those values
  3545. // are on the same side (back or front) of the plane, then there is no intersection.
  3546. var min, max;
  3547. if ( plane.normal.x > 0 ) {
  3548. min = plane.normal.x * this.min.x;
  3549. max = plane.normal.x * this.max.x;
  3550. } else {
  3551. min = plane.normal.x * this.max.x;
  3552. max = plane.normal.x * this.min.x;
  3553. }
  3554. if ( plane.normal.y > 0 ) {
  3555. min += plane.normal.y * this.min.y;
  3556. max += plane.normal.y * this.max.y;
  3557. } else {
  3558. min += plane.normal.y * this.max.y;
  3559. max += plane.normal.y * this.min.y;
  3560. }
  3561. if ( plane.normal.z > 0 ) {
  3562. min += plane.normal.z * this.min.z;
  3563. max += plane.normal.z * this.max.z;
  3564. } else {
  3565. min += plane.normal.z * this.max.z;
  3566. max += plane.normal.z * this.min.z;
  3567. }
  3568. return ( min <= plane.constant && max >= plane.constant );
  3569. },
  3570. intersectsTriangle: ( function () {
  3571. // triangle centered vertices
  3572. var v0 = new Vector3();
  3573. var v1 = new Vector3();
  3574. var v2 = new Vector3();
  3575. // triangle edge vectors
  3576. var f0 = new Vector3();
  3577. var f1 = new Vector3();
  3578. var f2 = new Vector3();
  3579. var testAxis = new Vector3();
  3580. var center = new Vector3();
  3581. var extents = new Vector3();
  3582. var triangleNormal = new Vector3();
  3583. function satForAxes( axes ) {
  3584. var i, j;
  3585. for ( i = 0, j = axes.length - 3; i <= j; i += 3 ) {
  3586. testAxis.fromArray( axes, i );
  3587. // project the aabb onto the seperating axis
  3588. var r = extents.x * Math.abs( testAxis.x ) + extents.y * Math.abs( testAxis.y ) + extents.z * Math.abs( testAxis.z );
  3589. // project all 3 vertices of the triangle onto the seperating axis
  3590. var p0 = v0.dot( testAxis );
  3591. var p1 = v1.dot( testAxis );
  3592. var p2 = v2.dot( testAxis );
  3593. // actual test, basically see if either of the most extreme of the triangle points intersects r
  3594. if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {
  3595. // points of the projected triangle are outside the projected half-length of the aabb
  3596. // the axis is seperating and we can exit
  3597. return false;
  3598. }
  3599. }
  3600. return true;
  3601. }
  3602. return function intersectsTriangle( triangle ) {
  3603. if ( this.isEmpty() ) {
  3604. return false;
  3605. }
  3606. // compute box center and extents
  3607. this.getCenter( center );
  3608. extents.subVectors( this.max, center );
  3609. // translate triangle to aabb origin
  3610. v0.subVectors( triangle.a, center );
  3611. v1.subVectors( triangle.b, center );
  3612. v2.subVectors( triangle.c, center );
  3613. // compute edge vectors for triangle
  3614. f0.subVectors( v1, v0 );
  3615. f1.subVectors( v2, v1 );
  3616. f2.subVectors( v0, v2 );
  3617. // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb
  3618. // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation
  3619. // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)
  3620. var axes = [
  3621. 0, - f0.z, f0.y, 0, - f1.z, f1.y, 0, - f2.z, f2.y,
  3622. f0.z, 0, - f0.x, f1.z, 0, - f1.x, f2.z, 0, - f2.x,
  3623. - f0.y, f0.x, 0, - f1.y, f1.x, 0, - f2.y, f2.x, 0
  3624. ];
  3625. if ( ! satForAxes( axes ) ) {
  3626. return false;
  3627. }
  3628. // test 3 face normals from the aabb
  3629. axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];
  3630. if ( ! satForAxes( axes ) ) {
  3631. return false;
  3632. }
  3633. // finally testing the face normal of the triangle
  3634. // use already existing triangle edge vectors here
  3635. triangleNormal.crossVectors( f0, f1 );
  3636. axes = [ triangleNormal.x, triangleNormal.y, triangleNormal.z ];
  3637. return satForAxes( axes );
  3638. };
  3639. } )(),
  3640. clampPoint: function ( point, target ) {
  3641. if ( target === undefined ) {
  3642. console.warn( 'THREE.Box3: .clampPoint() target is now required' );
  3643. target = new Vector3();
  3644. }
  3645. return target.copy( point ).clamp( this.min, this.max );
  3646. },
  3647. distanceToPoint: function () {
  3648. var v1 = new Vector3();
  3649. return function distanceToPoint( point ) {
  3650. var clampedPoint = v1.copy( point ).clamp( this.min, this.max );
  3651. return clampedPoint.sub( point ).length();
  3652. };
  3653. }(),
  3654. getBoundingSphere: function () {
  3655. var v1 = new Vector3();
  3656. return function getBoundingSphere( target ) {
  3657. if ( target === undefined ) {
  3658. console.warn( 'THREE.Box3: .getBoundingSphere() target is now required' );
  3659. target = new Sphere();
  3660. }
  3661. this.getCenter( target.center );
  3662. target.radius = this.getSize( v1 ).length() * 0.5;
  3663. return target;
  3664. };
  3665. }(),
  3666. intersect: function ( box ) {
  3667. this.min.max( box.min );
  3668. this.max.min( box.max );
  3669. // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.
  3670. if ( this.isEmpty() ) this.makeEmpty();
  3671. return this;
  3672. },
  3673. union: function ( box ) {
  3674. this.min.min( box.min );
  3675. this.max.max( box.max );
  3676. return this;
  3677. },
  3678. applyMatrix4: function ( matrix ) {
  3679. // transform of empty box is an empty box.
  3680. if ( this.isEmpty( ) ) return this;
  3681. var m = matrix.elements;
  3682. var xax = m[ 0 ] * this.min.x, xay = m[ 1 ] * this.min.x, xaz = m[ 2 ] * this.min.x;
  3683. var xbx = m[ 0 ] * this.max.x, xby = m[ 1 ] * this.max.x, xbz = m[ 2 ] * this.max.x;
  3684. var yax = m[ 4 ] * this.min.y, yay = m[ 5 ] * this.min.y, yaz = m[ 6 ] * this.min.y;
  3685. var ybx = m[ 4 ] * this.max.y, yby = m[ 5 ] * this.max.y, ybz = m[ 6 ] * this.max.y;
  3686. var zax = m[ 8 ] * this.min.z, zay = m[ 9 ] * this.min.z, zaz = m[ 10 ] * this.min.z;
  3687. var zbx = m[ 8 ] * this.max.z, zby = m[ 9 ] * this.max.z, zbz = m[ 10 ] * this.max.z;
  3688. this.min.x = Math.min( xax, xbx ) + Math.min( yax, ybx ) + Math.min( zax, zbx ) + m[ 12 ];
  3689. this.min.y = Math.min( xay, xby ) + Math.min( yay, yby ) + Math.min( zay, zby ) + m[ 13 ];
  3690. this.min.z = Math.min( xaz, xbz ) + Math.min( yaz, ybz ) + Math.min( zaz, zbz ) + m[ 14 ];
  3691. this.max.x = Math.max( xax, xbx ) + Math.max( yax, ybx ) + Math.max( zax, zbx ) + m[ 12 ];
  3692. this.max.y = Math.max( xay, xby ) + Math.max( yay, yby ) + Math.max( zay, zby ) + m[ 13 ];
  3693. this.max.z = Math.max( xaz, xbz ) + Math.max( yaz, ybz ) + Math.max( zaz, zbz ) + m[ 14 ];
  3694. return this;
  3695. },
  3696. translate: function ( offset ) {
  3697. this.min.add( offset );
  3698. this.max.add( offset );
  3699. return this;
  3700. },
  3701. equals: function ( box ) {
  3702. return box.min.equals( this.min ) && box.max.equals( this.max );
  3703. }
  3704. } );
  3705. /**
  3706. * @author bhouston / http://clara.io
  3707. * @author mrdoob / http://mrdoob.com/
  3708. */
  3709. function Sphere( center, radius ) {
  3710. this.center = ( center !== undefined ) ? center : new Vector3();
  3711. this.radius = ( radius !== undefined ) ? radius : 0;
  3712. }
  3713. Object.assign( Sphere.prototype, {
  3714. set: function ( center, radius ) {
  3715. this.center.copy( center );
  3716. this.radius = radius;
  3717. return this;
  3718. },
  3719. setFromPoints: function () {
  3720. var box = new Box3();
  3721. return function setFromPoints( points, optionalCenter ) {
  3722. var center = this.center;
  3723. if ( optionalCenter !== undefined ) {
  3724. center.copy( optionalCenter );
  3725. } else {
  3726. box.setFromPoints( points ).getCenter( center );
  3727. }
  3728. var maxRadiusSq = 0;
  3729. for ( var i = 0, il = points.length; i < il; i ++ ) {
  3730. maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );
  3731. }
  3732. this.radius = Math.sqrt( maxRadiusSq );
  3733. return this;
  3734. };
  3735. }(),
  3736. clone: function () {
  3737. return new this.constructor().copy( this );
  3738. },
  3739. copy: function ( sphere ) {
  3740. this.center.copy( sphere.center );
  3741. this.radius = sphere.radius;
  3742. return this;
  3743. },
  3744. empty: function () {
  3745. return ( this.radius <= 0 );
  3746. },
  3747. containsPoint: function ( point ) {
  3748. return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );
  3749. },
  3750. distanceToPoint: function ( point ) {
  3751. return ( point.distanceTo( this.center ) - this.radius );
  3752. },
  3753. intersectsSphere: function ( sphere ) {
  3754. var radiusSum = this.radius + sphere.radius;
  3755. return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );
  3756. },
  3757. intersectsBox: function ( box ) {
  3758. return box.intersectsSphere( this );
  3759. },
  3760. intersectsPlane: function ( plane ) {
  3761. return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;
  3762. },
  3763. clampPoint: function ( point, target ) {
  3764. var deltaLengthSq = this.center.distanceToSquared( point );
  3765. if ( target === undefined ) {
  3766. console.warn( 'THREE.Sphere: .clampPoint() target is now required' );
  3767. target = new Vector3();
  3768. }
  3769. target.copy( point );
  3770. if ( deltaLengthSq > ( this.radius * this.radius ) ) {
  3771. target.sub( this.center ).normalize();
  3772. target.multiplyScalar( this.radius ).add( this.center );
  3773. }
  3774. return target;
  3775. },
  3776. getBoundingBox: function ( target ) {
  3777. if ( target === undefined ) {
  3778. console.warn( 'THREE.Sphere: .getBoundingBox() target is now required' );
  3779. target = new Box3();
  3780. }
  3781. target.set( this.center, this.center );
  3782. target.expandByScalar( this.radius );
  3783. return target;
  3784. },
  3785. applyMatrix4: function ( matrix ) {
  3786. this.center.applyMatrix4( matrix );
  3787. this.radius = this.radius * matrix.getMaxScaleOnAxis();
  3788. return this;
  3789. },
  3790. translate: function ( offset ) {
  3791. this.center.add( offset );
  3792. return this;
  3793. },
  3794. equals: function ( sphere ) {
  3795. return sphere.center.equals( this.center ) && ( sphere.radius === this.radius );
  3796. }
  3797. } );
  3798. /**
  3799. * @author bhouston / http://clara.io
  3800. */
  3801. function Plane( normal, constant ) {
  3802. // normal is assumed to be normalized
  3803. this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );
  3804. this.constant = ( constant !== undefined ) ? constant : 0;
  3805. }
  3806. Object.assign( Plane.prototype, {
  3807. set: function ( normal, constant ) {
  3808. this.normal.copy( normal );
  3809. this.constant = constant;
  3810. return this;
  3811. },
  3812. setComponents: function ( x, y, z, w ) {
  3813. this.normal.set( x, y, z );
  3814. this.constant = w;
  3815. return this;
  3816. },
  3817. setFromNormalAndCoplanarPoint: function ( normal, point ) {
  3818. this.normal.copy( normal );
  3819. this.constant = - point.dot( this.normal );
  3820. return this;
  3821. },
  3822. setFromCoplanarPoints: function () {
  3823. var v1 = new Vector3();
  3824. var v2 = new Vector3();
  3825. return function setFromCoplanarPoints( a, b, c ) {
  3826. var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();
  3827. // Q: should an error be thrown if normal is zero (e.g. degenerate plane)?
  3828. this.setFromNormalAndCoplanarPoint( normal, a );
  3829. return this;
  3830. };
  3831. }(),
  3832. clone: function () {
  3833. return new this.constructor().copy( this );
  3834. },
  3835. copy: function ( plane ) {
  3836. this.normal.copy( plane.normal );
  3837. this.constant = plane.constant;
  3838. return this;
  3839. },
  3840. normalize: function () {
  3841. // Note: will lead to a divide by zero if the plane is invalid.
  3842. var inverseNormalLength = 1.0 / this.normal.length();
  3843. this.normal.multiplyScalar( inverseNormalLength );
  3844. this.constant *= inverseNormalLength;
  3845. return this;
  3846. },
  3847. negate: function () {
  3848. this.constant *= - 1;
  3849. this.normal.negate();
  3850. return this;
  3851. },
  3852. distanceToPoint: function ( point ) {
  3853. return this.normal.dot( point ) + this.constant;
  3854. },
  3855. distanceToSphere: function ( sphere ) {
  3856. return this.distanceToPoint( sphere.center ) - sphere.radius;
  3857. },
  3858. projectPoint: function ( point, target ) {
  3859. if ( target === undefined ) {
  3860. console.warn( 'THREE.Plane: .projectPoint() target is now required' );
  3861. target = new Vector3();
  3862. }
  3863. return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );
  3864. },
  3865. intersectLine: function () {
  3866. var v1 = new Vector3();
  3867. return function intersectLine( line, target ) {
  3868. if ( target === undefined ) {
  3869. console.warn( 'THREE.Plane: .intersectLine() target is now required' );
  3870. target = new Vector3();
  3871. }
  3872. var direction = line.delta( v1 );
  3873. var denominator = this.normal.dot( direction );
  3874. if ( denominator === 0 ) {
  3875. // line is coplanar, return origin
  3876. if ( this.distanceToPoint( line.start ) === 0 ) {
  3877. return target.copy( line.start );
  3878. }
  3879. // Unsure if this is the correct method to handle this case.
  3880. return undefined;
  3881. }
  3882. var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;
  3883. if ( t < 0 || t > 1 ) {
  3884. return undefined;
  3885. }
  3886. return target.copy( direction ).multiplyScalar( t ).add( line.start );
  3887. };
  3888. }(),
  3889. intersectsLine: function ( line ) {
  3890. // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.
  3891. var startSign = this.distanceToPoint( line.start );
  3892. var endSign = this.distanceToPoint( line.end );
  3893. return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );
  3894. },
  3895. intersectsBox: function ( box ) {
  3896. return box.intersectsPlane( this );
  3897. },
  3898. intersectsSphere: function ( sphere ) {
  3899. return sphere.intersectsPlane( this );
  3900. },
  3901. coplanarPoint: function ( target ) {
  3902. if ( target === undefined ) {
  3903. console.warn( 'THREE.Plane: .coplanarPoint() target is now required' );
  3904. target = new Vector3();
  3905. }
  3906. return target.copy( this.normal ).multiplyScalar( - this.constant );
  3907. },
  3908. applyMatrix4: function () {
  3909. var v1 = new Vector3();
  3910. var m1 = new Matrix3();
  3911. return function applyMatrix4( matrix, optionalNormalMatrix ) {
  3912. var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );
  3913. var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );
  3914. var normal = this.normal.applyMatrix3( normalMatrix ).normalize();
  3915. this.constant = - referencePoint.dot( normal );
  3916. return this;
  3917. };
  3918. }(),
  3919. translate: function ( offset ) {
  3920. this.constant -= offset.dot( this.normal );
  3921. return this;
  3922. },
  3923. equals: function ( plane ) {
  3924. return plane.normal.equals( this.normal ) && ( plane.constant === this.constant );
  3925. }
  3926. } );
  3927. /**
  3928. * @author mrdoob / http://mrdoob.com/
  3929. * @author alteredq / http://alteredqualia.com/
  3930. * @author bhouston / http://clara.io
  3931. */
  3932. function Frustum( p0, p1, p2, p3, p4, p5 ) {
  3933. this.planes = [
  3934. ( p0 !== undefined ) ? p0 : new Plane(),
  3935. ( p1 !== undefined ) ? p1 : new Plane(),
  3936. ( p2 !== undefined ) ? p2 : new Plane(),
  3937. ( p3 !== undefined ) ? p3 : new Plane(),
  3938. ( p4 !== undefined ) ? p4 : new Plane(),
  3939. ( p5 !== undefined ) ? p5 : new Plane()
  3940. ];
  3941. }
  3942. Object.assign( Frustum.prototype, {
  3943. set: function ( p0, p1, p2, p3, p4, p5 ) {
  3944. var planes = this.planes;
  3945. planes[ 0 ].copy( p0 );
  3946. planes[ 1 ].copy( p1 );
  3947. planes[ 2 ].copy( p2 );
  3948. planes[ 3 ].copy( p3 );
  3949. planes[ 4 ].copy( p4 );
  3950. planes[ 5 ].copy( p5 );
  3951. return this;
  3952. },
  3953. clone: function () {
  3954. return new this.constructor().copy( this );
  3955. },
  3956. copy: function ( frustum ) {
  3957. var planes = this.planes;
  3958. for ( var i = 0; i < 6; i ++ ) {
  3959. planes[ i ].copy( frustum.planes[ i ] );
  3960. }
  3961. return this;
  3962. },
  3963. setFromMatrix: function ( m ) {
  3964. var planes = this.planes;
  3965. var me = m.elements;
  3966. var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];
  3967. var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];
  3968. var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];
  3969. var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];
  3970. planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();
  3971. planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
  3972. planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
  3973. planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
  3974. planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
  3975. planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();
  3976. return this;
  3977. },
  3978. intersectsObject: function () {
  3979. var sphere = new Sphere();
  3980. return function intersectsObject( object ) {
  3981. var geometry = object.geometry;
  3982. if ( geometry.boundingSphere === null )
  3983. geometry.computeBoundingSphere();
  3984. sphere.copy( geometry.boundingSphere )
  3985. .applyMatrix4( object.matrixWorld );
  3986. return this.intersectsSphere( sphere );
  3987. };
  3988. }(),
  3989. intersectsSprite: function () {
  3990. var sphere = new Sphere();
  3991. return function intersectsSprite( sprite ) {
  3992. sphere.center.set( 0, 0, 0 );
  3993. sphere.radius = 0.7071067811865476;
  3994. sphere.applyMatrix4( sprite.matrixWorld );
  3995. return this.intersectsSphere( sphere );
  3996. };
  3997. }(),
  3998. intersectsSphere: function ( sphere ) {
  3999. var planes = this.planes;
  4000. var center = sphere.center;
  4001. var negRadius = - sphere.radius;
  4002. for ( var i = 0; i < 6; i ++ ) {
  4003. var distance = planes[ i ].distanceToPoint( center );
  4004. if ( distance < negRadius ) {
  4005. return false;
  4006. }
  4007. }
  4008. return true;
  4009. },
  4010. intersectsBox: function () {
  4011. var p = new Vector3();
  4012. return function intersectsBox( box ) {
  4013. var planes = this.planes;
  4014. for ( var i = 0; i < 6; i ++ ) {
  4015. var plane = planes[ i ];
  4016. // corner at max distance
  4017. p.x = plane.normal.x > 0 ? box.max.x : box.min.x;
  4018. p.y = plane.normal.y > 0 ? box.max.y : box.min.y;
  4019. p.z = plane.normal.z > 0 ? box.max.z : box.min.z;
  4020. if ( plane.distanceToPoint( p ) < 0 ) {
  4021. return false;
  4022. }
  4023. }
  4024. return true;
  4025. };
  4026. }(),
  4027. containsPoint: function ( point ) {
  4028. var planes = this.planes;
  4029. for ( var i = 0; i < 6; i ++ ) {
  4030. if ( planes[ i ].distanceToPoint( point ) < 0 ) {
  4031. return false;
  4032. }
  4033. }
  4034. return true;
  4035. }
  4036. } );
  4037. var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n";
  4038. var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n";
  4039. var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n";
  4040. var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n";
  4041. var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif";
  4042. var begin_vertex = "\nvec3 transformed = vec3( position );\n";
  4043. var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n";
  4044. var bsdfs = "float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n";
  4045. var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n";
  4046. var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif\n";
  4047. var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n";
  4048. var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n";
  4049. var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n";
  4050. var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif";
  4051. var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n";
  4052. var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif";
  4053. var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif";
  4054. var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n";
  4055. var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV( sampler2D envMap, vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n";
  4056. var defaultnormal_vertex = "vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n";
  4057. var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n";
  4058. var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n";
  4059. var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n";
  4060. var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n";
  4061. var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n";
  4062. var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n";
  4063. var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n";
  4064. var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n";
  4065. var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n";
  4066. var envmap_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n";
  4067. var fog_vertex = "\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif";
  4068. var fog_pars_vertex = "#ifdef USE_FOG\n varying float fogDepth;\n#endif\n";
  4069. var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n";
  4070. var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n";
  4071. var gradientmap_pars_fragment = "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n";
  4072. var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n";
  4073. var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif";
  4074. var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n";
  4075. var lights_pars_begin = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n";
  4076. var envmap_physical_pars_fragment = "#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent ));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n";
  4077. var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n";
  4078. var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n";
  4079. var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n";
  4080. var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n";
  4081. var lights_fragment_begin = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n";
  4082. var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n";
  4083. var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n";
  4084. var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif";
  4085. var logdepthbuf_pars_fragment = "#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n";
  4086. var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif";
  4087. var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n";
  4088. var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n";
  4089. var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n";
  4090. var map_particle_fragment = "#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n";
  4091. var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n";
  4092. var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n";
  4093. var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif";
  4094. var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n";
  4095. var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif";
  4096. var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n";
  4097. var normal_fragment_begin = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n";
  4098. var normal_fragment_maps = "#ifdef USE_NORMALMAP\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t#ifdef FLIP_SIDED\n\t\t\tnormal = - normal;\n\t\t#endif\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\tnormal = normalize( normalMatrix * normal );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n";
  4099. var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tuniform mat3 normalMatrix;\n\t#else\n\t\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\t\tvec2 st0 = dFdx( vUv.st );\n\t\t\tvec2 st1 = dFdy( vUv.st );\n\t\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\t\tvec3 N = normalize( surf_norm );\n\t\t\tmat3 tsn = mat3( S, T, N );\n\t\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t\tmapN.xy *= normalScale;\n\t\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\treturn normalize( tsn * mapN );\n\t\t}\n\t#endif\n#endif\n";
  4100. var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n";
  4101. var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n";
  4102. var project_vertex = "vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n";
  4103. var dithering_fragment = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n";
  4104. var dithering_pars_fragment = "#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n";
  4105. var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n";
  4106. var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif";
  4107. var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n";
  4108. var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n";
  4109. var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n";
  4110. var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n";
  4111. var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif";
  4112. var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n";
  4113. var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n";
  4114. var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n";
  4115. var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif";
  4116. var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif";
  4117. var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n";
  4118. var tonemapping_pars_fragment = "#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n";
  4119. var uv_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif";
  4120. var uv_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n";
  4121. var uv_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif";
  4122. var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif";
  4123. var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif";
  4124. var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif";
  4125. var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n";
  4126. var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n";
  4127. var cube_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n";
  4128. var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n";
  4129. var depth_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n";
  4130. var distanceRGBA_frag = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n";
  4131. var distanceRGBA_vert = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}\n";
  4132. var equirect_frag = "uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n";
  4133. var equirect_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";
  4134. var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
  4135. var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n";
  4136. var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
  4137. var meshbasic_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n";
  4138. var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
  4139. var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
  4140. var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
  4141. var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
  4142. var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
  4143. var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
  4144. var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n";
  4145. var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n";
  4146. var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
  4147. var points_vert = "uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}\n";
  4148. var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}\n";
  4149. var shadow_vert = "#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
  4150. var sprite_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
  4151. var sprite_vert = "uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tvec4 mvPosition;\n\tmvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n";
  4152. var matdither = "float f(highp float I)\r\n{\r\n highp float G=0.5*fract(gl_FragCoord.x*0.5)+0.5*fract(gl_FragCoord.y*0.5);\r\n return 0.4+0.6*fract(G+3.141592e6*I);\r\n}\r\n ";
  4153. var matlighting = "vec3 eY(vec3 eZ,float fc){\r\n return exp(-0.5*fc/(eZ*eZ))/(eZ*2.5066283);\r\n}\r\n\r\nvec3 fd(vec3 eZ){\r\n return vec3(1.0,1.0,1.0)/(eZ*2.5066283);\r\n}\r\n\r\nvec3 fe(vec3 ff){\r\n return vec3(-0.5,-0.5,-0.5)/(ff);\r\n}\r\n\r\nvec3 fh(vec3 fi,float fc){\r\n return exp(fi*fc);\r\n}\r\n\r\n#define SAMPLE_COUNT 21.0\r\n#define SAMPLE_HALF 10.0\r\n#define GAUSS_SPREAD 0.05\r\n\r\nvec3 fj(float fk,float fl,vec3 fm){\r\n vec3 fn=vec3(fl,fl,fl);\r\n fn=0.8*fn+vec3(0.2);\r\n vec3 fo=cos(fn*3.14159);\r\n vec3 fu=cos(fn*3.14159*0.5);\r\n fu*=fu;\r\n fu*=fu;\r\n fu*=fu;\r\n fn=fn+0.05*fo*fu*fm;\r\n fu*=fu;fu*=fu;fu*=fu;\r\n fn=fn+0.1*fo*fu*fm;\r\n fn=saturate(fn);\r\n fn*=fn*1.2;\r\n return fn;\r\n}\r\n\r\nvec3 fv(vec3 fm){\r\n return vec3(1.0,1.0,1.0)/3.1415926;\r\n}\r\n \r\nfloat fA(float fk,float fm){\r\n return saturate(-fk*fm+fk+fm);\r\n}\r\n\r\nvec3 fB(float fk,vec3 fm){\r\n return saturate(-fk*fm+vec3(fk)+fm);\r\n}\r\n\r\nfloat fC(float fm){\r\n return-0.31830988618379*fm+0.31830988618379;\r\n}\r\n\r\nvec3 fD(vec3 fm){\r\n return-0.31830988618379*fm+vec3(0.31830988618379);\r\n}\r\n\r\nvec3 eT(vec3 dO,vec3 dI,vec3 dP,float fE){\r\n float C=1.0-saturate(dot(dO,dI));\r\n float fF=C*C;\r\n C*=fF*fF;\r\n C*=fE;\r\n return(dP-C*dP)+C*uFresnel;\r\n}\r\n\r\nvec2 fG(vec2 fH,vec2 fm){\r\n fH=1.0-fH;\r\n vec2 fI=fH*fH;\r\n fI*=fI;\r\n fH=mix(fI,fH*0.4,fm);\r\n return fH;\r\n}\r\n\r\nvec3 ej(vec3 fJ){\r\n #define c(n) uDiffuseCoefficients[n].xyz\r\n vec3 G=(c(0)+fJ.y*((c(1)+c(4)*fJ.x)+c(5)*fJ.z))+fJ.x*(c(3)+c(7)*fJ.z)+c(2)*fJ.z;\r\n #undef c\r\n vec3 sqr=fJ*fJ;\r\n G+=uDiffuseCoefficients[6].xyz*(3.0*sqr.z-1.0);\r\n G+=uDiffuseCoefficients[8].xyz*(sqr.x-sqr.y);\r\n return G;\r\n}\r\n\r\nvoid fK(inout vec3 fL,inout vec3 fM,inout vec3 fN,vec3 fJ){\r\n fL=uDiffuseCoefficients[0].xyz;\r\n fM=uDiffuseCoefficients[1].xyz*fJ.y;\r\n fM+=uDiffuseCoefficients[2].xyz*fJ.z;\r\n fM+=uDiffuseCoefficients[3].xyz*fJ.x;\r\n vec3 swz=fJ.yyz*fJ.xzx;\r\n fN=uDiffuseCoefficients[4].xyz*swz.x;\r\n fN+=uDiffuseCoefficients[5].xyz*swz.y;\r\n fN+=uDiffuseCoefficients[7].xyz*swz.z;\r\n vec3 sqr=fJ*fJ;\r\n fN+=uDiffuseCoefficients[6].xyz*(3.0*sqr.z-1.0);\r\n fN+=uDiffuseCoefficients[8].xyz*(sqr.x-sqr.y);\r\n}\r\n \r\nvec3 fO(vec3 fL,vec3 fM,vec3 fN,vec3 fP,float fm){\r\n fP=mix(vec3(1.0),fP,fm);return(fL+fM*fP.x)+fN*fP.z;\r\n}\r\n \r\nvec3 fQ(vec3 fL,vec3 fM,vec3 fN,vec3 fP,vec3 fR){\r\n vec3 fS=mix(vec3(1.0),fP.yyy,fR);\r\n vec3 fT=mix(vec3(1.0),fP.zzz,fR);\r\n return(fL+fM*fS)+fN*fT;\r\n}\r\n\r\nvec3 em(vec3 fJ,float dQ){\r\n fJ/=dot(vec3(1.0),abs(fJ));\r\n vec2 fU=abs(fJ.zx)-vec2(1.0,1.0);\r\n vec2 fV=vec2(fJ.x<0.0?fU.x:-fU.x,fJ.z<0.0?fU.y:-fU.y);\r\n vec2 fW=(fJ.y<0.0)?fV:fJ.xz;\r\n fW=vec2(0.5*(254.0/256.0),0.125*0.5*(254.0/256.0))*fW+vec2(0.5,0.125*0.5);\r\n float fX=fract(7.0*dQ);\r\n fW.y+=0.125*(7.0*dQ-fX);\r\n vec2 fY=fW+vec2(0.0,0.125);\r\n vec4 fZ=mix(texture2D(tSkySpecular,fW),texture2D(tSkySpecular,fY),fX);\r\n vec3 r=fZ.xyz*(7.0*fZ.w);\r\n return r*r;\r\n}\r\n\r\nfloat en(vec3 fJ,vec3 hc){\r\n float hd=dot(fJ,hc);\r\n hd=saturate(1.0+uHorizonOcclude*hd);\r\n return hd*hd;\r\n}\r\n ";
  4154. var matmicrofiber = "#ifdef MICROFIBER\r\n uniform vec4 uTexRangeFuzz;\r\n uniform vec4 uFresnelColor;\r\n uniform float uFresnelIntegral;\r\n uniform float uFresnelOcc;\r\n uniform float uFresnelGlossMask;\r\n struct ed{\r\n vec3 eh;\r\n vec3 eN;\r\n vec3 he;\r\n vec3 hf;\r\n vec3 hh;\r\n };\r\n\r\n void ef(out ed s,vec3 dI){\r\n s.eh=s.eN=ej(dI);\r\n s.he=vec3(0.0);\r\n s.hf=uFresnelColor.rgb;\r\n s.hh=uFresnelColor.aaa*vec3(1.0,0.5,0.25);\r\n #ifndef MICROFIBER_NO_FUZZ_TEX\r\n vec4 m=dM(d,uTexRangeFuzz);\r\n s.hf*=dG(m.rgb);\r\n #endif\r\n }\r\n \r\n void eM(inout ed s,float hi,vec3 eH,vec3 dI,vec3 eJ){\r\n float fk=dot(eH,dI);\r\n float eN=saturate((1.0/3.1415926)*fk);\r\n float hj=fA(fk,s.hh.z);\r\n #ifdef SHADOW_COUNT\r\n eN*=hi;float hk=mix(1.0,hi,uFresnelOcc);\r\n float he=hj*hk;\r\n #else \r\n float he=hj;\r\n #endif\r\n s.he=he*eJ+s.he;\r\n s.eN=eN*eJ+s.eN;\r\n }\r\n \r\n void eR(out vec3 ei,out vec3 diff_extra,inout ed s,vec3 dO,vec3 dI,float dQ){\r\n s.he*=uFresnelIntegral;\r\n float fH=dot(dO,dI);\r\n vec2 hl=fG(vec2(fH,fH),s.hh.xy);\r\n s.he=s.eh*hl.x+(s.he*hl.y);\r\n s.he*=s.hf;\r\n float hm=saturate(1.0+-uFresnelGlossMask*dQ);\r\n s.he*=hm*hm;\r\n ei=s.eN;\r\n diff_extra=s.he;\r\n }\r\n#endif\r\n ";
  4155. var matsampling = "vec3 dG(vec3 c){\r\n return c*c;\r\n}\r\n\r\nvec3 dJ(vec3 n)\r\n{\r\n vec3 hn=dA;\r\n vec3 ho=dB;\r\n vec3 hu=gl_FrontFacing?dC:-dC;\r\n #ifdef TSPACE_RENORMALIZE\r\n hu=normalize(hu);\r\n #endif\r\n #ifdef TSPACE_ORTHOGONALIZE\r\n hn-=dot(hn,hu)*hu;\r\n #endif\r\n #ifdef TSPACE_RENORMALIZE\r\n hn=normalize(hn);\r\n #endif\r\n #ifdef TSPACE_ORTHOGONALIZE\r\n ho=(ho-dot(ho,hu)*hu)-dot(ho,hn)*hn;\r\n #endif\r\n #ifdef TSPACE_RENORMALIZE\r\n ho=normalize(ho);\r\n #endif\r\n #ifdef TSPACE_COMPUTE_BITANGENT\r\n vec3 hv=cross(hu,hn);\r\n ho=dot(hv,ho)<0.0?-hv:hv;\r\n #endif\r\n n=2.0*n-vec3(1.0);\r\n return normalize(hn*n.x+ho*n.y+hu*n.z);\r\n}\r\n\r\nvec3 dL(vec3 t){\r\n vec3 hu=gl_FrontFacing?dC:-dC;\r\n return normalize(dA*t.x+dB*t.y+hu*t.z);\r\n}\r\n\r\nvec4 dM(vec2 hA,vec4 hB){\r\n #if GL_OES_standard_derivatives\r\n vec2 hC=fract(hA);\r\n vec2 hD=fwidth(hC);\r\n float hE=(hD.x+hD.y)>0.5?-6.0:0.0;\r\n return texture2D(tExtras,hC*hB.xy+hB.zw,hE);\r\n #else\r\n return texture2D(tExtras,fract(hA)*hB.xy+hB.zw);\r\n #endif\r\n}\r\n\r\nvec3 hF(sampler2D hG,vec2 hH,float hI)\r\n{\r\n vec3 n=texture2D(hG,hH,hI*2.5).xyz;return dJ(n)\r\n}\r\n ";
  4156. var matshadows = "#ifdef SHADOW_COUNT\r\n\r\n #ifdef MOBILE\r\n #define SHADOW_KERNEL (4.0/1536.0)\r\n #else\r\n #define SHADOW_KERNEL (4.0/2048.0)\r\n #endif\r\n\r\n highp vec4 h(highp mat4 i,highp vec3 p){\r\n return i[0]*p.x+(i[1]*p.y+(i[2]*p.z+i[3]));\r\n }\r\n\r\n uniform sampler2D tDepth0;\r\n\r\n #if SHADOW_COUNT > 1\r\n uniform sampler2D tDepth1;\r\n #if SHADOW_COUNT > 2\r\n uniform sampler2D tDepth2;\r\n #endif\r\n #endif\r\n\r\n uniform highp vec2 uShadowKernelRotation;\r\n uniform highp vec2 uShadowMapSize;\r\n uniform highp mat4 uShadowMatrices[SHADOW_COUNT];\r\n uniform highp vec4 uShadowTexelPadProjections[SHADOW_COUNT];\r\n\r\n #ifndef MOBILE\r\n uniform highp mat4 uInvShadowMatrices[SHADOW_COUNT];\r\n #endif\r\n\r\n highp float hJ(highp vec3 G){\r\n #ifdef SHADOW_NATIVE_DEPTH\r\n return G.x;\r\n #else\r\n return(G.x+G.y*(1.0/255.0))+G.z*(1.0/65025.0);\r\n #endif\r\n }\r\n\r\n #ifndef SHADOW_COMPARE\r\n #define SHADOW_COMPARE(a,b) ((a) < (b) ? 1.0 : 0.0)\r\n #endif\r\n\r\n #ifndef SHADOW_CLIP\r\n #define SHADOW_CLIP(c,v) v\r\n #endif\r\n\r\n float hK(sampler2D hL,highp vec2 hA,highp float H){\r\n #ifndef MOBILE\r\n highp vec2 c=hA*uShadowMapSize.x;\r\n highp vec2 a=floor(c)*uShadowMapSize.y,b=ceil(c)*uShadowMapSize.y;\r\n highp vec4 eE;eE.x=hJ(texture2D(hL,a).xyz);\r\n eE.y=hJ(texture2D(hL,vec2(b.x,a.y)).xyz);\r\n eE.z=hJ(texture2D(hL,vec2(a.x,b.y)).xyz);\r\n eE.w=hJ(texture2D(hL,b).xyz);\r\n highp vec4 hM;\r\n hM.x=SHADOW_COMPARE(H,eE.x);\r\n hM.y=SHADOW_COMPARE(H,eE.y);\r\n hM.z=SHADOW_COMPARE(H,eE.z);\r\n hM.w=SHADOW_COMPARE(H,eE.w);\r\n highp vec2 w=c-a*uShadowMapSize.x;\r\n vec2 s=(w.y*hM.zw+hM.xy)-w.y*hM.xy;\r\n return(w.x*s.y+s.x)-w.x*s.x;\r\n #else\r\n highp float G=hJ(texture2D(hL,hA.xy).xyz);\r\n return SHADOW_COMPARE(H,G);\r\n #endif\r\n }\r\n \r\n highp float hN(sampler2D hL,highp vec3 hA,float hO){\r\n highp vec2 l=uShadowKernelRotation*hO;\r\n float s;\r\n s=hK(hL,hA.xy+l,hA.z);\r\n s+=hK(hL,hA.xy-l,hA.z);\r\n s+=hK(hL,hA.xy+vec2(-l.y,l.x),hA.z);\r\n s+=hK(hL,hA.xy+vec2(l.y,-l.x),hA.z);\r\n s*=0.25;return s*s;\r\n }\r\n \r\n struct ev{\r\n float eL[LIGHT_COUNT];\r\n };\r\n\r\n void eB(out ev ss,float hO){\r\n highp vec3 hP[SHADOW_COUNT];\r\n vec3 hu=gl_FrontFacing?dC:-dC;\r\n for(int k=0;k<SHADOW_COUNT;++k){\r\n vec4 hQ=uShadowTexelPadProjections[k];\r\n float hR=hQ.x*dv.x+(hQ.y*dv.y+(hQ.z*dv.z+hQ.w));\r\n #ifdef MOBILE\r\n hR*=.001+hO;\r\n #else\r\n hR*=.0005+0.5*hO;\r\n #endif\r\n highp vec4 hS=h(uShadowMatrices[k],dv+hR*hu);\r\n hP[k]=hS.xyz/hS.w;\r\n }\r\n float m;\r\n #if SHADOW_COUNT > 0\r\n m=hN(tDepth0,hP[0],hO);\r\n ss.eL[0]=SHADOW_CLIP(hP[0].xy,m);\r\n #endif\r\n #if SHADOW_COUNT > 1\r\n m=hN(tDepth1,hP[1],hO);\r\n ss.eL[1]=SHADOW_CLIP(hP[1].xy,m);\r\n #endif\r\n #if SHADOW_COUNT > 2\r\n m=hN(tDepth2,hP[2],hO);\r\n ss.eL[2]=SHADOW_CLIP(hP[2].xy,m);\r\n #endif\r\n for(int k=SHADOW_COUNT;k<LIGHT_COUNT;++k){\r\n ss.eL[k]=1.0;\r\n }\r\n }\r\n \r\n struct eD{highp float eE[LIGHT_COUNT];};\r\n #ifdef MOBILE\r\n void eG(out eD ss,float hO){\r\n for(int k=0;k<LIGHT_COUNT;++k){ss.eE[k]=1.0;}}\r\n #else\r\n highp vec4 hT(sampler2D hL,highp vec2 hA,highp mat4 hU){\r\n highp vec4 E;E.xy=hA;\r\n #ifndef MOBILE\r\n highp vec2 c=hA*uShadowMapSize.x;\r\n highp vec2 a=floor(c)*uShadowMapSize.y,b=ceil(c)*uShadowMapSize.y;\r\n highp vec4 hM;hM.x=hJ(texture2D(hL,a).xyz);\r\n hM.y=hJ(texture2D(hL,vec2(b.x,a.y)).xyz);\r\n hM.z=hJ(texture2D(hL,vec2(a.x,b.y)).xyz);\r\n hM.w=hJ(texture2D(hL,b).xyz);\r\n highp vec2 w=c-a*uShadowMapSize.x;\r\n vec2 s=(w.y*hM.zw+hM.xy)-w.y*hM.xy;\r\n E.z=(w.x*s.y+s.x)-w.x*s.x;\r\n #else \r\n E.z=hJ(texture2D(hL,hA.xy).xyz);\r\n #endif\r\n E=h(hU,E.xyz);\r\n E.xyz/=E.w;return E;\r\n }\r\n \r\n void eG(out eD ss,float hO){\r\n highp vec3 hV[SHADOW_COUNT];\r\n vec3 hu=gl_FrontFacing?dC:-dC;\r\n hu*=0.6;\r\n for(int k=0;k<SHADOW_COUNT;++k){\r\n vec4 hQ=uShadowTexelPadProjections[k];\r\n float hR=hQ.x*dv.x+(hQ.y*dv.y+(hQ.z*dv.z+hQ.w));\r\n #ifdef MOBILE\r\n hR*=.001+hO;\r\n #else\r\n hR*=.0005+0.5*hO;\r\n #endif\r\n highp vec4 hS=h(uShadowMatrices[k],dv-hR*hu);\r\n hV[k]=hS.xyz/hS.w;\r\n }\r\n \r\n highp vec4 hW;\r\n #if SHADOW_COUNT > 0\r\n hW=hT(tDepth0,hV[0].xy,uInvShadowMatrices[0]);\r\n ss.eE[0]=length(dv.xyz-hW.xyz);\r\n #endif\r\n #if SHADOW_COUNT > 1\r\n hW=hT(tDepth1,hV[1].xy,uInvShadowMatrices[1]);\r\n ss.eE[1]=length(dv.xyz-hW.xyz);\r\n #endif\r\n #if SHADOW_COUNT > 2\r\n hW=hT(tDepth2,hV[2].xy,uInvShadowMatrices[2]);\r\n ss.eE[2]=length(dv.xyz-hW.xyz);\r\n #endif\r\n for(int k=SHADOW_COUNT;k<LIGHT_COUNT;++k){\r\n ss.eE[k]=1.0;\r\n }\r\n }\r\n #endif\r\n#endif\r\n ";
  4157. var matskin = "#ifdef SKIN\r\n #ifndef SKIN_NO_SUBDERMIS_TEX\r\n uniform vec4 uTexRangeSubdermis;\r\n #endif\r\n #ifndef SKIN_NO_TRANSLUCENCY_TEX\r\n uniform vec4 uTexRangeTranslucency;\r\n #endif\r\n #ifndef SKIN_NO_FUZZ_TEX\r\n uniform vec4 uTexRangeFuzz;\r\n #endif\r\n uniform vec4 uTransColor;\r\n uniform vec4 uFresnelColor;\r\n uniform vec3 uSubdermisColor;\r\n uniform float uTransScatter;\r\n uniform float uFresnelOcc;\r\n uniform float uFresnelGlossMask;\r\n uniform float uTransSky;\r\n uniform float uFresnelIntegral;\r\n uniform float uTransIntegral;\r\n uniform float uSkinTransDepth;\r\n uniform float uSkinShadowBlur;\r\n uniform float uNormalSmooth;\r\n\r\n struct dX{\r\n vec3 hX;vec3 hY,hZ,ic,he;vec3 ec,eh,id;vec3 ie;vec3 ih;vec3 ii;vec3 ij;float ik;float il;float im;float eC;\r\n };\r\n\r\n void dZ(out dX s){\r\n vec4 m;\r\n #ifdef SKIN_NO_SUBDERMIS_TEX\r\n s.hX=uSubdermisColor;s.im=1.0;\r\n #else \r\n m=dM(d,uTexRangeSubdermis);\r\n s.hX=dG(m.xyz);\r\n s.im=m.w*m.w;\r\n #endif\r\n s.ij=uTransColor.rgb;\r\n s.ik=uTransScatter;\r\n #ifdef SKIN_VERSION_1\r\n s.eC=uSkinShadowBlur*s.im;\r\n #else \r\n s.il=max(max(s.ij.r,s.ij.g),s.ij.b)*uTransColor.a;\r\n float io=max(s.hX.r,max(s.hX.g,s.hX.b));\r\n io=1.0-io;\r\n io*=io;\r\n io*=io;\r\n io*=io;\r\n io=1.0-(io*io);s.im*=io;\r\n s.eC=uSkinShadowBlur*s.im*dot(s.hX.rgb,vec3(0.333,0.334,0.333));\r\n #endif\r\n #ifndef SKIN_NO_TRANSLUCENCY_TEX\r\n m=dM(d,uTexRangeTranslucency);\r\n s.ij*=dG(m.xyz);\r\n #endif\r\n s.ie=hF(tNormal,d,uNormalSmooth*s.im);\r\n vec3 iu,iv,iA;fK(iu,iv,iA,s.ie);\r\n s.eh=s.hY=iu+iv+iA;\r\n #ifdef SKIN_VERSION_1 \r\n s.ec=fQ(iu,iv,iA,vec3(1.0,0.6667,0.25),s.hX);\r\n #else\r\n s.ec=fQ(iu,iv,iA,vec3(1.0,0.6667,0.25),s.hX*0.2+vec3(0.1));\r\n #endif\r\n #ifdef SKIN_VERSION_1\r\n vec3 iB,iC,iD;fK(iB,iC,iD,-s.ie);\r\n s.id=fO(iB,iC,iD,vec3(1.0,0.4444,0.0625),s.ik);\r\n s.id*=uTransSky;\r\n #else \r\n s.id=vec3(0.0);\r\n #endif\r\n s.hZ=s.ic=s.he=vec3(0.0);\r\n s.hX*=0.5;\r\n s.ik*=0.5;\r\n s.ih=uFresnelColor.rgb;\r\n s.ii=uFresnelColor.aaa*vec3(1.0,0.5,0.25);\r\n #ifndef SKIN_NO_FUZZ_TEX\r\n m=dM(d,uTexRangeFuzz);\r\n s.ih*=dG(m.rgb);\r\n #endif\r\n }\r\n\r\n void eK(inout dX s,float iE,float iF,vec3 eH,vec3 dI,vec3 eJ)\r\n {\r\n float fk=dot(eH,dI);\r\n float fl=dot(eH,s.ie);\r\n float eN=saturate((1.0/3.1415926)*fk);\r\n float hi=iE*iE;\r\n hi*=hi;\r\n hi=saturate(6.0*hi);\r\n #ifdef SKIN_VERSION_1 \r\n vec3 iG=fB(fl,s.hX);\r\n #else \r\n vec3 iG=fj(fk,fl,s.hX);\r\n #endif\r\n float iH=fA(-fl,s.ik);\r\n vec3 ic=vec3(iH*iH);\r\n #ifdef SKIN_VERSION_1\r\n #ifdef SHADOW_COUNT\r\n vec3 iI=vec3(iE);\r\n float iJ=saturate(hi-2.0*(iE*iE));\r\n iI+=iJ*s.hX;\r\n float iK=iE;\r\n #endif\r\n #else\r\n #ifdef SHADOW_COUNT\r\n vec3 iI;\r\n highp vec3 iL=(0.995*s.hX)+vec3(0.005,0.005,0.005);\r\n highp vec3 iM=vec3(1.0)-iL;\r\n iL=mix(iL,iM,iE);\r\n float iN=sqrt(iE);\r\n vec3 iO=2.0*vec3(1.0-iN);\r\n iN=1.0-iN;\r\n iN=(1.0-iN*iN);\r\n iI=saturate(pow(iL*iN,iO));\r\n highp float iP=0.35/(uSkinTransDepth+0.001);\r\n highp float iQ=saturate(iF*iP);\r\n iQ=saturate(1.0-iQ);\r\n iQ*=iQ;\r\n highp vec3 iR=vec3((-3.0*iQ)+3.15);\r\n highp vec3 iS=(0.9975*s.ij)+vec3(0.0025,0.0025,0.0025);\r\n highp float io=saturate(10.0*dot(iS,iS));\r\n vec3 iK=pow(iS*iQ,iR)*io;\r\n #else \r\n ic=vec3(0.0);\r\n #endif\r\n #endif\r\n float hj=fA(fl,s.ii.z);\r\n #ifdef SHADOW_COUNT\r\n vec3 hk=mix(vec3(1.0),iI,uFresnelOcc);\r\n vec3 he=hj*hk;\r\n #else\r\n vec3 he=vec3(hj);\r\n #endif\r\n #ifdef SHADOW_COUNT\r\n iG*=iI;\r\n eN*=hi;\r\n ic*=iK;\r\n #endif\r\n s.he=he*eJ+s.he;\r\n s.ic=ic*eJ+s.ic;\r\n s.hZ=iG*eJ+s.hZ;\r\n s.hY=eN*eJ+s.hY;\r\n }\r\n \r\n void eQ(out vec3 ei,out vec3 diff_extra,inout dX s,vec3 dO,vec3 dI,float dQ)\r\n {\r\n s.he*=uFresnelIntegral;\r\n float fH=dot(dO,dI);\r\n vec2 hl=fG(vec2(fH,fH),s.ii.xy);\r\n s.he=s.eh*hl.x+(s.he*hl.y);\r\n s.he*=s.ih;\r\n float hm=saturate(1.0+-uFresnelGlossMask*dQ);\r\n s.he*=hm*hm;\r\n s.ic=s.ic*uTransIntegral;\r\n #ifdef SKIN_VERSION_1\r\n s.hZ=(s.hZ*fD(s.hX))+s.ec;\r\n #else\r\n s.hZ=(s.hZ*fv(s.hX))+s.ec;\r\n #endif\r\n ei=mix(s.hY,s.hZ,s.im);\r\n #ifdef SKIN_VERSION_1\r\n s.ic=(s.ic+s.id)*s.ij;\r\n diff_extra=(s.he+s.ic)*s.im;\r\n #else\r\n ei+=s.ic*s.il;diff_extra=s.he*s.im;\r\n #endif\r\n }\r\n#endif\r\n ";
  4158. var matstrips = "#ifdef STRIPVIEW\r\n uniform float uStrips[5];\r\n uniform vec2 uStripRes;\r\n struct dT{\r\n float io[5];\r\n float bg;\r\n };\r\n\r\n void dV(out dT iT,inout float dQ,inout vec3 dP){\r\n highp vec2 hA=gl_FragCoord.xy*uStripRes-vec2(1.0,1.0);\r\n hA.x+=0.25*hA.y;\r\n iT.io[0]=step(hA.x,uStrips[0]);\r\n iT.io[1]=step(hA.x,uStrips[1]);\r\n iT.io[2]=step(hA.x,uStrips[2]);\r\n iT.io[3]=step(hA.x,uStrips[3]);\r\n iT.io[4]=step(hA.x,uStrips[4]);\r\n iT.bg=1.0-iT.io[4];\r\n iT.io[4]-=iT.io[3];\r\n iT.io[3]-=iT.io[2];\r\n iT.io[2]-=iT.io[1];\r\n iT.io[1]-=iT.io[0];\r\n bool iU=iT.io[4]>0.0;\r\n dQ=iU?0.5:dQ;\r\n dP=iU?vec3(0.1):dP;\r\n }\r\n\r\n vec3 eX(dT iT,vec3 dI,vec3 dF,vec3 dP,float dQ,vec3 ei,vec3 el,vec3 iV){\r\n return iT.io[0]*(dI*0.5+vec3(0.5))+iT.io[1]*dF+iT.io[2]*dP+vec3(iT.io[3]*dQ)+iT.io[4]*(vec3(0.12)+0.3*ei+el)+iT.bg*iV;\r\n }\r\n#endif\r\n ";
  4159. var alphaprepassfrag = "precision mediump float;\r\n#include <matdither.glsl>\r\nuniform sampler2D tAlbedo;\r\nvarying mediump vec2 d;\r\nvoid main(){\r\n float e=texture2D(tAlbedo,d).a;\r\n if(e<=f(d.x)){\r\n discard;\r\n }\r\n gl_FragColor=vec4(0.0);\r\n}\r\n ";
  4160. var alphaprepassvert = "precision highp float;\r\nuniform mat4 uModelViewProjectionMatrix;\r\nuniform vec2 uUVOffset;\r\nattribute vec3 vPosition;\r\nattribute vec2 vTexCoord;\r\nvarying mediump vec2 d;\r\nvec4 h(mat4 i,vec3 p){\r\n return i[0]*p.x+(i[1]*p.y+(i[2]*p.z+i[3]));\r\n}\r\n\r\nvoid main(void){\r\n gl_Position=h(uModelViewProjectionMatrix,vPosition.xyz);\r\n d=vTexCoord+uUVOffset;\r\n}\r\n ";
  4161. var bloom = "precision mediump float;\r\nuniform sampler2D tInput;\r\nuniform vec4 uKernel[BLOOM_SAMPLES];\r\nvarying highp vec2 j;\r\nvoid main(void)\r\n{\r\n\tvec3 c=vec3(0.0,0.0,0.0);\r\n\tfor(int k=0;k<BLOOM_SAMPLES;++k)\r\n\t{\r\n\t\tvec3 l=uKernel[k].xyz;\r\n\t\tvec3 m=texture2D(tInput,j+l.xy).xyz;\r\n\t\tm=max(m,vec3(0.0,0.0,0.0));\r\n\t\tc+=m*l.z;\r\n\t}\r\n\tgl_FragColor.xyz=c;\r\n\tgl_FragColor.w=0.0;\r\n}";
  4162. var bloomshrink = "precision highp float;\r\nuniform sampler2D tInput;\r\nvarying highp vec2 j;\r\nvoid main(void)\r\n{\r\n\tfloat o=0.25/256.0;\r\n\tgl_FragColor=0.25*(texture2D(tInput,j+vec2(o,o))+texture2D(tInput,j+vec2(o,-o))+texture2D(tInput,j+vec2(-o,o))+texture2D(tInput,j+vec2(-o,-o)));\r\n}";
  4163. var fogfrag = "precision highp float;\r\nuniform sampler2D tDepth;\r\nuniform vec3 uDepthToZ;\r\nuniform vec4 uUnproject;\r\nuniform mat4 uInvViewMatrix;\r\nuniform float uFogInvDistance;\r\nuniform float uFogOpacity;\r\nuniform float uFogDispersion;\r\nuniform vec3 uFogType;\r\nuniform vec3 uFogColor;\r\nuniform float uFogIllum;\r\nuniform mat4 uLightMatrix;\r\n\r\n#ifdef FOG_IBL\r\n\tuniform vec4 uFogLightSphere[9];\r\n#else\r\n\tuniform vec4 uSpotParams;\r\n\tuniform vec4 uLightPosition;\r\n\tuniform vec3 uLightColor;\r\n\tuniform vec4 uLightAttenuation;\r\n\t#ifdef FOG_SHADOWS\r\n\t\tuniform mat4 uShadowProj;\r\n\t\tuniform sampler2D uShadowMap;\r\n\t\tuniform float uDitherOffset;\r\n\t\tuniform vec4 uCylinder;\r\n\t#endif\r\n#endif\r\n\r\nvec4 h(mat4 i,vec3 p){\r\n return i[0]*p.x+(i[1]*p.y+(i[2]*p.z+i[3]));\r\n}\r\nvec3 u(mat4 i,vec3 v){\r\n return i[0].xyz*v.x+i[1].xyz*v.y+i[2].xyz*v.z;\r\n}\r\nfloat A(float B)\r\n{\r\n\tB*=uFogInvDistance;\r\n\tfloat C=uFogType.x*min(B,1.0)+(uFogType.y-uFogType.y/(1.0+16.0*B*B))+(uFogType.z-uFogType.z*exp(-3.0*B));\r\n\treturn C*uFogOpacity;\r\n}\r\n\r\n#ifdef FOG_SHADOWS\r\n\tfloat D(vec3 E){\r\n vec4 p=h(uShadowProj,E);\r\n vec3 F=p.xyz/p.w;\r\n vec4 G=texture2D(uShadowMap,F.xy);\r\n float H=(G.x+G.y*(1.0/255.0))+G.z*(1.0/65025.0);\r\n return F.z<H || H>=1.0?1.0:0.0;\r\n }\r\n\tfloat f(vec2 I){\r\n return fract(sin(dot(I,vec2(12.9898,78.233)))*43758.5453+uDitherOffset);\r\n }\r\n\tvoid J(vec3 K,vec3 L,out float M,out float N)\r\n\t{\r\n\t\tvec3 v=uSpotParams.xyz,p=uCylinder.xyz;\r\n\t\tvec3 O=L-dot(L,v)*v;\r\n\t\tvec3 P=(K-p)-dot(K-p,v)*v;\r\n\t\tfloat a=dot(O,O);\r\n\t\tfloat b=2.0*dot(O,P);\r\n\t\tfloat c=dot(P,P)-uCylinder.w;\r\n\t\tfloat Q=b*b-4.0*a*c;\r\n\t\tif(Q>=0.0)\r\n\t\t{\r\n\t\t\tQ=sqrt(Q);\r\n\t\t\tM=(-b-Q)/(2.0*a);\r\n\t\t\tN=(-b+Q)/(2.0*a);\r\n\t\t}\r\n\t\telse \r\n\t\t{\r\n\t\t M=N=0.0;\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\nvarying vec2 j;\r\nvoid main(void)\r\n{\r\n\tvec3 R=uInvViewMatrix[3].xyz;\r\n\tfloat H=texture2D(tDepth,j).x;\r\n\tH=min(H,0.9999);\r\n\tvec3 S;\r\n\tS.z=uDepthToZ.y/(uDepthToZ.z*H+uDepthToZ.x);\r\n\tS.xy=S.z*(j*uUnproject.xy+uUnproject.zw);\r\n\tS=h(uInvViewMatrix,S).xyz;\r\n\tvec3 T;\r\n\tT.xy=(j*uUnproject.xy+uUnproject.zw);\r\n\tT.z=1.0;\r\n T=normalize(u(uInvViewMatrix,-T).xyz);\r\n\tvec3 U=uFogColor;\r\n\t\r\n #if defined(FOG_IBL)\r\n vec3 G=u(uLightMatrix,T);\r\n vec3 V=uFogLightSphere[0].xyz;\r\n V+=uFogLightSphere[1].xyz*G.y;\r\n V+=uFogLightSphere[2].xyz*G.z;\r\n V+=uFogLightSphere[3].xyz*G.x;\r\n vec3 swz=G.yyz*G.xzx;V+=uFogLightSphere[4].xyz*swz.x;V+=uFogLightSphere[5].xyz*swz.y;\r\n V+=uFogLightSphere[7].xyz*swz.z;\r\n vec3 sqr=G*G;\r\n V+=uFogLightSphere[6].xyz*(3.0*sqr.z-1.0);\r\n V+=uFogLightSphere[8].xyz*(sqr.x-sqr.y);\r\n U=mix(U,U*V,uFogIllum);\r\n float C=A(length(S-R));\r\n gl_FragColor.xyz=U*C;\r\n gl_FragColor.w=C;return;\r\n #else\r\n #if defined(FOG_SPOT) || defined(FOG_OMNI)\r\n float W=0.0,X=0.0;\r\n {\r\n float r=1.0/(uLightAttenuation.z);\r\n float a=1.0;float b=2.0*dot(T,R-uLightPosition.xyz);\r\n float c=dot(uLightPosition.xyz,uLightPosition.xyz)+dot(R,R)+-2.0*dot(uLightPosition.xyz,R)+-r*r;\r\n float Q=b*b-4.0*a*c;\r\n if(Q>=0.0)\r\n {\r\n Q=sqrt(Q);\r\n W=(-b-Q)/(2.0*a);\r\n X=(-b+Q)/(2.0*a);\r\n }\r\n }\r\n #if defined(FOG_SPOT)\r\n {\r\n float Y=uSpotParams.w,Z=1.0-Y;\r\n vec3 v=T;\r\n vec3 dc=uSpotParams.xyz;\r\n vec3 dd=R-uLightPosition.xyz;\r\n vec3 de=v-dot(v,dc)*dc,df=dd-dot(dd,dc)*dc;\r\n float a=Y*dot(de,de)-Z*dot(v,dc)*dot(v,dc);\r\n float b=2.0*Y*dot(de,df)-2.0*Z*dot(v,dc)*dot(dd,dc);\r\n float c=Y*dot(df,df)-Z*dot(dd,dc)*dot(dd,dc);\r\n float Q=b*b-4.0*a*c;\r\n if(Q>=0.0)\r\n {\r\n float dh=(-b-sqrt(Q))/(2.0*a);\r\n float di=(-b+sqrt(Q))/(2.0*a);\r\n if(di<dh)\r\n {\r\n float de=dh;dh=di;di=de;\r\n }\r\n bool dj=dot(-uLightPosition.xyz+R+T*dh,uSpotParams.xyz)<=0.0;\r\n bool dk=dot(-uLightPosition.xyz+R+T*di,uSpotParams.xyz)<=0.0;\r\n if(!dj ||!dk)\r\n {\r\n if(dj)\r\n {\r\n dh=di;\r\n di=X;\r\n }\r\n else if(dk)\r\n {\r\n di=dh;\r\n dh=W;\r\n }\r\n W=max(W,dh);\r\n X=min(X,di);\r\n }\r\n else \r\n {\r\n X=W=0.0;\r\n }\r\n }\r\n else \r\n {\r\n X=W=0.0;\r\n }\r\n }\r\n #endif\r\n\r\n float tx=dot(T,S-R);\r\n W=clamp(W,0.0,tx);\r\n X=clamp(X,0.0,tx);\r\n float dl=0.0;\r\n if(X>W)\r\n {\r\n #ifdef FOG_SHADOWS\r\n #ifdef MOBILE\r\n #define SAMPLES 16\r\n #else\r\n #define SAMPLES 32\r\n #endif\r\n float dm=f(j)*(X-W)/float(SAMPLES-2);\r\n #else\r\n #define SAMPLES 8\r\n float dm=0.0;\r\n #endif\r\n\r\n for(int k=0;k<SAMPLES;++k)\r\n {\r\n float t=W+(X-W)*float(k)/float(SAMPLES-1);\r\n vec3 p=R+(t+dm)*T;\r\n float a=clamp(length(p-uLightPosition.xyz)*uLightAttenuation.z,0.0,1.0);\r\n a=1.0+uLightAttenuation.x*a+uLightAttenuation.y*a*a;\r\n\r\n #ifdef FOG_SHADOWS\r\n a*=D(p);\r\n #endif\r\n \r\n dl+=a-a*A(t);\r\n }\r\n dl*=1.0/float(SAMPLES);\r\n dl*=(X-W)*uLightAttenuation.z;\r\n dl*=A(X-W);\r\n }\r\n U*=dl*uFogIllum;\r\n #elif defined(FOG_DIR)\r\n float C=A(dot(T,S-R));\r\n\r\n #ifdef FOG_SHADOWS\r\n float W,X;J(R,T,W,X);\r\n float tx=dot(T,S-R);\r\n W=clamp(W,0.0,tx);\r\n X=clamp(X,0.0,tx);\r\n if(X>W)\r\n {\r\n #ifdef MOBILE\r\n #define SAMPLES 16\r\n #else\r\n #define SAMPLES 32\r\n #endif\r\n float dl=0.0;float dm=f(j)*(X-W)/float(SAMPLES-2);\r\n float dn=(X-W)*(1.0/float(SAMPLES));\r\n for(int k=0;k<SAMPLES;++k)\r\n {\r\n float t=W+float(k)*dn+dm;vec3 p=R+t*T;\r\n float s=D(p);C-=(1.0-s)*(A(t+dn)-A(t));\r\n }\r\n }\r\n #endif\r\n\r\n float du=0.5+0.5*dot(T,-uSpotParams.xyz);\r\n du=1.0+uFogDispersion*(2.0*du*du-1.0);\r\n U*=(0.1*C)*(du*uFogIllum);\r\n #endif\r\n \r\n gl_FragColor.xyz=U*uLightColor;\r\n gl_FragColor.w=0.0;\r\n #endif\r\n}";
  4164. var fogvert = "precision highp float;\r\nattribute vec2 vCoord;\r\nvarying vec2 j;\r\nvoid main(void){\r\n j=vCoord;\r\n gl_Position.xy=2.0*vCoord-vec2(1.0,1.0);\r\n gl_Position.zw=vec2(0.0,1.0);\r\n}";
  4165. var matfrag = "#extension GL_OES_standard_derivatives : enable\r\nprecision mediump float;\r\nvarying highp vec3 dv;\r\nvarying mediump vec2 d;\r\nvarying mediump vec3 dA;\r\nvarying mediump vec3 dB;\r\nvarying mediump vec3 dC;\r\n\r\n#ifdef VERTEX_COLOR\r\n varying lowp vec4 dD;\r\n#endif\r\n\r\n#ifdef TEXCOORD_SECONDARY\r\n varying mediump vec2 dE;\r\n#endif\r\n\r\nuniform sampler2D tAlbedo;\r\nuniform sampler2D tReflectivity;\r\nuniform sampler2D tNormal;\r\nuniform sampler2D tExtras;\r\nuniform sampler2D tSkySpecular;\r\n\r\n#ifdef REFRACTION\r\n uniform sampler2D tRefraction;\r\n#endif\r\n\r\nuniform vec4 uDiffuseCoefficients[9];\r\nuniform vec3 uCameraPosition;\r\nuniform float uAlphaTest;\r\nuniform vec3 uFresnel;\r\nuniform float uHorizonOcclude;\r\nuniform float uHorizonSmoothing;\r\n\r\n#ifdef EMISSIVE\r\n uniform float uEmissiveScale;\r\n uniform vec4 uTexRangeEmissive;\r\n#endif\r\n\r\n#ifdef AMBIENT_OCCLUSION\r\n uniform vec4 uTexRangeAO;\r\n#endif\r\n\r\n#ifdef REFRACTION\r\n uniform float uRefractionIOREntry;\r\n uniform float uRefractionRayDistance;\r\n uniform vec3 uRefractionTint;\r\n uniform float uRefractionAlbedoTint;\r\n uniform mat4 uRefractionViewProjection;\r\n uniform vec4 uTexRangeRefraction;\r\n#endif\r\n\r\n#ifdef LIGHT_COUNT\r\n uniform vec4 uLightPositions[LIGHT_COUNT];\r\n uniform vec3 uLightDirections[LIGHT_COUNT];\r\n uniform vec3 uLightColors[LIGHT_COUNT];\r\n uniform vec3 uLightParams[LIGHT_COUNT];\r\n uniform vec3 uLightSpot[LIGHT_COUNT];\r\n#endif\r\n\r\n#ifdef ANISO\r\n uniform float uAnisoStrength;\r\n uniform vec3 uAnisoTangent;\r\n uniform float uAnisoIntegral;\r\n uniform vec4 uTexRangeAniso;\r\n#endif\r\n \r\n#define saturate(x) clamp( x, 0.0, 1.0 )\r\n#include <matsampling.glsl>\r\n#include <matlighting.glsl>\r\n#include <matshadows.glsl>\r\n#include <matskin.glsl>\r\n#include <matmicrofiber.glsl>\r\n#include <matstrips.glsl>\r\n\r\n#ifdef TRANSPARENCY_DITHER\r\n #include <matdither.glsl>\r\n#endif\r\n \r\nvoid main(void){\r\n vec4 m=texture2D(tAlbedo,d);\r\n vec3 dF=dG(m.xyz);\r\n float e=m.w;\r\n\r\n #ifdef VERTEX_COLOR\r\n {\r\n vec3 dH=dD.xyz;\r\n \r\n #ifdef VERTEX_COLOR_SRGB\r\n dH=dH*(dH*(dH*0.305306011+vec3(0.682171111))+vec3(0.012522878));\r\n #endif\r\n \r\n dF*=dH;\r\n \r\n #ifdef VERTEX_COLOR_ALPHA\r\n e*=dD.w;\r\n #endif\r\n }\r\n #endif\r\n\r\n #ifdef ALPHA_TEST\r\n if(e<uAlphaTest){\r\n discard;\r\n }\r\n #endif\r\n\r\n #ifdef TRANSPARENCY_DITHER\r\n e=(e>f(d.x))?1.0:e;\r\n #endif\r\n \r\n vec3 dI=dJ(texture2D(tNormal,d).xyz);\r\n \r\n #ifdef ANISO\r\n \r\n #ifdef ANISO_NO_DIR_TEX\r\n vec3 dK=dL(uAnisoTangent);\r\n #else\r\n m=dM(d,uTexRangeAniso);\r\n vec3 dK=2.0*m.xyz-vec3(1.0);\r\n dK=dL(dK);\r\n #endif\r\n\r\n dK=dK-dI*dot(dK,dI);\r\n K=normalize(dK);\r\n vec3 dN=dK*uAnisoStrength;\r\n #endif\r\n\r\n vec3 dO=normalize(uCameraPosition-dv);\r\n m=texture2D(tReflectivity,d);\r\n vec3 dP=dG(m.xyz);\r\n float dQ=m.w;\r\n float dR=dQ;\r\n\r\n #ifdef HORIZON_SMOOTHING\r\n float dS=dot(dO,dI);\r\n dS=uHorizonSmoothing-dS*uHorizonSmoothing;\r\n dQ=mix(dQ,1.0,dS*dS);\r\n #endif\r\n\r\n #ifdef STRIPVIEW\r\n dT dU;dV(dU,dQ,dP);\r\n #endif\r\n\r\n float dW=1.0;\r\n\r\n #ifdef AMBIENT_OCCLUSION\r\n\r\n #ifdef AMBIENT_OCCLUSION_SECONDARY_UV\r\n dW=dM(dE,uTexRangeAO).x;\r\n #else\r\n dW=dM(d,uTexRangeAO).x;\r\n #endif\r\n\r\n dW*=dW;\r\n #endif\r\n\r\n #if defined(SKIN)\r\n dX dY;\r\n dZ(dY);\r\n dY.ec*=dW;\r\n #elif defined(MICROFIBER)\r\n ed ee;\r\n ef(ee,dI);\r\n ee.eh*=dW;\r\n #else\r\n vec3 ei=ej(dI);ei*=dW;\r\n #endif\r\n\r\n vec3 ek=reflect(-dO,dI);\r\n\r\n #ifdef ANISO\r\n vec3 rt=ek-(0.5*dN*dot(ek,dK));\r\n vec3 el=em(rt,mix(dQ,0.5*dQ,uAnisoStrength));\r\n #else\r\n vec3 el=em(ek,dQ);\r\n #endif\r\n\r\n el*=en(ek,dC);\r\n\r\n #ifdef LIGHT_COUNT\r\n highp float eo=10.0/log2(dQ*0.968+0.03);\r\n eo*=eo;\r\n float eu=eo*(1.0/(8.0*3.1415926))+(4.0/(8.0*3.1415926));\r\n eu=min(eu,1.0e3);\r\n\r\n #ifdef SHADOW_COUNT\r\n ev eA;\r\n\r\n #ifdef SKIN\r\n\r\n #ifdef SKIN_VERSION_1\r\n eB(eA,SHADOW_KERNEL+SHADOW_KERNEL*dY.eC);\r\n #else\r\n eD eE;\r\n float eF=SHADOW_KERNEL+SHADOW_KERNEL*dY.eC;eG(eE,eF);eB(eA,eF);\r\n #endif\r\n\r\n #else\r\n eB(eA,SHADOW_KERNEL);\r\n #endif\r\n\r\n #endif\r\n\r\n #ifdef ANISO\r\n eu*=uAnisoIntegral;\r\n #endif\r\n\r\n for(int k=0;k<LIGHT_COUNT;++k){\r\n vec3 eH=uLightPositions[k].xyz-dv*uLightPositions[k].w;\r\n float eI=inversesqrt(dot(eH,eH));\r\n eH*=eI;\r\n float a=saturate(uLightParams[k].z/eI);\r\n a=1.0+a*(uLightParams[k].x+uLightParams[k].y*a);\r\n float s=saturate(dot(eH,uLightDirections[k]));\r\n s=saturate(uLightSpot[k].y-uLightSpot[k].z*(1.0-s*s));\r\n vec3 eJ=(a*s)*uLightColors[k].xyz;\r\n\r\n #if defined(SKIN)\r\n\r\n #ifdef SHADOW_COUNT\r\n #ifdef SKIN_VERSION_1\r\n eK(dY,eA.eL[k],1.0,eH,dI,eJ);\r\n #else\r\n eK(dY,eA.eL[k],eE.eE[k],eH,dI,eJ);\r\n #endif\r\n #else\r\n eK(dY,1.0,0.0,eH,dI,eJ);\r\n #endif\r\n\r\n #elif defined(MICROFIBER)\r\n\r\n #ifdef SHADOW_COUNT\r\n eM(ee,eA.eL[k],eH,dI,eJ);\r\n #else\r\n eM(ee,1.0,eH,dI,eJ);\r\n #endif\r\n\r\n #else\r\n float eN=saturate((1.0/3.1415926)*dot(eH,dI));\r\n\r\n #ifdef SHADOW_COUNT\r\n eN*=eA.eL[k];\r\n #endif\r\n\r\n ei+=eN*eJ;\r\n #endif\r\n\r\n vec3 eO=eH+dO;\r\n\r\n #ifdef ANISO\r\n eO=eO-(dN*dot(eO,dK));\r\n #endif\r\n\r\n eO=normalize(eO);\r\n float eP=eu*pow(saturate(dot(eO,dI)),eo);\r\n\r\n #ifdef SHADOW_COUNT\r\n eP*=eA.eL[k];\r\n #endif\r\n\r\n el+=eP*eJ;\r\n }\r\n #endif\r\n\r\n #if defined(SKIN)\r\n vec3 ei,diff_extra;eQ(ei,diff_extra,dY,dO,dI,dQ);\r\n #elif defined(MICROFIBER)\r\n vec3 ei,diff_extra;eR(ei,diff_extra,ee,dO,dI,dQ);\r\n #endif\r\n\r\n vec3 eS=eT(dO,dI,dP,dQ*dQ);\r\n el*=eS;\r\n\r\n #ifdef REFRACTION\r\n vec4 eU;\r\n { \r\n vec3 G=refract(-dO,dI,uRefractionIOREntry);\r\n G=dv+G*uRefractionRayDistance;\r\n vec4 eV=uRefractionViewProjection[0]*G.x+(uRefractionViewProjection[1]*G.y+(uRefractionViewProjection[2]*G.z+uRefractionViewProjection[3]));\r\n vec2 c=eV.xy/eV.w;\r\n c=0.5*c+vec2(0.5,0.5);\r\n vec2 i=mod(floor(c),2.0);\r\n c=fract(c);\r\n c.x=i.x>0.0?1.0-c.x:c.x;\r\n c.y=i.y>0.0?1.0-c.y:c.y;\r\n eU.rgb=texture2D(tRefraction,c).xyz;\r\n eU.rgb=mix(eU.rgb,eU.rgb*dF,uRefractionAlbedoTint);\r\n eU.rgb=eU.rgb-eU.rgb*eS;\r\n eU.rgb*=uRefractionTint;\r\n #ifdef REFRACTION_NO_MASK_TEX\r\n eU.a=1.0;\r\n #else\r\n eU.a=dM(d,uTexRangeRefraction).x;\r\n #endif\r\n }\r\n #endif\r\n\r\n #ifdef DIFFUSE_UNLIT\r\n gl_FragColor.xyz=dF;\r\n #else\r\n gl_FragColor.xyz=ei*dF;\r\n #endif\r\n\r\n #ifdef REFRACTION\r\n gl_FragColor.xyz=mix(gl_FragColor.xyz,eU.rgb,eU.a);\r\n #endif\r\n\r\n gl_FragColor.xyz+=el;\r\n\r\n #if defined(SKIN) || defined(MICROFIBER)\r\n gl_FragColor.xyz+=diff_extra;\r\n #endif\r\n\r\n #ifdef EMISSIVE\r\n\r\n #ifdef EMISSIVE_SECONDARY_UV\r\n vec2 eW=dE;\r\n #else\r\n vec2 eW=d;\r\n #endif\r\n\r\n gl_FragColor.xyz+=uEmissiveScale*dG(dM(eW,uTexRangeEmissive).xyz);\r\n #endif\r\n\r\n #ifdef STRIPVIEW\r\n gl_FragColor.xyz=eX(dU,dI,dF,dP,dR,ei,el,gl_FragColor.xyz);\r\n #endif\r\n\r\n #ifdef NOBLEND\r\n gl_FragColor.w=1.0;\r\n #else\r\n gl_FragColor.w=e;\r\n #endif\r\n}";
  4166. var matvert = "precision highp float;\r\nuniform mat4 uModelViewProjectionMatrix;\r\nuniform mat4 uSkyMatrix;\r\nuniform vec2 uUVOffset;\r\nattribute vec3 vPosition;\r\nattribute vec2 vTexCoord;\r\nattribute vec2 vTangent;\r\nattribute vec2 vBitangent;\r\nattribute vec2 vNormal;\r\n\r\n#ifdef VERTEX_COLOR\r\n attribute vec4 vColor;\r\n#endif\r\n\r\n#ifdef TEXCOORD_SECONDARY\r\n attribute vec2 vTexCoord2;\r\n#endif\r\n\r\nvarying highp vec3 dv;\r\nvarying mediump vec2 d;\r\nvarying mediump vec3 dA;\r\nvarying mediump vec3 dB;\r\nvarying mediump vec3 dC;\r\n\r\n#ifdef VERTEX_COLOR\r\n varying lowp vec4 dD;\r\n#endif\r\n\r\n#ifdef TEXCOORD_SECONDARY\r\n varying mediump vec2 dE;\r\n#endif\r\n\r\nvec3 iW(vec2 v){\r\n bool iX=(v.y>(32767.1/65535.0));\r\n v.y=iX?(v.y-(32768.0/65535.0)):\r\n v.y;vec3 r;r.xy=(2.0*65535.0/32767.0)*v-vec2(1.0);\r\n r.z=sqrt(clamp(1.0-dot(r.xy,r.xy),0.0,1.0));\r\n r.z=iX?-r.z:r.z;\r\n return r;\r\n}\r\n\r\nvec4 h(mat4 i,vec3 p){\r\n return i[0]*p.x+(i[1]*p.y+(i[2]*p.z+i[3]));\r\n}\r\n\r\nvec3 u(mat4 i,vec3 v){\r\n return i[0].xyz*v.x+i[1].xyz*v.y+i[2].xyz*v.z;\r\n}\r\n \r\nvoid main(void){\r\n gl_Position=h(uModelViewProjectionMatrix,vPosition.xyz);\r\n d=vTexCoord+uUVOffset;\r\n dA=u(uSkyMatrix,iW(vTangent));\r\n dB=u(uSkyMatrix,iW(vBitangent));\r\n dC=u(uSkyMatrix,iW(vNormal));\r\n dv=h(uSkyMatrix,vPosition.xyz).xyz;\r\n\r\n #ifdef VERTEX_COLOR\r\n dD=vColor;\r\n #endif\r\n\r\n #ifdef TEXCOORD_SECONDARY\r\n dE=vTexCoord2;\r\n #endif\r\n}\r\n ";
  4167. var postaa = "precision mediump float;\r\nuniform sampler2D tInput;\r\nvarying vec2 j;\r\nvoid main(void){\r\n gl_FragColor=texture2D(tInput,j);\r\n}";
  4168. var postfrag = "precision mediump float;\r\nuniform sampler2D tInput;\r\n\r\n#ifdef BLOOM\r\n uniform sampler2D tBloom;\r\n#endif\r\n\r\n#ifdef GRAIN\r\n uniform sampler2D tGrain;\r\n#endif\r\n\r\n#ifdef COLOR_LUT\r\n uniform sampler2D tLUT;\r\n#endif\r\n\r\nuniform vec3 uScale;\r\nuniform vec3 uBias;\r\nuniform vec3 uSaturation;\r\nuniform vec4 uSharpenKernel;\r\nuniform vec3 uSharpness;\r\nuniform vec3 uBloomColor;\r\nuniform vec4 uVignetteAspect;\r\nuniform vec4 uVignette;\r\nuniform vec4 uGrainCoord;\r\nuniform vec2 uGrainScaleBias;\r\nvarying vec2 j;\r\n\r\nvec3 iY(vec3 c){\r\n vec3 iZ=sqrt(c);\r\n return(iZ-iZ*c)+c*(0.4672*c+vec3(0.5328));\r\n}\r\n \r\nvoid main(void){\r\n vec4 jc=texture2D(tInput,j);\r\n vec3 c=jc.xyz;\r\n\r\n #ifdef SHARPEN\r\n vec3 hM=texture2D(tInput,j+uSharpenKernel.xy).xyz;\r\n hM+=texture2D(tInput,j-uSharpenKernel.xy).xyz;\r\n hM+=texture2D(tInput,j+uSharpenKernel.zw).xyz;\r\n hM+=texture2D(tInput,j-uSharpenKernel.zw).xyz;\r\n vec3 jd=uSharpness.x*c-uSharpness.y*hM;\r\n c+=clamp(jd,-uSharpness.z,uSharpness.z);\r\n #endif\r\n\r\n #ifdef BLOOM\r\n c+=uBloomColor*texture2D(tBloom,j).xyz;\r\n #endif\r\n\r\n #ifdef VIGNETTE\r\n vec2 je=j*uVignetteAspect.xy-uVignetteAspect.zw;\r\n vec3 v=clamp(vec3(1.0,1.0,1.0)-uVignette.xyz*dot(je,je),0.0,1.0);\r\n vec3 jf=v*v;jf*=v;c*=mix(v,jf,uVignette.w);\r\n #endif\r\n\r\n #ifdef SATURATION\r\n float gray=dot(c,vec3(0.3,0.59,0.11));\r\n c=mix(vec3(gray,gray,gray),c,uSaturation);\r\n #endif\r\n\r\n #ifdef CONTRAST\r\n c=c*uScale+uBias;\r\n #endif\r\n\r\n #ifdef GRAIN\r\n float jh=uGrainScaleBias.x*texture2D(tGrain,j*uGrainCoord.xy+uGrainCoord.zw).x+uGrainScaleBias.y;c+=c*jh;\r\n #endif\r\n\r\n #ifdef REINHARD\r\n {\r\n c*=1.8;float ji=dot(c,vec3(0.3333));\r\n c=clamp(c/(1.0+ji),0.0,1.0);\r\n }\r\n #elif defined(HEJL)\r\n {\r\n const highp float jj=0.22,jk=0.3,jl=.1,jm=0.2,jn=.01,jo=0.3;\r\n const highp float ju=1.25;\r\n highp vec3 eO=max(vec3(0.0),c-vec3(.004));\r\n c=(eO*((ju*jj)*eO+ju*vec3(jl*jk,jl*jk,jl*jk))+ju*vec3(jm*jn,jm*jn,jm*jn))/(eO*(jj*eO+vec3(jk,jk,jk))+vec3(jm*jo,jm*jo,jm*jo))-ju*vec3(jn/jo,jn/jo,jn/jo);\r\n }\r\n #elif defined(ACES)\r\n {\r\n ec3 a=c*(c+0.0245786)-0.000090537;vec3 b=c*(0.983729*c+0.4329510)+0.238081;c=a/b;\r\n }\r\n #endif\r\n\r\n #ifdef COLOR_LUT\r\n c=clamp(c,0.0,1.0);\r\n c=(255.0/256.0)*c+vec3(0.5/256.0);\r\n c.x=texture2D(tLUT,c.xx).x;\r\n c.y=texture2D(tLUT,c.yy).y;\r\n c.z=texture2D(tLUT,c.zz).z;c*=c;\r\n #endif\r\n \r\n gl_FragColor.xyz=iY(c);\r\n gl_FragColor.w=jc.w;\r\n}";
  4169. var postvert = "precision highp float;\r\nattribute vec2 vCoord;\r\nvarying vec2 j;\r\nvoid main(void){\r\n j=vCoord;gl_Position.xy=2.0*vCoord-vec2(1.0,1.0);\r\n gl_Position.zw=vec2(0.0,1.0);\r\n}";
  4170. var shadowfloorfrag = "precision mediump float;\r\nvarying highp vec3 dv;\r\nvarying mediump vec2 jv;\r\nvarying mediump vec3 dC;\r\nuniform vec3 uShadowCatcherParams;\r\n\r\n#ifdef LIGHT_COUNT\r\n uniform vec4 uLightPositions[LIGHT_COUNT];\r\n uniform vec3 uLightDirections[LIGHT_COUNT];\r\n uniform vec3 uLightColors[LIGHT_COUNT];\r\n uniform vec3 uLightParams[LIGHT_COUNT];\r\n uniform vec3 uLightSpot[LIGHT_COUNT];\r\n#endif\r\n\r\n#define saturate(x) clamp( x, 0.0, 1.0 )\r\n#define SHADOW_COMPARE(a,b) ((a) < (b) || (b) >= 1.0 ? 1.0 : 0.0)\r\n#define SHADOW_CLIP(c,v) ((c.x<0.0 || c.x>1.0 || c.y<0.0 || c.y>1.0) ? 1.0 : v)\r\n\r\n#include <matshadows.glsl>\r\n\r\nvoid main(void){\r\n ev eA;eB(eA,SHADOW_KERNEL);\r\n vec3 jA=vec3(0.0,0.0,0.0);\r\n vec3 jB=vec3(0.0,0.0,0.0);\r\n for(int k=0;k<SHADOW_COUNT;++k){\r\n vec3 eH=uLightPositions[k].xyz-dv*uLightPositions[k].w;\r\n float eI=inversesqrt(dot(eH,eH));\r\n eH*=eI;\r\n float a=saturate(uLightParams[k].z/eI);\r\n a=1.0+a*(uLightParams[k].x+uLightParams[k].y*a);\r\n float s=saturate(dot(eH,uLightDirections[k]));\r\n s=saturate(uLightSpot[k].y-uLightSpot[k].z*(1.0-s*s));\r\n vec3 jC=mix(uLightColors[k].xyz,vec3(1.0,1.0,1.0),uShadowCatcherParams.x);\r\n vec3 jD=(a*s)*jC;jD*=saturate(dot(eH,dC));\r\n jB+=jD;jA+=jD*eA.eL[k];\r\n }\r\n float jE=1.0e-4;vec3 r=(jA+jE)/(jB+jE);\r\n float jF=saturate(dot(jv,jv))*uShadowCatcherParams.z;\r\n r=mix(r,vec3(1.0,1.0,1.0),jF);\r\n r=mix(vec3(1.0,1.0,1.0),r,uShadowCatcherParams.y);\r\n gl_FragColor.xyz=r;\r\n gl_FragColor.w=1.0;\r\n}";
  4171. var shadowfloorvert = "precision highp float;\r\nuniform mat4 uModelViewProjectionMatrix;\r\nuniform mat4 uModelSkyMatrix;\r\nuniform float uScale;\r\nattribute vec3 vPosition;\r\nvarying highp vec3 dv;\r\nvarying mediump vec2 jv;\r\nvarying mediump vec3 dC;\r\n\r\nvec4 h(mat4 i,vec3 p){\r\n return i[0]*p.x+(i[1]*p.y+(i[2]*p.z+i[3]));\r\n}\r\n\r\nvoid main(void){\r\n jv=vPosition.xz;\r\n dC=normalize(uModelSkyMatrix[1].xyz);\r\n dv=h(uModelSkyMatrix,vPosition).xyz;\r\n gl_Position=h(uModelViewProjectionMatrix,vPosition);\r\n}";
  4172. var shadowfrag = "precision highp float;\r\nvarying vec2 jG;\r\n\r\n#ifdef ALPHA_TEST\r\n varying mediump vec2 d;\r\n uniform sampler2D tAlbedo;\r\n#endif\r\n\r\nvec3 jH(float v){\r\n vec4 jI=vec4(1.0,255.0,65025.0,16581375.0)*v;\r\n jI=fract(jI);\r\n jI.xyz-=jI.yzw*(1.0/255.0);\r\n return jI.xyz;\r\n}\r\n\r\nvoid main(void){\r\n \r\n #ifdef ALPHA_TEST\r\n float e=texture2D(tAlbedo,d).a;\r\n if(e<0.5){\r\n discard;\r\n }\r\n #endif\r\n\r\n #ifdef SHADOW_NATIVE_DEPTH\r\n gl_FragColor.xyz=vec3(0.0,0.0,0.0);\r\n #else\r\n gl_FragColor.xyz=jH((jG.x/jG.y)*0.5+0.5);\r\n #endif\r\n \r\n gl_FragColor.w=0.0;\r\n}";
  4173. var shadowvert = "precision highp float;\r\nattribute vec3 vPosition;\r\nattribute vec2 vTexCoord;\r\nuniform mat4 uMeshTransform;\r\nuniform mat4 uViewProjection;\r\nvarying vec2 jG;\r\n\r\n#ifdef ALPHA_TEST\r\n varying mediump vec2 d;\r\n uniform vec2 uUVOffset;\r\n#endif\r\n\r\nvec4 h(mat4 i,vec3 p){\r\n return i[0]*p.x+(i[1]*p.y+(i[2]*p.z+i[3]));\r\n}\r\n\r\nvoid main(void){\r\n vec3 p=h(uMeshTransform,vPosition).xyz;\r\n gl_Position=h(uViewProjection,p);\r\n jG=gl_Position.zw;\r\n \r\n #ifdef ALPHA_TEST\r\n d=vTexCoord+uUVOffset;\r\n #endif\r\n}";
  4174. var sky = "precision highp float;\r\nuniform sampler2D tSkyTexture;\r\nuniform float uAlpha;\r\nvarying vec2 d;\r\n\r\nvoid main(void){\r\n vec3 r=texture2D(tSkyTexture,d).xyz;\r\n gl_FragColor.xyz=r*r;\r\n gl_FragColor.w=uAlpha;\r\n}";
  4175. var skySH = "precision mediump float;\r\nuniform vec4 uSkyCoefficients[9];\r\nuniform float uAlpha;\r\nvarying vec3 jJ;\r\n\r\nvoid main(void){\r\n vec3 G=normalize(jJ);\r\n vec3 r=uSkyCoefficients[0].xyz;\r\n r+=uSkyCoefficients[1].xyz*G.y;\r\n r+=uSkyCoefficients[2].xyz*G.z;\r\n r+=uSkyCoefficients[3].xyz*G.x;\r\n vec3 swz=G.yyz*G.xzx;\r\n r+=uSkyCoefficients[4].xyz*swz.x;\r\n r+=uSkyCoefficients[5].xyz*swz.y;\r\n r+=uSkyCoefficients[7].xyz*swz.z;\r\n vec3 sqr=G*G;r+=uSkyCoefficients[6].xyz*(3.0*sqr.z-1.0);\r\n r+=uSkyCoefficients[8].xyz*(sqr.x-sqr.y);\r\n gl_FragColor.xyz=r;\r\n gl_FragColor.w=uAlpha;\r\n}";
  4176. var skyvert = "precision highp float;\r\nuniform mat4 uInverseSkyMatrix;\r\nuniform mat4 uViewProjection;\r\nattribute vec3 vPosition;\r\nattribute vec2 vTexCoord;\r\n\r\n#if SKYMODE == 3\r\n varying vec3 jJ;\r\n#else\r\n varying vec2 d;\r\n#endif\r\n\r\nvec4 h(mat4 i,vec3 p){\r\n return i[0]*p.x+(i[1]*p.y+(i[2]*p.z+i[3]));\r\n}\r\n\r\nvec4 u(mat4 i,vec3 v){\r\n return i[0]*v.x+i[1]*v.y+i[2]*v.z;\r\n}\r\n\r\nvoid main(void){\r\n vec3 p=h(uInverseSkyMatrix,vPosition).xyz;\r\n gl_Position=u(uViewProjection,p);\r\n gl_Position.z-=(1.0/65535.0)*gl_Position.w;\r\n\r\n #if SKYMODE == 3\r\n jJ=vPosition;jJ.xy+=1e-20*vTexCoord;\r\n #else\r\n d=vTexCoord;\r\n #endif\r\n}";
  4177. var wirefrag = "precision highp float;\r\nuniform vec4 uStripParams;\r\nvoid main(void){\r\n vec2 c=gl_FragCoord.xy*uStripParams.xy-vec2(1.0,1.0);\r\n c.x+=0.25*c.y;float a=c.x<uStripParams.z?0.0:0.9;\r\n a=c.x<uStripParams.w?a:0.0;\r\n gl_FragColor=vec4(0.0,0.0,0.0,a);\r\n}";
  4178. var wirevert = "precision highp float;\r\nuniform mat4 uModelViewProjectionMatrix;\r\nattribute vec3 vPosition;\r\n\r\nvec4 h(mat4 i,vec3 p){\r\n return i[0]*p.x+(i[1]*p.y+(i[2]*p.z+i[3]));\r\n}\r\n\r\nvoid main(void){\r\n gl_Position=h(uModelViewProjectionMatrix,vPosition);\r\n gl_Position.z+=-0.00005*gl_Position.w;\r\n}";
  4179. var ShaderChunk = {
  4180. alphamap_fragment: alphamap_fragment,
  4181. alphamap_pars_fragment: alphamap_pars_fragment,
  4182. alphatest_fragment: alphatest_fragment,
  4183. aomap_fragment: aomap_fragment,
  4184. aomap_pars_fragment: aomap_pars_fragment,
  4185. begin_vertex: begin_vertex,
  4186. beginnormal_vertex: beginnormal_vertex,
  4187. bsdfs: bsdfs,
  4188. bumpmap_pars_fragment: bumpmap_pars_fragment,
  4189. clipping_planes_fragment: clipping_planes_fragment,
  4190. clipping_planes_pars_fragment: clipping_planes_pars_fragment,
  4191. clipping_planes_pars_vertex: clipping_planes_pars_vertex,
  4192. clipping_planes_vertex: clipping_planes_vertex,
  4193. color_fragment: color_fragment,
  4194. color_pars_fragment: color_pars_fragment,
  4195. color_pars_vertex: color_pars_vertex,
  4196. color_vertex: color_vertex,
  4197. common: common,
  4198. cube_uv_reflection_fragment: cube_uv_reflection_fragment,
  4199. defaultnormal_vertex: defaultnormal_vertex,
  4200. displacementmap_pars_vertex: displacementmap_pars_vertex,
  4201. displacementmap_vertex: displacementmap_vertex,
  4202. emissivemap_fragment: emissivemap_fragment,
  4203. emissivemap_pars_fragment: emissivemap_pars_fragment,
  4204. encodings_fragment: encodings_fragment,
  4205. encodings_pars_fragment: encodings_pars_fragment,
  4206. envmap_fragment: envmap_fragment,
  4207. envmap_pars_fragment: envmap_pars_fragment,
  4208. envmap_pars_vertex: envmap_pars_vertex,
  4209. envmap_physical_pars_fragment: envmap_physical_pars_fragment,
  4210. envmap_vertex: envmap_vertex,
  4211. fog_vertex: fog_vertex,
  4212. fog_pars_vertex: fog_pars_vertex,
  4213. fog_fragment: fog_fragment,
  4214. fog_pars_fragment: fog_pars_fragment,
  4215. gradientmap_pars_fragment: gradientmap_pars_fragment,
  4216. lightmap_fragment: lightmap_fragment,
  4217. lightmap_pars_fragment: lightmap_pars_fragment,
  4218. lights_lambert_vertex: lights_lambert_vertex,
  4219. lights_pars_begin: lights_pars_begin,
  4220. lights_phong_fragment: lights_phong_fragment,
  4221. lights_phong_pars_fragment: lights_phong_pars_fragment,
  4222. lights_physical_fragment: lights_physical_fragment,
  4223. lights_physical_pars_fragment: lights_physical_pars_fragment,
  4224. lights_fragment_begin: lights_fragment_begin,
  4225. lights_fragment_maps: lights_fragment_maps,
  4226. lights_fragment_end: lights_fragment_end,
  4227. logdepthbuf_fragment: logdepthbuf_fragment,
  4228. logdepthbuf_pars_fragment: logdepthbuf_pars_fragment,
  4229. logdepthbuf_pars_vertex: logdepthbuf_pars_vertex,
  4230. logdepthbuf_vertex: logdepthbuf_vertex,
  4231. map_fragment: map_fragment,
  4232. map_pars_fragment: map_pars_fragment,
  4233. map_particle_fragment: map_particle_fragment,
  4234. map_particle_pars_fragment: map_particle_pars_fragment,
  4235. metalnessmap_fragment: metalnessmap_fragment,
  4236. metalnessmap_pars_fragment: metalnessmap_pars_fragment,
  4237. morphnormal_vertex: morphnormal_vertex,
  4238. morphtarget_pars_vertex: morphtarget_pars_vertex,
  4239. morphtarget_vertex: morphtarget_vertex,
  4240. normal_fragment_begin: normal_fragment_begin,
  4241. normal_fragment_maps: normal_fragment_maps,
  4242. normalmap_pars_fragment: normalmap_pars_fragment,
  4243. packing: packing,
  4244. premultiplied_alpha_fragment: premultiplied_alpha_fragment,
  4245. project_vertex: project_vertex,
  4246. dithering_fragment: dithering_fragment,
  4247. dithering_pars_fragment: dithering_pars_fragment,
  4248. roughnessmap_fragment: roughnessmap_fragment,
  4249. roughnessmap_pars_fragment: roughnessmap_pars_fragment,
  4250. shadowmap_pars_fragment: shadowmap_pars_fragment,
  4251. shadowmap_pars_vertex: shadowmap_pars_vertex,
  4252. shadowmap_vertex: shadowmap_vertex,
  4253. shadowmask_pars_fragment: shadowmask_pars_fragment,
  4254. skinbase_vertex: skinbase_vertex,
  4255. skinning_pars_vertex: skinning_pars_vertex,
  4256. skinning_vertex: skinning_vertex,
  4257. skinnormal_vertex: skinnormal_vertex,
  4258. specularmap_fragment: specularmap_fragment,
  4259. specularmap_pars_fragment: specularmap_pars_fragment,
  4260. tonemapping_fragment: tonemapping_fragment,
  4261. tonemapping_pars_fragment: tonemapping_pars_fragment,
  4262. uv_pars_fragment: uv_pars_fragment,
  4263. uv_pars_vertex: uv_pars_vertex,
  4264. uv_vertex: uv_vertex,
  4265. uv2_pars_fragment: uv2_pars_fragment,
  4266. uv2_pars_vertex: uv2_pars_vertex,
  4267. uv2_vertex: uv2_vertex,
  4268. worldpos_vertex: worldpos_vertex,
  4269. cube_frag: cube_frag,
  4270. cube_vert: cube_vert,
  4271. depth_frag: depth_frag,
  4272. depth_vert: depth_vert,
  4273. distanceRGBA_frag: distanceRGBA_frag,
  4274. distanceRGBA_vert: distanceRGBA_vert,
  4275. equirect_frag: equirect_frag,
  4276. equirect_vert: equirect_vert,
  4277. linedashed_frag: linedashed_frag,
  4278. linedashed_vert: linedashed_vert,
  4279. meshbasic_frag: meshbasic_frag,
  4280. meshbasic_vert: meshbasic_vert,
  4281. meshlambert_frag: meshlambert_frag,
  4282. meshlambert_vert: meshlambert_vert,
  4283. meshphong_frag: meshphong_frag,
  4284. meshphong_vert: meshphong_vert,
  4285. meshphysical_frag: meshphysical_frag,
  4286. meshphysical_vert: meshphysical_vert,
  4287. normal_frag: normal_frag,
  4288. normal_vert: normal_vert,
  4289. points_frag: points_frag,
  4290. points_vert: points_vert,
  4291. shadow_frag: shadow_frag,
  4292. shadow_vert: shadow_vert,
  4293. sprite_frag: sprite_frag,
  4294. sprite_vert: sprite_vert,
  4295. matdither:matdither,
  4296. matlighting:matlighting,
  4297. matmicrofiber:matmicrofiber,
  4298. matsampling:matsampling,
  4299. matshadows:matshadows,
  4300. matskin:matskin,
  4301. matstrips:matstrips,
  4302. alphaprepassfrag:alphaprepassfrag,
  4303. alphaprepassvert:alphaprepassvert,
  4304. bloom:bloom,
  4305. bloomshrink:bloomshrink,
  4306. fogfrag:fogfrag,
  4307. fogvert:fogvert,
  4308. matfrag:matfrag,
  4309. matvert:matvert,
  4310. postaa:postaa,
  4311. postfrag:postfrag,
  4312. postvert:postvert,
  4313. shadowfloorfrag:shadowfloorfrag,
  4314. shadowfloorvert:shadowfloorvert,
  4315. shadowfrag:shadowfrag,
  4316. shadowvert:shadowvert,
  4317. sky:sky,
  4318. skySH:skySH,
  4319. skyvert:skyvert,
  4320. wirefrag:wirefrag,
  4321. wirevert:wirevert
  4322. };
  4323. /**
  4324. * Uniform Utilities
  4325. */
  4326. var UniformsUtils = {
  4327. merge: function ( uniforms ) {
  4328. var merged = {};
  4329. for ( var u = 0; u < uniforms.length; u ++ ) {
  4330. var tmp = this.clone( uniforms[ u ] );
  4331. for ( var p in tmp ) {
  4332. merged[ p ] = tmp[ p ];
  4333. }
  4334. }
  4335. return merged;
  4336. },
  4337. clone: function ( uniforms_src ) {
  4338. var uniforms_dst = {};
  4339. for ( var u in uniforms_src ) {
  4340. uniforms_dst[ u ] = {};
  4341. for ( var p in uniforms_src[ u ] ) {
  4342. var parameter_src = uniforms_src[ u ][ p ];
  4343. if ( parameter_src && ( parameter_src.isColor ||
  4344. parameter_src.isMatrix3 || parameter_src.isMatrix4 ||
  4345. parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||
  4346. parameter_src.isTexture ) ) {
  4347. uniforms_dst[ u ][ p ] = parameter_src.clone();
  4348. } else if ( Array.isArray( parameter_src ) ) {
  4349. uniforms_dst[ u ][ p ] = parameter_src.slice();
  4350. } else {
  4351. uniforms_dst[ u ][ p ] = parameter_src;
  4352. }
  4353. }
  4354. }
  4355. return uniforms_dst;
  4356. }
  4357. };
  4358. /**
  4359. * @author mrdoob / http://mrdoob.com/
  4360. */
  4361. var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,
  4362. 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,
  4363. 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,
  4364. 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,
  4365. 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,
  4366. 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,
  4367. 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,
  4368. 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,
  4369. 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,
  4370. 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,
  4371. 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,
  4372. 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,
  4373. 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,
  4374. 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,
  4375. 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,
  4376. 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,
  4377. 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,
  4378. 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,
  4379. 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,
  4380. 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,
  4381. 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,
  4382. 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,
  4383. 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,
  4384. 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };
  4385. function Color( r, g, b ) {
  4386. if ( g === undefined && b === undefined ) {
  4387. // r is THREE.Color, hex or string
  4388. return this.set( r );
  4389. }
  4390. return this.setRGB( r, g, b );
  4391. }
  4392. Object.assign( Color.prototype, {
  4393. isColor: true,
  4394. r: 1, g: 1, b: 1,
  4395. set: function ( value ) {
  4396. if ( value && value.isColor ) {
  4397. this.copy( value );
  4398. } else if ( typeof value === 'number' ) {
  4399. this.setHex( value );
  4400. } else if ( typeof value === 'string' ) {
  4401. this.setStyle( value );
  4402. }
  4403. return this;
  4404. },
  4405. setScalar: function ( scalar ) {
  4406. this.r = scalar;
  4407. this.g = scalar;
  4408. this.b = scalar;
  4409. return this;
  4410. },
  4411. setHex: function ( hex ) {
  4412. hex = Math.floor( hex );
  4413. this.r = ( hex >> 16 & 255 ) / 255;
  4414. this.g = ( hex >> 8 & 255 ) / 255;
  4415. this.b = ( hex & 255 ) / 255;
  4416. return this;
  4417. },
  4418. setRGB: function ( r, g, b ) {
  4419. this.r = r;
  4420. this.g = g;
  4421. this.b = b;
  4422. return this;
  4423. },
  4424. setHSL: function () {
  4425. function hue2rgb( p, q, t ) {
  4426. if ( t < 0 ) t += 1;
  4427. if ( t > 1 ) t -= 1;
  4428. if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;
  4429. if ( t < 1 / 2 ) return q;
  4430. if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );
  4431. return p;
  4432. }
  4433. return function setHSL( h, s, l ) {
  4434. // h,s,l ranges are in 0.0 - 1.0
  4435. h = _Math.euclideanModulo( h, 1 );
  4436. s = _Math.clamp( s, 0, 1 );
  4437. l = _Math.clamp( l, 0, 1 );
  4438. if ( s === 0 ) {
  4439. this.r = this.g = this.b = l;
  4440. } else {
  4441. var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );
  4442. var q = ( 2 * l ) - p;
  4443. this.r = hue2rgb( q, p, h + 1 / 3 );
  4444. this.g = hue2rgb( q, p, h );
  4445. this.b = hue2rgb( q, p, h - 1 / 3 );
  4446. }
  4447. return this;
  4448. };
  4449. }(),
  4450. setStyle: function ( style ) {
  4451. function handleAlpha( string ) {
  4452. if ( string === undefined ) return;
  4453. if ( parseFloat( string ) < 1 ) {
  4454. console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );
  4455. }
  4456. }
  4457. var m;
  4458. if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) {
  4459. // rgb / hsl
  4460. var color;
  4461. var name = m[ 1 ];
  4462. var components = m[ 2 ];
  4463. switch ( name ) {
  4464. case 'rgb':
  4465. case 'rgba':
  4466. if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
  4467. // rgb(255,0,0) rgba(255,0,0,0.5)
  4468. this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;
  4469. this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;
  4470. this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;
  4471. handleAlpha( color[ 5 ] );
  4472. return this;
  4473. }
  4474. if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
  4475. // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)
  4476. this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;
  4477. this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;
  4478. this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;
  4479. handleAlpha( color[ 5 ] );
  4480. return this;
  4481. }
  4482. break;
  4483. case 'hsl':
  4484. case 'hsla':
  4485. if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
  4486. // hsl(120,50%,50%) hsla(120,50%,50%,0.5)
  4487. var h = parseFloat( color[ 1 ] ) / 360;
  4488. var s = parseInt( color[ 2 ], 10 ) / 100;
  4489. var l = parseInt( color[ 3 ], 10 ) / 100;
  4490. handleAlpha( color[ 5 ] );
  4491. return this.setHSL( h, s, l );
  4492. }
  4493. break;
  4494. }
  4495. } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) {
  4496. // hex color
  4497. var hex = m[ 1 ];
  4498. var size = hex.length;
  4499. if ( size === 3 ) {
  4500. // #ff0
  4501. this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;
  4502. this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;
  4503. this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;
  4504. return this;
  4505. } else if ( size === 6 ) {
  4506. // #ff0000
  4507. this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;
  4508. this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;
  4509. this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;
  4510. return this;
  4511. }
  4512. }
  4513. if ( style && style.length > 0 ) {
  4514. // color keywords
  4515. var hex = ColorKeywords[ style ];
  4516. if ( hex !== undefined ) {
  4517. // red
  4518. this.setHex( hex );
  4519. } else {
  4520. // unknown color
  4521. console.warn( 'THREE.Color: Unknown color ' + style );
  4522. }
  4523. }
  4524. return this;
  4525. },
  4526. clone: function () {
  4527. return new this.constructor( this.r, this.g, this.b );
  4528. },
  4529. copy: function ( color ) {
  4530. this.r = color.r;
  4531. this.g = color.g;
  4532. this.b = color.b;
  4533. return this;
  4534. },
  4535. copyGammaToLinear: function ( color, gammaFactor ) {
  4536. if ( gammaFactor === undefined ) gammaFactor = 2.0;
  4537. this.r = Math.pow( color.r, gammaFactor );
  4538. this.g = Math.pow( color.g, gammaFactor );
  4539. this.b = Math.pow( color.b, gammaFactor );
  4540. return this;
  4541. },
  4542. copyLinearToGamma: function ( color, gammaFactor ) {
  4543. if ( gammaFactor === undefined ) gammaFactor = 2.0;
  4544. var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;
  4545. this.r = Math.pow( color.r, safeInverse );
  4546. this.g = Math.pow( color.g, safeInverse );
  4547. this.b = Math.pow( color.b, safeInverse );
  4548. return this;
  4549. },
  4550. convertGammaToLinear: function ( gammaFactor ) {
  4551. this.copyGammaToLinear( this, gammaFactor );
  4552. return this;
  4553. },
  4554. convertLinearToGamma: function ( gammaFactor ) {
  4555. this.copyLinearToGamma( this, gammaFactor );
  4556. return this;
  4557. },
  4558. copySRGBToLinear: function () {
  4559. function SRGBToLinear( c ) {
  4560. return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );
  4561. }
  4562. return function copySRGBToLinear( color ) {
  4563. this.r = SRGBToLinear( color.r );
  4564. this.g = SRGBToLinear( color.g );
  4565. this.b = SRGBToLinear( color.b );
  4566. return this;
  4567. };
  4568. }(),
  4569. copyLinearToSRGB: function () {
  4570. function LinearToSRGB( c ) {
  4571. return ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;
  4572. }
  4573. return function copyLinearToSRGB( color ) {
  4574. this.r = LinearToSRGB( color.r );
  4575. this.g = LinearToSRGB( color.g );
  4576. this.b = LinearToSRGB( color.b );
  4577. return this;
  4578. };
  4579. }(),
  4580. convertSRGBToLinear: function () {
  4581. this.copySRGBToLinear( this );
  4582. return this;
  4583. },
  4584. convertLinearToSRGB: function () {
  4585. this.copyLinearToSRGB( this );
  4586. return this;
  4587. },
  4588. getHex: function () {
  4589. return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;
  4590. },
  4591. getHexString: function () {
  4592. return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );
  4593. },
  4594. getHSL: function ( target ) {
  4595. // h,s,l ranges are in 0.0 - 1.0
  4596. if ( target === undefined ) {
  4597. console.warn( 'THREE.Color: .getHSL() target is now required' );
  4598. target = { h: 0, s: 0, l: 0 };
  4599. }
  4600. var r = this.r, g = this.g, b = this.b;
  4601. var max = Math.max( r, g, b );
  4602. var min = Math.min( r, g, b );
  4603. var hue, saturation;
  4604. var lightness = ( min + max ) / 2.0;
  4605. if ( min === max ) {
  4606. hue = 0;
  4607. saturation = 0;
  4608. } else {
  4609. var delta = max - min;
  4610. saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );
  4611. switch ( max ) {
  4612. case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;
  4613. case g: hue = ( b - r ) / delta + 2; break;
  4614. case b: hue = ( r - g ) / delta + 4; break;
  4615. }
  4616. hue /= 6;
  4617. }
  4618. target.h = hue;
  4619. target.s = saturation;
  4620. target.l = lightness;
  4621. return target;
  4622. },
  4623. getStyle: function () {
  4624. return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';
  4625. },
  4626. offsetHSL: function () {
  4627. var hsl = {};
  4628. return function ( h, s, l ) {
  4629. this.getHSL( hsl );
  4630. hsl.h += h; hsl.s += s; hsl.l += l;
  4631. this.setHSL( hsl.h, hsl.s, hsl.l );
  4632. return this;
  4633. };
  4634. }(),
  4635. add: function ( color ) {
  4636. this.r += color.r;
  4637. this.g += color.g;
  4638. this.b += color.b;
  4639. return this;
  4640. },
  4641. addColors: function ( color1, color2 ) {
  4642. this.r = color1.r + color2.r;
  4643. this.g = color1.g + color2.g;
  4644. this.b = color1.b + color2.b;
  4645. return this;
  4646. },
  4647. addScalar: function ( s ) {
  4648. this.r += s;
  4649. this.g += s;
  4650. this.b += s;
  4651. return this;
  4652. },
  4653. sub: function ( color ) {
  4654. this.r = Math.max( 0, this.r - color.r );
  4655. this.g = Math.max( 0, this.g - color.g );
  4656. this.b = Math.max( 0, this.b - color.b );
  4657. return this;
  4658. },
  4659. multiply: function ( color ) {
  4660. this.r *= color.r;
  4661. this.g *= color.g;
  4662. this.b *= color.b;
  4663. return this;
  4664. },
  4665. multiplyScalar: function ( s ) {
  4666. this.r *= s;
  4667. this.g *= s;
  4668. this.b *= s;
  4669. return this;
  4670. },
  4671. lerp: function ( color, alpha ) {
  4672. this.r += ( color.r - this.r ) * alpha;
  4673. this.g += ( color.g - this.g ) * alpha;
  4674. this.b += ( color.b - this.b ) * alpha;
  4675. return this;
  4676. },
  4677. equals: function ( c ) {
  4678. return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );
  4679. },
  4680. fromArray: function ( array, offset ) {
  4681. if ( offset === undefined ) offset = 0;
  4682. this.r = array[ offset ];
  4683. this.g = array[ offset + 1 ];
  4684. this.b = array[ offset + 2 ];
  4685. return this;
  4686. },
  4687. toArray: function ( array, offset ) {
  4688. if ( array === undefined ) array = [];
  4689. if ( offset === undefined ) offset = 0;
  4690. array[ offset ] = this.r;
  4691. array[ offset + 1 ] = this.g;
  4692. array[ offset + 2 ] = this.b;
  4693. return array;
  4694. },
  4695. toJSON: function () {
  4696. return this.getHex();
  4697. }
  4698. } );
  4699. /**
  4700. * Uniforms library for shared webgl shaders
  4701. */
  4702. var UniformsLib = {
  4703. common: {
  4704. diffuse: { value: new Color( 0xeeeeee ) },
  4705. opacity: { value: 1.0 },
  4706. map: { value: null },
  4707. uvTransform: { value: new Matrix3() },
  4708. alphaMap: { value: null },
  4709. },
  4710. specularmap: {
  4711. specularMap: { value: null },
  4712. },
  4713. envmap: {
  4714. envMap: { value: null },
  4715. flipEnvMap: { value: - 1 },
  4716. reflectivity: { value: 1.0 },
  4717. refractionRatio: { value: 0.98 },
  4718. maxMipLevel: { value: 0 }
  4719. },
  4720. aomap: {
  4721. aoMap: { value: null },
  4722. aoMapIntensity: { value: 1 }
  4723. },
  4724. lightmap: {
  4725. lightMap: { value: null },
  4726. lightMapIntensity: { value: 1 }
  4727. },
  4728. emissivemap: {
  4729. emissiveMap: { value: null }
  4730. },
  4731. bumpmap: {
  4732. bumpMap: { value: null },
  4733. bumpScale: { value: 1 }
  4734. },
  4735. normalmap: {
  4736. normalMap: { value: null },
  4737. normalScale: { value: new Vector2( 1, 1 ) }
  4738. },
  4739. displacementmap: {
  4740. displacementMap: { value: null },
  4741. displacementScale: { value: 1 },
  4742. displacementBias: { value: 0 }
  4743. },
  4744. roughnessmap: {
  4745. roughnessMap: { value: null }
  4746. },
  4747. metalnessmap: {
  4748. metalnessMap: { value: null }
  4749. },
  4750. gradientmap: {
  4751. gradientMap: { value: null }
  4752. },
  4753. fog: {
  4754. fogDensity: { value: 0.00025 },
  4755. fogNear: { value: 1 },
  4756. fogFar: { value: 2000 },
  4757. fogColor: { value: new Color( 0xffffff ) }
  4758. },
  4759. lights: {
  4760. ambientLightColor: { value: [] },
  4761. directionalLights: { value: [], properties: {
  4762. direction: {},
  4763. color: {},
  4764. shadow: {},
  4765. shadowBias: {},
  4766. shadowRadius: {},
  4767. shadowMapSize: {}
  4768. } },
  4769. directionalShadowMap: { value: [] },
  4770. directionalShadowMatrix: { value: [] },
  4771. spotLights: { value: [], properties: {
  4772. color: {},
  4773. position: {},
  4774. direction: {},
  4775. distance: {},
  4776. coneCos: {},
  4777. penumbraCos: {},
  4778. decay: {},
  4779. shadow: {},
  4780. shadowBias: {},
  4781. shadowRadius: {},
  4782. shadowMapSize: {}
  4783. } },
  4784. spotShadowMap: { value: [] },
  4785. spotShadowMatrix: { value: [] },
  4786. pointLights: { value: [], properties: {
  4787. color: {},
  4788. position: {},
  4789. decay: {},
  4790. distance: {},
  4791. shadow: {},
  4792. shadowBias: {},
  4793. shadowRadius: {},
  4794. shadowMapSize: {},
  4795. shadowCameraNear: {},
  4796. shadowCameraFar: {}
  4797. } },
  4798. pointShadowMap: { value: [] },
  4799. pointShadowMatrix: { value: [] },
  4800. hemisphereLights: { value: [], properties: {
  4801. direction: {},
  4802. skyColor: {},
  4803. groundColor: {}
  4804. } },
  4805. // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src
  4806. rectAreaLights: { value: [], properties: {
  4807. color: {},
  4808. position: {},
  4809. width: {},
  4810. height: {}
  4811. } }
  4812. },
  4813. points: {
  4814. diffuse: { value: new Color( 0xeeeeee ) },
  4815. opacity: { value: 1.0 },
  4816. size: { value: 1.0 },
  4817. scale: { value: 1.0 },
  4818. map: { value: null },
  4819. uvTransform: { value: new Matrix3() }
  4820. },
  4821. sprite: {
  4822. diffuse: { value: new Color( 0xeeeeee ) },
  4823. opacity: { value: 1.0 },
  4824. center: { value: new Vector2( 0.5, 0.5 ) },
  4825. rotation: { value: 0.0 },
  4826. map: { value: null },
  4827. uvTransform: { value: new Matrix3() }
  4828. }
  4829. };
  4830. /**
  4831. * @author alteredq / http://alteredqualia.com/
  4832. * @author mrdoob / http://mrdoob.com/
  4833. * @author mikael emtinger / http://gomo.se/
  4834. */
  4835. var ShaderLib = {
  4836. basic: {
  4837. uniforms: UniformsUtils.merge( [
  4838. UniformsLib.common,
  4839. UniformsLib.specularmap,
  4840. UniformsLib.envmap,
  4841. UniformsLib.aomap,
  4842. UniformsLib.lightmap,
  4843. UniformsLib.fog
  4844. ] ),
  4845. vertexShader: ShaderChunk.meshbasic_vert,
  4846. fragmentShader: ShaderChunk.meshbasic_frag
  4847. },
  4848. lambert: {
  4849. uniforms: UniformsUtils.merge( [
  4850. UniformsLib.common,
  4851. UniformsLib.specularmap,
  4852. UniformsLib.envmap,
  4853. UniformsLib.aomap,
  4854. UniformsLib.lightmap,
  4855. UniformsLib.emissivemap,
  4856. UniformsLib.fog,
  4857. UniformsLib.lights,
  4858. {
  4859. emissive: { value: new Color( 0x000000 ) }
  4860. }
  4861. ] ),
  4862. vertexShader: ShaderChunk.meshlambert_vert,
  4863. fragmentShader: ShaderChunk.meshlambert_frag
  4864. },
  4865. phong: {
  4866. uniforms: UniformsUtils.merge( [
  4867. UniformsLib.common,
  4868. UniformsLib.specularmap,
  4869. UniformsLib.envmap,
  4870. UniformsLib.aomap,
  4871. UniformsLib.lightmap,
  4872. UniformsLib.emissivemap,
  4873. UniformsLib.bumpmap,
  4874. UniformsLib.normalmap,
  4875. UniformsLib.displacementmap,
  4876. UniformsLib.gradientmap,
  4877. UniformsLib.fog,
  4878. UniformsLib.lights,
  4879. {
  4880. emissive: { value: new Color( 0x000000 ) },
  4881. specular: { value: new Color( 0x111111 ) },
  4882. shininess: { value: 30 }
  4883. }
  4884. ] ),
  4885. vertexShader: ShaderChunk.meshphong_vert,
  4886. fragmentShader: ShaderChunk.meshphong_frag
  4887. },
  4888. standard: {
  4889. uniforms: UniformsUtils.merge( [
  4890. UniformsLib.common,
  4891. UniformsLib.envmap,
  4892. UniformsLib.aomap,
  4893. UniformsLib.lightmap,
  4894. UniformsLib.emissivemap,
  4895. UniformsLib.bumpmap,
  4896. UniformsLib.normalmap,
  4897. UniformsLib.displacementmap,
  4898. UniformsLib.roughnessmap,
  4899. UniformsLib.metalnessmap,
  4900. UniformsLib.fog,
  4901. UniformsLib.lights,
  4902. {
  4903. emissive: { value: new Color( 0x000000 ) },
  4904. roughness: { value: 0.5 },
  4905. metalness: { value: 0.5 },
  4906. envMapIntensity: { value: 1 } // temporary
  4907. }
  4908. ] ),
  4909. vertexShader: ShaderChunk.meshphysical_vert,
  4910. fragmentShader: ShaderChunk.meshphysical_frag
  4911. },
  4912. points: {
  4913. uniforms: UniformsUtils.merge( [
  4914. UniformsLib.points,
  4915. UniformsLib.fog
  4916. ] ),
  4917. vertexShader: ShaderChunk.points_vert,
  4918. fragmentShader: ShaderChunk.points_frag
  4919. },
  4920. dashed: {
  4921. uniforms: UniformsUtils.merge( [
  4922. UniformsLib.common,
  4923. UniformsLib.fog,
  4924. {
  4925. scale: { value: 1 },
  4926. dashSize: { value: 1 },
  4927. totalSize: { value: 2 }
  4928. }
  4929. ] ),
  4930. vertexShader: ShaderChunk.linedashed_vert,
  4931. fragmentShader: ShaderChunk.linedashed_frag
  4932. },
  4933. depth: {
  4934. uniforms: UniformsUtils.merge( [
  4935. UniformsLib.common,
  4936. UniformsLib.displacementmap
  4937. ] ),
  4938. vertexShader: ShaderChunk.depth_vert,
  4939. fragmentShader: ShaderChunk.depth_frag
  4940. },
  4941. normal: {
  4942. uniforms: UniformsUtils.merge( [
  4943. UniformsLib.common,
  4944. UniformsLib.bumpmap,
  4945. UniformsLib.normalmap,
  4946. UniformsLib.displacementmap,
  4947. {
  4948. opacity: { value: 1.0 }
  4949. }
  4950. ] ),
  4951. vertexShader: ShaderChunk.normal_vert,
  4952. fragmentShader: ShaderChunk.normal_frag
  4953. },
  4954. sprite: {
  4955. uniforms: UniformsUtils.merge( [
  4956. UniformsLib.sprite,
  4957. UniformsLib.fog
  4958. ] ),
  4959. vertexShader: ShaderChunk.sprite_vert,
  4960. fragmentShader: ShaderChunk.sprite_frag
  4961. },
  4962. /* -------------------------------------------------------------------------
  4963. // Cube map shader
  4964. ------------------------------------------------------------------------- */
  4965. cube: {
  4966. uniforms: {
  4967. tCube: { value: null },
  4968. tFlip: { value: - 1 },
  4969. opacity: { value: 1.0 }
  4970. },
  4971. vertexShader: ShaderChunk.cube_vert,
  4972. fragmentShader: ShaderChunk.cube_frag
  4973. },
  4974. equirect: {
  4975. uniforms: {
  4976. tEquirect: { value: null },
  4977. },
  4978. vertexShader: ShaderChunk.equirect_vert,
  4979. fragmentShader: ShaderChunk.equirect_frag
  4980. },
  4981. distanceRGBA: {
  4982. uniforms: UniformsUtils.merge( [
  4983. UniformsLib.common,
  4984. UniformsLib.displacementmap,
  4985. {
  4986. referencePosition: { value: new Vector3() },
  4987. nearDistance: { value: 1 },
  4988. farDistance: { value: 1000 }
  4989. }
  4990. ] ),
  4991. vertexShader: ShaderChunk.distanceRGBA_vert,
  4992. fragmentShader: ShaderChunk.distanceRGBA_frag
  4993. },
  4994. shadow: {
  4995. uniforms: UniformsUtils.merge( [
  4996. UniformsLib.lights,
  4997. UniformsLib.fog,
  4998. {
  4999. color: { value: new Color( 0x00000 ) },
  5000. opacity: { value: 1.0 }
  5001. },
  5002. ] ),
  5003. vertexShader: ShaderChunk.shadow_vert,
  5004. fragmentShader: ShaderChunk.shadow_frag
  5005. }
  5006. };
  5007. ShaderLib.physical = {
  5008. uniforms: UniformsUtils.merge( [
  5009. ShaderLib.standard.uniforms,
  5010. {
  5011. clearCoat: { value: 0 },
  5012. clearCoatRoughness: { value: 0 }
  5013. }
  5014. ] ),
  5015. vertexShader: ShaderChunk.meshphysical_vert,
  5016. fragmentShader: ShaderChunk.meshphysical_frag
  5017. };
  5018. /**
  5019. * @author mrdoob / http://mrdoob.com/
  5020. */
  5021. function WebGLAnimation() {
  5022. var context = null;
  5023. var isAnimating = false;
  5024. var animationLoop = null;
  5025. function onAnimationFrame( time, frame ) {
  5026. if ( isAnimating === false ) return;
  5027. animationLoop( time, frame );
  5028. context.requestAnimationFrame( onAnimationFrame );
  5029. }
  5030. return {
  5031. start: function () {
  5032. if ( isAnimating === true ) return;
  5033. if ( animationLoop === null ) return;
  5034. context.requestAnimationFrame( onAnimationFrame );
  5035. isAnimating = true;
  5036. },
  5037. stop: function () {
  5038. isAnimating = false;
  5039. },
  5040. setAnimationLoop: function ( callback ) {
  5041. animationLoop = callback;
  5042. },
  5043. setContext: function ( value ) {
  5044. context = value;
  5045. }
  5046. };
  5047. }
  5048. /**
  5049. * @author mrdoob / http://mrdoob.com/
  5050. */
  5051. function WebGLAttributes( gl ) {
  5052. var buffers = new WeakMap();
  5053. function createBuffer( attribute, bufferType ) {
  5054. var array = attribute.array;
  5055. var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;
  5056. var buffer = gl.createBuffer();
  5057. gl.bindBuffer( bufferType, buffer );
  5058. gl.bufferData( bufferType, array, usage );
  5059. attribute.onUploadCallback();
  5060. var type = gl.FLOAT;
  5061. if ( array instanceof Float32Array ) {
  5062. type = gl.FLOAT;
  5063. } else if ( array instanceof Float64Array ) {
  5064. console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );
  5065. } else if ( array instanceof Uint16Array ) {
  5066. type = gl.UNSIGNED_SHORT;
  5067. } else if ( array instanceof Int16Array ) {
  5068. type = gl.SHORT;
  5069. } else if ( array instanceof Uint32Array ) {
  5070. type = gl.UNSIGNED_INT;
  5071. } else if ( array instanceof Int32Array ) {
  5072. type = gl.INT;
  5073. } else if ( array instanceof Int8Array ) {
  5074. type = gl.BYTE;
  5075. } else if ( array instanceof Uint8Array ) {
  5076. type = gl.UNSIGNED_BYTE;
  5077. }
  5078. return {
  5079. buffer: buffer,
  5080. type: type,
  5081. bytesPerElement: array.BYTES_PER_ELEMENT,
  5082. version: attribute.version
  5083. };
  5084. }
  5085. function updateBuffer( buffer, attribute, bufferType ) {
  5086. var array = attribute.array;
  5087. var updateRange = attribute.updateRange;
  5088. gl.bindBuffer( bufferType, buffer );
  5089. if ( attribute.dynamic === false ) {
  5090. gl.bufferData( bufferType, array, gl.STATIC_DRAW );
  5091. } else if ( updateRange.count === - 1 ) {
  5092. // Not using update ranges
  5093. gl.bufferSubData( bufferType, 0, array );
  5094. } else if ( updateRange.count === 0 ) {
  5095. console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );
  5096. } else {
  5097. gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,
  5098. array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );
  5099. updateRange.count = - 1; // reset range
  5100. }
  5101. }
  5102. //
  5103. function get( attribute ) {
  5104. if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
  5105. return buffers.get( attribute );
  5106. }
  5107. function remove( attribute ) {
  5108. if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
  5109. var data = buffers.get( attribute );
  5110. if ( data ) {
  5111. gl.deleteBuffer( data.buffer );
  5112. buffers.delete( attribute );
  5113. }
  5114. }
  5115. function update( attribute, bufferType ) {
  5116. if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
  5117. var data = buffers.get( attribute );
  5118. if ( data === undefined ) {
  5119. buffers.set( attribute, createBuffer( attribute, bufferType ) );
  5120. } else if ( data.version < attribute.version ) {
  5121. updateBuffer( data.buffer, attribute, bufferType );
  5122. data.version = attribute.version;
  5123. }
  5124. }
  5125. return {
  5126. get: get,
  5127. remove: remove,
  5128. update: update
  5129. };
  5130. }
  5131. /**
  5132. * @author mrdoob / http://mrdoob.com/
  5133. * @author WestLangley / http://github.com/WestLangley
  5134. * @author bhouston / http://clara.io
  5135. */
  5136. function Euler( x, y, z, order ) {
  5137. this._x = x || 0;
  5138. this._y = y || 0;
  5139. this._z = z || 0;
  5140. this._order = order || Euler.DefaultOrder;
  5141. }
  5142. Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];
  5143. Euler.DefaultOrder = 'XYZ';
  5144. Object.defineProperties( Euler.prototype, {
  5145. x: {
  5146. get: function () {
  5147. return this._x;
  5148. },
  5149. set: function ( value ) {
  5150. this._x = value;
  5151. this.onChangeCallback();
  5152. }
  5153. },
  5154. y: {
  5155. get: function () {
  5156. return this._y;
  5157. },
  5158. set: function ( value ) {
  5159. this._y = value;
  5160. this.onChangeCallback();
  5161. }
  5162. },
  5163. z: {
  5164. get: function () {
  5165. return this._z;
  5166. },
  5167. set: function ( value ) {
  5168. this._z = value;
  5169. this.onChangeCallback();
  5170. }
  5171. },
  5172. order: {
  5173. get: function () {
  5174. return this._order;
  5175. },
  5176. set: function ( value ) {
  5177. this._order = value;
  5178. this.onChangeCallback();
  5179. }
  5180. }
  5181. } );
  5182. Object.assign( Euler.prototype, {
  5183. isEuler: true,
  5184. set: function ( x, y, z, order ) {
  5185. this._x = x;
  5186. this._y = y;
  5187. this._z = z;
  5188. this._order = order || this._order;
  5189. this.onChangeCallback();
  5190. return this;
  5191. },
  5192. clone: function () {
  5193. return new this.constructor( this._x, this._y, this._z, this._order );
  5194. },
  5195. copy: function ( euler ) {
  5196. this._x = euler._x;
  5197. this._y = euler._y;
  5198. this._z = euler._z;
  5199. this._order = euler._order;
  5200. this.onChangeCallback();
  5201. return this;
  5202. },
  5203. setFromRotationMatrix: function ( m, order, update ) {
  5204. var clamp = _Math.clamp;
  5205. // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
  5206. var te = m.elements;
  5207. var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];
  5208. var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];
  5209. var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];
  5210. order = order || this._order;
  5211. if ( order === 'XYZ' ) {
  5212. this._y = Math.asin( clamp( m13, - 1, 1 ) );
  5213. if ( Math.abs( m13 ) < 0.99999 ) {
  5214. this._x = Math.atan2( - m23, m33 );
  5215. this._z = Math.atan2( - m12, m11 );
  5216. } else {
  5217. this._x = Math.atan2( m32, m22 );
  5218. this._z = 0;
  5219. }
  5220. } else if ( order === 'YXZ' ) {
  5221. this._x = Math.asin( - clamp( m23, - 1, 1 ) );
  5222. if ( Math.abs( m23 ) < 0.99999 ) {
  5223. this._y = Math.atan2( m13, m33 );
  5224. this._z = Math.atan2( m21, m22 );
  5225. } else {
  5226. this._y = Math.atan2( - m31, m11 );
  5227. this._z = 0;
  5228. }
  5229. } else if ( order === 'ZXY' ) {
  5230. this._x = Math.asin( clamp( m32, - 1, 1 ) );
  5231. if ( Math.abs( m32 ) < 0.99999 ) {
  5232. this._y = Math.atan2( - m31, m33 );
  5233. this._z = Math.atan2( - m12, m22 );
  5234. } else {
  5235. this._y = 0;
  5236. this._z = Math.atan2( m21, m11 );
  5237. }
  5238. } else if ( order === 'ZYX' ) {
  5239. this._y = Math.asin( - clamp( m31, - 1, 1 ) );
  5240. if ( Math.abs( m31 ) < 0.99999 ) {
  5241. this._x = Math.atan2( m32, m33 );
  5242. this._z = Math.atan2( m21, m11 );
  5243. } else {
  5244. this._x = 0;
  5245. this._z = Math.atan2( - m12, m22 );
  5246. }
  5247. } else if ( order === 'YZX' ) {
  5248. this._z = Math.asin( clamp( m21, - 1, 1 ) );
  5249. if ( Math.abs( m21 ) < 0.99999 ) {
  5250. this._x = Math.atan2( - m23, m22 );
  5251. this._y = Math.atan2( - m31, m11 );
  5252. } else {
  5253. this._x = 0;
  5254. this._y = Math.atan2( m13, m33 );
  5255. }
  5256. } else if ( order === 'XZY' ) {
  5257. this._z = Math.asin( - clamp( m12, - 1, 1 ) );
  5258. if ( Math.abs( m12 ) < 0.99999 ) {
  5259. this._x = Math.atan2( m32, m22 );
  5260. this._y = Math.atan2( m13, m11 );
  5261. } else {
  5262. this._x = Math.atan2( - m23, m33 );
  5263. this._y = 0;
  5264. }
  5265. } else {
  5266. console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );
  5267. }
  5268. this._order = order;
  5269. if ( update !== false ) this.onChangeCallback();
  5270. return this;
  5271. },
  5272. setFromQuaternion: function () {
  5273. var matrix = new Matrix4();
  5274. return function setFromQuaternion( q, order, update ) {
  5275. matrix.makeRotationFromQuaternion( q );
  5276. return this.setFromRotationMatrix( matrix, order, update );
  5277. };
  5278. }(),
  5279. setFromVector3: function ( v, order ) {
  5280. return this.set( v.x, v.y, v.z, order || this._order );
  5281. },
  5282. reorder: function () {
  5283. // WARNING: this discards revolution information -bhouston
  5284. var q = new Quaternion();
  5285. return function reorder( newOrder ) {
  5286. q.setFromEuler( this );
  5287. return this.setFromQuaternion( q, newOrder );
  5288. };
  5289. }(),
  5290. equals: function ( euler ) {
  5291. return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );
  5292. },
  5293. fromArray: function ( array ) {
  5294. this._x = array[ 0 ];
  5295. this._y = array[ 1 ];
  5296. this._z = array[ 2 ];
  5297. if ( array[ 3 ] !== undefined ) this._order = array[ 3 ];
  5298. this.onChangeCallback();
  5299. return this;
  5300. },
  5301. toArray: function ( array, offset ) {
  5302. if ( array === undefined ) array = [];
  5303. if ( offset === undefined ) offset = 0;
  5304. array[ offset ] = this._x;
  5305. array[ offset + 1 ] = this._y;
  5306. array[ offset + 2 ] = this._z;
  5307. array[ offset + 3 ] = this._order;
  5308. return array;
  5309. },
  5310. toVector3: function ( optionalResult ) {
  5311. if ( optionalResult ) {
  5312. return optionalResult.set( this._x, this._y, this._z );
  5313. } else {
  5314. return new Vector3( this._x, this._y, this._z );
  5315. }
  5316. },
  5317. onChange: function ( callback ) {
  5318. this.onChangeCallback = callback;
  5319. return this;
  5320. },
  5321. onChangeCallback: function () {}
  5322. } );
  5323. /**
  5324. * @author mrdoob / http://mrdoob.com/
  5325. */
  5326. function Layers() {
  5327. this.mask = 1 | 0;
  5328. }
  5329. Object.assign( Layers.prototype, {
  5330. set: function ( channel ) {
  5331. this.mask = 1 << channel | 0;
  5332. },
  5333. enable: function ( channel ) {
  5334. this.mask |= 1 << channel | 0;
  5335. },
  5336. toggle: function ( channel ) {
  5337. this.mask ^= 1 << channel | 0;
  5338. },
  5339. disable: function ( channel ) {
  5340. this.mask &= ~ ( 1 << channel | 0 );
  5341. },
  5342. test: function ( layers ) {
  5343. return ( this.mask & layers.mask ) !== 0;
  5344. }
  5345. } );
  5346. /**
  5347. * @author mrdoob / http://mrdoob.com/
  5348. * @author mikael emtinger / http://gomo.se/
  5349. * @author alteredq / http://alteredqualia.com/
  5350. * @author WestLangley / http://github.com/WestLangley
  5351. * @author elephantatwork / www.elephantatwork.ch
  5352. */
  5353. var object3DId = 0;
  5354. function Object3D() {
  5355. Object.defineProperty( this, 'id', { value: object3DId ++ } );
  5356. this.uuid = _Math.generateUUID();
  5357. this.name = '';
  5358. this.type = 'Object3D';
  5359. this.parent = null;
  5360. this.children = [];
  5361. this.up = Object3D.DefaultUp.clone();
  5362. var position = new Vector3();
  5363. var rotation = new Euler();
  5364. var quaternion = new Quaternion();
  5365. var scale = new Vector3( 1, 1, 1 );
  5366. function onRotationChange() {
  5367. quaternion.setFromEuler( rotation, false );
  5368. }
  5369. function onQuaternionChange() {
  5370. rotation.setFromQuaternion( quaternion, undefined, false );
  5371. }
  5372. rotation.onChange( onRotationChange );
  5373. quaternion.onChange( onQuaternionChange );
  5374. Object.defineProperties( this, {
  5375. position: {
  5376. enumerable: true,
  5377. value: position
  5378. },
  5379. rotation: {
  5380. enumerable: true,
  5381. value: rotation
  5382. },
  5383. quaternion: {
  5384. enumerable: true,
  5385. value: quaternion
  5386. },
  5387. scale: {
  5388. enumerable: true,
  5389. value: scale
  5390. },
  5391. modelViewMatrix: {
  5392. value: new Matrix4()
  5393. },
  5394. normalMatrix: {
  5395. value: new Matrix3()
  5396. }
  5397. } );
  5398. this.matrix = new Matrix4();
  5399. this.matrixWorld = new Matrix4();
  5400. this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;
  5401. this.matrixWorldNeedsUpdate = false;
  5402. this.layers = new Layers();
  5403. this.visible = true;
  5404. this.castShadow = false;
  5405. this.receiveShadow = false;
  5406. this.frustumCulled = true;
  5407. this.renderOrder = 0;
  5408. this.userData = {};
  5409. }
  5410. Object3D.DefaultUp = new Vector3( 0, 1, 0 );
  5411. Object3D.DefaultMatrixAutoUpdate = true;
  5412. Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
  5413. constructor: Object3D,
  5414. isObject3D: true,
  5415. onBeforeRender: function () {},
  5416. onAfterRender: function () {},
  5417. applyMatrix: function ( matrix ) {
  5418. this.matrix.multiplyMatrices( matrix, this.matrix );
  5419. this.matrix.decompose( this.position, this.quaternion, this.scale );
  5420. },
  5421. applyQuaternion: function ( q ) {
  5422. this.quaternion.premultiply( q );
  5423. return this;
  5424. },
  5425. setRotationFromAxisAngle: function ( axis, angle ) {
  5426. // assumes axis is normalized
  5427. this.quaternion.setFromAxisAngle( axis, angle );
  5428. },
  5429. setRotationFromEuler: function ( euler ) {
  5430. this.quaternion.setFromEuler( euler, true );
  5431. },
  5432. setRotationFromMatrix: function ( m ) {
  5433. // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
  5434. this.quaternion.setFromRotationMatrix( m );
  5435. },
  5436. setRotationFromQuaternion: function ( q ) {
  5437. // assumes q is normalized
  5438. this.quaternion.copy( q );
  5439. },
  5440. rotateOnAxis: function () {
  5441. // rotate object on axis in object space
  5442. // axis is assumed to be normalized
  5443. var q1 = new Quaternion();
  5444. return function rotateOnAxis( axis, angle ) {
  5445. q1.setFromAxisAngle( axis, angle );
  5446. this.quaternion.multiply( q1 );
  5447. return this;
  5448. };
  5449. }(),
  5450. rotateOnWorldAxis: function () {
  5451. // rotate object on axis in world space
  5452. // axis is assumed to be normalized
  5453. // method assumes no rotated parent
  5454. var q1 = new Quaternion();
  5455. return function rotateOnWorldAxis( axis, angle ) {
  5456. q1.setFromAxisAngle( axis, angle );
  5457. this.quaternion.premultiply( q1 );
  5458. return this;
  5459. };
  5460. }(),
  5461. rotateX: function () {
  5462. var v1 = new Vector3( 1, 0, 0 );
  5463. return function rotateX( angle ) {
  5464. return this.rotateOnAxis( v1, angle );
  5465. };
  5466. }(),
  5467. rotateY: function () {
  5468. var v1 = new Vector3( 0, 1, 0 );
  5469. return function rotateY( angle ) {
  5470. return this.rotateOnAxis( v1, angle );
  5471. };
  5472. }(),
  5473. rotateZ: function () {
  5474. var v1 = new Vector3( 0, 0, 1 );
  5475. return function rotateZ( angle ) {
  5476. return this.rotateOnAxis( v1, angle );
  5477. };
  5478. }(),
  5479. translateOnAxis: function () {
  5480. // translate object by distance along axis in object space
  5481. // axis is assumed to be normalized
  5482. var v1 = new Vector3();
  5483. return function translateOnAxis( axis, distance ) {
  5484. v1.copy( axis ).applyQuaternion( this.quaternion );
  5485. this.position.add( v1.multiplyScalar( distance ) );
  5486. return this;
  5487. };
  5488. }(),
  5489. translateX: function () {
  5490. var v1 = new Vector3( 1, 0, 0 );
  5491. return function translateX( distance ) {
  5492. return this.translateOnAxis( v1, distance );
  5493. };
  5494. }(),
  5495. translateY: function () {
  5496. var v1 = new Vector3( 0, 1, 0 );
  5497. return function translateY( distance ) {
  5498. return this.translateOnAxis( v1, distance );
  5499. };
  5500. }(),
  5501. translateZ: function () {
  5502. var v1 = new Vector3( 0, 0, 1 );
  5503. return function translateZ( distance ) {
  5504. return this.translateOnAxis( v1, distance );
  5505. };
  5506. }(),
  5507. localToWorld: function ( vector ) {
  5508. return vector.applyMatrix4( this.matrixWorld );
  5509. },
  5510. worldToLocal: function () {
  5511. var m1 = new Matrix4();
  5512. return function worldToLocal( vector ) {
  5513. return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );
  5514. };
  5515. }(),
  5516. lookAt: function () {
  5517. // This method does not support objects with rotated and/or translated parent(s)
  5518. var m1 = new Matrix4();
  5519. var vector = new Vector3();
  5520. return function lookAt( x, y, z ) {
  5521. if ( x.isVector3 ) {
  5522. vector.copy( x );
  5523. } else {
  5524. vector.set( x, y, z );
  5525. }
  5526. if ( this.isCamera ) {
  5527. m1.lookAt( this.position, vector, this.up );
  5528. } else {
  5529. m1.lookAt( vector, this.position, this.up );
  5530. }
  5531. this.quaternion.setFromRotationMatrix( m1 );
  5532. };
  5533. }(),
  5534. add: function ( object ) {
  5535. if ( arguments.length > 1 ) {
  5536. for ( var i = 0; i < arguments.length; i ++ ) {
  5537. this.add( arguments[ i ] );
  5538. }
  5539. return this;
  5540. }
  5541. if ( object === this ) {
  5542. console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object );
  5543. return this;
  5544. }
  5545. if ( ( object && object.isObject3D ) ) {
  5546. if ( object.parent !== null ) {
  5547. object.parent.remove( object );
  5548. }
  5549. object.parent = this;
  5550. object.dispatchEvent( { type: 'added' } );
  5551. this.children.push( object );
  5552. } else {
  5553. console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object );
  5554. }
  5555. return this;
  5556. },
  5557. remove: function ( object ) {
  5558. if ( arguments.length > 1 ) {
  5559. for ( var i = 0; i < arguments.length; i ++ ) {
  5560. this.remove( arguments[ i ] );
  5561. }
  5562. return this;
  5563. }
  5564. var index = this.children.indexOf( object );
  5565. if ( index !== - 1 ) {
  5566. object.parent = null;
  5567. object.dispatchEvent( { type: 'removed' } );
  5568. this.children.splice( index, 1 );
  5569. }
  5570. return this;
  5571. },
  5572. getObjectById: function ( id ) {
  5573. return this.getObjectByProperty( 'id', id );
  5574. },
  5575. getObjectByName: function ( name ) {
  5576. return this.getObjectByProperty( 'name', name );
  5577. },
  5578. getObjectByProperty: function ( name, value ) {
  5579. if ( this[ name ] === value ) return this;
  5580. for ( var i = 0, l = this.children.length; i < l; i ++ ) {
  5581. var child = this.children[ i ];
  5582. var object = child.getObjectByProperty( name, value );
  5583. if ( object !== undefined ) {
  5584. return object;
  5585. }
  5586. }
  5587. return undefined;
  5588. },
  5589. getWorldPosition: function ( target ) {
  5590. if ( target === undefined ) {
  5591. console.warn( 'THREE.Object3D: .getWorldPosition() target is now required' );
  5592. target = new Vector3();
  5593. }
  5594. this.updateMatrixWorld( true );
  5595. return target.setFromMatrixPosition( this.matrixWorld );
  5596. },
  5597. getWorldQuaternion: function () {
  5598. var position = new Vector3();
  5599. var scale = new Vector3();
  5600. return function getWorldQuaternion( target ) {
  5601. if ( target === undefined ) {
  5602. console.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' );
  5603. target = new Quaternion();
  5604. }
  5605. this.updateMatrixWorld( true );
  5606. this.matrixWorld.decompose( position, target, scale );
  5607. return target;
  5608. };
  5609. }(),
  5610. getWorldScale: function () {
  5611. var position = new Vector3();
  5612. var quaternion = new Quaternion();
  5613. return function getWorldScale( target ) {
  5614. if ( target === undefined ) {
  5615. console.warn( 'THREE.Object3D: .getWorldScale() target is now required' );
  5616. target = new Vector3();
  5617. }
  5618. this.updateMatrixWorld( true );
  5619. this.matrixWorld.decompose( position, quaternion, target );
  5620. return target;
  5621. };
  5622. }(),
  5623. getWorldDirection: function () {
  5624. var quaternion = new Quaternion();
  5625. return function getWorldDirection( target ) {
  5626. if ( target === undefined ) {
  5627. console.warn( 'THREE.Object3D: .getWorldDirection() target is now required' );
  5628. target = new Vector3();
  5629. }
  5630. this.getWorldQuaternion( quaternion );
  5631. return target.set( 0, 0, 1 ).applyQuaternion( quaternion );
  5632. };
  5633. }(),
  5634. raycast: function () {},
  5635. traverse: function ( callback ) {
  5636. callback( this );
  5637. var children = this.children;
  5638. for ( var i = 0, l = children.length; i < l; i ++ ) {
  5639. children[ i ].traverse( callback );
  5640. }
  5641. },
  5642. traverseVisible: function ( callback ) {
  5643. if ( this.visible === false ) return;
  5644. callback( this );
  5645. var children = this.children;
  5646. for ( var i = 0, l = children.length; i < l; i ++ ) {
  5647. children[ i ].traverseVisible( callback );
  5648. }
  5649. },
  5650. traverseAncestors: function ( callback ) {
  5651. var parent = this.parent;
  5652. if ( parent !== null ) {
  5653. callback( parent );
  5654. parent.traverseAncestors( callback );
  5655. }
  5656. },
  5657. updateMatrix: function () {
  5658. this.matrix.compose( this.position, this.quaternion, this.scale );
  5659. this.matrixWorldNeedsUpdate = true;
  5660. },
  5661. updateMatrixWorld: function ( force ) {
  5662. if ( this.matrixAutoUpdate ) this.updateMatrix();
  5663. if ( this.matrixWorldNeedsUpdate || force ) {
  5664. if ( this.parent === null ) {
  5665. this.matrixWorld.copy( this.matrix );
  5666. } else {
  5667. this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );
  5668. }
  5669. this.matrixWorldNeedsUpdate = false;
  5670. force = true;
  5671. }
  5672. // update children
  5673. var children = this.children;
  5674. for ( var i = 0, l = children.length; i < l; i ++ ) {
  5675. children[ i ].updateMatrixWorld( force );
  5676. }
  5677. },
  5678. toJSON: function ( meta ) {
  5679. // meta is a string when called from JSON.stringify
  5680. var isRootObject = ( meta === undefined || typeof meta === 'string' );
  5681. var output = {};
  5682. // meta is a hash used to collect geometries, materials.
  5683. // not providing it implies that this is the root object
  5684. // being serialized.
  5685. if ( isRootObject ) {
  5686. // initialize meta obj
  5687. meta = {
  5688. geometries: {},
  5689. materials: {},
  5690. textures: {},
  5691. images: {},
  5692. shapes: {}
  5693. };
  5694. output.metadata = {
  5695. version: 4.5,
  5696. type: 'Object',
  5697. generator: 'Object3D.toJSON'
  5698. };
  5699. }
  5700. // standard Object3D serialization
  5701. var object = {};
  5702. object.uuid = this.uuid;
  5703. object.type = this.type;
  5704. if ( this.name !== '' ) object.name = this.name;
  5705. if ( this.castShadow === true ) object.castShadow = true;
  5706. if ( this.receiveShadow === true ) object.receiveShadow = true;
  5707. if ( this.visible === false ) object.visible = false;
  5708. if ( this.frustumCulled === false ) object.frustumCulled = false;
  5709. if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;
  5710. if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;
  5711. object.layers = this.layers.mask;
  5712. object.matrix = this.matrix.toArray();
  5713. if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;
  5714. //
  5715. function serialize( library, element ) {
  5716. if ( library[ element.uuid ] === undefined ) {
  5717. library[ element.uuid ] = element.toJSON( meta );
  5718. }
  5719. return element.uuid;
  5720. }
  5721. if ( this.isMesh || this.isLine || this.isPoints ) {
  5722. object.geometry = serialize( meta.geometries, this.geometry );
  5723. var parameters = this.geometry.parameters;
  5724. if ( parameters !== undefined && parameters.shapes !== undefined ) {
  5725. var shapes = parameters.shapes;
  5726. if ( Array.isArray( shapes ) ) {
  5727. for ( var i = 0, l = shapes.length; i < l; i ++ ) {
  5728. var shape = shapes[ i ];
  5729. serialize( meta.shapes, shape );
  5730. }
  5731. } else {
  5732. serialize( meta.shapes, shapes );
  5733. }
  5734. }
  5735. }
  5736. if ( this.material !== undefined ) {
  5737. if ( Array.isArray( this.material ) ) {
  5738. var uuids = [];
  5739. for ( var i = 0, l = this.material.length; i < l; i ++ ) {
  5740. uuids.push( serialize( meta.materials, this.material[ i ] ) );
  5741. }
  5742. object.material = uuids;
  5743. } else {
  5744. object.material = serialize( meta.materials, this.material );
  5745. }
  5746. }
  5747. //
  5748. if ( this.children.length > 0 ) {
  5749. object.children = [];
  5750. for ( var i = 0; i < this.children.length; i ++ ) {
  5751. object.children.push( this.children[ i ].toJSON( meta ).object );
  5752. }
  5753. }
  5754. if ( isRootObject ) {
  5755. var geometries = extractFromCache( meta.geometries );
  5756. var materials = extractFromCache( meta.materials );
  5757. var textures = extractFromCache( meta.textures );
  5758. var images = extractFromCache( meta.images );
  5759. var shapes = extractFromCache( meta.shapes );
  5760. if ( geometries.length > 0 ) output.geometries = geometries;
  5761. if ( materials.length > 0 ) output.materials = materials;
  5762. if ( textures.length > 0 ) output.textures = textures;
  5763. if ( images.length > 0 ) output.images = images;
  5764. if ( shapes.length > 0 ) output.shapes = shapes;
  5765. }
  5766. output.object = object;
  5767. return output;
  5768. // extract data from the cache hash
  5769. // remove metadata on each item
  5770. // and return as array
  5771. function extractFromCache( cache ) {
  5772. var values = [];
  5773. for ( var key in cache ) {
  5774. var data = cache[ key ];
  5775. delete data.metadata;
  5776. values.push( data );
  5777. }
  5778. return values;
  5779. }
  5780. },
  5781. clone: function ( recursive ) {
  5782. return new this.constructor().copy( this, recursive );
  5783. },
  5784. copy: function ( source, recursive ) {
  5785. if ( recursive === undefined ) recursive = true;
  5786. this.name = source.name;
  5787. this.up.copy( source.up );
  5788. this.position.copy( source.position );
  5789. this.quaternion.copy( source.quaternion );
  5790. this.scale.copy( source.scale );
  5791. this.matrix.copy( source.matrix );
  5792. this.matrixWorld.copy( source.matrixWorld );
  5793. this.matrixAutoUpdate = source.matrixAutoUpdate;
  5794. this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;
  5795. this.layers.mask = source.layers.mask;
  5796. this.visible = source.visible;
  5797. this.castShadow = source.castShadow;
  5798. this.receiveShadow = source.receiveShadow;
  5799. this.frustumCulled = source.frustumCulled;
  5800. this.renderOrder = source.renderOrder;
  5801. this.userData = JSON.parse( JSON.stringify( source.userData ) );
  5802. if ( recursive === true ) {
  5803. for ( var i = 0; i < source.children.length; i ++ ) {
  5804. var child = source.children[ i ];
  5805. this.add( child.clone() );
  5806. }
  5807. }
  5808. return this;
  5809. }
  5810. } );
  5811. /**
  5812. * @author mrdoob / http://mrdoob.com/
  5813. * @author mikael emtinger / http://gomo.se/
  5814. * @author WestLangley / http://github.com/WestLangley
  5815. */
  5816. function Camera() {
  5817. Object3D.call( this );
  5818. this.type = 'Camera';
  5819. this.matrixWorldInverse = new Matrix4();
  5820. this.projectionMatrix = new Matrix4();
  5821. }
  5822. Camera.prototype = Object.assign( Object.create( Object3D.prototype ), {
  5823. constructor: Camera,
  5824. isCamera: true,
  5825. copy: function ( source, recursive ) {
  5826. Object3D.prototype.copy.call( this, source, recursive );
  5827. this.matrixWorldInverse.copy( source.matrixWorldInverse );
  5828. this.projectionMatrix.copy( source.projectionMatrix );
  5829. return this;
  5830. },
  5831. getWorldDirection: function () {
  5832. var quaternion = new Quaternion();
  5833. return function getWorldDirection( target ) {
  5834. if ( target === undefined ) {
  5835. console.warn( 'THREE.Camera: .getWorldDirection() target is now required' );
  5836. target = new Vector3();
  5837. }
  5838. this.getWorldQuaternion( quaternion );
  5839. return target.set( 0, 0, - 1 ).applyQuaternion( quaternion );
  5840. };
  5841. }(),
  5842. updateMatrixWorld: function ( force ) {
  5843. Object3D.prototype.updateMatrixWorld.call( this, force );
  5844. this.matrixWorldInverse.getInverse( this.matrixWorld );
  5845. },
  5846. clone: function () {
  5847. return new this.constructor().copy( this );
  5848. }
  5849. } );
  5850. /**
  5851. * @author alteredq / http://alteredqualia.com/
  5852. * @author arose / http://github.com/arose
  5853. */
  5854. function OrthographicCamera( left, right, top, bottom, near, far ) {
  5855. Camera.call( this );
  5856. this.type = 'OrthographicCamera';
  5857. this.zoom = 1;
  5858. this.view = null;
  5859. this.left = left;
  5860. this.right = right;
  5861. this.top = top;
  5862. this.bottom = bottom;
  5863. this.near = ( near !== undefined ) ? near : 0.1;
  5864. this.far = ( far !== undefined ) ? far : 2000;
  5865. this.updateProjectionMatrix();
  5866. }
  5867. OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {
  5868. constructor: OrthographicCamera,
  5869. isOrthographicCamera: true,
  5870. copy: function ( source, recursive ) {
  5871. Camera.prototype.copy.call( this, source, recursive );
  5872. this.left = source.left;
  5873. this.right = source.right;
  5874. this.top = source.top;
  5875. this.bottom = source.bottom;
  5876. this.near = source.near;
  5877. this.far = source.far;
  5878. this.zoom = source.zoom;
  5879. this.view = source.view === null ? null : Object.assign( {}, source.view );
  5880. return this;
  5881. },
  5882. setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {
  5883. if ( this.view === null ) {
  5884. this.view = {
  5885. enabled: true,
  5886. fullWidth: 1,
  5887. fullHeight: 1,
  5888. offsetX: 0,
  5889. offsetY: 0,
  5890. width: 1,
  5891. height: 1
  5892. };
  5893. }
  5894. this.view.enabled = true;
  5895. this.view.fullWidth = fullWidth;
  5896. this.view.fullHeight = fullHeight;
  5897. this.view.offsetX = x;
  5898. this.view.offsetY = y;
  5899. this.view.width = width;
  5900. this.view.height = height;
  5901. this.updateProjectionMatrix();
  5902. },
  5903. clearViewOffset: function () {
  5904. if ( this.view !== null ) {
  5905. this.view.enabled = false;
  5906. }
  5907. this.updateProjectionMatrix();
  5908. },
  5909. updateProjectionMatrix: function () {
  5910. var dx = ( this.right - this.left ) / ( 2 * this.zoom );
  5911. var dy = ( this.top - this.bottom ) / ( 2 * this.zoom );
  5912. var cx = ( this.right + this.left ) / 2;
  5913. var cy = ( this.top + this.bottom ) / 2;
  5914. var left = cx - dx;
  5915. var right = cx + dx;
  5916. var top = cy + dy;
  5917. var bottom = cy - dy;
  5918. if ( this.view !== null && this.view.enabled ) {
  5919. var zoomW = this.zoom / ( this.view.width / this.view.fullWidth );
  5920. var zoomH = this.zoom / ( this.view.height / this.view.fullHeight );
  5921. var scaleW = ( this.right - this.left ) / this.view.width;
  5922. var scaleH = ( this.top - this.bottom ) / this.view.height;
  5923. left += scaleW * ( this.view.offsetX / zoomW );
  5924. right = left + scaleW * ( this.view.width / zoomW );
  5925. top -= scaleH * ( this.view.offsetY / zoomH );
  5926. bottom = top - scaleH * ( this.view.height / zoomH );
  5927. }
  5928. this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );
  5929. },
  5930. toJSON: function ( meta ) {
  5931. var data = Object3D.prototype.toJSON.call( this, meta );
  5932. data.object.zoom = this.zoom;
  5933. data.object.left = this.left;
  5934. data.object.right = this.right;
  5935. data.object.top = this.top;
  5936. data.object.bottom = this.bottom;
  5937. data.object.near = this.near;
  5938. data.object.far = this.far;
  5939. if ( this.view !== null ) data.object.view = Object.assign( {}, this.view );
  5940. return data;
  5941. }
  5942. } );
  5943. /**
  5944. * @author mrdoob / http://mrdoob.com/
  5945. * @author alteredq / http://alteredqualia.com/
  5946. */
  5947. function Face3( a, b, c, normal, color, materialIndex ) {
  5948. this.a = a;
  5949. this.b = b;
  5950. this.c = c;
  5951. this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3();
  5952. this.vertexNormals = Array.isArray( normal ) ? normal : [];
  5953. this.color = ( color && color.isColor ) ? color : new Color();
  5954. this.vertexColors = Array.isArray( color ) ? color : [];
  5955. this.materialIndex = materialIndex !== undefined ? materialIndex : 0;
  5956. }
  5957. Object.assign( Face3.prototype, {
  5958. clone: function () {
  5959. return new this.constructor().copy( this );
  5960. },
  5961. copy: function ( source ) {
  5962. this.a = source.a;
  5963. this.b = source.b;
  5964. this.c = source.c;
  5965. this.normal.copy( source.normal );
  5966. this.color.copy( source.color );
  5967. this.materialIndex = source.materialIndex;
  5968. for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {
  5969. this.vertexNormals[ i ] = source.vertexNormals[ i ].clone();
  5970. }
  5971. for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {
  5972. this.vertexColors[ i ] = source.vertexColors[ i ].clone();
  5973. }
  5974. return this;
  5975. }
  5976. } );
  5977. /**
  5978. * @author mrdoob / http://mrdoob.com/
  5979. * @author kile / http://kile.stravaganza.org/
  5980. * @author alteredq / http://alteredqualia.com/
  5981. * @author mikael emtinger / http://gomo.se/
  5982. * @author zz85 / http://www.lab4games.net/zz85/blog
  5983. * @author bhouston / http://clara.io
  5984. */
  5985. var geometryId = 0; // Geometry uses even numbers as Id
  5986. function Geometry() {
  5987. Object.defineProperty( this, 'id', { value: geometryId += 2 } );
  5988. this.uuid = _Math.generateUUID();
  5989. this.name = '';
  5990. this.type = 'Geometry';
  5991. this.vertices = [];
  5992. this.colors = [];
  5993. this.faces = [];
  5994. this.faceVertexUvs = [[]];
  5995. this.morphTargets = [];
  5996. this.morphNormals = [];
  5997. this.skinWeights = [];
  5998. this.skinIndices = [];
  5999. this.lineDistances = [];
  6000. this.boundingBox = null;
  6001. this.boundingSphere = null;
  6002. // update flags
  6003. this.elementsNeedUpdate = false;
  6004. this.verticesNeedUpdate = false;
  6005. this.uvsNeedUpdate = false;
  6006. this.normalsNeedUpdate = false;
  6007. this.colorsNeedUpdate = false;
  6008. this.lineDistancesNeedUpdate = false;
  6009. this.groupsNeedUpdate = false;
  6010. }
  6011. Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
  6012. constructor: Geometry,
  6013. isGeometry: true,
  6014. applyMatrix: function ( matrix ) {
  6015. var normalMatrix = new Matrix3().getNormalMatrix( matrix );
  6016. for ( var i = 0, il = this.vertices.length; i < il; i ++ ) {
  6017. var vertex = this.vertices[ i ];
  6018. vertex.applyMatrix4( matrix );
  6019. }
  6020. for ( var i = 0, il = this.faces.length; i < il; i ++ ) {
  6021. var face = this.faces[ i ];
  6022. face.normal.applyMatrix3( normalMatrix ).normalize();
  6023. for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {
  6024. face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();
  6025. }
  6026. }
  6027. if ( this.boundingBox !== null ) {
  6028. this.computeBoundingBox();
  6029. }
  6030. if ( this.boundingSphere !== null ) {
  6031. this.computeBoundingSphere();
  6032. }
  6033. this.verticesNeedUpdate = true;
  6034. this.normalsNeedUpdate = true;
  6035. return this;
  6036. },
  6037. rotateX: function () {
  6038. // rotate geometry around world x-axis
  6039. var m1 = new Matrix4();
  6040. return function rotateX( angle ) {
  6041. m1.makeRotationX( angle );
  6042. this.applyMatrix( m1 );
  6043. return this;
  6044. };
  6045. }(),
  6046. rotateY: function () {
  6047. // rotate geometry around world y-axis
  6048. var m1 = new Matrix4();
  6049. return function rotateY( angle ) {
  6050. m1.makeRotationY( angle );
  6051. this.applyMatrix( m1 );
  6052. return this;
  6053. };
  6054. }(),
  6055. rotateZ: function () {
  6056. // rotate geometry around world z-axis
  6057. var m1 = new Matrix4();
  6058. return function rotateZ( angle ) {
  6059. m1.makeRotationZ( angle );
  6060. this.applyMatrix( m1 );
  6061. return this;
  6062. };
  6063. }(),
  6064. translate: function () {
  6065. // translate geometry
  6066. var m1 = new Matrix4();
  6067. return function translate( x, y, z ) {
  6068. m1.makeTranslation( x, y, z );
  6069. this.applyMatrix( m1 );
  6070. return this;
  6071. };
  6072. }(),
  6073. scale: function () {
  6074. // scale geometry
  6075. var m1 = new Matrix4();
  6076. return function scale( x, y, z ) {
  6077. m1.makeScale( x, y, z );
  6078. this.applyMatrix( m1 );
  6079. return this;
  6080. };
  6081. }(),
  6082. lookAt: function () {
  6083. var obj = new Object3D();
  6084. return function lookAt( vector ) {
  6085. obj.lookAt( vector );
  6086. obj.updateMatrix();
  6087. this.applyMatrix( obj.matrix );
  6088. };
  6089. }(),
  6090. fromBufferGeometry: function ( geometry ) {
  6091. var scope = this;
  6092. var indices = geometry.index !== null ? geometry.index.array : undefined;
  6093. var attributes = geometry.attributes;
  6094. var positions = attributes.position.array;
  6095. var normals = attributes.normal !== undefined ? attributes.normal.array : undefined;
  6096. var colors = attributes.color !== undefined ? attributes.color.array : undefined;
  6097. var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;
  6098. var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;
  6099. if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];
  6100. var tempNormals = [];
  6101. var tempUVs = [];
  6102. var tempUVs2 = [];
  6103. for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {
  6104. scope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );
  6105. if ( normals !== undefined ) {
  6106. tempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );
  6107. }
  6108. if ( colors !== undefined ) {
  6109. scope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );
  6110. }
  6111. if ( uvs !== undefined ) {
  6112. tempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );
  6113. }
  6114. if ( uvs2 !== undefined ) {
  6115. tempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );
  6116. }
  6117. }
  6118. function addFace( a, b, c, materialIndex ) {
  6119. var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];
  6120. var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];
  6121. var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );
  6122. scope.faces.push( face );
  6123. if ( uvs !== undefined ) {
  6124. scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );
  6125. }
  6126. if ( uvs2 !== undefined ) {
  6127. scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );
  6128. }
  6129. }
  6130. var groups = geometry.groups;
  6131. if ( groups.length > 0 ) {
  6132. for ( var i = 0; i < groups.length; i ++ ) {
  6133. var group = groups[ i ];
  6134. var start = group.start;
  6135. var count = group.count;
  6136. for ( var j = start, jl = start + count; j < jl; j += 3 ) {
  6137. if ( indices !== undefined ) {
  6138. addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );
  6139. } else {
  6140. addFace( j, j + 1, j + 2, group.materialIndex );
  6141. }
  6142. }
  6143. }
  6144. } else {
  6145. if ( indices !== undefined ) {
  6146. for ( var i = 0; i < indices.length; i += 3 ) {
  6147. addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );
  6148. }
  6149. } else {
  6150. for ( var i = 0; i < positions.length / 3; i += 3 ) {
  6151. addFace( i, i + 1, i + 2 );
  6152. }
  6153. }
  6154. }
  6155. this.computeFaceNormals();
  6156. if ( geometry.boundingBox !== null ) {
  6157. this.boundingBox = geometry.boundingBox.clone();
  6158. }
  6159. if ( geometry.boundingSphere !== null ) {
  6160. this.boundingSphere = geometry.boundingSphere.clone();
  6161. }
  6162. return this;
  6163. },
  6164. center: function () {
  6165. var offset = new Vector3();
  6166. return function center() {
  6167. this.computeBoundingBox();
  6168. this.boundingBox.getCenter( offset ).negate();
  6169. this.translate( offset.x, offset.y, offset.z );
  6170. return this;
  6171. };
  6172. }(),
  6173. normalize: function () {
  6174. this.computeBoundingSphere();
  6175. var center = this.boundingSphere.center;
  6176. var radius = this.boundingSphere.radius;
  6177. var s = radius === 0 ? 1 : 1.0 / radius;
  6178. var matrix = new Matrix4();
  6179. matrix.set(
  6180. s, 0, 0, - s * center.x,
  6181. 0, s, 0, - s * center.y,
  6182. 0, 0, s, - s * center.z,
  6183. 0, 0, 0, 1
  6184. );
  6185. this.applyMatrix( matrix );
  6186. return this;
  6187. },
  6188. computeFaceNormals: function () {
  6189. var cb = new Vector3(), ab = new Vector3();
  6190. for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {
  6191. var face = this.faces[ f ];
  6192. var vA = this.vertices[ face.a ];
  6193. var vB = this.vertices[ face.b ];
  6194. var vC = this.vertices[ face.c ];
  6195. cb.subVectors( vC, vB );
  6196. ab.subVectors( vA, vB );
  6197. cb.cross( ab );
  6198. cb.normalize();
  6199. face.normal.copy( cb );
  6200. }
  6201. },
  6202. computeVertexNormals: function ( areaWeighted ) {
  6203. if ( areaWeighted === undefined ) areaWeighted = true;
  6204. var v, vl, f, fl, face, vertices;
  6205. vertices = new Array( this.vertices.length );
  6206. for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
  6207. vertices[ v ] = new Vector3();
  6208. }
  6209. if ( areaWeighted ) {
  6210. // vertex normals weighted by triangle areas
  6211. // http://www.iquilezles.org/www/articles/normals/normals.htm
  6212. var vA, vB, vC;
  6213. var cb = new Vector3(), ab = new Vector3();
  6214. for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
  6215. face = this.faces[ f ];
  6216. vA = this.vertices[ face.a ];
  6217. vB = this.vertices[ face.b ];
  6218. vC = this.vertices[ face.c ];
  6219. cb.subVectors( vC, vB );
  6220. ab.subVectors( vA, vB );
  6221. cb.cross( ab );
  6222. vertices[ face.a ].add( cb );
  6223. vertices[ face.b ].add( cb );
  6224. vertices[ face.c ].add( cb );
  6225. }
  6226. } else {
  6227. this.computeFaceNormals();
  6228. for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
  6229. face = this.faces[ f ];
  6230. vertices[ face.a ].add( face.normal );
  6231. vertices[ face.b ].add( face.normal );
  6232. vertices[ face.c ].add( face.normal );
  6233. }
  6234. }
  6235. for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
  6236. vertices[ v ].normalize();
  6237. }
  6238. for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
  6239. face = this.faces[ f ];
  6240. var vertexNormals = face.vertexNormals;
  6241. if ( vertexNormals.length === 3 ) {
  6242. vertexNormals[ 0 ].copy( vertices[ face.a ] );
  6243. vertexNormals[ 1 ].copy( vertices[ face.b ] );
  6244. vertexNormals[ 2 ].copy( vertices[ face.c ] );
  6245. } else {
  6246. vertexNormals[ 0 ] = vertices[ face.a ].clone();
  6247. vertexNormals[ 1 ] = vertices[ face.b ].clone();
  6248. vertexNormals[ 2 ] = vertices[ face.c ].clone();
  6249. }
  6250. }
  6251. if ( this.faces.length > 0 ) {
  6252. this.normalsNeedUpdate = true;
  6253. }
  6254. },
  6255. computeFlatVertexNormals: function () {
  6256. var f, fl, face;
  6257. this.computeFaceNormals();
  6258. for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
  6259. face = this.faces[ f ];
  6260. var vertexNormals = face.vertexNormals;
  6261. if ( vertexNormals.length === 3 ) {
  6262. vertexNormals[ 0 ].copy( face.normal );
  6263. vertexNormals[ 1 ].copy( face.normal );
  6264. vertexNormals[ 2 ].copy( face.normal );
  6265. } else {
  6266. vertexNormals[ 0 ] = face.normal.clone();
  6267. vertexNormals[ 1 ] = face.normal.clone();
  6268. vertexNormals[ 2 ] = face.normal.clone();
  6269. }
  6270. }
  6271. if ( this.faces.length > 0 ) {
  6272. this.normalsNeedUpdate = true;
  6273. }
  6274. },
  6275. computeMorphNormals: function () {
  6276. var i, il, f, fl, face;
  6277. // save original normals
  6278. // - create temp variables on first access
  6279. // otherwise just copy (for faster repeated calls)
  6280. for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
  6281. face = this.faces[ f ];
  6282. if ( ! face.__originalFaceNormal ) {
  6283. face.__originalFaceNormal = face.normal.clone();
  6284. } else {
  6285. face.__originalFaceNormal.copy( face.normal );
  6286. }
  6287. if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];
  6288. for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {
  6289. if ( ! face.__originalVertexNormals[ i ] ) {
  6290. face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();
  6291. } else {
  6292. face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );
  6293. }
  6294. }
  6295. }
  6296. // use temp geometry to compute face and vertex normals for each morph
  6297. var tmpGeo = new Geometry();
  6298. tmpGeo.faces = this.faces;
  6299. for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {
  6300. // create on first access
  6301. if ( ! this.morphNormals[ i ] ) {
  6302. this.morphNormals[ i ] = {};
  6303. this.morphNormals[ i ].faceNormals = [];
  6304. this.morphNormals[ i ].vertexNormals = [];
  6305. var dstNormalsFace = this.morphNormals[ i ].faceNormals;
  6306. var dstNormalsVertex = this.morphNormals[ i ].vertexNormals;
  6307. var faceNormal, vertexNormals;
  6308. for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
  6309. faceNormal = new Vector3();
  6310. vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };
  6311. dstNormalsFace.push( faceNormal );
  6312. dstNormalsVertex.push( vertexNormals );
  6313. }
  6314. }
  6315. var morphNormals = this.morphNormals[ i ];
  6316. // set vertices to morph target
  6317. tmpGeo.vertices = this.morphTargets[ i ].vertices;
  6318. // compute morph normals
  6319. tmpGeo.computeFaceNormals();
  6320. tmpGeo.computeVertexNormals();
  6321. // store morph normals
  6322. var faceNormal, vertexNormals;
  6323. for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
  6324. face = this.faces[ f ];
  6325. faceNormal = morphNormals.faceNormals[ f ];
  6326. vertexNormals = morphNormals.vertexNormals[ f ];
  6327. faceNormal.copy( face.normal );
  6328. vertexNormals.a.copy( face.vertexNormals[ 0 ] );
  6329. vertexNormals.b.copy( face.vertexNormals[ 1 ] );
  6330. vertexNormals.c.copy( face.vertexNormals[ 2 ] );
  6331. }
  6332. }
  6333. // restore original normals
  6334. for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
  6335. face = this.faces[ f ];
  6336. face.normal = face.__originalFaceNormal;
  6337. face.vertexNormals = face.__originalVertexNormals;
  6338. }
  6339. },
  6340. computeBoundingBox: function () {
  6341. if ( this.boundingBox === null ) {
  6342. this.boundingBox = new Box3();
  6343. }
  6344. this.boundingBox.setFromPoints( this.vertices );
  6345. },
  6346. computeBoundingSphere: function () {
  6347. if ( this.boundingSphere === null ) {
  6348. this.boundingSphere = new Sphere();
  6349. }
  6350. this.boundingSphere.setFromPoints( this.vertices );
  6351. },
  6352. merge: function ( geometry, matrix, materialIndexOffset ) {
  6353. if ( ! ( geometry && geometry.isGeometry ) ) {
  6354. console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );
  6355. return;
  6356. }
  6357. var normalMatrix,
  6358. vertexOffset = this.vertices.length,
  6359. vertices1 = this.vertices,
  6360. vertices2 = geometry.vertices,
  6361. faces1 = this.faces,
  6362. faces2 = geometry.faces,
  6363. uvs1 = this.faceVertexUvs[ 0 ],
  6364. uvs2 = geometry.faceVertexUvs[ 0 ],
  6365. colors1 = this.colors,
  6366. colors2 = geometry.colors;
  6367. if ( materialIndexOffset === undefined ) materialIndexOffset = 0;
  6368. if ( matrix !== undefined ) {
  6369. normalMatrix = new Matrix3().getNormalMatrix( matrix );
  6370. }
  6371. // vertices
  6372. for ( var i = 0, il = vertices2.length; i < il; i ++ ) {
  6373. var vertex = vertices2[ i ];
  6374. var vertexCopy = vertex.clone();
  6375. if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );
  6376. vertices1.push( vertexCopy );
  6377. }
  6378. // colors
  6379. for ( var i = 0, il = colors2.length; i < il; i ++ ) {
  6380. colors1.push( colors2[ i ].clone() );
  6381. }
  6382. // faces
  6383. for ( i = 0, il = faces2.length; i < il; i ++ ) {
  6384. var face = faces2[ i ], faceCopy, normal, color,
  6385. faceVertexNormals = face.vertexNormals,
  6386. faceVertexColors = face.vertexColors;
  6387. faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );
  6388. faceCopy.normal.copy( face.normal );
  6389. if ( normalMatrix !== undefined ) {
  6390. faceCopy.normal.applyMatrix3( normalMatrix ).normalize();
  6391. }
  6392. for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {
  6393. normal = faceVertexNormals[ j ].clone();
  6394. if ( normalMatrix !== undefined ) {
  6395. normal.applyMatrix3( normalMatrix ).normalize();
  6396. }
  6397. faceCopy.vertexNormals.push( normal );
  6398. }
  6399. faceCopy.color.copy( face.color );
  6400. for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {
  6401. color = faceVertexColors[ j ];
  6402. faceCopy.vertexColors.push( color.clone() );
  6403. }
  6404. faceCopy.materialIndex = face.materialIndex + materialIndexOffset;
  6405. faces1.push( faceCopy );
  6406. }
  6407. // uvs
  6408. for ( i = 0, il = uvs2.length; i < il; i ++ ) {
  6409. var uv = uvs2[ i ], uvCopy = [];
  6410. if ( uv === undefined ) {
  6411. continue;
  6412. }
  6413. for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
  6414. uvCopy.push( uv[ j ].clone() );
  6415. }
  6416. uvs1.push( uvCopy );
  6417. }
  6418. },
  6419. mergeMesh: function ( mesh ) {
  6420. if ( ! ( mesh && mesh.isMesh ) ) {
  6421. console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );
  6422. return;
  6423. }
  6424. if ( mesh.matrixAutoUpdate ) mesh.updateMatrix();
  6425. this.merge( mesh.geometry, mesh.matrix );
  6426. },
  6427. /*
  6428. * Checks for duplicate vertices with hashmap.
  6429. * Duplicated vertices are removed
  6430. * and faces' vertices are updated.
  6431. */
  6432. mergeVertices: function () {
  6433. var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)
  6434. var unique = [], changes = [];
  6435. var v, key;
  6436. var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001
  6437. var precision = Math.pow( 10, precisionPoints );
  6438. var i, il, face;
  6439. var indices, j, jl;
  6440. for ( i = 0, il = this.vertices.length; i < il; i ++ ) {
  6441. v = this.vertices[ i ];
  6442. key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );
  6443. if ( verticesMap[ key ] === undefined ) {
  6444. verticesMap[ key ] = i;
  6445. unique.push( this.vertices[ i ] );
  6446. changes[ i ] = unique.length - 1;
  6447. } else {
  6448. //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);
  6449. changes[ i ] = changes[ verticesMap[ key ] ];
  6450. }
  6451. }
  6452. // if faces are completely degenerate after merging vertices, we
  6453. // have to remove them from the geometry.
  6454. var faceIndicesToRemove = [];
  6455. for ( i = 0, il = this.faces.length; i < il; i ++ ) {
  6456. face = this.faces[ i ];
  6457. face.a = changes[ face.a ];
  6458. face.b = changes[ face.b ];
  6459. face.c = changes[ face.c ];
  6460. indices = [ face.a, face.b, face.c ];
  6461. // if any duplicate vertices are found in a Face3
  6462. // we have to remove the face as nothing can be saved
  6463. for ( var n = 0; n < 3; n ++ ) {
  6464. if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {
  6465. faceIndicesToRemove.push( i );
  6466. break;
  6467. }
  6468. }
  6469. }
  6470. for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {
  6471. var idx = faceIndicesToRemove[ i ];
  6472. this.faces.splice( idx, 1 );
  6473. for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {
  6474. this.faceVertexUvs[ j ].splice( idx, 1 );
  6475. }
  6476. }
  6477. // Use unique set of vertices
  6478. var diff = this.vertices.length - unique.length;
  6479. this.vertices = unique;
  6480. return diff;
  6481. },
  6482. setFromPoints: function ( points ) {
  6483. this.vertices = [];
  6484. for ( var i = 0, l = points.length; i < l; i ++ ) {
  6485. var point = points[ i ];
  6486. this.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );
  6487. }
  6488. return this;
  6489. },
  6490. sortFacesByMaterialIndex: function () {
  6491. var faces = this.faces;
  6492. var length = faces.length;
  6493. // tag faces
  6494. for ( var i = 0; i < length; i ++ ) {
  6495. faces[ i ]._id = i;
  6496. }
  6497. // sort faces
  6498. function materialIndexSort( a, b ) {
  6499. return a.materialIndex - b.materialIndex;
  6500. }
  6501. faces.sort( materialIndexSort );
  6502. // sort uvs
  6503. var uvs1 = this.faceVertexUvs[ 0 ];
  6504. var uvs2 = this.faceVertexUvs[ 1 ];
  6505. var newUvs1, newUvs2;
  6506. if ( uvs1 && uvs1.length === length ) newUvs1 = [];
  6507. if ( uvs2 && uvs2.length === length ) newUvs2 = [];
  6508. for ( var i = 0; i < length; i ++ ) {
  6509. var id = faces[ i ]._id;
  6510. if ( newUvs1 ) newUvs1.push( uvs1[ id ] );
  6511. if ( newUvs2 ) newUvs2.push( uvs2[ id ] );
  6512. }
  6513. if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;
  6514. if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;
  6515. },
  6516. toJSON: function () {
  6517. var data = {
  6518. metadata: {
  6519. version: 4.5,
  6520. type: 'Geometry',
  6521. generator: 'Geometry.toJSON'
  6522. }
  6523. };
  6524. // standard Geometry serialization
  6525. data.uuid = this.uuid;
  6526. data.type = this.type;
  6527. if ( this.name !== '' ) data.name = this.name;
  6528. if ( this.parameters !== undefined ) {
  6529. var parameters = this.parameters;
  6530. for ( var key in parameters ) {
  6531. if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];
  6532. }
  6533. return data;
  6534. }
  6535. var vertices = [];
  6536. for ( var i = 0; i < this.vertices.length; i ++ ) {
  6537. var vertex = this.vertices[ i ];
  6538. vertices.push( vertex.x, vertex.y, vertex.z );
  6539. }
  6540. var faces = [];
  6541. var normals = [];
  6542. var normalsHash = {};
  6543. var colors = [];
  6544. var colorsHash = {};
  6545. var uvs = [];
  6546. var uvsHash = {};
  6547. for ( var i = 0; i < this.faces.length; i ++ ) {
  6548. var face = this.faces[ i ];
  6549. var hasMaterial = true;
  6550. var hasFaceUv = false; // deprecated
  6551. var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;
  6552. var hasFaceNormal = face.normal.length() > 0;
  6553. var hasFaceVertexNormal = face.vertexNormals.length > 0;
  6554. var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;
  6555. var hasFaceVertexColor = face.vertexColors.length > 0;
  6556. var faceType = 0;
  6557. faceType = setBit( faceType, 0, 0 ); // isQuad
  6558. faceType = setBit( faceType, 1, hasMaterial );
  6559. faceType = setBit( faceType, 2, hasFaceUv );
  6560. faceType = setBit( faceType, 3, hasFaceVertexUv );
  6561. faceType = setBit( faceType, 4, hasFaceNormal );
  6562. faceType = setBit( faceType, 5, hasFaceVertexNormal );
  6563. faceType = setBit( faceType, 6, hasFaceColor );
  6564. faceType = setBit( faceType, 7, hasFaceVertexColor );
  6565. faces.push( faceType );
  6566. faces.push( face.a, face.b, face.c );
  6567. faces.push( face.materialIndex );
  6568. if ( hasFaceVertexUv ) {
  6569. var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];
  6570. faces.push(
  6571. getUvIndex( faceVertexUvs[ 0 ] ),
  6572. getUvIndex( faceVertexUvs[ 1 ] ),
  6573. getUvIndex( faceVertexUvs[ 2 ] )
  6574. );
  6575. }
  6576. if ( hasFaceNormal ) {
  6577. faces.push( getNormalIndex( face.normal ) );
  6578. }
  6579. if ( hasFaceVertexNormal ) {
  6580. var vertexNormals = face.vertexNormals;
  6581. faces.push(
  6582. getNormalIndex( vertexNormals[ 0 ] ),
  6583. getNormalIndex( vertexNormals[ 1 ] ),
  6584. getNormalIndex( vertexNormals[ 2 ] )
  6585. );
  6586. }
  6587. if ( hasFaceColor ) {
  6588. faces.push( getColorIndex( face.color ) );
  6589. }
  6590. if ( hasFaceVertexColor ) {
  6591. var vertexColors = face.vertexColors;
  6592. faces.push(
  6593. getColorIndex( vertexColors[ 0 ] ),
  6594. getColorIndex( vertexColors[ 1 ] ),
  6595. getColorIndex( vertexColors[ 2 ] )
  6596. );
  6597. }
  6598. }
  6599. function setBit( value, position, enabled ) {
  6600. return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );
  6601. }
  6602. function getNormalIndex( normal ) {
  6603. var hash = normal.x.toString() + normal.y.toString() + normal.z.toString();
  6604. if ( normalsHash[ hash ] !== undefined ) {
  6605. return normalsHash[ hash ];
  6606. }
  6607. normalsHash[ hash ] = normals.length / 3;
  6608. normals.push( normal.x, normal.y, normal.z );
  6609. return normalsHash[ hash ];
  6610. }
  6611. function getColorIndex( color ) {
  6612. var hash = color.r.toString() + color.g.toString() + color.b.toString();
  6613. if ( colorsHash[ hash ] !== undefined ) {
  6614. return colorsHash[ hash ];
  6615. }
  6616. colorsHash[ hash ] = colors.length;
  6617. colors.push( color.getHex() );
  6618. return colorsHash[ hash ];
  6619. }
  6620. function getUvIndex( uv ) {
  6621. var hash = uv.x.toString() + uv.y.toString();
  6622. if ( uvsHash[ hash ] !== undefined ) {
  6623. return uvsHash[ hash ];
  6624. }
  6625. uvsHash[ hash ] = uvs.length / 2;
  6626. uvs.push( uv.x, uv.y );
  6627. return uvsHash[ hash ];
  6628. }
  6629. data.data = {};
  6630. data.data.vertices = vertices;
  6631. data.data.normals = normals;
  6632. if ( colors.length > 0 ) data.data.colors = colors;
  6633. if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility
  6634. data.data.faces = faces;
  6635. return data;
  6636. },
  6637. clone: function () {
  6638. /*
  6639. // Handle primitives
  6640. var parameters = this.parameters;
  6641. if ( parameters !== undefined ) {
  6642. var values = [];
  6643. for ( var key in parameters ) {
  6644. values.push( parameters[ key ] );
  6645. }
  6646. var geometry = Object.create( this.constructor.prototype );
  6647. this.constructor.apply( geometry, values );
  6648. return geometry;
  6649. }
  6650. return new this.constructor().copy( this );
  6651. */
  6652. return new Geometry().copy( this );
  6653. },
  6654. copy: function ( source ) {
  6655. var i, il, j, jl, k, kl;
  6656. // reset
  6657. this.vertices = [];
  6658. this.colors = [];
  6659. this.faces = [];
  6660. this.faceVertexUvs = [[]];
  6661. this.morphTargets = [];
  6662. this.morphNormals = [];
  6663. this.skinWeights = [];
  6664. this.skinIndices = [];
  6665. this.lineDistances = [];
  6666. this.boundingBox = null;
  6667. this.boundingSphere = null;
  6668. // name
  6669. this.name = source.name;
  6670. // vertices
  6671. var vertices = source.vertices;
  6672. for ( i = 0, il = vertices.length; i < il; i ++ ) {
  6673. this.vertices.push( vertices[ i ].clone() );
  6674. }
  6675. // colors
  6676. var colors = source.colors;
  6677. for ( i = 0, il = colors.length; i < il; i ++ ) {
  6678. this.colors.push( colors[ i ].clone() );
  6679. }
  6680. // faces
  6681. var faces = source.faces;
  6682. for ( i = 0, il = faces.length; i < il; i ++ ) {
  6683. this.faces.push( faces[ i ].clone() );
  6684. }
  6685. // face vertex uvs
  6686. for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {
  6687. var faceVertexUvs = source.faceVertexUvs[ i ];
  6688. if ( this.faceVertexUvs[ i ] === undefined ) {
  6689. this.faceVertexUvs[ i ] = [];
  6690. }
  6691. for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {
  6692. var uvs = faceVertexUvs[ j ], uvsCopy = [];
  6693. for ( k = 0, kl = uvs.length; k < kl; k ++ ) {
  6694. var uv = uvs[ k ];
  6695. uvsCopy.push( uv.clone() );
  6696. }
  6697. this.faceVertexUvs[ i ].push( uvsCopy );
  6698. }
  6699. }
  6700. // morph targets
  6701. var morphTargets = source.morphTargets;
  6702. for ( i = 0, il = morphTargets.length; i < il; i ++ ) {
  6703. var morphTarget = {};
  6704. morphTarget.name = morphTargets[ i ].name;
  6705. // vertices
  6706. if ( morphTargets[ i ].vertices !== undefined ) {
  6707. morphTarget.vertices = [];
  6708. for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {
  6709. morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );
  6710. }
  6711. }
  6712. // normals
  6713. if ( morphTargets[ i ].normals !== undefined ) {
  6714. morphTarget.normals = [];
  6715. for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {
  6716. morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );
  6717. }
  6718. }
  6719. this.morphTargets.push( morphTarget );
  6720. }
  6721. // morph normals
  6722. var morphNormals = source.morphNormals;
  6723. for ( i = 0, il = morphNormals.length; i < il; i ++ ) {
  6724. var morphNormal = {};
  6725. // vertex normals
  6726. if ( morphNormals[ i ].vertexNormals !== undefined ) {
  6727. morphNormal.vertexNormals = [];
  6728. for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {
  6729. var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];
  6730. var destVertexNormal = {};
  6731. destVertexNormal.a = srcVertexNormal.a.clone();
  6732. destVertexNormal.b = srcVertexNormal.b.clone();
  6733. destVertexNormal.c = srcVertexNormal.c.clone();
  6734. morphNormal.vertexNormals.push( destVertexNormal );
  6735. }
  6736. }
  6737. // face normals
  6738. if ( morphNormals[ i ].faceNormals !== undefined ) {
  6739. morphNormal.faceNormals = [];
  6740. for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {
  6741. morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );
  6742. }
  6743. }
  6744. this.morphNormals.push( morphNormal );
  6745. }
  6746. // skin weights
  6747. var skinWeights = source.skinWeights;
  6748. for ( i = 0, il = skinWeights.length; i < il; i ++ ) {
  6749. this.skinWeights.push( skinWeights[ i ].clone() );
  6750. }
  6751. // skin indices
  6752. var skinIndices = source.skinIndices;
  6753. for ( i = 0, il = skinIndices.length; i < il; i ++ ) {
  6754. this.skinIndices.push( skinIndices[ i ].clone() );
  6755. }
  6756. // line distances
  6757. var lineDistances = source.lineDistances;
  6758. for ( i = 0, il = lineDistances.length; i < il; i ++ ) {
  6759. this.lineDistances.push( lineDistances[ i ] );
  6760. }
  6761. // bounding box
  6762. var boundingBox = source.boundingBox;
  6763. if ( boundingBox !== null ) {
  6764. this.boundingBox = boundingBox.clone();
  6765. }
  6766. // bounding sphere
  6767. var boundingSphere = source.boundingSphere;
  6768. if ( boundingSphere !== null ) {
  6769. this.boundingSphere = boundingSphere.clone();
  6770. }
  6771. // update flags
  6772. this.elementsNeedUpdate = source.elementsNeedUpdate;
  6773. this.verticesNeedUpdate = source.verticesNeedUpdate;
  6774. this.uvsNeedUpdate = source.uvsNeedUpdate;
  6775. this.normalsNeedUpdate = source.normalsNeedUpdate;
  6776. this.colorsNeedUpdate = source.colorsNeedUpdate;
  6777. this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;
  6778. this.groupsNeedUpdate = source.groupsNeedUpdate;
  6779. return this;
  6780. },
  6781. dispose: function () {
  6782. this.dispatchEvent( { type: 'dispose' } );
  6783. }
  6784. } );
  6785. /**
  6786. * @author mrdoob / http://mrdoob.com/
  6787. */
  6788. function BufferAttribute( array, itemSize, normalized ) {
  6789. if ( Array.isArray( array ) ) {
  6790. throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );
  6791. }
  6792. this.name = '';
  6793. this.array = array;
  6794. this.itemSize = itemSize;
  6795. this.count = array !== undefined ? array.length / itemSize : 0;
  6796. this.normalized = normalized === true;
  6797. this.dynamic = false;
  6798. this.updateRange = { offset: 0, count: - 1 };
  6799. this.version = 0;
  6800. }
  6801. Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', {
  6802. set: function ( value ) {
  6803. if ( value === true ) this.version ++;
  6804. }
  6805. } );
  6806. Object.assign( BufferAttribute.prototype, {
  6807. isBufferAttribute: true,
  6808. onUploadCallback: function () {},
  6809. setArray: function ( array ) {
  6810. if ( Array.isArray( array ) ) {
  6811. throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );
  6812. }
  6813. this.count = array !== undefined ? array.length / this.itemSize : 0;
  6814. this.array = array;
  6815. return this;
  6816. },
  6817. setDynamic: function ( value ) {
  6818. this.dynamic = value;
  6819. return this;
  6820. },
  6821. copy: function ( source ) {
  6822. this.name = source.name;
  6823. this.array = new source.array.constructor( source.array );
  6824. this.itemSize = source.itemSize;
  6825. this.count = source.count;
  6826. this.normalized = source.normalized;
  6827. this.dynamic = source.dynamic;
  6828. return this;
  6829. },
  6830. copyAt: function ( index1, attribute, index2 ) {
  6831. index1 *= this.itemSize;
  6832. index2 *= attribute.itemSize;
  6833. for ( var i = 0, l = this.itemSize; i < l; i ++ ) {
  6834. this.array[ index1 + i ] = attribute.array[ index2 + i ];
  6835. }
  6836. return this;
  6837. },
  6838. copyArray: function ( array ) {
  6839. this.array.set( array );
  6840. return this;
  6841. },
  6842. copyColorsArray: function ( colors ) {
  6843. var array = this.array, offset = 0;
  6844. for ( var i = 0, l = colors.length; i < l; i ++ ) {
  6845. var color = colors[ i ];
  6846. if ( color === undefined ) {
  6847. console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );
  6848. color = new Color();
  6849. }
  6850. array[ offset ++ ] = color.r;
  6851. array[ offset ++ ] = color.g;
  6852. array[ offset ++ ] = color.b;
  6853. }
  6854. return this;
  6855. },
  6856. copyVector2sArray: function ( vectors ) {
  6857. var array = this.array, offset = 0;
  6858. for ( var i = 0, l = vectors.length; i < l; i ++ ) {
  6859. var vector = vectors[ i ];
  6860. if ( vector === undefined ) {
  6861. console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );
  6862. vector = new Vector2();
  6863. }
  6864. array[ offset ++ ] = vector.x;
  6865. array[ offset ++ ] = vector.y;
  6866. }
  6867. return this;
  6868. },
  6869. copyVector3sArray: function ( vectors ) {
  6870. var array = this.array, offset = 0;
  6871. for ( var i = 0, l = vectors.length; i < l; i ++ ) {
  6872. var vector = vectors[ i ];
  6873. if ( vector === undefined ) {
  6874. console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );
  6875. vector = new Vector3();
  6876. }
  6877. array[ offset ++ ] = vector.x;
  6878. array[ offset ++ ] = vector.y;
  6879. array[ offset ++ ] = vector.z;
  6880. }
  6881. return this;
  6882. },
  6883. copyVector4sArray: function ( vectors ) {
  6884. var array = this.array, offset = 0;
  6885. for ( var i = 0, l = vectors.length; i < l; i ++ ) {
  6886. var vector = vectors[ i ];
  6887. if ( vector === undefined ) {
  6888. console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );
  6889. vector = new Vector4();
  6890. }
  6891. array[ offset ++ ] = vector.x;
  6892. array[ offset ++ ] = vector.y;
  6893. array[ offset ++ ] = vector.z;
  6894. array[ offset ++ ] = vector.w;
  6895. }
  6896. return this;
  6897. },
  6898. set: function ( value, offset ) {
  6899. if ( offset === undefined ) offset = 0;
  6900. this.array.set( value, offset );
  6901. return this;
  6902. },
  6903. getX: function ( index ) {
  6904. return this.array[ index * this.itemSize ];
  6905. },
  6906. setX: function ( index, x ) {
  6907. this.array[ index * this.itemSize ] = x;
  6908. return this;
  6909. },
  6910. getY: function ( index ) {
  6911. return this.array[ index * this.itemSize + 1 ];
  6912. },
  6913. setY: function ( index, y ) {
  6914. this.array[ index * this.itemSize + 1 ] = y;
  6915. return this;
  6916. },
  6917. getZ: function ( index ) {
  6918. return this.array[ index * this.itemSize + 2 ];
  6919. },
  6920. setZ: function ( index, z ) {
  6921. this.array[ index * this.itemSize + 2 ] = z;
  6922. return this;
  6923. },
  6924. getW: function ( index ) {
  6925. return this.array[ index * this.itemSize + 3 ];
  6926. },
  6927. setW: function ( index, w ) {
  6928. this.array[ index * this.itemSize + 3 ] = w;
  6929. return this;
  6930. },
  6931. setXY: function ( index, x, y ) {
  6932. index *= this.itemSize;
  6933. this.array[ index + 0 ] = x;
  6934. this.array[ index + 1 ] = y;
  6935. return this;
  6936. },
  6937. setXYZ: function ( index, x, y, z ) {
  6938. index *= this.itemSize;
  6939. this.array[ index + 0 ] = x;
  6940. this.array[ index + 1 ] = y;
  6941. this.array[ index + 2 ] = z;
  6942. return this;
  6943. },
  6944. setXYZW: function ( index, x, y, z, w ) {
  6945. index *= this.itemSize;
  6946. this.array[ index + 0 ] = x;
  6947. this.array[ index + 1 ] = y;
  6948. this.array[ index + 2 ] = z;
  6949. this.array[ index + 3 ] = w;
  6950. return this;
  6951. },
  6952. onUpload: function ( callback ) {
  6953. this.onUploadCallback = callback;
  6954. return this;
  6955. },
  6956. clone: function () {
  6957. return new this.constructor( this.array, this.itemSize ).copy( this );
  6958. }
  6959. } );
  6960. //
  6961. function Int8BufferAttribute( array, itemSize, normalized ) {
  6962. BufferAttribute.call( this, new Int8Array( array ), itemSize, normalized );
  6963. }
  6964. Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
  6965. Int8BufferAttribute.prototype.constructor = Int8BufferAttribute;
  6966. function Uint8BufferAttribute( array, itemSize, normalized ) {
  6967. BufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized );
  6968. }
  6969. Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
  6970. Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;
  6971. function Uint8ClampedBufferAttribute( array, itemSize, normalized ) {
  6972. BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized );
  6973. }
  6974. Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );
  6975. Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;
  6976. function Int16BufferAttribute( array, itemSize, normalized ) {
  6977. BufferAttribute.call( this, new Int16Array( array ), itemSize, normalized );
  6978. }
  6979. Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
  6980. Int16BufferAttribute.prototype.constructor = Int16BufferAttribute;
  6981. function Uint16BufferAttribute( array, itemSize, normalized ) {
  6982. BufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized );
  6983. }
  6984. Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
  6985. Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;
  6986. function Int32BufferAttribute( array, itemSize, normalized ) {
  6987. BufferAttribute.call( this, new Int32Array( array ), itemSize, normalized );
  6988. }
  6989. Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
  6990. Int32BufferAttribute.prototype.constructor = Int32BufferAttribute;
  6991. function Uint32BufferAttribute( array, itemSize, normalized ) {
  6992. BufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized );
  6993. }
  6994. Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
  6995. Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;
  6996. function Float32BufferAttribute( array, itemSize, normalized ) {
  6997. BufferAttribute.call( this, new Float32Array( array ), itemSize, normalized );
  6998. }
  6999. Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
  7000. Float32BufferAttribute.prototype.constructor = Float32BufferAttribute;
  7001. function Float64BufferAttribute( array, itemSize, normalized ) {
  7002. BufferAttribute.call( this, new Float64Array( array ), itemSize, normalized );
  7003. }
  7004. Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
  7005. Float64BufferAttribute.prototype.constructor = Float64BufferAttribute;
  7006. /**
  7007. * @author mrdoob / http://mrdoob.com/
  7008. */
  7009. function DirectGeometry() {
  7010. this.vertices = [];
  7011. this.normals = [];
  7012. this.colors = [];
  7013. this.uvs = [];
  7014. this.uvs2 = [];
  7015. this.groups = [];
  7016. this.morphTargets = {};
  7017. this.skinWeights = [];
  7018. this.skinIndices = [];
  7019. // this.lineDistances = [];
  7020. this.boundingBox = null;
  7021. this.boundingSphere = null;
  7022. // update flags
  7023. this.verticesNeedUpdate = false;
  7024. this.normalsNeedUpdate = false;
  7025. this.colorsNeedUpdate = false;
  7026. this.uvsNeedUpdate = false;
  7027. this.groupsNeedUpdate = false;
  7028. }
  7029. Object.assign( DirectGeometry.prototype, {
  7030. computeGroups: function ( geometry ) {
  7031. var group;
  7032. var groups = [];
  7033. var materialIndex = undefined;
  7034. var faces = geometry.faces;
  7035. for ( var i = 0; i < faces.length; i ++ ) {
  7036. var face = faces[ i ];
  7037. // materials
  7038. if ( face.materialIndex !== materialIndex ) {
  7039. materialIndex = face.materialIndex;
  7040. if ( group !== undefined ) {
  7041. group.count = ( i * 3 ) - group.start;
  7042. groups.push( group );
  7043. }
  7044. group = {
  7045. start: i * 3,
  7046. materialIndex: materialIndex
  7047. };
  7048. }
  7049. }
  7050. if ( group !== undefined ) {
  7051. group.count = ( i * 3 ) - group.start;
  7052. groups.push( group );
  7053. }
  7054. this.groups = groups;
  7055. },
  7056. fromGeometry: function ( geometry ) {
  7057. var faces = geometry.faces;
  7058. var vertices = geometry.vertices;
  7059. var faceVertexUvs = geometry.faceVertexUvs;
  7060. var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;
  7061. var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;
  7062. // morphs
  7063. var morphTargets = geometry.morphTargets;
  7064. var morphTargetsLength = morphTargets.length;
  7065. var morphTargetsPosition;
  7066. if ( morphTargetsLength > 0 ) {
  7067. morphTargetsPosition = [];
  7068. for ( var i = 0; i < morphTargetsLength; i ++ ) {
  7069. morphTargetsPosition[ i ] = [];
  7070. }
  7071. this.morphTargets.position = morphTargetsPosition;
  7072. }
  7073. var morphNormals = geometry.morphNormals;
  7074. var morphNormalsLength = morphNormals.length;
  7075. var morphTargetsNormal;
  7076. if ( morphNormalsLength > 0 ) {
  7077. morphTargetsNormal = [];
  7078. for ( var i = 0; i < morphNormalsLength; i ++ ) {
  7079. morphTargetsNormal[ i ] = [];
  7080. }
  7081. this.morphTargets.normal = morphTargetsNormal;
  7082. }
  7083. // skins
  7084. var skinIndices = geometry.skinIndices;
  7085. var skinWeights = geometry.skinWeights;
  7086. var hasSkinIndices = skinIndices.length === vertices.length;
  7087. var hasSkinWeights = skinWeights.length === vertices.length;
  7088. //
  7089. if ( vertices.length > 0 && faces.length === 0 ) {
  7090. console.error( 'THREE.DirectGeometry: Faceless geometries are not supported.' );
  7091. }
  7092. for ( var i = 0; i < faces.length; i ++ ) {
  7093. var face = faces[ i ];
  7094. this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );
  7095. var vertexNormals = face.vertexNormals;
  7096. if ( vertexNormals.length === 3 ) {
  7097. this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );
  7098. } else {
  7099. var normal = face.normal;
  7100. this.normals.push( normal, normal, normal );
  7101. }
  7102. var vertexColors = face.vertexColors;
  7103. if ( vertexColors.length === 3 ) {
  7104. this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );
  7105. } else {
  7106. var color = face.color;
  7107. this.colors.push( color, color, color );
  7108. }
  7109. if ( hasFaceVertexUv === true ) {
  7110. var vertexUvs = faceVertexUvs[ 0 ][ i ];
  7111. if ( vertexUvs !== undefined ) {
  7112. this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );
  7113. } else {
  7114. console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );
  7115. this.uvs.push( new Vector2(), new Vector2(), new Vector2() );
  7116. }
  7117. }
  7118. if ( hasFaceVertexUv2 === true ) {
  7119. var vertexUvs = faceVertexUvs[ 1 ][ i ];
  7120. if ( vertexUvs !== undefined ) {
  7121. this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );
  7122. } else {
  7123. console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );
  7124. this.uvs2.push( new Vector2(), new Vector2(), new Vector2() );
  7125. }
  7126. }
  7127. // morphs
  7128. for ( var j = 0; j < morphTargetsLength; j ++ ) {
  7129. var morphTarget = morphTargets[ j ].vertices;
  7130. morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );
  7131. }
  7132. for ( var j = 0; j < morphNormalsLength; j ++ ) {
  7133. var morphNormal = morphNormals[ j ].vertexNormals[ i ];
  7134. morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );
  7135. }
  7136. // skins
  7137. if ( hasSkinIndices ) {
  7138. this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );
  7139. }
  7140. if ( hasSkinWeights ) {
  7141. this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );
  7142. }
  7143. }
  7144. this.computeGroups( geometry );
  7145. this.verticesNeedUpdate = geometry.verticesNeedUpdate;
  7146. this.normalsNeedUpdate = geometry.normalsNeedUpdate;
  7147. this.colorsNeedUpdate = geometry.colorsNeedUpdate;
  7148. this.uvsNeedUpdate = geometry.uvsNeedUpdate;
  7149. this.groupsNeedUpdate = geometry.groupsNeedUpdate;
  7150. return this;
  7151. }
  7152. } );
  7153. /**
  7154. * @author mrdoob / http://mrdoob.com/
  7155. */
  7156. function arrayMax( array ) {
  7157. if ( array.length === 0 ) return - Infinity;
  7158. var max = array[ 0 ];
  7159. for ( var i = 1, l = array.length; i < l; ++ i ) {
  7160. if ( array[ i ] > max ) max = array[ i ];
  7161. }
  7162. return max;
  7163. }
  7164. /**
  7165. * @author alteredq / http://alteredqualia.com/
  7166. * @author mrdoob / http://mrdoob.com/
  7167. */
  7168. var bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id
  7169. function BufferGeometry() {
  7170. Object.defineProperty( this, 'id', { value: bufferGeometryId += 2 } );
  7171. this.uuid = _Math.generateUUID();
  7172. this.name = '';
  7173. this.type = 'BufferGeometry';
  7174. this.index = null;
  7175. this.attributes = {};
  7176. this.morphAttributes = {};
  7177. this.groups = [];
  7178. this.boundingBox = null;
  7179. this.boundingSphere = null;
  7180. this.drawRange = { start: 0, count: Infinity };
  7181. this.userData = {};
  7182. }
  7183. BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
  7184. constructor: BufferGeometry,
  7185. isBufferGeometry: true,
  7186. getIndex: function () {
  7187. return this.index;
  7188. },
  7189. setIndex: function ( index ) {
  7190. if ( Array.isArray( index ) ) {
  7191. this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );
  7192. } else {
  7193. this.index = index;
  7194. }
  7195. },
  7196. addAttribute: function ( name, attribute ) {
  7197. if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {
  7198. console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );
  7199. return this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );
  7200. }
  7201. if ( name === 'index' ) {
  7202. console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );
  7203. this.setIndex( attribute );
  7204. return this;
  7205. }
  7206. this.attributes[ name ] = attribute;
  7207. return this;
  7208. },
  7209. getAttribute: function ( name ) {
  7210. return this.attributes[ name ];
  7211. },
  7212. removeAttribute: function ( name ) {
  7213. delete this.attributes[ name ];
  7214. return this;
  7215. },
  7216. addGroup: function ( start, count, materialIndex ) {
  7217. this.groups.push( {
  7218. start: start,
  7219. count: count,
  7220. materialIndex: materialIndex !== undefined ? materialIndex : 0
  7221. } );
  7222. },
  7223. clearGroups: function () {
  7224. this.groups = [];
  7225. },
  7226. setDrawRange: function ( start, count ) {
  7227. this.drawRange.start = start;
  7228. this.drawRange.count = count;
  7229. },
  7230. applyMatrix: function ( matrix ) {
  7231. var position = this.attributes.position;
  7232. if ( position !== undefined ) {
  7233. matrix.applyToBufferAttribute( position );
  7234. position.needsUpdate = true;
  7235. }
  7236. var normal = this.attributes.normal;
  7237. if ( normal !== undefined ) {
  7238. var normalMatrix = new Matrix3().getNormalMatrix( matrix );
  7239. normalMatrix.applyToBufferAttribute( normal );
  7240. normal.needsUpdate = true;
  7241. }
  7242. if ( this.boundingBox !== null ) {
  7243. this.computeBoundingBox();
  7244. }
  7245. if ( this.boundingSphere !== null ) {
  7246. this.computeBoundingSphere();
  7247. }
  7248. return this;
  7249. },
  7250. rotateX: function () {
  7251. // rotate geometry around world x-axis
  7252. var m1 = new Matrix4();
  7253. return function rotateX( angle ) {
  7254. m1.makeRotationX( angle );
  7255. this.applyMatrix( m1 );
  7256. return this;
  7257. };
  7258. }(),
  7259. rotateY: function () {
  7260. // rotate geometry around world y-axis
  7261. var m1 = new Matrix4();
  7262. return function rotateY( angle ) {
  7263. m1.makeRotationY( angle );
  7264. this.applyMatrix( m1 );
  7265. return this;
  7266. };
  7267. }(),
  7268. rotateZ: function () {
  7269. // rotate geometry around world z-axis
  7270. var m1 = new Matrix4();
  7271. return function rotateZ( angle ) {
  7272. m1.makeRotationZ( angle );
  7273. this.applyMatrix( m1 );
  7274. return this;
  7275. };
  7276. }(),
  7277. translate: function () {
  7278. // translate geometry
  7279. var m1 = new Matrix4();
  7280. return function translate( x, y, z ) {
  7281. m1.makeTranslation( x, y, z );
  7282. this.applyMatrix( m1 );
  7283. return this;
  7284. };
  7285. }(),
  7286. scale: function () {
  7287. // scale geometry
  7288. var m1 = new Matrix4();
  7289. return function scale( x, y, z ) {
  7290. m1.makeScale( x, y, z );
  7291. this.applyMatrix( m1 );
  7292. return this;
  7293. };
  7294. }(),
  7295. lookAt: function () {
  7296. var obj = new Object3D();
  7297. return function lookAt( vector ) {
  7298. obj.lookAt( vector );
  7299. obj.updateMatrix();
  7300. this.applyMatrix( obj.matrix );
  7301. };
  7302. }(),
  7303. center: function () {
  7304. var offset = new Vector3();
  7305. return function center() {
  7306. this.computeBoundingBox();
  7307. this.boundingBox.getCenter( offset ).negate();
  7308. this.translate( offset.x, offset.y, offset.z );
  7309. return this;
  7310. };
  7311. }(),
  7312. setFromObject: function ( object ) {
  7313. // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );
  7314. var geometry = object.geometry;
  7315. if ( object.isPoints || object.isLine ) {
  7316. var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );
  7317. var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );
  7318. this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );
  7319. this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );
  7320. if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {
  7321. var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );
  7322. this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );
  7323. }
  7324. if ( geometry.boundingSphere !== null ) {
  7325. this.boundingSphere = geometry.boundingSphere.clone();
  7326. }
  7327. if ( geometry.boundingBox !== null ) {
  7328. this.boundingBox = geometry.boundingBox.clone();
  7329. }
  7330. } else if ( object.isMesh ) {
  7331. if ( geometry && geometry.isGeometry ) {
  7332. this.fromGeometry( geometry );
  7333. }
  7334. }
  7335. return this;
  7336. },
  7337. setFromPoints: function ( points ) {
  7338. var position = [];
  7339. for ( var i = 0, l = points.length; i < l; i ++ ) {
  7340. var point = points[ i ];
  7341. position.push( point.x, point.y, point.z || 0 );
  7342. }
  7343. this.addAttribute( 'position', new Float32BufferAttribute( position, 3 ) );
  7344. return this;
  7345. },
  7346. updateFromObject: function ( object ) {
  7347. var geometry = object.geometry;
  7348. if ( object.isMesh ) {
  7349. var direct = geometry.__directGeometry;
  7350. if ( geometry.elementsNeedUpdate === true ) {
  7351. direct = undefined;
  7352. geometry.elementsNeedUpdate = false;
  7353. }
  7354. if ( direct === undefined ) {
  7355. return this.fromGeometry( geometry );
  7356. }
  7357. direct.verticesNeedUpdate = geometry.verticesNeedUpdate;
  7358. direct.normalsNeedUpdate = geometry.normalsNeedUpdate;
  7359. direct.colorsNeedUpdate = geometry.colorsNeedUpdate;
  7360. direct.uvsNeedUpdate = geometry.uvsNeedUpdate;
  7361. direct.groupsNeedUpdate = geometry.groupsNeedUpdate;
  7362. geometry.verticesNeedUpdate = false;
  7363. geometry.normalsNeedUpdate = false;
  7364. geometry.colorsNeedUpdate = false;
  7365. geometry.uvsNeedUpdate = false;
  7366. geometry.groupsNeedUpdate = false;
  7367. geometry = direct;
  7368. }
  7369. var attribute;
  7370. if ( geometry.verticesNeedUpdate === true ) {
  7371. attribute = this.attributes.position;
  7372. if ( attribute !== undefined ) {
  7373. attribute.copyVector3sArray( geometry.vertices );
  7374. attribute.needsUpdate = true;
  7375. }
  7376. geometry.verticesNeedUpdate = false;
  7377. }
  7378. if ( geometry.normalsNeedUpdate === true ) {
  7379. attribute = this.attributes.normal;
  7380. if ( attribute !== undefined ) {
  7381. attribute.copyVector3sArray( geometry.normals );
  7382. attribute.needsUpdate = true;
  7383. }
  7384. geometry.normalsNeedUpdate = false;
  7385. }
  7386. if ( geometry.colorsNeedUpdate === true ) {
  7387. attribute = this.attributes.color;
  7388. if ( attribute !== undefined ) {
  7389. attribute.copyColorsArray( geometry.colors );
  7390. attribute.needsUpdate = true;
  7391. }
  7392. geometry.colorsNeedUpdate = false;
  7393. }
  7394. if ( geometry.uvsNeedUpdate ) {
  7395. attribute = this.attributes.uv;
  7396. if ( attribute !== undefined ) {
  7397. attribute.copyVector2sArray( geometry.uvs );
  7398. attribute.needsUpdate = true;
  7399. }
  7400. geometry.uvsNeedUpdate = false;
  7401. }
  7402. if ( geometry.lineDistancesNeedUpdate ) {
  7403. attribute = this.attributes.lineDistance;
  7404. if ( attribute !== undefined ) {
  7405. attribute.copyArray( geometry.lineDistances );
  7406. attribute.needsUpdate = true;
  7407. }
  7408. geometry.lineDistancesNeedUpdate = false;
  7409. }
  7410. if ( geometry.groupsNeedUpdate ) {
  7411. geometry.computeGroups( object.geometry );
  7412. this.groups = geometry.groups;
  7413. geometry.groupsNeedUpdate = false;
  7414. }
  7415. return this;
  7416. },
  7417. fromGeometry: function ( geometry ) {
  7418. geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );
  7419. return this.fromDirectGeometry( geometry.__directGeometry );
  7420. },
  7421. fromDirectGeometry: function ( geometry ) {
  7422. var positions = new Float32Array( geometry.vertices.length * 3 );
  7423. this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );
  7424. if ( geometry.normals.length > 0 ) {
  7425. var normals = new Float32Array( geometry.normals.length * 3 );
  7426. this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );
  7427. }
  7428. if ( geometry.colors.length > 0 ) {
  7429. var colors = new Float32Array( geometry.colors.length * 3 );
  7430. this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );
  7431. }
  7432. if ( geometry.uvs.length > 0 ) {
  7433. var uvs = new Float32Array( geometry.uvs.length * 2 );
  7434. this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );
  7435. }
  7436. if ( geometry.uvs2.length > 0 ) {
  7437. var uvs2 = new Float32Array( geometry.uvs2.length * 2 );
  7438. this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );
  7439. }
  7440. // groups
  7441. this.groups = geometry.groups;
  7442. // morphs
  7443. for ( var name in geometry.morphTargets ) {
  7444. var array = [];
  7445. var morphTargets = geometry.morphTargets[ name ];
  7446. for ( var i = 0, l = morphTargets.length; i < l; i ++ ) {
  7447. var morphTarget = morphTargets[ i ];
  7448. var attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );
  7449. array.push( attribute.copyVector3sArray( morphTarget ) );
  7450. }
  7451. this.morphAttributes[ name ] = array;
  7452. }
  7453. // skinning
  7454. if ( geometry.skinIndices.length > 0 ) {
  7455. var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );
  7456. this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );
  7457. }
  7458. if ( geometry.skinWeights.length > 0 ) {
  7459. var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );
  7460. this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );
  7461. }
  7462. //
  7463. if ( geometry.boundingSphere !== null ) {
  7464. this.boundingSphere = geometry.boundingSphere.clone();
  7465. }
  7466. if ( geometry.boundingBox !== null ) {
  7467. this.boundingBox = geometry.boundingBox.clone();
  7468. }
  7469. return this;
  7470. },
  7471. computeBoundingBox: function () {
  7472. if ( this.boundingBox === null ) {
  7473. this.boundingBox = new Box3();
  7474. }
  7475. var position = this.attributes.position;
  7476. if ( position !== undefined ) {
  7477. this.boundingBox.setFromBufferAttribute( position );
  7478. } else {
  7479. this.boundingBox.makeEmpty();
  7480. }
  7481. if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {
  7482. console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this );
  7483. }
  7484. },
  7485. computeBoundingSphere: function () {
  7486. var box = new Box3();
  7487. var vector = new Vector3();
  7488. return function computeBoundingSphere() {
  7489. if ( this.boundingSphere === null ) {
  7490. this.boundingSphere = new Sphere();
  7491. }
  7492. var position = this.attributes.position;
  7493. if ( position ) {
  7494. var center = this.boundingSphere.center;
  7495. box.setFromBufferAttribute( position );
  7496. box.getCenter( center );
  7497. // hoping to find a boundingSphere with a radius smaller than the
  7498. // boundingSphere of the boundingBox: sqrt(3) smaller in the best case
  7499. var maxRadiusSq = 0;
  7500. for ( var i = 0, il = position.count; i < il; i ++ ) {
  7501. vector.x = position.getX( i );
  7502. vector.y = position.getY( i );
  7503. vector.z = position.getZ( i );
  7504. maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );
  7505. }
  7506. this.boundingSphere.radius = Math.sqrt( maxRadiusSq );
  7507. if ( isNaN( this.boundingSphere.radius ) ) {
  7508. console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this );
  7509. }
  7510. }
  7511. };
  7512. }(),
  7513. computeFaceNormals: function () {
  7514. // backwards compatibility
  7515. },
  7516. computeVertexNormals: function () {
  7517. var index = this.index;
  7518. var attributes = this.attributes;
  7519. var groups = this.groups;
  7520. if ( attributes.position ) {
  7521. var positions = attributes.position.array;
  7522. if ( attributes.normal === undefined ) {
  7523. this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );
  7524. } else {
  7525. // reset existing normals to zero
  7526. var array = attributes.normal.array;
  7527. for ( var i = 0, il = array.length; i < il; i ++ ) {
  7528. array[ i ] = 0;
  7529. }
  7530. }
  7531. var normals = attributes.normal.array;
  7532. var vA, vB, vC;
  7533. var pA = new Vector3(), pB = new Vector3(), pC = new Vector3();
  7534. var cb = new Vector3(), ab = new Vector3();
  7535. // indexed elements
  7536. if ( index ) {
  7537. var indices = index.array;
  7538. if ( groups.length === 0 ) {
  7539. this.addGroup( 0, indices.length );
  7540. }
  7541. for ( var j = 0, jl = groups.length; j < jl; ++ j ) {
  7542. var group = groups[ j ];
  7543. var start = group.start;
  7544. var count = group.count;
  7545. for ( var i = start, il = start + count; i < il; i += 3 ) {
  7546. vA = indices[ i + 0 ] * 3;
  7547. vB = indices[ i + 1 ] * 3;
  7548. vC = indices[ i + 2 ] * 3;
  7549. pA.fromArray( positions, vA );
  7550. pB.fromArray( positions, vB );
  7551. pC.fromArray( positions, vC );
  7552. cb.subVectors( pC, pB );
  7553. ab.subVectors( pA, pB );
  7554. cb.cross( ab );
  7555. normals[ vA ] += cb.x;
  7556. normals[ vA + 1 ] += cb.y;
  7557. normals[ vA + 2 ] += cb.z;
  7558. normals[ vB ] += cb.x;
  7559. normals[ vB + 1 ] += cb.y;
  7560. normals[ vB + 2 ] += cb.z;
  7561. normals[ vC ] += cb.x;
  7562. normals[ vC + 1 ] += cb.y;
  7563. normals[ vC + 2 ] += cb.z;
  7564. }
  7565. }
  7566. } else {
  7567. // non-indexed elements (unconnected triangle soup)
  7568. for ( var i = 0, il = positions.length; i < il; i += 9 ) {
  7569. pA.fromArray( positions, i );
  7570. pB.fromArray( positions, i + 3 );
  7571. pC.fromArray( positions, i + 6 );
  7572. cb.subVectors( pC, pB );
  7573. ab.subVectors( pA, pB );
  7574. cb.cross( ab );
  7575. normals[ i ] = cb.x;
  7576. normals[ i + 1 ] = cb.y;
  7577. normals[ i + 2 ] = cb.z;
  7578. normals[ i + 3 ] = cb.x;
  7579. normals[ i + 4 ] = cb.y;
  7580. normals[ i + 5 ] = cb.z;
  7581. normals[ i + 6 ] = cb.x;
  7582. normals[ i + 7 ] = cb.y;
  7583. normals[ i + 8 ] = cb.z;
  7584. }
  7585. }
  7586. this.normalizeNormals();
  7587. attributes.normal.needsUpdate = true;
  7588. }
  7589. },
  7590. merge: function ( geometry, offset ) {
  7591. if ( ! ( geometry && geometry.isBufferGeometry ) ) {
  7592. console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );
  7593. return;
  7594. }
  7595. if ( offset === undefined ) {
  7596. offset = 0;
  7597. console.warn(
  7598. 'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '
  7599. + 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'
  7600. );
  7601. }
  7602. var attributes = this.attributes;
  7603. for ( var key in attributes ) {
  7604. if ( geometry.attributes[ key ] === undefined ) continue;
  7605. var attribute1 = attributes[ key ];
  7606. var attributeArray1 = attribute1.array;
  7607. var attribute2 = geometry.attributes[ key ];
  7608. var attributeArray2 = attribute2.array;
  7609. var attributeSize = attribute2.itemSize;
  7610. for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {
  7611. attributeArray1[ j ] = attributeArray2[ i ];
  7612. }
  7613. }
  7614. return this;
  7615. },
  7616. normalizeNormals: function () {
  7617. var vector = new Vector3();
  7618. return function normalizeNormals() {
  7619. var normals = this.attributes.normal;
  7620. for ( var i = 0, il = normals.count; i < il; i ++ ) {
  7621. vector.x = normals.getX( i );
  7622. vector.y = normals.getY( i );
  7623. vector.z = normals.getZ( i );
  7624. vector.normalize();
  7625. normals.setXYZ( i, vector.x, vector.y, vector.z );
  7626. }
  7627. };
  7628. }(),
  7629. toNonIndexed: function () {
  7630. if ( this.index === null ) {
  7631. console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );
  7632. return this;
  7633. }
  7634. var geometry2 = new BufferGeometry();
  7635. var indices = this.index.array;
  7636. var attributes = this.attributes;
  7637. for ( var name in attributes ) {
  7638. var attribute = attributes[ name ];
  7639. var array = attribute.array;
  7640. var itemSize = attribute.itemSize;
  7641. var array2 = new array.constructor( indices.length * itemSize );
  7642. var index = 0, index2 = 0;
  7643. for ( var i = 0, l = indices.length; i < l; i ++ ) {
  7644. index = indices[ i ] * itemSize;
  7645. for ( var j = 0; j < itemSize; j ++ ) {
  7646. array2[ index2 ++ ] = array[ index ++ ];
  7647. }
  7648. }
  7649. geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );
  7650. }
  7651. var groups = this.groups;
  7652. for ( var i = 0, l = groups.length; i < l; i ++ ) {
  7653. var group = groups[ i ];
  7654. geometry2.addGroup( group.start, group.count, group.materialIndex );
  7655. }
  7656. return geometry2;
  7657. },
  7658. toJSON: function () {
  7659. var data = {
  7660. metadata: {
  7661. version: 4.5,
  7662. type: 'BufferGeometry',
  7663. generator: 'BufferGeometry.toJSON'
  7664. }
  7665. };
  7666. // standard BufferGeometry serialization
  7667. data.uuid = this.uuid;
  7668. data.type = this.type;
  7669. if ( this.name !== '' ) data.name = this.name;
  7670. if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;
  7671. if ( this.parameters !== undefined ) {
  7672. var parameters = this.parameters;
  7673. for ( var key in parameters ) {
  7674. if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];
  7675. }
  7676. return data;
  7677. }
  7678. data.data = { attributes: {} };
  7679. var index = this.index;
  7680. if ( index !== null ) {
  7681. var array = Array.prototype.slice.call( index.array );
  7682. data.data.index = {
  7683. type: index.array.constructor.name,
  7684. array: array
  7685. };
  7686. }
  7687. var attributes = this.attributes;
  7688. for ( var key in attributes ) {
  7689. var attribute = attributes[ key ];
  7690. var array = Array.prototype.slice.call( attribute.array );
  7691. data.data.attributes[ key ] = {
  7692. itemSize: attribute.itemSize,
  7693. type: attribute.array.constructor.name,
  7694. array: array,
  7695. normalized: attribute.normalized
  7696. };
  7697. }
  7698. var groups = this.groups;
  7699. if ( groups.length > 0 ) {
  7700. data.data.groups = JSON.parse( JSON.stringify( groups ) );
  7701. }
  7702. var boundingSphere = this.boundingSphere;
  7703. if ( boundingSphere !== null ) {
  7704. data.data.boundingSphere = {
  7705. center: boundingSphere.center.toArray(),
  7706. radius: boundingSphere.radius
  7707. };
  7708. }
  7709. return data;
  7710. },
  7711. clone: function () {
  7712. /*
  7713. // Handle primitives
  7714. var parameters = this.parameters;
  7715. if ( parameters !== undefined ) {
  7716. var values = [];
  7717. for ( var key in parameters ) {
  7718. values.push( parameters[ key ] );
  7719. }
  7720. var geometry = Object.create( this.constructor.prototype );
  7721. this.constructor.apply( geometry, values );
  7722. return geometry;
  7723. }
  7724. return new this.constructor().copy( this );
  7725. */
  7726. return new BufferGeometry().copy( this );
  7727. },
  7728. copy: function ( source ) {
  7729. var name, i, l;
  7730. // reset
  7731. this.index = null;
  7732. this.attributes = {};
  7733. this.morphAttributes = {};
  7734. this.groups = [];
  7735. this.boundingBox = null;
  7736. this.boundingSphere = null;
  7737. // name
  7738. this.name = source.name;
  7739. // index
  7740. var index = source.index;
  7741. if ( index !== null ) {
  7742. this.setIndex( index.clone() );
  7743. }
  7744. // attributes
  7745. var attributes = source.attributes;
  7746. for ( name in attributes ) {
  7747. var attribute = attributes[ name ];
  7748. this.addAttribute( name, attribute.clone() );
  7749. }
  7750. // morph attributes
  7751. var morphAttributes = source.morphAttributes;
  7752. for ( name in morphAttributes ) {
  7753. var array = [];
  7754. var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes
  7755. for ( i = 0, l = morphAttribute.length; i < l; i ++ ) {
  7756. array.push( morphAttribute[ i ].clone() );
  7757. }
  7758. this.morphAttributes[ name ] = array;
  7759. }
  7760. // groups
  7761. var groups = source.groups;
  7762. for ( i = 0, l = groups.length; i < l; i ++ ) {
  7763. var group = groups[ i ];
  7764. this.addGroup( group.start, group.count, group.materialIndex );
  7765. }
  7766. // bounding box
  7767. var boundingBox = source.boundingBox;
  7768. if ( boundingBox !== null ) {
  7769. this.boundingBox = boundingBox.clone();
  7770. }
  7771. // bounding sphere
  7772. var boundingSphere = source.boundingSphere;
  7773. if ( boundingSphere !== null ) {
  7774. this.boundingSphere = boundingSphere.clone();
  7775. }
  7776. // draw range
  7777. this.drawRange.start = source.drawRange.start;
  7778. this.drawRange.count = source.drawRange.count;
  7779. // user data
  7780. this.userData = source.userData;
  7781. return this;
  7782. },
  7783. dispose: function () {
  7784. this.dispatchEvent( { type: 'dispose' } );
  7785. }
  7786. } );
  7787. /**
  7788. * @author mrdoob / http://mrdoob.com/
  7789. * @author Mugen87 / https://github.com/Mugen87
  7790. */
  7791. // BoxGeometry
  7792. function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {
  7793. Geometry.call( this );
  7794. this.type = 'BoxGeometry';
  7795. this.parameters = {
  7796. width: width,
  7797. height: height,
  7798. depth: depth,
  7799. widthSegments: widthSegments,
  7800. heightSegments: heightSegments,
  7801. depthSegments: depthSegments
  7802. };
  7803. this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );
  7804. this.mergeVertices();
  7805. }
  7806. BoxGeometry.prototype = Object.create( Geometry.prototype );
  7807. BoxGeometry.prototype.constructor = BoxGeometry;
  7808. // BoxBufferGeometry
  7809. function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {
  7810. BufferGeometry.call( this );
  7811. this.type = 'BoxBufferGeometry';
  7812. this.parameters = {
  7813. width: width,
  7814. height: height,
  7815. depth: depth,
  7816. widthSegments: widthSegments,
  7817. heightSegments: heightSegments,
  7818. depthSegments: depthSegments
  7819. };
  7820. var scope = this;
  7821. width = width || 1;
  7822. height = height || 1;
  7823. depth = depth || 1;
  7824. // segments
  7825. widthSegments = Math.floor( widthSegments ) || 1;
  7826. heightSegments = Math.floor( heightSegments ) || 1;
  7827. depthSegments = Math.floor( depthSegments ) || 1;
  7828. // buffers
  7829. var indices = [];
  7830. var vertices = [];
  7831. var normals = [];
  7832. var uvs = [];
  7833. // helper variables
  7834. var numberOfVertices = 0;
  7835. var groupStart = 0;
  7836. // build each side of the box geometry
  7837. buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px
  7838. buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx
  7839. buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py
  7840. buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny
  7841. buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz
  7842. buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz
  7843. // build geometry
  7844. this.setIndex( indices );
  7845. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  7846. this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
  7847. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  7848. function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {
  7849. var segmentWidth = width / gridX;
  7850. var segmentHeight = height / gridY;
  7851. var widthHalf = width / 2;
  7852. var heightHalf = height / 2;
  7853. var depthHalf = depth / 2;
  7854. var gridX1 = gridX + 1;
  7855. var gridY1 = gridY + 1;
  7856. var vertexCounter = 0;
  7857. var groupCount = 0;
  7858. var ix, iy;
  7859. var vector = new Vector3();
  7860. // generate vertices, normals and uvs
  7861. for ( iy = 0; iy < gridY1; iy ++ ) {
  7862. var y = iy * segmentHeight - heightHalf;
  7863. for ( ix = 0; ix < gridX1; ix ++ ) {
  7864. var x = ix * segmentWidth - widthHalf;
  7865. // set values to correct vector component
  7866. vector[ u ] = x * udir;
  7867. vector[ v ] = y * vdir;
  7868. vector[ w ] = depthHalf;
  7869. // now apply vector to vertex buffer
  7870. vertices.push( vector.x, vector.y, vector.z );
  7871. // set values to correct vector component
  7872. vector[ u ] = 0;
  7873. vector[ v ] = 0;
  7874. vector[ w ] = depth > 0 ? 1 : - 1;
  7875. // now apply vector to normal buffer
  7876. normals.push( vector.x, vector.y, vector.z );
  7877. // uvs
  7878. uvs.push( ix / gridX );
  7879. uvs.push( 1 - ( iy / gridY ) );
  7880. // counters
  7881. vertexCounter += 1;
  7882. }
  7883. }
  7884. // indices
  7885. // 1. you need three indices to draw a single face
  7886. // 2. a single segment consists of two faces
  7887. // 3. so we need to generate six (2*3) indices per segment
  7888. for ( iy = 0; iy < gridY; iy ++ ) {
  7889. for ( ix = 0; ix < gridX; ix ++ ) {
  7890. var a = numberOfVertices + ix + gridX1 * iy;
  7891. var b = numberOfVertices + ix + gridX1 * ( iy + 1 );
  7892. var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );
  7893. var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;
  7894. // faces
  7895. indices.push( a, b, d );
  7896. indices.push( b, c, d );
  7897. // increase counter
  7898. groupCount += 6;
  7899. }
  7900. }
  7901. // add a group to the geometry. this will ensure multi material support
  7902. scope.addGroup( groupStart, groupCount, materialIndex );
  7903. // calculate new start value for groups
  7904. groupStart += groupCount;
  7905. // update total number of vertices
  7906. numberOfVertices += vertexCounter;
  7907. }
  7908. }
  7909. BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  7910. BoxBufferGeometry.prototype.constructor = BoxBufferGeometry;
  7911. /**
  7912. * @author mrdoob / http://mrdoob.com/
  7913. * @author Mugen87 / https://github.com/Mugen87
  7914. */
  7915. // PlaneGeometry
  7916. function PlaneGeometry( width, height, widthSegments, heightSegments ) {
  7917. Geometry.call( this );
  7918. this.type = 'PlaneGeometry';
  7919. this.parameters = {
  7920. width: width,
  7921. height: height,
  7922. widthSegments: widthSegments,
  7923. heightSegments: heightSegments
  7924. };
  7925. this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );
  7926. this.mergeVertices();
  7927. }
  7928. PlaneGeometry.prototype = Object.create( Geometry.prototype );
  7929. PlaneGeometry.prototype.constructor = PlaneGeometry;
  7930. // PlaneBufferGeometry
  7931. function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {
  7932. BufferGeometry.call( this );
  7933. this.type = 'PlaneBufferGeometry';
  7934. this.parameters = {
  7935. width: width,
  7936. height: height,
  7937. widthSegments: widthSegments,
  7938. heightSegments: heightSegments
  7939. };
  7940. width = width || 1;
  7941. height = height || 1;
  7942. var width_half = width / 2;
  7943. var height_half = height / 2;
  7944. var gridX = Math.floor( widthSegments ) || 1;
  7945. var gridY = Math.floor( heightSegments ) || 1;
  7946. var gridX1 = gridX + 1;
  7947. var gridY1 = gridY + 1;
  7948. var segment_width = width / gridX;
  7949. var segment_height = height / gridY;
  7950. var ix, iy;
  7951. // buffers
  7952. var indices = [];
  7953. var vertices = [];
  7954. var normals = [];
  7955. var uvs = [];
  7956. // generate vertices, normals and uvs
  7957. for ( iy = 0; iy < gridY1; iy ++ ) {
  7958. var y = iy * segment_height - height_half;
  7959. for ( ix = 0; ix < gridX1; ix ++ ) {
  7960. var x = ix * segment_width - width_half;
  7961. vertices.push( x, - y, 0 );
  7962. normals.push( 0, 0, 1 );
  7963. uvs.push( ix / gridX );
  7964. uvs.push( 1 - ( iy / gridY ) );
  7965. }
  7966. }
  7967. // indices
  7968. for ( iy = 0; iy < gridY; iy ++ ) {
  7969. for ( ix = 0; ix < gridX; ix ++ ) {
  7970. var a = ix + gridX1 * iy;
  7971. var b = ix + gridX1 * ( iy + 1 );
  7972. var c = ( ix + 1 ) + gridX1 * ( iy + 1 );
  7973. var d = ( ix + 1 ) + gridX1 * iy;
  7974. // faces
  7975. indices.push( a, b, d );
  7976. indices.push( b, c, d );
  7977. }
  7978. }
  7979. // build geometry
  7980. this.setIndex( indices );
  7981. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  7982. this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
  7983. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  7984. }
  7985. PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  7986. PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;
  7987. /**
  7988. * @author mrdoob / http://mrdoob.com/
  7989. * @author alteredq / http://alteredqualia.com/
  7990. */
  7991. var materialId = 0;
  7992. function Material() {
  7993. Object.defineProperty( this, 'id', { value: materialId ++ } );
  7994. this.uuid = _Math.generateUUID();
  7995. this.name = '';
  7996. this.type = 'Material';
  7997. this.fog = true;
  7998. this.lights = true;
  7999. this.blending = NormalBlending;
  8000. this.side = FrontSide;
  8001. this.flatShading = false;
  8002. this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors
  8003. this.opacity = 1;
  8004. this.transparent = false;
  8005. this.blendSrc = SrcAlphaFactor;
  8006. this.blendDst = OneMinusSrcAlphaFactor;
  8007. this.blendEquation = AddEquation;
  8008. this.blendSrcAlpha = null;
  8009. this.blendDstAlpha = null;
  8010. this.blendEquationAlpha = null;
  8011. this.depthFunc = LessEqualDepth;
  8012. this.depthTest = true;
  8013. this.depthWrite = true;
  8014. this.clippingPlanes = null;
  8015. this.clipIntersection = false;
  8016. this.clipShadows = false;
  8017. this.shadowSide = null;
  8018. this.colorWrite = true;
  8019. this.precision = null; // override the renderer's default precision for this material
  8020. this.polygonOffset = false;
  8021. this.polygonOffsetFactor = 0;
  8022. this.polygonOffsetUnits = 0;
  8023. this.dithering = false;
  8024. this.alphaTest = 0;
  8025. this.premultipliedAlpha = false;
  8026. this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer
  8027. this.visible = true;
  8028. this.userData = {};
  8029. this.needsUpdate = true;
  8030. }
  8031. Material.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
  8032. constructor: Material,
  8033. isMaterial: true,
  8034. onBeforeCompile: function () {},
  8035. setValues: function ( values ) {
  8036. if ( values === undefined ) return;
  8037. for ( var key in values ) {
  8038. var newValue = values[ key ];
  8039. if ( newValue === undefined ) {
  8040. console.warn( "THREE.Material: '" + key + "' parameter is undefined." );
  8041. continue;
  8042. }
  8043. // for backward compatability if shading is set in the constructor
  8044. if ( key === 'shading' ) {
  8045. console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
  8046. this.flatShading = ( newValue === FlatShading ) ? true : false;
  8047. continue;
  8048. }
  8049. var currentValue = this[ key ];
  8050. if ( currentValue === undefined ) {
  8051. console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." );
  8052. continue;
  8053. }
  8054. if ( currentValue && currentValue.isColor ) {
  8055. currentValue.set( newValue );
  8056. } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {
  8057. currentValue.copy( newValue );
  8058. } else if ( key === 'overdraw' ) {
  8059. // ensure overdraw is backwards-compatible with legacy boolean type
  8060. this[ key ] = Number( newValue );
  8061. } else {
  8062. this[ key ] = newValue;
  8063. }
  8064. }
  8065. },
  8066. toJSON: function ( meta ) {
  8067. var isRoot = ( meta === undefined || typeof meta === 'string' );
  8068. if ( isRoot ) {
  8069. meta = {
  8070. textures: {},
  8071. images: {}
  8072. };
  8073. }
  8074. var data = {
  8075. metadata: {
  8076. version: 4.5,
  8077. type: 'Material',
  8078. generator: 'Material.toJSON'
  8079. }
  8080. };
  8081. // standard Material serialization
  8082. data.uuid = this.uuid;
  8083. data.type = this.type;
  8084. if ( this.name !== '' ) data.name = this.name;
  8085. if ( this.color && this.color.isColor ) data.color = this.color.getHex();
  8086. if ( this.roughness !== undefined ) data.roughness = this.roughness;
  8087. if ( this.metalness !== undefined ) data.metalness = this.metalness;
  8088. if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();
  8089. if ( this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;
  8090. if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();
  8091. if ( this.shininess !== undefined ) data.shininess = this.shininess;
  8092. if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;
  8093. if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;
  8094. if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;
  8095. if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;
  8096. if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;
  8097. if ( this.aoMap && this.aoMap.isTexture ) {
  8098. data.aoMap = this.aoMap.toJSON( meta ).uuid;
  8099. data.aoMapIntensity = this.aoMapIntensity;
  8100. }
  8101. if ( this.bumpMap && this.bumpMap.isTexture ) {
  8102. data.bumpMap = this.bumpMap.toJSON( meta ).uuid;
  8103. data.bumpScale = this.bumpScale;
  8104. }
  8105. if ( this.normalMap && this.normalMap.isTexture ) {
  8106. data.normalMap = this.normalMap.toJSON( meta ).uuid;
  8107. data.normalMapType = this.normalMapType;
  8108. data.normalScale = this.normalScale.toArray();
  8109. }
  8110. if ( this.displacementMap && this.displacementMap.isTexture ) {
  8111. data.displacementMap = this.displacementMap.toJSON( meta ).uuid;
  8112. data.displacementScale = this.displacementScale;
  8113. data.displacementBias = this.displacementBias;
  8114. }
  8115. if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;
  8116. if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;
  8117. if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;
  8118. if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;
  8119. if ( this.envMap && this.envMap.isTexture ) {
  8120. data.envMap = this.envMap.toJSON( meta ).uuid;
  8121. data.reflectivity = this.reflectivity; // Scale behind envMap
  8122. }
  8123. if ( this.gradientMap && this.gradientMap.isTexture ) {
  8124. data.gradientMap = this.gradientMap.toJSON( meta ).uuid;
  8125. }
  8126. if ( this.size !== undefined ) data.size = this.size;
  8127. if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;
  8128. if ( this.blending !== NormalBlending ) data.blending = this.blending;
  8129. if ( this.flatShading === true ) data.flatShading = this.flatShading;
  8130. if ( this.side !== FrontSide ) data.side = this.side;
  8131. if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;
  8132. if ( this.opacity < 1 ) data.opacity = this.opacity;
  8133. if ( this.transparent === true ) data.transparent = this.transparent;
  8134. data.depthFunc = this.depthFunc;
  8135. data.depthTest = this.depthTest;
  8136. data.depthWrite = this.depthWrite;
  8137. // rotation (SpriteMaterial)
  8138. if ( this.rotation !== 0 ) data.rotation = this.rotation;
  8139. if ( this.linewidth !== 1 ) data.linewidth = this.linewidth;
  8140. if ( this.dashSize !== undefined ) data.dashSize = this.dashSize;
  8141. if ( this.gapSize !== undefined ) data.gapSize = this.gapSize;
  8142. if ( this.scale !== undefined ) data.scale = this.scale;
  8143. if ( this.dithering === true ) data.dithering = true;
  8144. if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;
  8145. if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;
  8146. if ( this.wireframe === true ) data.wireframe = this.wireframe;
  8147. if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;
  8148. if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;
  8149. if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;
  8150. if ( this.morphTargets === true ) data.morphTargets = true;
  8151. if ( this.skinning === true ) data.skinning = true;
  8152. if ( this.visible === false ) data.visible = false;
  8153. if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;
  8154. // TODO: Copied from Object3D.toJSON
  8155. function extractFromCache( cache ) {
  8156. var values = [];
  8157. for ( var key in cache ) {
  8158. var data = cache[ key ];
  8159. delete data.metadata;
  8160. values.push( data );
  8161. }
  8162. return values;
  8163. }
  8164. if ( isRoot ) {
  8165. var textures = extractFromCache( meta.textures );
  8166. var images = extractFromCache( meta.images );
  8167. if ( textures.length > 0 ) data.textures = textures;
  8168. if ( images.length > 0 ) data.images = images;
  8169. }
  8170. return data;
  8171. },
  8172. clone: function () {
  8173. return new this.constructor().copy( this );
  8174. },
  8175. copy: function ( source ) {
  8176. this.name = source.name;
  8177. this.fog = source.fog;
  8178. this.lights = source.lights;
  8179. this.blending = source.blending;
  8180. this.side = source.side;
  8181. this.flatShading = source.flatShading;
  8182. this.vertexColors = source.vertexColors;
  8183. this.opacity = source.opacity;
  8184. this.transparent = source.transparent;
  8185. this.blendSrc = source.blendSrc;
  8186. this.blendDst = source.blendDst;
  8187. this.blendEquation = source.blendEquation;
  8188. this.blendSrcAlpha = source.blendSrcAlpha;
  8189. this.blendDstAlpha = source.blendDstAlpha;
  8190. this.blendEquationAlpha = source.blendEquationAlpha;
  8191. this.depthFunc = source.depthFunc;
  8192. this.depthTest = source.depthTest;
  8193. this.depthWrite = source.depthWrite;
  8194. this.colorWrite = source.colorWrite;
  8195. this.precision = source.precision;
  8196. this.polygonOffset = source.polygonOffset;
  8197. this.polygonOffsetFactor = source.polygonOffsetFactor;
  8198. this.polygonOffsetUnits = source.polygonOffsetUnits;
  8199. this.dithering = source.dithering;
  8200. this.alphaTest = source.alphaTest;
  8201. this.premultipliedAlpha = source.premultipliedAlpha;
  8202. this.overdraw = source.overdraw;
  8203. this.visible = source.visible;
  8204. this.userData = JSON.parse( JSON.stringify( source.userData ) );
  8205. this.clipShadows = source.clipShadows;
  8206. this.clipIntersection = source.clipIntersection;
  8207. var srcPlanes = source.clippingPlanes,
  8208. dstPlanes = null;
  8209. if ( srcPlanes !== null ) {
  8210. var n = srcPlanes.length;
  8211. dstPlanes = new Array( n );
  8212. for ( var i = 0; i !== n; ++ i )
  8213. dstPlanes[ i ] = srcPlanes[ i ].clone();
  8214. }
  8215. this.clippingPlanes = dstPlanes;
  8216. this.shadowSide = source.shadowSide;
  8217. return this;
  8218. },
  8219. dispose: function () {
  8220. this.dispatchEvent( { type: 'dispose' } );
  8221. }
  8222. } );
  8223. /**
  8224. * @author mrdoob / http://mrdoob.com/
  8225. * @author alteredq / http://alteredqualia.com/
  8226. *
  8227. * parameters = {
  8228. * color: <hex>,
  8229. * opacity: <float>,
  8230. * map: new THREE.Texture( <Image> ),
  8231. *
  8232. * lightMap: new THREE.Texture( <Image> ),
  8233. * lightMapIntensity: <float>
  8234. *
  8235. * aoMap: new THREE.Texture( <Image> ),
  8236. * aoMapIntensity: <float>
  8237. *
  8238. * specularMap: new THREE.Texture( <Image> ),
  8239. *
  8240. * alphaMap: new THREE.Texture( <Image> ),
  8241. *
  8242. * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
  8243. * combine: THREE.Multiply,
  8244. * reflectivity: <float>,
  8245. * refractionRatio: <float>,
  8246. *
  8247. * depthTest: <bool>,
  8248. * depthWrite: <bool>,
  8249. *
  8250. * wireframe: <boolean>,
  8251. * wireframeLinewidth: <float>,
  8252. *
  8253. * skinning: <bool>,
  8254. * morphTargets: <bool>
  8255. * }
  8256. */
  8257. function MeshBasicMaterial( parameters ) {
  8258. Material.call( this );
  8259. this.type = 'MeshBasicMaterial';
  8260. this.color = new Color( 0xffffff ); // emissive
  8261. this.map = null;
  8262. this.lightMap = null;
  8263. this.lightMapIntensity = 1.0;
  8264. this.aoMap = null;
  8265. this.aoMapIntensity = 1.0;
  8266. this.specularMap = null;
  8267. this.alphaMap = null;
  8268. this.envMap = null;
  8269. this.combine = MultiplyOperation;
  8270. this.reflectivity = 1;
  8271. this.refractionRatio = 0.98;
  8272. this.wireframe = false;
  8273. this.wireframeLinewidth = 1;
  8274. this.wireframeLinecap = 'round';
  8275. this.wireframeLinejoin = 'round';
  8276. this.skinning = false;
  8277. this.morphTargets = false;
  8278. this.lights = false;
  8279. this.setValues( parameters );
  8280. }
  8281. MeshBasicMaterial.prototype = Object.create( Material.prototype );
  8282. MeshBasicMaterial.prototype.constructor = MeshBasicMaterial;
  8283. MeshBasicMaterial.prototype.isMeshBasicMaterial = true;
  8284. MeshBasicMaterial.prototype.copy = function ( source ) {
  8285. Material.prototype.copy.call( this, source );
  8286. this.color.copy( source.color );
  8287. this.map = source.map;
  8288. this.lightMap = source.lightMap;
  8289. this.lightMapIntensity = source.lightMapIntensity;
  8290. this.aoMap = source.aoMap;
  8291. this.aoMapIntensity = source.aoMapIntensity;
  8292. this.specularMap = source.specularMap;
  8293. this.alphaMap = source.alphaMap;
  8294. this.envMap = source.envMap;
  8295. this.combine = source.combine;
  8296. this.reflectivity = source.reflectivity;
  8297. this.refractionRatio = source.refractionRatio;
  8298. this.wireframe = source.wireframe;
  8299. this.wireframeLinewidth = source.wireframeLinewidth;
  8300. this.wireframeLinecap = source.wireframeLinecap;
  8301. this.wireframeLinejoin = source.wireframeLinejoin;
  8302. this.skinning = source.skinning;
  8303. this.morphTargets = source.morphTargets;
  8304. return this;
  8305. };
  8306. /**
  8307. * @author alteredq / http://alteredqualia.com/
  8308. *
  8309. * parameters = {
  8310. * defines: { "label" : "value" },
  8311. * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } },
  8312. *
  8313. * fragmentShader: <string>,
  8314. * vertexShader: <string>,
  8315. *
  8316. * wireframe: <boolean>,
  8317. * wireframeLinewidth: <float>,
  8318. *
  8319. * lights: <bool>,
  8320. *
  8321. * skinning: <bool>,
  8322. * morphTargets: <bool>,
  8323. * morphNormals: <bool>
  8324. * }
  8325. */
  8326. function ShaderMaterial( parameters ) {
  8327. Material.call( this );
  8328. this.type = 'ShaderMaterial';
  8329. this.defines = {};
  8330. this.uniforms = {};
  8331. this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}';
  8332. this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}';
  8333. this.linewidth = 1;
  8334. this.wireframe = false;
  8335. this.wireframeLinewidth = 1;
  8336. this.fog = false; // set to use scene fog
  8337. this.lights = false; // set to use scene lights
  8338. this.clipping = false; // set to use user-defined clipping planes
  8339. this.skinning = false; // set to use skinning attribute streams
  8340. this.morphTargets = false; // set to use morph targets
  8341. this.morphNormals = false; // set to use morph normals
  8342. this.extensions = {
  8343. derivatives: false, // set to use derivatives
  8344. fragDepth: false, // set to use fragment depth values
  8345. drawBuffers: false, // set to use draw buffers
  8346. shaderTextureLOD: false // set to use shader texture LOD
  8347. };
  8348. // When rendered geometry doesn't include these attributes but the material does,
  8349. // use these default values in WebGL. This avoids errors when buffer data is missing.
  8350. this.defaultAttributeValues = {
  8351. 'color': [ 1, 1, 1 ],
  8352. 'uv': [ 0, 0 ],
  8353. 'uv2': [ 0, 0 ]
  8354. };
  8355. this.index0AttributeName = undefined;
  8356. this.uniformsNeedUpdate = false;
  8357. if ( parameters !== undefined ) {
  8358. if ( parameters.attributes !== undefined ) {
  8359. console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );
  8360. }
  8361. this.setValues( parameters );
  8362. }
  8363. }
  8364. ShaderMaterial.prototype = Object.create( Material.prototype );
  8365. ShaderMaterial.prototype.constructor = ShaderMaterial;
  8366. ShaderMaterial.prototype.isShaderMaterial = true;
  8367. ShaderMaterial.prototype.copy = function ( source ) {
  8368. Material.prototype.copy.call( this, source );
  8369. this.fragmentShader = source.fragmentShader;
  8370. this.vertexShader = source.vertexShader;
  8371. this.uniforms = UniformsUtils.clone( source.uniforms );
  8372. this.defines = Object.assign( {}, source.defines );
  8373. this.wireframe = source.wireframe;
  8374. this.wireframeLinewidth = source.wireframeLinewidth;
  8375. this.lights = source.lights;
  8376. this.clipping = source.clipping;
  8377. this.skinning = source.skinning;
  8378. this.morphTargets = source.morphTargets;
  8379. this.morphNormals = source.morphNormals;
  8380. this.extensions = source.extensions;
  8381. return this;
  8382. };
  8383. ShaderMaterial.prototype.toJSON = function ( meta ) {
  8384. var data = Material.prototype.toJSON.call( this, meta );
  8385. data.uniforms = this.uniforms;
  8386. data.vertexShader = this.vertexShader;
  8387. data.fragmentShader = this.fragmentShader;
  8388. return data;
  8389. };
  8390. /**
  8391. * @author bhouston / http://clara.io
  8392. */
  8393. function Ray( origin, direction ) {
  8394. this.origin = ( origin !== undefined ) ? origin : new Vector3();
  8395. this.direction = ( direction !== undefined ) ? direction : new Vector3();
  8396. }
  8397. Object.assign( Ray.prototype, {
  8398. set: function ( origin, direction ) {
  8399. this.origin.copy( origin );
  8400. this.direction.copy( direction );
  8401. return this;
  8402. },
  8403. clone: function () {
  8404. return new this.constructor().copy( this );
  8405. },
  8406. copy: function ( ray ) {
  8407. this.origin.copy( ray.origin );
  8408. this.direction.copy( ray.direction );
  8409. return this;
  8410. },
  8411. at: function ( t, target ) {
  8412. if ( target === undefined ) {
  8413. console.warn( 'THREE.Ray: .at() target is now required' );
  8414. target = new Vector3();
  8415. }
  8416. return target.copy( this.direction ).multiplyScalar( t ).add( this.origin );
  8417. },
  8418. lookAt: function ( v ) {
  8419. this.direction.copy( v ).sub( this.origin ).normalize();
  8420. return this;
  8421. },
  8422. recast: function () {
  8423. var v1 = new Vector3();
  8424. return function recast( t ) {
  8425. this.origin.copy( this.at( t, v1 ) );
  8426. return this;
  8427. };
  8428. }(),
  8429. closestPointToPoint: function ( point, target ) {
  8430. if ( target === undefined ) {
  8431. console.warn( 'THREE.Ray: .closestPointToPoint() target is now required' );
  8432. target = new Vector3();
  8433. }
  8434. target.subVectors( point, this.origin );
  8435. var directionDistance = target.dot( this.direction );
  8436. if ( directionDistance < 0 ) {
  8437. return target.copy( this.origin );
  8438. }
  8439. return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
  8440. },
  8441. distanceToPoint: function ( point ) {
  8442. return Math.sqrt( this.distanceSqToPoint( point ) );
  8443. },
  8444. distanceSqToPoint: function () {
  8445. var v1 = new Vector3();
  8446. return function distanceSqToPoint( point ) {
  8447. var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );
  8448. // point behind the ray
  8449. if ( directionDistance < 0 ) {
  8450. return this.origin.distanceToSquared( point );
  8451. }
  8452. v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
  8453. return v1.distanceToSquared( point );
  8454. };
  8455. }(),
  8456. distanceSqToSegment: function () {
  8457. var segCenter = new Vector3();
  8458. var segDir = new Vector3();
  8459. var diff = new Vector3();
  8460. return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {
  8461. // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h
  8462. // It returns the min distance between the ray and the segment
  8463. // defined by v0 and v1
  8464. // It can also set two optional targets :
  8465. // - The closest point on the ray
  8466. // - The closest point on the segment
  8467. segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );
  8468. segDir.copy( v1 ).sub( v0 ).normalize();
  8469. diff.copy( this.origin ).sub( segCenter );
  8470. var segExtent = v0.distanceTo( v1 ) * 0.5;
  8471. var a01 = - this.direction.dot( segDir );
  8472. var b0 = diff.dot( this.direction );
  8473. var b1 = - diff.dot( segDir );
  8474. var c = diff.lengthSq();
  8475. var det = Math.abs( 1 - a01 * a01 );
  8476. var s0, s1, sqrDist, extDet;
  8477. if ( det > 0 ) {
  8478. // The ray and segment are not parallel.
  8479. s0 = a01 * b1 - b0;
  8480. s1 = a01 * b0 - b1;
  8481. extDet = segExtent * det;
  8482. if ( s0 >= 0 ) {
  8483. if ( s1 >= - extDet ) {
  8484. if ( s1 <= extDet ) {
  8485. // region 0
  8486. // Minimum at interior points of ray and segment.
  8487. var invDet = 1 / det;
  8488. s0 *= invDet;
  8489. s1 *= invDet;
  8490. sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;
  8491. } else {
  8492. // region 1
  8493. s1 = segExtent;
  8494. s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
  8495. sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
  8496. }
  8497. } else {
  8498. // region 5
  8499. s1 = - segExtent;
  8500. s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
  8501. sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
  8502. }
  8503. } else {
  8504. if ( s1 <= - extDet ) {
  8505. // region 4
  8506. s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );
  8507. s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );
  8508. sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
  8509. } else if ( s1 <= extDet ) {
  8510. // region 3
  8511. s0 = 0;
  8512. s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );
  8513. sqrDist = s1 * ( s1 + 2 * b1 ) + c;
  8514. } else {
  8515. // region 2
  8516. s0 = Math.max( 0, - ( a01 * segExtent + b0 ) );
  8517. s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );
  8518. sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
  8519. }
  8520. }
  8521. } else {
  8522. // Ray and segment are parallel.
  8523. s1 = ( a01 > 0 ) ? - segExtent : segExtent;
  8524. s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
  8525. sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
  8526. }
  8527. if ( optionalPointOnRay ) {
  8528. optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );
  8529. }
  8530. if ( optionalPointOnSegment ) {
  8531. optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );
  8532. }
  8533. return sqrDist;
  8534. };
  8535. }(),
  8536. intersectSphere: function () {
  8537. var v1 = new Vector3();
  8538. return function intersectSphere( sphere, target ) {
  8539. v1.subVectors( sphere.center, this.origin );
  8540. var tca = v1.dot( this.direction );
  8541. var d2 = v1.dot( v1 ) - tca * tca;
  8542. var radius2 = sphere.radius * sphere.radius;
  8543. if ( d2 > radius2 ) return null;
  8544. var thc = Math.sqrt( radius2 - d2 );
  8545. // t0 = first intersect point - entrance on front of sphere
  8546. var t0 = tca - thc;
  8547. // t1 = second intersect point - exit point on back of sphere
  8548. var t1 = tca + thc;
  8549. // test to see if both t0 and t1 are behind the ray - if so, return null
  8550. if ( t0 < 0 && t1 < 0 ) return null;
  8551. // test to see if t0 is behind the ray:
  8552. // if it is, the ray is inside the sphere, so return the second exit point scaled by t1,
  8553. // in order to always return an intersect point that is in front of the ray.
  8554. if ( t0 < 0 ) return this.at( t1, target );
  8555. // else t0 is in front of the ray, so return the first collision point scaled by t0
  8556. return this.at( t0, target );
  8557. };
  8558. }(),
  8559. intersectsSphere: function ( sphere ) {
  8560. return this.distanceToPoint( sphere.center ) <= sphere.radius;
  8561. },
  8562. distanceToPlane: function ( plane ) {
  8563. var denominator = plane.normal.dot( this.direction );
  8564. if ( denominator === 0 ) {
  8565. // line is coplanar, return origin
  8566. if ( plane.distanceToPoint( this.origin ) === 0 ) {
  8567. return 0;
  8568. }
  8569. // Null is preferable to undefined since undefined means.... it is undefined
  8570. return null;
  8571. }
  8572. var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;
  8573. // Return if the ray never intersects the plane
  8574. return t >= 0 ? t : null;
  8575. },
  8576. intersectPlane: function ( plane, target ) {
  8577. var t = this.distanceToPlane( plane );
  8578. if ( t === null ) {
  8579. return null;
  8580. }
  8581. return this.at( t, target );
  8582. },
  8583. intersectsPlane: function ( plane ) {
  8584. // check if the ray lies on the plane first
  8585. var distToPoint = plane.distanceToPoint( this.origin );
  8586. if ( distToPoint === 0 ) {
  8587. return true;
  8588. }
  8589. var denominator = plane.normal.dot( this.direction );
  8590. if ( denominator * distToPoint < 0 ) {
  8591. return true;
  8592. }
  8593. // ray origin is behind the plane (and is pointing behind it)
  8594. return false;
  8595. },
  8596. intersectBox: function ( box, target ) {
  8597. var tmin, tmax, tymin, tymax, tzmin, tzmax;
  8598. var invdirx = 1 / this.direction.x,
  8599. invdiry = 1 / this.direction.y,
  8600. invdirz = 1 / this.direction.z;
  8601. var origin = this.origin;
  8602. if ( invdirx >= 0 ) {
  8603. tmin = ( box.min.x - origin.x ) * invdirx;
  8604. tmax = ( box.max.x - origin.x ) * invdirx;
  8605. } else {
  8606. tmin = ( box.max.x - origin.x ) * invdirx;
  8607. tmax = ( box.min.x - origin.x ) * invdirx;
  8608. }
  8609. if ( invdiry >= 0 ) {
  8610. tymin = ( box.min.y - origin.y ) * invdiry;
  8611. tymax = ( box.max.y - origin.y ) * invdiry;
  8612. } else {
  8613. tymin = ( box.max.y - origin.y ) * invdiry;
  8614. tymax = ( box.min.y - origin.y ) * invdiry;
  8615. }
  8616. if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;
  8617. // These lines also handle the case where tmin or tmax is NaN
  8618. // (result of 0 * Infinity). x !== x returns true if x is NaN
  8619. if ( tymin > tmin || tmin !== tmin ) tmin = tymin;
  8620. if ( tymax < tmax || tmax !== tmax ) tmax = tymax;
  8621. if ( invdirz >= 0 ) {
  8622. tzmin = ( box.min.z - origin.z ) * invdirz;
  8623. tzmax = ( box.max.z - origin.z ) * invdirz;
  8624. } else {
  8625. tzmin = ( box.max.z - origin.z ) * invdirz;
  8626. tzmax = ( box.min.z - origin.z ) * invdirz;
  8627. }
  8628. if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;
  8629. if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;
  8630. if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;
  8631. //return point closest to the ray (positive side)
  8632. if ( tmax < 0 ) return null;
  8633. return this.at( tmin >= 0 ? tmin : tmax, target );
  8634. },
  8635. intersectsBox: ( function () {
  8636. var v = new Vector3();
  8637. return function intersectsBox( box ) {
  8638. return this.intersectBox( box, v ) !== null;
  8639. };
  8640. } )(),
  8641. intersectTriangle: function () {
  8642. // Compute the offset origin, edges, and normal.
  8643. var diff = new Vector3();
  8644. var edge1 = new Vector3();
  8645. var edge2 = new Vector3();
  8646. var normal = new Vector3();
  8647. return function intersectTriangle( a, b, c, backfaceCulling, target ) {
  8648. // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h
  8649. edge1.subVectors( b, a );
  8650. edge2.subVectors( c, a );
  8651. normal.crossVectors( edge1, edge2 );
  8652. // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,
  8653. // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by
  8654. // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))
  8655. // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))
  8656. // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)
  8657. var DdN = this.direction.dot( normal );
  8658. var sign;
  8659. if ( DdN > 0 ) {
  8660. if ( backfaceCulling ) return null;
  8661. sign = 1;
  8662. } else if ( DdN < 0 ) {
  8663. sign = - 1;
  8664. DdN = - DdN;
  8665. } else {
  8666. return null;
  8667. }
  8668. diff.subVectors( this.origin, a );
  8669. var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );
  8670. // b1 < 0, no intersection
  8671. if ( DdQxE2 < 0 ) {
  8672. return null;
  8673. }
  8674. var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );
  8675. // b2 < 0, no intersection
  8676. if ( DdE1xQ < 0 ) {
  8677. return null;
  8678. }
  8679. // b1+b2 > 1, no intersection
  8680. if ( DdQxE2 + DdE1xQ > DdN ) {
  8681. return null;
  8682. }
  8683. // Line intersects triangle, check if ray does.
  8684. var QdN = - sign * diff.dot( normal );
  8685. // t < 0, no intersection
  8686. if ( QdN < 0 ) {
  8687. return null;
  8688. }
  8689. // Ray intersects triangle.
  8690. return this.at( QdN / DdN, target );
  8691. };
  8692. }(),
  8693. applyMatrix4: function ( matrix4 ) {
  8694. this.origin.applyMatrix4( matrix4 );
  8695. this.direction.transformDirection( matrix4 );
  8696. return this;
  8697. },
  8698. equals: function ( ray ) {
  8699. return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );
  8700. }
  8701. } );
  8702. /**
  8703. * @author bhouston / http://clara.io
  8704. * @author mrdoob / http://mrdoob.com/
  8705. */
  8706. function Triangle( a, b, c ) {
  8707. this.a = ( a !== undefined ) ? a : new Vector3();
  8708. this.b = ( b !== undefined ) ? b : new Vector3();
  8709. this.c = ( c !== undefined ) ? c : new Vector3();
  8710. }
  8711. Object.assign( Triangle, {
  8712. getNormal: function () {
  8713. var v0 = new Vector3();
  8714. return function getNormal( a, b, c, target ) {
  8715. if ( target === undefined ) {
  8716. console.warn( 'THREE.Triangle: .getNormal() target is now required' );
  8717. target = new Vector3();
  8718. }
  8719. target.subVectors( c, b );
  8720. v0.subVectors( a, b );
  8721. target.cross( v0 );
  8722. var targetLengthSq = target.lengthSq();
  8723. if ( targetLengthSq > 0 ) {
  8724. return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );
  8725. }
  8726. return target.set( 0, 0, 0 );
  8727. };
  8728. }(),
  8729. // static/instance method to calculate barycentric coordinates
  8730. // based on: http://www.blackpawn.com/texts/pointinpoly/default.html
  8731. getBarycoord: function () {
  8732. var v0 = new Vector3();
  8733. var v1 = new Vector3();
  8734. var v2 = new Vector3();
  8735. return function getBarycoord( point, a, b, c, target ) {
  8736. v0.subVectors( c, a );
  8737. v1.subVectors( b, a );
  8738. v2.subVectors( point, a );
  8739. var dot00 = v0.dot( v0 );
  8740. var dot01 = v0.dot( v1 );
  8741. var dot02 = v0.dot( v2 );
  8742. var dot11 = v1.dot( v1 );
  8743. var dot12 = v1.dot( v2 );
  8744. var denom = ( dot00 * dot11 - dot01 * dot01 );
  8745. if ( target === undefined ) {
  8746. console.warn( 'THREE.Triangle: .getBarycoord() target is now required' );
  8747. target = new Vector3();
  8748. }
  8749. // collinear or singular triangle
  8750. if ( denom === 0 ) {
  8751. // arbitrary location outside of triangle?
  8752. // not sure if this is the best idea, maybe should be returning undefined
  8753. return target.set( - 2, - 1, - 1 );
  8754. }
  8755. var invDenom = 1 / denom;
  8756. var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
  8757. var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
  8758. // barycentric coordinates must always sum to 1
  8759. return target.set( 1 - u - v, v, u );
  8760. };
  8761. }(),
  8762. containsPoint: function () {
  8763. var v1 = new Vector3();
  8764. return function containsPoint( point, a, b, c ) {
  8765. Triangle.getBarycoord( point, a, b, c, v1 );
  8766. return ( v1.x >= 0 ) && ( v1.y >= 0 ) && ( ( v1.x + v1.y ) <= 1 );
  8767. };
  8768. }()
  8769. } );
  8770. Object.assign( Triangle.prototype, {
  8771. set: function ( a, b, c ) {
  8772. this.a.copy( a );
  8773. this.b.copy( b );
  8774. this.c.copy( c );
  8775. return this;
  8776. },
  8777. setFromPointsAndIndices: function ( points, i0, i1, i2 ) {
  8778. this.a.copy( points[ i0 ] );
  8779. this.b.copy( points[ i1 ] );
  8780. this.c.copy( points[ i2 ] );
  8781. return this;
  8782. },
  8783. clone: function () {
  8784. return new this.constructor().copy( this );
  8785. },
  8786. copy: function ( triangle ) {
  8787. this.a.copy( triangle.a );
  8788. this.b.copy( triangle.b );
  8789. this.c.copy( triangle.c );
  8790. return this;
  8791. },
  8792. getArea: function () {
  8793. var v0 = new Vector3();
  8794. var v1 = new Vector3();
  8795. return function getArea() {
  8796. v0.subVectors( this.c, this.b );
  8797. v1.subVectors( this.a, this.b );
  8798. return v0.cross( v1 ).length() * 0.5;
  8799. };
  8800. }(),
  8801. getMidpoint: function ( target ) {
  8802. if ( target === undefined ) {
  8803. console.warn( 'THREE.Triangle: .getMidpoint() target is now required' );
  8804. target = new Vector3();
  8805. }
  8806. return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );
  8807. },
  8808. getNormal: function ( target ) {
  8809. return Triangle.getNormal( this.a, this.b, this.c, target );
  8810. },
  8811. getPlane: function ( target ) {
  8812. if ( target === undefined ) {
  8813. console.warn( 'THREE.Triangle: .getPlane() target is now required' );
  8814. target = new Vector3();
  8815. }
  8816. return target.setFromCoplanarPoints( this.a, this.b, this.c );
  8817. },
  8818. getBarycoord: function ( point, target ) {
  8819. return Triangle.getBarycoord( point, this.a, this.b, this.c, target );
  8820. },
  8821. containsPoint: function ( point ) {
  8822. return Triangle.containsPoint( point, this.a, this.b, this.c );
  8823. },
  8824. intersectsBox: function ( box ) {
  8825. return box.intersectsTriangle( this );
  8826. },
  8827. closestPointToPoint: function () {
  8828. var vab = new Vector3();
  8829. var vac = new Vector3();
  8830. var vbc = new Vector3();
  8831. var vap = new Vector3();
  8832. var vbp = new Vector3();
  8833. var vcp = new Vector3();
  8834. return function closestPointToPoint( p, target ) {
  8835. if ( target === undefined ) {
  8836. console.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' );
  8837. target = new Vector3();
  8838. }
  8839. var a = this.a, b = this.b, c = this.c;
  8840. var v, w;
  8841. // algorithm thanks to Real-Time Collision Detection by Christer Ericson,
  8842. // published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,
  8843. // under the accompanying license; see chapter 5.1.5 for detailed explanation.
  8844. // basically, we're distinguishing which of the voronoi regions of the triangle
  8845. // the point lies in with the minimum amount of redundant computation.
  8846. vab.subVectors( b, a );
  8847. vac.subVectors( c, a );
  8848. vap.subVectors( p, a );
  8849. var d1 = vab.dot( vap );
  8850. var d2 = vac.dot( vap );
  8851. if ( d1 <= 0 && d2 <= 0 ) {
  8852. // vertex region of A; barycentric coords (1, 0, 0)
  8853. return target.copy( a );
  8854. }
  8855. vbp.subVectors( p, b );
  8856. var d3 = vab.dot( vbp );
  8857. var d4 = vac.dot( vbp );
  8858. if ( d3 >= 0 && d4 <= d3 ) {
  8859. // vertex region of B; barycentric coords (0, 1, 0)
  8860. return target.copy( b );
  8861. }
  8862. var vc = d1 * d4 - d3 * d2;
  8863. if ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {
  8864. v = d1 / ( d1 - d3 );
  8865. // edge region of AB; barycentric coords (1-v, v, 0)
  8866. return target.copy( a ).addScaledVector( vab, v );
  8867. }
  8868. vcp.subVectors( p, c );
  8869. var d5 = vab.dot( vcp );
  8870. var d6 = vac.dot( vcp );
  8871. if ( d6 >= 0 && d5 <= d6 ) {
  8872. // vertex region of C; barycentric coords (0, 0, 1)
  8873. return target.copy( c );
  8874. }
  8875. var vb = d5 * d2 - d1 * d6;
  8876. if ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {
  8877. w = d2 / ( d2 - d6 );
  8878. // edge region of AC; barycentric coords (1-w, 0, w)
  8879. return target.copy( a ).addScaledVector( vac, w );
  8880. }
  8881. var va = d3 * d6 - d5 * d4;
  8882. if ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {
  8883. vbc.subVectors( c, b );
  8884. w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );
  8885. // edge region of BC; barycentric coords (0, 1-w, w)
  8886. return target.copy( b ).addScaledVector( vbc, w ); // edge region of BC
  8887. }
  8888. // face region
  8889. var denom = 1 / ( va + vb + vc );
  8890. // u = va * denom
  8891. v = vb * denom;
  8892. w = vc * denom;
  8893. return target.copy( a ).addScaledVector( vab, v ).addScaledVector( vac, w );
  8894. };
  8895. }(),
  8896. equals: function ( triangle ) {
  8897. return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );
  8898. }
  8899. } );
  8900. /**
  8901. * @author mrdoob / http://mrdoob.com/
  8902. * @author alteredq / http://alteredqualia.com/
  8903. * @author mikael emtinger / http://gomo.se/
  8904. * @author jonobr1 / http://jonobr1.com/
  8905. */
  8906. function Mesh( geometry, material ) {
  8907. Object3D.call( this );
  8908. this.type = 'Mesh';
  8909. this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
  8910. this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );
  8911. this.drawMode = TrianglesDrawMode;
  8912. this.updateMorphTargets();
  8913. }
  8914. Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), {
  8915. constructor: Mesh,
  8916. isMesh: true,
  8917. setDrawMode: function ( value ) {
  8918. this.drawMode = value;
  8919. },
  8920. copy: function ( source ) {
  8921. Object3D.prototype.copy.call( this, source );
  8922. this.drawMode = source.drawMode;
  8923. if ( source.morphTargetInfluences !== undefined ) {
  8924. this.morphTargetInfluences = source.morphTargetInfluences.slice();
  8925. }
  8926. if ( source.morphTargetDictionary !== undefined ) {
  8927. this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );
  8928. }
  8929. return this;
  8930. },
  8931. updateMorphTargets: function () {
  8932. var geometry = this.geometry;
  8933. var m, ml, name;
  8934. if ( geometry.isBufferGeometry ) {
  8935. var morphAttributes = geometry.morphAttributes;
  8936. var keys = Object.keys( morphAttributes );
  8937. if ( keys.length > 0 ) {
  8938. var morphAttribute = morphAttributes[ keys[ 0 ] ];
  8939. if ( morphAttribute !== undefined ) {
  8940. this.morphTargetInfluences = [];
  8941. this.morphTargetDictionary = {};
  8942. for ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) {
  8943. name = morphAttribute[ m ].name || String( m );
  8944. this.morphTargetInfluences.push( 0 );
  8945. this.morphTargetDictionary[ name ] = m;
  8946. }
  8947. }
  8948. }
  8949. } else {
  8950. var morphTargets = geometry.morphTargets;
  8951. if ( morphTargets !== undefined && morphTargets.length > 0 ) {
  8952. this.morphTargetInfluences = [];
  8953. this.morphTargetDictionary = {};
  8954. for ( m = 0, ml = morphTargets.length; m < ml; m ++ ) {
  8955. name = morphTargets[ m ].name || String( m );
  8956. this.morphTargetInfluences.push( 0 );
  8957. this.morphTargetDictionary[ name ] = m;
  8958. }
  8959. }
  8960. }
  8961. },
  8962. raycast: ( function () {
  8963. var inverseMatrix = new Matrix4();
  8964. var ray = new Ray();
  8965. var sphere = new Sphere();
  8966. var vA = new Vector3();
  8967. var vB = new Vector3();
  8968. var vC = new Vector3();
  8969. var tempA = new Vector3();
  8970. var tempB = new Vector3();
  8971. var tempC = new Vector3();
  8972. var uvA = new Vector2();
  8973. var uvB = new Vector2();
  8974. var uvC = new Vector2();
  8975. var barycoord = new Vector3();
  8976. var intersectionPoint = new Vector3();
  8977. var intersectionPointWorld = new Vector3();
  8978. function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {
  8979. Triangle.getBarycoord( point, p1, p2, p3, barycoord );
  8980. uv1.multiplyScalar( barycoord.x );
  8981. uv2.multiplyScalar( barycoord.y );
  8982. uv3.multiplyScalar( barycoord.z );
  8983. uv1.add( uv2 ).add( uv3 );
  8984. return uv1.clone();
  8985. }
  8986. function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {
  8987. var intersect;
  8988. if ( material.side === BackSide ) {
  8989. intersect = ray.intersectTriangle( pC, pB, pA, true, point );
  8990. } else {
  8991. intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );
  8992. }
  8993. if ( intersect === null ) return null;
  8994. intersectionPointWorld.copy( point );
  8995. intersectionPointWorld.applyMatrix4( object.matrixWorld );
  8996. var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );
  8997. if ( distance < raycaster.near || distance > raycaster.far ) return null;
  8998. return {
  8999. distance: distance,
  9000. point: intersectionPointWorld.clone(),
  9001. object: object
  9002. };
  9003. }
  9004. function checkBufferGeometryIntersection( object, material, raycaster, ray, position, uv, a, b, c ) {
  9005. vA.fromBufferAttribute( position, a );
  9006. vB.fromBufferAttribute( position, b );
  9007. vC.fromBufferAttribute( position, c );
  9008. var intersection = checkIntersection( object, material, raycaster, ray, vA, vB, vC, intersectionPoint );
  9009. if ( intersection ) {
  9010. if ( uv ) {
  9011. uvA.fromBufferAttribute( uv, a );
  9012. uvB.fromBufferAttribute( uv, b );
  9013. uvC.fromBufferAttribute( uv, c );
  9014. intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );
  9015. }
  9016. var face = new Face3( a, b, c );
  9017. Triangle.getNormal( vA, vB, vC, face.normal );
  9018. intersection.face = face;
  9019. }
  9020. return intersection;
  9021. }
  9022. return function raycast( raycaster, intersects ) {
  9023. var geometry = this.geometry;
  9024. var material = this.material;
  9025. var matrixWorld = this.matrixWorld;
  9026. if ( material === undefined ) return;
  9027. // Checking boundingSphere distance to ray
  9028. if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
  9029. sphere.copy( geometry.boundingSphere );
  9030. sphere.applyMatrix4( matrixWorld );
  9031. if ( raycaster.ray.intersectsSphere( sphere ) === false ) return;
  9032. //
  9033. inverseMatrix.getInverse( matrixWorld );
  9034. ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );
  9035. // Check boundingBox before continuing
  9036. if ( geometry.boundingBox !== null ) {
  9037. if ( ray.intersectsBox( geometry.boundingBox ) === false ) return;
  9038. }
  9039. var intersection;
  9040. if ( geometry.isBufferGeometry ) {
  9041. var a, b, c;
  9042. var index = geometry.index;
  9043. var position = geometry.attributes.position;
  9044. var uv = geometry.attributes.uv;
  9045. var groups = geometry.groups;
  9046. var drawRange = geometry.drawRange;
  9047. var i, j, il, jl;
  9048. var group, groupMaterial;
  9049. var start, end;
  9050. if ( index !== null ) {
  9051. // indexed buffer geometry
  9052. if ( Array.isArray( material ) ) {
  9053. for ( i = 0, il = groups.length; i < il; i ++ ) {
  9054. group = groups[ i ];
  9055. groupMaterial = material[ group.materialIndex ];
  9056. start = Math.max( group.start, drawRange.start );
  9057. end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );
  9058. for ( j = start, jl = end; j < jl; j += 3 ) {
  9059. a = index.getX( j );
  9060. b = index.getX( j + 1 );
  9061. c = index.getX( j + 2 );
  9062. intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c );
  9063. if ( intersection ) {
  9064. intersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics
  9065. intersects.push( intersection );
  9066. }
  9067. }
  9068. }
  9069. } else {
  9070. start = Math.max( 0, drawRange.start );
  9071. end = Math.min( index.count, ( drawRange.start + drawRange.count ) );
  9072. for ( i = start, il = end; i < il; i += 3 ) {
  9073. a = index.getX( i );
  9074. b = index.getX( i + 1 );
  9075. c = index.getX( i + 2 );
  9076. intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c );
  9077. if ( intersection ) {
  9078. intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics
  9079. intersects.push( intersection );
  9080. }
  9081. }
  9082. }
  9083. } else if ( position !== undefined ) {
  9084. // non-indexed buffer geometry
  9085. if ( Array.isArray( material ) ) {
  9086. for ( i = 0, il = groups.length; i < il; i ++ ) {
  9087. group = groups[ i ];
  9088. groupMaterial = material[ group.materialIndex ];
  9089. start = Math.max( group.start, drawRange.start );
  9090. end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );
  9091. for ( j = start, jl = end; j < jl; j += 3 ) {
  9092. a = j;
  9093. b = j + 1;
  9094. c = j + 2;
  9095. intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c );
  9096. if ( intersection ) {
  9097. intersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics
  9098. intersects.push( intersection );
  9099. }
  9100. }
  9101. }
  9102. } else {
  9103. start = Math.max( 0, drawRange.start );
  9104. end = Math.min( position.count, ( drawRange.start + drawRange.count ) );
  9105. for ( i = start, il = end; i < il; i += 3 ) {
  9106. a = i;
  9107. b = i + 1;
  9108. c = i + 2;
  9109. intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c );
  9110. if ( intersection ) {
  9111. intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics
  9112. intersects.push( intersection );
  9113. }
  9114. }
  9115. }
  9116. }
  9117. } else if ( geometry.isGeometry ) {
  9118. var fvA, fvB, fvC;
  9119. var isMultiMaterial = Array.isArray( material );
  9120. var vertices = geometry.vertices;
  9121. var faces = geometry.faces;
  9122. var uvs;
  9123. var faceVertexUvs = geometry.faceVertexUvs[ 0 ];
  9124. if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;
  9125. for ( var f = 0, fl = faces.length; f < fl; f ++ ) {
  9126. var face = faces[ f ];
  9127. var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material;
  9128. if ( faceMaterial === undefined ) continue;
  9129. fvA = vertices[ face.a ];
  9130. fvB = vertices[ face.b ];
  9131. fvC = vertices[ face.c ];
  9132. if ( faceMaterial.morphTargets === true ) {
  9133. var morphTargets = geometry.morphTargets;
  9134. var morphInfluences = this.morphTargetInfluences;
  9135. vA.set( 0, 0, 0 );
  9136. vB.set( 0, 0, 0 );
  9137. vC.set( 0, 0, 0 );
  9138. for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {
  9139. var influence = morphInfluences[ t ];
  9140. if ( influence === 0 ) continue;
  9141. var targets = morphTargets[ t ].vertices;
  9142. vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );
  9143. vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );
  9144. vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );
  9145. }
  9146. vA.add( fvA );
  9147. vB.add( fvB );
  9148. vC.add( fvC );
  9149. fvA = vA;
  9150. fvB = vB;
  9151. fvC = vC;
  9152. }
  9153. intersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint );
  9154. if ( intersection ) {
  9155. if ( uvs && uvs[ f ] ) {
  9156. var uvs_f = uvs[ f ];
  9157. uvA.copy( uvs_f[ 0 ] );
  9158. uvB.copy( uvs_f[ 1 ] );
  9159. uvC.copy( uvs_f[ 2 ] );
  9160. intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );
  9161. }
  9162. intersection.face = face;
  9163. intersection.faceIndex = f;
  9164. intersects.push( intersection );
  9165. }
  9166. }
  9167. }
  9168. };
  9169. }() ),
  9170. clone: function () {
  9171. return new this.constructor( this.geometry, this.material ).copy( this );
  9172. }
  9173. } );
  9174. /**
  9175. * @author mrdoob / http://mrdoob.com/
  9176. */
  9177. function WebGLBackground( renderer, state, objects, premultipliedAlpha ) {
  9178. var clearColor = new Color( 0x000000 );
  9179. var clearAlpha = 0;
  9180. var planeCamera, planeMesh;
  9181. var boxMesh;
  9182. function render( renderList, scene, camera, forceClear ) {
  9183. var background = scene.background;
  9184. if ( background === null ) {
  9185. setClear( clearColor, clearAlpha );
  9186. } else if ( background && background.isColor ) {
  9187. setClear( background, 1 );
  9188. forceClear = true;
  9189. }
  9190. if ( renderer.autoClear || forceClear ) {
  9191. renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );
  9192. }
  9193. if ( background && background.isCubeTexture ) {
  9194. if ( boxMesh === undefined ) {
  9195. boxMesh = new Mesh(
  9196. new BoxBufferGeometry( 1, 1, 1 ),
  9197. new ShaderMaterial( {
  9198. uniforms: ShaderLib.cube.uniforms,
  9199. vertexShader: ShaderLib.cube.vertexShader,
  9200. fragmentShader: ShaderLib.cube.fragmentShader,
  9201. side: BackSide,
  9202. depthTest: true,
  9203. depthWrite: false,
  9204. fog: false
  9205. } )
  9206. );
  9207. boxMesh.geometry.removeAttribute( 'normal' );
  9208. boxMesh.geometry.removeAttribute( 'uv' );
  9209. boxMesh.onBeforeRender = function ( renderer, scene, camera ) {
  9210. this.matrixWorld.copyPosition( camera.matrixWorld );
  9211. };
  9212. objects.update( boxMesh );
  9213. }
  9214. boxMesh.material.uniforms.tCube.value = background;
  9215. renderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null );
  9216. } else if ( background && background.isTexture ) {
  9217. if ( planeCamera === undefined ) {
  9218. planeCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
  9219. planeMesh = new Mesh(
  9220. new PlaneBufferGeometry( 2, 2 ),
  9221. new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )
  9222. );
  9223. objects.update( planeMesh );
  9224. }
  9225. planeMesh.material.map = background;
  9226. // TODO Push this to renderList
  9227. renderer.renderBufferDirect( planeCamera, null, planeMesh.geometry, planeMesh.material, planeMesh, null );
  9228. }
  9229. }
  9230. function setClear( color, alpha ) {
  9231. state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );
  9232. }
  9233. return {
  9234. getClearColor: function () {
  9235. return clearColor;
  9236. },
  9237. setClearColor: function ( color, alpha ) {
  9238. clearColor.set( color );
  9239. clearAlpha = alpha !== undefined ? alpha : 1;
  9240. setClear( clearColor, clearAlpha );
  9241. },
  9242. getClearAlpha: function () {
  9243. return clearAlpha;
  9244. },
  9245. setClearAlpha: function ( alpha ) {
  9246. clearAlpha = alpha;
  9247. setClear( clearColor, clearAlpha );
  9248. },
  9249. render: render
  9250. };
  9251. }
  9252. /**
  9253. * @author mrdoob / http://mrdoob.com/
  9254. */
  9255. function WebGLBufferRenderer( gl, extensions, info, capabilities ) {
  9256. var mode;
  9257. function setMode( value ) {
  9258. mode = value;
  9259. }
  9260. function render( start, count ) {
  9261. gl.drawArrays( mode, start, count );
  9262. info.update( count, mode );
  9263. }
  9264. function renderInstances( geometry, start, count ) {
  9265. var extension;
  9266. if ( capabilities.isWebGL2 ) {
  9267. extension = gl;
  9268. } else {
  9269. extension = extensions.get( 'ANGLE_instanced_arrays' );
  9270. if ( extension === null ) {
  9271. console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
  9272. return;
  9273. }
  9274. }
  9275. extension[ capabilities.isWebGL2 ? 'drawArraysInstanced' : 'drawArraysInstancedANGLE' ]( mode, start, count, geometry.maxInstancedCount );
  9276. info.update( count, mode, geometry.maxInstancedCount );
  9277. }
  9278. //
  9279. this.setMode = setMode;
  9280. this.render = render;
  9281. this.renderInstances = renderInstances;
  9282. }
  9283. /**
  9284. * @author mrdoob / http://mrdoob.com/
  9285. */
  9286. function WebGLCapabilities( gl, extensions, parameters ) {
  9287. var maxAnisotropy;
  9288. function getMaxAnisotropy() {
  9289. if ( maxAnisotropy !== undefined ) return maxAnisotropy;
  9290. var extension = extensions.get( 'EXT_texture_filter_anisotropic' );
  9291. if ( extension !== null ) {
  9292. maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );
  9293. } else {
  9294. maxAnisotropy = 0;
  9295. }
  9296. return maxAnisotropy;
  9297. }
  9298. function getMaxPrecision( precision ) {
  9299. if ( precision === 'highp' ) {
  9300. if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&
  9301. gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {
  9302. return 'highp';
  9303. }
  9304. precision = 'mediump';
  9305. }
  9306. if ( precision === 'mediump' ) {
  9307. if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&
  9308. gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {
  9309. return 'mediump';
  9310. }
  9311. }
  9312. return 'lowp';
  9313. }
  9314. var isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;
  9315. var precision = parameters.precision !== undefined ? parameters.precision : 'highp';
  9316. var maxPrecision = getMaxPrecision( precision );
  9317. if ( maxPrecision !== precision ) {
  9318. console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );
  9319. precision = maxPrecision;
  9320. }
  9321. var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
  9322. var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
  9323. var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
  9324. var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );
  9325. var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );
  9326. var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
  9327. var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );
  9328. var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );
  9329. var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );
  9330. var vertexTextures = maxVertexTextures > 0;
  9331. var floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' );
  9332. var floatVertexTextures = vertexTextures && floatFragmentTextures;
  9333. return {
  9334. isWebGL2: isWebGL2,
  9335. getMaxAnisotropy: getMaxAnisotropy,
  9336. getMaxPrecision: getMaxPrecision,
  9337. precision: precision,
  9338. logarithmicDepthBuffer: logarithmicDepthBuffer,
  9339. maxTextures: maxTextures,
  9340. maxVertexTextures: maxVertexTextures,
  9341. maxTextureSize: maxTextureSize,
  9342. maxCubemapSize: maxCubemapSize,
  9343. maxAttributes: maxAttributes,
  9344. maxVertexUniforms: maxVertexUniforms,
  9345. maxVaryings: maxVaryings,
  9346. maxFragmentUniforms: maxFragmentUniforms,
  9347. vertexTextures: vertexTextures,
  9348. floatFragmentTextures: floatFragmentTextures,
  9349. floatVertexTextures: floatVertexTextures
  9350. };
  9351. }
  9352. /**
  9353. * @author tschw
  9354. */
  9355. function WebGLClipping() {
  9356. var scope = this,
  9357. globalState = null,
  9358. numGlobalPlanes = 0,
  9359. localClippingEnabled = false,
  9360. renderingShadows = false,
  9361. plane = new Plane(),
  9362. viewNormalMatrix = new Matrix3(),
  9363. uniform = { value: null, needsUpdate: false };
  9364. this.uniform = uniform;
  9365. this.numPlanes = 0;
  9366. this.numIntersection = 0;
  9367. this.init = function ( planes, enableLocalClipping, camera ) {
  9368. var enabled =
  9369. planes.length !== 0 ||
  9370. enableLocalClipping ||
  9371. // enable state of previous frame - the clipping code has to
  9372. // run another frame in order to reset the state:
  9373. numGlobalPlanes !== 0 ||
  9374. localClippingEnabled;
  9375. localClippingEnabled = enableLocalClipping;
  9376. globalState = projectPlanes( planes, camera, 0 );
  9377. numGlobalPlanes = planes.length;
  9378. return enabled;
  9379. };
  9380. this.beginShadows = function () {
  9381. renderingShadows = true;
  9382. projectPlanes( null );
  9383. };
  9384. this.endShadows = function () {
  9385. renderingShadows = false;
  9386. resetGlobalState();
  9387. };
  9388. this.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {
  9389. if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {
  9390. // there's no local clipping
  9391. if ( renderingShadows ) {
  9392. // there's no global clipping
  9393. projectPlanes( null );
  9394. } else {
  9395. resetGlobalState();
  9396. }
  9397. } else {
  9398. var nGlobal = renderingShadows ? 0 : numGlobalPlanes,
  9399. lGlobal = nGlobal * 4,
  9400. dstArray = cache.clippingState || null;
  9401. uniform.value = dstArray; // ensure unique state
  9402. dstArray = projectPlanes( planes, camera, lGlobal, fromCache );
  9403. for ( var i = 0; i !== lGlobal; ++ i ) {
  9404. dstArray[ i ] = globalState[ i ];
  9405. }
  9406. cache.clippingState = dstArray;
  9407. this.numIntersection = clipIntersection ? this.numPlanes : 0;
  9408. this.numPlanes += nGlobal;
  9409. }
  9410. };
  9411. function resetGlobalState() {
  9412. if ( uniform.value !== globalState ) {
  9413. uniform.value = globalState;
  9414. uniform.needsUpdate = numGlobalPlanes > 0;
  9415. }
  9416. scope.numPlanes = numGlobalPlanes;
  9417. scope.numIntersection = 0;
  9418. }
  9419. function projectPlanes( planes, camera, dstOffset, skipTransform ) {
  9420. var nPlanes = planes !== null ? planes.length : 0,
  9421. dstArray = null;
  9422. if ( nPlanes !== 0 ) {
  9423. dstArray = uniform.value;
  9424. if ( skipTransform !== true || dstArray === null ) {
  9425. var flatSize = dstOffset + nPlanes * 4,
  9426. viewMatrix = camera.matrixWorldInverse;
  9427. viewNormalMatrix.getNormalMatrix( viewMatrix );
  9428. if ( dstArray === null || dstArray.length < flatSize ) {
  9429. dstArray = new Float32Array( flatSize );
  9430. }
  9431. for ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {
  9432. plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );
  9433. plane.normal.toArray( dstArray, i4 );
  9434. dstArray[ i4 + 3 ] = plane.constant;
  9435. }
  9436. }
  9437. uniform.value = dstArray;
  9438. uniform.needsUpdate = true;
  9439. }
  9440. scope.numPlanes = nPlanes;
  9441. return dstArray;
  9442. }
  9443. }
  9444. /**
  9445. * @author mrdoob / http://mrdoob.com/
  9446. */
  9447. function WebGLExtensions( gl ) {
  9448. var extensions = {};
  9449. return {
  9450. get: function ( name ) {
  9451. if ( extensions[ name ] !== undefined ) {
  9452. return extensions[ name ];
  9453. }
  9454. var extension;
  9455. switch ( name ) {
  9456. case 'WEBGL_depth_texture':
  9457. extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );
  9458. break;
  9459. case 'EXT_texture_filter_anisotropic':
  9460. extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );
  9461. break;
  9462. case 'WEBGL_compressed_texture_s3tc':
  9463. extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );
  9464. break;
  9465. case 'WEBGL_compressed_texture_pvrtc':
  9466. extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );
  9467. break;
  9468. default:
  9469. extension = gl.getExtension( name );
  9470. }
  9471. if ( extension === null ) {
  9472. console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );
  9473. }
  9474. extensions[ name ] = extension;
  9475. return extension;
  9476. }
  9477. };
  9478. }
  9479. /**
  9480. * @author mrdoob / http://mrdoob.com/
  9481. */
  9482. function WebGLGeometries( gl, attributes, info ) {
  9483. var geometries = {};
  9484. var wireframeAttributes = {};
  9485. function onGeometryDispose( event ) {
  9486. var geometry = event.target;
  9487. var buffergeometry = geometries[ geometry.id ];
  9488. if ( buffergeometry.index !== null ) {
  9489. attributes.remove( buffergeometry.index );
  9490. }
  9491. for ( var name in buffergeometry.attributes ) {
  9492. attributes.remove( buffergeometry.attributes[ name ] );
  9493. }
  9494. geometry.removeEventListener( 'dispose', onGeometryDispose );
  9495. delete geometries[ geometry.id ];
  9496. var attribute = wireframeAttributes[ buffergeometry.id ];
  9497. if ( attribute ) {
  9498. attributes.remove( attribute );
  9499. delete wireframeAttributes[ buffergeometry.id ];
  9500. }
  9501. //
  9502. info.memory.geometries --;
  9503. }
  9504. function get( object, geometry ) {
  9505. var buffergeometry = geometries[ geometry.id ];
  9506. if ( buffergeometry ) return buffergeometry;
  9507. geometry.addEventListener( 'dispose', onGeometryDispose );
  9508. if ( geometry.isBufferGeometry ) {
  9509. buffergeometry = geometry;
  9510. } else if ( geometry.isGeometry ) {
  9511. if ( geometry._bufferGeometry === undefined ) {
  9512. geometry._bufferGeometry = new BufferGeometry().setFromObject( object );
  9513. }
  9514. buffergeometry = geometry._bufferGeometry;
  9515. }
  9516. geometries[ geometry.id ] = buffergeometry;
  9517. info.memory.geometries ++;
  9518. return buffergeometry;
  9519. }
  9520. function update( geometry ) {
  9521. var index = geometry.index;
  9522. var geometryAttributes = geometry.attributes;
  9523. if ( index !== null ) {
  9524. attributes.update( index, gl.ELEMENT_ARRAY_BUFFER );
  9525. }
  9526. for ( var name in geometryAttributes ) {
  9527. attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );
  9528. }
  9529. // morph targets
  9530. var morphAttributes = geometry.morphAttributes;
  9531. for ( var name in morphAttributes ) {
  9532. var array = morphAttributes[ name ];
  9533. for ( var i = 0, l = array.length; i < l; i ++ ) {
  9534. attributes.update( array[ i ], gl.ARRAY_BUFFER );
  9535. }
  9536. }
  9537. }
  9538. function getWireframeAttribute( geometry ) {
  9539. var attribute = wireframeAttributes[ geometry.id ];
  9540. if ( attribute ) return attribute;
  9541. var indices = [];
  9542. var geometryIndex = geometry.index;
  9543. var geometryAttributes = geometry.attributes;
  9544. // console.time( 'wireframe' );
  9545. if ( geometryIndex !== null ) {
  9546. var array = geometryIndex.array;
  9547. for ( var i = 0, l = array.length; i < l; i += 3 ) {
  9548. var a = array[ i + 0 ];
  9549. var b = array[ i + 1 ];
  9550. var c = array[ i + 2 ];
  9551. indices.push( a, b, b, c, c, a );
  9552. }
  9553. } else {
  9554. var array = geometryAttributes.position.array;
  9555. for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {
  9556. var a = i + 0;
  9557. var b = i + 1;
  9558. var c = i + 2;
  9559. indices.push( a, b, b, c, c, a );
  9560. }
  9561. }
  9562. // console.timeEnd( 'wireframe' );
  9563. attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
  9564. attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER );
  9565. wireframeAttributes[ geometry.id ] = attribute;
  9566. return attribute;
  9567. }
  9568. return {
  9569. get: get,
  9570. update: update,
  9571. getWireframeAttribute: getWireframeAttribute
  9572. };
  9573. }
  9574. /**
  9575. * @author mrdoob / http://mrdoob.com/
  9576. */
  9577. function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {
  9578. var mode;
  9579. function setMode( value ) {
  9580. mode = value;
  9581. }
  9582. var type, bytesPerElement;
  9583. function setIndex( value ) {
  9584. type = value.type;
  9585. bytesPerElement = value.bytesPerElement;
  9586. }
  9587. function render( start, count ) {
  9588. gl.drawElements( mode, count, type, start * bytesPerElement );
  9589. info.update( count, mode );
  9590. }
  9591. function renderInstances( geometry, start, count ) {
  9592. var extension;
  9593. if ( capabilities.isWebGL2 ) {
  9594. extension = gl;
  9595. } else {
  9596. var extension = extensions.get( 'ANGLE_instanced_arrays' );
  9597. if ( extension === null ) {
  9598. console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
  9599. return;
  9600. }
  9601. }
  9602. extension[ capabilities.isWebGL2 ? 'drawElementsInstanced' : 'drawElementsInstancedANGLE' ]( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount );
  9603. info.update( count, mode, geometry.maxInstancedCount );
  9604. }
  9605. //
  9606. this.setMode = setMode;
  9607. this.setIndex = setIndex;
  9608. this.render = render;
  9609. this.renderInstances = renderInstances;
  9610. }
  9611. /**
  9612. * @author Mugen87 / https://github.com/Mugen87
  9613. */
  9614. function WebGLInfo( gl ) {
  9615. var memory = {
  9616. geometries: 0,
  9617. textures: 0
  9618. };
  9619. var render = {
  9620. frame: 0,
  9621. calls: 0,
  9622. triangles: 0,
  9623. points: 0,
  9624. lines: 0
  9625. };
  9626. function update( count, mode, instanceCount ) {
  9627. instanceCount = instanceCount || 1;
  9628. render.calls ++;
  9629. switch ( mode ) {
  9630. case gl.TRIANGLES:
  9631. render.triangles += instanceCount * ( count / 3 );
  9632. break;
  9633. case gl.TRIANGLE_STRIP:
  9634. case gl.TRIANGLE_FAN:
  9635. render.triangles += instanceCount * ( count - 2 );
  9636. break;
  9637. case gl.LINES:
  9638. render.lines += instanceCount * ( count / 2 );
  9639. break;
  9640. case gl.LINE_STRIP:
  9641. render.lines += instanceCount * ( count - 1 );
  9642. break;
  9643. case gl.LINE_LOOP:
  9644. render.lines += instanceCount * count;
  9645. break;
  9646. case gl.POINTS:
  9647. render.points += instanceCount * count;
  9648. break;
  9649. default:
  9650. console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );
  9651. break;
  9652. }
  9653. }
  9654. function reset() {
  9655. render.frame ++;
  9656. render.calls = 0;
  9657. render.triangles = 0;
  9658. render.points = 0;
  9659. render.lines = 0;
  9660. }
  9661. return {
  9662. memory: memory,
  9663. render: render,
  9664. programs: null,
  9665. autoReset: true,
  9666. reset: reset,
  9667. update: update
  9668. };
  9669. }
  9670. /**
  9671. * @author mrdoob / http://mrdoob.com/
  9672. */
  9673. function absNumericalSort( a, b ) {
  9674. return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
  9675. }
  9676. function WebGLMorphtargets( gl ) {
  9677. var influencesList = {};
  9678. var morphInfluences = new Float32Array( 8 );
  9679. function update( object, geometry, material, program ) {
  9680. var objectInfluences = object.morphTargetInfluences;
  9681. var length = objectInfluences.length;
  9682. var influences = influencesList[ geometry.id ];
  9683. if ( influences === undefined ) {
  9684. // initialise list
  9685. influences = [];
  9686. for ( var i = 0; i < length; i ++ ) {
  9687. influences[ i ] = [ i, 0 ];
  9688. }
  9689. influencesList[ geometry.id ] = influences;
  9690. }
  9691. var morphTargets = material.morphTargets && geometry.morphAttributes.position;
  9692. var morphNormals = material.morphNormals && geometry.morphAttributes.normal;
  9693. // Remove current morphAttributes
  9694. for ( var i = 0; i < length; i ++ ) {
  9695. var influence = influences[ i ];
  9696. if ( influence[ 1 ] !== 0 ) {
  9697. if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i );
  9698. if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i );
  9699. }
  9700. }
  9701. // Collect influences
  9702. for ( var i = 0; i < length; i ++ ) {
  9703. var influence = influences[ i ];
  9704. influence[ 0 ] = i;
  9705. influence[ 1 ] = objectInfluences[ i ];
  9706. }
  9707. influences.sort( absNumericalSort );
  9708. // Add morphAttributes
  9709. for ( var i = 0; i < 8; i ++ ) {
  9710. var influence = influences[ i ];
  9711. if ( influence ) {
  9712. var index = influence[ 0 ];
  9713. var value = influence[ 1 ];
  9714. if ( value ) {
  9715. if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );
  9716. if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );
  9717. morphInfluences[ i ] = value;
  9718. continue;
  9719. }
  9720. }
  9721. morphInfluences[ i ] = 0;
  9722. }
  9723. program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );
  9724. }
  9725. return {
  9726. update: update
  9727. };
  9728. }
  9729. /**
  9730. * @author mrdoob / http://mrdoob.com/
  9731. */
  9732. function WebGLObjects( geometries, info ) {
  9733. var updateList = {};
  9734. function update( object ) {
  9735. var frame = info.render.frame;
  9736. var geometry = object.geometry;
  9737. var buffergeometry = geometries.get( object, geometry );
  9738. // Update once per frame
  9739. if ( updateList[ buffergeometry.id ] !== frame ) {
  9740. if ( geometry.isGeometry ) {
  9741. buffergeometry.updateFromObject( object );
  9742. }
  9743. geometries.update( buffergeometry );
  9744. updateList[ buffergeometry.id ] = frame;
  9745. }
  9746. return buffergeometry;
  9747. }
  9748. function dispose() {
  9749. updateList = {};
  9750. }
  9751. return {
  9752. update: update,
  9753. dispose: dispose
  9754. };
  9755. }
  9756. /**
  9757. * @author mrdoob / http://mrdoob.com/
  9758. */
  9759. function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {
  9760. images = images !== undefined ? images : [];
  9761. mapping = mapping !== undefined ? mapping : CubeReflectionMapping;
  9762. Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );
  9763. this.flipY = false;
  9764. }
  9765. CubeTexture.prototype = Object.create( Texture.prototype );
  9766. CubeTexture.prototype.constructor = CubeTexture;
  9767. CubeTexture.prototype.isCubeTexture = true;
  9768. Object.defineProperty( CubeTexture.prototype, 'images', {
  9769. get: function () {
  9770. return this.image;
  9771. },
  9772. set: function ( value ) {
  9773. this.image = value;
  9774. }
  9775. } );
  9776. /**
  9777. * @author tschw
  9778. * @author Mugen87 / https://github.com/Mugen87
  9779. * @author mrdoob / http://mrdoob.com/
  9780. *
  9781. * Uniforms of a program.
  9782. * Those form a tree structure with a special top-level container for the root,
  9783. * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.
  9784. *
  9785. *
  9786. * Properties of inner nodes including the top-level container:
  9787. *
  9788. * .seq - array of nested uniforms
  9789. * .map - nested uniforms by name
  9790. *
  9791. *
  9792. * Methods of all nodes except the top-level container:
  9793. *
  9794. * .setValue( gl, value, [renderer] )
  9795. *
  9796. * uploads a uniform value(s)
  9797. * the 'renderer' parameter is needed for sampler uniforms
  9798. *
  9799. *
  9800. * Static methods of the top-level container (renderer factorizations):
  9801. *
  9802. * .upload( gl, seq, values, renderer )
  9803. *
  9804. * sets uniforms in 'seq' to 'values[id].value'
  9805. *
  9806. * .seqWithValue( seq, values ) : filteredSeq
  9807. *
  9808. * filters 'seq' entries with corresponding entry in values
  9809. *
  9810. *
  9811. * Methods of the top-level container (renderer factorizations):
  9812. *
  9813. * .setValue( gl, name, value )
  9814. *
  9815. * sets uniform with name 'name' to 'value'
  9816. *
  9817. * .set( gl, obj, prop )
  9818. *
  9819. * sets uniform from object and property with same name than uniform
  9820. *
  9821. * .setOptional( gl, obj, prop )
  9822. *
  9823. * like .set for an optional property of the object
  9824. *
  9825. */
  9826. var emptyTexture = new Texture();
  9827. var emptyCubeTexture = new CubeTexture();
  9828. // --- Base for inner nodes (including the root) ---
  9829. function UniformContainer() {
  9830. this.seq = [];
  9831. this.map = {};
  9832. }
  9833. // --- Utilities ---
  9834. // Array Caches (provide typed arrays for temporary by size)
  9835. var arrayCacheF32 = [];
  9836. var arrayCacheI32 = [];
  9837. // Float32Array caches used for uploading Matrix uniforms
  9838. var mat4array = new Float32Array( 16 );
  9839. var mat3array = new Float32Array( 9 );
  9840. var mat2array = new Float32Array( 4 );
  9841. // Flattening for arrays of vectors and matrices
  9842. function flatten( array, nBlocks, blockSize ) {
  9843. var firstElem = array[ 0 ];
  9844. if ( firstElem <= 0 || firstElem > 0 ) return array;
  9845. // unoptimized: ! isNaN( firstElem )
  9846. // see http://jacksondunstan.com/articles/983
  9847. var n = nBlocks * blockSize,
  9848. r = arrayCacheF32[ n ];
  9849. if ( r === undefined ) {
  9850. r = new Float32Array( n );
  9851. arrayCacheF32[ n ] = r;
  9852. }
  9853. if ( nBlocks !== 0 ) {
  9854. firstElem.toArray( r, 0 );
  9855. for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {
  9856. offset += blockSize;
  9857. array[ i ].toArray( r, offset );
  9858. }
  9859. }
  9860. return r;
  9861. }
  9862. function arraysEqual( a, b ) {
  9863. if ( a.length !== b.length ) return false;
  9864. for ( var i = 0, l = a.length; i < l; i ++ ) {
  9865. if ( a[ i ] !== b[ i ] ) return false;
  9866. }
  9867. return true;
  9868. }
  9869. function copyArray( a, b ) {
  9870. for ( var i = 0, l = b.length; i < l; i ++ ) {
  9871. a[ i ] = b[ i ];
  9872. }
  9873. }
  9874. // Texture unit allocation
  9875. function allocTexUnits( renderer, n ) {
  9876. var r = arrayCacheI32[ n ];
  9877. if ( r === undefined ) {
  9878. r = new Int32Array( n );
  9879. arrayCacheI32[ n ] = r;
  9880. }
  9881. for ( var i = 0; i !== n; ++ i )
  9882. r[ i ] = renderer.allocTextureUnit();
  9883. return r;
  9884. }
  9885. // --- Setters ---
  9886. // Note: Defining these methods externally, because they come in a bunch
  9887. // and this way their names minify.
  9888. // Single scalar
  9889. function setValue1f( gl, v ) {
  9890. var cache = this.cache;
  9891. if ( cache[ 0 ] === v ) return;
  9892. gl.uniform1f( this.addr, v );
  9893. cache[ 0 ] = v;
  9894. }
  9895. function setValue1i( gl, v ) {
  9896. var cache = this.cache;
  9897. if ( cache[ 0 ] === v ) return;
  9898. gl.uniform1i( this.addr, v );
  9899. cache[ 0 ] = v;
  9900. }
  9901. // Single float vector (from flat array or THREE.VectorN)
  9902. function setValue2fv( gl, v ) {
  9903. var cache = this.cache;
  9904. if ( v.x !== undefined ) {
  9905. if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {
  9906. gl.uniform2f( this.addr, v.x, v.y );
  9907. cache[ 0 ] = v.x;
  9908. cache[ 1 ] = v.y;
  9909. }
  9910. } else {
  9911. if ( arraysEqual( cache, v ) ) return;
  9912. gl.uniform2fv( this.addr, v );
  9913. copyArray( cache, v );
  9914. }
  9915. }
  9916. function setValue3fv( gl, v ) {
  9917. var cache = this.cache;
  9918. if ( v.x !== undefined ) {
  9919. if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {
  9920. gl.uniform3f( this.addr, v.x, v.y, v.z );
  9921. cache[ 0 ] = v.x;
  9922. cache[ 1 ] = v.y;
  9923. cache[ 2 ] = v.z;
  9924. }
  9925. } else if ( v.r !== undefined ) {
  9926. if ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {
  9927. gl.uniform3f( this.addr, v.r, v.g, v.b );
  9928. cache[ 0 ] = v.r;
  9929. cache[ 1 ] = v.g;
  9930. cache[ 2 ] = v.b;
  9931. }
  9932. } else {
  9933. if ( arraysEqual( cache, v ) ) return;
  9934. gl.uniform3fv( this.addr, v );
  9935. copyArray( cache, v );
  9936. }
  9937. }
  9938. function setValue4fv( gl, v ) {
  9939. var cache = this.cache;
  9940. if ( v.x !== undefined ) {
  9941. if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {
  9942. gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );
  9943. cache[ 0 ] = v.x;
  9944. cache[ 1 ] = v.y;
  9945. cache[ 2 ] = v.z;
  9946. cache[ 3 ] = v.w;
  9947. }
  9948. } else {
  9949. if ( arraysEqual( cache, v ) ) return;
  9950. gl.uniform4fv( this.addr, v );
  9951. copyArray( cache, v );
  9952. }
  9953. }
  9954. // Single matrix (from flat array or MatrixN)
  9955. function setValue2fm( gl, v ) {
  9956. var cache = this.cache;
  9957. var elements = v.elements;
  9958. if ( elements === undefined ) {
  9959. if ( arraysEqual( cache, v ) ) return;
  9960. gl.uniformMatrix2fv( this.addr, false, v );
  9961. copyArray( cache, v );
  9962. } else {
  9963. if ( arraysEqual( cache, elements ) ) return;
  9964. mat2array.set( elements );
  9965. gl.uniformMatrix2fv( this.addr, false, mat2array );
  9966. copyArray( cache, elements );
  9967. }
  9968. }
  9969. function setValue3fm( gl, v ) {
  9970. var cache = this.cache;
  9971. var elements = v.elements;
  9972. if ( elements === undefined ) {
  9973. if ( arraysEqual( cache, v ) ) return;
  9974. gl.uniformMatrix3fv( this.addr, false, v );
  9975. copyArray( cache, v );
  9976. } else {
  9977. if ( arraysEqual( cache, elements ) ) return;
  9978. mat3array.set( elements );
  9979. gl.uniformMatrix3fv( this.addr, false, mat3array );
  9980. copyArray( cache, elements );
  9981. }
  9982. }
  9983. function setValue4fm( gl, v ) {
  9984. var cache = this.cache;
  9985. var elements = v.elements;
  9986. if ( elements === undefined ) {
  9987. if ( arraysEqual( cache, v ) ) return;
  9988. gl.uniformMatrix4fv( this.addr, false, v );
  9989. copyArray( cache, v );
  9990. } else {
  9991. if ( arraysEqual( cache, elements ) ) return;
  9992. mat4array.set( elements );
  9993. gl.uniformMatrix4fv( this.addr, false, mat4array );
  9994. copyArray( cache, elements );
  9995. }
  9996. }
  9997. // Single texture (2D / Cube)
  9998. function setValueT1( gl, v, renderer ) {
  9999. var cache = this.cache;
  10000. var unit = renderer.allocTextureUnit();
  10001. if ( cache[ 0 ] !== unit ) {
  10002. gl.uniform1i( this.addr, unit );
  10003. cache[ 0 ] = unit;
  10004. }
  10005. renderer.setTexture2D( v || emptyTexture, unit );
  10006. }
  10007. function setValueT6( gl, v, renderer ) {
  10008. var cache = this.cache;
  10009. var unit = renderer.allocTextureUnit();
  10010. if ( cache[ 0 ] !== unit ) {
  10011. gl.uniform1i( this.addr, unit );
  10012. cache[ 0 ] = unit;
  10013. }
  10014. renderer.setTextureCube( v || emptyCubeTexture, unit );
  10015. }
  10016. // Integer / Boolean vectors or arrays thereof (always flat arrays)
  10017. function setValue2iv( gl, v ) {
  10018. var cache = this.cache;
  10019. if ( arraysEqual( cache, v ) ) return;
  10020. gl.uniform2iv( this.addr, v );
  10021. copyArray( cache, v );
  10022. }
  10023. function setValue3iv( gl, v ) {
  10024. var cache = this.cache;
  10025. if ( arraysEqual( cache, v ) ) return;
  10026. gl.uniform3iv( this.addr, v );
  10027. copyArray( cache, v );
  10028. }
  10029. function setValue4iv( gl, v ) {
  10030. var cache = this.cache;
  10031. if ( arraysEqual( cache, v ) ) return;
  10032. gl.uniform4iv( this.addr, v );
  10033. copyArray( cache, v );
  10034. }
  10035. // Helper to pick the right setter for the singular case
  10036. function getSingularSetter( type ) {
  10037. switch ( type ) {
  10038. case 0x1406: return setValue1f; // FLOAT
  10039. case 0x8b50: return setValue2fv; // _VEC2
  10040. case 0x8b51: return setValue3fv; // _VEC3
  10041. case 0x8b52: return setValue4fv; // _VEC4
  10042. case 0x8b5a: return setValue2fm; // _MAT2
  10043. case 0x8b5b: return setValue3fm; // _MAT3
  10044. case 0x8b5c: return setValue4fm; // _MAT4
  10045. case 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES
  10046. case 0x8b60: return setValueT6; // SAMPLER_CUBE
  10047. case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL
  10048. case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2
  10049. case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3
  10050. case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4
  10051. }
  10052. }
  10053. // Array of scalars
  10054. function setValue1fv( gl, v ) {
  10055. var cache = this.cache;
  10056. if ( arraysEqual( cache, v ) ) return;
  10057. gl.uniform1fv( this.addr, v );
  10058. copyArray( cache, v );
  10059. }
  10060. function setValue1iv( gl, v ) {
  10061. var cache = this.cache;
  10062. if ( arraysEqual( cache, v ) ) return;
  10063. gl.uniform1iv( this.addr, v );
  10064. copyArray( cache, v );
  10065. }
  10066. // Array of vectors (flat or from THREE classes)
  10067. function setValueV2a( gl, v ) {
  10068. var cache = this.cache;
  10069. var data = flatten( v, this.size, 2 );
  10070. if ( arraysEqual( cache, data ) ) return;
  10071. gl.uniform2fv( this.addr, data );
  10072. this.updateCache( data );
  10073. }
  10074. function setValueV3a( gl, v ) {
  10075. var cache = this.cache;
  10076. var data = flatten( v, this.size, 3 );
  10077. if ( arraysEqual( cache, data ) ) return;
  10078. gl.uniform3fv( this.addr, data );
  10079. this.updateCache( data );
  10080. }
  10081. function setValueV4a( gl, v ) {
  10082. var cache = this.cache;
  10083. var data = flatten( v, this.size, 4 );
  10084. if ( arraysEqual( cache, data ) ) return;
  10085. gl.uniform4fv( this.addr, data );
  10086. this.updateCache( data );
  10087. }
  10088. // Array of matrices (flat or from THREE clases)
  10089. function setValueM2a( gl, v ) {
  10090. var cache = this.cache;
  10091. var data = flatten( v, this.size, 4 );
  10092. if ( arraysEqual( cache, data ) ) return;
  10093. gl.uniformMatrix2fv( this.addr, false, data );
  10094. this.updateCache( data );
  10095. }
  10096. function setValueM3a( gl, v ) {
  10097. var cache = this.cache;
  10098. var data = flatten( v, this.size, 9 );
  10099. if ( arraysEqual( cache, data ) ) return;
  10100. gl.uniformMatrix3fv( this.addr, false, data );
  10101. this.updateCache( data );
  10102. }
  10103. function setValueM4a( gl, v ) {
  10104. var cache = this.cache;
  10105. var data = flatten( v, this.size, 16 );
  10106. if ( arraysEqual( cache, data ) ) return;
  10107. gl.uniformMatrix4fv( this.addr, false, data );
  10108. this.updateCache( data );
  10109. }
  10110. // Array of textures (2D / Cube)
  10111. function setValueT1a( gl, v, renderer ) {
  10112. var cache = this.cache;
  10113. var n = v.length;
  10114. var units = allocTexUnits( renderer, n );
  10115. if ( arraysEqual( cache, units ) === false ) {
  10116. gl.uniform1iv( this.addr, units );
  10117. copyArray( cache, units );
  10118. }
  10119. for ( var i = 0; i !== n; ++ i ) {
  10120. renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );
  10121. }
  10122. }
  10123. function setValueT6a( gl, v, renderer ) {
  10124. var cache = this.cache;
  10125. var n = v.length;
  10126. var units = allocTexUnits( renderer, n );
  10127. if ( arraysEqual( cache, units ) === false ) {
  10128. gl.uniform1iv( this.addr, units );
  10129. copyArray( cache, units );
  10130. }
  10131. for ( var i = 0; i !== n; ++ i ) {
  10132. renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );
  10133. }
  10134. }
  10135. // Helper to pick the right setter for a pure (bottom-level) array
  10136. function getPureArraySetter( type ) {
  10137. switch ( type ) {
  10138. case 0x1406: return setValue1fv; // FLOAT
  10139. case 0x8b50: return setValueV2a; // _VEC2
  10140. case 0x8b51: return setValueV3a; // _VEC3
  10141. case 0x8b52: return setValueV4a; // _VEC4
  10142. case 0x8b5a: return setValueM2a; // _MAT2
  10143. case 0x8b5b: return setValueM3a; // _MAT3
  10144. case 0x8b5c: return setValueM4a; // _MAT4
  10145. case 0x8b5e: return setValueT1a; // SAMPLER_2D
  10146. case 0x8b60: return setValueT6a; // SAMPLER_CUBE
  10147. case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL
  10148. case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2
  10149. case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3
  10150. case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4
  10151. }
  10152. }
  10153. // --- Uniform Classes ---
  10154. function SingleUniform( id, activeInfo, addr ) {
  10155. this.id = id;
  10156. this.addr = addr;
  10157. this.cache = [];
  10158. this.setValue = getSingularSetter( activeInfo.type );
  10159. // this.path = activeInfo.name; // DEBUG
  10160. }
  10161. function PureArrayUniform( id, activeInfo, addr ) {
  10162. this.id = id;
  10163. this.addr = addr;
  10164. this.cache = [];
  10165. this.size = activeInfo.size;
  10166. this.setValue = getPureArraySetter( activeInfo.type );
  10167. // this.path = activeInfo.name; // DEBUG
  10168. }
  10169. PureArrayUniform.prototype.updateCache = function ( data ) {
  10170. var cache = this.cache;
  10171. if ( data instanceof Float32Array && cache.length !== data.length ) {
  10172. this.cache = new Float32Array( data.length );
  10173. }
  10174. copyArray( cache, data );
  10175. };
  10176. function StructuredUniform( id ) {
  10177. this.id = id;
  10178. UniformContainer.call( this ); // mix-in
  10179. }
  10180. StructuredUniform.prototype.setValue = function ( gl, value, renderer ) {
  10181. var seq = this.seq;
  10182. for ( var i = 0, n = seq.length; i !== n; ++ i ) {
  10183. var u = seq[ i ];
  10184. u.setValue( gl, value[ u.id ], renderer );
  10185. }
  10186. };
  10187. // --- Top-level ---
  10188. // Parser - builds up the property tree from the path strings
  10189. var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g;
  10190. // extracts
  10191. // - the identifier (member name or array index)
  10192. // - followed by an optional right bracket (found when array index)
  10193. // - followed by an optional left bracket or dot (type of subscript)
  10194. //
  10195. // Note: These portions can be read in a non-overlapping fashion and
  10196. // allow straightforward parsing of the hierarchy that WebGL encodes
  10197. // in the uniform names.
  10198. function addUniform( container, uniformObject ) {
  10199. container.seq.push( uniformObject );
  10200. container.map[ uniformObject.id ] = uniformObject;
  10201. }
  10202. function parseUniform( activeInfo, addr, container ) {
  10203. var path = activeInfo.name,
  10204. pathLength = path.length;
  10205. // reset RegExp object, because of the early exit of a previous run
  10206. RePathPart.lastIndex = 0;
  10207. while ( true ) {
  10208. var match = RePathPart.exec( path ),
  10209. matchEnd = RePathPart.lastIndex,
  10210. id = match[ 1 ],
  10211. idIsIndex = match[ 2 ] === ']',
  10212. subscript = match[ 3 ];
  10213. if ( idIsIndex ) id = id | 0; // convert to integer
  10214. if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {
  10215. // bare name or "pure" bottom-level array "[0]" suffix
  10216. addUniform( container, subscript === undefined ?
  10217. new SingleUniform( id, activeInfo, addr ) :
  10218. new PureArrayUniform( id, activeInfo, addr ) );
  10219. break;
  10220. } else {
  10221. // step into inner node / create it in case it doesn't exist
  10222. var map = container.map, next = map[ id ];
  10223. if ( next === undefined ) {
  10224. next = new StructuredUniform( id );
  10225. addUniform( container, next );
  10226. }
  10227. container = next;
  10228. }
  10229. }
  10230. }
  10231. // Root Container
  10232. function WebGLUniforms( gl, program, renderer ) {
  10233. UniformContainer.call( this );
  10234. this.renderer = renderer;
  10235. var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );
  10236. for ( var i = 0; i < n; ++ i ) {
  10237. var info = gl.getActiveUniform( program, i ),
  10238. addr = gl.getUniformLocation( program, info.name );
  10239. parseUniform( info, addr, this );
  10240. }
  10241. }
  10242. WebGLUniforms.prototype.setValue = function ( gl, name, value ) {
  10243. var u = this.map[ name ];
  10244. if ( u !== undefined ) u.setValue( gl, value, this.renderer );
  10245. };
  10246. WebGLUniforms.prototype.setOptional = function ( gl, object, name ) {
  10247. var v = object[ name ];
  10248. if ( v !== undefined ) this.setValue( gl, name, v );
  10249. };
  10250. // Static interface
  10251. WebGLUniforms.upload = function ( gl, seq, values, renderer ) {
  10252. for ( var i = 0, n = seq.length; i !== n; ++ i ) {
  10253. var u = seq[ i ],
  10254. v = values[ u.id ];
  10255. if ( v.needsUpdate !== false ) {
  10256. // note: always updating when .needsUpdate is undefined
  10257. u.setValue( gl, v.value, renderer );
  10258. }
  10259. }
  10260. };
  10261. WebGLUniforms.seqWithValue = function ( seq, values ) {
  10262. var r = [];
  10263. for ( var i = 0, n = seq.length; i !== n; ++ i ) {
  10264. var u = seq[ i ];
  10265. if ( u.id in values ) r.push( u );
  10266. }
  10267. return r;
  10268. };
  10269. /**
  10270. * @author mrdoob / http://mrdoob.com/
  10271. */
  10272. function addLineNumbers( string ) {
  10273. var lines = string.split( '\n' );
  10274. for ( var i = 0; i < lines.length; i ++ ) {
  10275. lines[ i ] = ( i + 1 ) + ': ' + lines[ i ];
  10276. }
  10277. return lines.join( '\n' );
  10278. }
  10279. function WebGLShader( gl, type, string ) {
  10280. var shader = gl.createShader( type );
  10281. gl.shaderSource( shader, string );
  10282. gl.compileShader( shader );
  10283. if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {
  10284. console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' );
  10285. }
  10286. if ( gl.getShaderInfoLog( shader ) !== '' ) {
  10287. console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );
  10288. }
  10289. // --enable-privileged-webgl-extension
  10290. // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );
  10291. return shader;
  10292. }
  10293. /**
  10294. * @author mrdoob / http://mrdoob.com/
  10295. */
  10296. var programIdCount = 0;
  10297. function getEncodingComponents( encoding ) {
  10298. switch ( encoding ) {
  10299. case LinearEncoding:
  10300. return [ 'Linear', '( value )' ];
  10301. case sRGBEncoding:
  10302. return [ 'sRGB', '( value )' ];
  10303. case RGBEEncoding:
  10304. return [ 'RGBE', '( value )' ];
  10305. case RGBM7Encoding:
  10306. return [ 'RGBM', '( value, 7.0 )' ];
  10307. case RGBM16Encoding:
  10308. return [ 'RGBM', '( value, 16.0 )' ];
  10309. case RGBDEncoding:
  10310. return [ 'RGBD', '( value, 256.0 )' ];
  10311. case GammaEncoding:
  10312. return [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ];
  10313. default:
  10314. throw new Error( 'unsupported encoding: ' + encoding );
  10315. }
  10316. }
  10317. function getTexelDecodingFunction( functionName, encoding ) {
  10318. var components = getEncodingComponents( encoding );
  10319. return 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }';
  10320. }
  10321. function getTexelEncodingFunction( functionName, encoding ) {
  10322. var components = getEncodingComponents( encoding );
  10323. return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';
  10324. }
  10325. function getToneMappingFunction( functionName, toneMapping ) {
  10326. var toneMappingName;
  10327. switch ( toneMapping ) {
  10328. case LinearToneMapping:
  10329. toneMappingName = 'Linear';
  10330. break;
  10331. case ReinhardToneMapping:
  10332. toneMappingName = 'Reinhard';
  10333. break;
  10334. case Uncharted2ToneMapping:
  10335. toneMappingName = 'Uncharted2';
  10336. break;
  10337. case CineonToneMapping:
  10338. toneMappingName = 'OptimizedCineon';
  10339. break;
  10340. default:
  10341. throw new Error( 'unsupported toneMapping: ' + toneMapping );
  10342. }
  10343. return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';
  10344. }
  10345. function generateExtensions( extensions, parameters, rendererExtensions ) {
  10346. extensions = extensions || {};
  10347. var chunks = [
  10348. ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || ( parameters.normalMap && ! parameters.objectSpaceNormalMap ) || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',
  10349. ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',
  10350. ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',
  10351. ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''
  10352. ];
  10353. return chunks.filter( filterEmptyLine ).join( '\n' );
  10354. }
  10355. function generateDefines( defines ) {
  10356. var chunks = [];
  10357. for ( var name in defines ) {
  10358. var value = defines[ name ];
  10359. if ( value === false ) continue;
  10360. chunks.push( '#define ' + name + ' ' + value );
  10361. }
  10362. return chunks.join( '\n' );
  10363. }
  10364. function fetchAttributeLocations( gl, program ) {
  10365. var attributes = {};
  10366. var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );
  10367. for ( var i = 0; i < n; i ++ ) {
  10368. var info = gl.getActiveAttrib( program, i );
  10369. var name = info.name;
  10370. // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );
  10371. attributes[ name ] = gl.getAttribLocation( program, name );
  10372. }
  10373. return attributes;
  10374. }
  10375. function filterEmptyLine( string ) {
  10376. return string !== '';
  10377. }
  10378. function replaceLightNums( string, parameters ) {
  10379. return string
  10380. .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )
  10381. .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )
  10382. .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )
  10383. .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )
  10384. .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );
  10385. }
  10386. function replaceClippingPlaneNums( string, parameters ) {
  10387. return string
  10388. .replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )
  10389. .replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );
  10390. }
  10391. function parseIncludes( string ) {
  10392. var pattern = /^[ \t]*#include +<([\w\d./]+)>/gm;
  10393. function replace( match, include ) {
  10394. var replace = ShaderChunk[ include ];
  10395. if ( replace === undefined ) {
  10396. throw new Error( 'Can not resolve #include <' + include + '>' );
  10397. }
  10398. return parseIncludes( replace );
  10399. }
  10400. return string.replace( pattern, replace );
  10401. }
  10402. function unrollLoops( string ) {
  10403. var pattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
  10404. function replace( match, start, end, snippet ) {
  10405. var unroll = '';
  10406. for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {
  10407. unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' );
  10408. }
  10409. return unroll;
  10410. }
  10411. return string.replace( pattern, replace );
  10412. }
  10413. function WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ) {
  10414. var gl = renderer.context;
  10415. var defines = material.defines;
  10416. var vertexShader = shader.vertexShader;
  10417. var fragmentShader = shader.fragmentShader;
  10418. var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';
  10419. if ( parameters.shadowMapType === PCFShadowMap ) {
  10420. shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';
  10421. } else if ( parameters.shadowMapType === PCFSoftShadowMap ) {
  10422. shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';
  10423. }
  10424. var envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
  10425. var envMapModeDefine = 'ENVMAP_MODE_REFLECTION';
  10426. var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
  10427. if ( parameters.envMap ) {
  10428. switch ( material.envMap.mapping ) {
  10429. case CubeReflectionMapping:
  10430. case CubeRefractionMapping:
  10431. envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
  10432. break;
  10433. case CubeUVReflectionMapping:
  10434. case CubeUVRefractionMapping:
  10435. envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';
  10436. break;
  10437. case EquirectangularReflectionMapping:
  10438. case EquirectangularRefractionMapping:
  10439. envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';
  10440. break;
  10441. case SphericalReflectionMapping:
  10442. envMapTypeDefine = 'ENVMAP_TYPE_SPHERE';
  10443. break;
  10444. }
  10445. switch ( material.envMap.mapping ) {
  10446. case CubeRefractionMapping:
  10447. case EquirectangularRefractionMapping:
  10448. envMapModeDefine = 'ENVMAP_MODE_REFRACTION';
  10449. break;
  10450. }
  10451. switch ( material.combine ) {
  10452. case MultiplyOperation:
  10453. envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
  10454. break;
  10455. case MixOperation:
  10456. envMapBlendingDefine = 'ENVMAP_BLENDING_MIX';
  10457. break;
  10458. case AddOperation:
  10459. envMapBlendingDefine = 'ENVMAP_BLENDING_ADD';
  10460. break;
  10461. }
  10462. }
  10463. var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;
  10464. // console.log( 'building new program ' );
  10465. //
  10466. var customExtensions = capabilities.isWebGL2 ? '' : generateExtensions( material.extensions, parameters, extensions );
  10467. var customDefines = generateDefines( defines );
  10468. //
  10469. var program = gl.createProgram();
  10470. var prefixVertex, prefixFragment;
  10471. if ( material.isRawShaderMaterial ) {
  10472. prefixVertex = [
  10473. customDefines
  10474. ].filter( filterEmptyLine ).join( '\n' );
  10475. if ( prefixVertex.length > 0 ) {
  10476. prefixVertex += '\n';
  10477. }
  10478. prefixFragment = [
  10479. customExtensions,
  10480. customDefines
  10481. ].filter( filterEmptyLine ).join( '\n' );
  10482. if ( prefixFragment.length > 0 ) {
  10483. prefixFragment += '\n';
  10484. }
  10485. } else {
  10486. prefixVertex = [
  10487. 'precision ' + parameters.precision + ' float;',
  10488. 'precision ' + parameters.precision + ' int;',
  10489. '#define SHADER_NAME ' + shader.name,
  10490. customDefines,
  10491. parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',
  10492. '#define GAMMA_FACTOR ' + gammaFactorDefine,
  10493. '#define MAX_BONES ' + parameters.maxBones,
  10494. ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
  10495. ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',
  10496. parameters.map ? '#define USE_MAP' : '',
  10497. parameters.envMap ? '#define USE_ENVMAP' : '',
  10498. parameters.envMap ? '#define ' + envMapModeDefine : '',
  10499. parameters.lightMap ? '#define USE_LIGHTMAP' : '',
  10500. parameters.aoMap ? '#define USE_AOMAP' : '',
  10501. parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
  10502. parameters.bumpMap ? '#define USE_BUMPMAP' : '',
  10503. parameters.normalMap ? '#define USE_NORMALMAP' : '',
  10504. ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',
  10505. parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',
  10506. parameters.specularMap ? '#define USE_SPECULARMAP' : '',
  10507. parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
  10508. parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
  10509. parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
  10510. parameters.vertexColors ? '#define USE_COLOR' : '',
  10511. parameters.flatShading ? '#define FLAT_SHADED' : '',
  10512. parameters.skinning ? '#define USE_SKINNING' : '',
  10513. parameters.useVertexTexture ? '#define BONE_TEXTURE' : '',
  10514. parameters.morphTargets ? '#define USE_MORPHTARGETS' : '',
  10515. parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',
  10516. parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
  10517. parameters.flipSided ? '#define FLIP_SIDED' : '',
  10518. parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
  10519. parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
  10520. parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',
  10521. parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
  10522. parameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
  10523. 'uniform mat4 modelMatrix;',
  10524. 'uniform mat4 modelViewMatrix;',
  10525. 'uniform mat4 projectionMatrix;',
  10526. 'uniform mat4 viewMatrix;',
  10527. 'uniform mat3 normalMatrix;',
  10528. 'uniform vec3 cameraPosition;',
  10529. 'attribute vec3 position;',
  10530. 'attribute vec3 normal;',
  10531. 'attribute vec2 uv;',
  10532. '#ifdef USE_COLOR',
  10533. ' attribute vec3 color;',
  10534. '#endif',
  10535. '#ifdef USE_MORPHTARGETS',
  10536. ' attribute vec3 morphTarget0;',
  10537. ' attribute vec3 morphTarget1;',
  10538. ' attribute vec3 morphTarget2;',
  10539. ' attribute vec3 morphTarget3;',
  10540. ' #ifdef USE_MORPHNORMALS',
  10541. ' attribute vec3 morphNormal0;',
  10542. ' attribute vec3 morphNormal1;',
  10543. ' attribute vec3 morphNormal2;',
  10544. ' attribute vec3 morphNormal3;',
  10545. ' #else',
  10546. ' attribute vec3 morphTarget4;',
  10547. ' attribute vec3 morphTarget5;',
  10548. ' attribute vec3 morphTarget6;',
  10549. ' attribute vec3 morphTarget7;',
  10550. ' #endif',
  10551. '#endif',
  10552. '#ifdef USE_SKINNING',
  10553. ' attribute vec4 skinIndex;',
  10554. ' attribute vec4 skinWeight;',
  10555. '#endif',
  10556. '\n'
  10557. ].filter( filterEmptyLine ).join( '\n' );
  10558. prefixFragment = [
  10559. customExtensions,
  10560. 'precision ' + parameters.precision + ' float;',
  10561. 'precision ' + parameters.precision + ' int;',
  10562. '#define SHADER_NAME ' + shader.name,
  10563. customDefines,
  10564. parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest + ( parameters.alphaTest % 1 ? '' : '.0' ) : '', // add '.0' if integer
  10565. '#define GAMMA_FACTOR ' + gammaFactorDefine,
  10566. ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
  10567. ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',
  10568. parameters.map ? '#define USE_MAP' : '',
  10569. parameters.envMap ? '#define USE_ENVMAP' : '',
  10570. parameters.envMap ? '#define ' + envMapTypeDefine : '',
  10571. parameters.envMap ? '#define ' + envMapModeDefine : '',
  10572. parameters.envMap ? '#define ' + envMapBlendingDefine : '',
  10573. parameters.lightMap ? '#define USE_LIGHTMAP' : '',
  10574. parameters.aoMap ? '#define USE_AOMAP' : '',
  10575. parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
  10576. parameters.bumpMap ? '#define USE_BUMPMAP' : '',
  10577. parameters.normalMap ? '#define USE_NORMALMAP' : '',
  10578. ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',
  10579. parameters.specularMap ? '#define USE_SPECULARMAP' : '',
  10580. parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
  10581. parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
  10582. parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
  10583. parameters.vertexColors ? '#define USE_COLOR' : '',
  10584. parameters.gradientMap ? '#define USE_GRADIENTMAP' : '',
  10585. parameters.flatShading ? '#define FLAT_SHADED' : '',
  10586. parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
  10587. parameters.flipSided ? '#define FLIP_SIDED' : '',
  10588. parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
  10589. parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
  10590. parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',
  10591. parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',
  10592. parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
  10593. parameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
  10594. parameters.envMap && ( capabilities.isWebGL2 || extensions.get( 'EXT_shader_texture_lod' ) ) ? '#define TEXTURE_LOD_EXT' : '',
  10595. 'uniform mat4 viewMatrix;',
  10596. 'uniform vec3 cameraPosition;',
  10597. ( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',
  10598. ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below
  10599. ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',
  10600. parameters.dithering ? '#define DITHERING' : '',
  10601. ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below
  10602. parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',
  10603. parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',
  10604. parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',
  10605. parameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '',
  10606. parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '',
  10607. '\n'
  10608. ].filter( filterEmptyLine ).join( '\n' );
  10609. }
  10610. vertexShader = parseIncludes( vertexShader );
  10611. vertexShader = replaceLightNums( vertexShader, parameters );
  10612. vertexShader = replaceClippingPlaneNums( vertexShader, parameters );
  10613. fragmentShader = parseIncludes( fragmentShader );
  10614. fragmentShader = replaceLightNums( fragmentShader, parameters );
  10615. fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );
  10616. vertexShader = unrollLoops( vertexShader );
  10617. fragmentShader = unrollLoops( fragmentShader );
  10618. if ( capabilities.isWebGL2 && ! material.isRawShaderMaterial ) {
  10619. var isGLSL3ShaderMaterial = false;
  10620. var versionRegex = /^\s*#version\s+300\s+es\s*\n/;
  10621. if ( material.isShaderMaterial &&
  10622. vertexShader.match( versionRegex ) !== null &&
  10623. fragmentShader.match( versionRegex ) !== null ) {
  10624. isGLSL3ShaderMaterial = true;
  10625. vertexShader = vertexShader.replace( versionRegex, '' );
  10626. fragmentShader = fragmentShader.replace( versionRegex, '' );
  10627. }
  10628. // GLSL 3.0 conversion
  10629. prefixVertex = [
  10630. '#version 300 es\n',
  10631. '#define attribute in',
  10632. '#define varying out',
  10633. '#define texture2D texture'
  10634. ].join( '\n' ) + '\n' + prefixVertex;
  10635. prefixFragment = [
  10636. '#version 300 es\n',
  10637. '#define varying in',
  10638. isGLSL3ShaderMaterial ? '' : 'out highp vec4 pc_fragColor;',
  10639. isGLSL3ShaderMaterial ? '' : '#define gl_FragColor pc_fragColor',
  10640. '#define gl_FragDepthEXT gl_FragDepth',
  10641. '#define texture2D texture',
  10642. '#define textureCube texture',
  10643. '#define texture2DProj textureProj',
  10644. '#define texture2DLodEXT textureLod',
  10645. '#define texture2DProjLodEXT textureProjLod',
  10646. '#define textureCubeLodEXT textureLod',
  10647. '#define texture2DGradEXT textureGrad',
  10648. '#define texture2DProjGradEXT textureProjGrad',
  10649. '#define textureCubeGradEXT textureGrad'
  10650. ].join( '\n' ) + '\n' + prefixFragment;
  10651. }
  10652. var vertexGlsl = prefixVertex + vertexShader;
  10653. var fragmentGlsl = prefixFragment + fragmentShader;
  10654. // console.log( '*VERTEX*', vertexGlsl );
  10655. // console.log( '*FRAGMENT*', fragmentGlsl );
  10656. var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );
  10657. var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );
  10658. gl.attachShader( program, glVertexShader );
  10659. gl.attachShader( program, glFragmentShader );
  10660. // Force a particular attribute to index 0.
  10661. if ( material.index0AttributeName !== undefined ) {
  10662. gl.bindAttribLocation( program, 0, material.index0AttributeName );
  10663. } else if ( parameters.morphTargets === true ) {
  10664. // programs with morphTargets displace position out of attribute 0
  10665. gl.bindAttribLocation( program, 0, 'position' );
  10666. }
  10667. gl.linkProgram( program );
  10668. var programLog = gl.getProgramInfoLog( program ).trim();
  10669. var vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();
  10670. var fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();
  10671. var runnable = true;
  10672. var haveDiagnostics = true;
  10673. // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );
  10674. // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );
  10675. if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
  10676. runnable = false;
  10677. console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );
  10678. } else if ( programLog !== '' ) {
  10679. console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );
  10680. } else if ( vertexLog === '' || fragmentLog === '' ) {
  10681. haveDiagnostics = false;
  10682. }
  10683. if ( haveDiagnostics ) {
  10684. this.diagnostics = {
  10685. runnable: runnable,
  10686. material: material,
  10687. programLog: programLog,
  10688. vertexShader: {
  10689. log: vertexLog,
  10690. prefix: prefixVertex
  10691. },
  10692. fragmentShader: {
  10693. log: fragmentLog,
  10694. prefix: prefixFragment
  10695. }
  10696. };
  10697. }
  10698. // clean up
  10699. gl.deleteShader( glVertexShader );
  10700. gl.deleteShader( glFragmentShader );
  10701. // set up caching for uniform locations
  10702. var cachedUniforms;
  10703. this.getUniforms = function () {
  10704. if ( cachedUniforms === undefined ) {
  10705. cachedUniforms = new WebGLUniforms( gl, program, renderer );
  10706. }
  10707. return cachedUniforms;
  10708. };
  10709. // set up caching for attribute locations
  10710. var cachedAttributes;
  10711. this.getAttributes = function () {
  10712. if ( cachedAttributes === undefined ) {
  10713. cachedAttributes = fetchAttributeLocations( gl, program );
  10714. }
  10715. return cachedAttributes;
  10716. };
  10717. // free resource
  10718. this.destroy = function () {
  10719. gl.deleteProgram( program );
  10720. this.program = undefined;
  10721. };
  10722. // DEPRECATED
  10723. Object.defineProperties( this, {
  10724. uniforms: {
  10725. get: function () {
  10726. console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );
  10727. return this.getUniforms();
  10728. }
  10729. },
  10730. attributes: {
  10731. get: function () {
  10732. console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );
  10733. return this.getAttributes();
  10734. }
  10735. }
  10736. } );
  10737. //
  10738. this.name = shader.name;
  10739. this.id = programIdCount ++;
  10740. this.code = code;
  10741. this.usedTimes = 1;
  10742. this.program = program;
  10743. this.vertexShader = glVertexShader;
  10744. this.fragmentShader = glFragmentShader;
  10745. return this;
  10746. }
  10747. /**
  10748. * @author mrdoob / http://mrdoob.com/
  10749. */
  10750. function WebGLPrograms( renderer, extensions, capabilities ) {
  10751. var programs = [];
  10752. var shaderIDs = {
  10753. MeshDepthMaterial: 'depth',
  10754. MeshDistanceMaterial: 'distanceRGBA',
  10755. MeshNormalMaterial: 'normal',
  10756. MeshBasicMaterial: 'basic',
  10757. MeshLambertMaterial: 'lambert',
  10758. MeshPhongMaterial: 'phong',
  10759. MeshToonMaterial: 'phong',
  10760. MeshStandardMaterial: 'physical',
  10761. MeshPhysicalMaterial: 'physical',
  10762. LineBasicMaterial: 'basic',
  10763. LineDashedMaterial: 'dashed',
  10764. PointsMaterial: 'points',
  10765. ShadowMaterial: 'shadow',
  10766. SpriteMaterial: 'sprite'
  10767. };
  10768. var parameterNames = [
  10769. "precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding",
  10770. "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "objectSpaceNormalMap", "displacementMap", "specularMap",
  10771. "roughnessMap", "metalnessMap", "gradientMap",
  10772. "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp",
  10773. "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning",
  10774. "maxBones", "useVertexTexture", "morphTargets", "morphNormals",
  10775. "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha",
  10776. "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights",
  10777. "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights',
  10778. "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering"
  10779. ];
  10780. function allocateBones( object ) {
  10781. var skeleton = object.skeleton;
  10782. var bones = skeleton.bones;
  10783. if ( capabilities.floatVertexTextures ) {
  10784. return 1024;
  10785. } else {
  10786. // default for when object is not specified
  10787. // ( for example when prebuilding shader to be used with multiple objects )
  10788. //
  10789. // - leave some extra space for other uniforms
  10790. // - limit here is ANGLE's 254 max uniform vectors
  10791. // (up to 54 should be safe)
  10792. var nVertexUniforms = capabilities.maxVertexUniforms;
  10793. var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );
  10794. var maxBones = Math.min( nVertexMatrices, bones.length );
  10795. if ( maxBones < bones.length ) {
  10796. console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );
  10797. return 0;
  10798. }
  10799. return maxBones;
  10800. }
  10801. }
  10802. function getTextureEncodingFromMap( map, gammaOverrideLinear ) {
  10803. var encoding;
  10804. if ( ! map ) {
  10805. encoding = LinearEncoding;
  10806. } else if ( map.isTexture ) {
  10807. encoding = map.encoding;
  10808. } else if ( map.isWebGLRenderTarget ) {
  10809. console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." );
  10810. encoding = map.texture.encoding;
  10811. }
  10812. // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.
  10813. if ( encoding === LinearEncoding && gammaOverrideLinear ) {
  10814. encoding = GammaEncoding;
  10815. }
  10816. return encoding;
  10817. }
  10818. this.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) {
  10819. var shaderID = shaderIDs[ material.type ];
  10820. // heuristics to create shader parameters according to lights in the scene
  10821. // (not to blow over maxLights budget)
  10822. var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0;
  10823. var precision = capabilities.precision;
  10824. if ( material.precision !== null ) {
  10825. precision = capabilities.getMaxPrecision( material.precision );
  10826. if ( precision !== material.precision ) {
  10827. console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );
  10828. }
  10829. }
  10830. var currentRenderTarget = renderer.getRenderTarget();
  10831. var parameters = {
  10832. shaderID: shaderID,
  10833. precision: precision,
  10834. supportsVertexTextures: capabilities.vertexTextures,
  10835. outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),
  10836. map: !! material.map,
  10837. mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),
  10838. envMap: !! material.envMap,
  10839. envMapMode: material.envMap && material.envMap.mapping,
  10840. envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),
  10841. envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),
  10842. lightMap: !! material.lightMap,
  10843. aoMap: !! material.aoMap,
  10844. emissiveMap: !! material.emissiveMap,
  10845. emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),
  10846. bumpMap: !! material.bumpMap,
  10847. normalMap: !! material.normalMap,
  10848. objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,
  10849. displacementMap: !! material.displacementMap,
  10850. roughnessMap: !! material.roughnessMap,
  10851. metalnessMap: !! material.metalnessMap,
  10852. specularMap: !! material.specularMap,
  10853. alphaMap: !! material.alphaMap,
  10854. gradientMap: !! material.gradientMap,
  10855. combine: material.combine,
  10856. vertexColors: material.vertexColors,
  10857. fog: !! fog,
  10858. useFog: material.fog,
  10859. fogExp: ( fog && fog.isFogExp2 ),
  10860. flatShading: material.flatShading,
  10861. sizeAttenuation: material.sizeAttenuation,
  10862. logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,
  10863. skinning: material.skinning && maxBones > 0,
  10864. maxBones: maxBones,
  10865. useVertexTexture: capabilities.floatVertexTextures,
  10866. morphTargets: material.morphTargets,
  10867. morphNormals: material.morphNormals,
  10868. maxMorphTargets: renderer.maxMorphTargets,
  10869. maxMorphNormals: renderer.maxMorphNormals,
  10870. numDirLights: lights.directional.length,
  10871. numPointLights: lights.point.length,
  10872. numSpotLights: lights.spot.length,
  10873. numRectAreaLights: lights.rectArea.length,
  10874. numHemiLights: lights.hemi.length,
  10875. numClippingPlanes: nClipPlanes,
  10876. numClipIntersection: nClipIntersection,
  10877. dithering: material.dithering,
  10878. shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0,
  10879. shadowMapType: renderer.shadowMap.type,
  10880. toneMapping: renderer.toneMapping,
  10881. physicallyCorrectLights: renderer.physicallyCorrectLights,
  10882. premultipliedAlpha: material.premultipliedAlpha,
  10883. alphaTest: material.alphaTest,
  10884. doubleSided: material.side === DoubleSide,
  10885. flipSided: material.side === BackSide,
  10886. depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false
  10887. };
  10888. return parameters;
  10889. };
  10890. this.getProgramCode = function ( material, parameters ) {
  10891. var array = [];
  10892. if ( parameters.shaderID ) {
  10893. array.push( parameters.shaderID );
  10894. } else {
  10895. array.push( material.fragmentShader );
  10896. array.push( material.vertexShader );
  10897. }
  10898. if ( material.defines !== undefined ) {
  10899. for ( var name in material.defines ) {
  10900. array.push( name );
  10901. array.push( material.defines[ name ] );
  10902. }
  10903. }
  10904. for ( var i = 0; i < parameterNames.length; i ++ ) {
  10905. array.push( parameters[ parameterNames[ i ] ] );
  10906. }
  10907. array.push( material.onBeforeCompile.toString() );
  10908. array.push( renderer.gammaOutput );
  10909. return array.join();
  10910. };
  10911. this.acquireProgram = function ( material, shader, parameters, code ) {
  10912. var program;
  10913. // Check if code has been already compiled
  10914. for ( var p = 0, pl = programs.length; p < pl; p ++ ) {
  10915. var programInfo = programs[ p ];
  10916. if ( programInfo.code === code ) {
  10917. program = programInfo;
  10918. ++ program.usedTimes;
  10919. break;
  10920. }
  10921. }
  10922. if ( program === undefined ) {
  10923. program = new WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities );
  10924. programs.push( program );
  10925. }
  10926. return program;
  10927. };
  10928. this.releaseProgram = function ( program ) {
  10929. if ( -- program.usedTimes === 0 ) {
  10930. // Remove from unordered set
  10931. var i = programs.indexOf( program );
  10932. programs[ i ] = programs[ programs.length - 1 ];
  10933. programs.pop();
  10934. // Free WebGL resources
  10935. program.destroy();
  10936. }
  10937. };
  10938. // Exposed for resource monitoring & error feedback via renderer.info:
  10939. this.programs = programs;
  10940. }
  10941. /**
  10942. * @author fordacious / fordacious.github.io
  10943. */
  10944. function WebGLProperties() {
  10945. var properties = new WeakMap();
  10946. function get( object ) {
  10947. var map = properties.get( object );
  10948. if ( map === undefined ) {
  10949. map = {};
  10950. properties.set( object, map );
  10951. }
  10952. return map;
  10953. }
  10954. function remove( object ) {
  10955. properties.delete( object );
  10956. }
  10957. function update( object, key, value ) {
  10958. properties.get( object )[ key ] = value;
  10959. }
  10960. function dispose() {
  10961. properties = new WeakMap();
  10962. }
  10963. return {
  10964. get: get,
  10965. remove: remove,
  10966. update: update,
  10967. dispose: dispose
  10968. };
  10969. }
  10970. /**
  10971. * @author mrdoob / http://mrdoob.com/
  10972. */
  10973. function painterSortStable( a, b ) {
  10974. if ( a.renderOrder !== b.renderOrder ) {
  10975. return a.renderOrder - b.renderOrder;
  10976. } else if ( a.program && b.program && a.program !== b.program ) {
  10977. return a.program.id - b.program.id;
  10978. } else if ( a.material.id !== b.material.id ) {
  10979. return a.material.id - b.material.id;
  10980. } else if ( a.z !== b.z ) {
  10981. return a.z - b.z;
  10982. } else {
  10983. return a.id - b.id;
  10984. }
  10985. }
  10986. function reversePainterSortStable( a, b ) {
  10987. if ( a.renderOrder !== b.renderOrder ) {
  10988. return a.renderOrder - b.renderOrder;
  10989. } if ( a.z !== b.z ) {
  10990. return b.z - a.z;
  10991. } else {
  10992. return a.id - b.id;
  10993. }
  10994. }
  10995. function WebGLRenderList() {
  10996. var renderItems = [];
  10997. var renderItemsIndex = 0;
  10998. var opaque = [];
  10999. var transparent = [];
  11000. function init() {
  11001. renderItemsIndex = 0;
  11002. opaque.length = 0;
  11003. transparent.length = 0;
  11004. }
  11005. function push( object, geometry, material, z, group ) {
  11006. var renderItem = renderItems[ renderItemsIndex ];
  11007. if ( renderItem === undefined ) {
  11008. renderItem = {
  11009. id: object.id,
  11010. object: object,
  11011. geometry: geometry,
  11012. material: material,
  11013. program: material.program,
  11014. renderOrder: object.renderOrder,
  11015. z: z,
  11016. group: group
  11017. };
  11018. renderItems[ renderItemsIndex ] = renderItem;
  11019. } else {
  11020. renderItem.id = object.id;
  11021. renderItem.object = object;
  11022. renderItem.geometry = geometry;
  11023. renderItem.material = material;
  11024. renderItem.program = material.program;
  11025. renderItem.renderOrder = object.renderOrder;
  11026. renderItem.z = z;
  11027. renderItem.group = group;
  11028. }
  11029. ( material.transparent === true ? transparent : opaque ).push( renderItem );
  11030. renderItemsIndex ++;
  11031. }
  11032. function sort() {
  11033. if ( opaque.length > 1 ) opaque.sort( painterSortStable );
  11034. if ( transparent.length > 1 ) transparent.sort( reversePainterSortStable );
  11035. }
  11036. return {
  11037. opaque: opaque,
  11038. transparent: transparent,
  11039. init: init,
  11040. push: push,
  11041. sort: sort
  11042. };
  11043. }
  11044. function WebGLRenderLists() {
  11045. var lists = {};
  11046. function get( scene, camera ) {
  11047. var hash = scene.id + ',' + camera.id;
  11048. var list = lists[ hash ];
  11049. if ( list === undefined ) {
  11050. // console.log( 'THREE.WebGLRenderLists:', hash );
  11051. list = new WebGLRenderList();
  11052. lists[ hash ] = list;
  11053. }
  11054. return list;
  11055. }
  11056. function dispose() {
  11057. lists = {};
  11058. }
  11059. return {
  11060. get: get,
  11061. dispose: dispose
  11062. };
  11063. }
  11064. /**
  11065. * @author mrdoob / http://mrdoob.com/
  11066. */
  11067. function UniformsCache() {
  11068. var lights = {};
  11069. return {
  11070. get: function ( light ) {
  11071. if ( lights[ light.id ] !== undefined ) {
  11072. return lights[ light.id ];
  11073. }
  11074. var uniforms;
  11075. switch ( light.type ) {
  11076. case 'DirectionalLight':
  11077. uniforms = {
  11078. direction: new Vector3(),
  11079. color: new Color(),
  11080. shadow: false,
  11081. shadowBias: 0,
  11082. shadowRadius: 1,
  11083. shadowMapSize: new Vector2()
  11084. };
  11085. break;
  11086. case 'SpotLight':
  11087. uniforms = {
  11088. position: new Vector3(),
  11089. direction: new Vector3(),
  11090. color: new Color(),
  11091. distance: 0,
  11092. coneCos: 0,
  11093. penumbraCos: 0,
  11094. decay: 0,
  11095. shadow: false,
  11096. shadowBias: 0,
  11097. shadowRadius: 1,
  11098. shadowMapSize: new Vector2()
  11099. };
  11100. break;
  11101. case 'PointLight':
  11102. uniforms = {
  11103. position: new Vector3(),
  11104. color: new Color(),
  11105. distance: 0,
  11106. decay: 0,
  11107. shadow: false,
  11108. shadowBias: 0,
  11109. shadowRadius: 1,
  11110. shadowMapSize: new Vector2(),
  11111. shadowCameraNear: 1,
  11112. shadowCameraFar: 1000
  11113. };
  11114. break;
  11115. case 'HemisphereLight':
  11116. uniforms = {
  11117. direction: new Vector3(),
  11118. skyColor: new Color(),
  11119. groundColor: new Color()
  11120. };
  11121. break;
  11122. case 'RectAreaLight':
  11123. uniforms = {
  11124. color: new Color(),
  11125. position: new Vector3(),
  11126. halfWidth: new Vector3(),
  11127. halfHeight: new Vector3()
  11128. // TODO (abelnation): set RectAreaLight shadow uniforms
  11129. };
  11130. break;
  11131. }
  11132. lights[ light.id ] = uniforms;
  11133. return uniforms;
  11134. }
  11135. };
  11136. }
  11137. var count = 0;
  11138. function WebGLLights() {
  11139. var cache = new UniformsCache();
  11140. var state = {
  11141. id: count ++,
  11142. hash: {
  11143. stateID: - 1,
  11144. directionalLength: - 1,
  11145. pointLength: - 1,
  11146. spotLength: - 1,
  11147. rectAreaLength: - 1,
  11148. hemiLength: - 1,
  11149. shadowsLength: - 1
  11150. },
  11151. ambient: [ 0, 0, 0 ],
  11152. directional: [],
  11153. directionalShadowMap: [],
  11154. directionalShadowMatrix: [],
  11155. spot: [],
  11156. spotShadowMap: [],
  11157. spotShadowMatrix: [],
  11158. rectArea: [],
  11159. point: [],
  11160. pointShadowMap: [],
  11161. pointShadowMatrix: [],
  11162. hemi: []
  11163. };
  11164. var vector3 = new Vector3();
  11165. var matrix4 = new Matrix4();
  11166. var matrix42 = new Matrix4();
  11167. function setup( lights, shadows, camera ) {
  11168. var r = 0, g = 0, b = 0;
  11169. var directionalLength = 0;
  11170. var pointLength = 0;
  11171. var spotLength = 0;
  11172. var rectAreaLength = 0;
  11173. var hemiLength = 0;
  11174. var viewMatrix = camera.matrixWorldInverse;
  11175. for ( var i = 0, l = lights.length; i < l; i ++ ) {
  11176. var light = lights[ i ];
  11177. var color = light.color;
  11178. var intensity = light.intensity;
  11179. var distance = light.distance;
  11180. var shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;
  11181. if ( light.isAmbientLight ) {
  11182. r += color.r * intensity;
  11183. g += color.g * intensity;
  11184. b += color.b * intensity;
  11185. } else if ( light.isDirectionalLight ) {
  11186. var uniforms = cache.get( light );
  11187. uniforms.color.copy( light.color ).multiplyScalar( light.intensity );
  11188. uniforms.direction.setFromMatrixPosition( light.matrixWorld );
  11189. vector3.setFromMatrixPosition( light.target.matrixWorld );
  11190. uniforms.direction.sub( vector3 );
  11191. uniforms.direction.transformDirection( viewMatrix );
  11192. uniforms.shadow = light.castShadow;
  11193. if ( light.castShadow ) {
  11194. var shadow = light.shadow;
  11195. uniforms.shadowBias = shadow.bias;
  11196. uniforms.shadowRadius = shadow.radius;
  11197. uniforms.shadowMapSize = shadow.mapSize;
  11198. }
  11199. state.directionalShadowMap[ directionalLength ] = shadowMap;
  11200. state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;
  11201. state.directional[ directionalLength ] = uniforms;
  11202. directionalLength ++;
  11203. } else if ( light.isSpotLight ) {
  11204. var uniforms = cache.get( light );
  11205. uniforms.position.setFromMatrixPosition( light.matrixWorld );
  11206. uniforms.position.applyMatrix4( viewMatrix );
  11207. uniforms.color.copy( color ).multiplyScalar( intensity );
  11208. uniforms.distance = distance;
  11209. uniforms.direction.setFromMatrixPosition( light.matrixWorld );
  11210. vector3.setFromMatrixPosition( light.target.matrixWorld );
  11211. uniforms.direction.sub( vector3 );
  11212. uniforms.direction.transformDirection( viewMatrix );
  11213. uniforms.coneCos = Math.cos( light.angle );
  11214. uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );
  11215. uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;
  11216. uniforms.shadow = light.castShadow;
  11217. if ( light.castShadow ) {
  11218. var shadow = light.shadow;
  11219. uniforms.shadowBias = shadow.bias;
  11220. uniforms.shadowRadius = shadow.radius;
  11221. uniforms.shadowMapSize = shadow.mapSize;
  11222. }
  11223. state.spotShadowMap[ spotLength ] = shadowMap;
  11224. state.spotShadowMatrix[ spotLength ] = light.shadow.matrix;
  11225. state.spot[ spotLength ] = uniforms;
  11226. spotLength ++;
  11227. } else if ( light.isRectAreaLight ) {
  11228. var uniforms = cache.get( light );
  11229. // (a) intensity is the total visible light emitted
  11230. //uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );
  11231. // (b) intensity is the brightness of the light
  11232. uniforms.color.copy( color ).multiplyScalar( intensity );
  11233. uniforms.position.setFromMatrixPosition( light.matrixWorld );
  11234. uniforms.position.applyMatrix4( viewMatrix );
  11235. // extract local rotation of light to derive width/height half vectors
  11236. matrix42.identity();
  11237. matrix4.copy( light.matrixWorld );
  11238. matrix4.premultiply( viewMatrix );
  11239. matrix42.extractRotation( matrix4 );
  11240. uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );
  11241. uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );
  11242. uniforms.halfWidth.applyMatrix4( matrix42 );
  11243. uniforms.halfHeight.applyMatrix4( matrix42 );
  11244. // TODO (abelnation): RectAreaLight distance?
  11245. // uniforms.distance = distance;
  11246. state.rectArea[ rectAreaLength ] = uniforms;
  11247. rectAreaLength ++;
  11248. } else if ( light.isPointLight ) {
  11249. var uniforms = cache.get( light );
  11250. uniforms.position.setFromMatrixPosition( light.matrixWorld );
  11251. uniforms.position.applyMatrix4( viewMatrix );
  11252. uniforms.color.copy( light.color ).multiplyScalar( light.intensity );
  11253. uniforms.distance = light.distance;
  11254. uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;
  11255. uniforms.shadow = light.castShadow;
  11256. if ( light.castShadow ) {
  11257. var shadow = light.shadow;
  11258. uniforms.shadowBias = shadow.bias;
  11259. uniforms.shadowRadius = shadow.radius;
  11260. uniforms.shadowMapSize = shadow.mapSize;
  11261. uniforms.shadowCameraNear = shadow.camera.near;
  11262. uniforms.shadowCameraFar = shadow.camera.far;
  11263. }
  11264. state.pointShadowMap[ pointLength ] = shadowMap;
  11265. state.pointShadowMatrix[ pointLength ] = light.shadow.matrix;
  11266. state.point[ pointLength ] = uniforms;
  11267. pointLength ++;
  11268. } else if ( light.isHemisphereLight ) {
  11269. var uniforms = cache.get( light );
  11270. uniforms.direction.setFromMatrixPosition( light.matrixWorld );
  11271. uniforms.direction.transformDirection( viewMatrix );
  11272. uniforms.direction.normalize();
  11273. uniforms.skyColor.copy( light.color ).multiplyScalar( intensity );
  11274. uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );
  11275. state.hemi[ hemiLength ] = uniforms;
  11276. hemiLength ++;
  11277. }
  11278. }
  11279. state.ambient[ 0 ] = r;
  11280. state.ambient[ 1 ] = g;
  11281. state.ambient[ 2 ] = b;
  11282. state.directional.length = directionalLength;
  11283. state.spot.length = spotLength;
  11284. state.rectArea.length = rectAreaLength;
  11285. state.point.length = pointLength;
  11286. state.hemi.length = hemiLength;
  11287. state.hash.stateID = state.id;
  11288. state.hash.directionalLength = directionalLength;
  11289. state.hash.pointLength = pointLength;
  11290. state.hash.spotLength = spotLength;
  11291. state.hash.rectAreaLength = rectAreaLength;
  11292. state.hash.hemiLength = hemiLength;
  11293. state.hash.shadowsLength = shadows.length;
  11294. }
  11295. return {
  11296. setup: setup,
  11297. state: state
  11298. };
  11299. }
  11300. /**
  11301. * @author Mugen87 / https://github.com/Mugen87
  11302. */
  11303. function WebGLRenderState() {
  11304. var lights = new WebGLLights();
  11305. var lightsArray = [];
  11306. var shadowsArray = [];
  11307. function init() {
  11308. lightsArray.length = 0;
  11309. shadowsArray.length = 0;
  11310. }
  11311. function pushLight( light ) {
  11312. lightsArray.push( light );
  11313. }
  11314. function pushShadow( shadowLight ) {
  11315. shadowsArray.push( shadowLight );
  11316. }
  11317. function setupLights( camera ) {
  11318. lights.setup( lightsArray, shadowsArray, camera );
  11319. }
  11320. var state = {
  11321. lightsArray: lightsArray,
  11322. shadowsArray: shadowsArray,
  11323. lights: lights
  11324. };
  11325. return {
  11326. init: init,
  11327. state: state,
  11328. setupLights: setupLights,
  11329. pushLight: pushLight,
  11330. pushShadow: pushShadow
  11331. };
  11332. }
  11333. function WebGLRenderStates() {
  11334. var renderStates = {};
  11335. function get( scene, camera ) {
  11336. var renderState;
  11337. if ( renderStates[ scene.id ] === undefined ) {
  11338. renderState = new WebGLRenderState();
  11339. renderStates[ scene.id ] = {};
  11340. renderStates[ scene.id ][ camera.id ] = renderState;
  11341. } else {
  11342. if ( renderStates[ scene.id ][ camera.id ] === undefined ) {
  11343. renderState = new WebGLRenderState();
  11344. renderStates[ scene.id ][ camera.id ] = renderState;
  11345. } else {
  11346. renderState = renderStates[ scene.id ][ camera.id ];
  11347. }
  11348. }
  11349. return renderState;
  11350. }
  11351. function dispose() {
  11352. renderStates = {};
  11353. }
  11354. return {
  11355. get: get,
  11356. dispose: dispose
  11357. };
  11358. }
  11359. /**
  11360. * @author mrdoob / http://mrdoob.com/
  11361. * @author alteredq / http://alteredqualia.com/
  11362. * @author bhouston / https://clara.io
  11363. * @author WestLangley / http://github.com/WestLangley
  11364. *
  11365. * parameters = {
  11366. *
  11367. * opacity: <float>,
  11368. *
  11369. * map: new THREE.Texture( <Image> ),
  11370. *
  11371. * alphaMap: new THREE.Texture( <Image> ),
  11372. *
  11373. * displacementMap: new THREE.Texture( <Image> ),
  11374. * displacementScale: <float>,
  11375. * displacementBias: <float>,
  11376. *
  11377. * wireframe: <boolean>,
  11378. * wireframeLinewidth: <float>
  11379. * }
  11380. */
  11381. function MeshDepthMaterial( parameters ) {
  11382. Material.call( this );
  11383. this.type = 'MeshDepthMaterial';
  11384. this.depthPacking = BasicDepthPacking;
  11385. this.skinning = false;
  11386. this.morphTargets = false;
  11387. this.map = null;
  11388. this.alphaMap = null;
  11389. this.displacementMap = null;
  11390. this.displacementScale = 1;
  11391. this.displacementBias = 0;
  11392. this.wireframe = false;
  11393. this.wireframeLinewidth = 1;
  11394. this.fog = false;
  11395. this.lights = false;
  11396. this.setValues( parameters );
  11397. }
  11398. MeshDepthMaterial.prototype = Object.create( Material.prototype );
  11399. MeshDepthMaterial.prototype.constructor = MeshDepthMaterial;
  11400. MeshDepthMaterial.prototype.isMeshDepthMaterial = true;
  11401. MeshDepthMaterial.prototype.copy = function ( source ) {
  11402. Material.prototype.copy.call( this, source );
  11403. this.depthPacking = source.depthPacking;
  11404. this.skinning = source.skinning;
  11405. this.morphTargets = source.morphTargets;
  11406. this.map = source.map;
  11407. this.alphaMap = source.alphaMap;
  11408. this.displacementMap = source.displacementMap;
  11409. this.displacementScale = source.displacementScale;
  11410. this.displacementBias = source.displacementBias;
  11411. this.wireframe = source.wireframe;
  11412. this.wireframeLinewidth = source.wireframeLinewidth;
  11413. return this;
  11414. };
  11415. /**
  11416. * @author WestLangley / http://github.com/WestLangley
  11417. *
  11418. * parameters = {
  11419. *
  11420. * referencePosition: <float>,
  11421. * nearDistance: <float>,
  11422. * farDistance: <float>,
  11423. *
  11424. * skinning: <bool>,
  11425. * morphTargets: <bool>,
  11426. *
  11427. * map: new THREE.Texture( <Image> ),
  11428. *
  11429. * alphaMap: new THREE.Texture( <Image> ),
  11430. *
  11431. * displacementMap: new THREE.Texture( <Image> ),
  11432. * displacementScale: <float>,
  11433. * displacementBias: <float>
  11434. *
  11435. * }
  11436. */
  11437. function MeshDistanceMaterial( parameters ) {
  11438. Material.call( this );
  11439. this.type = 'MeshDistanceMaterial';
  11440. this.referencePosition = new Vector3();
  11441. this.nearDistance = 1;
  11442. this.farDistance = 1000;
  11443. this.skinning = false;
  11444. this.morphTargets = false;
  11445. this.map = null;
  11446. this.alphaMap = null;
  11447. this.displacementMap = null;
  11448. this.displacementScale = 1;
  11449. this.displacementBias = 0;
  11450. this.fog = false;
  11451. this.lights = false;
  11452. this.setValues( parameters );
  11453. }
  11454. MeshDistanceMaterial.prototype = Object.create( Material.prototype );
  11455. MeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial;
  11456. MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;
  11457. MeshDistanceMaterial.prototype.copy = function ( source ) {
  11458. Material.prototype.copy.call( this, source );
  11459. this.referencePosition.copy( source.referencePosition );
  11460. this.nearDistance = source.nearDistance;
  11461. this.farDistance = source.farDistance;
  11462. this.skinning = source.skinning;
  11463. this.morphTargets = source.morphTargets;
  11464. this.map = source.map;
  11465. this.alphaMap = source.alphaMap;
  11466. this.displacementMap = source.displacementMap;
  11467. this.displacementScale = source.displacementScale;
  11468. this.displacementBias = source.displacementBias;
  11469. return this;
  11470. };
  11471. /**
  11472. * @author alteredq / http://alteredqualia.com/
  11473. * @author mrdoob / http://mrdoob.com/
  11474. */
  11475. function WebGLShadowMap( _renderer, _objects, maxTextureSize ) {
  11476. var _frustum = new Frustum(),
  11477. _projScreenMatrix = new Matrix4(),
  11478. _shadowMapSize = new Vector2(),
  11479. _maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ),
  11480. _lookTarget = new Vector3(),
  11481. _lightPositionWorld = new Vector3(),
  11482. _MorphingFlag = 1,
  11483. _SkinningFlag = 2,
  11484. _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,
  11485. _depthMaterials = new Array( _NumberOfMaterialVariants ),
  11486. _distanceMaterials = new Array( _NumberOfMaterialVariants ),
  11487. _materialCache = {};
  11488. var shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };
  11489. var cubeDirections = [
  11490. new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),
  11491. new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )
  11492. ];
  11493. var cubeUps = [
  11494. new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),
  11495. new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 )
  11496. ];
  11497. var cube2DViewPorts = [
  11498. new Vector4(), new Vector4(), new Vector4(),
  11499. new Vector4(), new Vector4(), new Vector4()
  11500. ];
  11501. // init
  11502. for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {
  11503. var useMorphing = ( i & _MorphingFlag ) !== 0;
  11504. var useSkinning = ( i & _SkinningFlag ) !== 0;
  11505. var depthMaterial = new MeshDepthMaterial( {
  11506. depthPacking: RGBADepthPacking,
  11507. morphTargets: useMorphing,
  11508. skinning: useSkinning
  11509. } );
  11510. _depthMaterials[ i ] = depthMaterial;
  11511. //
  11512. var distanceMaterial = new MeshDistanceMaterial( {
  11513. morphTargets: useMorphing,
  11514. skinning: useSkinning
  11515. } );
  11516. _distanceMaterials[ i ] = distanceMaterial;
  11517. }
  11518. //
  11519. var scope = this;
  11520. this.enabled = false;
  11521. this.autoUpdate = true;
  11522. this.needsUpdate = false;
  11523. this.type = PCFShadowMap;
  11524. this.render = function ( lights, scene, camera ) {
  11525. if ( scope.enabled === false ) return;
  11526. if ( scope.autoUpdate === false && scope.needsUpdate === false ) return;
  11527. if ( lights.length === 0 ) return;
  11528. // TODO Clean up (needed in case of contextlost)
  11529. var _gl = _renderer.context;
  11530. var _state = _renderer.state;
  11531. // Set GL state for depth map.
  11532. _state.disable( _gl.BLEND );
  11533. _state.buffers.color.setClear( 1, 1, 1, 1 );
  11534. _state.buffers.depth.setTest( true );
  11535. _state.setScissorTest( false );
  11536. // render depth map
  11537. var faceCount;
  11538. for ( var i = 0, il = lights.length; i < il; i ++ ) {
  11539. var light = lights[ i ];
  11540. var shadow = light.shadow;
  11541. var isPointLight = light && light.isPointLight;
  11542. if ( shadow === undefined ) {
  11543. console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );
  11544. continue;
  11545. }
  11546. var shadowCamera = shadow.camera;
  11547. _shadowMapSize.copy( shadow.mapSize );
  11548. _shadowMapSize.min( _maxShadowMapSize );
  11549. if ( isPointLight ) {
  11550. var vpWidth = _shadowMapSize.x;
  11551. var vpHeight = _shadowMapSize.y;
  11552. // These viewports map a cube-map onto a 2D texture with the
  11553. // following orientation:
  11554. //
  11555. // xzXZ
  11556. // y Y
  11557. //
  11558. // X - Positive x direction
  11559. // x - Negative x direction
  11560. // Y - Positive y direction
  11561. // y - Negative y direction
  11562. // Z - Positive z direction
  11563. // z - Negative z direction
  11564. // positive X
  11565. cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );
  11566. // negative X
  11567. cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );
  11568. // positive Z
  11569. cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );
  11570. // negative Z
  11571. cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );
  11572. // positive Y
  11573. cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );
  11574. // negative Y
  11575. cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );
  11576. _shadowMapSize.x *= 4.0;
  11577. _shadowMapSize.y *= 2.0;
  11578. }
  11579. if ( shadow.map === null ) {
  11580. var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };
  11581. shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );
  11582. shadow.map.texture.name = light.name + ".shadowMap";
  11583. shadowCamera.updateProjectionMatrix();
  11584. }
  11585. if ( shadow.isSpotLightShadow ) {
  11586. shadow.update( light );
  11587. }
  11588. var shadowMap = shadow.map;
  11589. var shadowMatrix = shadow.matrix;
  11590. _lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
  11591. shadowCamera.position.copy( _lightPositionWorld );
  11592. if ( isPointLight ) {
  11593. faceCount = 6;
  11594. // for point lights we set the shadow matrix to be a translation-only matrix
  11595. // equal to inverse of the light's position
  11596. shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );
  11597. } else {
  11598. faceCount = 1;
  11599. _lookTarget.setFromMatrixPosition( light.target.matrixWorld );
  11600. shadowCamera.lookAt( _lookTarget );
  11601. shadowCamera.updateMatrixWorld();
  11602. // compute shadow matrix
  11603. shadowMatrix.set(
  11604. 0.5, 0.0, 0.0, 0.5,
  11605. 0.0, 0.5, 0.0, 0.5,
  11606. 0.0, 0.0, 0.5, 0.5,
  11607. 0.0, 0.0, 0.0, 1.0
  11608. );
  11609. shadowMatrix.multiply( shadowCamera.projectionMatrix );
  11610. shadowMatrix.multiply( shadowCamera.matrixWorldInverse );
  11611. }
  11612. _renderer.setRenderTarget( shadowMap );
  11613. _renderer.clear();
  11614. // render shadow map for each cube face (if omni-directional) or
  11615. // run a single pass if not
  11616. for ( var face = 0; face < faceCount; face ++ ) {
  11617. if ( isPointLight ) {
  11618. _lookTarget.copy( shadowCamera.position );
  11619. _lookTarget.add( cubeDirections[ face ] );
  11620. shadowCamera.up.copy( cubeUps[ face ] );
  11621. shadowCamera.lookAt( _lookTarget );
  11622. shadowCamera.updateMatrixWorld();
  11623. var vpDimensions = cube2DViewPorts[ face ];
  11624. _state.viewport( vpDimensions );
  11625. }
  11626. // update camera matrices and frustum
  11627. _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
  11628. _frustum.setFromMatrix( _projScreenMatrix );
  11629. // set object matrices & frustum culling
  11630. renderObject( scene, camera, shadowCamera, isPointLight );
  11631. }
  11632. }
  11633. scope.needsUpdate = false;
  11634. };
  11635. function getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) {
  11636. var geometry = object.geometry;
  11637. var result = null;
  11638. var materialVariants = _depthMaterials;
  11639. var customMaterial = object.customDepthMaterial;
  11640. if ( isPointLight ) {
  11641. materialVariants = _distanceMaterials;
  11642. customMaterial = object.customDistanceMaterial;
  11643. }
  11644. if ( ! customMaterial ) {
  11645. var useMorphing = false;
  11646. if ( material.morphTargets ) {
  11647. if ( geometry && geometry.isBufferGeometry ) {
  11648. useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;
  11649. } else if ( geometry && geometry.isGeometry ) {
  11650. useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;
  11651. }
  11652. }
  11653. if ( object.isSkinnedMesh && material.skinning === false ) {
  11654. console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object );
  11655. }
  11656. var useSkinning = object.isSkinnedMesh && material.skinning;
  11657. var variantIndex = 0;
  11658. if ( useMorphing ) variantIndex |= _MorphingFlag;
  11659. if ( useSkinning ) variantIndex |= _SkinningFlag;
  11660. result = materialVariants[ variantIndex ];
  11661. } else {
  11662. result = customMaterial;
  11663. }
  11664. if ( _renderer.localClippingEnabled &&
  11665. material.clipShadows === true &&
  11666. material.clippingPlanes.length !== 0 ) {
  11667. // in this case we need a unique material instance reflecting the
  11668. // appropriate state
  11669. var keyA = result.uuid, keyB = material.uuid;
  11670. var materialsForVariant = _materialCache[ keyA ];
  11671. if ( materialsForVariant === undefined ) {
  11672. materialsForVariant = {};
  11673. _materialCache[ keyA ] = materialsForVariant;
  11674. }
  11675. var cachedMaterial = materialsForVariant[ keyB ];
  11676. if ( cachedMaterial === undefined ) {
  11677. cachedMaterial = result.clone();
  11678. materialsForVariant[ keyB ] = cachedMaterial;
  11679. }
  11680. result = cachedMaterial;
  11681. }
  11682. result.visible = material.visible;
  11683. result.wireframe = material.wireframe;
  11684. result.side = ( material.shadowSide != null ) ? material.shadowSide : shadowSide[ material.side ];
  11685. result.clipShadows = material.clipShadows;
  11686. result.clippingPlanes = material.clippingPlanes;
  11687. result.clipIntersection = material.clipIntersection;
  11688. result.wireframeLinewidth = material.wireframeLinewidth;
  11689. result.linewidth = material.linewidth;
  11690. if ( isPointLight && result.isMeshDistanceMaterial ) {
  11691. result.referencePosition.copy( lightPositionWorld );
  11692. result.nearDistance = shadowCameraNear;
  11693. result.farDistance = shadowCameraFar;
  11694. }
  11695. return result;
  11696. }
  11697. function renderObject( object, camera, shadowCamera, isPointLight ) {
  11698. if ( object.visible === false ) return;
  11699. var visible = object.layers.test( camera.layers );
  11700. if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {
  11701. if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {
  11702. object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );
  11703. var geometry = _objects.update( object );
  11704. var material = object.material;
  11705. if ( Array.isArray( material ) ) {
  11706. var groups = geometry.groups;
  11707. for ( var k = 0, kl = groups.length; k < kl; k ++ ) {
  11708. var group = groups[ k ];
  11709. var groupMaterial = material[ group.materialIndex ];
  11710. if ( groupMaterial && groupMaterial.visible ) {
  11711. var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );
  11712. _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );
  11713. }
  11714. }
  11715. } else if ( material.visible ) {
  11716. var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );
  11717. _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );
  11718. }
  11719. }
  11720. }
  11721. var children = object.children;
  11722. for ( var i = 0, l = children.length; i < l; i ++ ) {
  11723. renderObject( children[ i ], camera, shadowCamera, isPointLight );
  11724. }
  11725. }
  11726. }
  11727. /**
  11728. * @author mrdoob / http://mrdoob.com/
  11729. */
  11730. function WebGLState( gl, extensions, utils, capabilities ) {
  11731. function ColorBuffer() {
  11732. var locked = false;
  11733. var color = new Vector4();
  11734. var currentColorMask = null;
  11735. var currentColorClear = new Vector4( 0, 0, 0, 0 );
  11736. return {
  11737. setMask: function ( colorMask ) {
  11738. if ( currentColorMask !== colorMask && ! locked ) {
  11739. gl.colorMask( colorMask, colorMask, colorMask, colorMask );
  11740. currentColorMask = colorMask;
  11741. }
  11742. },
  11743. setLocked: function ( lock ) {
  11744. locked = lock;
  11745. },
  11746. setClear: function ( r, g, b, a, premultipliedAlpha ) {
  11747. if ( premultipliedAlpha === true ) {
  11748. r *= a; g *= a; b *= a;
  11749. }
  11750. color.set( r, g, b, a );
  11751. if ( currentColorClear.equals( color ) === false ) {
  11752. gl.clearColor( r, g, b, a );
  11753. currentColorClear.copy( color );
  11754. }
  11755. },
  11756. reset: function () {
  11757. locked = false;
  11758. currentColorMask = null;
  11759. currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state
  11760. }
  11761. };
  11762. }
  11763. function DepthBuffer() {
  11764. var locked = false;
  11765. var currentDepthMask = null;
  11766. var currentDepthFunc = null;
  11767. var currentDepthClear = null;
  11768. return {
  11769. setTest: function ( depthTest ) {
  11770. if ( depthTest ) {
  11771. enable( gl.DEPTH_TEST );
  11772. } else {
  11773. disable( gl.DEPTH_TEST );
  11774. }
  11775. },
  11776. setMask: function ( depthMask ) {
  11777. if ( currentDepthMask !== depthMask && ! locked ) {
  11778. gl.depthMask( depthMask );
  11779. currentDepthMask = depthMask;
  11780. }
  11781. },
  11782. setFunc: function ( depthFunc ) {
  11783. if ( currentDepthFunc !== depthFunc ) {
  11784. if ( depthFunc ) {
  11785. switch ( depthFunc ) {
  11786. case NeverDepth:
  11787. gl.depthFunc( gl.NEVER );
  11788. break;
  11789. case AlwaysDepth:
  11790. gl.depthFunc( gl.ALWAYS );
  11791. break;
  11792. case LessDepth:
  11793. gl.depthFunc( gl.LESS );
  11794. break;
  11795. case LessEqualDepth:
  11796. gl.depthFunc( gl.LEQUAL );
  11797. break;
  11798. case EqualDepth:
  11799. gl.depthFunc( gl.EQUAL );
  11800. break;
  11801. case GreaterEqualDepth:
  11802. gl.depthFunc( gl.GEQUAL );
  11803. break;
  11804. case GreaterDepth:
  11805. gl.depthFunc( gl.GREATER );
  11806. break;
  11807. case NotEqualDepth:
  11808. gl.depthFunc( gl.NOTEQUAL );
  11809. break;
  11810. default:
  11811. gl.depthFunc( gl.LEQUAL );
  11812. }
  11813. } else {
  11814. gl.depthFunc( gl.LEQUAL );
  11815. }
  11816. currentDepthFunc = depthFunc;
  11817. }
  11818. },
  11819. setLocked: function ( lock ) {
  11820. locked = lock;
  11821. },
  11822. setClear: function ( depth ) {
  11823. if ( currentDepthClear !== depth ) {
  11824. gl.clearDepth( depth );
  11825. currentDepthClear = depth;
  11826. }
  11827. },
  11828. reset: function () {
  11829. locked = false;
  11830. currentDepthMask = null;
  11831. currentDepthFunc = null;
  11832. currentDepthClear = null;
  11833. }
  11834. };
  11835. }
  11836. function StencilBuffer() {
  11837. var locked = false;
  11838. var currentStencilMask = null;
  11839. var currentStencilFunc = null;
  11840. var currentStencilRef = null;
  11841. var currentStencilFuncMask = null;
  11842. var currentStencilFail = null;
  11843. var currentStencilZFail = null;
  11844. var currentStencilZPass = null;
  11845. var currentStencilClear = null;
  11846. return {
  11847. setTest: function ( stencilTest ) {
  11848. if ( stencilTest ) {
  11849. enable( gl.STENCIL_TEST );
  11850. } else {
  11851. disable( gl.STENCIL_TEST );
  11852. }
  11853. },
  11854. setMask: function ( stencilMask ) {
  11855. if ( currentStencilMask !== stencilMask && ! locked ) {
  11856. gl.stencilMask( stencilMask );
  11857. currentStencilMask = stencilMask;
  11858. }
  11859. },
  11860. setFunc: function ( stencilFunc, stencilRef, stencilMask ) {
  11861. if ( currentStencilFunc !== stencilFunc ||
  11862. currentStencilRef !== stencilRef ||
  11863. currentStencilFuncMask !== stencilMask ) {
  11864. gl.stencilFunc( stencilFunc, stencilRef, stencilMask );
  11865. currentStencilFunc = stencilFunc;
  11866. currentStencilRef = stencilRef;
  11867. currentStencilFuncMask = stencilMask;
  11868. }
  11869. },
  11870. setOp: function ( stencilFail, stencilZFail, stencilZPass ) {
  11871. if ( currentStencilFail !== stencilFail ||
  11872. currentStencilZFail !== stencilZFail ||
  11873. currentStencilZPass !== stencilZPass ) {
  11874. gl.stencilOp( stencilFail, stencilZFail, stencilZPass );
  11875. currentStencilFail = stencilFail;
  11876. currentStencilZFail = stencilZFail;
  11877. currentStencilZPass = stencilZPass;
  11878. }
  11879. },
  11880. setLocked: function ( lock ) {
  11881. locked = lock;
  11882. },
  11883. setClear: function ( stencil ) {
  11884. if ( currentStencilClear !== stencil ) {
  11885. gl.clearStencil( stencil );
  11886. currentStencilClear = stencil;
  11887. }
  11888. },
  11889. reset: function () {
  11890. locked = false;
  11891. currentStencilMask = null;
  11892. currentStencilFunc = null;
  11893. currentStencilRef = null;
  11894. currentStencilFuncMask = null;
  11895. currentStencilFail = null;
  11896. currentStencilZFail = null;
  11897. currentStencilZPass = null;
  11898. currentStencilClear = null;
  11899. }
  11900. };
  11901. }
  11902. //
  11903. var colorBuffer = new ColorBuffer();
  11904. var depthBuffer = new DepthBuffer();
  11905. var stencilBuffer = new StencilBuffer();
  11906. var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
  11907. var newAttributes = new Uint8Array( maxVertexAttributes );
  11908. var enabledAttributes = new Uint8Array( maxVertexAttributes );
  11909. var attributeDivisors = new Uint8Array( maxVertexAttributes );
  11910. var enabledCapabilities = {};
  11911. var compressedTextureFormats = null;
  11912. var currentProgram = null;
  11913. var currentBlending = null;
  11914. var currentBlendEquation = null;
  11915. var currentBlendSrc = null;
  11916. var currentBlendDst = null;
  11917. var currentBlendEquationAlpha = null;
  11918. var currentBlendSrcAlpha = null;
  11919. var currentBlendDstAlpha = null;
  11920. var currentPremultipledAlpha = false;
  11921. var currentFlipSided = null;
  11922. var currentCullFace = null;
  11923. var currentLineWidth = null;
  11924. var currentPolygonOffsetFactor = null;
  11925. var currentPolygonOffsetUnits = null;
  11926. var maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );
  11927. var lineWidthAvailable = false;
  11928. var version = 0;
  11929. var glVersion = gl.getParameter( gl.VERSION );
  11930. if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {
  11931. version = parseFloat( /^WebGL\ ([0-9])/.exec( glVersion )[ 1 ] );
  11932. lineWidthAvailable = ( version >= 1.0 );
  11933. } else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {
  11934. version = parseFloat( /^OpenGL\ ES\ ([0-9])/.exec( glVersion )[ 1 ] );
  11935. lineWidthAvailable = ( version >= 2.0 );
  11936. }
  11937. var currentTextureSlot = null;
  11938. var currentBoundTextures = {};
  11939. var currentScissor = new Vector4();
  11940. var currentViewport = new Vector4();
  11941. function createTexture( type, target, count ) {
  11942. var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.
  11943. var texture = gl.createTexture();
  11944. gl.bindTexture( type, texture );
  11945. gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
  11946. gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );
  11947. for ( var i = 0; i < count; i ++ ) {
  11948. gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );
  11949. }
  11950. return texture;
  11951. }
  11952. var emptyTextures = {};
  11953. emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );
  11954. emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );
  11955. // init
  11956. colorBuffer.setClear( 0, 0, 0, 1 );
  11957. depthBuffer.setClear( 1 );
  11958. stencilBuffer.setClear( 0 );
  11959. enable( gl.DEPTH_TEST );
  11960. depthBuffer.setFunc( LessEqualDepth );
  11961. setFlipSided( false );
  11962. setCullFace( CullFaceBack );
  11963. enable( gl.CULL_FACE );
  11964. enable( gl.BLEND );
  11965. setBlending( NormalBlending );
  11966. //
  11967. function initAttributes() {
  11968. for ( var i = 0, l = newAttributes.length; i < l; i ++ ) {
  11969. newAttributes[ i ] = 0;
  11970. }
  11971. }
  11972. function enableAttribute( attribute ) {
  11973. enableAttributeAndDivisor( attribute, 0 );
  11974. }
  11975. function enableAttributeAndDivisor( attribute, meshPerAttribute ) {
  11976. newAttributes[ attribute ] = 1;
  11977. if ( enabledAttributes[ attribute ] === 0 ) {
  11978. gl.enableVertexAttribArray( attribute );
  11979. enabledAttributes[ attribute ] = 1;
  11980. }
  11981. if ( attributeDivisors[ attribute ] !== meshPerAttribute ) {
  11982. var extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );
  11983. extension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );
  11984. attributeDivisors[ attribute ] = meshPerAttribute;
  11985. }
  11986. }
  11987. function disableUnusedAttributes() {
  11988. for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {
  11989. if ( enabledAttributes[ i ] !== newAttributes[ i ] ) {
  11990. gl.disableVertexAttribArray( i );
  11991. enabledAttributes[ i ] = 0;
  11992. }
  11993. }
  11994. }
  11995. function enable( id ) {
  11996. if ( enabledCapabilities[ id ] !== true ) {
  11997. gl.enable( id );
  11998. enabledCapabilities[ id ] = true;
  11999. }
  12000. }
  12001. function disable( id ) {
  12002. if ( enabledCapabilities[ id ] !== false ) {
  12003. gl.disable( id );
  12004. enabledCapabilities[ id ] = false;
  12005. }
  12006. }
  12007. function getCompressedTextureFormats() {
  12008. if ( compressedTextureFormats === null ) {
  12009. compressedTextureFormats = [];
  12010. if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||
  12011. extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||
  12012. extensions.get( 'WEBGL_compressed_texture_etc1' ) ||
  12013. extensions.get( 'WEBGL_compressed_texture_astc' ) ) {
  12014. var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );
  12015. for ( var i = 0; i < formats.length; i ++ ) {
  12016. compressedTextureFormats.push( formats[ i ] );
  12017. }
  12018. }
  12019. }
  12020. return compressedTextureFormats;
  12021. }
  12022. function useProgram( program ) {
  12023. if ( currentProgram !== program ) {
  12024. gl.useProgram( program );
  12025. currentProgram = program;
  12026. return true;
  12027. }
  12028. return false;
  12029. }
  12030. function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {
  12031. if ( blending !== NoBlending ) {
  12032. enable( gl.BLEND );
  12033. } else {
  12034. disable( gl.BLEND );
  12035. }
  12036. if ( blending !== CustomBlending ) {
  12037. if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {
  12038. switch ( blending ) {
  12039. case AdditiveBlending:
  12040. if ( premultipliedAlpha ) {
  12041. gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
  12042. gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );
  12043. } else {
  12044. gl.blendEquation( gl.FUNC_ADD );
  12045. gl.blendFunc( gl.SRC_ALPHA, gl.ONE );
  12046. }
  12047. break;
  12048. case SubtractiveBlending:
  12049. if ( premultipliedAlpha ) {
  12050. gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
  12051. gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );
  12052. } else {
  12053. gl.blendEquation( gl.FUNC_ADD );
  12054. gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );
  12055. }
  12056. break;
  12057. case MultiplyBlending:
  12058. if ( premultipliedAlpha ) {
  12059. gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
  12060. gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );
  12061. } else {
  12062. gl.blendEquation( gl.FUNC_ADD );
  12063. gl.blendFunc( gl.ZERO, gl.SRC_COLOR );
  12064. }
  12065. break;
  12066. default:
  12067. if ( premultipliedAlpha ) {
  12068. gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
  12069. gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );
  12070. } else {
  12071. gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
  12072. gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );
  12073. }
  12074. }
  12075. }
  12076. currentBlendEquation = null;
  12077. currentBlendSrc = null;
  12078. currentBlendDst = null;
  12079. currentBlendEquationAlpha = null;
  12080. currentBlendSrcAlpha = null;
  12081. currentBlendDstAlpha = null;
  12082. } else {
  12083. blendEquationAlpha = blendEquationAlpha || blendEquation;
  12084. blendSrcAlpha = blendSrcAlpha || blendSrc;
  12085. blendDstAlpha = blendDstAlpha || blendDst;
  12086. if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {
  12087. gl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) );
  12088. currentBlendEquation = blendEquation;
  12089. currentBlendEquationAlpha = blendEquationAlpha;
  12090. }
  12091. if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {
  12092. gl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) );
  12093. currentBlendSrc = blendSrc;
  12094. currentBlendDst = blendDst;
  12095. currentBlendSrcAlpha = blendSrcAlpha;
  12096. currentBlendDstAlpha = blendDstAlpha;
  12097. }
  12098. }
  12099. currentBlending = blending;
  12100. currentPremultipledAlpha = premultipliedAlpha;
  12101. }
  12102. function setMaterial( material, frontFaceCW ) {
  12103. material.side === DoubleSide
  12104. ? disable( gl.CULL_FACE )
  12105. : enable( gl.CULL_FACE );
  12106. var flipSided = ( material.side === BackSide );
  12107. if ( frontFaceCW ) flipSided = ! flipSided;
  12108. setFlipSided( flipSided );
  12109. ( material.blending === NormalBlending && material.transparent === false )
  12110. ? setBlending( NoBlending )
  12111. : setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );
  12112. depthBuffer.setFunc( material.depthFunc );
  12113. depthBuffer.setTest( material.depthTest );
  12114. depthBuffer.setMask( material.depthWrite );
  12115. colorBuffer.setMask( material.colorWrite );
  12116. setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
  12117. }
  12118. //
  12119. function setFlipSided( flipSided ) {
  12120. if ( currentFlipSided !== flipSided ) {
  12121. if ( flipSided ) {
  12122. gl.frontFace( gl.CW );
  12123. } else {
  12124. gl.frontFace( gl.CCW );
  12125. }
  12126. currentFlipSided = flipSided;
  12127. }
  12128. }
  12129. function setCullFace( cullFace ) {
  12130. if ( cullFace !== CullFaceNone ) {
  12131. enable( gl.CULL_FACE );
  12132. if ( cullFace !== currentCullFace ) {
  12133. if ( cullFace === CullFaceBack ) {
  12134. gl.cullFace( gl.BACK );
  12135. } else if ( cullFace === CullFaceFront ) {
  12136. gl.cullFace( gl.FRONT );
  12137. } else {
  12138. gl.cullFace( gl.FRONT_AND_BACK );
  12139. }
  12140. }
  12141. } else {
  12142. disable( gl.CULL_FACE );
  12143. }
  12144. currentCullFace = cullFace;
  12145. }
  12146. function setLineWidth( width ) {
  12147. if ( width !== currentLineWidth ) {
  12148. if ( lineWidthAvailable ) gl.lineWidth( width );
  12149. currentLineWidth = width;
  12150. }
  12151. }
  12152. function setPolygonOffset( polygonOffset, factor, units ) {
  12153. if ( polygonOffset ) {
  12154. enable( gl.POLYGON_OFFSET_FILL );
  12155. if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {
  12156. gl.polygonOffset( factor, units );
  12157. currentPolygonOffsetFactor = factor;
  12158. currentPolygonOffsetUnits = units;
  12159. }
  12160. } else {
  12161. disable( gl.POLYGON_OFFSET_FILL );
  12162. }
  12163. }
  12164. function setScissorTest( scissorTest ) {
  12165. if ( scissorTest ) {
  12166. enable( gl.SCISSOR_TEST );
  12167. } else {
  12168. disable( gl.SCISSOR_TEST );
  12169. }
  12170. }
  12171. // texture
  12172. function activeTexture( webglSlot ) {
  12173. if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;
  12174. if ( currentTextureSlot !== webglSlot ) {
  12175. gl.activeTexture( webglSlot );
  12176. currentTextureSlot = webglSlot;
  12177. }
  12178. }
  12179. function bindTexture( webglType, webglTexture ) {
  12180. if ( currentTextureSlot === null ) {
  12181. activeTexture();
  12182. }
  12183. var boundTexture = currentBoundTextures[ currentTextureSlot ];
  12184. if ( boundTexture === undefined ) {
  12185. boundTexture = { type: undefined, texture: undefined };
  12186. currentBoundTextures[ currentTextureSlot ] = boundTexture;
  12187. }
  12188. if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {
  12189. gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );
  12190. boundTexture.type = webglType;
  12191. boundTexture.texture = webglTexture;
  12192. }
  12193. }
  12194. function compressedTexImage2D() {
  12195. try {
  12196. gl.compressedTexImage2D.apply( gl, arguments );
  12197. } catch ( error ) {
  12198. console.error( 'THREE.WebGLState:', error );
  12199. }
  12200. }
  12201. function texImage2D() {
  12202. try {
  12203. gl.texImage2D.apply( gl, arguments );
  12204. } catch ( error ) {
  12205. console.error( 'THREE.WebGLState:', error );
  12206. }
  12207. }
  12208. //
  12209. function scissor( scissor ) {
  12210. if ( currentScissor.equals( scissor ) === false ) {
  12211. gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );
  12212. currentScissor.copy( scissor );
  12213. }
  12214. }
  12215. function viewport( viewport ) {
  12216. if ( currentViewport.equals( viewport ) === false ) {
  12217. gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );
  12218. currentViewport.copy( viewport );
  12219. }
  12220. }
  12221. //
  12222. function reset() {
  12223. for ( var i = 0; i < enabledAttributes.length; i ++ ) {
  12224. if ( enabledAttributes[ i ] === 1 ) {
  12225. gl.disableVertexAttribArray( i );
  12226. enabledAttributes[ i ] = 0;
  12227. }
  12228. }
  12229. enabledCapabilities = {};
  12230. compressedTextureFormats = null;
  12231. currentTextureSlot = null;
  12232. currentBoundTextures = {};
  12233. currentProgram = null;
  12234. currentBlending = null;
  12235. currentFlipSided = null;
  12236. currentCullFace = null;
  12237. colorBuffer.reset();
  12238. depthBuffer.reset();
  12239. stencilBuffer.reset();
  12240. }
  12241. return {
  12242. buffers: {
  12243. color: colorBuffer,
  12244. depth: depthBuffer,
  12245. stencil: stencilBuffer
  12246. },
  12247. initAttributes: initAttributes,
  12248. enableAttribute: enableAttribute,
  12249. enableAttributeAndDivisor: enableAttributeAndDivisor,
  12250. disableUnusedAttributes: disableUnusedAttributes,
  12251. enable: enable,
  12252. disable: disable,
  12253. getCompressedTextureFormats: getCompressedTextureFormats,
  12254. useProgram: useProgram,
  12255. setBlending: setBlending,
  12256. setMaterial: setMaterial,
  12257. setFlipSided: setFlipSided,
  12258. setCullFace: setCullFace,
  12259. setLineWidth: setLineWidth,
  12260. setPolygonOffset: setPolygonOffset,
  12261. setScissorTest: setScissorTest,
  12262. activeTexture: activeTexture,
  12263. bindTexture: bindTexture,
  12264. compressedTexImage2D: compressedTexImage2D,
  12265. texImage2D: texImage2D,
  12266. scissor: scissor,
  12267. viewport: viewport,
  12268. reset: reset
  12269. };
  12270. }
  12271. /**
  12272. * @author mrdoob / http://mrdoob.com/
  12273. */
  12274. function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {
  12275. var _videoTextures = {};
  12276. var _canvas;
  12277. //
  12278. function clampToMaxSize( image, maxSize ) {
  12279. if ( image.width > maxSize || image.height > maxSize ) {
  12280. if ( 'data' in image ) {
  12281. console.warn( 'THREE.WebGLRenderer: image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );
  12282. return;
  12283. }
  12284. // Warning: Scaling through the canvas will only work with images that use
  12285. // premultiplied alpha.
  12286. var scale = maxSize / Math.max( image.width, image.height );
  12287. var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
  12288. canvas.width = Math.floor( image.width * scale );
  12289. canvas.height = Math.floor( image.height * scale );
  12290. var context = canvas.getContext( '2d' );
  12291. context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );
  12292. console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height );
  12293. return canvas;
  12294. }
  12295. return image;
  12296. }
  12297. function isPowerOfTwo( image ) {
  12298. return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );
  12299. }
  12300. function makePowerOfTwo( image ) {
  12301. if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof ImageBitmap ) {
  12302. if ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
  12303. _canvas.width = _Math.floorPowerOfTwo( image.width );
  12304. _canvas.height = _Math.floorPowerOfTwo( image.height );
  12305. var context = _canvas.getContext( '2d' );
  12306. context.drawImage( image, 0, 0, _canvas.width, _canvas.height );
  12307. console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height );
  12308. return _canvas;
  12309. }
  12310. return image;
  12311. }
  12312. function textureNeedsPowerOfTwo( texture ) {
  12313. if ( capabilities.isWebGL2 ) return false;
  12314. return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||
  12315. ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );
  12316. }
  12317. function textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) {
  12318. return texture.generateMipmaps && isPowerOfTwo &&
  12319. texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;
  12320. }
  12321. function generateMipmap( target, texture, width, height ) {
  12322. _gl.generateMipmap( target );
  12323. var textureProperties = properties.get( texture );
  12324. // Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11
  12325. textureProperties.__maxMipLevel = Math.log( Math.max( width, height ) ) * Math.LOG2E;
  12326. }
  12327. function getInternalFormat( glFormat, glType ) {
  12328. if ( ! capabilities.isWebGL2 ) return glFormat;
  12329. if ( glFormat === _gl.RGB ) {
  12330. if ( glType === _gl.FLOAT ) return _gl.RGB32F;
  12331. if ( glType === _gl.HALF_FLOAT ) return _gl.RGB16F;
  12332. if ( glType === _gl.UNSIGNED_BYTE ) return _gl.RGB8;
  12333. }
  12334. if ( glFormat === _gl.RGBA ) {
  12335. if ( glType === _gl.FLOAT ) return _gl.RGBA32F;
  12336. if ( glType === _gl.HALF_FLOAT ) return _gl.RGBA16F;
  12337. if ( glType === _gl.UNSIGNED_BYTE ) return _gl.RGBA8;
  12338. }
  12339. return glFormat;
  12340. }
  12341. // Fallback filters for non-power-of-2 textures
  12342. function filterFallback( f ) {
  12343. if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {
  12344. return _gl.NEAREST;
  12345. }
  12346. return _gl.LINEAR;
  12347. }
  12348. //
  12349. function onTextureDispose( event ) {
  12350. var texture = event.target;
  12351. texture.removeEventListener( 'dispose', onTextureDispose );
  12352. deallocateTexture( texture );
  12353. if ( texture.isVideoTexture ) {
  12354. delete _videoTextures[ texture.id ];
  12355. }
  12356. info.memory.textures --;
  12357. }
  12358. function onRenderTargetDispose( event ) {
  12359. var renderTarget = event.target;
  12360. renderTarget.removeEventListener( 'dispose', onRenderTargetDispose );
  12361. deallocateRenderTarget( renderTarget );
  12362. info.memory.textures --;
  12363. }
  12364. //
  12365. function deallocateTexture( texture ) {
  12366. var textureProperties = properties.get( texture );
  12367. if ( texture.image && textureProperties.__image__webglTextureCube ) {
  12368. // cube texture
  12369. _gl.deleteTexture( textureProperties.__image__webglTextureCube );
  12370. } else {
  12371. // 2D texture
  12372. if ( textureProperties.__webglInit === undefined ) return;
  12373. _gl.deleteTexture( textureProperties.__webglTexture );
  12374. }
  12375. // remove all webgl properties
  12376. properties.remove( texture );
  12377. }
  12378. function deallocateRenderTarget( renderTarget ) {
  12379. var renderTargetProperties = properties.get( renderTarget );
  12380. var textureProperties = properties.get( renderTarget.texture );
  12381. if ( ! renderTarget ) return;
  12382. if ( textureProperties.__webglTexture !== undefined ) {
  12383. _gl.deleteTexture( textureProperties.__webglTexture );
  12384. }
  12385. if ( renderTarget.depthTexture ) {
  12386. renderTarget.depthTexture.dispose();
  12387. }
  12388. if ( renderTarget.isWebGLRenderTargetCube ) {
  12389. for ( var i = 0; i < 6; i ++ ) {
  12390. _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
  12391. if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );
  12392. }
  12393. } else {
  12394. _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
  12395. if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
  12396. }
  12397. properties.remove( renderTarget.texture );
  12398. properties.remove( renderTarget );
  12399. }
  12400. //
  12401. function setTexture2D( texture, slot ) {
  12402. var textureProperties = properties.get( texture );
  12403. if ( texture.isVideoTexture ) updateVideoTexture( texture );
  12404. if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
  12405. var image = texture.image;
  12406. if ( image === undefined ) {
  12407. console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' );
  12408. } else if ( image.complete === false ) {
  12409. console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );
  12410. } else {
  12411. uploadTexture( textureProperties, texture, slot );
  12412. return;
  12413. }
  12414. }
  12415. state.activeTexture( _gl.TEXTURE0 + slot );
  12416. state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
  12417. }
  12418. function setTextureCube( texture, slot ) {
  12419. var textureProperties = properties.get( texture );
  12420. if ( texture.image.length === 6 ) {
  12421. if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
  12422. if ( ! textureProperties.__image__webglTextureCube ) {
  12423. texture.addEventListener( 'dispose', onTextureDispose );
  12424. textureProperties.__image__webglTextureCube = _gl.createTexture();
  12425. info.memory.textures ++;
  12426. }
  12427. state.activeTexture( _gl.TEXTURE0 + slot );
  12428. state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );
  12429. _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
  12430. var isCompressed = ( texture && texture.isCompressedTexture );
  12431. var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );
  12432. var cubeImage = [];
  12433. for ( var i = 0; i < 6; i ++ ) {
  12434. if ( ! isCompressed && ! isDataTexture ) {
  12435. cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );
  12436. } else {
  12437. cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];
  12438. }
  12439. }
  12440. var image = cubeImage[ 0 ],
  12441. isPowerOfTwoImage = isPowerOfTwo( image ),
  12442. glFormat = utils.convert( texture.format ),
  12443. glType = utils.convert( texture.type ),
  12444. glInternalFormat = getInternalFormat( glFormat, glType );
  12445. setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );
  12446. for ( var i = 0; i < 6; i ++ ) {
  12447. if ( ! isCompressed ) {
  12448. if ( isDataTexture ) {
  12449. state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );
  12450. } else {
  12451. state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );
  12452. }
  12453. } else {
  12454. var mipmap, mipmaps = cubeImage[ i ].mipmaps;
  12455. for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {
  12456. mipmap = mipmaps[ j ];
  12457. if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {
  12458. if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {
  12459. state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
  12460. } else {
  12461. console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );
  12462. }
  12463. } else {
  12464. state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
  12465. }
  12466. }
  12467. }
  12468. }
  12469. if ( ! isCompressed ) {
  12470. textureProperties.__maxMipLevel = 0;
  12471. } else {
  12472. textureProperties.__maxMipLevel = mipmaps.length - 1;
  12473. }
  12474. if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) {
  12475. // We assume images for cube map have the same size.
  12476. generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, image.width, image.height );
  12477. }
  12478. textureProperties.__version = texture.version;
  12479. if ( texture.onUpdate ) texture.onUpdate( texture );
  12480. } else {
  12481. state.activeTexture( _gl.TEXTURE0 + slot );
  12482. state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );
  12483. }
  12484. }
  12485. }
  12486. function setTextureCubeDynamic( texture, slot ) {
  12487. state.activeTexture( _gl.TEXTURE0 + slot );
  12488. state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );
  12489. }
  12490. function setTextureParameters( textureType, texture, isPowerOfTwoImage ) {
  12491. var extension;
  12492. if ( isPowerOfTwoImage ) {
  12493. _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, utils.convert( texture.wrapS ) );
  12494. _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, utils.convert( texture.wrapT ) );
  12495. _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, utils.convert( texture.magFilter ) );
  12496. _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, utils.convert( texture.minFilter ) );
  12497. } else {
  12498. _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
  12499. _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
  12500. if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {
  12501. console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );
  12502. }
  12503. _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );
  12504. _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );
  12505. if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {
  12506. console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );
  12507. }
  12508. }
  12509. extension = extensions.get( 'EXT_texture_filter_anisotropic' );
  12510. if ( extension ) {
  12511. if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;
  12512. if ( texture.type === HalfFloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_half_float_linear' ) ) === null ) return;
  12513. if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {
  12514. _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );
  12515. properties.get( texture ).__currentAnisotropy = texture.anisotropy;
  12516. }
  12517. }
  12518. }
  12519. function uploadTexture( textureProperties, texture, slot ) {
  12520. if ( textureProperties.__webglInit === undefined ) {
  12521. textureProperties.__webglInit = true;
  12522. texture.addEventListener( 'dispose', onTextureDispose );
  12523. textureProperties.__webglTexture = _gl.createTexture();
  12524. info.memory.textures ++;
  12525. }
  12526. state.activeTexture( _gl.TEXTURE0 + slot );
  12527. state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
  12528. _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
  12529. _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
  12530. _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
  12531. var image = clampToMaxSize( texture.image, capabilities.maxTextureSize );
  12532. if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {
  12533. image = makePowerOfTwo( image );
  12534. }
  12535. var isPowerOfTwoImage = isPowerOfTwo( image ),
  12536. glFormat = utils.convert( texture.format ),
  12537. glType = utils.convert( texture.type ),
  12538. glInternalFormat = getInternalFormat( glFormat, glType );
  12539. setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );
  12540. var mipmap, mipmaps = texture.mipmaps;
  12541. if ( texture.isDepthTexture ) {
  12542. // populate depth texture with dummy data
  12543. glInternalFormat = _gl.DEPTH_COMPONENT;
  12544. if ( texture.type === FloatType ) {
  12545. if ( ! capabilities.isWebGL2 ) throw new Error( 'Float Depth Texture only supported in WebGL2.0' );
  12546. glInternalFormat = _gl.DEPTH_COMPONENT32F;
  12547. } else if ( capabilities.isWebGL2 ) {
  12548. // WebGL 2.0 requires signed internalformat for glTexImage2D
  12549. glInternalFormat = _gl.DEPTH_COMPONENT16;
  12550. }
  12551. if ( texture.format === DepthFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {
  12552. // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
  12553. // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT
  12554. // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
  12555. if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {
  12556. console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );
  12557. texture.type = UnsignedShortType;
  12558. glType = utils.convert( texture.type );
  12559. }
  12560. }
  12561. // Depth stencil textures need the DEPTH_STENCIL internal format
  12562. // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
  12563. if ( texture.format === DepthStencilFormat ) {
  12564. glInternalFormat = _gl.DEPTH_STENCIL;
  12565. // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
  12566. // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.
  12567. // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
  12568. if ( texture.type !== UnsignedInt248Type ) {
  12569. console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );
  12570. texture.type = UnsignedInt248Type;
  12571. glType = utils.convert( texture.type );
  12572. }
  12573. }
  12574. state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
  12575. } else if ( texture.isDataTexture ) {
  12576. // use manually created mipmaps if available
  12577. // if there are no manual mipmaps
  12578. // set 0 level mipmap and then use GL to generate other mipmap levels
  12579. if ( mipmaps.length > 0 && isPowerOfTwoImage ) {
  12580. for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
  12581. mipmap = mipmaps[ i ];
  12582. state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
  12583. }
  12584. texture.generateMipmaps = false;
  12585. textureProperties.__maxMipLevel = mipmaps.length - 1;
  12586. } else {
  12587. state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );
  12588. textureProperties.__maxMipLevel = 0;
  12589. }
  12590. } else if ( texture.isCompressedTexture ) {
  12591. for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
  12592. mipmap = mipmaps[ i ];
  12593. if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {
  12594. if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {
  12595. state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
  12596. } else {
  12597. console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );
  12598. }
  12599. } else {
  12600. state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
  12601. }
  12602. }
  12603. textureProperties.__maxMipLevel = mipmaps.length - 1;
  12604. } else {
  12605. // regular Texture (image, video, canvas)
  12606. // use manually created mipmaps if available
  12607. // if there are no manual mipmaps
  12608. // set 0 level mipmap and then use GL to generate other mipmap levels
  12609. if ( mipmaps.length > 0 && isPowerOfTwoImage ) {
  12610. for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
  12611. mipmap = mipmaps[ i ];
  12612. state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );
  12613. }
  12614. texture.generateMipmaps = false;
  12615. textureProperties.__maxMipLevel = mipmaps.length - 1;
  12616. } else {
  12617. state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );
  12618. textureProperties.__maxMipLevel = 0;
  12619. }
  12620. }
  12621. if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) {
  12622. generateMipmap( _gl.TEXTURE_2D, texture, image.width, image.height );
  12623. }
  12624. textureProperties.__version = texture.version;
  12625. if ( texture.onUpdate ) texture.onUpdate( texture );
  12626. }
  12627. // Render targets
  12628. // Setup storage for target texture and bind it to correct framebuffer
  12629. function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {
  12630. var glFormat = utils.convert( renderTarget.texture.format );
  12631. var glType = utils.convert( renderTarget.texture.type );
  12632. var glInternalFormat = getInternalFormat( glFormat, glType );
  12633. state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
  12634. _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
  12635. _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );
  12636. _gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
  12637. }
  12638. // Setup storage for internal depth/stencil buffers and bind to correct framebuffer
  12639. function setupRenderBufferStorage( renderbuffer, renderTarget ) {
  12640. _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );
  12641. if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {
  12642. _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );
  12643. _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
  12644. } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
  12645. _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
  12646. _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
  12647. } else {
  12648. // FIXME: We don't support !depth !stencil
  12649. _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );
  12650. }
  12651. _gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
  12652. }
  12653. // Setup resources for a Depth Texture for a FBO (needs an extension)
  12654. function setupDepthTexture( framebuffer, renderTarget ) {
  12655. var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );
  12656. if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );
  12657. _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
  12658. if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {
  12659. throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );
  12660. }
  12661. // upload an empty depth texture with framebuffer size
  12662. if ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||
  12663. renderTarget.depthTexture.image.width !== renderTarget.width ||
  12664. renderTarget.depthTexture.image.height !== renderTarget.height ) {
  12665. renderTarget.depthTexture.image.width = renderTarget.width;
  12666. renderTarget.depthTexture.image.height = renderTarget.height;
  12667. renderTarget.depthTexture.needsUpdate = true;
  12668. }
  12669. setTexture2D( renderTarget.depthTexture, 0 );
  12670. var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;
  12671. if ( renderTarget.depthTexture.format === DepthFormat ) {
  12672. _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
  12673. } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {
  12674. _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
  12675. } else {
  12676. throw new Error( 'Unknown depthTexture format' );
  12677. }
  12678. }
  12679. // Setup GL resources for a non-texture depth buffer
  12680. function setupDepthRenderbuffer( renderTarget ) {
  12681. var renderTargetProperties = properties.get( renderTarget );
  12682. var isCube = ( renderTarget.isWebGLRenderTargetCube === true );
  12683. if ( renderTarget.depthTexture ) {
  12684. if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );
  12685. setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );
  12686. } else {
  12687. if ( isCube ) {
  12688. renderTargetProperties.__webglDepthbuffer = [];
  12689. for ( var i = 0; i < 6; i ++ ) {
  12690. _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );
  12691. renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();
  12692. setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );
  12693. }
  12694. } else {
  12695. _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
  12696. renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();
  12697. setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );
  12698. }
  12699. }
  12700. _gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
  12701. }
  12702. // Set up GL resources for the render target
  12703. function setupRenderTarget( renderTarget ) {
  12704. var renderTargetProperties = properties.get( renderTarget );
  12705. var textureProperties = properties.get( renderTarget.texture );
  12706. renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
  12707. textureProperties.__webglTexture = _gl.createTexture();
  12708. info.memory.textures ++;
  12709. var isCube = ( renderTarget.isWebGLRenderTargetCube === true );
  12710. var isTargetPowerOfTwo = isPowerOfTwo( renderTarget );
  12711. // Setup framebuffer
  12712. if ( isCube ) {
  12713. renderTargetProperties.__webglFramebuffer = [];
  12714. for ( var i = 0; i < 6; i ++ ) {
  12715. renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
  12716. }
  12717. } else {
  12718. renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
  12719. }
  12720. // Setup color buffer
  12721. if ( isCube ) {
  12722. state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
  12723. setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );
  12724. for ( var i = 0; i < 6; i ++ ) {
  12725. setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
  12726. }
  12727. if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) {
  12728. generateMipmap( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, renderTarget.width, renderTarget.height );
  12729. }
  12730. state.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
  12731. } else {
  12732. state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
  12733. setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );
  12734. setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
  12735. if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) {
  12736. generateMipmap( _gl.TEXTURE_2D, renderTarget.texture, renderTarget.width, renderTarget.height );
  12737. }
  12738. state.bindTexture( _gl.TEXTURE_2D, null );
  12739. }
  12740. // Setup depth and stencil buffers
  12741. if ( renderTarget.depthBuffer ) {
  12742. setupDepthRenderbuffer( renderTarget );
  12743. }
  12744. }
  12745. function updateRenderTargetMipmap( renderTarget ) {
  12746. var texture = renderTarget.texture;
  12747. var isTargetPowerOfTwo = isPowerOfTwo( renderTarget );
  12748. if ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) {
  12749. var target = renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;
  12750. var webglTexture = properties.get( texture ).__webglTexture;
  12751. state.bindTexture( target, webglTexture );
  12752. generateMipmap( target, texture, renderTarget.width, renderTarget.height );
  12753. state.bindTexture( target, null );
  12754. }
  12755. }
  12756. function updateVideoTexture( texture ) {
  12757. var id = texture.id;
  12758. var frame = info.render.frame;
  12759. // Check the last frame we updated the VideoTexture
  12760. if ( _videoTextures[ id ] !== frame ) {
  12761. _videoTextures[ id ] = frame;
  12762. texture.update();
  12763. }
  12764. }
  12765. this.setTexture2D = setTexture2D;
  12766. this.setTextureCube = setTextureCube;
  12767. this.setTextureCubeDynamic = setTextureCubeDynamic;
  12768. this.setupRenderTarget = setupRenderTarget;
  12769. this.updateRenderTargetMipmap = updateRenderTargetMipmap;
  12770. }
  12771. /**
  12772. * @author thespite / http://www.twitter.com/thespite
  12773. */
  12774. function WebGLUtils( gl, extensions, capabilities ) {
  12775. function convert( p ) {
  12776. var extension;
  12777. if ( p === RepeatWrapping ) return gl.REPEAT;
  12778. if ( p === ClampToEdgeWrapping ) return gl.CLAMP_TO_EDGE;
  12779. if ( p === MirroredRepeatWrapping ) return gl.MIRRORED_REPEAT;
  12780. if ( p === NearestFilter ) return gl.NEAREST;
  12781. if ( p === NearestMipMapNearestFilter ) return gl.NEAREST_MIPMAP_NEAREST;
  12782. if ( p === NearestMipMapLinearFilter ) return gl.NEAREST_MIPMAP_LINEAR;
  12783. if ( p === LinearFilter ) return gl.LINEAR;
  12784. if ( p === LinearMipMapNearestFilter ) return gl.LINEAR_MIPMAP_NEAREST;
  12785. if ( p === LinearMipMapLinearFilter ) return gl.LINEAR_MIPMAP_LINEAR;
  12786. if ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;
  12787. if ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;
  12788. if ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;
  12789. if ( p === UnsignedShort565Type ) return gl.UNSIGNED_SHORT_5_6_5;
  12790. if ( p === ByteType ) return gl.BYTE;
  12791. if ( p === ShortType ) return gl.SHORT;
  12792. if ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;
  12793. if ( p === IntType ) return gl.INT;
  12794. if ( p === UnsignedIntType ) return gl.UNSIGNED_INT;
  12795. if ( p === FloatType ) return gl.FLOAT;
  12796. if ( p === HalfFloatType ) {
  12797. if ( capabilities.isWebGL2 ) return gl.HALF_FLOAT;
  12798. extension = extensions.get( 'OES_texture_half_float' );
  12799. if ( extension !== null ) return extension.HALF_FLOAT_OES;
  12800. }
  12801. if ( p === AlphaFormat ) return gl.ALPHA;
  12802. if ( p === RGBFormat ) return gl.RGB;
  12803. if ( p === RGBAFormat ) return gl.RGBA;
  12804. if ( p === LuminanceFormat ) return gl.LUMINANCE;
  12805. if ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;
  12806. if ( p === DepthFormat ) return gl.DEPTH_COMPONENT;
  12807. if ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;
  12808. if ( p === AddEquation ) return gl.FUNC_ADD;
  12809. if ( p === SubtractEquation ) return gl.FUNC_SUBTRACT;
  12810. if ( p === ReverseSubtractEquation ) return gl.FUNC_REVERSE_SUBTRACT;
  12811. if ( p === ZeroFactor ) return gl.ZERO;
  12812. if ( p === OneFactor ) return gl.ONE;
  12813. if ( p === SrcColorFactor ) return gl.SRC_COLOR;
  12814. if ( p === OneMinusSrcColorFactor ) return gl.ONE_MINUS_SRC_COLOR;
  12815. if ( p === SrcAlphaFactor ) return gl.SRC_ALPHA;
  12816. if ( p === OneMinusSrcAlphaFactor ) return gl.ONE_MINUS_SRC_ALPHA;
  12817. if ( p === DstAlphaFactor ) return gl.DST_ALPHA;
  12818. if ( p === OneMinusDstAlphaFactor ) return gl.ONE_MINUS_DST_ALPHA;
  12819. if ( p === DstColorFactor ) return gl.DST_COLOR;
  12820. if ( p === OneMinusDstColorFactor ) return gl.ONE_MINUS_DST_COLOR;
  12821. if ( p === SrcAlphaSaturateFactor ) return gl.SRC_ALPHA_SATURATE;
  12822. if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||
  12823. p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {
  12824. extension = extensions.get( 'WEBGL_compressed_texture_s3tc' );
  12825. if ( extension !== null ) {
  12826. if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;
  12827. if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;
  12828. if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;
  12829. if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;
  12830. }
  12831. }
  12832. if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||
  12833. p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {
  12834. extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );
  12835. if ( extension !== null ) {
  12836. if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
  12837. if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
  12838. if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
  12839. if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
  12840. }
  12841. }
  12842. if ( p === RGB_ETC1_Format ) {
  12843. extension = extensions.get( 'WEBGL_compressed_texture_etc1' );
  12844. if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;
  12845. }
  12846. if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||
  12847. p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||
  12848. p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||
  12849. p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||
  12850. p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {
  12851. extension = extensions.get( 'WEBGL_compressed_texture_astc' );
  12852. if ( extension !== null ) {
  12853. return p;
  12854. }
  12855. }
  12856. if ( p === MinEquation || p === MaxEquation ) {
  12857. if ( capabilities.isWebGL2 ) {
  12858. if ( p === MinEquation ) return gl.MIN;
  12859. if ( p === MaxEquation ) return gl.MAX;
  12860. }
  12861. extension = extensions.get( 'EXT_blend_minmax' );
  12862. if ( extension !== null ) {
  12863. if ( p === MinEquation ) return extension.MIN_EXT;
  12864. if ( p === MaxEquation ) return extension.MAX_EXT;
  12865. }
  12866. }
  12867. if ( p === UnsignedInt248Type ) {
  12868. if ( capabilities.isWebGL2 ) return gl.UNSIGNED_INT_24_8;
  12869. extension = extensions.get( 'WEBGL_depth_texture' );
  12870. if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;
  12871. }
  12872. return 0;
  12873. }
  12874. return { convert: convert };
  12875. }
  12876. /**
  12877. * @author mrdoob / http://mrdoob.com/
  12878. */
  12879. function Group() {
  12880. Object3D.call( this );
  12881. this.type = 'Group';
  12882. }
  12883. Group.prototype = Object.assign( Object.create( Object3D.prototype ), {
  12884. constructor: Group,
  12885. isGroup: true
  12886. } );
  12887. /**
  12888. * @author mrdoob / http://mrdoob.com/
  12889. * @author greggman / http://games.greggman.com/
  12890. * @author zz85 / http://www.lab4games.net/zz85/blog
  12891. * @author tschw
  12892. */
  12893. function PerspectiveCamera( fov, aspect, near, far ) {
  12894. Camera.call( this );
  12895. this.type = 'PerspectiveCamera';
  12896. this.fov = fov !== undefined ? fov : 50;
  12897. this.zoom = 1;
  12898. this.near = near !== undefined ? near : 0.1;
  12899. this.far = far !== undefined ? far : 2000;
  12900. this.focus = 10;
  12901. this.aspect = aspect !== undefined ? aspect : 1;
  12902. this.view = null;
  12903. this.filmGauge = 35; // width of the film (default in millimeters)
  12904. this.filmOffset = 0; // horizontal film offset (same unit as gauge)
  12905. this.updateProjectionMatrix();
  12906. }
  12907. PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {
  12908. constructor: PerspectiveCamera,
  12909. isPerspectiveCamera: true,
  12910. copy: function ( source, recursive ) {
  12911. Camera.prototype.copy.call( this, source, recursive );
  12912. this.fov = source.fov;
  12913. this.zoom = source.zoom;
  12914. this.near = source.near;
  12915. this.far = source.far;
  12916. this.focus = source.focus;
  12917. this.aspect = source.aspect;
  12918. this.view = source.view === null ? null : Object.assign( {}, source.view );
  12919. this.filmGauge = source.filmGauge;
  12920. this.filmOffset = source.filmOffset;
  12921. return this;
  12922. },
  12923. /**
  12924. * Sets the FOV by focal length in respect to the current .filmGauge.
  12925. *
  12926. * The default film gauge is 35, so that the focal length can be specified for
  12927. * a 35mm (full frame) camera.
  12928. *
  12929. * Values for focal length and film gauge must have the same unit.
  12930. */
  12931. setFocalLength: function ( focalLength ) {
  12932. // see http://www.bobatkins.com/photography/technical/field_of_view.html
  12933. var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;
  12934. this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );
  12935. this.updateProjectionMatrix();
  12936. },
  12937. /**
  12938. * Calculates the focal length from the current .fov and .filmGauge.
  12939. */
  12940. getFocalLength: function () {
  12941. var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );
  12942. return 0.5 * this.getFilmHeight() / vExtentSlope;
  12943. },
  12944. getEffectiveFOV: function () {
  12945. return _Math.RAD2DEG * 2 * Math.atan(
  12946. Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );
  12947. },
  12948. getFilmWidth: function () {
  12949. // film not completely covered in portrait format (aspect < 1)
  12950. return this.filmGauge * Math.min( this.aspect, 1 );
  12951. },
  12952. getFilmHeight: function () {
  12953. // film not completely covered in landscape format (aspect > 1)
  12954. return this.filmGauge / Math.max( this.aspect, 1 );
  12955. },
  12956. /**
  12957. * Sets an offset in a larger frustum. This is useful for multi-window or
  12958. * multi-monitor/multi-machine setups.
  12959. *
  12960. * For example, if you have 3x2 monitors and each monitor is 1920x1080 and
  12961. * the monitors are in grid like this
  12962. *
  12963. * +---+---+---+
  12964. * | A | B | C |
  12965. * +---+---+---+
  12966. * | D | E | F |
  12967. * +---+---+---+
  12968. *
  12969. * then for each monitor you would call it like this
  12970. *
  12971. * var w = 1920;
  12972. * var h = 1080;
  12973. * var fullWidth = w * 3;
  12974. * var fullHeight = h * 2;
  12975. *
  12976. * --A--
  12977. * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );
  12978. * --B--
  12979. * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );
  12980. * --C--
  12981. * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );
  12982. * --D--
  12983. * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );
  12984. * --E--
  12985. * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );
  12986. * --F--
  12987. * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );
  12988. *
  12989. * Note there is no reason monitors have to be the same size or in a grid.
  12990. */
  12991. setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {
  12992. this.aspect = fullWidth / fullHeight;
  12993. if ( this.view === null ) {
  12994. this.view = {
  12995. enabled: true,
  12996. fullWidth: 1,
  12997. fullHeight: 1,
  12998. offsetX: 0,
  12999. offsetY: 0,
  13000. width: 1,
  13001. height: 1
  13002. };
  13003. }
  13004. this.view.enabled = true;
  13005. this.view.fullWidth = fullWidth;
  13006. this.view.fullHeight = fullHeight;
  13007. this.view.offsetX = x;
  13008. this.view.offsetY = y;
  13009. this.view.width = width;
  13010. this.view.height = height;
  13011. this.updateProjectionMatrix();
  13012. },
  13013. clearViewOffset: function () {
  13014. if ( this.view !== null ) {
  13015. this.view.enabled = false;
  13016. }
  13017. this.updateProjectionMatrix();
  13018. },
  13019. updateProjectionMatrix: function () {
  13020. var near = this.near,
  13021. top = near * Math.tan(
  13022. _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,
  13023. height = 2 * top,
  13024. width = this.aspect * height,
  13025. left = - 0.5 * width,
  13026. view = this.view;
  13027. if ( this.view !== null && this.view.enabled ) {
  13028. var fullWidth = view.fullWidth,
  13029. fullHeight = view.fullHeight;
  13030. left += view.offsetX * width / fullWidth;
  13031. top -= view.offsetY * height / fullHeight;
  13032. width *= view.width / fullWidth;
  13033. height *= view.height / fullHeight;
  13034. }
  13035. var skew = this.filmOffset;
  13036. if ( skew !== 0 ) left += near * skew / this.getFilmWidth();
  13037. this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );
  13038. },
  13039. toJSON: function ( meta ) {
  13040. var data = Object3D.prototype.toJSON.call( this, meta );
  13041. data.object.fov = this.fov;
  13042. data.object.zoom = this.zoom;
  13043. data.object.near = this.near;
  13044. data.object.far = this.far;
  13045. data.object.focus = this.focus;
  13046. data.object.aspect = this.aspect;
  13047. if ( this.view !== null ) data.object.view = Object.assign( {}, this.view );
  13048. data.object.filmGauge = this.filmGauge;
  13049. data.object.filmOffset = this.filmOffset;
  13050. return data;
  13051. }
  13052. } );
  13053. /**
  13054. * @author mrdoob / http://mrdoob.com/
  13055. */
  13056. function ArrayCamera( array ) {
  13057. PerspectiveCamera.call( this );
  13058. this.cameras = array || [];
  13059. }
  13060. ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), {
  13061. constructor: ArrayCamera,
  13062. isArrayCamera: true
  13063. } );
  13064. /**
  13065. * @author mrdoob / http://mrdoob.com/
  13066. */
  13067. function WebVRManager( renderer ) {
  13068. var scope = this;
  13069. var device = null;
  13070. var frameData = null;
  13071. var poseTarget = null;
  13072. var controllers = [];
  13073. var standingMatrix = new Matrix4();
  13074. var standingMatrixInverse = new Matrix4();
  13075. if ( typeof window !== 'undefined' && 'VRFrameData' in window ) {
  13076. frameData = new window.VRFrameData();
  13077. window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false );
  13078. }
  13079. var matrixWorldInverse = new Matrix4();
  13080. var tempQuaternion = new Quaternion();
  13081. var tempPosition = new Vector3();
  13082. var cameraL = new PerspectiveCamera();
  13083. cameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 );
  13084. cameraL.layers.enable( 1 );
  13085. var cameraR = new PerspectiveCamera();
  13086. cameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 );
  13087. cameraR.layers.enable( 2 );
  13088. var cameraVR = new ArrayCamera( [ cameraL, cameraR ] );
  13089. cameraVR.layers.enable( 1 );
  13090. cameraVR.layers.enable( 2 );
  13091. //
  13092. function isPresenting() {
  13093. return device !== null && device.isPresenting === true;
  13094. }
  13095. var currentSize, currentPixelRatio;
  13096. function onVRDisplayPresentChange() {
  13097. if ( isPresenting() ) {
  13098. var eyeParameters = device.getEyeParameters( 'left' );
  13099. var renderWidth = eyeParameters.renderWidth;
  13100. var renderHeight = eyeParameters.renderHeight;
  13101. currentPixelRatio = renderer.getPixelRatio();
  13102. currentSize = renderer.getSize();
  13103. renderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 );
  13104. animation.start();
  13105. } else if ( scope.enabled ) {
  13106. renderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio );
  13107. animation.stop();
  13108. }
  13109. }
  13110. //
  13111. var triggers = [];
  13112. function findGamepad( id ) {
  13113. var gamepads = navigator.getGamepads && navigator.getGamepads();
  13114. for ( var i = 0, j = 0, l = gamepads.length; i < l; i ++ ) {
  13115. var gamepad = gamepads[ i ];
  13116. if ( gamepad && ( gamepad.id === 'Daydream Controller' ||
  13117. gamepad.id === 'Gear VR Controller' || gamepad.id === 'Oculus Go Controller' ||
  13118. gamepad.id === 'OpenVR Gamepad' || gamepad.id.startsWith( 'Oculus Touch' ) ||
  13119. gamepad.id.startsWith( 'Spatial Controller' ) ) ) {
  13120. if ( j === id ) return gamepad;
  13121. j ++;
  13122. }
  13123. }
  13124. }
  13125. function updateControllers() {
  13126. for ( var i = 0; i < controllers.length; i ++ ) {
  13127. var controller = controllers[ i ];
  13128. var gamepad = findGamepad( i );
  13129. if ( gamepad !== undefined && gamepad.pose !== undefined ) {
  13130. if ( gamepad.pose === null ) return;
  13131. // Pose
  13132. var pose = gamepad.pose;
  13133. if ( pose.hasPosition === false ) controller.position.set( 0.2, - 0.6, - 0.05 );
  13134. if ( pose.position !== null ) controller.position.fromArray( pose.position );
  13135. if ( pose.orientation !== null ) controller.quaternion.fromArray( pose.orientation );
  13136. controller.matrix.compose( controller.position, controller.quaternion, controller.scale );
  13137. controller.matrix.premultiply( standingMatrix );
  13138. controller.matrix.decompose( controller.position, controller.quaternion, controller.scale );
  13139. controller.matrixWorldNeedsUpdate = true;
  13140. controller.visible = true;
  13141. // Trigger
  13142. var buttonId = gamepad.id === 'Daydream Controller' ? 0 : 1;
  13143. if ( triggers[ i ] !== gamepad.buttons[ buttonId ].pressed ) {
  13144. triggers[ i ] = gamepad.buttons[ buttonId ].pressed;
  13145. if ( triggers[ i ] === true ) {
  13146. controller.dispatchEvent( { type: 'selectstart' } );
  13147. } else {
  13148. controller.dispatchEvent( { type: 'selectend' } );
  13149. controller.dispatchEvent( { type: 'select' } );
  13150. }
  13151. }
  13152. } else {
  13153. controller.visible = false;
  13154. }
  13155. }
  13156. }
  13157. //
  13158. this.enabled = false;
  13159. this.userHeight = 1.6;
  13160. this.getController = function ( id ) {
  13161. var controller = controllers[ id ];
  13162. if ( controller === undefined ) {
  13163. controller = new Group();
  13164. controller.matrixAutoUpdate = false;
  13165. controller.visible = false;
  13166. controllers[ id ] = controller;
  13167. }
  13168. return controller;
  13169. };
  13170. this.getDevice = function () {
  13171. return device;
  13172. };
  13173. this.setDevice = function ( value ) {
  13174. if ( value !== undefined ) device = value;
  13175. animation.setContext( value );
  13176. };
  13177. this.setPoseTarget = function ( object ) {
  13178. if ( object !== undefined ) poseTarget = object;
  13179. };
  13180. this.getCamera = function ( camera ) {
  13181. if ( device === null ) {
  13182. camera.position.set( 0, scope.userHeight, 0 );
  13183. return camera;
  13184. }
  13185. device.depthNear = camera.near;
  13186. device.depthFar = camera.far;
  13187. device.getFrameData( frameData );
  13188. //
  13189. var stageParameters = device.stageParameters;
  13190. if ( stageParameters ) {
  13191. standingMatrix.fromArray( stageParameters.sittingToStandingTransform );
  13192. } else {
  13193. standingMatrix.makeTranslation( 0, scope.userHeight, 0 );
  13194. }
  13195. var pose = frameData.pose;
  13196. var poseObject = poseTarget !== null ? poseTarget : camera;
  13197. // We want to manipulate poseObject by its position and quaternion components since users may rely on them.
  13198. poseObject.matrix.copy( standingMatrix );
  13199. poseObject.matrix.decompose( poseObject.position, poseObject.quaternion, poseObject.scale );
  13200. if ( pose.orientation !== null ) {
  13201. tempQuaternion.fromArray( pose.orientation );
  13202. poseObject.quaternion.multiply( tempQuaternion );
  13203. }
  13204. if ( pose.position !== null ) {
  13205. tempQuaternion.setFromRotationMatrix( standingMatrix );
  13206. tempPosition.fromArray( pose.position );
  13207. tempPosition.applyQuaternion( tempQuaternion );
  13208. poseObject.position.add( tempPosition );
  13209. }
  13210. poseObject.updateMatrixWorld();
  13211. if ( device.isPresenting === false ) return camera;
  13212. //
  13213. cameraL.near = camera.near;
  13214. cameraR.near = camera.near;
  13215. cameraL.far = camera.far;
  13216. cameraR.far = camera.far;
  13217. cameraVR.matrixWorld.copy( camera.matrixWorld );
  13218. cameraVR.matrixWorldInverse.copy( camera.matrixWorldInverse );
  13219. cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );
  13220. cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );
  13221. // TODO (mrdoob) Double check this code
  13222. standingMatrixInverse.getInverse( standingMatrix );
  13223. cameraL.matrixWorldInverse.multiply( standingMatrixInverse );
  13224. cameraR.matrixWorldInverse.multiply( standingMatrixInverse );
  13225. var parent = poseObject.parent;
  13226. if ( parent !== null ) {
  13227. matrixWorldInverse.getInverse( parent.matrixWorld );
  13228. cameraL.matrixWorldInverse.multiply( matrixWorldInverse );
  13229. cameraR.matrixWorldInverse.multiply( matrixWorldInverse );
  13230. }
  13231. // envMap and Mirror needs camera.matrixWorld
  13232. cameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse );
  13233. cameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse );
  13234. cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix );
  13235. cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix );
  13236. // HACK (mrdoob)
  13237. // https://github.com/w3c/webvr/issues/203
  13238. cameraVR.projectionMatrix.copy( cameraL.projectionMatrix );
  13239. //
  13240. var layers = device.getLayers();
  13241. if ( layers.length ) {
  13242. var layer = layers[ 0 ];
  13243. if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) {
  13244. cameraL.bounds.fromArray( layer.leftBounds );
  13245. }
  13246. if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) {
  13247. cameraR.bounds.fromArray( layer.rightBounds );
  13248. }
  13249. }
  13250. updateControllers();
  13251. return cameraVR;
  13252. };
  13253. this.getStandingMatrix = function () {
  13254. return standingMatrix;
  13255. };
  13256. this.isPresenting = isPresenting;
  13257. // Animation Loop
  13258. var animation = new WebGLAnimation();
  13259. this.setAnimationLoop = function ( callback ) {
  13260. animation.setAnimationLoop( callback );
  13261. };
  13262. this.submitFrame = function () {
  13263. if ( isPresenting() ) device.submitFrame();
  13264. };
  13265. this.dispose = function () {
  13266. if ( typeof window !== 'undefined' ) {
  13267. window.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange );
  13268. }
  13269. };
  13270. }
  13271. /**
  13272. * @author mrdoob / http://mrdoob.com/
  13273. */
  13274. function WebXRManager( renderer ) {
  13275. var gl = renderer.context;
  13276. var device = null;
  13277. var session = null;
  13278. var frameOfRef = null;
  13279. var pose = null;
  13280. var controllers = [];
  13281. var inputSources = [];
  13282. function isPresenting() {
  13283. return session !== null && frameOfRef !== null;
  13284. }
  13285. //
  13286. var cameraL = new PerspectiveCamera();
  13287. cameraL.layers.enable( 1 );
  13288. cameraL.viewport = new Vector4();
  13289. var cameraR = new PerspectiveCamera();
  13290. cameraR.layers.enable( 2 );
  13291. cameraR.viewport = new Vector4();
  13292. var cameraVR = new ArrayCamera( [ cameraL, cameraR ] );
  13293. cameraVR.layers.enable( 1 );
  13294. cameraVR.layers.enable( 2 );
  13295. //
  13296. this.enabled = false;
  13297. this.getController = function ( id ) {
  13298. var controller = controllers[ id ];
  13299. if ( controller === undefined ) {
  13300. controller = new Group();
  13301. controller.matrixAutoUpdate = false;
  13302. controller.visible = false;
  13303. controllers[ id ] = controller;
  13304. }
  13305. return controller;
  13306. };
  13307. this.getDevice = function () {
  13308. return device;
  13309. };
  13310. this.setDevice = function ( value ) {
  13311. if ( value !== undefined ) device = value;
  13312. if ( value instanceof XRDevice ) gl.setCompatibleXRDevice( value );
  13313. };
  13314. //
  13315. function onSessionEvent( event ) {
  13316. var controller = controllers[ inputSources.indexOf( event.inputSource ) ];
  13317. if ( controller ) controller.dispatchEvent( { type: event.type } );
  13318. }
  13319. function onSessionEnd() {
  13320. renderer.setFramebuffer( null );
  13321. animation.stop();
  13322. }
  13323. this.setSession = function ( value, options ) {
  13324. session = value;
  13325. if ( session !== null ) {
  13326. session.addEventListener( 'select', onSessionEvent );
  13327. session.addEventListener( 'selectstart', onSessionEvent );
  13328. session.addEventListener( 'selectend', onSessionEvent );
  13329. session.addEventListener( 'end', onSessionEnd );
  13330. session.baseLayer = new XRWebGLLayer( session, gl );
  13331. session.requestFrameOfReference( options.frameOfReferenceType ).then( function ( value ) {
  13332. frameOfRef = value;
  13333. renderer.setFramebuffer( session.baseLayer.framebuffer );
  13334. animation.setContext( session );
  13335. animation.start();
  13336. } );
  13337. //
  13338. inputSources = session.getInputSources();
  13339. session.addEventListener( 'inputsourceschange', function () {
  13340. inputSources = session.getInputSources();
  13341. console.log( inputSources );
  13342. } );
  13343. }
  13344. };
  13345. function updateCamera( camera, parent ) {
  13346. if ( parent === null ) {
  13347. camera.matrixWorld.copy( camera.matrix );
  13348. } else {
  13349. camera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );
  13350. }
  13351. camera.matrixWorldInverse.getInverse( camera.matrixWorld );
  13352. }
  13353. this.getCamera = function ( camera ) {
  13354. if ( isPresenting() ) {
  13355. var parent = camera.parent;
  13356. var cameras = cameraVR.cameras;
  13357. // apply camera.parent to cameraVR
  13358. updateCamera( cameraVR, parent );
  13359. for ( var i = 0; i < cameras.length; i ++ ) {
  13360. updateCamera( cameras[ i ], parent );
  13361. }
  13362. // update camera and its children
  13363. camera.matrixWorld.copy( cameraVR.matrixWorld );
  13364. var children = camera.children;
  13365. for ( var i = 0, l = children.length; i < l; i ++ ) {
  13366. children[ i ].updateMatrixWorld( true );
  13367. }
  13368. return cameraVR;
  13369. }
  13370. return camera;
  13371. };
  13372. this.isPresenting = isPresenting;
  13373. // Animation Loop
  13374. var onAnimationFrameCallback = null;
  13375. function onAnimationFrame( time, frame ) {
  13376. pose = frame.getDevicePose( frameOfRef );
  13377. if ( pose !== null ) {
  13378. var layer = session.baseLayer;
  13379. var views = frame.views;
  13380. for ( var i = 0; i < views.length; i ++ ) {
  13381. var view = views[ i ];
  13382. var viewport = layer.getViewport( view );
  13383. var viewMatrix = pose.getViewMatrix( view );
  13384. var camera = cameraVR.cameras[ i ];
  13385. camera.matrix.fromArray( viewMatrix ).getInverse( camera.matrix );
  13386. camera.projectionMatrix.fromArray( view.projectionMatrix );
  13387. camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );
  13388. if ( i === 0 ) {
  13389. cameraVR.matrix.copy( camera.matrix );
  13390. // HACK (mrdoob)
  13391. // https://github.com/w3c/webvr/issues/203
  13392. cameraVR.projectionMatrix.copy( camera.projectionMatrix );
  13393. }
  13394. }
  13395. }
  13396. //
  13397. for ( var i = 0; i < controllers.length; i ++ ) {
  13398. var controller = controllers[ i ];
  13399. var inputSource = inputSources[ i ];
  13400. if ( inputSource ) {
  13401. var inputPose = frame.getInputPose( inputSource, frameOfRef );
  13402. if ( inputPose !== null ) {
  13403. controller.matrix.elements = inputPose.pointerMatrix;
  13404. controller.matrix.decompose( controller.position, controller.rotation, controller.scale );
  13405. controller.visible = true;
  13406. continue;
  13407. }
  13408. }
  13409. controller.visible = false;
  13410. }
  13411. if ( onAnimationFrameCallback ) onAnimationFrameCallback( time );
  13412. }
  13413. var animation = new WebGLAnimation();
  13414. animation.setAnimationLoop( onAnimationFrame );
  13415. this.setAnimationLoop = function ( callback ) {
  13416. onAnimationFrameCallback = callback;
  13417. };
  13418. this.dispose = function () {};
  13419. // DEPRECATED
  13420. this.getStandingMatrix = function () {
  13421. console.warn( 'THREE.WebXRManager: getStandingMatrix() is no longer needed.' );
  13422. return new THREE.Matrix4();
  13423. };
  13424. this.submitFrame = function () {};
  13425. }
  13426. /**
  13427. * @author supereggbert / http://www.paulbrunt.co.uk/
  13428. * @author mrdoob / http://mrdoob.com/
  13429. * @author alteredq / http://alteredqualia.com/
  13430. * @author szimek / https://github.com/szimek/
  13431. * @author tschw
  13432. */
  13433. function WebGLRenderer( parameters ) {
  13434. console.log( 'THREE.WebGLRenderer', REVISION );
  13435. parameters = parameters || {};
  13436. var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),
  13437. _context = parameters.context !== undefined ? parameters.context : null,
  13438. _alpha = parameters.alpha !== undefined ? parameters.alpha : false,
  13439. _depth = parameters.depth !== undefined ? parameters.depth : true,
  13440. _stencil = parameters.stencil !== undefined ? parameters.stencil : true,
  13441. _antialias = parameters.antialias !== undefined ? parameters.antialias : false,
  13442. _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
  13443. _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
  13444. _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default';
  13445. var currentRenderList = null;
  13446. var currentRenderState = null;
  13447. // public properties
  13448. this.domElement = _canvas;
  13449. this.context = null;
  13450. // clearing
  13451. this.autoClear = true;
  13452. this.autoClearColor = true;
  13453. this.autoClearDepth = true;
  13454. this.autoClearStencil = true;
  13455. // scene graph
  13456. this.sortObjects = true;
  13457. // user-defined clipping
  13458. this.clippingPlanes = [];
  13459. this.localClippingEnabled = false;
  13460. // physically based shading
  13461. this.gammaFactor = 2.0; // for backwards compatibility
  13462. this.gammaInput = false;
  13463. this.gammaOutput = false;
  13464. // physical lights
  13465. this.physicallyCorrectLights = false;
  13466. // tone mapping
  13467. this.toneMapping = LinearToneMapping;
  13468. this.toneMappingExposure = 1.0;
  13469. this.toneMappingWhitePoint = 1.0;
  13470. // morphs
  13471. this.maxMorphTargets = 8;
  13472. this.maxMorphNormals = 4;
  13473. // internal properties
  13474. var _this = this,
  13475. _isContextLost = false,
  13476. // internal state cache
  13477. _framebuffer = null,
  13478. _currentRenderTarget = null,
  13479. _currentFramebuffer = null,
  13480. _currentMaterialId = - 1,
  13481. // geometry and program caching
  13482. _currentGeometryProgram = {
  13483. geometry: null,
  13484. program: null,
  13485. wireframe: false
  13486. },
  13487. _currentCamera = null,
  13488. _currentArrayCamera = null,
  13489. _currentViewport = new Vector4(),
  13490. _currentScissor = new Vector4(),
  13491. _currentScissorTest = null,
  13492. //
  13493. _usedTextureUnits = 0,
  13494. //
  13495. _width = _canvas.width,
  13496. _height = _canvas.height,
  13497. _pixelRatio = 1,
  13498. _viewport = new Vector4( 0, 0, _width, _height ),
  13499. _scissor = new Vector4( 0, 0, _width, _height ),
  13500. _scissorTest = false,
  13501. // frustum
  13502. _frustum = new Frustum(),
  13503. // clipping
  13504. _clipping = new WebGLClipping(),
  13505. _clippingEnabled = false,
  13506. _localClippingEnabled = false,
  13507. // camera matrices cache
  13508. _projScreenMatrix = new Matrix4(),
  13509. _vector3 = new Vector3();
  13510. function getTargetPixelRatio() {
  13511. return _currentRenderTarget === null ? _pixelRatio : 1;
  13512. }
  13513. // initialize
  13514. var _gl;
  13515. try {
  13516. var contextAttributes = {
  13517. alpha: _alpha,
  13518. depth: _depth,
  13519. stencil: _stencil,
  13520. antialias: _antialias,
  13521. premultipliedAlpha: _premultipliedAlpha,
  13522. preserveDrawingBuffer: _preserveDrawingBuffer,
  13523. powerPreference: _powerPreference
  13524. };
  13525. // event listeners must be registered before WebGL context is created, see #12753
  13526. _canvas.addEventListener( 'webglcontextlost', onContextLost, false );
  13527. _canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
  13528. _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );
  13529. if ( _gl === null ) {
  13530. if ( _canvas.getContext( 'webgl' ) !== null ) {
  13531. throw new Error( 'Error creating WebGL context with your selected attributes.' );
  13532. } else {
  13533. throw new Error( 'Error creating WebGL context.' );
  13534. }
  13535. }
  13536. // Some experimental-webgl implementations do not have getShaderPrecisionFormat
  13537. if ( _gl.getShaderPrecisionFormat === undefined ) {
  13538. _gl.getShaderPrecisionFormat = function () {
  13539. return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };
  13540. };
  13541. }
  13542. } catch ( error ) {
  13543. console.error( 'THREE.WebGLRenderer: ' + error.message );
  13544. }
  13545. var extensions, capabilities, state, info;
  13546. var properties, textures, attributes, geometries, objects;
  13547. var programCache, renderLists, renderStates;
  13548. var background, morphtargets, bufferRenderer, indexedBufferRenderer;
  13549. var utils;
  13550. function initGLContext() {
  13551. extensions = new WebGLExtensions( _gl );
  13552. capabilities = new WebGLCapabilities( _gl, extensions, parameters );
  13553. if ( ! capabilities.isWebGL2 ) {
  13554. extensions.get( 'WEBGL_depth_texture' );
  13555. extensions.get( 'OES_texture_float' );
  13556. extensions.get( 'OES_texture_half_float' );
  13557. extensions.get( 'OES_texture_half_float_linear' );
  13558. extensions.get( 'OES_standard_derivatives' );
  13559. extensions.get( 'OES_element_index_uint' );
  13560. extensions.get( 'ANGLE_instanced_arrays' );
  13561. }
  13562. extensions.get( 'OES_texture_float_linear' );
  13563. utils = new WebGLUtils( _gl, extensions, capabilities );
  13564. state = new WebGLState( _gl, extensions, utils, capabilities );
  13565. state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );
  13566. state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );
  13567. info = new WebGLInfo( _gl );
  13568. properties = new WebGLProperties();
  13569. textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );
  13570. attributes = new WebGLAttributes( _gl );
  13571. geometries = new WebGLGeometries( _gl, attributes, info );
  13572. objects = new WebGLObjects( geometries, info );
  13573. morphtargets = new WebGLMorphtargets( _gl );
  13574. programCache = new WebGLPrograms( _this, extensions, capabilities );
  13575. renderLists = new WebGLRenderLists();
  13576. renderStates = new WebGLRenderStates();
  13577. background = new WebGLBackground( _this, state, objects, _premultipliedAlpha );
  13578. bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );
  13579. indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );
  13580. info.programs = programCache.programs;
  13581. _this.context = _gl;
  13582. _this.capabilities = capabilities;
  13583. _this.extensions = extensions;
  13584. _this.properties = properties;
  13585. _this.renderLists = renderLists;
  13586. _this.state = state;
  13587. _this.info = info;
  13588. }
  13589. initGLContext();
  13590. // vr
  13591. var vr = ( 'xr' in navigator ) ? new WebXRManager( _this ) : new WebVRManager( _this );
  13592. this.vr = vr;
  13593. // shadow map
  13594. var shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize );
  13595. this.shadowMap = shadowMap;
  13596. // API
  13597. this.getContext = function () {
  13598. return _gl;
  13599. };
  13600. this.getContextAttributes = function () {
  13601. return _gl.getContextAttributes();
  13602. };
  13603. this.forceContextLoss = function () {
  13604. var extension = extensions.get( 'WEBGL_lose_context' );
  13605. if ( extension ) extension.loseContext();
  13606. };
  13607. this.forceContextRestore = function () {
  13608. var extension = extensions.get( 'WEBGL_lose_context' );
  13609. if ( extension ) extension.restoreContext();
  13610. };
  13611. this.getPixelRatio = function () {
  13612. return _pixelRatio;
  13613. };
  13614. this.setPixelRatio = function ( value ) {
  13615. if ( value === undefined ) return;
  13616. _pixelRatio = value;
  13617. this.setSize( _width, _height, false );
  13618. };
  13619. this.getSize = function () {
  13620. return {
  13621. width: _width,
  13622. height: _height
  13623. };
  13624. };
  13625. this.setSize = function ( width, height, updateStyle ) {
  13626. if ( vr.isPresenting() ) {
  13627. console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' );
  13628. return;
  13629. }
  13630. _width = width;
  13631. _height = height;
  13632. _canvas.width = width * _pixelRatio;
  13633. _canvas.height = height * _pixelRatio;
  13634. if ( updateStyle !== false ) {
  13635. _canvas.style.width = width + 'px';
  13636. _canvas.style.height = height + 'px';
  13637. }
  13638. this.setViewport( 0, 0, width, height );
  13639. };
  13640. this.getDrawingBufferSize = function () {
  13641. return {
  13642. width: _width * _pixelRatio,
  13643. height: _height * _pixelRatio
  13644. };
  13645. };
  13646. this.setDrawingBufferSize = function ( width, height, pixelRatio ) {
  13647. _width = width;
  13648. _height = height;
  13649. _pixelRatio = pixelRatio;
  13650. _canvas.width = width * pixelRatio;
  13651. _canvas.height = height * pixelRatio;
  13652. this.setViewport( 0, 0, width, height );
  13653. };
  13654. this.getCurrentViewport = function () {
  13655. return _currentViewport;
  13656. };
  13657. this.setViewport = function ( x, y, width, height ) {
  13658. _viewport.set( x, _height - y - height, width, height );
  13659. state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );
  13660. };
  13661. this.setScissor = function ( x, y, width, height ) {
  13662. _scissor.set( x, _height - y - height, width, height );
  13663. state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );
  13664. };
  13665. this.setScissorTest = function ( boolean ) {
  13666. state.setScissorTest( _scissorTest = boolean );
  13667. };
  13668. // Clearing
  13669. this.getClearColor = function () {
  13670. return background.getClearColor();
  13671. };
  13672. this.setClearColor = function () {
  13673. background.setClearColor.apply( background, arguments );
  13674. };
  13675. this.getClearAlpha = function () {
  13676. return background.getClearAlpha();
  13677. };
  13678. this.setClearAlpha = function () {
  13679. background.setClearAlpha.apply( background, arguments );
  13680. };
  13681. this.clear = function ( color, depth, stencil ) {
  13682. var bits = 0;
  13683. if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;
  13684. if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;
  13685. if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;
  13686. _gl.clear( bits );
  13687. };
  13688. this.setClearColor2 = function (r,g,b,alpha) {
  13689. _gl.clearColor( r,g,b,alpha );
  13690. _gl.clear(_gl.COLOR_BUFFER_BIT | _gl.DEPTH_BUFFER_BIT | _gl.STENCIL_BUFFER_BIT);
  13691. _gl.enable(_gl.DEPTH_TEST);
  13692. //_gl.clear(_gl.COLOR_BUFFER_BIT );
  13693. };
  13694. this.clearColor = function () {
  13695. this.clear( true, false, false );
  13696. };
  13697. this.clearDepth = function () {
  13698. this.clear( false, true, false );
  13699. };
  13700. this.clearStencil = function () {
  13701. this.clear( false, false, true );
  13702. };
  13703. this.clearTarget = function ( renderTarget, color, depth, stencil ) {
  13704. this.setRenderTarget( renderTarget );
  13705. this.clear( color, depth, stencil );
  13706. };
  13707. //
  13708. this.dispose = function () {
  13709. _canvas.removeEventListener( 'webglcontextlost', onContextLost, false );
  13710. _canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );
  13711. renderLists.dispose();
  13712. renderStates.dispose();
  13713. properties.dispose();
  13714. objects.dispose();
  13715. vr.dispose();
  13716. animation.stop();
  13717. };
  13718. // Events
  13719. function onContextLost( event ) {
  13720. event.preventDefault();
  13721. console.log( 'THREE.WebGLRenderer: Context Lost.' );
  13722. _isContextLost = true;
  13723. }
  13724. function onContextRestore( /* event */ ) {
  13725. console.log( 'THREE.WebGLRenderer: Context Restored.' );
  13726. _isContextLost = false;
  13727. initGLContext();
  13728. }
  13729. function onMaterialDispose( event ) {
  13730. var material = event.target;
  13731. material.removeEventListener( 'dispose', onMaterialDispose );
  13732. deallocateMaterial( material );
  13733. }
  13734. // Buffer deallocation
  13735. function deallocateMaterial( material ) {
  13736. releaseMaterialProgramReference( material );
  13737. properties.remove( material );
  13738. }
  13739. function releaseMaterialProgramReference( material ) {
  13740. var programInfo = properties.get( material ).program;
  13741. material.program = undefined;
  13742. if ( programInfo !== undefined ) {
  13743. programCache.releaseProgram( programInfo );
  13744. }
  13745. }
  13746. // Buffer rendering
  13747. function renderObjectImmediate( object, program ) {
  13748. object.render( function ( object ) {
  13749. _this.renderBufferImmediate( object, program );
  13750. } );
  13751. }
  13752. this.renderBufferImmediate = function ( object, program ) {
  13753. state.initAttributes();
  13754. var buffers = properties.get( object );
  13755. if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();
  13756. if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();
  13757. if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();
  13758. if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();
  13759. var programAttributes = program.getAttributes();
  13760. if ( object.hasPositions ) {
  13761. _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );
  13762. _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );
  13763. state.enableAttribute( programAttributes.position );
  13764. _gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 );
  13765. }
  13766. if ( object.hasNormals ) {
  13767. _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );
  13768. _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );
  13769. state.enableAttribute( programAttributes.normal );
  13770. _gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 );
  13771. }
  13772. if ( object.hasUvs ) {
  13773. _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );
  13774. _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );
  13775. state.enableAttribute( programAttributes.uv );
  13776. _gl.vertexAttribPointer( programAttributes.uv, 2, _gl.FLOAT, false, 0, 0 );
  13777. }
  13778. if ( object.hasColors ) {
  13779. _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );
  13780. _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );
  13781. state.enableAttribute( programAttributes.color );
  13782. _gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 );
  13783. }
  13784. state.disableUnusedAttributes();
  13785. _gl.drawArrays( _gl.TRIANGLES, 0, object.count );
  13786. object.count = 0;
  13787. };
  13788. this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {
  13789. var frontFaceCW = ( object.isMesh && object.normalMatrix.determinant() < 0 );
  13790. state.setMaterial( material, frontFaceCW );
  13791. var program = setProgram( camera, fog, material, object );
  13792. var updateBuffers = false;
  13793. if ( _currentGeometryProgram.geometry !== geometry.id ||
  13794. _currentGeometryProgram.program !== program.id ||
  13795. _currentGeometryProgram.wireframe !== ( material.wireframe === true ) ) {
  13796. _currentGeometryProgram.geometry = geometry.id;
  13797. _currentGeometryProgram.program = program.id;
  13798. _currentGeometryProgram.wireframe = material.wireframe === true;
  13799. updateBuffers = true;
  13800. }
  13801. if ( object.morphTargetInfluences ) {
  13802. morphtargets.update( object, geometry, material, program );
  13803. updateBuffers = true;
  13804. }
  13805. //
  13806. var index = geometry.index;
  13807. var position = geometry.attributes.position;
  13808. var rangeFactor = 1;
  13809. if ( material.wireframe === true ) {
  13810. index = geometries.getWireframeAttribute( geometry );
  13811. rangeFactor = 2;
  13812. }
  13813. var attribute;
  13814. var renderer = bufferRenderer;
  13815. if ( index !== null ) {
  13816. attribute = attributes.get( index );
  13817. renderer = indexedBufferRenderer;
  13818. renderer.setIndex( attribute );
  13819. }
  13820. if ( updateBuffers ) {
  13821. setupVertexAttributes( material, program, geometry );
  13822. if ( index !== null ) {
  13823. _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer );
  13824. }
  13825. }
  13826. //
  13827. var dataCount = Infinity;
  13828. if ( index !== null ) {
  13829. dataCount = index.count;
  13830. } else if ( position !== undefined ) {
  13831. dataCount = position.count;
  13832. }
  13833. var rangeStart = geometry.drawRange.start * rangeFactor;
  13834. var rangeCount = geometry.drawRange.count * rangeFactor;
  13835. var groupStart = group !== null ? group.start * rangeFactor : 0;
  13836. var groupCount = group !== null ? group.count * rangeFactor : Infinity;
  13837. var drawStart = Math.max( rangeStart, groupStart );
  13838. var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;
  13839. var drawCount = Math.max( 0, drawEnd - drawStart + 1 );
  13840. if ( drawCount === 0 ) return;
  13841. //
  13842. if ( object.isMesh ) {
  13843. if ( material.wireframe === true ) {
  13844. state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );
  13845. renderer.setMode( _gl.LINES );
  13846. } else {
  13847. switch ( object.drawMode ) {
  13848. case TrianglesDrawMode:
  13849. renderer.setMode( _gl.TRIANGLES );
  13850. break;
  13851. case TriangleStripDrawMode:
  13852. renderer.setMode( _gl.TRIANGLE_STRIP );
  13853. break;
  13854. case TriangleFanDrawMode:
  13855. renderer.setMode( _gl.TRIANGLE_FAN );
  13856. break;
  13857. }
  13858. }
  13859. } else if ( object.isLine ) {
  13860. var lineWidth = material.linewidth;
  13861. if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material
  13862. state.setLineWidth( lineWidth * getTargetPixelRatio() );
  13863. if ( object.isLineSegments ) {
  13864. renderer.setMode( _gl.LINES );
  13865. } else if ( object.isLineLoop ) {
  13866. renderer.setMode( _gl.LINE_LOOP );
  13867. } else {
  13868. renderer.setMode( _gl.LINE_STRIP );
  13869. }
  13870. } else if ( object.isPoints ) {
  13871. renderer.setMode( _gl.POINTS );
  13872. } else if ( object.isSprite ) {
  13873. renderer.setMode( _gl.TRIANGLES );
  13874. }
  13875. if ( geometry && geometry.isInstancedBufferGeometry ) {
  13876. if ( geometry.maxInstancedCount > 0 ) {
  13877. renderer.renderInstances( geometry, drawStart, drawCount );
  13878. }
  13879. } else {
  13880. renderer.render( drawStart, drawCount );
  13881. }
  13882. };
  13883. function setupVertexAttributes( material, program, geometry ) {
  13884. if ( geometry && geometry.isInstancedBufferGeometry & ! capabilities.isWebGL2 ) {
  13885. if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) {
  13886. console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
  13887. return;
  13888. }
  13889. }
  13890. state.initAttributes();
  13891. var geometryAttributes = geometry.attributes;
  13892. var programAttributes = program.getAttributes();
  13893. var materialDefaultAttributeValues = material.defaultAttributeValues;
  13894. for ( var name in programAttributes ) {
  13895. var programAttribute = programAttributes[ name ];
  13896. if ( programAttribute >= 0 ) {
  13897. var geometryAttribute = geometryAttributes[ name ];
  13898. if ( geometryAttribute !== undefined ) {
  13899. var normalized = geometryAttribute.normalized;
  13900. var size = geometryAttribute.itemSize;
  13901. var attribute = attributes.get( geometryAttribute );
  13902. // TODO Attribute may not be available on context restore
  13903. if ( attribute === undefined ) continue;
  13904. var buffer = attribute.buffer;
  13905. var type = attribute.type;
  13906. var bytesPerElement = attribute.bytesPerElement;
  13907. if ( geometryAttribute.isInterleavedBufferAttribute ) {
  13908. var data = geometryAttribute.data;
  13909. var stride = data.stride;
  13910. var offset = geometryAttribute.offset;
  13911. if ( data && data.isInstancedInterleavedBuffer ) {
  13912. state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute );
  13913. if ( geometry.maxInstancedCount === undefined ) {
  13914. geometry.maxInstancedCount = data.meshPerAttribute * data.count;
  13915. }
  13916. } else {
  13917. state.enableAttribute( programAttribute );
  13918. }
  13919. _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
  13920. _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement );
  13921. } else {
  13922. if ( geometryAttribute.isInstancedBufferAttribute ) {
  13923. state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute );
  13924. if ( geometry.maxInstancedCount === undefined ) {
  13925. geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;
  13926. }
  13927. } else {
  13928. state.enableAttribute( programAttribute );
  13929. }
  13930. _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
  13931. _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 );
  13932. }
  13933. } else if ( materialDefaultAttributeValues !== undefined ) {
  13934. var value = materialDefaultAttributeValues[ name ];
  13935. if ( value !== undefined ) {
  13936. switch ( value.length ) {
  13937. case 2:
  13938. _gl.vertexAttrib2fv( programAttribute, value );
  13939. break;
  13940. case 3:
  13941. _gl.vertexAttrib3fv( programAttribute, value );
  13942. break;
  13943. case 4:
  13944. _gl.vertexAttrib4fv( programAttribute, value );
  13945. break;
  13946. default:
  13947. _gl.vertexAttrib1fv( programAttribute, value );
  13948. }
  13949. }
  13950. }
  13951. }
  13952. }
  13953. state.disableUnusedAttributes();
  13954. }
  13955. // Compile
  13956. this.compile = function ( scene, camera ) {
  13957. currentRenderState = renderStates.get( scene, camera );
  13958. currentRenderState.init();
  13959. scene.traverse( function ( object ) {
  13960. if ( object.isLight ) {
  13961. currentRenderState.pushLight( object );
  13962. if ( object.castShadow ) {
  13963. currentRenderState.pushShadow( object );
  13964. }
  13965. }
  13966. } );
  13967. currentRenderState.setupLights( camera );
  13968. scene.traverse( function ( object ) {
  13969. if ( object.material ) {
  13970. if ( Array.isArray( object.material ) ) {
  13971. for ( var i = 0; i < object.material.length; i ++ ) {
  13972. initMaterial( object.material[ i ], scene.fog, object );
  13973. }
  13974. } else {
  13975. initMaterial( object.material, scene.fog, object );
  13976. }
  13977. }
  13978. } );
  13979. };
  13980. // Animation Loop
  13981. var onAnimationFrameCallback = null;
  13982. function onAnimationFrame( time ) {
  13983. if ( vr.isPresenting() ) return;
  13984. if ( onAnimationFrameCallback ) onAnimationFrameCallback( time );
  13985. }
  13986. var animation = new WebGLAnimation();
  13987. animation.setAnimationLoop( onAnimationFrame );
  13988. if ( typeof window !== 'undefined' ) animation.setContext( window );
  13989. this.setAnimationLoop = function ( callback ) {
  13990. onAnimationFrameCallback = callback;
  13991. vr.setAnimationLoop( callback );
  13992. animation.start();
  13993. };
  13994. // Rendering
  13995. this.render = function ( scene, camera, renderTarget, forceClear ) {
  13996. if ( ! ( camera && camera.isCamera ) ) {
  13997. console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );
  13998. return;
  13999. }
  14000. if ( _isContextLost ) return;
  14001. // reset caching for this frame
  14002. _currentGeometryProgram.geometry = null;
  14003. _currentGeometryProgram.program = null;
  14004. _currentGeometryProgram.wireframe = false;
  14005. _currentMaterialId = - 1;
  14006. _currentCamera = null;
  14007. // update scene graph
  14008. if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
  14009. // update camera matrices and frustum
  14010. if ( camera.parent === null ) camera.updateMatrixWorld();
  14011. if ( vr.enabled ) {
  14012. camera = vr.getCamera( camera );
  14013. }
  14014. //
  14015. currentRenderState = renderStates.get( scene, camera );
  14016. currentRenderState.init();
  14017. scene.onBeforeRender( _this, scene, camera, renderTarget );
  14018. _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
  14019. _frustum.setFromMatrix( _projScreenMatrix );
  14020. _localClippingEnabled = this.localClippingEnabled;
  14021. _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );
  14022. currentRenderList = renderLists.get( scene, camera );
  14023. currentRenderList.init();
  14024. projectObject( scene, camera, _this.sortObjects );
  14025. if ( _this.sortObjects === true ) {
  14026. currentRenderList.sort();
  14027. }
  14028. //
  14029. if ( _clippingEnabled ) _clipping.beginShadows();
  14030. var shadowsArray = currentRenderState.state.shadowsArray;
  14031. shadowMap.render( shadowsArray, scene, camera );
  14032. currentRenderState.setupLights( camera );
  14033. if ( _clippingEnabled ) _clipping.endShadows();
  14034. //
  14035. if ( this.info.autoReset ) this.info.reset();
  14036. if ( renderTarget === undefined ) {
  14037. renderTarget = null;
  14038. }
  14039. this.setRenderTarget( renderTarget );
  14040. //
  14041. background.render( currentRenderList, scene, camera, forceClear );
  14042. // render scene
  14043. var opaqueObjects = currentRenderList.opaque;
  14044. var transparentObjects = currentRenderList.transparent;
  14045. if ( scene.overrideMaterial ) {
  14046. var overrideMaterial = scene.overrideMaterial;
  14047. if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial );
  14048. if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial );
  14049. } else {
  14050. // opaque pass (front-to-back order)
  14051. if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera );
  14052. // transparent pass (back-to-front order)
  14053. if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera );
  14054. }
  14055. // Generate mipmap if we're using any kind of mipmap filtering
  14056. if ( renderTarget ) {
  14057. textures.updateRenderTargetMipmap( renderTarget );
  14058. }
  14059. // Ensure depth buffer writing is enabled so it can be cleared on next render
  14060. state.buffers.depth.setTest( true );
  14061. state.buffers.depth.setMask( true );
  14062. state.buffers.color.setMask( true );
  14063. state.setPolygonOffset( false );
  14064. scene.onAfterRender( _this, scene, camera );
  14065. if ( vr.enabled ) {
  14066. vr.submitFrame();
  14067. }
  14068. // _gl.finish();
  14069. currentRenderList = null;
  14070. currentRenderState = null;
  14071. };
  14072. /*
  14073. // TODO Duplicated code (Frustum)
  14074. var _sphere = new Sphere();
  14075. function isObjectViewable( object ) {
  14076. var geometry = object.geometry;
  14077. if ( geometry.boundingSphere === null )
  14078. geometry.computeBoundingSphere();
  14079. _sphere.copy( geometry.boundingSphere ).
  14080. applyMatrix4( object.matrixWorld );
  14081. return isSphereViewable( _sphere );
  14082. }
  14083. function isSpriteViewable( sprite ) {
  14084. _sphere.center.set( 0, 0, 0 );
  14085. _sphere.radius = 0.7071067811865476;
  14086. _sphere.applyMatrix4( sprite.matrixWorld );
  14087. return isSphereViewable( _sphere );
  14088. }
  14089. function isSphereViewable( sphere ) {
  14090. if ( ! _frustum.intersectsSphere( sphere ) ) return false;
  14091. var numPlanes = _clipping.numPlanes;
  14092. if ( numPlanes === 0 ) return true;
  14093. var planes = _this.clippingPlanes,
  14094. center = sphere.center,
  14095. negRad = - sphere.radius,
  14096. i = 0;
  14097. do {
  14098. // out when deeper than radius in the negative halfspace
  14099. if ( planes[ i ].distanceToPoint( center ) < negRad ) return false;
  14100. } while ( ++ i !== numPlanes );
  14101. return true;
  14102. }
  14103. */
  14104. function projectObject( object, camera, sortObjects ) {
  14105. if ( object.visible === false ) return;
  14106. var visible = object.layers.test( camera.layers );
  14107. if ( visible ) {
  14108. if ( object.isLight ) {
  14109. currentRenderState.pushLight( object );
  14110. if ( object.castShadow ) {
  14111. currentRenderState.pushShadow( object );
  14112. }
  14113. } else if ( object.isSprite ) {
  14114. if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
  14115. if ( sortObjects ) {
  14116. _vector3.setFromMatrixPosition( object.matrixWorld )
  14117. .applyMatrix4( _projScreenMatrix );
  14118. }
  14119. var geometry = objects.update( object );
  14120. var material = object.material;
  14121. currentRenderList.push( object, geometry, material, _vector3.z, null );
  14122. }
  14123. } else if ( object.isImmediateRenderObject ) {
  14124. if ( sortObjects ) {
  14125. _vector3.setFromMatrixPosition( object.matrixWorld )
  14126. .applyMatrix4( _projScreenMatrix );
  14127. }
  14128. currentRenderList.push( object, null, object.material, _vector3.z, null );
  14129. } else if ( object.isMesh || object.isLine || object.isPoints ) {
  14130. if ( object.isSkinnedMesh ) {
  14131. object.skeleton.update();
  14132. }
  14133. if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
  14134. if ( sortObjects ) {
  14135. _vector3.setFromMatrixPosition( object.matrixWorld )
  14136. .applyMatrix4( _projScreenMatrix );
  14137. }
  14138. var geometry = objects.update( object );
  14139. var material = object.material;
  14140. if ( Array.isArray( material ) ) {
  14141. var groups = geometry.groups;
  14142. for ( var i = 0, l = groups.length; i < l; i ++ ) {
  14143. var group = groups[ i ];
  14144. var groupMaterial = material[ group.materialIndex ];
  14145. if ( groupMaterial && groupMaterial.visible ) {
  14146. currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );
  14147. }
  14148. }
  14149. } else if ( material.visible ) {
  14150. currentRenderList.push( object, geometry, material, _vector3.z, null );
  14151. }
  14152. }
  14153. }
  14154. }
  14155. var children = object.children;
  14156. for ( var i = 0, l = children.length; i < l; i ++ ) {
  14157. projectObject( children[ i ], camera, sortObjects );
  14158. }
  14159. }
  14160. function renderObjects( renderList, scene, camera, overrideMaterial ) {
  14161. for ( var i = 0, l = renderList.length; i < l; i ++ ) {
  14162. var renderItem = renderList[ i ];
  14163. var object = renderItem.object;
  14164. var geometry = renderItem.geometry;
  14165. var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;
  14166. var group = renderItem.group;
  14167. if ( camera.isArrayCamera ) {
  14168. _currentArrayCamera = camera;
  14169. var cameras = camera.cameras;
  14170. for ( var j = 0, jl = cameras.length; j < jl; j ++ ) {
  14171. var camera2 = cameras[ j ];
  14172. if ( object.layers.test( camera2.layers ) ) {
  14173. if ( 'viewport' in camera2 ) { // XR
  14174. state.viewport( _currentViewport.copy( camera2.viewport ) );
  14175. } else {
  14176. var bounds = camera2.bounds;
  14177. var x = bounds.x * _width;
  14178. var y = bounds.y * _height;
  14179. var width = bounds.z * _width;
  14180. var height = bounds.w * _height;
  14181. state.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) );
  14182. }
  14183. renderObject( object, scene, camera2, geometry, material, group );
  14184. }
  14185. }
  14186. } else {
  14187. _currentArrayCamera = null;
  14188. renderObject( object, scene, camera, geometry, material, group );
  14189. }
  14190. }
  14191. }
  14192. function renderObject( object, scene, camera, geometry, material, group ) {
  14193. object.onBeforeRender( _this, scene, camera, geometry, material, group );
  14194. currentRenderState = renderStates.get( scene, _currentArrayCamera || camera );
  14195. object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
  14196. object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
  14197. if ( object.isImmediateRenderObject ) {
  14198. state.setMaterial( material );
  14199. var program = setProgram( camera, scene.fog, material, object );
  14200. _currentGeometryProgram.geometry = null;
  14201. _currentGeometryProgram.program = null;
  14202. _currentGeometryProgram.wireframe = false;
  14203. renderObjectImmediate( object, program );
  14204. } else {
  14205. _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );
  14206. }
  14207. object.onAfterRender( _this, scene, camera, geometry, material, group );
  14208. currentRenderState = renderStates.get( scene, _currentArrayCamera || camera );
  14209. }
  14210. function initMaterial( material, fog, object ) {
  14211. var materialProperties = properties.get( material );
  14212. var lights = currentRenderState.state.lights;
  14213. var shadowsArray = currentRenderState.state.shadowsArray;
  14214. var lightsHash = materialProperties.lightsHash;
  14215. var lightsStateHash = lights.state.hash;
  14216. var parameters = programCache.getParameters(
  14217. material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object );
  14218. var code = programCache.getProgramCode( material, parameters );
  14219. var program = materialProperties.program;
  14220. var programChange = true;
  14221. if ( program === undefined ) {
  14222. // new material
  14223. material.addEventListener( 'dispose', onMaterialDispose );
  14224. } else if ( program.code !== code ) {
  14225. // changed glsl or parameters
  14226. releaseMaterialProgramReference( material );
  14227. } else if ( lightsHash.stateID !== lightsStateHash.stateID ||
  14228. lightsHash.directionalLength !== lightsStateHash.directionalLength ||
  14229. lightsHash.pointLength !== lightsStateHash.pointLength ||
  14230. lightsHash.spotLength !== lightsStateHash.spotLength ||
  14231. lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength ||
  14232. lightsHash.hemiLength !== lightsStateHash.hemiLength ||
  14233. lightsHash.shadowsLength !== lightsStateHash.shadowsLength ) {
  14234. lightsHash.stateID = lightsStateHash.stateID;
  14235. lightsHash.directionalLength = lightsStateHash.directionalLength;
  14236. lightsHash.pointLength = lightsStateHash.pointLength;
  14237. lightsHash.spotLength = lightsStateHash.spotLength;
  14238. lightsHash.rectAreaLength = lightsStateHash.rectAreaLength;
  14239. lightsHash.hemiLength = lightsStateHash.hemiLength;
  14240. lightsHash.shadowsLength = lightsStateHash.shadowsLength;
  14241. programChange = false;
  14242. } else if ( parameters.shaderID !== undefined ) {
  14243. // same glsl and uniform list
  14244. return;
  14245. } else {
  14246. // only rebuild uniform list
  14247. programChange = false;
  14248. }
  14249. if ( programChange ) {
  14250. if ( parameters.shaderID ) {
  14251. var shader = ShaderLib[ parameters.shaderID ];
  14252. materialProperties.shader = {
  14253. name: material.type,
  14254. uniforms: UniformsUtils.clone( shader.uniforms ),
  14255. vertexShader: shader.vertexShader,
  14256. fragmentShader: shader.fragmentShader
  14257. };
  14258. } else {
  14259. materialProperties.shader = {
  14260. name: material.type,
  14261. uniforms: material.uniforms,
  14262. vertexShader: material.vertexShader,
  14263. fragmentShader: material.fragmentShader
  14264. };
  14265. }
  14266. material.onBeforeCompile( materialProperties.shader, _this );
  14267. // Computing code again as onBeforeCompile may have changed the shaders
  14268. code = programCache.getProgramCode( material, parameters );
  14269. program = programCache.acquireProgram( material, materialProperties.shader, parameters, code );
  14270. materialProperties.program = program;
  14271. material.program = program;
  14272. }
  14273. var programAttributes = program.getAttributes();
  14274. if ( material.morphTargets ) {
  14275. material.numSupportedMorphTargets = 0;
  14276. for ( var i = 0; i < _this.maxMorphTargets; i ++ ) {
  14277. if ( programAttributes[ 'morphTarget' + i ] >= 0 ) {
  14278. material.numSupportedMorphTargets ++;
  14279. }
  14280. }
  14281. }
  14282. if ( material.morphNormals ) {
  14283. material.numSupportedMorphNormals = 0;
  14284. for ( var i = 0; i < _this.maxMorphNormals; i ++ ) {
  14285. if ( programAttributes[ 'morphNormal' + i ] >= 0 ) {
  14286. material.numSupportedMorphNormals ++;
  14287. }
  14288. }
  14289. }
  14290. var uniforms = materialProperties.shader.uniforms;
  14291. if ( ! material.isShaderMaterial &&
  14292. ! material.isRawShaderMaterial ||
  14293. material.clipping === true ) {
  14294. materialProperties.numClippingPlanes = _clipping.numPlanes;
  14295. materialProperties.numIntersection = _clipping.numIntersection;
  14296. uniforms.clippingPlanes = _clipping.uniform;
  14297. }
  14298. materialProperties.fog = fog;
  14299. // store the light setup it was created for
  14300. if ( lightsHash === undefined ) {
  14301. materialProperties.lightsHash = lightsHash = {};
  14302. }
  14303. lightsHash.stateID = lightsStateHash.stateID;
  14304. lightsHash.directionalLength = lightsStateHash.directionalLength;
  14305. lightsHash.pointLength = lightsStateHash.pointLength;
  14306. lightsHash.spotLength = lightsStateHash.spotLength;
  14307. lightsHash.rectAreaLength = lightsStateHash.rectAreaLength;
  14308. lightsHash.hemiLength = lightsStateHash.hemiLength;
  14309. lightsHash.shadowsLength = lightsStateHash.shadowsLength;
  14310. if ( material.lights ) {
  14311. // wire up the material to this renderer's lighting state
  14312. uniforms.ambientLightColor.value = lights.state.ambient;
  14313. uniforms.directionalLights.value = lights.state.directional;
  14314. uniforms.spotLights.value = lights.state.spot;
  14315. uniforms.rectAreaLights.value = lights.state.rectArea;
  14316. uniforms.pointLights.value = lights.state.point;
  14317. uniforms.hemisphereLights.value = lights.state.hemi;
  14318. uniforms.directionalShadowMap.value = lights.state.directionalShadowMap;
  14319. uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;
  14320. uniforms.spotShadowMap.value = lights.state.spotShadowMap;
  14321. uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;
  14322. uniforms.pointShadowMap.value = lights.state.pointShadowMap;
  14323. uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;
  14324. // TODO (abelnation): add area lights shadow info to uniforms
  14325. }
  14326. var progUniforms = materialProperties.program.getUniforms(),
  14327. uniformsList =
  14328. WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );
  14329. materialProperties.uniformsList = uniformsList;
  14330. }
  14331. function setProgram( camera, fog, material, object ) {
  14332. _usedTextureUnits = 0;
  14333. var materialProperties = properties.get( material );
  14334. var lights = currentRenderState.state.lights;
  14335. var lightsHash = materialProperties.lightsHash;
  14336. var lightsStateHash = lights.state.hash;
  14337. if ( _clippingEnabled ) {
  14338. if ( _localClippingEnabled || camera !== _currentCamera ) {
  14339. var useCache =
  14340. camera === _currentCamera &&
  14341. material.id === _currentMaterialId;
  14342. // we might want to call this function with some ClippingGroup
  14343. // object instead of the material, once it becomes feasible
  14344. // (#8465, #8379)
  14345. _clipping.setState(
  14346. material.clippingPlanes, material.clipIntersection, material.clipShadows,
  14347. camera, materialProperties, useCache );
  14348. }
  14349. }
  14350. if ( material.needsUpdate === false ) {
  14351. if ( materialProperties.program === undefined ) {
  14352. material.needsUpdate = true;
  14353. } else if ( material.fog && materialProperties.fog !== fog ) {
  14354. material.needsUpdate = true;
  14355. } else if ( material.lights && ( lightsHash.stateID !== lightsStateHash.stateID ||
  14356. lightsHash.directionalLength !== lightsStateHash.directionalLength ||
  14357. lightsHash.pointLength !== lightsStateHash.pointLength ||
  14358. lightsHash.spotLength !== lightsStateHash.spotLength ||
  14359. lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength ||
  14360. lightsHash.hemiLength !== lightsStateHash.hemiLength ||
  14361. lightsHash.shadowsLength !== lightsStateHash.shadowsLength ) ) {
  14362. material.needsUpdate = true;
  14363. } else if ( materialProperties.numClippingPlanes !== undefined &&
  14364. ( materialProperties.numClippingPlanes !== _clipping.numPlanes ||
  14365. materialProperties.numIntersection !== _clipping.numIntersection ) ) {
  14366. material.needsUpdate = true;
  14367. }
  14368. }
  14369. if ( material.needsUpdate ) {
  14370. initMaterial( material, fog, object );
  14371. material.needsUpdate = false;
  14372. }
  14373. var refreshProgram = false;
  14374. var refreshMaterial = false;
  14375. var refreshLights = false;
  14376. var program = materialProperties.program,
  14377. p_uniforms = program.getUniforms(),
  14378. m_uniforms = materialProperties.shader.uniforms;
  14379. if ( state.useProgram( program.program ) ) {
  14380. refreshProgram = true;
  14381. refreshMaterial = true;
  14382. refreshLights = true;
  14383. }
  14384. if ( material.id !== _currentMaterialId ) {
  14385. _currentMaterialId = material.id;
  14386. refreshMaterial = true;
  14387. }
  14388. if ( refreshProgram || camera !== _currentCamera ) {
  14389. p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
  14390. if ( capabilities.logarithmicDepthBuffer ) {
  14391. p_uniforms.setValue( _gl, 'logDepthBufFC',
  14392. 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
  14393. }
  14394. // Avoid unneeded uniform updates per ArrayCamera's sub-camera
  14395. if ( _currentCamera !== ( _currentArrayCamera || camera ) ) {
  14396. _currentCamera = ( _currentArrayCamera || camera );
  14397. // lighting uniforms depend on the camera so enforce an update
  14398. // now, in case this material supports lights - or later, when
  14399. // the next material that does gets activated:
  14400. refreshMaterial = true; // set to true on material change
  14401. refreshLights = true; // remains set until update done
  14402. }
  14403. // load material specific uniforms
  14404. // (shader material also gets them for the sake of genericity)
  14405. if ( material.isShaderMaterial ||
  14406. material.isMeshPhongMaterial ||
  14407. material.isMeshStandardMaterial ||
  14408. material.envMap ) {
  14409. var uCamPos = p_uniforms.map.cameraPosition;
  14410. if ( uCamPos !== undefined ) {
  14411. uCamPos.setValue( _gl,
  14412. _vector3.setFromMatrixPosition( camera.matrixWorld ) );
  14413. }
  14414. }
  14415. if ( material.isMeshPhongMaterial ||
  14416. material.isMeshLambertMaterial ||
  14417. material.isMeshBasicMaterial ||
  14418. material.isMeshStandardMaterial ||
  14419. material.isShaderMaterial ||
  14420. material.skinning ) {
  14421. p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
  14422. }
  14423. }
  14424. // skinning uniforms must be set even if material didn't change
  14425. // auto-setting of texture unit for bone texture must go before other textures
  14426. // not sure why, but otherwise weird things happen
  14427. if ( material.skinning ) {
  14428. p_uniforms.setOptional( _gl, object, 'bindMatrix' );
  14429. p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );
  14430. var skeleton = object.skeleton;
  14431. if ( skeleton ) {
  14432. var bones = skeleton.bones;
  14433. if ( capabilities.floatVertexTextures ) {
  14434. if ( skeleton.boneTexture === undefined ) {
  14435. // layout (1 matrix = 4 pixels)
  14436. // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)
  14437. // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)
  14438. // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)
  14439. // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)
  14440. // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)
  14441. var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix
  14442. size = _Math.ceilPowerOfTwo( size );
  14443. size = Math.max( size, 4 );
  14444. var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel
  14445. boneMatrices.set( skeleton.boneMatrices ); // copy current values
  14446. var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );
  14447. boneTexture.needsUpdate = true;
  14448. skeleton.boneMatrices = boneMatrices;
  14449. skeleton.boneTexture = boneTexture;
  14450. skeleton.boneTextureSize = size;
  14451. }
  14452. p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture );
  14453. p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );
  14454. } else {
  14455. p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );
  14456. }
  14457. }
  14458. }
  14459. if ( refreshMaterial ) {
  14460. p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );
  14461. p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint );
  14462. if ( material.lights ) {
  14463. // the current material requires lighting info
  14464. // note: all lighting uniforms are always set correctly
  14465. // they simply reference the renderer's state for their
  14466. // values
  14467. //
  14468. // use the current material's .needsUpdate flags to set
  14469. // the GL state when required
  14470. markUniformsLightsNeedsUpdate( m_uniforms, refreshLights );
  14471. }
  14472. // refresh uniforms common to several materials
  14473. if ( fog && material.fog ) {
  14474. refreshUniformsFog( m_uniforms, fog );
  14475. }
  14476. if ( material.isMeshBasicMaterial ) {
  14477. refreshUniformsCommon( m_uniforms, material );
  14478. } else if ( material.isMeshLambertMaterial ) {
  14479. refreshUniformsCommon( m_uniforms, material );
  14480. refreshUniformsLambert( m_uniforms, material );
  14481. } else if ( material.isMeshPhongMaterial ) {
  14482. refreshUniformsCommon( m_uniforms, material );
  14483. if ( material.isMeshToonMaterial ) {
  14484. refreshUniformsToon( m_uniforms, material );
  14485. } else {
  14486. refreshUniformsPhong( m_uniforms, material );
  14487. }
  14488. } else if ( material.isMeshStandardMaterial ) {
  14489. refreshUniformsCommon( m_uniforms, material );
  14490. if ( material.isMeshPhysicalMaterial ) {
  14491. refreshUniformsPhysical( m_uniforms, material );
  14492. } else {
  14493. refreshUniformsStandard( m_uniforms, material );
  14494. }
  14495. } else if ( material.isMeshDepthMaterial ) {
  14496. refreshUniformsCommon( m_uniforms, material );
  14497. refreshUniformsDepth( m_uniforms, material );
  14498. } else if ( material.isMeshDistanceMaterial ) {
  14499. refreshUniformsCommon( m_uniforms, material );
  14500. refreshUniformsDistance( m_uniforms, material );
  14501. } else if ( material.isMeshNormalMaterial ) {
  14502. refreshUniformsCommon( m_uniforms, material );
  14503. refreshUniformsNormal( m_uniforms, material );
  14504. } else if ( material.isLineBasicMaterial ) {
  14505. refreshUniformsLine( m_uniforms, material );
  14506. if ( material.isLineDashedMaterial ) {
  14507. refreshUniformsDash( m_uniforms, material );
  14508. }
  14509. } else if ( material.isPointsMaterial ) {
  14510. refreshUniformsPoints( m_uniforms, material );
  14511. } else if ( material.isSpriteMaterial ) {
  14512. refreshUniformsSprites( m_uniforms, material );
  14513. } else if ( material.isShadowMaterial ) {
  14514. m_uniforms.color.value = material.color;
  14515. m_uniforms.opacity.value = material.opacity;
  14516. }
  14517. // RectAreaLight Texture
  14518. // TODO (mrdoob): Find a nicer implementation
  14519. if ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1;
  14520. if ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2;
  14521. WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this );
  14522. }
  14523. if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {
  14524. WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this );
  14525. material.uniformsNeedUpdate = false;
  14526. }
  14527. if ( material.isSpriteMaterial ) {
  14528. p_uniforms.setValue( _gl, 'center', object.center );
  14529. }
  14530. // common matrices
  14531. p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );
  14532. p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );
  14533. p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );
  14534. return program;
  14535. }
  14536. // Uniforms (refresh uniforms objects)
  14537. function refreshUniformsCommon( uniforms, material ) {
  14538. uniforms.opacity.value = material.opacity;
  14539. if ( material.color ) {
  14540. uniforms.diffuse.value = material.color;
  14541. }
  14542. if ( material.emissive ) {
  14543. uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );
  14544. }
  14545. if ( material.map ) {
  14546. uniforms.map.value = material.map;
  14547. }
  14548. if ( material.alphaMap ) {
  14549. uniforms.alphaMap.value = material.alphaMap;
  14550. }
  14551. if ( material.specularMap ) {
  14552. uniforms.specularMap.value = material.specularMap;
  14553. }
  14554. if ( material.envMap ) {
  14555. uniforms.envMap.value = material.envMap;
  14556. // don't flip CubeTexture envMaps, flip everything else:
  14557. // WebGLRenderTargetCube will be flipped for backwards compatibility
  14558. // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture
  14559. // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future
  14560. uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;
  14561. uniforms.reflectivity.value = material.reflectivity;
  14562. uniforms.refractionRatio.value = material.refractionRatio;
  14563. uniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel;
  14564. }
  14565. if ( material.lightMap ) {
  14566. uniforms.lightMap.value = material.lightMap;
  14567. uniforms.lightMapIntensity.value = material.lightMapIntensity;
  14568. }
  14569. if ( material.aoMap ) {
  14570. uniforms.aoMap.value = material.aoMap;
  14571. uniforms.aoMapIntensity.value = material.aoMapIntensity;
  14572. }
  14573. // uv repeat and offset setting priorities
  14574. // 1. color map
  14575. // 2. specular map
  14576. // 3. normal map
  14577. // 4. bump map
  14578. // 5. alpha map
  14579. // 6. emissive map
  14580. var uvScaleMap;
  14581. if ( material.map ) {
  14582. uvScaleMap = material.map;
  14583. } else if ( material.specularMap ) {
  14584. uvScaleMap = material.specularMap;
  14585. } else if ( material.displacementMap ) {
  14586. uvScaleMap = material.displacementMap;
  14587. } else if ( material.normalMap ) {
  14588. uvScaleMap = material.normalMap;
  14589. } else if ( material.bumpMap ) {
  14590. uvScaleMap = material.bumpMap;
  14591. } else if ( material.roughnessMap ) {
  14592. uvScaleMap = material.roughnessMap;
  14593. } else if ( material.metalnessMap ) {
  14594. uvScaleMap = material.metalnessMap;
  14595. } else if ( material.alphaMap ) {
  14596. uvScaleMap = material.alphaMap;
  14597. } else if ( material.emissiveMap ) {
  14598. uvScaleMap = material.emissiveMap;
  14599. }
  14600. if ( uvScaleMap !== undefined ) {
  14601. // backwards compatibility
  14602. if ( uvScaleMap.isWebGLRenderTarget ) {
  14603. uvScaleMap = uvScaleMap.texture;
  14604. }
  14605. if ( uvScaleMap.matrixAutoUpdate === true ) {
  14606. uvScaleMap.updateMatrix();
  14607. }
  14608. uniforms.uvTransform.value.copy( uvScaleMap.matrix );
  14609. }
  14610. }
  14611. function refreshUniformsLine( uniforms, material ) {
  14612. uniforms.diffuse.value = material.color;
  14613. uniforms.opacity.value = material.opacity;
  14614. }
  14615. function refreshUniformsDash( uniforms, material ) {
  14616. uniforms.dashSize.value = material.dashSize;
  14617. uniforms.totalSize.value = material.dashSize + material.gapSize;
  14618. uniforms.scale.value = material.scale;
  14619. }
  14620. function refreshUniformsPoints( uniforms, material ) {
  14621. uniforms.diffuse.value = material.color;
  14622. uniforms.opacity.value = material.opacity;
  14623. uniforms.size.value = material.size * _pixelRatio;
  14624. uniforms.scale.value = _height * 0.5;
  14625. uniforms.map.value = material.map;
  14626. if ( material.map !== null ) {
  14627. if ( material.map.matrixAutoUpdate === true ) {
  14628. material.map.updateMatrix();
  14629. }
  14630. uniforms.uvTransform.value.copy( material.map.matrix );
  14631. }
  14632. }
  14633. function refreshUniformsSprites( uniforms, material ) {
  14634. uniforms.diffuse.value = material.color;
  14635. uniforms.opacity.value = material.opacity;
  14636. uniforms.rotation.value = material.rotation;
  14637. uniforms.map.value = material.map;
  14638. if ( material.map !== null ) {
  14639. if ( material.map.matrixAutoUpdate === true ) {
  14640. material.map.updateMatrix();
  14641. }
  14642. uniforms.uvTransform.value.copy( material.map.matrix );
  14643. }
  14644. }
  14645. function refreshUniformsFog( uniforms, fog ) {
  14646. uniforms.fogColor.value = fog.color;
  14647. if ( fog.isFog ) {
  14648. uniforms.fogNear.value = fog.near;
  14649. uniforms.fogFar.value = fog.far;
  14650. } else if ( fog.isFogExp2 ) {
  14651. uniforms.fogDensity.value = fog.density;
  14652. }
  14653. }
  14654. function refreshUniformsLambert( uniforms, material ) {
  14655. if ( material.emissiveMap ) {
  14656. uniforms.emissiveMap.value = material.emissiveMap;
  14657. }
  14658. }
  14659. function refreshUniformsPhong( uniforms, material ) {
  14660. uniforms.specular.value = material.specular;
  14661. uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )
  14662. if ( material.emissiveMap ) {
  14663. uniforms.emissiveMap.value = material.emissiveMap;
  14664. }
  14665. if ( material.bumpMap ) {
  14666. uniforms.bumpMap.value = material.bumpMap;
  14667. uniforms.bumpScale.value = material.bumpScale;
  14668. if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
  14669. }
  14670. if ( material.normalMap ) {
  14671. uniforms.normalMap.value = material.normalMap;
  14672. uniforms.normalScale.value.copy( material.normalScale );
  14673. if ( material.side === BackSide ) uniforms.normalScale.value.negate();
  14674. }
  14675. if ( material.displacementMap ) {
  14676. uniforms.displacementMap.value = material.displacementMap;
  14677. uniforms.displacementScale.value = material.displacementScale;
  14678. uniforms.displacementBias.value = material.displacementBias;
  14679. }
  14680. }
  14681. function refreshUniformsToon( uniforms, material ) {
  14682. refreshUniformsPhong( uniforms, material );
  14683. if ( material.gradientMap ) {
  14684. uniforms.gradientMap.value = material.gradientMap;
  14685. }
  14686. }
  14687. function refreshUniformsStandard( uniforms, material ) {
  14688. uniforms.roughness.value = material.roughness;
  14689. uniforms.metalness.value = material.metalness;
  14690. if ( material.roughnessMap ) {
  14691. uniforms.roughnessMap.value = material.roughnessMap;
  14692. }
  14693. if ( material.metalnessMap ) {
  14694. uniforms.metalnessMap.value = material.metalnessMap;
  14695. }
  14696. if ( material.emissiveMap ) {
  14697. uniforms.emissiveMap.value = material.emissiveMap;
  14698. }
  14699. if ( material.bumpMap ) {
  14700. uniforms.bumpMap.value = material.bumpMap;
  14701. uniforms.bumpScale.value = material.bumpScale;
  14702. if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
  14703. }
  14704. if ( material.normalMap ) {
  14705. uniforms.normalMap.value = material.normalMap;
  14706. uniforms.normalScale.value.copy( material.normalScale );
  14707. if ( material.side === BackSide ) uniforms.normalScale.value.negate();
  14708. }
  14709. if ( material.displacementMap ) {
  14710. uniforms.displacementMap.value = material.displacementMap;
  14711. uniforms.displacementScale.value = material.displacementScale;
  14712. uniforms.displacementBias.value = material.displacementBias;
  14713. }
  14714. if ( material.envMap ) {
  14715. //uniforms.envMap.value = material.envMap; // part of uniforms common
  14716. uniforms.envMapIntensity.value = material.envMapIntensity;
  14717. }
  14718. }
  14719. function refreshUniformsPhysical( uniforms, material ) {
  14720. refreshUniformsStandard( uniforms, material );
  14721. uniforms.reflectivity.value = material.reflectivity; // also part of uniforms common
  14722. uniforms.clearCoat.value = material.clearCoat;
  14723. uniforms.clearCoatRoughness.value = material.clearCoatRoughness;
  14724. }
  14725. function refreshUniformsDepth( uniforms, material ) {
  14726. if ( material.displacementMap ) {
  14727. uniforms.displacementMap.value = material.displacementMap;
  14728. uniforms.displacementScale.value = material.displacementScale;
  14729. uniforms.displacementBias.value = material.displacementBias;
  14730. }
  14731. }
  14732. function refreshUniformsDistance( uniforms, material ) {
  14733. if ( material.displacementMap ) {
  14734. uniforms.displacementMap.value = material.displacementMap;
  14735. uniforms.displacementScale.value = material.displacementScale;
  14736. uniforms.displacementBias.value = material.displacementBias;
  14737. }
  14738. uniforms.referencePosition.value.copy( material.referencePosition );
  14739. uniforms.nearDistance.value = material.nearDistance;
  14740. uniforms.farDistance.value = material.farDistance;
  14741. }
  14742. function refreshUniformsNormal( uniforms, material ) {
  14743. if ( material.bumpMap ) {
  14744. uniforms.bumpMap.value = material.bumpMap;
  14745. uniforms.bumpScale.value = material.bumpScale;
  14746. if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
  14747. }
  14748. if ( material.normalMap ) {
  14749. uniforms.normalMap.value = material.normalMap;
  14750. uniforms.normalScale.value.copy( material.normalScale );
  14751. if ( material.side === BackSide ) uniforms.normalScale.value.negate();
  14752. }
  14753. if ( material.displacementMap ) {
  14754. uniforms.displacementMap.value = material.displacementMap;
  14755. uniforms.displacementScale.value = material.displacementScale;
  14756. uniforms.displacementBias.value = material.displacementBias;
  14757. }
  14758. }
  14759. // If uniforms are marked as clean, they don't need to be loaded to the GPU.
  14760. function markUniformsLightsNeedsUpdate( uniforms, value ) {
  14761. uniforms.ambientLightColor.needsUpdate = value;
  14762. uniforms.directionalLights.needsUpdate = value;
  14763. uniforms.pointLights.needsUpdate = value;
  14764. uniforms.spotLights.needsUpdate = value;
  14765. uniforms.rectAreaLights.needsUpdate = value;
  14766. uniforms.hemisphereLights.needsUpdate = value;
  14767. }
  14768. // Textures
  14769. function allocTextureUnit() {
  14770. var textureUnit = _usedTextureUnits;
  14771. if ( textureUnit >= capabilities.maxTextures ) {
  14772. console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );
  14773. }
  14774. _usedTextureUnits += 1;
  14775. return textureUnit;
  14776. }
  14777. this.allocTextureUnit = allocTextureUnit;
  14778. // this.setTexture2D = setTexture2D;
  14779. this.setTexture2D = ( function () {
  14780. var warned = false;
  14781. // backwards compatibility: peel texture.texture
  14782. return function setTexture2D( texture, slot ) {
  14783. if ( texture && texture.isWebGLRenderTarget ) {
  14784. if ( ! warned ) {
  14785. console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." );
  14786. warned = true;
  14787. }
  14788. texture = texture.texture;
  14789. }
  14790. textures.setTexture2D( texture, slot );
  14791. };
  14792. }() );
  14793. this.setTexture = ( function () {
  14794. var warned = false;
  14795. return function setTexture( texture, slot ) {
  14796. if ( ! warned ) {
  14797. console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." );
  14798. warned = true;
  14799. }
  14800. textures.setTexture2D( texture, slot );
  14801. };
  14802. }() );
  14803. this.setTextureCube = ( function () {
  14804. var warned = false;
  14805. return function setTextureCube( texture, slot ) {
  14806. // backwards compatibility: peel texture.texture
  14807. if ( texture && texture.isWebGLRenderTargetCube ) {
  14808. if ( ! warned ) {
  14809. console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." );
  14810. warned = true;
  14811. }
  14812. texture = texture.texture;
  14813. }
  14814. // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture
  14815. // TODO: unify these code paths
  14816. if ( ( texture && texture.isCubeTexture ) ||
  14817. ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {
  14818. // CompressedTexture can have Array in image :/
  14819. // this function alone should take care of cube textures
  14820. textures.setTextureCube( texture, slot );
  14821. } else {
  14822. // assumed: texture property of THREE.WebGLRenderTargetCube
  14823. textures.setTextureCubeDynamic( texture, slot );
  14824. }
  14825. };
  14826. }() );
  14827. //
  14828. this.setFramebuffer = function ( value ) {
  14829. _framebuffer = value;
  14830. };
  14831. this.getRenderTarget = function () {
  14832. return _currentRenderTarget;
  14833. };
  14834. this.setRenderTarget = function ( renderTarget ) {
  14835. _currentRenderTarget = renderTarget;
  14836. if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {
  14837. textures.setupRenderTarget( renderTarget );
  14838. }
  14839. var framebuffer = _framebuffer;
  14840. var isCube = false;
  14841. if ( renderTarget ) {
  14842. var __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;
  14843. if ( renderTarget.isWebGLRenderTargetCube ) {
  14844. framebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ];
  14845. isCube = true;
  14846. } else {
  14847. framebuffer = __webglFramebuffer;
  14848. }
  14849. _currentViewport.copy( renderTarget.viewport );
  14850. _currentScissor.copy( renderTarget.scissor );
  14851. _currentScissorTest = renderTarget.scissorTest;
  14852. } else {
  14853. _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );
  14854. _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );
  14855. _currentScissorTest = _scissorTest;
  14856. }
  14857. if ( _currentFramebuffer !== framebuffer ) {
  14858. _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
  14859. _currentFramebuffer = framebuffer;
  14860. }
  14861. state.viewport( _currentViewport );
  14862. state.scissor( _currentScissor );
  14863. state.setScissorTest( _currentScissorTest );
  14864. if ( isCube ) {
  14865. var textureProperties = properties.get( renderTarget.texture );
  14866. _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );
  14867. }
  14868. };
  14869. this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {
  14870. if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
  14871. console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );
  14872. return;
  14873. }
  14874. var framebuffer = properties.get( renderTarget ).__webglFramebuffer;
  14875. if ( framebuffer ) {
  14876. var restore = false;
  14877. if ( framebuffer !== _currentFramebuffer ) {
  14878. _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
  14879. restore = true;
  14880. }
  14881. try {
  14882. var texture = renderTarget.texture;
  14883. var textureFormat = texture.format;
  14884. var textureType = texture.type;
  14885. if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
  14886. console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
  14887. return;
  14888. }
  14889. if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)
  14890. ! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox
  14891. ! ( textureType === HalfFloatType && ( capabilities.isWebGL2 ? extensions.get( 'EXT_color_buffer_float' ) : extensions.get( 'EXT_color_buffer_half_float' ) ) ) ) {
  14892. console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
  14893. return;
  14894. }
  14895. if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {
  14896. // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)
  14897. if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {
  14898. _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );
  14899. }
  14900. } else {
  14901. console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );
  14902. }
  14903. } finally {
  14904. if ( restore ) {
  14905. _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );
  14906. }
  14907. }
  14908. }
  14909. };
  14910. this.copyFramebufferToTexture = function ( position, texture, level ) {
  14911. var width = texture.image.width;
  14912. var height = texture.image.height;
  14913. var glFormat = utils.convert( texture.format );
  14914. this.setTexture2D( texture, 0 );
  14915. _gl.copyTexImage2D( _gl.TEXTURE_2D, level || 0, glFormat, position.x, position.y, width, height, 0 );
  14916. };
  14917. this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) {
  14918. var width = srcTexture.image.width;
  14919. var height = srcTexture.image.height;
  14920. var glFormat = utils.convert( dstTexture.format );
  14921. var glType = utils.convert( dstTexture.type );
  14922. this.setTexture2D( dstTexture, 0 );
  14923. if ( srcTexture.isDataTexture ) {
  14924. _gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );
  14925. } else {
  14926. _gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, glFormat, glType, srcTexture.image );
  14927. }
  14928. };
  14929. }
  14930. /**
  14931. * @author mrdoob / http://mrdoob.com/
  14932. * @author alteredq / http://alteredqualia.com/
  14933. */
  14934. function FogExp2( color, density ) {
  14935. this.name = '';
  14936. this.color = new Color( color );
  14937. this.density = ( density !== undefined ) ? density : 0.00025;
  14938. }
  14939. FogExp2.prototype.isFogExp2 = true;
  14940. FogExp2.prototype.clone = function () {
  14941. return new FogExp2( this.color, this.density );
  14942. };
  14943. FogExp2.prototype.toJSON = function ( /* meta */ ) {
  14944. return {
  14945. type: 'FogExp2',
  14946. color: this.color.getHex(),
  14947. density: this.density
  14948. };
  14949. };
  14950. /**
  14951. * @author mrdoob / http://mrdoob.com/
  14952. * @author alteredq / http://alteredqualia.com/
  14953. */
  14954. function Fog( color, near, far ) {
  14955. this.name = '';
  14956. this.color = new Color( color );
  14957. this.near = ( near !== undefined ) ? near : 1;
  14958. this.far = ( far !== undefined ) ? far : 1000;
  14959. }
  14960. Fog.prototype.isFog = true;
  14961. Fog.prototype.clone = function () {
  14962. return new Fog( this.color, this.near, this.far );
  14963. };
  14964. Fog.prototype.toJSON = function ( /* meta */ ) {
  14965. return {
  14966. type: 'Fog',
  14967. color: this.color.getHex(),
  14968. near: this.near,
  14969. far: this.far
  14970. };
  14971. };
  14972. /**
  14973. * @author mrdoob / http://mrdoob.com/
  14974. */
  14975. function Scene() {
  14976. Object3D.call( this );
  14977. this.type = 'Scene';
  14978. this.background = null;
  14979. this.fog = null;
  14980. this.overrideMaterial = null;
  14981. this.autoUpdate = true; // checked by the renderer
  14982. }
  14983. Scene.prototype = Object.assign( Object.create( Object3D.prototype ), {
  14984. constructor: Scene,
  14985. copy: function ( source, recursive ) {
  14986. Object3D.prototype.copy.call( this, source, recursive );
  14987. if ( source.background !== null ) this.background = source.background.clone();
  14988. if ( source.fog !== null ) this.fog = source.fog.clone();
  14989. if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();
  14990. this.autoUpdate = source.autoUpdate;
  14991. this.matrixAutoUpdate = source.matrixAutoUpdate;
  14992. return this;
  14993. },
  14994. toJSON: function ( meta ) {
  14995. var data = Object3D.prototype.toJSON.call( this, meta );
  14996. if ( this.background !== null ) data.object.background = this.background.toJSON( meta );
  14997. if ( this.fog !== null ) data.object.fog = this.fog.toJSON();
  14998. return data;
  14999. }
  15000. } );
  15001. /**
  15002. * @author benaadams / https://twitter.com/ben_a_adams
  15003. */
  15004. function InterleavedBuffer( array, stride ) {
  15005. this.array = array;
  15006. this.stride = stride;
  15007. this.count = array !== undefined ? array.length / stride : 0;
  15008. this.dynamic = false;
  15009. this.updateRange = { offset: 0, count: - 1 };
  15010. this.version = 0;
  15011. }
  15012. Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', {
  15013. set: function ( value ) {
  15014. if ( value === true ) this.version ++;
  15015. }
  15016. } );
  15017. Object.assign( InterleavedBuffer.prototype, {
  15018. isInterleavedBuffer: true,
  15019. onUploadCallback: function () {},
  15020. setArray: function ( array ) {
  15021. if ( Array.isArray( array ) ) {
  15022. throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );
  15023. }
  15024. this.count = array !== undefined ? array.length / this.stride : 0;
  15025. this.array = array;
  15026. return this;
  15027. },
  15028. setDynamic: function ( value ) {
  15029. this.dynamic = value;
  15030. return this;
  15031. },
  15032. copy: function ( source ) {
  15033. this.array = new source.array.constructor( source.array );
  15034. this.count = source.count;
  15035. this.stride = source.stride;
  15036. this.dynamic = source.dynamic;
  15037. return this;
  15038. },
  15039. copyAt: function ( index1, attribute, index2 ) {
  15040. index1 *= this.stride;
  15041. index2 *= attribute.stride;
  15042. for ( var i = 0, l = this.stride; i < l; i ++ ) {
  15043. this.array[ index1 + i ] = attribute.array[ index2 + i ];
  15044. }
  15045. return this;
  15046. },
  15047. set: function ( value, offset ) {
  15048. if ( offset === undefined ) offset = 0;
  15049. this.array.set( value, offset );
  15050. return this;
  15051. },
  15052. clone: function () {
  15053. return new this.constructor().copy( this );
  15054. },
  15055. onUpload: function ( callback ) {
  15056. this.onUploadCallback = callback;
  15057. return this;
  15058. }
  15059. } );
  15060. /**
  15061. * @author benaadams / https://twitter.com/ben_a_adams
  15062. */
  15063. function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {
  15064. this.data = interleavedBuffer;
  15065. this.itemSize = itemSize;
  15066. this.offset = offset;
  15067. this.normalized = normalized === true;
  15068. }
  15069. Object.defineProperties( InterleavedBufferAttribute.prototype, {
  15070. count: {
  15071. get: function () {
  15072. return this.data.count;
  15073. }
  15074. },
  15075. array: {
  15076. get: function () {
  15077. return this.data.array;
  15078. }
  15079. }
  15080. } );
  15081. Object.assign( InterleavedBufferAttribute.prototype, {
  15082. isInterleavedBufferAttribute: true,
  15083. setX: function ( index, x ) {
  15084. this.data.array[ index * this.data.stride + this.offset ] = x;
  15085. return this;
  15086. },
  15087. setY: function ( index, y ) {
  15088. this.data.array[ index * this.data.stride + this.offset + 1 ] = y;
  15089. return this;
  15090. },
  15091. setZ: function ( index, z ) {
  15092. this.data.array[ index * this.data.stride + this.offset + 2 ] = z;
  15093. return this;
  15094. },
  15095. setW: function ( index, w ) {
  15096. this.data.array[ index * this.data.stride + this.offset + 3 ] = w;
  15097. return this;
  15098. },
  15099. getX: function ( index ) {
  15100. return this.data.array[ index * this.data.stride + this.offset ];
  15101. },
  15102. getY: function ( index ) {
  15103. return this.data.array[ index * this.data.stride + this.offset + 1 ];
  15104. },
  15105. getZ: function ( index ) {
  15106. return this.data.array[ index * this.data.stride + this.offset + 2 ];
  15107. },
  15108. getW: function ( index ) {
  15109. return this.data.array[ index * this.data.stride + this.offset + 3 ];
  15110. },
  15111. setXY: function ( index, x, y ) {
  15112. index = index * this.data.stride + this.offset;
  15113. this.data.array[ index + 0 ] = x;
  15114. this.data.array[ index + 1 ] = y;
  15115. return this;
  15116. },
  15117. setXYZ: function ( index, x, y, z ) {
  15118. index = index * this.data.stride + this.offset;
  15119. this.data.array[ index + 0 ] = x;
  15120. this.data.array[ index + 1 ] = y;
  15121. this.data.array[ index + 2 ] = z;
  15122. return this;
  15123. },
  15124. setXYZW: function ( index, x, y, z, w ) {
  15125. index = index * this.data.stride + this.offset;
  15126. this.data.array[ index + 0 ] = x;
  15127. this.data.array[ index + 1 ] = y;
  15128. this.data.array[ index + 2 ] = z;
  15129. this.data.array[ index + 3 ] = w;
  15130. return this;
  15131. }
  15132. } );
  15133. /**
  15134. * @author alteredq / http://alteredqualia.com/
  15135. *
  15136. * parameters = {
  15137. * color: <hex>,
  15138. * opacity: <float>,
  15139. * map: new THREE.Texture( <Image> ),
  15140. *
  15141. * uvOffset: new THREE.Vector2(),
  15142. * uvScale: new THREE.Vector2()
  15143. * }
  15144. */
  15145. function SpriteMaterial( parameters ) {
  15146. Material.call( this );
  15147. this.type = 'SpriteMaterial';
  15148. this.color = new Color( 0xffffff );
  15149. this.map = null;
  15150. this.rotation = 0;
  15151. this.lights = false;
  15152. this.transparent = true;
  15153. this.setValues( parameters );
  15154. }
  15155. SpriteMaterial.prototype = Object.create( Material.prototype );
  15156. SpriteMaterial.prototype.constructor = SpriteMaterial;
  15157. SpriteMaterial.prototype.isSpriteMaterial = true;
  15158. SpriteMaterial.prototype.copy = function ( source ) {
  15159. Material.prototype.copy.call( this, source );
  15160. this.color.copy( source.color );
  15161. this.map = source.map;
  15162. this.rotation = source.rotation;
  15163. return this;
  15164. };
  15165. /**
  15166. * @author mikael emtinger / http://gomo.se/
  15167. * @author alteredq / http://alteredqualia.com/
  15168. */
  15169. var geometry;
  15170. function Sprite( material ) {
  15171. Object3D.call( this );
  15172. this.type = 'Sprite';
  15173. if ( geometry === undefined ) {
  15174. geometry = new BufferGeometry();
  15175. var float32Array = new Float32Array( [
  15176. - 0.5, - 0.5, 0, 0, 0,
  15177. 0.5, - 0.5, 0, 1, 0,
  15178. 0.5, 0.5, 0, 1, 1,
  15179. - 0.5, 0.5, 0, 0, 1
  15180. ] );
  15181. var interleavedBuffer = new InterleavedBuffer( float32Array, 5 );
  15182. geometry.setIndex( [ 0, 1, 2, 0, 2, 3 ] );
  15183. geometry.addAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );
  15184. geometry.addAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );
  15185. }
  15186. this.geometry = geometry;
  15187. this.material = ( material !== undefined ) ? material : new SpriteMaterial();
  15188. this.center = new Vector2( 0.5, 0.5 );
  15189. }
  15190. Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), {
  15191. constructor: Sprite,
  15192. isSprite: true,
  15193. raycast: ( function () {
  15194. var intersectPoint = new Vector3();
  15195. var worldScale = new Vector3();
  15196. var mvPosition = new Vector3();
  15197. var alignedPosition = new Vector2();
  15198. var rotatedPosition = new Vector2();
  15199. var viewWorldMatrix = new Matrix4();
  15200. var vA = new Vector3();
  15201. var vB = new Vector3();
  15202. var vC = new Vector3();
  15203. function transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {
  15204. // compute position in camera space
  15205. alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );
  15206. // to check if rotation is not zero
  15207. if ( sin !== undefined ) {
  15208. rotatedPosition.x = ( cos * alignedPosition.x ) - ( sin * alignedPosition.y );
  15209. rotatedPosition.y = ( sin * alignedPosition.x ) + ( cos * alignedPosition.y );
  15210. } else {
  15211. rotatedPosition.copy( alignedPosition );
  15212. }
  15213. vertexPosition.copy( mvPosition );
  15214. vertexPosition.x += rotatedPosition.x;
  15215. vertexPosition.y += rotatedPosition.y;
  15216. // transform to world space
  15217. vertexPosition.applyMatrix4( viewWorldMatrix );
  15218. }
  15219. return function raycast( raycaster, intersects ) {
  15220. worldScale.setFromMatrixScale( this.matrixWorld );
  15221. viewWorldMatrix.getInverse( this.modelViewMatrix ).premultiply( this.matrixWorld );
  15222. mvPosition.setFromMatrixPosition( this.modelViewMatrix );
  15223. var rotation = this.material.rotation;
  15224. var sin, cos;
  15225. if ( rotation !== 0 ) {
  15226. cos = Math.cos( rotation );
  15227. sin = Math.sin( rotation );
  15228. }
  15229. var center = this.center;
  15230. transformVertex( vA.set( - 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos );
  15231. transformVertex( vB.set( 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos );
  15232. transformVertex( vC.set( 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos );
  15233. // check first triangle
  15234. var intersect = raycaster.ray.intersectTriangle( vA, vB, vC, false, intersectPoint );
  15235. if ( intersect === null ) {
  15236. // check second triangle
  15237. transformVertex( vB.set( - 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos );
  15238. intersect = raycaster.ray.intersectTriangle( vA, vC, vB, false, intersectPoint );
  15239. if ( intersect === null ) {
  15240. return;
  15241. }
  15242. }
  15243. var distance = raycaster.ray.origin.distanceTo( intersectPoint );
  15244. if ( distance < raycaster.near || distance > raycaster.far ) return;
  15245. intersects.push( {
  15246. distance: distance,
  15247. point: intersectPoint.clone(),
  15248. face: null,
  15249. object: this
  15250. } );
  15251. };
  15252. }() ),
  15253. clone: function () {
  15254. return new this.constructor( this.material ).copy( this );
  15255. },
  15256. copy: function ( source ) {
  15257. Object3D.prototype.copy.call( this, source );
  15258. if ( source.center !== undefined ) this.center.copy( source.center );
  15259. return this;
  15260. }
  15261. } );
  15262. /**
  15263. * @author mikael emtinger / http://gomo.se/
  15264. * @author alteredq / http://alteredqualia.com/
  15265. * @author mrdoob / http://mrdoob.com/
  15266. */
  15267. function LOD() {
  15268. Object3D.call( this );
  15269. this.type = 'LOD';
  15270. Object.defineProperties( this, {
  15271. levels: {
  15272. enumerable: true,
  15273. value: []
  15274. }
  15275. } );
  15276. }
  15277. LOD.prototype = Object.assign( Object.create( Object3D.prototype ), {
  15278. constructor: LOD,
  15279. copy: function ( source ) {
  15280. Object3D.prototype.copy.call( this, source, false );
  15281. var levels = source.levels;
  15282. for ( var i = 0, l = levels.length; i < l; i ++ ) {
  15283. var level = levels[ i ];
  15284. this.addLevel( level.object.clone(), level.distance );
  15285. }
  15286. return this;
  15287. },
  15288. addLevel: function ( object, distance ) {
  15289. if ( distance === undefined ) distance = 0;
  15290. distance = Math.abs( distance );
  15291. var levels = this.levels;
  15292. for ( var l = 0; l < levels.length; l ++ ) {
  15293. if ( distance < levels[ l ].distance ) {
  15294. break;
  15295. }
  15296. }
  15297. levels.splice( l, 0, { distance: distance, object: object } );
  15298. this.add( object );
  15299. },
  15300. getObjectForDistance: function ( distance ) {
  15301. var levels = this.levels;
  15302. for ( var i = 1, l = levels.length; i < l; i ++ ) {
  15303. if ( distance < levels[ i ].distance ) {
  15304. break;
  15305. }
  15306. }
  15307. return levels[ i - 1 ].object;
  15308. },
  15309. raycast: ( function () {
  15310. var matrixPosition = new Vector3();
  15311. return function raycast( raycaster, intersects ) {
  15312. matrixPosition.setFromMatrixPosition( this.matrixWorld );
  15313. var distance = raycaster.ray.origin.distanceTo( matrixPosition );
  15314. this.getObjectForDistance( distance ).raycast( raycaster, intersects );
  15315. };
  15316. }() ),
  15317. update: function () {
  15318. var v1 = new Vector3();
  15319. var v2 = new Vector3();
  15320. return function update( camera ) {
  15321. var levels = this.levels;
  15322. if ( levels.length > 1 ) {
  15323. v1.setFromMatrixPosition( camera.matrixWorld );
  15324. v2.setFromMatrixPosition( this.matrixWorld );
  15325. var distance = v1.distanceTo( v2 );
  15326. levels[ 0 ].object.visible = true;
  15327. for ( var i = 1, l = levels.length; i < l; i ++ ) {
  15328. if ( distance >= levels[ i ].distance ) {
  15329. levels[ i - 1 ].object.visible = false;
  15330. levels[ i ].object.visible = true;
  15331. } else {
  15332. break;
  15333. }
  15334. }
  15335. for ( ; i < l; i ++ ) {
  15336. levels[ i ].object.visible = false;
  15337. }
  15338. }
  15339. };
  15340. }(),
  15341. toJSON: function ( meta ) {
  15342. var data = Object3D.prototype.toJSON.call( this, meta );
  15343. data.object.levels = [];
  15344. var levels = this.levels;
  15345. for ( var i = 0, l = levels.length; i < l; i ++ ) {
  15346. var level = levels[ i ];
  15347. data.object.levels.push( {
  15348. object: level.object.uuid,
  15349. distance: level.distance
  15350. } );
  15351. }
  15352. return data;
  15353. }
  15354. } );
  15355. /**
  15356. * @author mikael emtinger / http://gomo.se/
  15357. * @author alteredq / http://alteredqualia.com/
  15358. * @author michael guerrero / http://realitymeltdown.com
  15359. * @author ikerr / http://verold.com
  15360. */
  15361. function Skeleton( bones, boneInverses ) {
  15362. // copy the bone array
  15363. bones = bones || [];
  15364. this.bones = bones.slice( 0 );
  15365. this.boneMatrices = new Float32Array( this.bones.length * 16 );
  15366. // use the supplied bone inverses or calculate the inverses
  15367. if ( boneInverses === undefined ) {
  15368. this.calculateInverses();
  15369. } else {
  15370. if ( this.bones.length === boneInverses.length ) {
  15371. this.boneInverses = boneInverses.slice( 0 );
  15372. } else {
  15373. console.warn( 'THREE.Skeleton boneInverses is the wrong length.' );
  15374. this.boneInverses = [];
  15375. for ( var i = 0, il = this.bones.length; i < il; i ++ ) {
  15376. this.boneInverses.push( new Matrix4() );
  15377. }
  15378. }
  15379. }
  15380. }
  15381. Object.assign( Skeleton.prototype, {
  15382. calculateInverses: function () {
  15383. this.boneInverses = [];
  15384. for ( var i = 0, il = this.bones.length; i < il; i ++ ) {
  15385. var inverse = new Matrix4();
  15386. if ( this.bones[ i ] ) {
  15387. inverse.getInverse( this.bones[ i ].matrixWorld );
  15388. }
  15389. this.boneInverses.push( inverse );
  15390. }
  15391. },
  15392. pose: function () {
  15393. var bone, i, il;
  15394. // recover the bind-time world matrices
  15395. for ( i = 0, il = this.bones.length; i < il; i ++ ) {
  15396. bone = this.bones[ i ];
  15397. if ( bone ) {
  15398. bone.matrixWorld.getInverse( this.boneInverses[ i ] );
  15399. }
  15400. }
  15401. // compute the local matrices, positions, rotations and scales
  15402. for ( i = 0, il = this.bones.length; i < il; i ++ ) {
  15403. bone = this.bones[ i ];
  15404. if ( bone ) {
  15405. if ( bone.parent && bone.parent.isBone ) {
  15406. bone.matrix.getInverse( bone.parent.matrixWorld );
  15407. bone.matrix.multiply( bone.matrixWorld );
  15408. } else {
  15409. bone.matrix.copy( bone.matrixWorld );
  15410. }
  15411. bone.matrix.decompose( bone.position, bone.quaternion, bone.scale );
  15412. }
  15413. }
  15414. },
  15415. update: ( function () {
  15416. var offsetMatrix = new Matrix4();
  15417. var identityMatrix = new Matrix4();
  15418. return function update() {
  15419. var bones = this.bones;
  15420. var boneInverses = this.boneInverses;
  15421. var boneMatrices = this.boneMatrices;
  15422. var boneTexture = this.boneTexture;
  15423. // flatten bone matrices to array
  15424. for ( var i = 0, il = bones.length; i < il; i ++ ) {
  15425. // compute the offset between the current and the original transform
  15426. var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix;
  15427. offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );
  15428. offsetMatrix.toArray( boneMatrices, i * 16 );
  15429. }
  15430. if ( boneTexture !== undefined ) {
  15431. boneTexture.needsUpdate = true;
  15432. }
  15433. };
  15434. } )(),
  15435. clone: function () {
  15436. return new Skeleton( this.bones, this.boneInverses );
  15437. },
  15438. getBoneByName: function ( name ) {
  15439. for ( var i = 0, il = this.bones.length; i < il; i ++ ) {
  15440. var bone = this.bones[ i ];
  15441. if ( bone.name === name ) {
  15442. return bone;
  15443. }
  15444. }
  15445. return undefined;
  15446. }
  15447. } );
  15448. /**
  15449. * @author mikael emtinger / http://gomo.se/
  15450. * @author alteredq / http://alteredqualia.com/
  15451. * @author ikerr / http://verold.com
  15452. */
  15453. function Bone() {
  15454. Object3D.call( this );
  15455. this.type = 'Bone';
  15456. }
  15457. Bone.prototype = Object.assign( Object.create( Object3D.prototype ), {
  15458. constructor: Bone,
  15459. isBone: true
  15460. } );
  15461. /**
  15462. * @author mikael emtinger / http://gomo.se/
  15463. * @author alteredq / http://alteredqualia.com/
  15464. * @author ikerr / http://verold.com
  15465. */
  15466. function SkinnedMesh( geometry, material ) {
  15467. Mesh.call( this, geometry, material );
  15468. this.type = 'SkinnedMesh';
  15469. this.bindMode = 'attached';
  15470. this.bindMatrix = new Matrix4();
  15471. this.bindMatrixInverse = new Matrix4();
  15472. var bones = this.initBones();
  15473. var skeleton = new Skeleton( bones );
  15474. this.bind( skeleton, this.matrixWorld );
  15475. this.normalizeSkinWeights();
  15476. }
  15477. SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {
  15478. constructor: SkinnedMesh,
  15479. isSkinnedMesh: true,
  15480. initBones: function () {
  15481. var bones = [], bone, gbone;
  15482. var i, il;
  15483. if ( this.geometry && this.geometry.bones !== undefined ) {
  15484. // first, create array of 'Bone' objects from geometry data
  15485. for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {
  15486. gbone = this.geometry.bones[ i ];
  15487. // create new 'Bone' object
  15488. bone = new Bone();
  15489. bones.push( bone );
  15490. // apply values
  15491. bone.name = gbone.name;
  15492. bone.position.fromArray( gbone.pos );
  15493. bone.quaternion.fromArray( gbone.rotq );
  15494. if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );
  15495. }
  15496. // second, create bone hierarchy
  15497. for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {
  15498. gbone = this.geometry.bones[ i ];
  15499. if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) {
  15500. // subsequent bones in the hierarchy
  15501. bones[ gbone.parent ].add( bones[ i ] );
  15502. } else {
  15503. // topmost bone, immediate child of the skinned mesh
  15504. this.add( bones[ i ] );
  15505. }
  15506. }
  15507. }
  15508. // now the bones are part of the scene graph and children of the skinned mesh.
  15509. // let's update the corresponding matrices
  15510. this.updateMatrixWorld( true );
  15511. return bones;
  15512. },
  15513. bind: function ( skeleton, bindMatrix ) {
  15514. this.skeleton = skeleton;
  15515. if ( bindMatrix === undefined ) {
  15516. this.updateMatrixWorld( true );
  15517. this.skeleton.calculateInverses();
  15518. bindMatrix = this.matrixWorld;
  15519. }
  15520. this.bindMatrix.copy( bindMatrix );
  15521. this.bindMatrixInverse.getInverse( bindMatrix );
  15522. },
  15523. pose: function () {
  15524. this.skeleton.pose();
  15525. },
  15526. normalizeSkinWeights: function () {
  15527. var scale, i;
  15528. if ( this.geometry && this.geometry.isGeometry ) {
  15529. for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) {
  15530. var sw = this.geometry.skinWeights[ i ];
  15531. scale = 1.0 / sw.manhattanLength();
  15532. if ( scale !== Infinity ) {
  15533. sw.multiplyScalar( scale );
  15534. } else {
  15535. sw.set( 1, 0, 0, 0 ); // do something reasonable
  15536. }
  15537. }
  15538. } else if ( this.geometry && this.geometry.isBufferGeometry ) {
  15539. var vec = new Vector4();
  15540. var skinWeight = this.geometry.attributes.skinWeight;
  15541. for ( i = 0; i < skinWeight.count; i ++ ) {
  15542. vec.x = skinWeight.getX( i );
  15543. vec.y = skinWeight.getY( i );
  15544. vec.z = skinWeight.getZ( i );
  15545. vec.w = skinWeight.getW( i );
  15546. scale = 1.0 / vec.manhattanLength();
  15547. if ( scale !== Infinity ) {
  15548. vec.multiplyScalar( scale );
  15549. } else {
  15550. vec.set( 1, 0, 0, 0 ); // do something reasonable
  15551. }
  15552. skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );
  15553. }
  15554. }
  15555. },
  15556. updateMatrixWorld: function ( force ) {
  15557. Mesh.prototype.updateMatrixWorld.call( this, force );
  15558. if ( this.bindMode === 'attached' ) {
  15559. this.bindMatrixInverse.getInverse( this.matrixWorld );
  15560. } else if ( this.bindMode === 'detached' ) {
  15561. this.bindMatrixInverse.getInverse( this.bindMatrix );
  15562. } else {
  15563. console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );
  15564. }
  15565. },
  15566. clone: function () {
  15567. return new this.constructor( this.geometry, this.material ).copy( this );
  15568. }
  15569. } );
  15570. /**
  15571. * @author mrdoob / http://mrdoob.com/
  15572. * @author alteredq / http://alteredqualia.com/
  15573. *
  15574. * parameters = {
  15575. * color: <hex>,
  15576. * opacity: <float>,
  15577. *
  15578. * linewidth: <float>,
  15579. * linecap: "round",
  15580. * linejoin: "round"
  15581. * }
  15582. */
  15583. function LineBasicMaterial( parameters ) {
  15584. Material.call( this );
  15585. this.type = 'LineBasicMaterial';
  15586. this.color = new Color( 0xffffff );
  15587. this.linewidth = 1;
  15588. this.linecap = 'round';
  15589. this.linejoin = 'round';
  15590. this.lights = false;
  15591. this.setValues( parameters );
  15592. }
  15593. LineBasicMaterial.prototype = Object.create( Material.prototype );
  15594. LineBasicMaterial.prototype.constructor = LineBasicMaterial;
  15595. LineBasicMaterial.prototype.isLineBasicMaterial = true;
  15596. LineBasicMaterial.prototype.copy = function ( source ) {
  15597. Material.prototype.copy.call( this, source );
  15598. this.color.copy( source.color );
  15599. this.linewidth = source.linewidth;
  15600. this.linecap = source.linecap;
  15601. this.linejoin = source.linejoin;
  15602. return this;
  15603. };
  15604. /**
  15605. * @author mrdoob / http://mrdoob.com/
  15606. */
  15607. function Line( geometry, material, mode ) {
  15608. if ( mode === 1 ) {
  15609. console.error( 'THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.' );
  15610. }
  15611. Object3D.call( this );
  15612. this.type = 'Line';
  15613. this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
  15614. this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );
  15615. }
  15616. Line.prototype = Object.assign( Object.create( Object3D.prototype ), {
  15617. constructor: Line,
  15618. isLine: true,
  15619. computeLineDistances: ( function () {
  15620. var start = new Vector3();
  15621. var end = new Vector3();
  15622. return function computeLineDistances() {
  15623. var geometry = this.geometry;
  15624. if ( geometry.isBufferGeometry ) {
  15625. // we assume non-indexed geometry
  15626. if ( geometry.index === null ) {
  15627. var positionAttribute = geometry.attributes.position;
  15628. var lineDistances = [ 0 ];
  15629. for ( var i = 1, l = positionAttribute.count; i < l; i ++ ) {
  15630. start.fromBufferAttribute( positionAttribute, i - 1 );
  15631. end.fromBufferAttribute( positionAttribute, i );
  15632. lineDistances[ i ] = lineDistances[ i - 1 ];
  15633. lineDistances[ i ] += start.distanceTo( end );
  15634. }
  15635. geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );
  15636. } else {
  15637. console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );
  15638. }
  15639. } else if ( geometry.isGeometry ) {
  15640. var vertices = geometry.vertices;
  15641. var lineDistances = geometry.lineDistances;
  15642. lineDistances[ 0 ] = 0;
  15643. for ( var i = 1, l = vertices.length; i < l; i ++ ) {
  15644. lineDistances[ i ] = lineDistances[ i - 1 ];
  15645. lineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] );
  15646. }
  15647. }
  15648. return this;
  15649. };
  15650. }() ),
  15651. raycast: ( function () {
  15652. var inverseMatrix = new Matrix4();
  15653. var ray = new Ray();
  15654. var sphere = new Sphere();
  15655. return function raycast( raycaster, intersects ) {
  15656. var precision = raycaster.linePrecision;
  15657. var precisionSq = precision * precision;
  15658. var geometry = this.geometry;
  15659. var matrixWorld = this.matrixWorld;
  15660. // Checking boundingSphere distance to ray
  15661. if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
  15662. sphere.copy( geometry.boundingSphere );
  15663. sphere.applyMatrix4( matrixWorld );
  15664. if ( raycaster.ray.intersectsSphere( sphere ) === false ) return;
  15665. //
  15666. inverseMatrix.getInverse( matrixWorld );
  15667. ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );
  15668. var vStart = new Vector3();
  15669. var vEnd = new Vector3();
  15670. var interSegment = new Vector3();
  15671. var interRay = new Vector3();
  15672. var step = ( this && this.isLineSegments ) ? 2 : 1;
  15673. if ( geometry.isBufferGeometry ) {
  15674. var index = geometry.index;
  15675. var attributes = geometry.attributes;
  15676. var positions = attributes.position.array;
  15677. if ( index !== null ) {
  15678. var indices = index.array;
  15679. for ( var i = 0, l = indices.length - 1; i < l; i += step ) {
  15680. var a = indices[ i ];
  15681. var b = indices[ i + 1 ];
  15682. vStart.fromArray( positions, a * 3 );
  15683. vEnd.fromArray( positions, b * 3 );
  15684. var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
  15685. if ( distSq > precisionSq ) continue;
  15686. interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
  15687. var distance = raycaster.ray.origin.distanceTo( interRay );
  15688. if ( distance < raycaster.near || distance > raycaster.far ) continue;
  15689. intersects.push( {
  15690. distance: distance,
  15691. // What do we want? intersection point on the ray or on the segment??
  15692. // point: raycaster.ray.at( distance ),
  15693. point: interSegment.clone().applyMatrix4( this.matrixWorld ),
  15694. index: i,
  15695. face: null,
  15696. faceIndex: null,
  15697. object: this
  15698. } );
  15699. }
  15700. } else {
  15701. for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {
  15702. vStart.fromArray( positions, 3 * i );
  15703. vEnd.fromArray( positions, 3 * i + 3 );
  15704. var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
  15705. if ( distSq > precisionSq ) continue;
  15706. interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
  15707. var distance = raycaster.ray.origin.distanceTo( interRay );
  15708. if ( distance < raycaster.near || distance > raycaster.far ) continue;
  15709. intersects.push( {
  15710. distance: distance,
  15711. // What do we want? intersection point on the ray or on the segment??
  15712. // point: raycaster.ray.at( distance ),
  15713. point: interSegment.clone().applyMatrix4( this.matrixWorld ),
  15714. index: i,
  15715. face: null,
  15716. faceIndex: null,
  15717. object: this
  15718. } );
  15719. }
  15720. }
  15721. } else if ( geometry.isGeometry ) {
  15722. var vertices = geometry.vertices;
  15723. var nbVertices = vertices.length;
  15724. for ( var i = 0; i < nbVertices - 1; i += step ) {
  15725. var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );
  15726. if ( distSq > precisionSq ) continue;
  15727. interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
  15728. var distance = raycaster.ray.origin.distanceTo( interRay );
  15729. if ( distance < raycaster.near || distance > raycaster.far ) continue;
  15730. intersects.push( {
  15731. distance: distance,
  15732. // What do we want? intersection point on the ray or on the segment??
  15733. // point: raycaster.ray.at( distance ),
  15734. point: interSegment.clone().applyMatrix4( this.matrixWorld ),
  15735. index: i,
  15736. face: null,
  15737. faceIndex: null,
  15738. object: this
  15739. } );
  15740. }
  15741. }
  15742. };
  15743. }() ),
  15744. clone: function () {
  15745. return new this.constructor( this.geometry, this.material ).copy( this );
  15746. }
  15747. } );
  15748. /**
  15749. * @author mrdoob / http://mrdoob.com/
  15750. */
  15751. function LineSegments( geometry, material ) {
  15752. Line.call( this, geometry, material );
  15753. this.type = 'LineSegments';
  15754. }
  15755. LineSegments.prototype = Object.assign( Object.create( Line.prototype ), {
  15756. constructor: LineSegments,
  15757. isLineSegments: true,
  15758. computeLineDistances: ( function () {
  15759. var start = new Vector3();
  15760. var end = new Vector3();
  15761. return function computeLineDistances() {
  15762. var geometry = this.geometry;
  15763. if ( geometry.isBufferGeometry ) {
  15764. // we assume non-indexed geometry
  15765. if ( geometry.index === null ) {
  15766. var positionAttribute = geometry.attributes.position;
  15767. var lineDistances = [];
  15768. for ( var i = 0, l = positionAttribute.count; i < l; i += 2 ) {
  15769. start.fromBufferAttribute( positionAttribute, i );
  15770. end.fromBufferAttribute( positionAttribute, i + 1 );
  15771. lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];
  15772. lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end );
  15773. }
  15774. geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );
  15775. } else {
  15776. console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );
  15777. }
  15778. } else if ( geometry.isGeometry ) {
  15779. var vertices = geometry.vertices;
  15780. var lineDistances = geometry.lineDistances;
  15781. for ( var i = 0, l = vertices.length; i < l; i += 2 ) {
  15782. start.copy( vertices[ i ] );
  15783. end.copy( vertices[ i + 1 ] );
  15784. lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];
  15785. lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end );
  15786. }
  15787. }
  15788. return this;
  15789. };
  15790. }() )
  15791. } );
  15792. /**
  15793. * @author mgreter / http://github.com/mgreter
  15794. */
  15795. function LineLoop( geometry, material ) {
  15796. Line.call( this, geometry, material );
  15797. this.type = 'LineLoop';
  15798. }
  15799. LineLoop.prototype = Object.assign( Object.create( Line.prototype ), {
  15800. constructor: LineLoop,
  15801. isLineLoop: true,
  15802. } );
  15803. /**
  15804. * @author mrdoob / http://mrdoob.com/
  15805. * @author alteredq / http://alteredqualia.com/
  15806. *
  15807. * parameters = {
  15808. * color: <hex>,
  15809. * opacity: <float>,
  15810. * map: new THREE.Texture( <Image> ),
  15811. *
  15812. * size: <float>,
  15813. * sizeAttenuation: <bool>
  15814. *
  15815. * morphTargets: <bool>
  15816. * }
  15817. */
  15818. function PointsMaterial( parameters ) {
  15819. Material.call( this );
  15820. this.type = 'PointsMaterial';
  15821. this.color = new Color( 0xffffff );
  15822. this.map = null;
  15823. this.size = 1;
  15824. this.sizeAttenuation = true;
  15825. this.morphTargets = false;
  15826. this.lights = false;
  15827. this.setValues( parameters );
  15828. }
  15829. PointsMaterial.prototype = Object.create( Material.prototype );
  15830. PointsMaterial.prototype.constructor = PointsMaterial;
  15831. PointsMaterial.prototype.isPointsMaterial = true;
  15832. PointsMaterial.prototype.copy = function ( source ) {
  15833. Material.prototype.copy.call( this, source );
  15834. this.color.copy( source.color );
  15835. this.map = source.map;
  15836. this.size = source.size;
  15837. this.sizeAttenuation = source.sizeAttenuation;
  15838. this.morphTargets = source.morphTargets;
  15839. return this;
  15840. };
  15841. /**
  15842. * @author alteredq / http://alteredqualia.com/
  15843. */
  15844. function Points( geometry, material ) {
  15845. Object3D.call( this );
  15846. this.type = 'Points';
  15847. this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
  15848. this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );
  15849. }
  15850. Points.prototype = Object.assign( Object.create( Object3D.prototype ), {
  15851. constructor: Points,
  15852. isPoints: true,
  15853. raycast: ( function () {
  15854. var inverseMatrix = new Matrix4();
  15855. var ray = new Ray();
  15856. var sphere = new Sphere();
  15857. return function raycast( raycaster, intersects ) {
  15858. var object = this;
  15859. var geometry = this.geometry;
  15860. var matrixWorld = this.matrixWorld;
  15861. var threshold = raycaster.params.Points.threshold;
  15862. // Checking boundingSphere distance to ray
  15863. if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
  15864. sphere.copy( geometry.boundingSphere );
  15865. sphere.applyMatrix4( matrixWorld );
  15866. sphere.radius += threshold;
  15867. if ( raycaster.ray.intersectsSphere( sphere ) === false ) return;
  15868. //
  15869. inverseMatrix.getInverse( matrixWorld );
  15870. ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );
  15871. var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );
  15872. var localThresholdSq = localThreshold * localThreshold;
  15873. var position = new Vector3();
  15874. var intersectPoint = new Vector3();
  15875. function testPoint( point, index ) {
  15876. var rayPointDistanceSq = ray.distanceSqToPoint( point );
  15877. if ( rayPointDistanceSq < localThresholdSq ) {
  15878. ray.closestPointToPoint( point, intersectPoint );
  15879. intersectPoint.applyMatrix4( matrixWorld );
  15880. var distance = raycaster.ray.origin.distanceTo( intersectPoint );
  15881. if ( distance < raycaster.near || distance > raycaster.far ) return;
  15882. intersects.push( {
  15883. distance: distance,
  15884. distanceToRay: Math.sqrt( rayPointDistanceSq ),
  15885. point: intersectPoint.clone(),
  15886. index: index,
  15887. face: null,
  15888. object: object
  15889. } );
  15890. }
  15891. }
  15892. if ( geometry.isBufferGeometry ) {
  15893. var index = geometry.index;
  15894. var attributes = geometry.attributes;
  15895. var positions = attributes.position.array;
  15896. if ( index !== null ) {
  15897. var indices = index.array;
  15898. for ( var i = 0, il = indices.length; i < il; i ++ ) {
  15899. var a = indices[ i ];
  15900. position.fromArray( positions, a * 3 );
  15901. testPoint( position, a );
  15902. }
  15903. } else {
  15904. for ( var i = 0, l = positions.length / 3; i < l; i ++ ) {
  15905. position.fromArray( positions, i * 3 );
  15906. testPoint( position, i );
  15907. }
  15908. }
  15909. } else {
  15910. var vertices = geometry.vertices;
  15911. for ( var i = 0, l = vertices.length; i < l; i ++ ) {
  15912. testPoint( vertices[ i ], i );
  15913. }
  15914. }
  15915. };
  15916. }() ),
  15917. clone: function () {
  15918. return new this.constructor( this.geometry, this.material ).copy( this );
  15919. }
  15920. } );
  15921. /**
  15922. * @author mrdoob / http://mrdoob.com/
  15923. */
  15924. function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {
  15925. Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
  15926. this.generateMipmaps = false;
  15927. }
  15928. VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), {
  15929. constructor: VideoTexture,
  15930. isVideoTexture: true,
  15931. update: function () {
  15932. var video = this.image;
  15933. if ( video.readyState >= video.HAVE_CURRENT_DATA ) {
  15934. this.needsUpdate = true;
  15935. }
  15936. }
  15937. } );
  15938. /**
  15939. * @author alteredq / http://alteredqualia.com/
  15940. */
  15941. function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {
  15942. Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );
  15943. this.image = { width: width, height: height };
  15944. this.mipmaps = mipmaps;
  15945. // no flipping for cube textures
  15946. // (also flipping doesn't work for compressed textures )
  15947. this.flipY = false;
  15948. // can't generate mipmaps for compressed textures
  15949. // mips must be embedded in DDS files
  15950. this.generateMipmaps = false;
  15951. }
  15952. CompressedTexture.prototype = Object.create( Texture.prototype );
  15953. CompressedTexture.prototype.constructor = CompressedTexture;
  15954. CompressedTexture.prototype.isCompressedTexture = true;
  15955. /**
  15956. * @author mrdoob / http://mrdoob.com/
  15957. */
  15958. function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {
  15959. Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
  15960. this.needsUpdate = true;
  15961. }
  15962. CanvasTexture.prototype = Object.create( Texture.prototype );
  15963. CanvasTexture.prototype.constructor = CanvasTexture;
  15964. CanvasTexture.prototype.isCanvasTexture = true;
  15965. /**
  15966. * @author Matt DesLauriers / @mattdesl
  15967. * @author atix / arthursilber.de
  15968. */
  15969. function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {
  15970. format = format !== undefined ? format : DepthFormat;
  15971. if ( format !== DepthFormat && format !== DepthStencilFormat ) {
  15972. throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );
  15973. }
  15974. if ( type === undefined && format === DepthFormat ) type = UnsignedShortType;
  15975. if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;
  15976. Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
  15977. this.image = { width: width, height: height };
  15978. this.magFilter = magFilter !== undefined ? magFilter : NearestFilter;
  15979. this.minFilter = minFilter !== undefined ? minFilter : NearestFilter;
  15980. this.flipY = false;
  15981. this.generateMipmaps = false;
  15982. }
  15983. DepthTexture.prototype = Object.create( Texture.prototype );
  15984. DepthTexture.prototype.constructor = DepthTexture;
  15985. DepthTexture.prototype.isDepthTexture = true;
  15986. /**
  15987. * @author mrdoob / http://mrdoob.com/
  15988. * @author Mugen87 / https://github.com/Mugen87
  15989. */
  15990. function WireframeGeometry( geometry ) {
  15991. BufferGeometry.call( this );
  15992. this.type = 'WireframeGeometry';
  15993. // buffer
  15994. var vertices = [];
  15995. // helper variables
  15996. var i, j, l, o, ol;
  15997. var edge = [ 0, 0 ], edges = {}, e, edge1, edge2;
  15998. var key, keys = [ 'a', 'b', 'c' ];
  15999. var vertex;
  16000. // different logic for Geometry and BufferGeometry
  16001. if ( geometry && geometry.isGeometry ) {
  16002. // create a data structure that contains all edges without duplicates
  16003. var faces = geometry.faces;
  16004. for ( i = 0, l = faces.length; i < l; i ++ ) {
  16005. var face = faces[ i ];
  16006. for ( j = 0; j < 3; j ++ ) {
  16007. edge1 = face[ keys[ j ] ];
  16008. edge2 = face[ keys[ ( j + 1 ) % 3 ] ];
  16009. edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates
  16010. edge[ 1 ] = Math.max( edge1, edge2 );
  16011. key = edge[ 0 ] + ',' + edge[ 1 ];
  16012. if ( edges[ key ] === undefined ) {
  16013. edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };
  16014. }
  16015. }
  16016. }
  16017. // generate vertices
  16018. for ( key in edges ) {
  16019. e = edges[ key ];
  16020. vertex = geometry.vertices[ e.index1 ];
  16021. vertices.push( vertex.x, vertex.y, vertex.z );
  16022. vertex = geometry.vertices[ e.index2 ];
  16023. vertices.push( vertex.x, vertex.y, vertex.z );
  16024. }
  16025. } else if ( geometry && geometry.isBufferGeometry ) {
  16026. var position, indices, groups;
  16027. var group, start, count;
  16028. var index1, index2;
  16029. vertex = new Vector3();
  16030. if ( geometry.index !== null ) {
  16031. // indexed BufferGeometry
  16032. position = geometry.attributes.position;
  16033. indices = geometry.index;
  16034. groups = geometry.groups;
  16035. if ( groups.length === 0 ) {
  16036. groups = [ { start: 0, count: indices.count, materialIndex: 0 } ];
  16037. }
  16038. // create a data structure that contains all eges without duplicates
  16039. for ( o = 0, ol = groups.length; o < ol; ++ o ) {
  16040. group = groups[ o ];
  16041. start = group.start;
  16042. count = group.count;
  16043. for ( i = start, l = ( start + count ); i < l; i += 3 ) {
  16044. for ( j = 0; j < 3; j ++ ) {
  16045. edge1 = indices.getX( i + j );
  16046. edge2 = indices.getX( i + ( j + 1 ) % 3 );
  16047. edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates
  16048. edge[ 1 ] = Math.max( edge1, edge2 );
  16049. key = edge[ 0 ] + ',' + edge[ 1 ];
  16050. if ( edges[ key ] === undefined ) {
  16051. edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };
  16052. }
  16053. }
  16054. }
  16055. }
  16056. // generate vertices
  16057. for ( key in edges ) {
  16058. e = edges[ key ];
  16059. vertex.fromBufferAttribute( position, e.index1 );
  16060. vertices.push( vertex.x, vertex.y, vertex.z );
  16061. vertex.fromBufferAttribute( position, e.index2 );
  16062. vertices.push( vertex.x, vertex.y, vertex.z );
  16063. }
  16064. } else {
  16065. // non-indexed BufferGeometry
  16066. position = geometry.attributes.position;
  16067. for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {
  16068. for ( j = 0; j < 3; j ++ ) {
  16069. // three edges per triangle, an edge is represented as (index1, index2)
  16070. // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)
  16071. index1 = 3 * i + j;
  16072. vertex.fromBufferAttribute( position, index1 );
  16073. vertices.push( vertex.x, vertex.y, vertex.z );
  16074. index2 = 3 * i + ( ( j + 1 ) % 3 );
  16075. vertex.fromBufferAttribute( position, index2 );
  16076. vertices.push( vertex.x, vertex.y, vertex.z );
  16077. }
  16078. }
  16079. }
  16080. }
  16081. // build geometry
  16082. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  16083. }
  16084. WireframeGeometry.prototype = Object.create( BufferGeometry.prototype );
  16085. WireframeGeometry.prototype.constructor = WireframeGeometry;
  16086. /**
  16087. * @author zz85 / https://github.com/zz85
  16088. * @author Mugen87 / https://github.com/Mugen87
  16089. *
  16090. * Parametric Surfaces Geometry
  16091. * based on the brilliant article by @prideout http://prideout.net/blog/?p=44
  16092. */
  16093. // ParametricGeometry
  16094. function ParametricGeometry( func, slices, stacks ) {
  16095. Geometry.call( this );
  16096. this.type = 'ParametricGeometry';
  16097. this.parameters = {
  16098. func: func,
  16099. slices: slices,
  16100. stacks: stacks
  16101. };
  16102. this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );
  16103. this.mergeVertices();
  16104. }
  16105. ParametricGeometry.prototype = Object.create( Geometry.prototype );
  16106. ParametricGeometry.prototype.constructor = ParametricGeometry;
  16107. // ParametricBufferGeometry
  16108. function ParametricBufferGeometry( func, slices, stacks ) {
  16109. BufferGeometry.call( this );
  16110. this.type = 'ParametricBufferGeometry';
  16111. this.parameters = {
  16112. func: func,
  16113. slices: slices,
  16114. stacks: stacks
  16115. };
  16116. // buffers
  16117. var indices = [];
  16118. var vertices = [];
  16119. var normals = [];
  16120. var uvs = [];
  16121. var EPS = 0.00001;
  16122. var normal = new Vector3();
  16123. var p0 = new Vector3(), p1 = new Vector3();
  16124. var pu = new Vector3(), pv = new Vector3();
  16125. var i, j;
  16126. if ( func.length < 3 ) {
  16127. console.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' );
  16128. }
  16129. // generate vertices, normals and uvs
  16130. var sliceCount = slices + 1;
  16131. for ( i = 0; i <= stacks; i ++ ) {
  16132. var v = i / stacks;
  16133. for ( j = 0; j <= slices; j ++ ) {
  16134. var u = j / slices;
  16135. // vertex
  16136. func( u, v, p0 );
  16137. vertices.push( p0.x, p0.y, p0.z );
  16138. // normal
  16139. // approximate tangent vectors via finite differences
  16140. if ( u - EPS >= 0 ) {
  16141. func( u - EPS, v, p1 );
  16142. pu.subVectors( p0, p1 );
  16143. } else {
  16144. func( u + EPS, v, p1 );
  16145. pu.subVectors( p1, p0 );
  16146. }
  16147. if ( v - EPS >= 0 ) {
  16148. func( u, v - EPS, p1 );
  16149. pv.subVectors( p0, p1 );
  16150. } else {
  16151. func( u, v + EPS, p1 );
  16152. pv.subVectors( p1, p0 );
  16153. }
  16154. // cross product of tangent vectors returns surface normal
  16155. normal.crossVectors( pu, pv ).normalize();
  16156. normals.push( normal.x, normal.y, normal.z );
  16157. // uv
  16158. uvs.push( u, v );
  16159. }
  16160. }
  16161. // generate indices
  16162. for ( i = 0; i < stacks; i ++ ) {
  16163. for ( j = 0; j < slices; j ++ ) {
  16164. var a = i * sliceCount + j;
  16165. var b = i * sliceCount + j + 1;
  16166. var c = ( i + 1 ) * sliceCount + j + 1;
  16167. var d = ( i + 1 ) * sliceCount + j;
  16168. // faces one and two
  16169. indices.push( a, b, d );
  16170. indices.push( b, c, d );
  16171. }
  16172. }
  16173. // build geometry
  16174. this.setIndex( indices );
  16175. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  16176. this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
  16177. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  16178. }
  16179. ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  16180. ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;
  16181. /**
  16182. * @author clockworkgeek / https://github.com/clockworkgeek
  16183. * @author timothypratley / https://github.com/timothypratley
  16184. * @author WestLangley / http://github.com/WestLangley
  16185. * @author Mugen87 / https://github.com/Mugen87
  16186. */
  16187. // PolyhedronGeometry
  16188. function PolyhedronGeometry( vertices, indices, radius, detail ) {
  16189. Geometry.call( this );
  16190. this.type = 'PolyhedronGeometry';
  16191. this.parameters = {
  16192. vertices: vertices,
  16193. indices: indices,
  16194. radius: radius,
  16195. detail: detail
  16196. };
  16197. this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );
  16198. this.mergeVertices();
  16199. }
  16200. PolyhedronGeometry.prototype = Object.create( Geometry.prototype );
  16201. PolyhedronGeometry.prototype.constructor = PolyhedronGeometry;
  16202. // PolyhedronBufferGeometry
  16203. function PolyhedronBufferGeometry( vertices, indices, radius, detail ) {
  16204. BufferGeometry.call( this );
  16205. this.type = 'PolyhedronBufferGeometry';
  16206. this.parameters = {
  16207. vertices: vertices,
  16208. indices: indices,
  16209. radius: radius,
  16210. detail: detail
  16211. };
  16212. radius = radius || 1;
  16213. detail = detail || 0;
  16214. // default buffer data
  16215. var vertexBuffer = [];
  16216. var uvBuffer = [];
  16217. // the subdivision creates the vertex buffer data
  16218. subdivide( detail );
  16219. // all vertices should lie on a conceptual sphere with a given radius
  16220. appplyRadius( radius );
  16221. // finally, create the uv data
  16222. generateUVs();
  16223. // build non-indexed geometry
  16224. this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );
  16225. this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );
  16226. this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );
  16227. if ( detail === 0 ) {
  16228. this.computeVertexNormals(); // flat normals
  16229. } else {
  16230. this.normalizeNormals(); // smooth normals
  16231. }
  16232. // helper functions
  16233. function subdivide( detail ) {
  16234. var a = new Vector3();
  16235. var b = new Vector3();
  16236. var c = new Vector3();
  16237. // iterate over all faces and apply a subdivison with the given detail value
  16238. for ( var i = 0; i < indices.length; i += 3 ) {
  16239. // get the vertices of the face
  16240. getVertexByIndex( indices[ i + 0 ], a );
  16241. getVertexByIndex( indices[ i + 1 ], b );
  16242. getVertexByIndex( indices[ i + 2 ], c );
  16243. // perform subdivision
  16244. subdivideFace( a, b, c, detail );
  16245. }
  16246. }
  16247. function subdivideFace( a, b, c, detail ) {
  16248. var cols = Math.pow( 2, detail );
  16249. // we use this multidimensional array as a data structure for creating the subdivision
  16250. var v = [];
  16251. var i, j;
  16252. // construct all of the vertices for this subdivision
  16253. for ( i = 0; i <= cols; i ++ ) {
  16254. v[ i ] = [];
  16255. var aj = a.clone().lerp( c, i / cols );
  16256. var bj = b.clone().lerp( c, i / cols );
  16257. var rows = cols - i;
  16258. for ( j = 0; j <= rows; j ++ ) {
  16259. if ( j === 0 && i === cols ) {
  16260. v[ i ][ j ] = aj;
  16261. } else {
  16262. v[ i ][ j ] = aj.clone().lerp( bj, j / rows );
  16263. }
  16264. }
  16265. }
  16266. // construct all of the faces
  16267. for ( i = 0; i < cols; i ++ ) {
  16268. for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {
  16269. var k = Math.floor( j / 2 );
  16270. if ( j % 2 === 0 ) {
  16271. pushVertex( v[ i ][ k + 1 ] );
  16272. pushVertex( v[ i + 1 ][ k ] );
  16273. pushVertex( v[ i ][ k ] );
  16274. } else {
  16275. pushVertex( v[ i ][ k + 1 ] );
  16276. pushVertex( v[ i + 1 ][ k + 1 ] );
  16277. pushVertex( v[ i + 1 ][ k ] );
  16278. }
  16279. }
  16280. }
  16281. }
  16282. function appplyRadius( radius ) {
  16283. var vertex = new Vector3();
  16284. // iterate over the entire buffer and apply the radius to each vertex
  16285. for ( var i = 0; i < vertexBuffer.length; i += 3 ) {
  16286. vertex.x = vertexBuffer[ i + 0 ];
  16287. vertex.y = vertexBuffer[ i + 1 ];
  16288. vertex.z = vertexBuffer[ i + 2 ];
  16289. vertex.normalize().multiplyScalar( radius );
  16290. vertexBuffer[ i + 0 ] = vertex.x;
  16291. vertexBuffer[ i + 1 ] = vertex.y;
  16292. vertexBuffer[ i + 2 ] = vertex.z;
  16293. }
  16294. }
  16295. function generateUVs() {
  16296. var vertex = new Vector3();
  16297. for ( var i = 0; i < vertexBuffer.length; i += 3 ) {
  16298. vertex.x = vertexBuffer[ i + 0 ];
  16299. vertex.y = vertexBuffer[ i + 1 ];
  16300. vertex.z = vertexBuffer[ i + 2 ];
  16301. var u = azimuth( vertex ) / 2 / Math.PI + 0.5;
  16302. var v = inclination( vertex ) / Math.PI + 0.5;
  16303. uvBuffer.push( u, 1 - v );
  16304. }
  16305. correctUVs();
  16306. correctSeam();
  16307. }
  16308. function correctSeam() {
  16309. // handle case when face straddles the seam, see #3269
  16310. for ( var i = 0; i < uvBuffer.length; i += 6 ) {
  16311. // uv data of a single face
  16312. var x0 = uvBuffer[ i + 0 ];
  16313. var x1 = uvBuffer[ i + 2 ];
  16314. var x2 = uvBuffer[ i + 4 ];
  16315. var max = Math.max( x0, x1, x2 );
  16316. var min = Math.min( x0, x1, x2 );
  16317. // 0.9 is somewhat arbitrary
  16318. if ( max > 0.9 && min < 0.1 ) {
  16319. if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;
  16320. if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;
  16321. if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;
  16322. }
  16323. }
  16324. }
  16325. function pushVertex( vertex ) {
  16326. vertexBuffer.push( vertex.x, vertex.y, vertex.z );
  16327. }
  16328. function getVertexByIndex( index, vertex ) {
  16329. var stride = index * 3;
  16330. vertex.x = vertices[ stride + 0 ];
  16331. vertex.y = vertices[ stride + 1 ];
  16332. vertex.z = vertices[ stride + 2 ];
  16333. }
  16334. function correctUVs() {
  16335. var a = new Vector3();
  16336. var b = new Vector3();
  16337. var c = new Vector3();
  16338. var centroid = new Vector3();
  16339. var uvA = new Vector2();
  16340. var uvB = new Vector2();
  16341. var uvC = new Vector2();
  16342. for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {
  16343. a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );
  16344. b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );
  16345. c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );
  16346. uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );
  16347. uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );
  16348. uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );
  16349. centroid.copy( a ).add( b ).add( c ).divideScalar( 3 );
  16350. var azi = azimuth( centroid );
  16351. correctUV( uvA, j + 0, a, azi );
  16352. correctUV( uvB, j + 2, b, azi );
  16353. correctUV( uvC, j + 4, c, azi );
  16354. }
  16355. }
  16356. function correctUV( uv, stride, vector, azimuth ) {
  16357. if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {
  16358. uvBuffer[ stride ] = uv.x - 1;
  16359. }
  16360. if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {
  16361. uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;
  16362. }
  16363. }
  16364. // Angle around the Y axis, counter-clockwise when looking from above.
  16365. function azimuth( vector ) {
  16366. return Math.atan2( vector.z, - vector.x );
  16367. }
  16368. // Angle above the XZ plane.
  16369. function inclination( vector ) {
  16370. return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );
  16371. }
  16372. }
  16373. PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  16374. PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;
  16375. /**
  16376. * @author timothypratley / https://github.com/timothypratley
  16377. * @author Mugen87 / https://github.com/Mugen87
  16378. */
  16379. // TetrahedronGeometry
  16380. function TetrahedronGeometry( radius, detail ) {
  16381. Geometry.call( this );
  16382. this.type = 'TetrahedronGeometry';
  16383. this.parameters = {
  16384. radius: radius,
  16385. detail: detail
  16386. };
  16387. this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );
  16388. this.mergeVertices();
  16389. }
  16390. TetrahedronGeometry.prototype = Object.create( Geometry.prototype );
  16391. TetrahedronGeometry.prototype.constructor = TetrahedronGeometry;
  16392. // TetrahedronBufferGeometry
  16393. function TetrahedronBufferGeometry( radius, detail ) {
  16394. var vertices = [
  16395. 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1
  16396. ];
  16397. var indices = [
  16398. 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1
  16399. ];
  16400. PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
  16401. this.type = 'TetrahedronBufferGeometry';
  16402. this.parameters = {
  16403. radius: radius,
  16404. detail: detail
  16405. };
  16406. }
  16407. TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
  16408. TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;
  16409. /**
  16410. * @author timothypratley / https://github.com/timothypratley
  16411. * @author Mugen87 / https://github.com/Mugen87
  16412. */
  16413. // OctahedronGeometry
  16414. function OctahedronGeometry( radius, detail ) {
  16415. Geometry.call( this );
  16416. this.type = 'OctahedronGeometry';
  16417. this.parameters = {
  16418. radius: radius,
  16419. detail: detail
  16420. };
  16421. this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );
  16422. this.mergeVertices();
  16423. }
  16424. OctahedronGeometry.prototype = Object.create( Geometry.prototype );
  16425. OctahedronGeometry.prototype.constructor = OctahedronGeometry;
  16426. // OctahedronBufferGeometry
  16427. function OctahedronBufferGeometry( radius, detail ) {
  16428. var vertices = [
  16429. 1, 0, 0, - 1, 0, 0, 0, 1, 0,
  16430. 0, - 1, 0, 0, 0, 1, 0, 0, - 1
  16431. ];
  16432. var indices = [
  16433. 0, 2, 4, 0, 4, 3, 0, 3, 5,
  16434. 0, 5, 2, 1, 2, 5, 1, 5, 3,
  16435. 1, 3, 4, 1, 4, 2
  16436. ];
  16437. PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
  16438. this.type = 'OctahedronBufferGeometry';
  16439. this.parameters = {
  16440. radius: radius,
  16441. detail: detail
  16442. };
  16443. }
  16444. OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
  16445. OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;
  16446. /**
  16447. * @author timothypratley / https://github.com/timothypratley
  16448. * @author Mugen87 / https://github.com/Mugen87
  16449. */
  16450. // IcosahedronGeometry
  16451. function IcosahedronGeometry( radius, detail ) {
  16452. Geometry.call( this );
  16453. this.type = 'IcosahedronGeometry';
  16454. this.parameters = {
  16455. radius: radius,
  16456. detail: detail
  16457. };
  16458. this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );
  16459. this.mergeVertices();
  16460. }
  16461. IcosahedronGeometry.prototype = Object.create( Geometry.prototype );
  16462. IcosahedronGeometry.prototype.constructor = IcosahedronGeometry;
  16463. // IcosahedronBufferGeometry
  16464. function IcosahedronBufferGeometry( radius, detail ) {
  16465. var t = ( 1 + Math.sqrt( 5 ) ) / 2;
  16466. var vertices = [
  16467. - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,
  16468. 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,
  16469. t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1
  16470. ];
  16471. var indices = [
  16472. 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,
  16473. 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,
  16474. 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,
  16475. 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1
  16476. ];
  16477. PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
  16478. this.type = 'IcosahedronBufferGeometry';
  16479. this.parameters = {
  16480. radius: radius,
  16481. detail: detail
  16482. };
  16483. }
  16484. IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
  16485. IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;
  16486. /**
  16487. * @author Abe Pazos / https://hamoid.com
  16488. * @author Mugen87 / https://github.com/Mugen87
  16489. */
  16490. // DodecahedronGeometry
  16491. function DodecahedronGeometry( radius, detail ) {
  16492. Geometry.call( this );
  16493. this.type = 'DodecahedronGeometry';
  16494. this.parameters = {
  16495. radius: radius,
  16496. detail: detail
  16497. };
  16498. this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );
  16499. this.mergeVertices();
  16500. }
  16501. DodecahedronGeometry.prototype = Object.create( Geometry.prototype );
  16502. DodecahedronGeometry.prototype.constructor = DodecahedronGeometry;
  16503. // DodecahedronBufferGeometry
  16504. function DodecahedronBufferGeometry( radius, detail ) {
  16505. var t = ( 1 + Math.sqrt( 5 ) ) / 2;
  16506. var r = 1 / t;
  16507. var vertices = [
  16508. // (±1, ±1, ±1)
  16509. - 1, - 1, - 1, - 1, - 1, 1,
  16510. - 1, 1, - 1, - 1, 1, 1,
  16511. 1, - 1, - 1, 1, - 1, 1,
  16512. 1, 1, - 1, 1, 1, 1,
  16513. // (0, ±1/φ, ±φ)
  16514. 0, - r, - t, 0, - r, t,
  16515. 0, r, - t, 0, r, t,
  16516. // (±1/φ, ±φ, 0)
  16517. - r, - t, 0, - r, t, 0,
  16518. r, - t, 0, r, t, 0,
  16519. // (±φ, 0, ±1/φ)
  16520. - t, 0, - r, t, 0, - r,
  16521. - t, 0, r, t, 0, r
  16522. ];
  16523. var indices = [
  16524. 3, 11, 7, 3, 7, 15, 3, 15, 13,
  16525. 7, 19, 17, 7, 17, 6, 7, 6, 15,
  16526. 17, 4, 8, 17, 8, 10, 17, 10, 6,
  16527. 8, 0, 16, 8, 16, 2, 8, 2, 10,
  16528. 0, 12, 1, 0, 1, 18, 0, 18, 16,
  16529. 6, 10, 2, 6, 2, 13, 6, 13, 15,
  16530. 2, 16, 18, 2, 18, 3, 2, 3, 13,
  16531. 18, 1, 9, 18, 9, 11, 18, 11, 3,
  16532. 4, 14, 12, 4, 12, 0, 4, 0, 8,
  16533. 11, 9, 5, 11, 5, 19, 11, 19, 7,
  16534. 19, 5, 14, 19, 14, 4, 19, 4, 17,
  16535. 1, 12, 14, 1, 14, 5, 1, 5, 9
  16536. ];
  16537. PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
  16538. this.type = 'DodecahedronBufferGeometry';
  16539. this.parameters = {
  16540. radius: radius,
  16541. detail: detail
  16542. };
  16543. }
  16544. DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
  16545. DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;
  16546. /**
  16547. * @author oosmoxiecode / https://github.com/oosmoxiecode
  16548. * @author WestLangley / https://github.com/WestLangley
  16549. * @author zz85 / https://github.com/zz85
  16550. * @author miningold / https://github.com/miningold
  16551. * @author jonobr1 / https://github.com/jonobr1
  16552. * @author Mugen87 / https://github.com/Mugen87
  16553. *
  16554. */
  16555. // TubeGeometry
  16556. function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {
  16557. Geometry.call( this );
  16558. this.type = 'TubeGeometry';
  16559. this.parameters = {
  16560. path: path,
  16561. tubularSegments: tubularSegments,
  16562. radius: radius,
  16563. radialSegments: radialSegments,
  16564. closed: closed
  16565. };
  16566. if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );
  16567. var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );
  16568. // expose internals
  16569. this.tangents = bufferGeometry.tangents;
  16570. this.normals = bufferGeometry.normals;
  16571. this.binormals = bufferGeometry.binormals;
  16572. // create geometry
  16573. this.fromBufferGeometry( bufferGeometry );
  16574. this.mergeVertices();
  16575. }
  16576. TubeGeometry.prototype = Object.create( Geometry.prototype );
  16577. TubeGeometry.prototype.constructor = TubeGeometry;
  16578. // TubeBufferGeometry
  16579. function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {
  16580. BufferGeometry.call( this );
  16581. this.type = 'TubeBufferGeometry';
  16582. this.parameters = {
  16583. path: path,
  16584. tubularSegments: tubularSegments,
  16585. radius: radius,
  16586. radialSegments: radialSegments,
  16587. closed: closed
  16588. };
  16589. tubularSegments = tubularSegments || 64;
  16590. radius = radius || 1;
  16591. radialSegments = radialSegments || 8;
  16592. closed = closed || false;
  16593. var frames = path.computeFrenetFrames( tubularSegments, closed );
  16594. // expose internals
  16595. this.tangents = frames.tangents;
  16596. this.normals = frames.normals;
  16597. this.binormals = frames.binormals;
  16598. // helper variables
  16599. var vertex = new Vector3();
  16600. var normal = new Vector3();
  16601. var uv = new Vector2();
  16602. var P = new Vector3();
  16603. var i, j;
  16604. // buffer
  16605. var vertices = [];
  16606. var normals = [];
  16607. var uvs = [];
  16608. var indices = [];
  16609. // create buffer data
  16610. generateBufferData();
  16611. // build geometry
  16612. this.setIndex( indices );
  16613. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  16614. this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
  16615. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  16616. // functions
  16617. function generateBufferData() {
  16618. for ( i = 0; i < tubularSegments; i ++ ) {
  16619. generateSegment( i );
  16620. }
  16621. // if the geometry is not closed, generate the last row of vertices and normals
  16622. // at the regular position on the given path
  16623. //
  16624. // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)
  16625. generateSegment( ( closed === false ) ? tubularSegments : 0 );
  16626. // uvs are generated in a separate function.
  16627. // this makes it easy compute correct values for closed geometries
  16628. generateUVs();
  16629. // finally create faces
  16630. generateIndices();
  16631. }
  16632. function generateSegment( i ) {
  16633. // we use getPointAt to sample evenly distributed points from the given path
  16634. P = path.getPointAt( i / tubularSegments, P );
  16635. // retrieve corresponding normal and binormal
  16636. var N = frames.normals[ i ];
  16637. var B = frames.binormals[ i ];
  16638. // generate normals and vertices for the current segment
  16639. for ( j = 0; j <= radialSegments; j ++ ) {
  16640. var v = j / radialSegments * Math.PI * 2;
  16641. var sin = Math.sin( v );
  16642. var cos = - Math.cos( v );
  16643. // normal
  16644. normal.x = ( cos * N.x + sin * B.x );
  16645. normal.y = ( cos * N.y + sin * B.y );
  16646. normal.z = ( cos * N.z + sin * B.z );
  16647. normal.normalize();
  16648. normals.push( normal.x, normal.y, normal.z );
  16649. // vertex
  16650. vertex.x = P.x + radius * normal.x;
  16651. vertex.y = P.y + radius * normal.y;
  16652. vertex.z = P.z + radius * normal.z;
  16653. vertices.push( vertex.x, vertex.y, vertex.z );
  16654. }
  16655. }
  16656. function generateIndices() {
  16657. for ( j = 1; j <= tubularSegments; j ++ ) {
  16658. for ( i = 1; i <= radialSegments; i ++ ) {
  16659. var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );
  16660. var b = ( radialSegments + 1 ) * j + ( i - 1 );
  16661. var c = ( radialSegments + 1 ) * j + i;
  16662. var d = ( radialSegments + 1 ) * ( j - 1 ) + i;
  16663. // faces
  16664. indices.push( a, b, d );
  16665. indices.push( b, c, d );
  16666. }
  16667. }
  16668. }
  16669. function generateUVs() {
  16670. for ( i = 0; i <= tubularSegments; i ++ ) {
  16671. for ( j = 0; j <= radialSegments; j ++ ) {
  16672. uv.x = i / tubularSegments;
  16673. uv.y = j / radialSegments;
  16674. uvs.push( uv.x, uv.y );
  16675. }
  16676. }
  16677. }
  16678. }
  16679. TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  16680. TubeBufferGeometry.prototype.constructor = TubeBufferGeometry;
  16681. /**
  16682. * @author oosmoxiecode
  16683. * @author Mugen87 / https://github.com/Mugen87
  16684. *
  16685. * based on http://www.blackpawn.com/texts/pqtorus/
  16686. */
  16687. // TorusKnotGeometry
  16688. function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {
  16689. Geometry.call( this );
  16690. this.type = 'TorusKnotGeometry';
  16691. this.parameters = {
  16692. radius: radius,
  16693. tube: tube,
  16694. tubularSegments: tubularSegments,
  16695. radialSegments: radialSegments,
  16696. p: p,
  16697. q: q
  16698. };
  16699. if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );
  16700. this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );
  16701. this.mergeVertices();
  16702. }
  16703. TorusKnotGeometry.prototype = Object.create( Geometry.prototype );
  16704. TorusKnotGeometry.prototype.constructor = TorusKnotGeometry;
  16705. // TorusKnotBufferGeometry
  16706. function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {
  16707. BufferGeometry.call( this );
  16708. this.type = 'TorusKnotBufferGeometry';
  16709. this.parameters = {
  16710. radius: radius,
  16711. tube: tube,
  16712. tubularSegments: tubularSegments,
  16713. radialSegments: radialSegments,
  16714. p: p,
  16715. q: q
  16716. };
  16717. radius = radius || 1;
  16718. tube = tube || 0.4;
  16719. tubularSegments = Math.floor( tubularSegments ) || 64;
  16720. radialSegments = Math.floor( radialSegments ) || 8;
  16721. p = p || 2;
  16722. q = q || 3;
  16723. // buffers
  16724. var indices = [];
  16725. var vertices = [];
  16726. var normals = [];
  16727. var uvs = [];
  16728. // helper variables
  16729. var i, j;
  16730. var vertex = new Vector3();
  16731. var normal = new Vector3();
  16732. var P1 = new Vector3();
  16733. var P2 = new Vector3();
  16734. var B = new Vector3();
  16735. var T = new Vector3();
  16736. var N = new Vector3();
  16737. // generate vertices, normals and uvs
  16738. for ( i = 0; i <= tubularSegments; ++ i ) {
  16739. // the radian "u" is used to calculate the position on the torus curve of the current tubular segement
  16740. var u = i / tubularSegments * p * Math.PI * 2;
  16741. // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.
  16742. // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions
  16743. calculatePositionOnCurve( u, p, q, radius, P1 );
  16744. calculatePositionOnCurve( u + 0.01, p, q, radius, P2 );
  16745. // calculate orthonormal basis
  16746. T.subVectors( P2, P1 );
  16747. N.addVectors( P2, P1 );
  16748. B.crossVectors( T, N );
  16749. N.crossVectors( B, T );
  16750. // normalize B, N. T can be ignored, we don't use it
  16751. B.normalize();
  16752. N.normalize();
  16753. for ( j = 0; j <= radialSegments; ++ j ) {
  16754. // now calculate the vertices. they are nothing more than an extrusion of the torus curve.
  16755. // because we extrude a shape in the xy-plane, there is no need to calculate a z-value.
  16756. var v = j / radialSegments * Math.PI * 2;
  16757. var cx = - tube * Math.cos( v );
  16758. var cy = tube * Math.sin( v );
  16759. // now calculate the final vertex position.
  16760. // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve
  16761. vertex.x = P1.x + ( cx * N.x + cy * B.x );
  16762. vertex.y = P1.y + ( cx * N.y + cy * B.y );
  16763. vertex.z = P1.z + ( cx * N.z + cy * B.z );
  16764. vertices.push( vertex.x, vertex.y, vertex.z );
  16765. // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)
  16766. normal.subVectors( vertex, P1 ).normalize();
  16767. normals.push( normal.x, normal.y, normal.z );
  16768. // uv
  16769. uvs.push( i / tubularSegments );
  16770. uvs.push( j / radialSegments );
  16771. }
  16772. }
  16773. // generate indices
  16774. for ( j = 1; j <= tubularSegments; j ++ ) {
  16775. for ( i = 1; i <= radialSegments; i ++ ) {
  16776. // indices
  16777. var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );
  16778. var b = ( radialSegments + 1 ) * j + ( i - 1 );
  16779. var c = ( radialSegments + 1 ) * j + i;
  16780. var d = ( radialSegments + 1 ) * ( j - 1 ) + i;
  16781. // faces
  16782. indices.push( a, b, d );
  16783. indices.push( b, c, d );
  16784. }
  16785. }
  16786. // build geometry
  16787. this.setIndex( indices );
  16788. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  16789. this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
  16790. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  16791. // this function calculates the current position on the torus curve
  16792. function calculatePositionOnCurve( u, p, q, radius, position ) {
  16793. var cu = Math.cos( u );
  16794. var su = Math.sin( u );
  16795. var quOverP = q / p * u;
  16796. var cs = Math.cos( quOverP );
  16797. position.x = radius * ( 2 + cs ) * 0.5 * cu;
  16798. position.y = radius * ( 2 + cs ) * su * 0.5;
  16799. position.z = radius * Math.sin( quOverP ) * 0.5;
  16800. }
  16801. }
  16802. TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  16803. TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;
  16804. /**
  16805. * @author oosmoxiecode
  16806. * @author mrdoob / http://mrdoob.com/
  16807. * @author Mugen87 / https://github.com/Mugen87
  16808. */
  16809. // TorusGeometry
  16810. function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {
  16811. Geometry.call( this );
  16812. this.type = 'TorusGeometry';
  16813. this.parameters = {
  16814. radius: radius,
  16815. tube: tube,
  16816. radialSegments: radialSegments,
  16817. tubularSegments: tubularSegments,
  16818. arc: arc
  16819. };
  16820. this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );
  16821. this.mergeVertices();
  16822. }
  16823. TorusGeometry.prototype = Object.create( Geometry.prototype );
  16824. TorusGeometry.prototype.constructor = TorusGeometry;
  16825. // TorusBufferGeometry
  16826. function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {
  16827. BufferGeometry.call( this );
  16828. this.type = 'TorusBufferGeometry';
  16829. this.parameters = {
  16830. radius: radius,
  16831. tube: tube,
  16832. radialSegments: radialSegments,
  16833. tubularSegments: tubularSegments,
  16834. arc: arc
  16835. };
  16836. radius = radius || 1;
  16837. tube = tube || 0.4;
  16838. radialSegments = Math.floor( radialSegments ) || 8;
  16839. tubularSegments = Math.floor( tubularSegments ) || 6;
  16840. arc = arc || Math.PI * 2;
  16841. // buffers
  16842. var indices = [];
  16843. var vertices = [];
  16844. var normals = [];
  16845. var uvs = [];
  16846. // helper variables
  16847. var center = new Vector3();
  16848. var vertex = new Vector3();
  16849. var normal = new Vector3();
  16850. var j, i;
  16851. // generate vertices, normals and uvs
  16852. for ( j = 0; j <= radialSegments; j ++ ) {
  16853. for ( i = 0; i <= tubularSegments; i ++ ) {
  16854. var u = i / tubularSegments * arc;
  16855. var v = j / radialSegments * Math.PI * 2;
  16856. // vertex
  16857. vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );
  16858. vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );
  16859. vertex.z = tube * Math.sin( v );
  16860. vertices.push( vertex.x, vertex.y, vertex.z );
  16861. // normal
  16862. center.x = radius * Math.cos( u );
  16863. center.y = radius * Math.sin( u );
  16864. normal.subVectors( vertex, center ).normalize();
  16865. normals.push( normal.x, normal.y, normal.z );
  16866. // uv
  16867. uvs.push( i / tubularSegments );
  16868. uvs.push( j / radialSegments );
  16869. }
  16870. }
  16871. // generate indices
  16872. for ( j = 1; j <= radialSegments; j ++ ) {
  16873. for ( i = 1; i <= tubularSegments; i ++ ) {
  16874. // indices
  16875. var a = ( tubularSegments + 1 ) * j + i - 1;
  16876. var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;
  16877. var c = ( tubularSegments + 1 ) * ( j - 1 ) + i;
  16878. var d = ( tubularSegments + 1 ) * j + i;
  16879. // faces
  16880. indices.push( a, b, d );
  16881. indices.push( b, c, d );
  16882. }
  16883. }
  16884. // build geometry
  16885. this.setIndex( indices );
  16886. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  16887. this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
  16888. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  16889. }
  16890. TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  16891. TorusBufferGeometry.prototype.constructor = TorusBufferGeometry;
  16892. /**
  16893. * @author Mugen87 / https://github.com/Mugen87
  16894. * Port from https://github.com/mapbox/earcut (v2.1.2)
  16895. */
  16896. var Earcut = {
  16897. triangulate: function ( data, holeIndices, dim ) {
  16898. dim = dim || 2;
  16899. var hasHoles = holeIndices && holeIndices.length,
  16900. outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length,
  16901. outerNode = linkedList( data, 0, outerLen, dim, true ),
  16902. triangles = [];
  16903. if ( ! outerNode ) return triangles;
  16904. var minX, minY, maxX, maxY, x, y, invSize;
  16905. if ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );
  16906. // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
  16907. if ( data.length > 80 * dim ) {
  16908. minX = maxX = data[ 0 ];
  16909. minY = maxY = data[ 1 ];
  16910. for ( var i = dim; i < outerLen; i += dim ) {
  16911. x = data[ i ];
  16912. y = data[ i + 1 ];
  16913. if ( x < minX ) minX = x;
  16914. if ( y < minY ) minY = y;
  16915. if ( x > maxX ) maxX = x;
  16916. if ( y > maxY ) maxY = y;
  16917. }
  16918. // minX, minY and invSize are later used to transform coords into integers for z-order calculation
  16919. invSize = Math.max( maxX - minX, maxY - minY );
  16920. invSize = invSize !== 0 ? 1 / invSize : 0;
  16921. }
  16922. earcutLinked( outerNode, triangles, dim, minX, minY, invSize );
  16923. return triangles;
  16924. }
  16925. };
  16926. // create a circular doubly linked list from polygon points in the specified winding order
  16927. function linkedList( data, start, end, dim, clockwise ) {
  16928. var i, last;
  16929. if ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {
  16930. for ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );
  16931. } else {
  16932. for ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );
  16933. }
  16934. if ( last && equals( last, last.next ) ) {
  16935. removeNode( last );
  16936. last = last.next;
  16937. }
  16938. return last;
  16939. }
  16940. // eliminate colinear or duplicate points
  16941. function filterPoints( start, end ) {
  16942. if ( ! start ) return start;
  16943. if ( ! end ) end = start;
  16944. var p = start, again;
  16945. do {
  16946. again = false;
  16947. if ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {
  16948. removeNode( p );
  16949. p = end = p.prev;
  16950. if ( p === p.next ) break;
  16951. again = true;
  16952. } else {
  16953. p = p.next;
  16954. }
  16955. } while ( again || p !== end );
  16956. return end;
  16957. }
  16958. // main ear slicing loop which triangulates a polygon (given as a linked list)
  16959. function earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {
  16960. if ( ! ear ) return;
  16961. // interlink polygon nodes in z-order
  16962. if ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );
  16963. var stop = ear, prev, next;
  16964. // iterate through ears, slicing them one by one
  16965. while ( ear.prev !== ear.next ) {
  16966. prev = ear.prev;
  16967. next = ear.next;
  16968. if ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {
  16969. // cut off the triangle
  16970. triangles.push( prev.i / dim );
  16971. triangles.push( ear.i / dim );
  16972. triangles.push( next.i / dim );
  16973. removeNode( ear );
  16974. // skipping the next vertice leads to less sliver triangles
  16975. ear = next.next;
  16976. stop = next.next;
  16977. continue;
  16978. }
  16979. ear = next;
  16980. // if we looped through the whole remaining polygon and can't find any more ears
  16981. if ( ear === stop ) {
  16982. // try filtering points and slicing again
  16983. if ( ! pass ) {
  16984. earcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );
  16985. // if this didn't work, try curing all small self-intersections locally
  16986. } else if ( pass === 1 ) {
  16987. ear = cureLocalIntersections( ear, triangles, dim );
  16988. earcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );
  16989. // as a last resort, try splitting the remaining polygon into two
  16990. } else if ( pass === 2 ) {
  16991. splitEarcut( ear, triangles, dim, minX, minY, invSize );
  16992. }
  16993. break;
  16994. }
  16995. }
  16996. }
  16997. // check whether a polygon node forms a valid ear with adjacent nodes
  16998. function isEar( ear ) {
  16999. var a = ear.prev,
  17000. b = ear,
  17001. c = ear.next;
  17002. if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear
  17003. // now make sure we don't have other points inside the potential ear
  17004. var p = ear.next.next;
  17005. while ( p !== ear.prev ) {
  17006. if ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) {
  17007. return false;
  17008. }
  17009. p = p.next;
  17010. }
  17011. return true;
  17012. }
  17013. function isEarHashed( ear, minX, minY, invSize ) {
  17014. var a = ear.prev,
  17015. b = ear,
  17016. c = ear.next;
  17017. if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear
  17018. // triangle bbox; min & max are calculated like this for speed
  17019. var minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ),
  17020. minTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ),
  17021. maxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ),
  17022. maxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y );
  17023. // z-order range for the current triangle bbox;
  17024. var minZ = zOrder( minTX, minTY, minX, minY, invSize ),
  17025. maxZ = zOrder( maxTX, maxTY, minX, minY, invSize );
  17026. // first look for points inside the triangle in increasing z-order
  17027. var p = ear.nextZ;
  17028. while ( p && p.z <= maxZ ) {
  17029. if ( p !== ear.prev && p !== ear.next &&
  17030. pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&
  17031. area( p.prev, p, p.next ) >= 0 ) return false;
  17032. p = p.nextZ;
  17033. }
  17034. // then look for points in decreasing z-order
  17035. p = ear.prevZ;
  17036. while ( p && p.z >= minZ ) {
  17037. if ( p !== ear.prev && p !== ear.next &&
  17038. pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&
  17039. area( p.prev, p, p.next ) >= 0 ) return false;
  17040. p = p.prevZ;
  17041. }
  17042. return true;
  17043. }
  17044. // go through all polygon nodes and cure small local self-intersections
  17045. function cureLocalIntersections( start, triangles, dim ) {
  17046. var p = start;
  17047. do {
  17048. var a = p.prev, b = p.next.next;
  17049. if ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {
  17050. triangles.push( a.i / dim );
  17051. triangles.push( p.i / dim );
  17052. triangles.push( b.i / dim );
  17053. // remove two nodes involved
  17054. removeNode( p );
  17055. removeNode( p.next );
  17056. p = start = b;
  17057. }
  17058. p = p.next;
  17059. } while ( p !== start );
  17060. return p;
  17061. }
  17062. // try splitting polygon into two and triangulate them independently
  17063. function splitEarcut( start, triangles, dim, minX, minY, invSize ) {
  17064. // look for a valid diagonal that divides the polygon into two
  17065. var a = start;
  17066. do {
  17067. var b = a.next.next;
  17068. while ( b !== a.prev ) {
  17069. if ( a.i !== b.i && isValidDiagonal( a, b ) ) {
  17070. // split the polygon in two by the diagonal
  17071. var c = splitPolygon( a, b );
  17072. // filter colinear points around the cuts
  17073. a = filterPoints( a, a.next );
  17074. c = filterPoints( c, c.next );
  17075. // run earcut on each half
  17076. earcutLinked( a, triangles, dim, minX, minY, invSize );
  17077. earcutLinked( c, triangles, dim, minX, minY, invSize );
  17078. return;
  17079. }
  17080. b = b.next;
  17081. }
  17082. a = a.next;
  17083. } while ( a !== start );
  17084. }
  17085. // link every hole into the outer loop, producing a single-ring polygon without holes
  17086. function eliminateHoles( data, holeIndices, outerNode, dim ) {
  17087. var queue = [], i, len, start, end, list;
  17088. for ( i = 0, len = holeIndices.length; i < len; i ++ ) {
  17089. start = holeIndices[ i ] * dim;
  17090. end = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;
  17091. list = linkedList( data, start, end, dim, false );
  17092. if ( list === list.next ) list.steiner = true;
  17093. queue.push( getLeftmost( list ) );
  17094. }
  17095. queue.sort( compareX );
  17096. // process holes from left to right
  17097. for ( i = 0; i < queue.length; i ++ ) {
  17098. eliminateHole( queue[ i ], outerNode );
  17099. outerNode = filterPoints( outerNode, outerNode.next );
  17100. }
  17101. return outerNode;
  17102. }
  17103. function compareX( a, b ) {
  17104. return a.x - b.x;
  17105. }
  17106. // find a bridge between vertices that connects hole with an outer ring and and link it
  17107. function eliminateHole( hole, outerNode ) {
  17108. outerNode = findHoleBridge( hole, outerNode );
  17109. if ( outerNode ) {
  17110. var b = splitPolygon( outerNode, hole );
  17111. filterPoints( b, b.next );
  17112. }
  17113. }
  17114. // David Eberly's algorithm for finding a bridge between hole and outer polygon
  17115. function findHoleBridge( hole, outerNode ) {
  17116. var p = outerNode,
  17117. hx = hole.x,
  17118. hy = hole.y,
  17119. qx = - Infinity,
  17120. m;
  17121. // find a segment intersected by a ray from the hole's leftmost point to the left;
  17122. // segment's endpoint with lesser x will be potential connection point
  17123. do {
  17124. if ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {
  17125. var x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );
  17126. if ( x <= hx && x > qx ) {
  17127. qx = x;
  17128. if ( x === hx ) {
  17129. if ( hy === p.y ) return p;
  17130. if ( hy === p.next.y ) return p.next;
  17131. }
  17132. m = p.x < p.next.x ? p : p.next;
  17133. }
  17134. }
  17135. p = p.next;
  17136. } while ( p !== outerNode );
  17137. if ( ! m ) return null;
  17138. if ( hx === qx ) return m.prev; // hole touches outer segment; pick lower endpoint
  17139. // look for points inside the triangle of hole point, segment intersection and endpoint;
  17140. // if there are no points found, we have a valid connection;
  17141. // otherwise choose the point of the minimum angle with the ray as connection point
  17142. var stop = m,
  17143. mx = m.x,
  17144. my = m.y,
  17145. tanMin = Infinity,
  17146. tan;
  17147. p = m.next;
  17148. while ( p !== stop ) {
  17149. if ( hx >= p.x && p.x >= mx && hx !== p.x &&
  17150. pointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {
  17151. tan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential
  17152. if ( ( tan < tanMin || ( tan === tanMin && p.x > m.x ) ) && locallyInside( p, hole ) ) {
  17153. m = p;
  17154. tanMin = tan;
  17155. }
  17156. }
  17157. p = p.next;
  17158. }
  17159. return m;
  17160. }
  17161. // interlink polygon nodes in z-order
  17162. function indexCurve( start, minX, minY, invSize ) {
  17163. var p = start;
  17164. do {
  17165. if ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize );
  17166. p.prevZ = p.prev;
  17167. p.nextZ = p.next;
  17168. p = p.next;
  17169. } while ( p !== start );
  17170. p.prevZ.nextZ = null;
  17171. p.prevZ = null;
  17172. sortLinked( p );
  17173. }
  17174. // Simon Tatham's linked list merge sort algorithm
  17175. // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
  17176. function sortLinked( list ) {
  17177. var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1;
  17178. do {
  17179. p = list;
  17180. list = null;
  17181. tail = null;
  17182. numMerges = 0;
  17183. while ( p ) {
  17184. numMerges ++;
  17185. q = p;
  17186. pSize = 0;
  17187. for ( i = 0; i < inSize; i ++ ) {
  17188. pSize ++;
  17189. q = q.nextZ;
  17190. if ( ! q ) break;
  17191. }
  17192. qSize = inSize;
  17193. while ( pSize > 0 || ( qSize > 0 && q ) ) {
  17194. if ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {
  17195. e = p;
  17196. p = p.nextZ;
  17197. pSize --;
  17198. } else {
  17199. e = q;
  17200. q = q.nextZ;
  17201. qSize --;
  17202. }
  17203. if ( tail ) tail.nextZ = e;
  17204. else list = e;
  17205. e.prevZ = tail;
  17206. tail = e;
  17207. }
  17208. p = q;
  17209. }
  17210. tail.nextZ = null;
  17211. inSize *= 2;
  17212. } while ( numMerges > 1 );
  17213. return list;
  17214. }
  17215. // z-order of a point given coords and inverse of the longer side of data bbox
  17216. function zOrder( x, y, minX, minY, invSize ) {
  17217. // coords are transformed into non-negative 15-bit integer range
  17218. x = 32767 * ( x - minX ) * invSize;
  17219. y = 32767 * ( y - minY ) * invSize;
  17220. x = ( x | ( x << 8 ) ) & 0x00FF00FF;
  17221. x = ( x | ( x << 4 ) ) & 0x0F0F0F0F;
  17222. x = ( x | ( x << 2 ) ) & 0x33333333;
  17223. x = ( x | ( x << 1 ) ) & 0x55555555;
  17224. y = ( y | ( y << 8 ) ) & 0x00FF00FF;
  17225. y = ( y | ( y << 4 ) ) & 0x0F0F0F0F;
  17226. y = ( y | ( y << 2 ) ) & 0x33333333;
  17227. y = ( y | ( y << 1 ) ) & 0x55555555;
  17228. return x | ( y << 1 );
  17229. }
  17230. // find the leftmost node of a polygon ring
  17231. function getLeftmost( start ) {
  17232. var p = start, leftmost = start;
  17233. do {
  17234. if ( p.x < leftmost.x ) leftmost = p;
  17235. p = p.next;
  17236. } while ( p !== start );
  17237. return leftmost;
  17238. }
  17239. // check if a point lies within a convex triangle
  17240. function pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {
  17241. return ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 &&
  17242. ( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 &&
  17243. ( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0;
  17244. }
  17245. // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
  17246. function isValidDiagonal( a, b ) {
  17247. return a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) &&
  17248. locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b );
  17249. }
  17250. // signed area of a triangle
  17251. function area( p, q, r ) {
  17252. return ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );
  17253. }
  17254. // check if two points are equal
  17255. function equals( p1, p2 ) {
  17256. return p1.x === p2.x && p1.y === p2.y;
  17257. }
  17258. // check if two segments intersect
  17259. function intersects( p1, q1, p2, q2 ) {
  17260. if ( ( equals( p1, q1 ) && equals( p2, q2 ) ) ||
  17261. ( equals( p1, q2 ) && equals( p2, q1 ) ) ) return true;
  17262. return area( p1, q1, p2 ) > 0 !== area( p1, q1, q2 ) > 0 &&
  17263. area( p2, q2, p1 ) > 0 !== area( p2, q2, q1 ) > 0;
  17264. }
  17265. // check if a polygon diagonal intersects any polygon segments
  17266. function intersectsPolygon( a, b ) {
  17267. var p = a;
  17268. do {
  17269. if ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
  17270. intersects( p, p.next, a, b ) ) {
  17271. return true;
  17272. }
  17273. p = p.next;
  17274. } while ( p !== a );
  17275. return false;
  17276. }
  17277. // check if a polygon diagonal is locally inside the polygon
  17278. function locallyInside( a, b ) {
  17279. return area( a.prev, a, a.next ) < 0 ?
  17280. area( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :
  17281. area( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;
  17282. }
  17283. // check if the middle point of a polygon diagonal is inside the polygon
  17284. function middleInside( a, b ) {
  17285. var p = a,
  17286. inside = false,
  17287. px = ( a.x + b.x ) / 2,
  17288. py = ( a.y + b.y ) / 2;
  17289. do {
  17290. if ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&
  17291. ( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) ) {
  17292. inside = ! inside;
  17293. }
  17294. p = p.next;
  17295. } while ( p !== a );
  17296. return inside;
  17297. }
  17298. // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
  17299. // if one belongs to the outer ring and another to a hole, it merges it into a single ring
  17300. function splitPolygon( a, b ) {
  17301. var a2 = new Node( a.i, a.x, a.y ),
  17302. b2 = new Node( b.i, b.x, b.y ),
  17303. an = a.next,
  17304. bp = b.prev;
  17305. a.next = b;
  17306. b.prev = a;
  17307. a2.next = an;
  17308. an.prev = a2;
  17309. b2.next = a2;
  17310. a2.prev = b2;
  17311. bp.next = b2;
  17312. b2.prev = bp;
  17313. return b2;
  17314. }
  17315. // create a node and optionally link it with previous one (in a circular doubly linked list)
  17316. function insertNode( i, x, y, last ) {
  17317. var p = new Node( i, x, y );
  17318. if ( ! last ) {
  17319. p.prev = p;
  17320. p.next = p;
  17321. } else {
  17322. p.next = last.next;
  17323. p.prev = last;
  17324. last.next.prev = p;
  17325. last.next = p;
  17326. }
  17327. return p;
  17328. }
  17329. function removeNode( p ) {
  17330. p.next.prev = p.prev;
  17331. p.prev.next = p.next;
  17332. if ( p.prevZ ) p.prevZ.nextZ = p.nextZ;
  17333. if ( p.nextZ ) p.nextZ.prevZ = p.prevZ;
  17334. }
  17335. function Node( i, x, y ) {
  17336. // vertice index in coordinates array
  17337. this.i = i;
  17338. // vertex coordinates
  17339. this.x = x;
  17340. this.y = y;
  17341. // previous and next vertice nodes in a polygon ring
  17342. this.prev = null;
  17343. this.next = null;
  17344. // z-order curve value
  17345. this.z = null;
  17346. // previous and next nodes in z-order
  17347. this.prevZ = null;
  17348. this.nextZ = null;
  17349. // indicates whether this is a steiner point
  17350. this.steiner = false;
  17351. }
  17352. function signedArea( data, start, end, dim ) {
  17353. var sum = 0;
  17354. for ( var i = start, j = end - dim; i < end; i += dim ) {
  17355. sum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );
  17356. j = i;
  17357. }
  17358. return sum;
  17359. }
  17360. /**
  17361. * @author zz85 / http://www.lab4games.net/zz85/blog
  17362. */
  17363. var ShapeUtils = {
  17364. // calculate area of the contour polygon
  17365. area: function ( contour ) {
  17366. var n = contour.length;
  17367. var a = 0.0;
  17368. for ( var p = n - 1, q = 0; q < n; p = q ++ ) {
  17369. a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;
  17370. }
  17371. return a * 0.5;
  17372. },
  17373. isClockWise: function ( pts ) {
  17374. return ShapeUtils.area( pts ) < 0;
  17375. },
  17376. triangulateShape: function ( contour, holes ) {
  17377. var vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]
  17378. var holeIndices = []; // array of hole indices
  17379. var faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]
  17380. removeDupEndPts( contour );
  17381. addContour( vertices, contour );
  17382. //
  17383. var holeIndex = contour.length;
  17384. holes.forEach( removeDupEndPts );
  17385. for ( var i = 0; i < holes.length; i ++ ) {
  17386. holeIndices.push( holeIndex );
  17387. holeIndex += holes[ i ].length;
  17388. addContour( vertices, holes[ i ] );
  17389. }
  17390. //
  17391. var triangles = Earcut.triangulate( vertices, holeIndices );
  17392. //
  17393. for ( var i = 0; i < triangles.length; i += 3 ) {
  17394. faces.push( triangles.slice( i, i + 3 ) );
  17395. }
  17396. return faces;
  17397. }
  17398. };
  17399. function removeDupEndPts( points ) {
  17400. var l = points.length;
  17401. if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {
  17402. points.pop();
  17403. }
  17404. }
  17405. function addContour( vertices, contour ) {
  17406. for ( var i = 0; i < contour.length; i ++ ) {
  17407. vertices.push( contour[ i ].x );
  17408. vertices.push( contour[ i ].y );
  17409. }
  17410. }
  17411. /**
  17412. * @author zz85 / http://www.lab4games.net/zz85/blog
  17413. *
  17414. * Creates extruded geometry from a path shape.
  17415. *
  17416. * parameters = {
  17417. *
  17418. * curveSegments: <int>, // number of points on the curves
  17419. * steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too
  17420. * depth: <float>, // Depth to extrude the shape
  17421. *
  17422. * bevelEnabled: <bool>, // turn on bevel
  17423. * bevelThickness: <float>, // how deep into the original shape bevel goes
  17424. * bevelSize: <float>, // how far from shape outline is bevel
  17425. * bevelSegments: <int>, // number of bevel layers
  17426. *
  17427. * extrudePath: <THREE.Curve> // curve to extrude shape along
  17428. *
  17429. * UVGenerator: <Object> // object that provides UV generator functions
  17430. *
  17431. * }
  17432. */
  17433. // ExtrudeGeometry
  17434. function ExtrudeGeometry( shapes, options ) {
  17435. Geometry.call( this );
  17436. this.type = 'ExtrudeGeometry';
  17437. this.parameters = {
  17438. shapes: shapes,
  17439. options: options
  17440. };
  17441. this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) );
  17442. this.mergeVertices();
  17443. }
  17444. ExtrudeGeometry.prototype = Object.create( Geometry.prototype );
  17445. ExtrudeGeometry.prototype.constructor = ExtrudeGeometry;
  17446. ExtrudeGeometry.prototype.toJSON = function () {
  17447. var data = Geometry.prototype.toJSON.call( this );
  17448. var shapes = this.parameters.shapes;
  17449. var options = this.parameters.options;
  17450. return toJSON( shapes, options, data );
  17451. };
  17452. // ExtrudeBufferGeometry
  17453. function ExtrudeBufferGeometry( shapes, options ) {
  17454. BufferGeometry.call( this );
  17455. this.type = 'ExtrudeBufferGeometry';
  17456. this.parameters = {
  17457. shapes: shapes,
  17458. options: options
  17459. };
  17460. shapes = Array.isArray( shapes ) ? shapes : [ shapes ];
  17461. var scope = this;
  17462. var verticesArray = [];
  17463. var uvArray = [];
  17464. for ( var i = 0, l = shapes.length; i < l; i ++ ) {
  17465. var shape = shapes[ i ];
  17466. addShape( shape );
  17467. }
  17468. // build geometry
  17469. this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );
  17470. this.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );
  17471. this.computeVertexNormals();
  17472. // functions
  17473. function addShape( shape ) {
  17474. var placeholder = [];
  17475. // options
  17476. var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;
  17477. var steps = options.steps !== undefined ? options.steps : 1;
  17478. var depth = options.depth !== undefined ? options.depth : 100;
  17479. var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;
  17480. var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6;
  17481. var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2;
  17482. var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;
  17483. var extrudePath = options.extrudePath;
  17484. var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;
  17485. // deprecated options
  17486. if ( options.amount !== undefined ) {
  17487. console.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' );
  17488. depth = options.amount;
  17489. }
  17490. //
  17491. var extrudePts, extrudeByPath = false;
  17492. var splineTube, binormal, normal, position2;
  17493. if ( extrudePath ) {
  17494. extrudePts = extrudePath.getSpacedPoints( steps );
  17495. extrudeByPath = true;
  17496. bevelEnabled = false; // bevels not supported for path extrusion
  17497. // SETUP TNB variables
  17498. // TODO1 - have a .isClosed in spline?
  17499. splineTube = extrudePath.computeFrenetFrames( steps, false );
  17500. // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);
  17501. binormal = new Vector3();
  17502. normal = new Vector3();
  17503. position2 = new Vector3();
  17504. }
  17505. // Safeguards if bevels are not enabled
  17506. if ( ! bevelEnabled ) {
  17507. bevelSegments = 0;
  17508. bevelThickness = 0;
  17509. bevelSize = 0;
  17510. }
  17511. // Variables initialization
  17512. var ahole, h, hl; // looping of holes
  17513. var shapePoints = shape.extractPoints( curveSegments );
  17514. var vertices = shapePoints.shape;
  17515. var holes = shapePoints.holes;
  17516. var reverse = ! ShapeUtils.isClockWise( vertices );
  17517. if ( reverse ) {
  17518. vertices = vertices.reverse();
  17519. // Maybe we should also check if holes are in the opposite direction, just to be safe ...
  17520. for ( h = 0, hl = holes.length; h < hl; h ++ ) {
  17521. ahole = holes[ h ];
  17522. if ( ShapeUtils.isClockWise( ahole ) ) {
  17523. holes[ h ] = ahole.reverse();
  17524. }
  17525. }
  17526. }
  17527. var faces = ShapeUtils.triangulateShape( vertices, holes );
  17528. /* Vertices */
  17529. var contour = vertices; // vertices has all points but contour has only points of circumference
  17530. for ( h = 0, hl = holes.length; h < hl; h ++ ) {
  17531. ahole = holes[ h ];
  17532. vertices = vertices.concat( ahole );
  17533. }
  17534. function scalePt2( pt, vec, size ) {
  17535. if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" );
  17536. return vec.clone().multiplyScalar( size ).add( pt );
  17537. }
  17538. var b, bs, t, z,
  17539. vert, vlen = vertices.length,
  17540. face, flen = faces.length;
  17541. // Find directions for point movement
  17542. function getBevelVec( inPt, inPrev, inNext ) {
  17543. // computes for inPt the corresponding point inPt' on a new contour
  17544. // shifted by 1 unit (length of normalized vector) to the left
  17545. // if we walk along contour clockwise, this new contour is outside the old one
  17546. //
  17547. // inPt' is the intersection of the two lines parallel to the two
  17548. // adjacent edges of inPt at a distance of 1 unit on the left side.
  17549. var v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt
  17550. // good reading for geometry algorithms (here: line-line intersection)
  17551. // http://geomalgorithms.com/a05-_intersect-1.html
  17552. var v_prev_x = inPt.x - inPrev.x,
  17553. v_prev_y = inPt.y - inPrev.y;
  17554. var v_next_x = inNext.x - inPt.x,
  17555. v_next_y = inNext.y - inPt.y;
  17556. var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );
  17557. // check for collinear edges
  17558. var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );
  17559. if ( Math.abs( collinear0 ) > Number.EPSILON ) {
  17560. // not collinear
  17561. // length of vectors for normalizing
  17562. var v_prev_len = Math.sqrt( v_prev_lensq );
  17563. var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );
  17564. // shift adjacent points by unit vectors to the left
  17565. var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );
  17566. var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );
  17567. var ptNextShift_x = ( inNext.x - v_next_y / v_next_len );
  17568. var ptNextShift_y = ( inNext.y + v_next_x / v_next_len );
  17569. // scaling factor for v_prev to intersection point
  17570. var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -
  17571. ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /
  17572. ( v_prev_x * v_next_y - v_prev_y * v_next_x );
  17573. // vector from inPt to intersection point
  17574. v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );
  17575. v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );
  17576. // Don't normalize!, otherwise sharp corners become ugly
  17577. // but prevent crazy spikes
  17578. var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );
  17579. if ( v_trans_lensq <= 2 ) {
  17580. return new Vector2( v_trans_x, v_trans_y );
  17581. } else {
  17582. shrink_by = Math.sqrt( v_trans_lensq / 2 );
  17583. }
  17584. } else {
  17585. // handle special case of collinear edges
  17586. var direction_eq = false; // assumes: opposite
  17587. if ( v_prev_x > Number.EPSILON ) {
  17588. if ( v_next_x > Number.EPSILON ) {
  17589. direction_eq = true;
  17590. }
  17591. } else {
  17592. if ( v_prev_x < - Number.EPSILON ) {
  17593. if ( v_next_x < - Number.EPSILON ) {
  17594. direction_eq = true;
  17595. }
  17596. } else {
  17597. if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {
  17598. direction_eq = true;
  17599. }
  17600. }
  17601. }
  17602. if ( direction_eq ) {
  17603. // console.log("Warning: lines are a straight sequence");
  17604. v_trans_x = - v_prev_y;
  17605. v_trans_y = v_prev_x;
  17606. shrink_by = Math.sqrt( v_prev_lensq );
  17607. } else {
  17608. // console.log("Warning: lines are a straight spike");
  17609. v_trans_x = v_prev_x;
  17610. v_trans_y = v_prev_y;
  17611. shrink_by = Math.sqrt( v_prev_lensq / 2 );
  17612. }
  17613. }
  17614. return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );
  17615. }
  17616. var contourMovements = [];
  17617. for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {
  17618. if ( j === il ) j = 0;
  17619. if ( k === il ) k = 0;
  17620. // (j)---(i)---(k)
  17621. // console.log('i,j,k', i, j , k)
  17622. contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );
  17623. }
  17624. var holesMovements = [],
  17625. oneHoleMovements, verticesMovements = contourMovements.concat();
  17626. for ( h = 0, hl = holes.length; h < hl; h ++ ) {
  17627. ahole = holes[ h ];
  17628. oneHoleMovements = [];
  17629. for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {
  17630. if ( j === il ) j = 0;
  17631. if ( k === il ) k = 0;
  17632. // (j)---(i)---(k)
  17633. oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );
  17634. }
  17635. holesMovements.push( oneHoleMovements );
  17636. verticesMovements = verticesMovements.concat( oneHoleMovements );
  17637. }
  17638. // Loop bevelSegments, 1 for the front, 1 for the back
  17639. for ( b = 0; b < bevelSegments; b ++ ) {
  17640. //for ( b = bevelSegments; b > 0; b -- ) {
  17641. t = b / bevelSegments;
  17642. z = bevelThickness * Math.cos( t * Math.PI / 2 );
  17643. bs = bevelSize * Math.sin( t * Math.PI / 2 );
  17644. // contract shape
  17645. for ( i = 0, il = contour.length; i < il; i ++ ) {
  17646. vert = scalePt2( contour[ i ], contourMovements[ i ], bs );
  17647. v( vert.x, vert.y, - z );
  17648. }
  17649. // expand holes
  17650. for ( h = 0, hl = holes.length; h < hl; h ++ ) {
  17651. ahole = holes[ h ];
  17652. oneHoleMovements = holesMovements[ h ];
  17653. for ( i = 0, il = ahole.length; i < il; i ++ ) {
  17654. vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );
  17655. v( vert.x, vert.y, - z );
  17656. }
  17657. }
  17658. }
  17659. bs = bevelSize;
  17660. // Back facing vertices
  17661. for ( i = 0; i < vlen; i ++ ) {
  17662. vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];
  17663. if ( ! extrudeByPath ) {
  17664. v( vert.x, vert.y, 0 );
  17665. } else {
  17666. // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );
  17667. normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );
  17668. binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );
  17669. position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );
  17670. v( position2.x, position2.y, position2.z );
  17671. }
  17672. }
  17673. // Add stepped vertices...
  17674. // Including front facing vertices
  17675. var s;
  17676. for ( s = 1; s <= steps; s ++ ) {
  17677. for ( i = 0; i < vlen; i ++ ) {
  17678. vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];
  17679. if ( ! extrudeByPath ) {
  17680. v( vert.x, vert.y, depth / steps * s );
  17681. } else {
  17682. // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );
  17683. normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );
  17684. binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );
  17685. position2.copy( extrudePts[ s ] ).add( normal ).add( binormal );
  17686. v( position2.x, position2.y, position2.z );
  17687. }
  17688. }
  17689. }
  17690. // Add bevel segments planes
  17691. //for ( b = 1; b <= bevelSegments; b ++ ) {
  17692. for ( b = bevelSegments - 1; b >= 0; b -- ) {
  17693. t = b / bevelSegments;
  17694. z = bevelThickness * Math.cos( t * Math.PI / 2 );
  17695. bs = bevelSize * Math.sin( t * Math.PI / 2 );
  17696. // contract shape
  17697. for ( i = 0, il = contour.length; i < il; i ++ ) {
  17698. vert = scalePt2( contour[ i ], contourMovements[ i ], bs );
  17699. v( vert.x, vert.y, depth + z );
  17700. }
  17701. // expand holes
  17702. for ( h = 0, hl = holes.length; h < hl; h ++ ) {
  17703. ahole = holes[ h ];
  17704. oneHoleMovements = holesMovements[ h ];
  17705. for ( i = 0, il = ahole.length; i < il; i ++ ) {
  17706. vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );
  17707. if ( ! extrudeByPath ) {
  17708. v( vert.x, vert.y, depth + z );
  17709. } else {
  17710. v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );
  17711. }
  17712. }
  17713. }
  17714. }
  17715. /* Faces */
  17716. // Top and bottom faces
  17717. buildLidFaces();
  17718. // Sides faces
  17719. buildSideFaces();
  17720. ///// Internal functions
  17721. function buildLidFaces() {
  17722. var start = verticesArray.length / 3;
  17723. if ( bevelEnabled ) {
  17724. var layer = 0; // steps + 1
  17725. var offset = vlen * layer;
  17726. // Bottom faces
  17727. for ( i = 0; i < flen; i ++ ) {
  17728. face = faces[ i ];
  17729. f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );
  17730. }
  17731. layer = steps + bevelSegments * 2;
  17732. offset = vlen * layer;
  17733. // Top faces
  17734. for ( i = 0; i < flen; i ++ ) {
  17735. face = faces[ i ];
  17736. f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );
  17737. }
  17738. } else {
  17739. // Bottom faces
  17740. for ( i = 0; i < flen; i ++ ) {
  17741. face = faces[ i ];
  17742. f3( face[ 2 ], face[ 1 ], face[ 0 ] );
  17743. }
  17744. // Top faces
  17745. for ( i = 0; i < flen; i ++ ) {
  17746. face = faces[ i ];
  17747. f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );
  17748. }
  17749. }
  17750. scope.addGroup( start, verticesArray.length / 3 - start, 0 );
  17751. }
  17752. // Create faces for the z-sides of the shape
  17753. function buildSideFaces() {
  17754. var start = verticesArray.length / 3;
  17755. var layeroffset = 0;
  17756. sidewalls( contour, layeroffset );
  17757. layeroffset += contour.length;
  17758. for ( h = 0, hl = holes.length; h < hl; h ++ ) {
  17759. ahole = holes[ h ];
  17760. sidewalls( ahole, layeroffset );
  17761. //, true
  17762. layeroffset += ahole.length;
  17763. }
  17764. scope.addGroup( start, verticesArray.length / 3 - start, 1 );
  17765. }
  17766. function sidewalls( contour, layeroffset ) {
  17767. var j, k;
  17768. i = contour.length;
  17769. while ( -- i >= 0 ) {
  17770. j = i;
  17771. k = i - 1;
  17772. if ( k < 0 ) k = contour.length - 1;
  17773. //console.log('b', i,j, i-1, k,vertices.length);
  17774. var s = 0,
  17775. sl = steps + bevelSegments * 2;
  17776. for ( s = 0; s < sl; s ++ ) {
  17777. var slen1 = vlen * s;
  17778. var slen2 = vlen * ( s + 1 );
  17779. var a = layeroffset + j + slen1,
  17780. b = layeroffset + k + slen1,
  17781. c = layeroffset + k + slen2,
  17782. d = layeroffset + j + slen2;
  17783. f4( a, b, c, d );
  17784. }
  17785. }
  17786. }
  17787. function v( x, y, z ) {
  17788. placeholder.push( x );
  17789. placeholder.push( y );
  17790. placeholder.push( z );
  17791. }
  17792. function f3( a, b, c ) {
  17793. addVertex( a );
  17794. addVertex( b );
  17795. addVertex( c );
  17796. var nextIndex = verticesArray.length / 3;
  17797. var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );
  17798. addUV( uvs[ 0 ] );
  17799. addUV( uvs[ 1 ] );
  17800. addUV( uvs[ 2 ] );
  17801. }
  17802. function f4( a, b, c, d ) {
  17803. addVertex( a );
  17804. addVertex( b );
  17805. addVertex( d );
  17806. addVertex( b );
  17807. addVertex( c );
  17808. addVertex( d );
  17809. var nextIndex = verticesArray.length / 3;
  17810. var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );
  17811. addUV( uvs[ 0 ] );
  17812. addUV( uvs[ 1 ] );
  17813. addUV( uvs[ 3 ] );
  17814. addUV( uvs[ 1 ] );
  17815. addUV( uvs[ 2 ] );
  17816. addUV( uvs[ 3 ] );
  17817. }
  17818. function addVertex( index ) {
  17819. verticesArray.push( placeholder[ index * 3 + 0 ] );
  17820. verticesArray.push( placeholder[ index * 3 + 1 ] );
  17821. verticesArray.push( placeholder[ index * 3 + 2 ] );
  17822. }
  17823. function addUV( vector2 ) {
  17824. uvArray.push( vector2.x );
  17825. uvArray.push( vector2.y );
  17826. }
  17827. }
  17828. }
  17829. ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  17830. ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry;
  17831. ExtrudeBufferGeometry.prototype.toJSON = function () {
  17832. var data = BufferGeometry.prototype.toJSON.call( this );
  17833. var shapes = this.parameters.shapes;
  17834. var options = this.parameters.options;
  17835. return toJSON( shapes, options, data );
  17836. };
  17837. //
  17838. var WorldUVGenerator = {
  17839. generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {
  17840. var a_x = vertices[ indexA * 3 ];
  17841. var a_y = vertices[ indexA * 3 + 1 ];
  17842. var b_x = vertices[ indexB * 3 ];
  17843. var b_y = vertices[ indexB * 3 + 1 ];
  17844. var c_x = vertices[ indexC * 3 ];
  17845. var c_y = vertices[ indexC * 3 + 1 ];
  17846. return [
  17847. new Vector2( a_x, a_y ),
  17848. new Vector2( b_x, b_y ),
  17849. new Vector2( c_x, c_y )
  17850. ];
  17851. },
  17852. generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {
  17853. var a_x = vertices[ indexA * 3 ];
  17854. var a_y = vertices[ indexA * 3 + 1 ];
  17855. var a_z = vertices[ indexA * 3 + 2 ];
  17856. var b_x = vertices[ indexB * 3 ];
  17857. var b_y = vertices[ indexB * 3 + 1 ];
  17858. var b_z = vertices[ indexB * 3 + 2 ];
  17859. var c_x = vertices[ indexC * 3 ];
  17860. var c_y = vertices[ indexC * 3 + 1 ];
  17861. var c_z = vertices[ indexC * 3 + 2 ];
  17862. var d_x = vertices[ indexD * 3 ];
  17863. var d_y = vertices[ indexD * 3 + 1 ];
  17864. var d_z = vertices[ indexD * 3 + 2 ];
  17865. if ( Math.abs( a_y - b_y ) < 0.01 ) {
  17866. return [
  17867. new Vector2( a_x, 1 - a_z ),
  17868. new Vector2( b_x, 1 - b_z ),
  17869. new Vector2( c_x, 1 - c_z ),
  17870. new Vector2( d_x, 1 - d_z )
  17871. ];
  17872. } else {
  17873. return [
  17874. new Vector2( a_y, 1 - a_z ),
  17875. new Vector2( b_y, 1 - b_z ),
  17876. new Vector2( c_y, 1 - c_z ),
  17877. new Vector2( d_y, 1 - d_z )
  17878. ];
  17879. }
  17880. }
  17881. };
  17882. function toJSON( shapes, options, data ) {
  17883. //
  17884. data.shapes = [];
  17885. if ( Array.isArray( shapes ) ) {
  17886. for ( var i = 0, l = shapes.length; i < l; i ++ ) {
  17887. var shape = shapes[ i ];
  17888. data.shapes.push( shape.uuid );
  17889. }
  17890. } else {
  17891. data.shapes.push( shapes.uuid );
  17892. }
  17893. //
  17894. if ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();
  17895. return data;
  17896. }
  17897. /**
  17898. * @author zz85 / http://www.lab4games.net/zz85/blog
  17899. * @author alteredq / http://alteredqualia.com/
  17900. *
  17901. * Text = 3D Text
  17902. *
  17903. * parameters = {
  17904. * font: <THREE.Font>, // font
  17905. *
  17906. * size: <float>, // size of the text
  17907. * height: <float>, // thickness to extrude text
  17908. * curveSegments: <int>, // number of points on the curves
  17909. *
  17910. * bevelEnabled: <bool>, // turn on bevel
  17911. * bevelThickness: <float>, // how deep into text bevel goes
  17912. * bevelSize: <float> // how far from text outline is bevel
  17913. * }
  17914. */
  17915. // TextGeometry
  17916. function TextGeometry( text, parameters ) {
  17917. Geometry.call( this );
  17918. this.type = 'TextGeometry';
  17919. this.parameters = {
  17920. text: text,
  17921. parameters: parameters
  17922. };
  17923. this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) );
  17924. this.mergeVertices();
  17925. }
  17926. TextGeometry.prototype = Object.create( Geometry.prototype );
  17927. TextGeometry.prototype.constructor = TextGeometry;
  17928. // TextBufferGeometry
  17929. function TextBufferGeometry( text, parameters ) {
  17930. parameters = parameters || {};
  17931. var font = parameters.font;
  17932. if ( ! ( font && font.isFont ) ) {
  17933. console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );
  17934. return new Geometry();
  17935. }
  17936. var shapes = font.generateShapes( text, parameters.size );
  17937. // translate parameters to ExtrudeGeometry API
  17938. parameters.depth = parameters.height !== undefined ? parameters.height : 50;
  17939. // defaults
  17940. if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;
  17941. if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;
  17942. if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;
  17943. ExtrudeBufferGeometry.call( this, shapes, parameters );
  17944. this.type = 'TextBufferGeometry';
  17945. }
  17946. TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype );
  17947. TextBufferGeometry.prototype.constructor = TextBufferGeometry;
  17948. /**
  17949. * @author mrdoob / http://mrdoob.com/
  17950. * @author benaadams / https://twitter.com/ben_a_adams
  17951. * @author Mugen87 / https://github.com/Mugen87
  17952. */
  17953. // SphereGeometry
  17954. function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {
  17955. Geometry.call( this );
  17956. this.type = 'SphereGeometry';
  17957. this.parameters = {
  17958. radius: radius,
  17959. widthSegments: widthSegments,
  17960. heightSegments: heightSegments,
  17961. phiStart: phiStart,
  17962. phiLength: phiLength,
  17963. thetaStart: thetaStart,
  17964. thetaLength: thetaLength
  17965. };
  17966. this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );
  17967. this.mergeVertices();
  17968. }
  17969. SphereGeometry.prototype = Object.create( Geometry.prototype );
  17970. SphereGeometry.prototype.constructor = SphereGeometry;
  17971. // SphereBufferGeometry
  17972. function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {
  17973. BufferGeometry.call( this );
  17974. this.type = 'SphereBufferGeometry';
  17975. this.parameters = {
  17976. radius: radius,
  17977. widthSegments: widthSegments,
  17978. heightSegments: heightSegments,
  17979. phiStart: phiStart,
  17980. phiLength: phiLength,
  17981. thetaStart: thetaStart,
  17982. thetaLength: thetaLength
  17983. };
  17984. radius = radius || 1;
  17985. widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );
  17986. heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );
  17987. phiStart = phiStart !== undefined ? phiStart : 0;
  17988. phiLength = phiLength !== undefined ? phiLength : Math.PI * 2;
  17989. thetaStart = thetaStart !== undefined ? thetaStart : 0;
  17990. thetaLength = thetaLength !== undefined ? thetaLength : Math.PI;
  17991. var thetaEnd = thetaStart + thetaLength;
  17992. var ix, iy;
  17993. var index = 0;
  17994. var grid = [];
  17995. var vertex = new Vector3();
  17996. var normal = new Vector3();
  17997. // buffers
  17998. var indices = [];
  17999. var vertices = [];
  18000. var normals = [];
  18001. var uvs = [];
  18002. // generate vertices, normals and uvs
  18003. for ( iy = 0; iy <= heightSegments; iy ++ ) {
  18004. var verticesRow = [];
  18005. var v = iy / heightSegments;
  18006. for ( ix = 0; ix <= widthSegments; ix ++ ) {
  18007. var u = ix / widthSegments;
  18008. // vertex
  18009. vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
  18010. vertex.y = radius * Math.cos( thetaStart + v * thetaLength );
  18011. vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
  18012. vertices.push( vertex.x, vertex.y, vertex.z );
  18013. // normal
  18014. normal.set( vertex.x, vertex.y, vertex.z ).normalize();
  18015. normals.push( normal.x, normal.y, normal.z );
  18016. // uv
  18017. uvs.push( u, 1 - v );
  18018. verticesRow.push( index ++ );
  18019. }
  18020. grid.push( verticesRow );
  18021. }
  18022. // indices
  18023. for ( iy = 0; iy < heightSegments; iy ++ ) {
  18024. for ( ix = 0; ix < widthSegments; ix ++ ) {
  18025. var a = grid[ iy ][ ix + 1 ];
  18026. var b = grid[ iy ][ ix ];
  18027. var c = grid[ iy + 1 ][ ix ];
  18028. var d = grid[ iy + 1 ][ ix + 1 ];
  18029. if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );
  18030. if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );
  18031. }
  18032. }
  18033. // build geometry
  18034. this.setIndex( indices );
  18035. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  18036. this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
  18037. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  18038. }
  18039. SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  18040. SphereBufferGeometry.prototype.constructor = SphereBufferGeometry;
  18041. /**
  18042. * @author Kaleb Murphy
  18043. * @author Mugen87 / https://github.com/Mugen87
  18044. */
  18045. // RingGeometry
  18046. function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {
  18047. Geometry.call( this );
  18048. this.type = 'RingGeometry';
  18049. this.parameters = {
  18050. innerRadius: innerRadius,
  18051. outerRadius: outerRadius,
  18052. thetaSegments: thetaSegments,
  18053. phiSegments: phiSegments,
  18054. thetaStart: thetaStart,
  18055. thetaLength: thetaLength
  18056. };
  18057. this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );
  18058. this.mergeVertices();
  18059. }
  18060. RingGeometry.prototype = Object.create( Geometry.prototype );
  18061. RingGeometry.prototype.constructor = RingGeometry;
  18062. // RingBufferGeometry
  18063. function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {
  18064. BufferGeometry.call( this );
  18065. this.type = 'RingBufferGeometry';
  18066. this.parameters = {
  18067. innerRadius: innerRadius,
  18068. outerRadius: outerRadius,
  18069. thetaSegments: thetaSegments,
  18070. phiSegments: phiSegments,
  18071. thetaStart: thetaStart,
  18072. thetaLength: thetaLength
  18073. };
  18074. innerRadius = innerRadius || 0.5;
  18075. outerRadius = outerRadius || 1;
  18076. thetaStart = thetaStart !== undefined ? thetaStart : 0;
  18077. thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
  18078. thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;
  18079. phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;
  18080. // buffers
  18081. var indices = [];
  18082. var vertices = [];
  18083. var normals = [];
  18084. var uvs = [];
  18085. // some helper variables
  18086. var segment;
  18087. var radius = innerRadius;
  18088. var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );
  18089. var vertex = new Vector3();
  18090. var uv = new Vector2();
  18091. var j, i;
  18092. // generate vertices, normals and uvs
  18093. for ( j = 0; j <= phiSegments; j ++ ) {
  18094. for ( i = 0; i <= thetaSegments; i ++ ) {
  18095. // values are generate from the inside of the ring to the outside
  18096. segment = thetaStart + i / thetaSegments * thetaLength;
  18097. // vertex
  18098. vertex.x = radius * Math.cos( segment );
  18099. vertex.y = radius * Math.sin( segment );
  18100. vertices.push( vertex.x, vertex.y, vertex.z );
  18101. // normal
  18102. normals.push( 0, 0, 1 );
  18103. // uv
  18104. uv.x = ( vertex.x / outerRadius + 1 ) / 2;
  18105. uv.y = ( vertex.y / outerRadius + 1 ) / 2;
  18106. uvs.push( uv.x, uv.y );
  18107. }
  18108. // increase the radius for next row of vertices
  18109. radius += radiusStep;
  18110. }
  18111. // indices
  18112. for ( j = 0; j < phiSegments; j ++ ) {
  18113. var thetaSegmentLevel = j * ( thetaSegments + 1 );
  18114. for ( i = 0; i < thetaSegments; i ++ ) {
  18115. segment = i + thetaSegmentLevel;
  18116. var a = segment;
  18117. var b = segment + thetaSegments + 1;
  18118. var c = segment + thetaSegments + 2;
  18119. var d = segment + 1;
  18120. // faces
  18121. indices.push( a, b, d );
  18122. indices.push( b, c, d );
  18123. }
  18124. }
  18125. // build geometry
  18126. this.setIndex( indices );
  18127. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  18128. this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
  18129. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  18130. }
  18131. RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  18132. RingBufferGeometry.prototype.constructor = RingBufferGeometry;
  18133. /**
  18134. * @author astrodud / http://astrodud.isgreat.org/
  18135. * @author zz85 / https://github.com/zz85
  18136. * @author bhouston / http://clara.io
  18137. * @author Mugen87 / https://github.com/Mugen87
  18138. */
  18139. // LatheGeometry
  18140. function LatheGeometry( points, segments, phiStart, phiLength ) {
  18141. Geometry.call( this );
  18142. this.type = 'LatheGeometry';
  18143. this.parameters = {
  18144. points: points,
  18145. segments: segments,
  18146. phiStart: phiStart,
  18147. phiLength: phiLength
  18148. };
  18149. this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );
  18150. this.mergeVertices();
  18151. }
  18152. LatheGeometry.prototype = Object.create( Geometry.prototype );
  18153. LatheGeometry.prototype.constructor = LatheGeometry;
  18154. // LatheBufferGeometry
  18155. function LatheBufferGeometry( points, segments, phiStart, phiLength ) {
  18156. BufferGeometry.call( this );
  18157. this.type = 'LatheBufferGeometry';
  18158. this.parameters = {
  18159. points: points,
  18160. segments: segments,
  18161. phiStart: phiStart,
  18162. phiLength: phiLength
  18163. };
  18164. segments = Math.floor( segments ) || 12;
  18165. phiStart = phiStart || 0;
  18166. phiLength = phiLength || Math.PI * 2;
  18167. // clamp phiLength so it's in range of [ 0, 2PI ]
  18168. phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );
  18169. // buffers
  18170. var indices = [];
  18171. var vertices = [];
  18172. var uvs = [];
  18173. // helper variables
  18174. var base;
  18175. var inverseSegments = 1.0 / segments;
  18176. var vertex = new Vector3();
  18177. var uv = new Vector2();
  18178. var i, j;
  18179. // generate vertices and uvs
  18180. for ( i = 0; i <= segments; i ++ ) {
  18181. var phi = phiStart + i * inverseSegments * phiLength;
  18182. var sin = Math.sin( phi );
  18183. var cos = Math.cos( phi );
  18184. for ( j = 0; j <= ( points.length - 1 ); j ++ ) {
  18185. // vertex
  18186. vertex.x = points[ j ].x * sin;
  18187. vertex.y = points[ j ].y;
  18188. vertex.z = points[ j ].x * cos;
  18189. vertices.push( vertex.x, vertex.y, vertex.z );
  18190. // uv
  18191. uv.x = i / segments;
  18192. uv.y = j / ( points.length - 1 );
  18193. uvs.push( uv.x, uv.y );
  18194. }
  18195. }
  18196. // indices
  18197. for ( i = 0; i < segments; i ++ ) {
  18198. for ( j = 0; j < ( points.length - 1 ); j ++ ) {
  18199. base = j + i * points.length;
  18200. var a = base;
  18201. var b = base + points.length;
  18202. var c = base + points.length + 1;
  18203. var d = base + 1;
  18204. // faces
  18205. indices.push( a, b, d );
  18206. indices.push( b, c, d );
  18207. }
  18208. }
  18209. // build geometry
  18210. this.setIndex( indices );
  18211. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  18212. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  18213. // generate normals
  18214. this.computeVertexNormals();
  18215. // if the geometry is closed, we need to average the normals along the seam.
  18216. // because the corresponding vertices are identical (but still have different UVs).
  18217. if ( phiLength === Math.PI * 2 ) {
  18218. var normals = this.attributes.normal.array;
  18219. var n1 = new Vector3();
  18220. var n2 = new Vector3();
  18221. var n = new Vector3();
  18222. // this is the buffer offset for the last line of vertices
  18223. base = segments * points.length * 3;
  18224. for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {
  18225. // select the normal of the vertex in the first line
  18226. n1.x = normals[ j + 0 ];
  18227. n1.y = normals[ j + 1 ];
  18228. n1.z = normals[ j + 2 ];
  18229. // select the normal of the vertex in the last line
  18230. n2.x = normals[ base + j + 0 ];
  18231. n2.y = normals[ base + j + 1 ];
  18232. n2.z = normals[ base + j + 2 ];
  18233. // average normals
  18234. n.addVectors( n1, n2 ).normalize();
  18235. // assign the new values to both normals
  18236. normals[ j + 0 ] = normals[ base + j + 0 ] = n.x;
  18237. normals[ j + 1 ] = normals[ base + j + 1 ] = n.y;
  18238. normals[ j + 2 ] = normals[ base + j + 2 ] = n.z;
  18239. }
  18240. }
  18241. }
  18242. LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  18243. LatheBufferGeometry.prototype.constructor = LatheBufferGeometry;
  18244. /**
  18245. * @author jonobr1 / http://jonobr1.com
  18246. * @author Mugen87 / https://github.com/Mugen87
  18247. */
  18248. // ShapeGeometry
  18249. function ShapeGeometry( shapes, curveSegments ) {
  18250. Geometry.call( this );
  18251. this.type = 'ShapeGeometry';
  18252. if ( typeof curveSegments === 'object' ) {
  18253. console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );
  18254. curveSegments = curveSegments.curveSegments;
  18255. }
  18256. this.parameters = {
  18257. shapes: shapes,
  18258. curveSegments: curveSegments
  18259. };
  18260. this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );
  18261. this.mergeVertices();
  18262. }
  18263. ShapeGeometry.prototype = Object.create( Geometry.prototype );
  18264. ShapeGeometry.prototype.constructor = ShapeGeometry;
  18265. ShapeGeometry.prototype.toJSON = function () {
  18266. var data = Geometry.prototype.toJSON.call( this );
  18267. var shapes = this.parameters.shapes;
  18268. return toJSON$1( shapes, data );
  18269. };
  18270. // ShapeBufferGeometry
  18271. function ShapeBufferGeometry( shapes, curveSegments ) {
  18272. BufferGeometry.call( this );
  18273. this.type = 'ShapeBufferGeometry';
  18274. this.parameters = {
  18275. shapes: shapes,
  18276. curveSegments: curveSegments
  18277. };
  18278. curveSegments = curveSegments || 12;
  18279. // buffers
  18280. var indices = [];
  18281. var vertices = [];
  18282. var normals = [];
  18283. var uvs = [];
  18284. // helper variables
  18285. var groupStart = 0;
  18286. var groupCount = 0;
  18287. // allow single and array values for "shapes" parameter
  18288. if ( Array.isArray( shapes ) === false ) {
  18289. addShape( shapes );
  18290. } else {
  18291. for ( var i = 0; i < shapes.length; i ++ ) {
  18292. addShape( shapes[ i ] );
  18293. this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support
  18294. groupStart += groupCount;
  18295. groupCount = 0;
  18296. }
  18297. }
  18298. // build geometry
  18299. this.setIndex( indices );
  18300. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  18301. this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
  18302. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  18303. // helper functions
  18304. function addShape( shape ) {
  18305. var i, l, shapeHole;
  18306. var indexOffset = vertices.length / 3;
  18307. var points = shape.extractPoints( curveSegments );
  18308. var shapeVertices = points.shape;
  18309. var shapeHoles = points.holes;
  18310. // check direction of vertices
  18311. if ( ShapeUtils.isClockWise( shapeVertices ) === false ) {
  18312. shapeVertices = shapeVertices.reverse();
  18313. // also check if holes are in the opposite direction
  18314. for ( i = 0, l = shapeHoles.length; i < l; i ++ ) {
  18315. shapeHole = shapeHoles[ i ];
  18316. if ( ShapeUtils.isClockWise( shapeHole ) === true ) {
  18317. shapeHoles[ i ] = shapeHole.reverse();
  18318. }
  18319. }
  18320. }
  18321. var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );
  18322. // join vertices of inner and outer paths to a single array
  18323. for ( i = 0, l = shapeHoles.length; i < l; i ++ ) {
  18324. shapeHole = shapeHoles[ i ];
  18325. shapeVertices = shapeVertices.concat( shapeHole );
  18326. }
  18327. // vertices, normals, uvs
  18328. for ( i = 0, l = shapeVertices.length; i < l; i ++ ) {
  18329. var vertex = shapeVertices[ i ];
  18330. vertices.push( vertex.x, vertex.y, 0 );
  18331. normals.push( 0, 0, 1 );
  18332. uvs.push( vertex.x, vertex.y ); // world uvs
  18333. }
  18334. // incides
  18335. for ( i = 0, l = faces.length; i < l; i ++ ) {
  18336. var face = faces[ i ];
  18337. var a = face[ 0 ] + indexOffset;
  18338. var b = face[ 1 ] + indexOffset;
  18339. var c = face[ 2 ] + indexOffset;
  18340. indices.push( a, b, c );
  18341. groupCount += 3;
  18342. }
  18343. }
  18344. }
  18345. ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  18346. ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;
  18347. ShapeBufferGeometry.prototype.toJSON = function () {
  18348. var data = BufferGeometry.prototype.toJSON.call( this );
  18349. var shapes = this.parameters.shapes;
  18350. return toJSON$1( shapes, data );
  18351. };
  18352. //
  18353. function toJSON$1( shapes, data ) {
  18354. data.shapes = [];
  18355. if ( Array.isArray( shapes ) ) {
  18356. for ( var i = 0, l = shapes.length; i < l; i ++ ) {
  18357. var shape = shapes[ i ];
  18358. data.shapes.push( shape.uuid );
  18359. }
  18360. } else {
  18361. data.shapes.push( shapes.uuid );
  18362. }
  18363. return data;
  18364. }
  18365. /**
  18366. * @author WestLangley / http://github.com/WestLangley
  18367. * @author Mugen87 / https://github.com/Mugen87
  18368. */
  18369. function EdgesGeometry( geometry, thresholdAngle ) {
  18370. BufferGeometry.call( this );
  18371. this.type = 'EdgesGeometry';
  18372. this.parameters = {
  18373. thresholdAngle: thresholdAngle
  18374. };
  18375. thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;
  18376. // buffer
  18377. var vertices = [];
  18378. // helper variables
  18379. var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );
  18380. var edge = [ 0, 0 ], edges = {}, edge1, edge2;
  18381. var key, keys = [ 'a', 'b', 'c' ];
  18382. // prepare source geometry
  18383. var geometry2;
  18384. if ( geometry.isBufferGeometry ) {
  18385. geometry2 = new Geometry();
  18386. geometry2.fromBufferGeometry( geometry );
  18387. } else {
  18388. geometry2 = geometry.clone();
  18389. }
  18390. geometry2.mergeVertices();
  18391. geometry2.computeFaceNormals();
  18392. var sourceVertices = geometry2.vertices;
  18393. var faces = geometry2.faces;
  18394. // now create a data structure where each entry represents an edge with its adjoining faces
  18395. for ( var i = 0, l = faces.length; i < l; i ++ ) {
  18396. var face = faces[ i ];
  18397. for ( var j = 0; j < 3; j ++ ) {
  18398. edge1 = face[ keys[ j ] ];
  18399. edge2 = face[ keys[ ( j + 1 ) % 3 ] ];
  18400. edge[ 0 ] = Math.min( edge1, edge2 );
  18401. edge[ 1 ] = Math.max( edge1, edge2 );
  18402. key = edge[ 0 ] + ',' + edge[ 1 ];
  18403. if ( edges[ key ] === undefined ) {
  18404. edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };
  18405. } else {
  18406. edges[ key ].face2 = i;
  18407. }
  18408. }
  18409. }
  18410. // generate vertices
  18411. for ( key in edges ) {
  18412. var e = edges[ key ];
  18413. // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.
  18414. if ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {
  18415. var vertex = sourceVertices[ e.index1 ];
  18416. vertices.push( vertex.x, vertex.y, vertex.z );
  18417. vertex = sourceVertices[ e.index2 ];
  18418. vertices.push( vertex.x, vertex.y, vertex.z );
  18419. }
  18420. }
  18421. // build geometry
  18422. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  18423. }
  18424. EdgesGeometry.prototype = Object.create( BufferGeometry.prototype );
  18425. EdgesGeometry.prototype.constructor = EdgesGeometry;
  18426. /**
  18427. * @author mrdoob / http://mrdoob.com/
  18428. * @author Mugen87 / https://github.com/Mugen87
  18429. */
  18430. // CylinderGeometry
  18431. function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
  18432. Geometry.call( this );
  18433. this.type = 'CylinderGeometry';
  18434. this.parameters = {
  18435. radiusTop: radiusTop,
  18436. radiusBottom: radiusBottom,
  18437. height: height,
  18438. radialSegments: radialSegments,
  18439. heightSegments: heightSegments,
  18440. openEnded: openEnded,
  18441. thetaStart: thetaStart,
  18442. thetaLength: thetaLength
  18443. };
  18444. this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );
  18445. this.mergeVertices();
  18446. }
  18447. CylinderGeometry.prototype = Object.create( Geometry.prototype );
  18448. CylinderGeometry.prototype.constructor = CylinderGeometry;
  18449. // CylinderBufferGeometry
  18450. function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
  18451. BufferGeometry.call( this );
  18452. this.type = 'CylinderBufferGeometry';
  18453. this.parameters = {
  18454. radiusTop: radiusTop,
  18455. radiusBottom: radiusBottom,
  18456. height: height,
  18457. radialSegments: radialSegments,
  18458. heightSegments: heightSegments,
  18459. openEnded: openEnded,
  18460. thetaStart: thetaStart,
  18461. thetaLength: thetaLength
  18462. };
  18463. var scope = this;
  18464. radiusTop = radiusTop !== undefined ? radiusTop : 1;
  18465. radiusBottom = radiusBottom !== undefined ? radiusBottom : 1;
  18466. height = height || 1;
  18467. radialSegments = Math.floor( radialSegments ) || 8;
  18468. heightSegments = Math.floor( heightSegments ) || 1;
  18469. openEnded = openEnded !== undefined ? openEnded : false;
  18470. thetaStart = thetaStart !== undefined ? thetaStart : 0.0;
  18471. thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
  18472. // buffers
  18473. var indices = [];
  18474. var vertices = [];
  18475. var normals = [];
  18476. var uvs = [];
  18477. // helper variables
  18478. var index = 0;
  18479. var indexArray = [];
  18480. var halfHeight = height / 2;
  18481. var groupStart = 0;
  18482. // generate geometry
  18483. generateTorso();
  18484. if ( openEnded === false ) {
  18485. if ( radiusTop > 0 ) generateCap( true );
  18486. if ( radiusBottom > 0 ) generateCap( false );
  18487. }
  18488. // build geometry
  18489. this.setIndex( indices );
  18490. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  18491. this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
  18492. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  18493. function generateTorso() {
  18494. var x, y;
  18495. var normal = new Vector3();
  18496. var vertex = new Vector3();
  18497. var groupCount = 0;
  18498. // this will be used to calculate the normal
  18499. var slope = ( radiusBottom - radiusTop ) / height;
  18500. // generate vertices, normals and uvs
  18501. for ( y = 0; y <= heightSegments; y ++ ) {
  18502. var indexRow = [];
  18503. var v = y / heightSegments;
  18504. // calculate the radius of the current row
  18505. var radius = v * ( radiusBottom - radiusTop ) + radiusTop;
  18506. for ( x = 0; x <= radialSegments; x ++ ) {
  18507. var u = x / radialSegments;
  18508. var theta = u * thetaLength + thetaStart;
  18509. var sinTheta = Math.sin( theta );
  18510. var cosTheta = Math.cos( theta );
  18511. // vertex
  18512. vertex.x = radius * sinTheta;
  18513. vertex.y = - v * height + halfHeight;
  18514. vertex.z = radius * cosTheta;
  18515. vertices.push( vertex.x, vertex.y, vertex.z );
  18516. // normal
  18517. normal.set( sinTheta, slope, cosTheta ).normalize();
  18518. normals.push( normal.x, normal.y, normal.z );
  18519. // uv
  18520. uvs.push( u, 1 - v );
  18521. // save index of vertex in respective row
  18522. indexRow.push( index ++ );
  18523. }
  18524. // now save vertices of the row in our index array
  18525. indexArray.push( indexRow );
  18526. }
  18527. // generate indices
  18528. for ( x = 0; x < radialSegments; x ++ ) {
  18529. for ( y = 0; y < heightSegments; y ++ ) {
  18530. // we use the index array to access the correct indices
  18531. var a = indexArray[ y ][ x ];
  18532. var b = indexArray[ y + 1 ][ x ];
  18533. var c = indexArray[ y + 1 ][ x + 1 ];
  18534. var d = indexArray[ y ][ x + 1 ];
  18535. // faces
  18536. indices.push( a, b, d );
  18537. indices.push( b, c, d );
  18538. // update group counter
  18539. groupCount += 6;
  18540. }
  18541. }
  18542. // add a group to the geometry. this will ensure multi material support
  18543. scope.addGroup( groupStart, groupCount, 0 );
  18544. // calculate new start value for groups
  18545. groupStart += groupCount;
  18546. }
  18547. function generateCap( top ) {
  18548. var x, centerIndexStart, centerIndexEnd;
  18549. var uv = new Vector2();
  18550. var vertex = new Vector3();
  18551. var groupCount = 0;
  18552. var radius = ( top === true ) ? radiusTop : radiusBottom;
  18553. var sign = ( top === true ) ? 1 : - 1;
  18554. // save the index of the first center vertex
  18555. centerIndexStart = index;
  18556. // first we generate the center vertex data of the cap.
  18557. // because the geometry needs one set of uvs per face,
  18558. // we must generate a center vertex per face/segment
  18559. for ( x = 1; x <= radialSegments; x ++ ) {
  18560. // vertex
  18561. vertices.push( 0, halfHeight * sign, 0 );
  18562. // normal
  18563. normals.push( 0, sign, 0 );
  18564. // uv
  18565. uvs.push( 0.5, 0.5 );
  18566. // increase index
  18567. index ++;
  18568. }
  18569. // save the index of the last center vertex
  18570. centerIndexEnd = index;
  18571. // now we generate the surrounding vertices, normals and uvs
  18572. for ( x = 0; x <= radialSegments; x ++ ) {
  18573. var u = x / radialSegments;
  18574. var theta = u * thetaLength + thetaStart;
  18575. var cosTheta = Math.cos( theta );
  18576. var sinTheta = Math.sin( theta );
  18577. // vertex
  18578. vertex.x = radius * sinTheta;
  18579. vertex.y = halfHeight * sign;
  18580. vertex.z = radius * cosTheta;
  18581. vertices.push( vertex.x, vertex.y, vertex.z );
  18582. // normal
  18583. normals.push( 0, sign, 0 );
  18584. // uv
  18585. uv.x = ( cosTheta * 0.5 ) + 0.5;
  18586. uv.y = ( sinTheta * 0.5 * sign ) + 0.5;
  18587. uvs.push( uv.x, uv.y );
  18588. // increase index
  18589. index ++;
  18590. }
  18591. // generate indices
  18592. for ( x = 0; x < radialSegments; x ++ ) {
  18593. var c = centerIndexStart + x;
  18594. var i = centerIndexEnd + x;
  18595. if ( top === true ) {
  18596. // face top
  18597. indices.push( i, i + 1, c );
  18598. } else {
  18599. // face bottom
  18600. indices.push( i + 1, i, c );
  18601. }
  18602. groupCount += 3;
  18603. }
  18604. // add a group to the geometry. this will ensure multi material support
  18605. scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );
  18606. // calculate new start value for groups
  18607. groupStart += groupCount;
  18608. }
  18609. }
  18610. CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  18611. CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;
  18612. /**
  18613. * @author abelnation / http://github.com/abelnation
  18614. */
  18615. // ConeGeometry
  18616. function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
  18617. CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );
  18618. this.type = 'ConeGeometry';
  18619. this.parameters = {
  18620. radius: radius,
  18621. height: height,
  18622. radialSegments: radialSegments,
  18623. heightSegments: heightSegments,
  18624. openEnded: openEnded,
  18625. thetaStart: thetaStart,
  18626. thetaLength: thetaLength
  18627. };
  18628. }
  18629. ConeGeometry.prototype = Object.create( CylinderGeometry.prototype );
  18630. ConeGeometry.prototype.constructor = ConeGeometry;
  18631. // ConeBufferGeometry
  18632. function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
  18633. CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );
  18634. this.type = 'ConeBufferGeometry';
  18635. this.parameters = {
  18636. radius: radius,
  18637. height: height,
  18638. radialSegments: radialSegments,
  18639. heightSegments: heightSegments,
  18640. openEnded: openEnded,
  18641. thetaStart: thetaStart,
  18642. thetaLength: thetaLength
  18643. };
  18644. }
  18645. ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );
  18646. ConeBufferGeometry.prototype.constructor = ConeBufferGeometry;
  18647. /**
  18648. * @author benaadams / https://twitter.com/ben_a_adams
  18649. * @author Mugen87 / https://github.com/Mugen87
  18650. * @author hughes
  18651. */
  18652. // CircleGeometry
  18653. function CircleGeometry( radius, segments, thetaStart, thetaLength ) {
  18654. Geometry.call( this );
  18655. this.type = 'CircleGeometry';
  18656. this.parameters = {
  18657. radius: radius,
  18658. segments: segments,
  18659. thetaStart: thetaStart,
  18660. thetaLength: thetaLength
  18661. };
  18662. this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );
  18663. this.mergeVertices();
  18664. }
  18665. CircleGeometry.prototype = Object.create( Geometry.prototype );
  18666. CircleGeometry.prototype.constructor = CircleGeometry;
  18667. // CircleBufferGeometry
  18668. function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {
  18669. BufferGeometry.call( this );
  18670. this.type = 'CircleBufferGeometry';
  18671. this.parameters = {
  18672. radius: radius,
  18673. segments: segments,
  18674. thetaStart: thetaStart,
  18675. thetaLength: thetaLength
  18676. };
  18677. radius = radius || 1;
  18678. segments = segments !== undefined ? Math.max( 3, segments ) : 8;
  18679. thetaStart = thetaStart !== undefined ? thetaStart : 0;
  18680. thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
  18681. // buffers
  18682. var indices = [];
  18683. var vertices = [];
  18684. var normals = [];
  18685. var uvs = [];
  18686. // helper variables
  18687. var i, s;
  18688. var vertex = new Vector3();
  18689. var uv = new Vector2();
  18690. // center point
  18691. vertices.push( 0, 0, 0 );
  18692. normals.push( 0, 0, 1 );
  18693. uvs.push( 0.5, 0.5 );
  18694. for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {
  18695. var segment = thetaStart + s / segments * thetaLength;
  18696. // vertex
  18697. vertex.x = radius * Math.cos( segment );
  18698. vertex.y = radius * Math.sin( segment );
  18699. vertices.push( vertex.x, vertex.y, vertex.z );
  18700. // normal
  18701. normals.push( 0, 0, 1 );
  18702. // uvs
  18703. uv.x = ( vertices[ i ] / radius + 1 ) / 2;
  18704. uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;
  18705. uvs.push( uv.x, uv.y );
  18706. }
  18707. // indices
  18708. for ( i = 1; i <= segments; i ++ ) {
  18709. indices.push( i, i + 1, 0 );
  18710. }
  18711. // build geometry
  18712. this.setIndex( indices );
  18713. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  18714. this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
  18715. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  18716. }
  18717. CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  18718. CircleBufferGeometry.prototype.constructor = CircleBufferGeometry;
  18719. var Geometries = /*#__PURE__*/Object.freeze({
  18720. WireframeGeometry: WireframeGeometry,
  18721. ParametricGeometry: ParametricGeometry,
  18722. ParametricBufferGeometry: ParametricBufferGeometry,
  18723. TetrahedronGeometry: TetrahedronGeometry,
  18724. TetrahedronBufferGeometry: TetrahedronBufferGeometry,
  18725. OctahedronGeometry: OctahedronGeometry,
  18726. OctahedronBufferGeometry: OctahedronBufferGeometry,
  18727. IcosahedronGeometry: IcosahedronGeometry,
  18728. IcosahedronBufferGeometry: IcosahedronBufferGeometry,
  18729. DodecahedronGeometry: DodecahedronGeometry,
  18730. DodecahedronBufferGeometry: DodecahedronBufferGeometry,
  18731. PolyhedronGeometry: PolyhedronGeometry,
  18732. PolyhedronBufferGeometry: PolyhedronBufferGeometry,
  18733. TubeGeometry: TubeGeometry,
  18734. TubeBufferGeometry: TubeBufferGeometry,
  18735. TorusKnotGeometry: TorusKnotGeometry,
  18736. TorusKnotBufferGeometry: TorusKnotBufferGeometry,
  18737. TorusGeometry: TorusGeometry,
  18738. TorusBufferGeometry: TorusBufferGeometry,
  18739. TextGeometry: TextGeometry,
  18740. TextBufferGeometry: TextBufferGeometry,
  18741. SphereGeometry: SphereGeometry,
  18742. SphereBufferGeometry: SphereBufferGeometry,
  18743. RingGeometry: RingGeometry,
  18744. RingBufferGeometry: RingBufferGeometry,
  18745. PlaneGeometry: PlaneGeometry,
  18746. PlaneBufferGeometry: PlaneBufferGeometry,
  18747. LatheGeometry: LatheGeometry,
  18748. LatheBufferGeometry: LatheBufferGeometry,
  18749. ShapeGeometry: ShapeGeometry,
  18750. ShapeBufferGeometry: ShapeBufferGeometry,
  18751. ExtrudeGeometry: ExtrudeGeometry,
  18752. ExtrudeBufferGeometry: ExtrudeBufferGeometry,
  18753. EdgesGeometry: EdgesGeometry,
  18754. ConeGeometry: ConeGeometry,
  18755. ConeBufferGeometry: ConeBufferGeometry,
  18756. CylinderGeometry: CylinderGeometry,
  18757. CylinderBufferGeometry: CylinderBufferGeometry,
  18758. CircleGeometry: CircleGeometry,
  18759. CircleBufferGeometry: CircleBufferGeometry,
  18760. BoxGeometry: BoxGeometry,
  18761. BoxBufferGeometry: BoxBufferGeometry
  18762. });
  18763. /**
  18764. * @author mrdoob / http://mrdoob.com/
  18765. *
  18766. * parameters = {
  18767. * color: <THREE.Color>
  18768. * }
  18769. */
  18770. function ShadowMaterial( parameters ) {
  18771. Material.call( this );
  18772. this.type = 'ShadowMaterial';
  18773. this.color = new Color( 0x000000 );
  18774. this.transparent = true;
  18775. this.setValues( parameters );
  18776. }
  18777. ShadowMaterial.prototype = Object.create( Material.prototype );
  18778. ShadowMaterial.prototype.constructor = ShadowMaterial;
  18779. ShadowMaterial.prototype.isShadowMaterial = true;
  18780. ShadowMaterial.prototype.copy = function ( source ) {
  18781. Material.prototype.copy.call( this, source );
  18782. this.color.copy( source.color );
  18783. return this;
  18784. };
  18785. /**
  18786. * @author mrdoob / http://mrdoob.com/
  18787. */
  18788. function RawShaderMaterial( parameters ) {
  18789. ShaderMaterial.call( this, parameters );
  18790. this.type = 'RawShaderMaterial';
  18791. }
  18792. RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );
  18793. RawShaderMaterial.prototype.constructor = RawShaderMaterial;
  18794. RawShaderMaterial.prototype.isRawShaderMaterial = true;
  18795. /**
  18796. * @author WestLangley / http://github.com/WestLangley
  18797. *
  18798. * parameters = {
  18799. * color: <hex>,
  18800. * roughness: <float>,
  18801. * metalness: <float>,
  18802. * opacity: <float>,
  18803. *
  18804. * map: new THREE.Texture( <Image> ),
  18805. *
  18806. * lightMap: new THREE.Texture( <Image> ),
  18807. * lightMapIntensity: <float>
  18808. *
  18809. * aoMap: new THREE.Texture( <Image> ),
  18810. * aoMapIntensity: <float>
  18811. *
  18812. * emissive: <hex>,
  18813. * emissiveIntensity: <float>
  18814. * emissiveMap: new THREE.Texture( <Image> ),
  18815. *
  18816. * bumpMap: new THREE.Texture( <Image> ),
  18817. * bumpScale: <float>,
  18818. *
  18819. * normalMap: new THREE.Texture( <Image> ),
  18820. * normalMapType: THREE.TangentSpaceNormalMap,
  18821. * normalScale: <Vector2>,
  18822. *
  18823. * displacementMap: new THREE.Texture( <Image> ),
  18824. * displacementScale: <float>,
  18825. * displacementBias: <float>,
  18826. *
  18827. * roughnessMap: new THREE.Texture( <Image> ),
  18828. *
  18829. * metalnessMap: new THREE.Texture( <Image> ),
  18830. *
  18831. * alphaMap: new THREE.Texture( <Image> ),
  18832. *
  18833. * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
  18834. * envMapIntensity: <float>
  18835. *
  18836. * refractionRatio: <float>,
  18837. *
  18838. * wireframe: <boolean>,
  18839. * wireframeLinewidth: <float>,
  18840. *
  18841. * skinning: <bool>,
  18842. * morphTargets: <bool>,
  18843. * morphNormals: <bool>
  18844. * }
  18845. */
  18846. function MeshStandardMaterial( parameters ) {
  18847. Material.call( this );
  18848. this.defines = { 'STANDARD': '' };
  18849. this.type = 'MeshStandardMaterial';
  18850. this.color = new Color( 0xffffff ); // diffuse
  18851. this.roughness = 0.5;
  18852. this.metalness = 0.5;
  18853. this.map = null;
  18854. this.lightMap = null;
  18855. this.lightMapIntensity = 1.0;
  18856. this.aoMap = null;
  18857. this.aoMapIntensity = 1.0;
  18858. this.emissive = new Color( 0x000000 );
  18859. this.emissiveIntensity = 1.0;
  18860. this.emissiveMap = null;
  18861. this.bumpMap = null;
  18862. this.bumpScale = 1;
  18863. this.normalMap = null;
  18864. this.normalMapType = TangentSpaceNormalMap;
  18865. this.normalScale = new Vector2( 1, 1 );
  18866. this.displacementMap = null;
  18867. this.displacementScale = 1;
  18868. this.displacementBias = 0;
  18869. this.roughnessMap = null;
  18870. this.metalnessMap = null;
  18871. this.alphaMap = null;
  18872. this.envMap = null;
  18873. this.envMapIntensity = 1.0;
  18874. this.refractionRatio = 0.98;
  18875. this.wireframe = false;
  18876. this.wireframeLinewidth = 1;
  18877. this.wireframeLinecap = 'round';
  18878. this.wireframeLinejoin = 'round';
  18879. this.skinning = false;
  18880. this.morphTargets = false;
  18881. this.morphNormals = false;
  18882. this.setValues( parameters );
  18883. }
  18884. MeshStandardMaterial.prototype = Object.create( Material.prototype );
  18885. MeshStandardMaterial.prototype.constructor = MeshStandardMaterial;
  18886. MeshStandardMaterial.prototype.isMeshStandardMaterial = true;
  18887. MeshStandardMaterial.prototype.copy = function ( source ) {
  18888. Material.prototype.copy.call( this, source );
  18889. this.defines = { 'STANDARD': '' };
  18890. this.color.copy( source.color );
  18891. this.roughness = source.roughness;
  18892. this.metalness = source.metalness;
  18893. this.map = source.map;
  18894. this.lightMap = source.lightMap;
  18895. this.lightMapIntensity = source.lightMapIntensity;
  18896. this.aoMap = source.aoMap;
  18897. this.aoMapIntensity = source.aoMapIntensity;
  18898. this.emissive.copy( source.emissive );
  18899. this.emissiveMap = source.emissiveMap;
  18900. this.emissiveIntensity = source.emissiveIntensity;
  18901. this.bumpMap = source.bumpMap;
  18902. this.bumpScale = source.bumpScale;
  18903. this.normalMap = source.normalMap;
  18904. this.normalMapType = source.normalMapType;
  18905. this.normalScale.copy( source.normalScale );
  18906. this.displacementMap = source.displacementMap;
  18907. this.displacementScale = source.displacementScale;
  18908. this.displacementBias = source.displacementBias;
  18909. this.roughnessMap = source.roughnessMap;
  18910. this.metalnessMap = source.metalnessMap;
  18911. this.alphaMap = source.alphaMap;
  18912. this.envMap = source.envMap;
  18913. this.envMapIntensity = source.envMapIntensity;
  18914. this.refractionRatio = source.refractionRatio;
  18915. this.wireframe = source.wireframe;
  18916. this.wireframeLinewidth = source.wireframeLinewidth;
  18917. this.wireframeLinecap = source.wireframeLinecap;
  18918. this.wireframeLinejoin = source.wireframeLinejoin;
  18919. this.skinning = source.skinning;
  18920. this.morphTargets = source.morphTargets;
  18921. this.morphNormals = source.morphNormals;
  18922. return this;
  18923. };
  18924. /**
  18925. * @author WestLangley / http://github.com/WestLangley
  18926. *
  18927. * parameters = {
  18928. * reflectivity: <float>
  18929. * }
  18930. */
  18931. function MeshPhysicalMaterial( parameters ) {
  18932. MeshStandardMaterial.call( this );
  18933. this.defines = { 'PHYSICAL': '' };
  18934. this.type = 'MeshPhysicalMaterial';
  18935. this.reflectivity = 0.5; // maps to F0 = 0.04
  18936. this.clearCoat = 0.0;
  18937. this.clearCoatRoughness = 0.0;
  18938. this.setValues( parameters );
  18939. }
  18940. MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );
  18941. MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;
  18942. MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;
  18943. MeshPhysicalMaterial.prototype.copy = function ( source ) {
  18944. MeshStandardMaterial.prototype.copy.call( this, source );
  18945. this.defines = { 'PHYSICAL': '' };
  18946. this.reflectivity = source.reflectivity;
  18947. this.clearCoat = source.clearCoat;
  18948. this.clearCoatRoughness = source.clearCoatRoughness;
  18949. return this;
  18950. };
  18951. /**
  18952. * @author mrdoob / http://mrdoob.com/
  18953. * @author alteredq / http://alteredqualia.com/
  18954. *
  18955. * parameters = {
  18956. * color: <hex>,
  18957. * specular: <hex>,
  18958. * shininess: <float>,
  18959. * opacity: <float>,
  18960. *
  18961. * map: new THREE.Texture( <Image> ),
  18962. *
  18963. * lightMap: new THREE.Texture( <Image> ),
  18964. * lightMapIntensity: <float>
  18965. *
  18966. * aoMap: new THREE.Texture( <Image> ),
  18967. * aoMapIntensity: <float>
  18968. *
  18969. * emissive: <hex>,
  18970. * emissiveIntensity: <float>
  18971. * emissiveMap: new THREE.Texture( <Image> ),
  18972. *
  18973. * bumpMap: new THREE.Texture( <Image> ),
  18974. * bumpScale: <float>,
  18975. *
  18976. * normalMap: new THREE.Texture( <Image> ),
  18977. * normalMapType: THREE.TangentSpaceNormalMap,
  18978. * normalScale: <Vector2>,
  18979. *
  18980. * displacementMap: new THREE.Texture( <Image> ),
  18981. * displacementScale: <float>,
  18982. * displacementBias: <float>,
  18983. *
  18984. * specularMap: new THREE.Texture( <Image> ),
  18985. *
  18986. * alphaMap: new THREE.Texture( <Image> ),
  18987. *
  18988. * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
  18989. * combine: THREE.Multiply,
  18990. * reflectivity: <float>,
  18991. * refractionRatio: <float>,
  18992. *
  18993. * wireframe: <boolean>,
  18994. * wireframeLinewidth: <float>,
  18995. *
  18996. * skinning: <bool>,
  18997. * morphTargets: <bool>,
  18998. * morphNormals: <bool>
  18999. * }
  19000. */
  19001. function MeshPhongMaterial( parameters ) {
  19002. Material.call( this );
  19003. this.type = 'MeshPhongMaterial';
  19004. this.color = new Color( 0xffffff ); // diffuse
  19005. this.specular = new Color( 0x111111 );
  19006. this.shininess = 30;
  19007. this.map = null;
  19008. this.lightMap = null;
  19009. this.lightMapIntensity = 1.0;
  19010. this.aoMap = null;
  19011. this.aoMapIntensity = 1.0;
  19012. this.emissive = new Color( 0x000000 );
  19013. this.emissiveIntensity = 1.0;
  19014. this.emissiveMap = null;
  19015. this.bumpMap = null;
  19016. this.bumpScale = 1;
  19017. this.normalMap = null;
  19018. this.normalMapType = TangentSpaceNormalMap;
  19019. this.normalScale = new Vector2( 1, 1 );
  19020. this.displacementMap = null;
  19021. this.displacementScale = 1;
  19022. this.displacementBias = 0;
  19023. this.specularMap = null;
  19024. this.alphaMap = null;
  19025. this.envMap = null;
  19026. this.combine = MultiplyOperation;
  19027. this.reflectivity = 1;
  19028. this.refractionRatio = 0.98;
  19029. this.wireframe = false;
  19030. this.wireframeLinewidth = 1;
  19031. this.wireframeLinecap = 'round';
  19032. this.wireframeLinejoin = 'round';
  19033. this.skinning = false;
  19034. this.morphTargets = false;
  19035. this.morphNormals = false;
  19036. this.setValues( parameters );
  19037. }
  19038. MeshPhongMaterial.prototype = Object.create( Material.prototype );
  19039. MeshPhongMaterial.prototype.constructor = MeshPhongMaterial;
  19040. MeshPhongMaterial.prototype.isMeshPhongMaterial = true;
  19041. MeshPhongMaterial.prototype.copy = function ( source ) {
  19042. Material.prototype.copy.call( this, source );
  19043. this.color.copy( source.color );
  19044. this.specular.copy( source.specular );
  19045. this.shininess = source.shininess;
  19046. this.map = source.map;
  19047. this.lightMap = source.lightMap;
  19048. this.lightMapIntensity = source.lightMapIntensity;
  19049. this.aoMap = source.aoMap;
  19050. this.aoMapIntensity = source.aoMapIntensity;
  19051. this.emissive.copy( source.emissive );
  19052. this.emissiveMap = source.emissiveMap;
  19053. this.emissiveIntensity = source.emissiveIntensity;
  19054. this.bumpMap = source.bumpMap;
  19055. this.bumpScale = source.bumpScale;
  19056. this.normalMap = source.normalMap;
  19057. this.normalMapType = source.normalMapType;
  19058. this.normalScale.copy( source.normalScale );
  19059. this.displacementMap = source.displacementMap;
  19060. this.displacementScale = source.displacementScale;
  19061. this.displacementBias = source.displacementBias;
  19062. this.specularMap = source.specularMap;
  19063. this.alphaMap = source.alphaMap;
  19064. this.envMap = source.envMap;
  19065. this.combine = source.combine;
  19066. this.reflectivity = source.reflectivity;
  19067. this.refractionRatio = source.refractionRatio;
  19068. this.wireframe = source.wireframe;
  19069. this.wireframeLinewidth = source.wireframeLinewidth;
  19070. this.wireframeLinecap = source.wireframeLinecap;
  19071. this.wireframeLinejoin = source.wireframeLinejoin;
  19072. this.skinning = source.skinning;
  19073. this.morphTargets = source.morphTargets;
  19074. this.morphNormals = source.morphNormals;
  19075. return this;
  19076. };
  19077. /**
  19078. * @author takahirox / http://github.com/takahirox
  19079. *
  19080. * parameters = {
  19081. * gradientMap: new THREE.Texture( <Image> )
  19082. * }
  19083. */
  19084. function MeshToonMaterial( parameters ) {
  19085. MeshPhongMaterial.call( this );
  19086. this.defines = { 'TOON': '' };
  19087. this.type = 'MeshToonMaterial';
  19088. this.gradientMap = null;
  19089. this.setValues( parameters );
  19090. }
  19091. MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );
  19092. MeshToonMaterial.prototype.constructor = MeshToonMaterial;
  19093. MeshToonMaterial.prototype.isMeshToonMaterial = true;
  19094. MeshToonMaterial.prototype.copy = function ( source ) {
  19095. MeshPhongMaterial.prototype.copy.call( this, source );
  19096. this.gradientMap = source.gradientMap;
  19097. return this;
  19098. };
  19099. /**
  19100. * @author mrdoob / http://mrdoob.com/
  19101. * @author WestLangley / http://github.com/WestLangley
  19102. *
  19103. * parameters = {
  19104. * opacity: <float>,
  19105. *
  19106. * bumpMap: new THREE.Texture( <Image> ),
  19107. * bumpScale: <float>,
  19108. *
  19109. * normalMap: new THREE.Texture( <Image> ),
  19110. * normalMapType: THREE.TangentSpaceNormalMap,
  19111. * normalScale: <Vector2>,
  19112. *
  19113. * displacementMap: new THREE.Texture( <Image> ),
  19114. * displacementScale: <float>,
  19115. * displacementBias: <float>,
  19116. *
  19117. * wireframe: <boolean>,
  19118. * wireframeLinewidth: <float>
  19119. *
  19120. * skinning: <bool>,
  19121. * morphTargets: <bool>,
  19122. * morphNormals: <bool>
  19123. * }
  19124. */
  19125. function MeshNormalMaterial( parameters ) {
  19126. Material.call( this );
  19127. this.type = 'MeshNormalMaterial';
  19128. this.bumpMap = null;
  19129. this.bumpScale = 1;
  19130. this.normalMap = null;
  19131. this.normalMapType = TangentSpaceNormalMap;
  19132. this.normalScale = new Vector2( 1, 1 );
  19133. this.displacementMap = null;
  19134. this.displacementScale = 1;
  19135. this.displacementBias = 0;
  19136. this.wireframe = false;
  19137. this.wireframeLinewidth = 1;
  19138. this.fog = false;
  19139. this.lights = false;
  19140. this.skinning = false;
  19141. this.morphTargets = false;
  19142. this.morphNormals = false;
  19143. this.setValues( parameters );
  19144. }
  19145. MeshNormalMaterial.prototype = Object.create( Material.prototype );
  19146. MeshNormalMaterial.prototype.constructor = MeshNormalMaterial;
  19147. MeshNormalMaterial.prototype.isMeshNormalMaterial = true;
  19148. MeshNormalMaterial.prototype.copy = function ( source ) {
  19149. Material.prototype.copy.call( this, source );
  19150. this.bumpMap = source.bumpMap;
  19151. this.bumpScale = source.bumpScale;
  19152. this.normalMap = source.normalMap;
  19153. this.normalMapType = source.normalMapType;
  19154. this.normalScale.copy( source.normalScale );
  19155. this.displacementMap = source.displacementMap;
  19156. this.displacementScale = source.displacementScale;
  19157. this.displacementBias = source.displacementBias;
  19158. this.wireframe = source.wireframe;
  19159. this.wireframeLinewidth = source.wireframeLinewidth;
  19160. this.skinning = source.skinning;
  19161. this.morphTargets = source.morphTargets;
  19162. this.morphNormals = source.morphNormals;
  19163. return this;
  19164. };
  19165. /**
  19166. * @author mrdoob / http://mrdoob.com/
  19167. * @author alteredq / http://alteredqualia.com/
  19168. *
  19169. * parameters = {
  19170. * color: <hex>,
  19171. * opacity: <float>,
  19172. *
  19173. * map: new THREE.Texture( <Image> ),
  19174. *
  19175. * lightMap: new THREE.Texture( <Image> ),
  19176. * lightMapIntensity: <float>
  19177. *
  19178. * aoMap: new THREE.Texture( <Image> ),
  19179. * aoMapIntensity: <float>
  19180. *
  19181. * emissive: <hex>,
  19182. * emissiveIntensity: <float>
  19183. * emissiveMap: new THREE.Texture( <Image> ),
  19184. *
  19185. * specularMap: new THREE.Texture( <Image> ),
  19186. *
  19187. * alphaMap: new THREE.Texture( <Image> ),
  19188. *
  19189. * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
  19190. * combine: THREE.Multiply,
  19191. * reflectivity: <float>,
  19192. * refractionRatio: <float>,
  19193. *
  19194. * wireframe: <boolean>,
  19195. * wireframeLinewidth: <float>,
  19196. *
  19197. * skinning: <bool>,
  19198. * morphTargets: <bool>,
  19199. * morphNormals: <bool>
  19200. * }
  19201. */
  19202. function MeshLambertMaterial( parameters ) {
  19203. Material.call( this );
  19204. this.type = 'MeshLambertMaterial';
  19205. this.color = new Color( 0xffffff ); // diffuse
  19206. this.map = null;
  19207. this.lightMap = null;
  19208. this.lightMapIntensity = 1.0;
  19209. this.aoMap = null;
  19210. this.aoMapIntensity = 1.0;
  19211. this.emissive = new Color( 0x000000 );
  19212. this.emissiveIntensity = 1.0;
  19213. this.emissiveMap = null;
  19214. this.specularMap = null;
  19215. this.alphaMap = null;
  19216. this.envMap = null;
  19217. this.combine = MultiplyOperation;
  19218. this.reflectivity = 1;
  19219. this.refractionRatio = 0.98;
  19220. this.wireframe = false;
  19221. this.wireframeLinewidth = 1;
  19222. this.wireframeLinecap = 'round';
  19223. this.wireframeLinejoin = 'round';
  19224. this.skinning = false;
  19225. this.morphTargets = false;
  19226. this.morphNormals = false;
  19227. this.setValues( parameters );
  19228. }
  19229. MeshLambertMaterial.prototype = Object.create( Material.prototype );
  19230. MeshLambertMaterial.prototype.constructor = MeshLambertMaterial;
  19231. MeshLambertMaterial.prototype.isMeshLambertMaterial = true;
  19232. MeshLambertMaterial.prototype.copy = function ( source ) {
  19233. Material.prototype.copy.call( this, source );
  19234. this.color.copy( source.color );
  19235. this.map = source.map;
  19236. this.lightMap = source.lightMap;
  19237. this.lightMapIntensity = source.lightMapIntensity;
  19238. this.aoMap = source.aoMap;
  19239. this.aoMapIntensity = source.aoMapIntensity;
  19240. this.emissive.copy( source.emissive );
  19241. this.emissiveMap = source.emissiveMap;
  19242. this.emissiveIntensity = source.emissiveIntensity;
  19243. this.specularMap = source.specularMap;
  19244. this.alphaMap = source.alphaMap;
  19245. this.envMap = source.envMap;
  19246. this.combine = source.combine;
  19247. this.reflectivity = source.reflectivity;
  19248. this.refractionRatio = source.refractionRatio;
  19249. this.wireframe = source.wireframe;
  19250. this.wireframeLinewidth = source.wireframeLinewidth;
  19251. this.wireframeLinecap = source.wireframeLinecap;
  19252. this.wireframeLinejoin = source.wireframeLinejoin;
  19253. this.skinning = source.skinning;
  19254. this.morphTargets = source.morphTargets;
  19255. this.morphNormals = source.morphNormals;
  19256. return this;
  19257. };
  19258. /**
  19259. * @author alteredq / http://alteredqualia.com/
  19260. *
  19261. * parameters = {
  19262. * color: <hex>,
  19263. * opacity: <float>,
  19264. *
  19265. * linewidth: <float>,
  19266. *
  19267. * scale: <float>,
  19268. * dashSize: <float>,
  19269. * gapSize: <float>
  19270. * }
  19271. */
  19272. function LineDashedMaterial( parameters ) {
  19273. LineBasicMaterial.call( this );
  19274. this.type = 'LineDashedMaterial';
  19275. this.scale = 1;
  19276. this.dashSize = 3;
  19277. this.gapSize = 1;
  19278. this.setValues( parameters );
  19279. }
  19280. LineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype );
  19281. LineDashedMaterial.prototype.constructor = LineDashedMaterial;
  19282. LineDashedMaterial.prototype.isLineDashedMaterial = true;
  19283. LineDashedMaterial.prototype.copy = function ( source ) {
  19284. LineBasicMaterial.prototype.copy.call( this, source );
  19285. this.scale = source.scale;
  19286. this.dashSize = source.dashSize;
  19287. this.gapSize = source.gapSize;
  19288. return this;
  19289. };
  19290. var Materials = /*#__PURE__*/Object.freeze({
  19291. ShadowMaterial: ShadowMaterial,
  19292. SpriteMaterial: SpriteMaterial,
  19293. RawShaderMaterial: RawShaderMaterial,
  19294. ShaderMaterial: ShaderMaterial,
  19295. PointsMaterial: PointsMaterial,
  19296. MeshPhysicalMaterial: MeshPhysicalMaterial,
  19297. MeshStandardMaterial: MeshStandardMaterial,
  19298. MeshPhongMaterial: MeshPhongMaterial,
  19299. MeshToonMaterial: MeshToonMaterial,
  19300. MeshNormalMaterial: MeshNormalMaterial,
  19301. MeshLambertMaterial: MeshLambertMaterial,
  19302. MeshDepthMaterial: MeshDepthMaterial,
  19303. MeshDistanceMaterial: MeshDistanceMaterial,
  19304. MeshBasicMaterial: MeshBasicMaterial,
  19305. LineDashedMaterial: LineDashedMaterial,
  19306. LineBasicMaterial: LineBasicMaterial,
  19307. Material: Material
  19308. });
  19309. /**
  19310. * @author mrdoob / http://mrdoob.com/
  19311. */
  19312. var Cache = {
  19313. enabled: false,
  19314. files: {},
  19315. add: function ( key, file ) {
  19316. if ( this.enabled === false ) return;
  19317. // console.log( 'THREE.Cache', 'Adding key:', key );
  19318. this.files[ key ] = file;
  19319. },
  19320. get: function ( key ) {
  19321. if ( this.enabled === false ) return;
  19322. // console.log( 'THREE.Cache', 'Checking key:', key );
  19323. return this.files[ key ];
  19324. },
  19325. remove: function ( key ) {
  19326. delete this.files[ key ];
  19327. },
  19328. clear: function () {
  19329. this.files = {};
  19330. }
  19331. };
  19332. /**
  19333. * @author mrdoob / http://mrdoob.com/
  19334. */
  19335. function LoadingManager( onLoad, onProgress, onError ) {
  19336. var scope = this;
  19337. var isLoading = false;
  19338. var itemsLoaded = 0;
  19339. var itemsTotal = 0;
  19340. var urlModifier = undefined;
  19341. this.onStart = undefined;
  19342. this.onLoad = onLoad;
  19343. this.onProgress = onProgress;
  19344. this.onError = onError;
  19345. this.itemStart = function ( url ) {
  19346. itemsTotal ++;
  19347. if ( isLoading === false ) {
  19348. if ( scope.onStart !== undefined ) {
  19349. scope.onStart( url, itemsLoaded, itemsTotal );
  19350. }
  19351. }
  19352. isLoading = true;
  19353. };
  19354. this.itemEnd = function ( url ) {
  19355. itemsLoaded ++;
  19356. if ( scope.onProgress !== undefined ) {
  19357. scope.onProgress( url, itemsLoaded, itemsTotal );
  19358. }
  19359. if ( itemsLoaded === itemsTotal ) {
  19360. isLoading = false;
  19361. if ( scope.onLoad !== undefined ) {
  19362. scope.onLoad();
  19363. }
  19364. }
  19365. };
  19366. this.itemError = function ( url ) {
  19367. if ( scope.onError !== undefined ) {
  19368. scope.onError( url );
  19369. }
  19370. };
  19371. this.resolveURL = function ( url ) {
  19372. if ( urlModifier ) {
  19373. return urlModifier( url );
  19374. }
  19375. return url;
  19376. };
  19377. this.setURLModifier = function ( transform ) {
  19378. urlModifier = transform;
  19379. return this;
  19380. };
  19381. }
  19382. var DefaultLoadingManager = new LoadingManager();
  19383. /**
  19384. * @author mrdoob / http://mrdoob.com/
  19385. */
  19386. var loading = {};
  19387. function FileLoader( manager ) {
  19388. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  19389. }
  19390. Object.assign( FileLoader.prototype, {
  19391. load: function ( url, onLoad, onProgress, onError ) {
  19392. if ( url === undefined ) url = '';
  19393. if ( this.path !== undefined ) url = this.path + url;
  19394. url = this.manager.resolveURL( url );
  19395. var scope = this;
  19396. var cached = Cache.get( url );
  19397. if ( cached !== undefined ) {
  19398. scope.manager.itemStart( url );
  19399. setTimeout( function () {
  19400. if ( onLoad ) onLoad( cached );
  19401. scope.manager.itemEnd( url );
  19402. }, 0 );
  19403. return cached;
  19404. }
  19405. // Check if request is duplicate
  19406. if ( loading[ url ] !== undefined ) {
  19407. loading[ url ].push( {
  19408. onLoad: onLoad,
  19409. onProgress: onProgress,
  19410. onError: onError
  19411. } );
  19412. return;
  19413. }
  19414. // Check for data: URI
  19415. var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;
  19416. var dataUriRegexResult = url.match( dataUriRegex );
  19417. // Safari can not handle Data URIs through XMLHttpRequest so process manually
  19418. if ( dataUriRegexResult ) {
  19419. var mimeType = dataUriRegexResult[ 1 ];
  19420. var isBase64 = !! dataUriRegexResult[ 2 ];
  19421. var data = dataUriRegexResult[ 3 ];
  19422. data = window.decodeURIComponent( data );
  19423. if ( isBase64 ) data = window.atob( data );
  19424. try {
  19425. var response;
  19426. var responseType = ( this.responseType || '' ).toLowerCase();
  19427. switch ( responseType ) {
  19428. case 'arraybuffer':
  19429. case 'blob':
  19430. var view = new Uint8Array( data.length );
  19431. for ( var i = 0; i < data.length; i ++ ) {
  19432. view[ i ] = data.charCodeAt( i );
  19433. }
  19434. if ( responseType === 'blob' ) {
  19435. response = new Blob( [ view.buffer ], { type: mimeType } );
  19436. } else {
  19437. response = view.buffer;
  19438. }
  19439. break;
  19440. case 'document':
  19441. var parser = new DOMParser();
  19442. response = parser.parseFromString( data, mimeType );
  19443. break;
  19444. case 'json':
  19445. response = JSON.parse( data );
  19446. break;
  19447. default: // 'text' or other
  19448. response = data;
  19449. break;
  19450. }
  19451. // Wait for next browser tick like standard XMLHttpRequest event dispatching does
  19452. window.setTimeout( function () {
  19453. if ( onLoad ) onLoad( response );
  19454. scope.manager.itemEnd( url );
  19455. }, 0 );
  19456. } catch ( error ) {
  19457. // Wait for next browser tick like standard XMLHttpRequest event dispatching does
  19458. window.setTimeout( function () {
  19459. if ( onError ) onError( error );
  19460. scope.manager.itemEnd( url );
  19461. scope.manager.itemError( url );
  19462. }, 0 );
  19463. }
  19464. } else {
  19465. // Initialise array for duplicate requests
  19466. loading[ url ] = [];
  19467. loading[ url ].push( {
  19468. onLoad: onLoad,
  19469. onProgress: onProgress,
  19470. onError: onError
  19471. } );
  19472. var request = new XMLHttpRequest();
  19473. request.open( 'GET', url, true );
  19474. request.addEventListener( 'load', function ( event ) {
  19475. var response = this.response;
  19476. Cache.add( url, response );
  19477. var callbacks = loading[ url ];
  19478. delete loading[ url ];
  19479. if ( this.status === 200 || this.status === 0 ) {
  19480. // Some browsers return HTTP Status 0 when using non-http protocol
  19481. // e.g. 'file://' or 'data://'. Handle as success.
  19482. if ( this.status === 0 ) console.warn( 'THREE.FileLoader: HTTP Status 0 received.' );
  19483. for ( var i = 0, il = callbacks.length; i < il; i ++ ) {
  19484. var callback = callbacks[ i ];
  19485. if ( callback.onLoad ) callback.onLoad( response );
  19486. }
  19487. scope.manager.itemEnd( url );
  19488. } else {
  19489. for ( var i = 0, il = callbacks.length; i < il; i ++ ) {
  19490. var callback = callbacks[ i ];
  19491. if ( callback.onError ) callback.onError( event );
  19492. }
  19493. scope.manager.itemEnd( url );
  19494. scope.manager.itemError( url );
  19495. }
  19496. }, false );
  19497. request.addEventListener( 'progress', function ( event ) {
  19498. var callbacks = loading[ url ];
  19499. for ( var i = 0, il = callbacks.length; i < il; i ++ ) {
  19500. var callback = callbacks[ i ];
  19501. if ( callback.onProgress ) callback.onProgress( event );
  19502. }
  19503. }, false );
  19504. request.addEventListener( 'error', function ( event ) {
  19505. var callbacks = loading[ url ];
  19506. delete loading[ url ];
  19507. for ( var i = 0, il = callbacks.length; i < il; i ++ ) {
  19508. var callback = callbacks[ i ];
  19509. if ( callback.onError ) callback.onError( event );
  19510. }
  19511. scope.manager.itemEnd( url );
  19512. scope.manager.itemError( url );
  19513. }, false );
  19514. if ( this.responseType !== undefined ) request.responseType = this.responseType;
  19515. if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;
  19516. if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );
  19517. for ( var header in this.requestHeader ) {
  19518. request.setRequestHeader( header, this.requestHeader[ header ] );
  19519. }
  19520. request.send( null );
  19521. }
  19522. scope.manager.itemStart( url );
  19523. return request;
  19524. },
  19525. setPath: function ( value ) {
  19526. this.path = value;
  19527. return this;
  19528. },
  19529. setResponseType: function ( value ) {
  19530. this.responseType = value;
  19531. return this;
  19532. },
  19533. setWithCredentials: function ( value ) {
  19534. this.withCredentials = value;
  19535. return this;
  19536. },
  19537. setMimeType: function ( value ) {
  19538. this.mimeType = value;
  19539. return this;
  19540. },
  19541. setRequestHeader: function ( value ) {
  19542. this.requestHeader = value;
  19543. return this;
  19544. }
  19545. } );
  19546. /**
  19547. * @author mrdoob / http://mrdoob.com/
  19548. *
  19549. * Abstract Base class to block based textures loader (dds, pvr, ...)
  19550. */
  19551. function CompressedTextureLoader( manager ) {
  19552. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  19553. // override in sub classes
  19554. this._parser = null;
  19555. }
  19556. Object.assign( CompressedTextureLoader.prototype, {
  19557. load: function ( url, onLoad, onProgress, onError ) {
  19558. var scope = this;
  19559. var images = [];
  19560. var texture = new CompressedTexture();
  19561. texture.image = images;
  19562. var loader = new FileLoader( this.manager );
  19563. loader.setPath( this.path );
  19564. loader.setResponseType( 'arraybuffer' );
  19565. function loadTexture( i ) {
  19566. loader.load( url[ i ], function ( buffer ) {
  19567. var texDatas = scope._parser( buffer, true );
  19568. images[ i ] = {
  19569. width: texDatas.width,
  19570. height: texDatas.height,
  19571. format: texDatas.format,
  19572. mipmaps: texDatas.mipmaps
  19573. };
  19574. loaded += 1;
  19575. if ( loaded === 6 ) {
  19576. if ( texDatas.mipmapCount === 1 )
  19577. texture.minFilter = LinearFilter;
  19578. texture.format = texDatas.format;
  19579. texture.needsUpdate = true;
  19580. if ( onLoad ) onLoad( texture );
  19581. }
  19582. }, onProgress, onError );
  19583. }
  19584. if ( Array.isArray( url ) ) {
  19585. var loaded = 0;
  19586. for ( var i = 0, il = url.length; i < il; ++ i ) {
  19587. loadTexture( i );
  19588. }
  19589. } else {
  19590. // compressed cubemap texture stored in a single DDS file
  19591. loader.load( url, function ( buffer ) {
  19592. var texDatas = scope._parser( buffer, true );
  19593. if ( texDatas.isCubemap ) {
  19594. var faces = texDatas.mipmaps.length / texDatas.mipmapCount;
  19595. for ( var f = 0; f < faces; f ++ ) {
  19596. images[ f ] = { mipmaps: [] };
  19597. for ( var i = 0; i < texDatas.mipmapCount; i ++ ) {
  19598. images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );
  19599. images[ f ].format = texDatas.format;
  19600. images[ f ].width = texDatas.width;
  19601. images[ f ].height = texDatas.height;
  19602. }
  19603. }
  19604. } else {
  19605. texture.image.width = texDatas.width;
  19606. texture.image.height = texDatas.height;
  19607. texture.mipmaps = texDatas.mipmaps;
  19608. }
  19609. if ( texDatas.mipmapCount === 1 ) {
  19610. texture.minFilter = LinearFilter;
  19611. }
  19612. texture.format = texDatas.format;
  19613. texture.needsUpdate = true;
  19614. if ( onLoad ) onLoad( texture );
  19615. }, onProgress, onError );
  19616. }
  19617. return texture;
  19618. },
  19619. setPath: function ( value ) {
  19620. this.path = value;
  19621. return this;
  19622. }
  19623. } );
  19624. /**
  19625. * @author Nikos M. / https://github.com/foo123/
  19626. *
  19627. * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)
  19628. */
  19629. function DataTextureLoader( manager ) {
  19630. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  19631. // override in sub classes
  19632. this._parser = null;
  19633. }
  19634. Object.assign( DataTextureLoader.prototype, {
  19635. load: function ( url, onLoad, onProgress, onError ) {
  19636. var scope = this;
  19637. var texture = new DataTexture();
  19638. var loader = new FileLoader( this.manager );
  19639. loader.setResponseType( 'arraybuffer' );
  19640. loader.load( url, function ( buffer ) {
  19641. var texData = scope._parser( buffer );
  19642. if ( ! texData ) return;
  19643. if ( undefined !== texData.image ) {
  19644. texture.image = texData.image;
  19645. } else if ( undefined !== texData.data ) {
  19646. texture.image.width = texData.width;
  19647. texture.image.height = texData.height;
  19648. texture.image.data = texData.data;
  19649. }
  19650. texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;
  19651. texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;
  19652. texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;
  19653. texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;
  19654. texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;
  19655. if ( undefined !== texData.format ) {
  19656. texture.format = texData.format;
  19657. }
  19658. if ( undefined !== texData.type ) {
  19659. texture.type = texData.type;
  19660. }
  19661. if ( undefined !== texData.mipmaps ) {
  19662. texture.mipmaps = texData.mipmaps;
  19663. }
  19664. if ( 1 === texData.mipmapCount ) {
  19665. texture.minFilter = LinearFilter;
  19666. }
  19667. texture.needsUpdate = true;
  19668. if ( onLoad ) onLoad( texture, texData );
  19669. }, onProgress, onError );
  19670. return texture;
  19671. }
  19672. } );
  19673. /**
  19674. * @author mrdoob / http://mrdoob.com/
  19675. */
  19676. function ImageLoader( manager ) {
  19677. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  19678. }
  19679. Object.assign( ImageLoader.prototype, {
  19680. crossOrigin: 'anonymous',
  19681. load: function ( url, onLoad, onProgress, onError ) {
  19682. if ( url === undefined ) url = '';
  19683. if ( this.path !== undefined ) url = this.path + url;
  19684. url = this.manager.resolveURL( url );
  19685. var scope = this;
  19686. var cached = Cache.get( url );
  19687. if ( cached !== undefined ) {
  19688. scope.manager.itemStart( url );
  19689. setTimeout( function () {
  19690. if ( onLoad ) onLoad( cached );
  19691. scope.manager.itemEnd( url );
  19692. }, 0 );
  19693. return cached;
  19694. }
  19695. var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );
  19696. function onImageLoad() {
  19697. image.removeEventListener( 'load', onImageLoad, false );
  19698. image.removeEventListener( 'error', onImageError, false );
  19699. Cache.add( url, this );
  19700. if ( onLoad ) onLoad( this );
  19701. scope.manager.itemEnd( url );
  19702. }
  19703. function onImageError( event ) {
  19704. image.removeEventListener( 'load', onImageLoad, false );
  19705. image.removeEventListener( 'error', onImageError, false );
  19706. if ( onError ) onError( event );
  19707. scope.manager.itemEnd( url );
  19708. scope.manager.itemError( url );
  19709. }
  19710. image.addEventListener( 'load', onImageLoad, false );
  19711. image.addEventListener( 'error', onImageError, false );
  19712. if ( url.substr( 0, 5 ) !== 'data:' ) {
  19713. if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;
  19714. }
  19715. scope.manager.itemStart( url );
  19716. image.src = url;
  19717. return image;
  19718. },
  19719. setCrossOrigin: function ( value ) {
  19720. this.crossOrigin = value;
  19721. return this;
  19722. },
  19723. setPath: function ( value ) {
  19724. this.path = value;
  19725. return this;
  19726. }
  19727. } );
  19728. /**
  19729. * @author mrdoob / http://mrdoob.com/
  19730. */
  19731. function CubeTextureLoader( manager ) {
  19732. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  19733. }
  19734. Object.assign( CubeTextureLoader.prototype, {
  19735. crossOrigin: 'anonymous',
  19736. load: function ( urls, onLoad, onProgress, onError ) {
  19737. var texture = new CubeTexture();
  19738. var loader = new ImageLoader( this.manager );
  19739. loader.setCrossOrigin( this.crossOrigin );
  19740. loader.setPath( this.path );
  19741. var loaded = 0;
  19742. function loadTexture( i ) {
  19743. loader.load( urls[ i ], function ( image ) {
  19744. texture.images[ i ] = image;
  19745. loaded ++;
  19746. if ( loaded === 6 ) {
  19747. texture.needsUpdate = true;
  19748. if ( onLoad ) onLoad( texture );
  19749. }
  19750. }, undefined, onError );
  19751. }
  19752. for ( var i = 0; i < urls.length; ++ i ) {
  19753. loadTexture( i );
  19754. }
  19755. return texture;
  19756. },
  19757. setCrossOrigin: function ( value ) {
  19758. this.crossOrigin = value;
  19759. return this;
  19760. },
  19761. setPath: function ( value ) {
  19762. this.path = value;
  19763. return this;
  19764. }
  19765. } );
  19766. /**
  19767. * @author mrdoob / http://mrdoob.com/
  19768. */
  19769. function TextureLoader( manager ) {
  19770. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  19771. }
  19772. Object.assign( TextureLoader.prototype, {
  19773. crossOrigin: 'anonymous',
  19774. load: function ( url, onLoad, onProgress, onError ) {
  19775. var texture = new Texture();
  19776. var loader = new ImageLoader( this.manager );
  19777. loader.setCrossOrigin( this.crossOrigin );
  19778. loader.setPath( this.path );
  19779. loader.load( url, function ( image ) {
  19780. texture.image = image;
  19781. // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.
  19782. var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0;
  19783. texture.format = isJPEG ? RGBFormat : RGBAFormat;
  19784. texture.needsUpdate = true;
  19785. if ( onLoad !== undefined ) {
  19786. onLoad( texture );
  19787. }
  19788. }, onProgress, onError );
  19789. return texture;
  19790. },
  19791. setCrossOrigin: function ( value ) {
  19792. this.crossOrigin = value;
  19793. return this;
  19794. },
  19795. setPath: function ( value ) {
  19796. this.path = value;
  19797. return this;
  19798. }
  19799. } );
  19800. /**
  19801. * @author zz85 / http://www.lab4games.net/zz85/blog
  19802. * Extensible curve object
  19803. *
  19804. * Some common of curve methods:
  19805. * .getPoint( t, optionalTarget ), .getTangent( t )
  19806. * .getPointAt( u, optionalTarget ), .getTangentAt( u )
  19807. * .getPoints(), .getSpacedPoints()
  19808. * .getLength()
  19809. * .updateArcLengths()
  19810. *
  19811. * This following curves inherit from THREE.Curve:
  19812. *
  19813. * -- 2D curves --
  19814. * THREE.ArcCurve
  19815. * THREE.CubicBezierCurve
  19816. * THREE.EllipseCurve
  19817. * THREE.LineCurve
  19818. * THREE.QuadraticBezierCurve
  19819. * THREE.SplineCurve
  19820. *
  19821. * -- 3D curves --
  19822. * THREE.CatmullRomCurve3
  19823. * THREE.CubicBezierCurve3
  19824. * THREE.LineCurve3
  19825. * THREE.QuadraticBezierCurve3
  19826. *
  19827. * A series of curves can be represented as a THREE.CurvePath.
  19828. *
  19829. **/
  19830. /**************************************************************
  19831. * Abstract Curve base class
  19832. **************************************************************/
  19833. function Curve() {
  19834. this.type = 'Curve';
  19835. this.arcLengthDivisions = 200;
  19836. }
  19837. Object.assign( Curve.prototype, {
  19838. // Virtual base class method to overwrite and implement in subclasses
  19839. // - t [0 .. 1]
  19840. getPoint: function ( /* t, optionalTarget */ ) {
  19841. console.warn( 'THREE.Curve: .getPoint() not implemented.' );
  19842. return null;
  19843. },
  19844. // Get point at relative position in curve according to arc length
  19845. // - u [0 .. 1]
  19846. getPointAt: function ( u, optionalTarget ) {
  19847. var t = this.getUtoTmapping( u );
  19848. return this.getPoint( t, optionalTarget );
  19849. },
  19850. // Get sequence of points using getPoint( t )
  19851. getPoints: function ( divisions ) {
  19852. if ( divisions === undefined ) divisions = 5;
  19853. var points = [];
  19854. for ( var d = 0; d <= divisions; d ++ ) {
  19855. points.push( this.getPoint( d / divisions ) );
  19856. }
  19857. return points;
  19858. },
  19859. // Get sequence of points using getPointAt( u )
  19860. getSpacedPoints: function ( divisions ) {
  19861. if ( divisions === undefined ) divisions = 5;
  19862. var points = [];
  19863. for ( var d = 0; d <= divisions; d ++ ) {
  19864. points.push( this.getPointAt( d / divisions ) );
  19865. }
  19866. return points;
  19867. },
  19868. // Get total curve arc length
  19869. getLength: function () {
  19870. var lengths = this.getLengths();
  19871. return lengths[ lengths.length - 1 ];
  19872. },
  19873. // Get list of cumulative segment lengths
  19874. getLengths: function ( divisions ) {
  19875. if ( divisions === undefined ) divisions = this.arcLengthDivisions;
  19876. if ( this.cacheArcLengths &&
  19877. ( this.cacheArcLengths.length === divisions + 1 ) &&
  19878. ! this.needsUpdate ) {
  19879. return this.cacheArcLengths;
  19880. }
  19881. this.needsUpdate = false;
  19882. var cache = [];
  19883. var current, last = this.getPoint( 0 );
  19884. var p, sum = 0;
  19885. cache.push( 0 );
  19886. for ( p = 1; p <= divisions; p ++ ) {
  19887. current = this.getPoint( p / divisions );
  19888. sum += current.distanceTo( last );
  19889. cache.push( sum );
  19890. last = current;
  19891. }
  19892. this.cacheArcLengths = cache;
  19893. return cache; // { sums: cache, sum: sum }; Sum is in the last element.
  19894. },
  19895. updateArcLengths: function () {
  19896. this.needsUpdate = true;
  19897. this.getLengths();
  19898. },
  19899. // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant
  19900. getUtoTmapping: function ( u, distance ) {
  19901. var arcLengths = this.getLengths();
  19902. var i = 0, il = arcLengths.length;
  19903. var targetArcLength; // The targeted u distance value to get
  19904. if ( distance ) {
  19905. targetArcLength = distance;
  19906. } else {
  19907. targetArcLength = u * arcLengths[ il - 1 ];
  19908. }
  19909. // binary search for the index with largest value smaller than target u distance
  19910. var low = 0, high = il - 1, comparison;
  19911. while ( low <= high ) {
  19912. i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats
  19913. comparison = arcLengths[ i ] - targetArcLength;
  19914. if ( comparison < 0 ) {
  19915. low = i + 1;
  19916. } else if ( comparison > 0 ) {
  19917. high = i - 1;
  19918. } else {
  19919. high = i;
  19920. break;
  19921. // DONE
  19922. }
  19923. }
  19924. i = high;
  19925. if ( arcLengths[ i ] === targetArcLength ) {
  19926. return i / ( il - 1 );
  19927. }
  19928. // we could get finer grain at lengths, or use simple interpolation between two points
  19929. var lengthBefore = arcLengths[ i ];
  19930. var lengthAfter = arcLengths[ i + 1 ];
  19931. var segmentLength = lengthAfter - lengthBefore;
  19932. // determine where we are between the 'before' and 'after' points
  19933. var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;
  19934. // add that fractional amount to t
  19935. var t = ( i + segmentFraction ) / ( il - 1 );
  19936. return t;
  19937. },
  19938. // Returns a unit vector tangent at t
  19939. // In case any sub curve does not implement its tangent derivation,
  19940. // 2 points a small delta apart will be used to find its gradient
  19941. // which seems to give a reasonable approximation
  19942. getTangent: function ( t ) {
  19943. var delta = 0.0001;
  19944. var t1 = t - delta;
  19945. var t2 = t + delta;
  19946. // Capping in case of danger
  19947. if ( t1 < 0 ) t1 = 0;
  19948. if ( t2 > 1 ) t2 = 1;
  19949. var pt1 = this.getPoint( t1 );
  19950. var pt2 = this.getPoint( t2 );
  19951. var vec = pt2.clone().sub( pt1 );
  19952. return vec.normalize();
  19953. },
  19954. getTangentAt: function ( u ) {
  19955. var t = this.getUtoTmapping( u );
  19956. return this.getTangent( t );
  19957. },
  19958. computeFrenetFrames: function ( segments, closed ) {
  19959. // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf
  19960. var normal = new Vector3();
  19961. var tangents = [];
  19962. var normals = [];
  19963. var binormals = [];
  19964. var vec = new Vector3();
  19965. var mat = new Matrix4();
  19966. var i, u, theta;
  19967. // compute the tangent vectors for each segment on the curve
  19968. for ( i = 0; i <= segments; i ++ ) {
  19969. u = i / segments;
  19970. tangents[ i ] = this.getTangentAt( u );
  19971. tangents[ i ].normalize();
  19972. }
  19973. // select an initial normal vector perpendicular to the first tangent vector,
  19974. // and in the direction of the minimum tangent xyz component
  19975. normals[ 0 ] = new Vector3();
  19976. binormals[ 0 ] = new Vector3();
  19977. var min = Number.MAX_VALUE;
  19978. var tx = Math.abs( tangents[ 0 ].x );
  19979. var ty = Math.abs( tangents[ 0 ].y );
  19980. var tz = Math.abs( tangents[ 0 ].z );
  19981. if ( tx <= min ) {
  19982. min = tx;
  19983. normal.set( 1, 0, 0 );
  19984. }
  19985. if ( ty <= min ) {
  19986. min = ty;
  19987. normal.set( 0, 1, 0 );
  19988. }
  19989. if ( tz <= min ) {
  19990. normal.set( 0, 0, 1 );
  19991. }
  19992. vec.crossVectors( tangents[ 0 ], normal ).normalize();
  19993. normals[ 0 ].crossVectors( tangents[ 0 ], vec );
  19994. binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );
  19995. // compute the slowly-varying normal and binormal vectors for each segment on the curve
  19996. for ( i = 1; i <= segments; i ++ ) {
  19997. normals[ i ] = normals[ i - 1 ].clone();
  19998. binormals[ i ] = binormals[ i - 1 ].clone();
  19999. vec.crossVectors( tangents[ i - 1 ], tangents[ i ] );
  20000. if ( vec.length() > Number.EPSILON ) {
  20001. vec.normalize();
  20002. theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors
  20003. normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );
  20004. }
  20005. binormals[ i ].crossVectors( tangents[ i ], normals[ i ] );
  20006. }
  20007. // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same
  20008. if ( closed === true ) {
  20009. theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );
  20010. theta /= segments;
  20011. if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {
  20012. theta = - theta;
  20013. }
  20014. for ( i = 1; i <= segments; i ++ ) {
  20015. // twist a little...
  20016. normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );
  20017. binormals[ i ].crossVectors( tangents[ i ], normals[ i ] );
  20018. }
  20019. }
  20020. return {
  20021. tangents: tangents,
  20022. normals: normals,
  20023. binormals: binormals
  20024. };
  20025. },
  20026. clone: function () {
  20027. return new this.constructor().copy( this );
  20028. },
  20029. copy: function ( source ) {
  20030. this.arcLengthDivisions = source.arcLengthDivisions;
  20031. return this;
  20032. },
  20033. toJSON: function () {
  20034. var data = {
  20035. metadata: {
  20036. version: 4.5,
  20037. type: 'Curve',
  20038. generator: 'Curve.toJSON'
  20039. }
  20040. };
  20041. data.arcLengthDivisions = this.arcLengthDivisions;
  20042. data.type = this.type;
  20043. return data;
  20044. },
  20045. fromJSON: function ( json ) {
  20046. this.arcLengthDivisions = json.arcLengthDivisions;
  20047. return this;
  20048. }
  20049. } );
  20050. function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {
  20051. Curve.call( this );
  20052. this.type = 'EllipseCurve';
  20053. this.aX = aX || 0;
  20054. this.aY = aY || 0;
  20055. this.xRadius = xRadius || 1;
  20056. this.yRadius = yRadius || 1;
  20057. this.aStartAngle = aStartAngle || 0;
  20058. this.aEndAngle = aEndAngle || 2 * Math.PI;
  20059. this.aClockwise = aClockwise || false;
  20060. this.aRotation = aRotation || 0;
  20061. }
  20062. EllipseCurve.prototype = Object.create( Curve.prototype );
  20063. EllipseCurve.prototype.constructor = EllipseCurve;
  20064. EllipseCurve.prototype.isEllipseCurve = true;
  20065. EllipseCurve.prototype.getPoint = function ( t, optionalTarget ) {
  20066. var point = optionalTarget || new Vector2();
  20067. var twoPi = Math.PI * 2;
  20068. var deltaAngle = this.aEndAngle - this.aStartAngle;
  20069. var samePoints = Math.abs( deltaAngle ) < Number.EPSILON;
  20070. // ensures that deltaAngle is 0 .. 2 PI
  20071. while ( deltaAngle < 0 ) deltaAngle += twoPi;
  20072. while ( deltaAngle > twoPi ) deltaAngle -= twoPi;
  20073. if ( deltaAngle < Number.EPSILON ) {
  20074. if ( samePoints ) {
  20075. deltaAngle = 0;
  20076. } else {
  20077. deltaAngle = twoPi;
  20078. }
  20079. }
  20080. if ( this.aClockwise === true && ! samePoints ) {
  20081. if ( deltaAngle === twoPi ) {
  20082. deltaAngle = - twoPi;
  20083. } else {
  20084. deltaAngle = deltaAngle - twoPi;
  20085. }
  20086. }
  20087. var angle = this.aStartAngle + t * deltaAngle;
  20088. var x = this.aX + this.xRadius * Math.cos( angle );
  20089. var y = this.aY + this.yRadius * Math.sin( angle );
  20090. if ( this.aRotation !== 0 ) {
  20091. var cos = Math.cos( this.aRotation );
  20092. var sin = Math.sin( this.aRotation );
  20093. var tx = x - this.aX;
  20094. var ty = y - this.aY;
  20095. // Rotate the point about the center of the ellipse.
  20096. x = tx * cos - ty * sin + this.aX;
  20097. y = tx * sin + ty * cos + this.aY;
  20098. }
  20099. return point.set( x, y );
  20100. };
  20101. EllipseCurve.prototype.copy = function ( source ) {
  20102. Curve.prototype.copy.call( this, source );
  20103. this.aX = source.aX;
  20104. this.aY = source.aY;
  20105. this.xRadius = source.xRadius;
  20106. this.yRadius = source.yRadius;
  20107. this.aStartAngle = source.aStartAngle;
  20108. this.aEndAngle = source.aEndAngle;
  20109. this.aClockwise = source.aClockwise;
  20110. this.aRotation = source.aRotation;
  20111. return this;
  20112. };
  20113. EllipseCurve.prototype.toJSON = function () {
  20114. var data = Curve.prototype.toJSON.call( this );
  20115. data.aX = this.aX;
  20116. data.aY = this.aY;
  20117. data.xRadius = this.xRadius;
  20118. data.yRadius = this.yRadius;
  20119. data.aStartAngle = this.aStartAngle;
  20120. data.aEndAngle = this.aEndAngle;
  20121. data.aClockwise = this.aClockwise;
  20122. data.aRotation = this.aRotation;
  20123. return data;
  20124. };
  20125. EllipseCurve.prototype.fromJSON = function ( json ) {
  20126. Curve.prototype.fromJSON.call( this, json );
  20127. this.aX = json.aX;
  20128. this.aY = json.aY;
  20129. this.xRadius = json.xRadius;
  20130. this.yRadius = json.yRadius;
  20131. this.aStartAngle = json.aStartAngle;
  20132. this.aEndAngle = json.aEndAngle;
  20133. this.aClockwise = json.aClockwise;
  20134. this.aRotation = json.aRotation;
  20135. return this;
  20136. };
  20137. function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
  20138. EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );
  20139. this.type = 'ArcCurve';
  20140. }
  20141. ArcCurve.prototype = Object.create( EllipseCurve.prototype );
  20142. ArcCurve.prototype.constructor = ArcCurve;
  20143. ArcCurve.prototype.isArcCurve = true;
  20144. /**
  20145. * @author zz85 https://github.com/zz85
  20146. *
  20147. * Centripetal CatmullRom Curve - which is useful for avoiding
  20148. * cusps and self-intersections in non-uniform catmull rom curves.
  20149. * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf
  20150. *
  20151. * curve.type accepts centripetal(default), chordal and catmullrom
  20152. * curve.tension is used for catmullrom which defaults to 0.5
  20153. */
  20154. /*
  20155. Based on an optimized c++ solution in
  20156. - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/
  20157. - http://ideone.com/NoEbVM
  20158. This CubicPoly class could be used for reusing some variables and calculations,
  20159. but for three.js curve use, it could be possible inlined and flatten into a single function call
  20160. which can be placed in CurveUtils.
  20161. */
  20162. function CubicPoly() {
  20163. var c0 = 0, c1 = 0, c2 = 0, c3 = 0;
  20164. /*
  20165. * Compute coefficients for a cubic polynomial
  20166. * p(s) = c0 + c1*s + c2*s^2 + c3*s^3
  20167. * such that
  20168. * p(0) = x0, p(1) = x1
  20169. * and
  20170. * p'(0) = t0, p'(1) = t1.
  20171. */
  20172. function init( x0, x1, t0, t1 ) {
  20173. c0 = x0;
  20174. c1 = t0;
  20175. c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;
  20176. c3 = 2 * x0 - 2 * x1 + t0 + t1;
  20177. }
  20178. return {
  20179. initCatmullRom: function ( x0, x1, x2, x3, tension ) {
  20180. init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );
  20181. },
  20182. initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {
  20183. // compute tangents when parameterized in [t1,t2]
  20184. var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;
  20185. var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;
  20186. // rescale tangents for parametrization in [0,1]
  20187. t1 *= dt1;
  20188. t2 *= dt1;
  20189. init( x1, x2, t1, t2 );
  20190. },
  20191. calc: function ( t ) {
  20192. var t2 = t * t;
  20193. var t3 = t2 * t;
  20194. return c0 + c1 * t + c2 * t2 + c3 * t3;
  20195. }
  20196. };
  20197. }
  20198. //
  20199. var tmp = new Vector3();
  20200. var px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly();
  20201. function CatmullRomCurve3( points, closed, curveType, tension ) {
  20202. Curve.call( this );
  20203. this.type = 'CatmullRomCurve3';
  20204. this.points = points || [];
  20205. this.closed = closed || false;
  20206. this.curveType = curveType || 'centripetal';
  20207. this.tension = tension || 0.5;
  20208. }
  20209. CatmullRomCurve3.prototype = Object.create( Curve.prototype );
  20210. CatmullRomCurve3.prototype.constructor = CatmullRomCurve3;
  20211. CatmullRomCurve3.prototype.isCatmullRomCurve3 = true;
  20212. CatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) {
  20213. var point = optionalTarget || new Vector3();
  20214. var points = this.points;
  20215. var l = points.length;
  20216. var p = ( l - ( this.closed ? 0 : 1 ) ) * t;
  20217. var intPoint = Math.floor( p );
  20218. var weight = p - intPoint;
  20219. if ( this.closed ) {
  20220. intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;
  20221. } else if ( weight === 0 && intPoint === l - 1 ) {
  20222. intPoint = l - 2;
  20223. weight = 1;
  20224. }
  20225. var p0, p1, p2, p3; // 4 points
  20226. if ( this.closed || intPoint > 0 ) {
  20227. p0 = points[ ( intPoint - 1 ) % l ];
  20228. } else {
  20229. // extrapolate first point
  20230. tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );
  20231. p0 = tmp;
  20232. }
  20233. p1 = points[ intPoint % l ];
  20234. p2 = points[ ( intPoint + 1 ) % l ];
  20235. if ( this.closed || intPoint + 2 < l ) {
  20236. p3 = points[ ( intPoint + 2 ) % l ];
  20237. } else {
  20238. // extrapolate last point
  20239. tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );
  20240. p3 = tmp;
  20241. }
  20242. if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {
  20243. // init Centripetal / Chordal Catmull-Rom
  20244. var pow = this.curveType === 'chordal' ? 0.5 : 0.25;
  20245. var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );
  20246. var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );
  20247. var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );
  20248. // safety check for repeated points
  20249. if ( dt1 < 1e-4 ) dt1 = 1.0;
  20250. if ( dt0 < 1e-4 ) dt0 = dt1;
  20251. if ( dt2 < 1e-4 ) dt2 = dt1;
  20252. px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );
  20253. py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );
  20254. pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );
  20255. } else if ( this.curveType === 'catmullrom' ) {
  20256. px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );
  20257. py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );
  20258. pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );
  20259. }
  20260. point.set(
  20261. px.calc( weight ),
  20262. py.calc( weight ),
  20263. pz.calc( weight )
  20264. );
  20265. return point;
  20266. };
  20267. CatmullRomCurve3.prototype.copy = function ( source ) {
  20268. Curve.prototype.copy.call( this, source );
  20269. this.points = [];
  20270. for ( var i = 0, l = source.points.length; i < l; i ++ ) {
  20271. var point = source.points[ i ];
  20272. this.points.push( point.clone() );
  20273. }
  20274. this.closed = source.closed;
  20275. this.curveType = source.curveType;
  20276. this.tension = source.tension;
  20277. return this;
  20278. };
  20279. CatmullRomCurve3.prototype.toJSON = function () {
  20280. var data = Curve.prototype.toJSON.call( this );
  20281. data.points = [];
  20282. for ( var i = 0, l = this.points.length; i < l; i ++ ) {
  20283. var point = this.points[ i ];
  20284. data.points.push( point.toArray() );
  20285. }
  20286. data.closed = this.closed;
  20287. data.curveType = this.curveType;
  20288. data.tension = this.tension;
  20289. return data;
  20290. };
  20291. CatmullRomCurve3.prototype.fromJSON = function ( json ) {
  20292. Curve.prototype.fromJSON.call( this, json );
  20293. this.points = [];
  20294. for ( var i = 0, l = json.points.length; i < l; i ++ ) {
  20295. var point = json.points[ i ];
  20296. this.points.push( new Vector3().fromArray( point ) );
  20297. }
  20298. this.closed = json.closed;
  20299. this.curveType = json.curveType;
  20300. this.tension = json.tension;
  20301. return this;
  20302. };
  20303. /**
  20304. * @author zz85 / http://www.lab4games.net/zz85/blog
  20305. *
  20306. * Bezier Curves formulas obtained from
  20307. * http://en.wikipedia.org/wiki/Bézier_curve
  20308. */
  20309. function CatmullRom( t, p0, p1, p2, p3 ) {
  20310. var v0 = ( p2 - p0 ) * 0.5;
  20311. var v1 = ( p3 - p1 ) * 0.5;
  20312. var t2 = t * t;
  20313. var t3 = t * t2;
  20314. return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;
  20315. }
  20316. //
  20317. function QuadraticBezierP0( t, p ) {
  20318. var k = 1 - t;
  20319. return k * k * p;
  20320. }
  20321. function QuadraticBezierP1( t, p ) {
  20322. return 2 * ( 1 - t ) * t * p;
  20323. }
  20324. function QuadraticBezierP2( t, p ) {
  20325. return t * t * p;
  20326. }
  20327. function QuadraticBezier( t, p0, p1, p2 ) {
  20328. return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +
  20329. QuadraticBezierP2( t, p2 );
  20330. }
  20331. //
  20332. function CubicBezierP0( t, p ) {
  20333. var k = 1 - t;
  20334. return k * k * k * p;
  20335. }
  20336. function CubicBezierP1( t, p ) {
  20337. var k = 1 - t;
  20338. return 3 * k * k * t * p;
  20339. }
  20340. function CubicBezierP2( t, p ) {
  20341. return 3 * ( 1 - t ) * t * t * p;
  20342. }
  20343. function CubicBezierP3( t, p ) {
  20344. return t * t * t * p;
  20345. }
  20346. function CubicBezier( t, p0, p1, p2, p3 ) {
  20347. return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +
  20348. CubicBezierP3( t, p3 );
  20349. }
  20350. function CubicBezierCurve( v0, v1, v2, v3 ) {
  20351. Curve.call( this );
  20352. this.type = 'CubicBezierCurve';
  20353. this.v0 = v0 || new Vector2();
  20354. this.v1 = v1 || new Vector2();
  20355. this.v2 = v2 || new Vector2();
  20356. this.v3 = v3 || new Vector2();
  20357. }
  20358. CubicBezierCurve.prototype = Object.create( Curve.prototype );
  20359. CubicBezierCurve.prototype.constructor = CubicBezierCurve;
  20360. CubicBezierCurve.prototype.isCubicBezierCurve = true;
  20361. CubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {
  20362. var point = optionalTarget || new Vector2();
  20363. var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;
  20364. point.set(
  20365. CubicBezier( t, v0.x, v1.x, v2.x, v3.x ),
  20366. CubicBezier( t, v0.y, v1.y, v2.y, v3.y )
  20367. );
  20368. return point;
  20369. };
  20370. CubicBezierCurve.prototype.copy = function ( source ) {
  20371. Curve.prototype.copy.call( this, source );
  20372. this.v0.copy( source.v0 );
  20373. this.v1.copy( source.v1 );
  20374. this.v2.copy( source.v2 );
  20375. this.v3.copy( source.v3 );
  20376. return this;
  20377. };
  20378. CubicBezierCurve.prototype.toJSON = function () {
  20379. var data = Curve.prototype.toJSON.call( this );
  20380. data.v0 = this.v0.toArray();
  20381. data.v1 = this.v1.toArray();
  20382. data.v2 = this.v2.toArray();
  20383. data.v3 = this.v3.toArray();
  20384. return data;
  20385. };
  20386. CubicBezierCurve.prototype.fromJSON = function ( json ) {
  20387. Curve.prototype.fromJSON.call( this, json );
  20388. this.v0.fromArray( json.v0 );
  20389. this.v1.fromArray( json.v1 );
  20390. this.v2.fromArray( json.v2 );
  20391. this.v3.fromArray( json.v3 );
  20392. return this;
  20393. };
  20394. function CubicBezierCurve3( v0, v1, v2, v3 ) {
  20395. Curve.call( this );
  20396. this.type = 'CubicBezierCurve3';
  20397. this.v0 = v0 || new Vector3();
  20398. this.v1 = v1 || new Vector3();
  20399. this.v2 = v2 || new Vector3();
  20400. this.v3 = v3 || new Vector3();
  20401. }
  20402. CubicBezierCurve3.prototype = Object.create( Curve.prototype );
  20403. CubicBezierCurve3.prototype.constructor = CubicBezierCurve3;
  20404. CubicBezierCurve3.prototype.isCubicBezierCurve3 = true;
  20405. CubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {
  20406. var point = optionalTarget || new Vector3();
  20407. var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;
  20408. point.set(
  20409. CubicBezier( t, v0.x, v1.x, v2.x, v3.x ),
  20410. CubicBezier( t, v0.y, v1.y, v2.y, v3.y ),
  20411. CubicBezier( t, v0.z, v1.z, v2.z, v3.z )
  20412. );
  20413. return point;
  20414. };
  20415. CubicBezierCurve3.prototype.copy = function ( source ) {
  20416. Curve.prototype.copy.call( this, source );
  20417. this.v0.copy( source.v0 );
  20418. this.v1.copy( source.v1 );
  20419. this.v2.copy( source.v2 );
  20420. this.v3.copy( source.v3 );
  20421. return this;
  20422. };
  20423. CubicBezierCurve3.prototype.toJSON = function () {
  20424. var data = Curve.prototype.toJSON.call( this );
  20425. data.v0 = this.v0.toArray();
  20426. data.v1 = this.v1.toArray();
  20427. data.v2 = this.v2.toArray();
  20428. data.v3 = this.v3.toArray();
  20429. return data;
  20430. };
  20431. CubicBezierCurve3.prototype.fromJSON = function ( json ) {
  20432. Curve.prototype.fromJSON.call( this, json );
  20433. this.v0.fromArray( json.v0 );
  20434. this.v1.fromArray( json.v1 );
  20435. this.v2.fromArray( json.v2 );
  20436. this.v3.fromArray( json.v3 );
  20437. return this;
  20438. };
  20439. function LineCurve( v1, v2 ) {
  20440. Curve.call( this );
  20441. this.type = 'LineCurve';
  20442. this.v1 = v1 || new Vector2();
  20443. this.v2 = v2 || new Vector2();
  20444. }
  20445. LineCurve.prototype = Object.create( Curve.prototype );
  20446. LineCurve.prototype.constructor = LineCurve;
  20447. LineCurve.prototype.isLineCurve = true;
  20448. LineCurve.prototype.getPoint = function ( t, optionalTarget ) {
  20449. var point = optionalTarget || new Vector2();
  20450. if ( t === 1 ) {
  20451. point.copy( this.v2 );
  20452. } else {
  20453. point.copy( this.v2 ).sub( this.v1 );
  20454. point.multiplyScalar( t ).add( this.v1 );
  20455. }
  20456. return point;
  20457. };
  20458. // Line curve is linear, so we can overwrite default getPointAt
  20459. LineCurve.prototype.getPointAt = function ( u, optionalTarget ) {
  20460. return this.getPoint( u, optionalTarget );
  20461. };
  20462. LineCurve.prototype.getTangent = function ( /* t */ ) {
  20463. var tangent = this.v2.clone().sub( this.v1 );
  20464. return tangent.normalize();
  20465. };
  20466. LineCurve.prototype.copy = function ( source ) {
  20467. Curve.prototype.copy.call( this, source );
  20468. this.v1.copy( source.v1 );
  20469. this.v2.copy( source.v2 );
  20470. return this;
  20471. };
  20472. LineCurve.prototype.toJSON = function () {
  20473. var data = Curve.prototype.toJSON.call( this );
  20474. data.v1 = this.v1.toArray();
  20475. data.v2 = this.v2.toArray();
  20476. return data;
  20477. };
  20478. LineCurve.prototype.fromJSON = function ( json ) {
  20479. Curve.prototype.fromJSON.call( this, json );
  20480. this.v1.fromArray( json.v1 );
  20481. this.v2.fromArray( json.v2 );
  20482. return this;
  20483. };
  20484. function LineCurve3( v1, v2 ) {
  20485. Curve.call( this );
  20486. this.type = 'LineCurve3';
  20487. this.v1 = v1 || new Vector3();
  20488. this.v2 = v2 || new Vector3();
  20489. }
  20490. LineCurve3.prototype = Object.create( Curve.prototype );
  20491. LineCurve3.prototype.constructor = LineCurve3;
  20492. LineCurve3.prototype.isLineCurve3 = true;
  20493. LineCurve3.prototype.getPoint = function ( t, optionalTarget ) {
  20494. var point = optionalTarget || new Vector3();
  20495. if ( t === 1 ) {
  20496. point.copy( this.v2 );
  20497. } else {
  20498. point.copy( this.v2 ).sub( this.v1 );
  20499. point.multiplyScalar( t ).add( this.v1 );
  20500. }
  20501. return point;
  20502. };
  20503. // Line curve is linear, so we can overwrite default getPointAt
  20504. LineCurve3.prototype.getPointAt = function ( u, optionalTarget ) {
  20505. return this.getPoint( u, optionalTarget );
  20506. };
  20507. LineCurve3.prototype.copy = function ( source ) {
  20508. Curve.prototype.copy.call( this, source );
  20509. this.v1.copy( source.v1 );
  20510. this.v2.copy( source.v2 );
  20511. return this;
  20512. };
  20513. LineCurve3.prototype.toJSON = function () {
  20514. var data = Curve.prototype.toJSON.call( this );
  20515. data.v1 = this.v1.toArray();
  20516. data.v2 = this.v2.toArray();
  20517. return data;
  20518. };
  20519. LineCurve3.prototype.fromJSON = function ( json ) {
  20520. Curve.prototype.fromJSON.call( this, json );
  20521. this.v1.fromArray( json.v1 );
  20522. this.v2.fromArray( json.v2 );
  20523. return this;
  20524. };
  20525. function QuadraticBezierCurve( v0, v1, v2 ) {
  20526. Curve.call( this );
  20527. this.type = 'QuadraticBezierCurve';
  20528. this.v0 = v0 || new Vector2();
  20529. this.v1 = v1 || new Vector2();
  20530. this.v2 = v2 || new Vector2();
  20531. }
  20532. QuadraticBezierCurve.prototype = Object.create( Curve.prototype );
  20533. QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;
  20534. QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true;
  20535. QuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {
  20536. var point = optionalTarget || new Vector2();
  20537. var v0 = this.v0, v1 = this.v1, v2 = this.v2;
  20538. point.set(
  20539. QuadraticBezier( t, v0.x, v1.x, v2.x ),
  20540. QuadraticBezier( t, v0.y, v1.y, v2.y )
  20541. );
  20542. return point;
  20543. };
  20544. QuadraticBezierCurve.prototype.copy = function ( source ) {
  20545. Curve.prototype.copy.call( this, source );
  20546. this.v0.copy( source.v0 );
  20547. this.v1.copy( source.v1 );
  20548. this.v2.copy( source.v2 );
  20549. return this;
  20550. };
  20551. QuadraticBezierCurve.prototype.toJSON = function () {
  20552. var data = Curve.prototype.toJSON.call( this );
  20553. data.v0 = this.v0.toArray();
  20554. data.v1 = this.v1.toArray();
  20555. data.v2 = this.v2.toArray();
  20556. return data;
  20557. };
  20558. QuadraticBezierCurve.prototype.fromJSON = function ( json ) {
  20559. Curve.prototype.fromJSON.call( this, json );
  20560. this.v0.fromArray( json.v0 );
  20561. this.v1.fromArray( json.v1 );
  20562. this.v2.fromArray( json.v2 );
  20563. return this;
  20564. };
  20565. function QuadraticBezierCurve3( v0, v1, v2 ) {
  20566. Curve.call( this );
  20567. this.type = 'QuadraticBezierCurve3';
  20568. this.v0 = v0 || new Vector3();
  20569. this.v1 = v1 || new Vector3();
  20570. this.v2 = v2 || new Vector3();
  20571. }
  20572. QuadraticBezierCurve3.prototype = Object.create( Curve.prototype );
  20573. QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;
  20574. QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true;
  20575. QuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {
  20576. var point = optionalTarget || new Vector3();
  20577. var v0 = this.v0, v1 = this.v1, v2 = this.v2;
  20578. point.set(
  20579. QuadraticBezier( t, v0.x, v1.x, v2.x ),
  20580. QuadraticBezier( t, v0.y, v1.y, v2.y ),
  20581. QuadraticBezier( t, v0.z, v1.z, v2.z )
  20582. );
  20583. return point;
  20584. };
  20585. QuadraticBezierCurve3.prototype.copy = function ( source ) {
  20586. Curve.prototype.copy.call( this, source );
  20587. this.v0.copy( source.v0 );
  20588. this.v1.copy( source.v1 );
  20589. this.v2.copy( source.v2 );
  20590. return this;
  20591. };
  20592. QuadraticBezierCurve3.prototype.toJSON = function () {
  20593. var data = Curve.prototype.toJSON.call( this );
  20594. data.v0 = this.v0.toArray();
  20595. data.v1 = this.v1.toArray();
  20596. data.v2 = this.v2.toArray();
  20597. return data;
  20598. };
  20599. QuadraticBezierCurve3.prototype.fromJSON = function ( json ) {
  20600. Curve.prototype.fromJSON.call( this, json );
  20601. this.v0.fromArray( json.v0 );
  20602. this.v1.fromArray( json.v1 );
  20603. this.v2.fromArray( json.v2 );
  20604. return this;
  20605. };
  20606. function SplineCurve( points /* array of Vector2 */ ) {
  20607. Curve.call( this );
  20608. this.type = 'SplineCurve';
  20609. this.points = points || [];
  20610. }
  20611. SplineCurve.prototype = Object.create( Curve.prototype );
  20612. SplineCurve.prototype.constructor = SplineCurve;
  20613. SplineCurve.prototype.isSplineCurve = true;
  20614. SplineCurve.prototype.getPoint = function ( t, optionalTarget ) {
  20615. var point = optionalTarget || new Vector2();
  20616. var points = this.points;
  20617. var p = ( points.length - 1 ) * t;
  20618. var intPoint = Math.floor( p );
  20619. var weight = p - intPoint;
  20620. var p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];
  20621. var p1 = points[ intPoint ];
  20622. var p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];
  20623. var p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];
  20624. point.set(
  20625. CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),
  20626. CatmullRom( weight, p0.y, p1.y, p2.y, p3.y )
  20627. );
  20628. return point;
  20629. };
  20630. SplineCurve.prototype.copy = function ( source ) {
  20631. Curve.prototype.copy.call( this, source );
  20632. this.points = [];
  20633. for ( var i = 0, l = source.points.length; i < l; i ++ ) {
  20634. var point = source.points[ i ];
  20635. this.points.push( point.clone() );
  20636. }
  20637. return this;
  20638. };
  20639. SplineCurve.prototype.toJSON = function () {
  20640. var data = Curve.prototype.toJSON.call( this );
  20641. data.points = [];
  20642. for ( var i = 0, l = this.points.length; i < l; i ++ ) {
  20643. var point = this.points[ i ];
  20644. data.points.push( point.toArray() );
  20645. }
  20646. return data;
  20647. };
  20648. SplineCurve.prototype.fromJSON = function ( json ) {
  20649. Curve.prototype.fromJSON.call( this, json );
  20650. this.points = [];
  20651. for ( var i = 0, l = json.points.length; i < l; i ++ ) {
  20652. var point = json.points[ i ];
  20653. this.points.push( new Vector2().fromArray( point ) );
  20654. }
  20655. return this;
  20656. };
  20657. var Curves = /*#__PURE__*/Object.freeze({
  20658. ArcCurve: ArcCurve,
  20659. CatmullRomCurve3: CatmullRomCurve3,
  20660. CubicBezierCurve: CubicBezierCurve,
  20661. CubicBezierCurve3: CubicBezierCurve3,
  20662. EllipseCurve: EllipseCurve,
  20663. LineCurve: LineCurve,
  20664. LineCurve3: LineCurve3,
  20665. QuadraticBezierCurve: QuadraticBezierCurve,
  20666. QuadraticBezierCurve3: QuadraticBezierCurve3,
  20667. SplineCurve: SplineCurve
  20668. });
  20669. /**
  20670. * @author zz85 / http://www.lab4games.net/zz85/blog
  20671. *
  20672. **/
  20673. /**************************************************************
  20674. * Curved Path - a curve path is simply a array of connected
  20675. * curves, but retains the api of a curve
  20676. **************************************************************/
  20677. function CurvePath() {
  20678. Curve.call( this );
  20679. this.type = 'CurvePath';
  20680. this.curves = [];
  20681. this.autoClose = false; // Automatically closes the path
  20682. }
  20683. CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {
  20684. constructor: CurvePath,
  20685. add: function ( curve ) {
  20686. this.curves.push( curve );
  20687. },
  20688. closePath: function () {
  20689. // Add a line curve if start and end of lines are not connected
  20690. var startPoint = this.curves[ 0 ].getPoint( 0 );
  20691. var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );
  20692. if ( ! startPoint.equals( endPoint ) ) {
  20693. this.curves.push( new LineCurve( endPoint, startPoint ) );
  20694. }
  20695. },
  20696. // To get accurate point with reference to
  20697. // entire path distance at time t,
  20698. // following has to be done:
  20699. // 1. Length of each sub path have to be known
  20700. // 2. Locate and identify type of curve
  20701. // 3. Get t for the curve
  20702. // 4. Return curve.getPointAt(t')
  20703. getPoint: function ( t ) {
  20704. var d = t * this.getLength();
  20705. var curveLengths = this.getCurveLengths();
  20706. var i = 0;
  20707. // To think about boundaries points.
  20708. while ( i < curveLengths.length ) {
  20709. if ( curveLengths[ i ] >= d ) {
  20710. var diff = curveLengths[ i ] - d;
  20711. var curve = this.curves[ i ];
  20712. var segmentLength = curve.getLength();
  20713. var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;
  20714. return curve.getPointAt( u );
  20715. }
  20716. i ++;
  20717. }
  20718. return null;
  20719. // loop where sum != 0, sum > d , sum+1 <d
  20720. },
  20721. // We cannot use the default THREE.Curve getPoint() with getLength() because in
  20722. // THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath
  20723. // getPoint() depends on getLength
  20724. getLength: function () {
  20725. var lens = this.getCurveLengths();
  20726. return lens[ lens.length - 1 ];
  20727. },
  20728. // cacheLengths must be recalculated.
  20729. updateArcLengths: function () {
  20730. this.needsUpdate = true;
  20731. this.cacheLengths = null;
  20732. this.getCurveLengths();
  20733. },
  20734. // Compute lengths and cache them
  20735. // We cannot overwrite getLengths() because UtoT mapping uses it.
  20736. getCurveLengths: function () {
  20737. // We use cache values if curves and cache array are same length
  20738. if ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {
  20739. return this.cacheLengths;
  20740. }
  20741. // Get length of sub-curve
  20742. // Push sums into cached array
  20743. var lengths = [], sums = 0;
  20744. for ( var i = 0, l = this.curves.length; i < l; i ++ ) {
  20745. sums += this.curves[ i ].getLength();
  20746. lengths.push( sums );
  20747. }
  20748. this.cacheLengths = lengths;
  20749. return lengths;
  20750. },
  20751. getSpacedPoints: function ( divisions ) {
  20752. if ( divisions === undefined ) divisions = 40;
  20753. var points = [];
  20754. for ( var i = 0; i <= divisions; i ++ ) {
  20755. points.push( this.getPoint( i / divisions ) );
  20756. }
  20757. if ( this.autoClose ) {
  20758. points.push( points[ 0 ] );
  20759. }
  20760. return points;
  20761. },
  20762. getPoints: function ( divisions ) {
  20763. divisions = divisions || 12;
  20764. var points = [], last;
  20765. for ( var i = 0, curves = this.curves; i < curves.length; i ++ ) {
  20766. var curve = curves[ i ];
  20767. var resolution = ( curve && curve.isEllipseCurve ) ? divisions * 2
  20768. : ( curve && ( curve.isLineCurve || curve.isLineCurve3 ) ) ? 1
  20769. : ( curve && curve.isSplineCurve ) ? divisions * curve.points.length
  20770. : divisions;
  20771. var pts = curve.getPoints( resolution );
  20772. for ( var j = 0; j < pts.length; j ++ ) {
  20773. var point = pts[ j ];
  20774. if ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates
  20775. points.push( point );
  20776. last = point;
  20777. }
  20778. }
  20779. if ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {
  20780. points.push( points[ 0 ] );
  20781. }
  20782. return points;
  20783. },
  20784. copy: function ( source ) {
  20785. Curve.prototype.copy.call( this, source );
  20786. this.curves = [];
  20787. for ( var i = 0, l = source.curves.length; i < l; i ++ ) {
  20788. var curve = source.curves[ i ];
  20789. this.curves.push( curve.clone() );
  20790. }
  20791. this.autoClose = source.autoClose;
  20792. return this;
  20793. },
  20794. toJSON: function () {
  20795. var data = Curve.prototype.toJSON.call( this );
  20796. data.autoClose = this.autoClose;
  20797. data.curves = [];
  20798. for ( var i = 0, l = this.curves.length; i < l; i ++ ) {
  20799. var curve = this.curves[ i ];
  20800. data.curves.push( curve.toJSON() );
  20801. }
  20802. return data;
  20803. },
  20804. fromJSON: function ( json ) {
  20805. Curve.prototype.fromJSON.call( this, json );
  20806. this.autoClose = json.autoClose;
  20807. this.curves = [];
  20808. for ( var i = 0, l = json.curves.length; i < l; i ++ ) {
  20809. var curve = json.curves[ i ];
  20810. this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );
  20811. }
  20812. return this;
  20813. }
  20814. } );
  20815. /**
  20816. * @author zz85 / http://www.lab4games.net/zz85/blog
  20817. * Creates free form 2d path using series of points, lines or curves.
  20818. **/
  20819. function Path( points ) {
  20820. CurvePath.call( this );
  20821. this.type = 'Path';
  20822. this.currentPoint = new Vector2();
  20823. if ( points ) {
  20824. this.setFromPoints( points );
  20825. }
  20826. }
  20827. Path.prototype = Object.assign( Object.create( CurvePath.prototype ), {
  20828. constructor: Path,
  20829. setFromPoints: function ( points ) {
  20830. this.moveTo( points[ 0 ].x, points[ 0 ].y );
  20831. for ( var i = 1, l = points.length; i < l; i ++ ) {
  20832. this.lineTo( points[ i ].x, points[ i ].y );
  20833. }
  20834. },
  20835. moveTo: function ( x, y ) {
  20836. this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?
  20837. },
  20838. lineTo: function ( x, y ) {
  20839. var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );
  20840. this.curves.push( curve );
  20841. this.currentPoint.set( x, y );
  20842. },
  20843. quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {
  20844. var curve = new QuadraticBezierCurve(
  20845. this.currentPoint.clone(),
  20846. new Vector2( aCPx, aCPy ),
  20847. new Vector2( aX, aY )
  20848. );
  20849. this.curves.push( curve );
  20850. this.currentPoint.set( aX, aY );
  20851. },
  20852. bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {
  20853. var curve = new CubicBezierCurve(
  20854. this.currentPoint.clone(),
  20855. new Vector2( aCP1x, aCP1y ),
  20856. new Vector2( aCP2x, aCP2y ),
  20857. new Vector2( aX, aY )
  20858. );
  20859. this.curves.push( curve );
  20860. this.currentPoint.set( aX, aY );
  20861. },
  20862. splineThru: function ( pts /*Array of Vector*/ ) {
  20863. var npts = [ this.currentPoint.clone() ].concat( pts );
  20864. var curve = new SplineCurve( npts );
  20865. this.curves.push( curve );
  20866. this.currentPoint.copy( pts[ pts.length - 1 ] );
  20867. },
  20868. arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
  20869. var x0 = this.currentPoint.x;
  20870. var y0 = this.currentPoint.y;
  20871. this.absarc( aX + x0, aY + y0, aRadius,
  20872. aStartAngle, aEndAngle, aClockwise );
  20873. },
  20874. absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
  20875. this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );
  20876. },
  20877. ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {
  20878. var x0 = this.currentPoint.x;
  20879. var y0 = this.currentPoint.y;
  20880. this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );
  20881. },
  20882. absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {
  20883. var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );
  20884. if ( this.curves.length > 0 ) {
  20885. // if a previous curve is present, attempt to join
  20886. var firstPoint = curve.getPoint( 0 );
  20887. if ( ! firstPoint.equals( this.currentPoint ) ) {
  20888. this.lineTo( firstPoint.x, firstPoint.y );
  20889. }
  20890. }
  20891. this.curves.push( curve );
  20892. var lastPoint = curve.getPoint( 1 );
  20893. this.currentPoint.copy( lastPoint );
  20894. },
  20895. copy: function ( source ) {
  20896. CurvePath.prototype.copy.call( this, source );
  20897. this.currentPoint.copy( source.currentPoint );
  20898. return this;
  20899. },
  20900. toJSON: function () {
  20901. var data = CurvePath.prototype.toJSON.call( this );
  20902. data.currentPoint = this.currentPoint.toArray();
  20903. return data;
  20904. },
  20905. fromJSON: function ( json ) {
  20906. CurvePath.prototype.fromJSON.call( this, json );
  20907. this.currentPoint.fromArray( json.currentPoint );
  20908. return this;
  20909. }
  20910. } );
  20911. /**
  20912. * @author zz85 / http://www.lab4games.net/zz85/blog
  20913. * Defines a 2d shape plane using paths.
  20914. **/
  20915. // STEP 1 Create a path.
  20916. // STEP 2 Turn path into shape.
  20917. // STEP 3 ExtrudeGeometry takes in Shape/Shapes
  20918. // STEP 3a - Extract points from each shape, turn to vertices
  20919. // STEP 3b - Triangulate each shape, add faces.
  20920. function Shape( points ) {
  20921. Path.call( this, points );
  20922. this.uuid = _Math.generateUUID();
  20923. this.type = 'Shape';
  20924. this.holes = [];
  20925. }
  20926. Shape.prototype = Object.assign( Object.create( Path.prototype ), {
  20927. constructor: Shape,
  20928. getPointsHoles: function ( divisions ) {
  20929. var holesPts = [];
  20930. for ( var i = 0, l = this.holes.length; i < l; i ++ ) {
  20931. holesPts[ i ] = this.holes[ i ].getPoints( divisions );
  20932. }
  20933. return holesPts;
  20934. },
  20935. // get points of shape and holes (keypoints based on segments parameter)
  20936. extractPoints: function ( divisions ) {
  20937. return {
  20938. shape: this.getPoints( divisions ),
  20939. holes: this.getPointsHoles( divisions )
  20940. };
  20941. },
  20942. copy: function ( source ) {
  20943. Path.prototype.copy.call( this, source );
  20944. this.holes = [];
  20945. for ( var i = 0, l = source.holes.length; i < l; i ++ ) {
  20946. var hole = source.holes[ i ];
  20947. this.holes.push( hole.clone() );
  20948. }
  20949. return this;
  20950. },
  20951. toJSON: function () {
  20952. var data = Path.prototype.toJSON.call( this );
  20953. data.uuid = this.uuid;
  20954. data.holes = [];
  20955. for ( var i = 0, l = this.holes.length; i < l; i ++ ) {
  20956. var hole = this.holes[ i ];
  20957. data.holes.push( hole.toJSON() );
  20958. }
  20959. return data;
  20960. },
  20961. fromJSON: function ( json ) {
  20962. Path.prototype.fromJSON.call( this, json );
  20963. this.uuid = json.uuid;
  20964. this.holes = [];
  20965. for ( var i = 0, l = json.holes.length; i < l; i ++ ) {
  20966. var hole = json.holes[ i ];
  20967. this.holes.push( new Path().fromJSON( hole ) );
  20968. }
  20969. return this;
  20970. }
  20971. } );
  20972. /**
  20973. * @author mrdoob / http://mrdoob.com/
  20974. * @author alteredq / http://alteredqualia.com/
  20975. */
  20976. function Light( color, intensity ) {
  20977. Object3D.call( this );
  20978. this.type = 'Light';
  20979. this.color = new Color( color );
  20980. this.intensity = intensity !== undefined ? intensity : 1;
  20981. this.receiveShadow = undefined;
  20982. }
  20983. Light.prototype = Object.assign( Object.create( Object3D.prototype ), {
  20984. constructor: Light,
  20985. isLight: true,
  20986. copy: function ( source ) {
  20987. Object3D.prototype.copy.call( this, source );
  20988. this.color.copy( source.color );
  20989. this.intensity = source.intensity;
  20990. return this;
  20991. },
  20992. toJSON: function ( meta ) {
  20993. var data = Object3D.prototype.toJSON.call( this, meta );
  20994. data.object.color = this.color.getHex();
  20995. data.object.intensity = this.intensity;
  20996. if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();
  20997. if ( this.distance !== undefined ) data.object.distance = this.distance;
  20998. if ( this.angle !== undefined ) data.object.angle = this.angle;
  20999. if ( this.decay !== undefined ) data.object.decay = this.decay;
  21000. if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;
  21001. if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();
  21002. return data;
  21003. }
  21004. } );
  21005. /**
  21006. * @author alteredq / http://alteredqualia.com/
  21007. */
  21008. function HemisphereLight( skyColor, groundColor, intensity ) {
  21009. Light.call( this, skyColor, intensity );
  21010. this.type = 'HemisphereLight';
  21011. this.castShadow = undefined;
  21012. this.position.copy( Object3D.DefaultUp );
  21013. this.updateMatrix();
  21014. this.groundColor = new Color( groundColor );
  21015. }
  21016. HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {
  21017. constructor: HemisphereLight,
  21018. isHemisphereLight: true,
  21019. copy: function ( source ) {
  21020. Light.prototype.copy.call( this, source );
  21021. this.groundColor.copy( source.groundColor );
  21022. return this;
  21023. }
  21024. } );
  21025. /**
  21026. * @author mrdoob / http://mrdoob.com/
  21027. */
  21028. function LightShadow( camera ) {
  21029. this.camera = camera;
  21030. this.bias = 0;
  21031. this.radius = 1;
  21032. this.mapSize = new Vector2( 512, 512 );
  21033. this.map = null;
  21034. this.matrix = new Matrix4();
  21035. }
  21036. Object.assign( LightShadow.prototype, {
  21037. copy: function ( source ) {
  21038. this.camera = source.camera.clone();
  21039. this.bias = source.bias;
  21040. this.radius = source.radius;
  21041. this.mapSize.copy( source.mapSize );
  21042. return this;
  21043. },
  21044. clone: function () {
  21045. return new this.constructor().copy( this );
  21046. },
  21047. toJSON: function () {
  21048. var object = {};
  21049. if ( this.bias !== 0 ) object.bias = this.bias;
  21050. if ( this.radius !== 1 ) object.radius = this.radius;
  21051. if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();
  21052. object.camera = this.camera.toJSON( false ).object;
  21053. delete object.camera.matrix;
  21054. return object;
  21055. }
  21056. } );
  21057. /**
  21058. * @author mrdoob / http://mrdoob.com/
  21059. */
  21060. function SpotLightShadow() {
  21061. LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );
  21062. }
  21063. SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {
  21064. constructor: SpotLightShadow,
  21065. isSpotLightShadow: true,
  21066. update: function ( light ) {
  21067. var camera = this.camera;
  21068. var fov = _Math.RAD2DEG * 2 * light.angle;
  21069. var aspect = this.mapSize.width / this.mapSize.height;
  21070. var far = light.distance || camera.far;
  21071. if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {
  21072. camera.fov = fov;
  21073. camera.aspect = aspect;
  21074. camera.far = far;
  21075. camera.updateProjectionMatrix();
  21076. }
  21077. }
  21078. } );
  21079. /**
  21080. * @author alteredq / http://alteredqualia.com/
  21081. */
  21082. function SpotLight( color, intensity, distance, angle, penumbra, decay ) {
  21083. Light.call( this, color, intensity );
  21084. this.type = 'SpotLight';
  21085. this.position.copy( Object3D.DefaultUp );
  21086. this.updateMatrix();
  21087. this.target = new Object3D();
  21088. Object.defineProperty( this, 'power', {
  21089. get: function () {
  21090. // intensity = power per solid angle.
  21091. // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
  21092. return this.intensity * Math.PI;
  21093. },
  21094. set: function ( power ) {
  21095. // intensity = power per solid angle.
  21096. // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
  21097. this.intensity = power / Math.PI;
  21098. }
  21099. } );
  21100. this.distance = ( distance !== undefined ) ? distance : 0;
  21101. this.angle = ( angle !== undefined ) ? angle : Math.PI / 3;
  21102. this.penumbra = ( penumbra !== undefined ) ? penumbra : 0;
  21103. this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2.
  21104. this.shadow = new SpotLightShadow();
  21105. }
  21106. SpotLight.prototype = Object.assign( Object.create( Light.prototype ), {
  21107. constructor: SpotLight,
  21108. isSpotLight: true,
  21109. copy: function ( source ) {
  21110. Light.prototype.copy.call( this, source );
  21111. this.distance = source.distance;
  21112. this.angle = source.angle;
  21113. this.penumbra = source.penumbra;
  21114. this.decay = source.decay;
  21115. this.target = source.target.clone();
  21116. this.shadow = source.shadow.clone();
  21117. return this;
  21118. }
  21119. } );
  21120. /**
  21121. * @author mrdoob / http://mrdoob.com/
  21122. */
  21123. function PointLight( color, intensity, distance, decay ) {
  21124. Light.call( this, color, intensity );
  21125. this.type = 'PointLight';
  21126. Object.defineProperty( this, 'power', {
  21127. get: function () {
  21128. // intensity = power per solid angle.
  21129. // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
  21130. return this.intensity * 4 * Math.PI;
  21131. },
  21132. set: function ( power ) {
  21133. // intensity = power per solid angle.
  21134. // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
  21135. this.intensity = power / ( 4 * Math.PI );
  21136. }
  21137. } );
  21138. this.distance = ( distance !== undefined ) ? distance : 0;
  21139. this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2.
  21140. this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );
  21141. }
  21142. PointLight.prototype = Object.assign( Object.create( Light.prototype ), {
  21143. constructor: PointLight,
  21144. isPointLight: true,
  21145. copy: function ( source ) {
  21146. Light.prototype.copy.call( this, source );
  21147. this.distance = source.distance;
  21148. this.decay = source.decay;
  21149. this.shadow = source.shadow.clone();
  21150. return this;
  21151. }
  21152. } );
  21153. /**
  21154. * @author mrdoob / http://mrdoob.com/
  21155. */
  21156. function DirectionalLightShadow( ) {
  21157. LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );
  21158. }
  21159. DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {
  21160. constructor: DirectionalLightShadow
  21161. } );
  21162. /**
  21163. * @author mrdoob / http://mrdoob.com/
  21164. * @author alteredq / http://alteredqualia.com/
  21165. */
  21166. function DirectionalLight( color, intensity ) {
  21167. Light.call( this, color, intensity );
  21168. this.type = 'DirectionalLight';
  21169. this.position.copy( Object3D.DefaultUp );
  21170. this.updateMatrix();
  21171. this.target = new Object3D();
  21172. this.shadow = new DirectionalLightShadow();
  21173. }
  21174. DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {
  21175. constructor: DirectionalLight,
  21176. isDirectionalLight: true,
  21177. copy: function ( source ) {
  21178. Light.prototype.copy.call( this, source );
  21179. this.target = source.target.clone();
  21180. this.shadow = source.shadow.clone();
  21181. return this;
  21182. }
  21183. } );
  21184. /**
  21185. * @author mrdoob / http://mrdoob.com/
  21186. */
  21187. function AmbientLight( color, intensity ) {
  21188. Light.call( this, color, intensity );
  21189. this.type = 'AmbientLight';
  21190. this.castShadow = undefined;
  21191. }
  21192. AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {
  21193. constructor: AmbientLight,
  21194. isAmbientLight: true
  21195. } );
  21196. /**
  21197. * @author abelnation / http://github.com/abelnation
  21198. */
  21199. function RectAreaLight( color, intensity, width, height ) {
  21200. Light.call( this, color, intensity );
  21201. this.type = 'RectAreaLight';
  21202. this.width = ( width !== undefined ) ? width : 10;
  21203. this.height = ( height !== undefined ) ? height : 10;
  21204. }
  21205. RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {
  21206. constructor: RectAreaLight,
  21207. isRectAreaLight: true,
  21208. copy: function ( source ) {
  21209. Light.prototype.copy.call( this, source );
  21210. this.width = source.width;
  21211. this.height = source.height;
  21212. return this;
  21213. },
  21214. toJSON: function ( meta ) {
  21215. var data = Light.prototype.toJSON.call( this, meta );
  21216. data.object.width = this.width;
  21217. data.object.height = this.height;
  21218. return data;
  21219. }
  21220. } );
  21221. /**
  21222. * @author tschw
  21223. * @author Ben Houston / http://clara.io/
  21224. * @author David Sarno / http://lighthaus.us/
  21225. */
  21226. var AnimationUtils = {
  21227. // same as Array.prototype.slice, but also works on typed arrays
  21228. arraySlice: function ( array, from, to ) {
  21229. if ( AnimationUtils.isTypedArray( array ) ) {
  21230. // in ios9 array.subarray(from, undefined) will return empty array
  21231. // but array.subarray(from) or array.subarray(from, len) is correct
  21232. return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );
  21233. }
  21234. return array.slice( from, to );
  21235. },
  21236. // converts an array to a specific type
  21237. convertArray: function ( array, type, forceClone ) {
  21238. if ( ! array || // let 'undefined' and 'null' pass
  21239. ! forceClone && array.constructor === type ) return array;
  21240. if ( typeof type.BYTES_PER_ELEMENT === 'number' ) {
  21241. return new type( array ); // create typed array
  21242. }
  21243. return Array.prototype.slice.call( array ); // create Array
  21244. },
  21245. isTypedArray: function ( object ) {
  21246. return ArrayBuffer.isView( object ) &&
  21247. ! ( object instanceof DataView );
  21248. },
  21249. // returns an array by which times and values can be sorted
  21250. getKeyframeOrder: function ( times ) {
  21251. function compareTime( i, j ) {
  21252. return times[ i ] - times[ j ];
  21253. }
  21254. var n = times.length;
  21255. var result = new Array( n );
  21256. for ( var i = 0; i !== n; ++ i ) result[ i ] = i;
  21257. result.sort( compareTime );
  21258. return result;
  21259. },
  21260. // uses the array previously returned by 'getKeyframeOrder' to sort data
  21261. sortedArray: function ( values, stride, order ) {
  21262. var nValues = values.length;
  21263. var result = new values.constructor( nValues );
  21264. for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {
  21265. var srcOffset = order[ i ] * stride;
  21266. for ( var j = 0; j !== stride; ++ j ) {
  21267. result[ dstOffset ++ ] = values[ srcOffset + j ];
  21268. }
  21269. }
  21270. return result;
  21271. },
  21272. // function for parsing AOS keyframe formats
  21273. flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {
  21274. var i = 1, key = jsonKeys[ 0 ];
  21275. while ( key !== undefined && key[ valuePropertyName ] === undefined ) {
  21276. key = jsonKeys[ i ++ ];
  21277. }
  21278. if ( key === undefined ) return; // no data
  21279. var value = key[ valuePropertyName ];
  21280. if ( value === undefined ) return; // no data
  21281. if ( Array.isArray( value ) ) {
  21282. do {
  21283. value = key[ valuePropertyName ];
  21284. if ( value !== undefined ) {
  21285. times.push( key.time );
  21286. values.push.apply( values, value ); // push all elements
  21287. }
  21288. key = jsonKeys[ i ++ ];
  21289. } while ( key !== undefined );
  21290. } else if ( value.toArray !== undefined ) {
  21291. // ...assume THREE.Math-ish
  21292. do {
  21293. value = key[ valuePropertyName ];
  21294. if ( value !== undefined ) {
  21295. times.push( key.time );
  21296. value.toArray( values, values.length );
  21297. }
  21298. key = jsonKeys[ i ++ ];
  21299. } while ( key !== undefined );
  21300. } else {
  21301. // otherwise push as-is
  21302. do {
  21303. value = key[ valuePropertyName ];
  21304. if ( value !== undefined ) {
  21305. times.push( key.time );
  21306. values.push( value );
  21307. }
  21308. key = jsonKeys[ i ++ ];
  21309. } while ( key !== undefined );
  21310. }
  21311. }
  21312. };
  21313. /**
  21314. * Abstract base class of interpolants over parametric samples.
  21315. *
  21316. * The parameter domain is one dimensional, typically the time or a path
  21317. * along a curve defined by the data.
  21318. *
  21319. * The sample values can have any dimensionality and derived classes may
  21320. * apply special interpretations to the data.
  21321. *
  21322. * This class provides the interval seek in a Template Method, deferring
  21323. * the actual interpolation to derived classes.
  21324. *
  21325. * Time complexity is O(1) for linear access crossing at most two points
  21326. * and O(log N) for random access, where N is the number of positions.
  21327. *
  21328. * References:
  21329. *
  21330. * http://www.oodesign.com/template-method-pattern.html
  21331. *
  21332. * @author tschw
  21333. */
  21334. function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
  21335. this.parameterPositions = parameterPositions;
  21336. this._cachedIndex = 0;
  21337. this.resultBuffer = resultBuffer !== undefined ?
  21338. resultBuffer : new sampleValues.constructor( sampleSize );
  21339. this.sampleValues = sampleValues;
  21340. this.valueSize = sampleSize;
  21341. }
  21342. Object.assign( Interpolant.prototype, {
  21343. evaluate: function ( t ) {
  21344. var pp = this.parameterPositions,
  21345. i1 = this._cachedIndex,
  21346. t1 = pp[ i1 ],
  21347. t0 = pp[ i1 - 1 ];
  21348. validate_interval: {
  21349. seek: {
  21350. var right;
  21351. linear_scan: {
  21352. //- See http://jsperf.com/comparison-to-undefined/3
  21353. //- slower code:
  21354. //-
  21355. //- if ( t >= t1 || t1 === undefined ) {
  21356. forward_scan: if ( ! ( t < t1 ) ) {
  21357. for ( var giveUpAt = i1 + 2; ; ) {
  21358. if ( t1 === undefined ) {
  21359. if ( t < t0 ) break forward_scan;
  21360. // after end
  21361. i1 = pp.length;
  21362. this._cachedIndex = i1;
  21363. return this.afterEnd_( i1 - 1, t, t0 );
  21364. }
  21365. if ( i1 === giveUpAt ) break; // this loop
  21366. t0 = t1;
  21367. t1 = pp[ ++ i1 ];
  21368. if ( t < t1 ) {
  21369. // we have arrived at the sought interval
  21370. break seek;
  21371. }
  21372. }
  21373. // prepare binary search on the right side of the index
  21374. right = pp.length;
  21375. break linear_scan;
  21376. }
  21377. //- slower code:
  21378. //- if ( t < t0 || t0 === undefined ) {
  21379. if ( ! ( t >= t0 ) ) {
  21380. // looping?
  21381. var t1global = pp[ 1 ];
  21382. if ( t < t1global ) {
  21383. i1 = 2; // + 1, using the scan for the details
  21384. t0 = t1global;
  21385. }
  21386. // linear reverse scan
  21387. for ( var giveUpAt = i1 - 2; ; ) {
  21388. if ( t0 === undefined ) {
  21389. // before start
  21390. this._cachedIndex = 0;
  21391. return this.beforeStart_( 0, t, t1 );
  21392. }
  21393. if ( i1 === giveUpAt ) break; // this loop
  21394. t1 = t0;
  21395. t0 = pp[ -- i1 - 1 ];
  21396. if ( t >= t0 ) {
  21397. // we have arrived at the sought interval
  21398. break seek;
  21399. }
  21400. }
  21401. // prepare binary search on the left side of the index
  21402. right = i1;
  21403. i1 = 0;
  21404. break linear_scan;
  21405. }
  21406. // the interval is valid
  21407. break validate_interval;
  21408. } // linear scan
  21409. // binary search
  21410. while ( i1 < right ) {
  21411. var mid = ( i1 + right ) >>> 1;
  21412. if ( t < pp[ mid ] ) {
  21413. right = mid;
  21414. } else {
  21415. i1 = mid + 1;
  21416. }
  21417. }
  21418. t1 = pp[ i1 ];
  21419. t0 = pp[ i1 - 1 ];
  21420. // check boundary cases, again
  21421. if ( t0 === undefined ) {
  21422. this._cachedIndex = 0;
  21423. return this.beforeStart_( 0, t, t1 );
  21424. }
  21425. if ( t1 === undefined ) {
  21426. i1 = pp.length;
  21427. this._cachedIndex = i1;
  21428. return this.afterEnd_( i1 - 1, t0, t );
  21429. }
  21430. } // seek
  21431. this._cachedIndex = i1;
  21432. this.intervalChanged_( i1, t0, t1 );
  21433. } // validate_interval
  21434. return this.interpolate_( i1, t0, t, t1 );
  21435. },
  21436. settings: null, // optional, subclass-specific settings structure
  21437. // Note: The indirection allows central control of many interpolants.
  21438. // --- Protected interface
  21439. DefaultSettings_: {},
  21440. getSettings_: function () {
  21441. return this.settings || this.DefaultSettings_;
  21442. },
  21443. copySampleValue_: function ( index ) {
  21444. // copies a sample value to the result buffer
  21445. var result = this.resultBuffer,
  21446. values = this.sampleValues,
  21447. stride = this.valueSize,
  21448. offset = index * stride;
  21449. for ( var i = 0; i !== stride; ++ i ) {
  21450. result[ i ] = values[ offset + i ];
  21451. }
  21452. return result;
  21453. },
  21454. // Template methods for derived classes:
  21455. interpolate_: function ( /* i1, t0, t, t1 */ ) {
  21456. throw new Error( 'call to abstract method' );
  21457. // implementations shall return this.resultBuffer
  21458. },
  21459. intervalChanged_: function ( /* i1, t0, t1 */ ) {
  21460. // empty
  21461. }
  21462. } );
  21463. //!\ DECLARE ALIAS AFTER assign prototype !
  21464. Object.assign( Interpolant.prototype, {
  21465. //( 0, t, t0 ), returns this.resultBuffer
  21466. beforeStart_: Interpolant.prototype.copySampleValue_,
  21467. //( N-1, tN-1, t ), returns this.resultBuffer
  21468. afterEnd_: Interpolant.prototype.copySampleValue_,
  21469. } );
  21470. /**
  21471. * Fast and simple cubic spline interpolant.
  21472. *
  21473. * It was derived from a Hermitian construction setting the first derivative
  21474. * at each sample position to the linear slope between neighboring positions
  21475. * over their parameter interval.
  21476. *
  21477. * @author tschw
  21478. */
  21479. function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
  21480. Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
  21481. this._weightPrev = - 0;
  21482. this._offsetPrev = - 0;
  21483. this._weightNext = - 0;
  21484. this._offsetNext = - 0;
  21485. }
  21486. CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
  21487. constructor: CubicInterpolant,
  21488. DefaultSettings_: {
  21489. endingStart: ZeroCurvatureEnding,
  21490. endingEnd: ZeroCurvatureEnding
  21491. },
  21492. intervalChanged_: function ( i1, t0, t1 ) {
  21493. var pp = this.parameterPositions,
  21494. iPrev = i1 - 2,
  21495. iNext = i1 + 1,
  21496. tPrev = pp[ iPrev ],
  21497. tNext = pp[ iNext ];
  21498. if ( tPrev === undefined ) {
  21499. switch ( this.getSettings_().endingStart ) {
  21500. case ZeroSlopeEnding:
  21501. // f'(t0) = 0
  21502. iPrev = i1;
  21503. tPrev = 2 * t0 - t1;
  21504. break;
  21505. case WrapAroundEnding:
  21506. // use the other end of the curve
  21507. iPrev = pp.length - 2;
  21508. tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];
  21509. break;
  21510. default: // ZeroCurvatureEnding
  21511. // f''(t0) = 0 a.k.a. Natural Spline
  21512. iPrev = i1;
  21513. tPrev = t1;
  21514. }
  21515. }
  21516. if ( tNext === undefined ) {
  21517. switch ( this.getSettings_().endingEnd ) {
  21518. case ZeroSlopeEnding:
  21519. // f'(tN) = 0
  21520. iNext = i1;
  21521. tNext = 2 * t1 - t0;
  21522. break;
  21523. case WrapAroundEnding:
  21524. // use the other end of the curve
  21525. iNext = 1;
  21526. tNext = t1 + pp[ 1 ] - pp[ 0 ];
  21527. break;
  21528. default: // ZeroCurvatureEnding
  21529. // f''(tN) = 0, a.k.a. Natural Spline
  21530. iNext = i1 - 1;
  21531. tNext = t0;
  21532. }
  21533. }
  21534. var halfDt = ( t1 - t0 ) * 0.5,
  21535. stride = this.valueSize;
  21536. this._weightPrev = halfDt / ( t0 - tPrev );
  21537. this._weightNext = halfDt / ( tNext - t1 );
  21538. this._offsetPrev = iPrev * stride;
  21539. this._offsetNext = iNext * stride;
  21540. },
  21541. interpolate_: function ( i1, t0, t, t1 ) {
  21542. var result = this.resultBuffer,
  21543. values = this.sampleValues,
  21544. stride = this.valueSize,
  21545. o1 = i1 * stride, o0 = o1 - stride,
  21546. oP = this._offsetPrev, oN = this._offsetNext,
  21547. wP = this._weightPrev, wN = this._weightNext,
  21548. p = ( t - t0 ) / ( t1 - t0 ),
  21549. pp = p * p,
  21550. ppp = pp * p;
  21551. // evaluate polynomials
  21552. var sP = - wP * ppp + 2 * wP * pp - wP * p;
  21553. var s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;
  21554. var s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;
  21555. var sN = wN * ppp - wN * pp;
  21556. // combine data linearly
  21557. for ( var i = 0; i !== stride; ++ i ) {
  21558. result[ i ] =
  21559. sP * values[ oP + i ] +
  21560. s0 * values[ o0 + i ] +
  21561. s1 * values[ o1 + i ] +
  21562. sN * values[ oN + i ];
  21563. }
  21564. return result;
  21565. }
  21566. } );
  21567. /**
  21568. * @author tschw
  21569. */
  21570. function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
  21571. Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
  21572. }
  21573. LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
  21574. constructor: LinearInterpolant,
  21575. interpolate_: function ( i1, t0, t, t1 ) {
  21576. var result = this.resultBuffer,
  21577. values = this.sampleValues,
  21578. stride = this.valueSize,
  21579. offset1 = i1 * stride,
  21580. offset0 = offset1 - stride,
  21581. weight1 = ( t - t0 ) / ( t1 - t0 ),
  21582. weight0 = 1 - weight1;
  21583. for ( var i = 0; i !== stride; ++ i ) {
  21584. result[ i ] =
  21585. values[ offset0 + i ] * weight0 +
  21586. values[ offset1 + i ] * weight1;
  21587. }
  21588. return result;
  21589. }
  21590. } );
  21591. /**
  21592. *
  21593. * Interpolant that evaluates to the sample value at the position preceeding
  21594. * the parameter.
  21595. *
  21596. * @author tschw
  21597. */
  21598. function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
  21599. Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
  21600. }
  21601. DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
  21602. constructor: DiscreteInterpolant,
  21603. interpolate_: function ( i1 /*, t0, t, t1 */ ) {
  21604. return this.copySampleValue_( i1 - 1 );
  21605. }
  21606. } );
  21607. /**
  21608. *
  21609. * A timed sequence of keyframes for a specific property.
  21610. *
  21611. *
  21612. * @author Ben Houston / http://clara.io/
  21613. * @author David Sarno / http://lighthaus.us/
  21614. * @author tschw
  21615. */
  21616. function KeyframeTrack( name, times, values, interpolation ) {
  21617. if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );
  21618. if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );
  21619. this.name = name;
  21620. this.times = AnimationUtils.convertArray( times, this.TimeBufferType );
  21621. this.values = AnimationUtils.convertArray( values, this.ValueBufferType );
  21622. this.setInterpolation( interpolation || this.DefaultInterpolation );
  21623. }
  21624. // Static methods
  21625. Object.assign( KeyframeTrack, {
  21626. // Serialization (in static context, because of constructor invocation
  21627. // and automatic invocation of .toJSON):
  21628. toJSON: function ( track ) {
  21629. var trackType = track.constructor;
  21630. var json;
  21631. // derived classes can define a static toJSON method
  21632. if ( trackType.toJSON !== undefined ) {
  21633. json = trackType.toJSON( track );
  21634. } else {
  21635. // by default, we assume the data can be serialized as-is
  21636. json = {
  21637. 'name': track.name,
  21638. 'times': AnimationUtils.convertArray( track.times, Array ),
  21639. 'values': AnimationUtils.convertArray( track.values, Array )
  21640. };
  21641. var interpolation = track.getInterpolation();
  21642. if ( interpolation !== track.DefaultInterpolation ) {
  21643. json.interpolation = interpolation;
  21644. }
  21645. }
  21646. json.type = track.ValueTypeName; // mandatory
  21647. return json;
  21648. }
  21649. } );
  21650. Object.assign( KeyframeTrack.prototype, {
  21651. constructor: KeyframeTrack,
  21652. TimeBufferType: Float32Array,
  21653. ValueBufferType: Float32Array,
  21654. DefaultInterpolation: InterpolateLinear,
  21655. InterpolantFactoryMethodDiscrete: function ( result ) {
  21656. return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );
  21657. },
  21658. InterpolantFactoryMethodLinear: function ( result ) {
  21659. return new LinearInterpolant( this.times, this.values, this.getValueSize(), result );
  21660. },
  21661. InterpolantFactoryMethodSmooth: function ( result ) {
  21662. return new CubicInterpolant( this.times, this.values, this.getValueSize(), result );
  21663. },
  21664. setInterpolation: function ( interpolation ) {
  21665. var factoryMethod;
  21666. switch ( interpolation ) {
  21667. case InterpolateDiscrete:
  21668. factoryMethod = this.InterpolantFactoryMethodDiscrete;
  21669. break;
  21670. case InterpolateLinear:
  21671. factoryMethod = this.InterpolantFactoryMethodLinear;
  21672. break;
  21673. case InterpolateSmooth:
  21674. factoryMethod = this.InterpolantFactoryMethodSmooth;
  21675. break;
  21676. }
  21677. if ( factoryMethod === undefined ) {
  21678. var message = "unsupported interpolation for " +
  21679. this.ValueTypeName + " keyframe track named " + this.name;
  21680. if ( this.createInterpolant === undefined ) {
  21681. // fall back to default, unless the default itself is messed up
  21682. if ( interpolation !== this.DefaultInterpolation ) {
  21683. this.setInterpolation( this.DefaultInterpolation );
  21684. } else {
  21685. throw new Error( message ); // fatal, in this case
  21686. }
  21687. }
  21688. console.warn( 'THREE.KeyframeTrack:', message );
  21689. return this;
  21690. }
  21691. this.createInterpolant = factoryMethod;
  21692. return this;
  21693. },
  21694. getInterpolation: function () {
  21695. switch ( this.createInterpolant ) {
  21696. case this.InterpolantFactoryMethodDiscrete:
  21697. return InterpolateDiscrete;
  21698. case this.InterpolantFactoryMethodLinear:
  21699. return InterpolateLinear;
  21700. case this.InterpolantFactoryMethodSmooth:
  21701. return InterpolateSmooth;
  21702. }
  21703. },
  21704. getValueSize: function () {
  21705. return this.values.length / this.times.length;
  21706. },
  21707. // move all keyframes either forwards or backwards in time
  21708. shift: function ( timeOffset ) {
  21709. if ( timeOffset !== 0.0 ) {
  21710. var times = this.times;
  21711. for ( var i = 0, n = times.length; i !== n; ++ i ) {
  21712. times[ i ] += timeOffset;
  21713. }
  21714. }
  21715. return this;
  21716. },
  21717. // scale all keyframe times by a factor (useful for frame <-> seconds conversions)
  21718. scale: function ( timeScale ) {
  21719. if ( timeScale !== 1.0 ) {
  21720. var times = this.times;
  21721. for ( var i = 0, n = times.length; i !== n; ++ i ) {
  21722. times[ i ] *= timeScale;
  21723. }
  21724. }
  21725. return this;
  21726. },
  21727. // removes keyframes before and after animation without changing any values within the range [startTime, endTime].
  21728. // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values
  21729. trim: function ( startTime, endTime ) {
  21730. var times = this.times,
  21731. nKeys = times.length,
  21732. from = 0,
  21733. to = nKeys - 1;
  21734. while ( from !== nKeys && times[ from ] < startTime ) {
  21735. ++ from;
  21736. }
  21737. while ( to !== - 1 && times[ to ] > endTime ) {
  21738. -- to;
  21739. }
  21740. ++ to; // inclusive -> exclusive bound
  21741. if ( from !== 0 || to !== nKeys ) {
  21742. // empty tracks are forbidden, so keep at least one keyframe
  21743. if ( from >= to ) to = Math.max( to, 1 ), from = to - 1;
  21744. var stride = this.getValueSize();
  21745. this.times = AnimationUtils.arraySlice( times, from, to );
  21746. this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride );
  21747. }
  21748. return this;
  21749. },
  21750. // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable
  21751. validate: function () {
  21752. var valid = true;
  21753. var valueSize = this.getValueSize();
  21754. if ( valueSize - Math.floor( valueSize ) !== 0 ) {
  21755. console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );
  21756. valid = false;
  21757. }
  21758. var times = this.times,
  21759. values = this.values,
  21760. nKeys = times.length;
  21761. if ( nKeys === 0 ) {
  21762. console.error( 'THREE.KeyframeTrack: Track is empty.', this );
  21763. valid = false;
  21764. }
  21765. var prevTime = null;
  21766. for ( var i = 0; i !== nKeys; i ++ ) {
  21767. var currTime = times[ i ];
  21768. if ( typeof currTime === 'number' && isNaN( currTime ) ) {
  21769. console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );
  21770. valid = false;
  21771. break;
  21772. }
  21773. if ( prevTime !== null && prevTime > currTime ) {
  21774. console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );
  21775. valid = false;
  21776. break;
  21777. }
  21778. prevTime = currTime;
  21779. }
  21780. if ( values !== undefined ) {
  21781. if ( AnimationUtils.isTypedArray( values ) ) {
  21782. for ( var i = 0, n = values.length; i !== n; ++ i ) {
  21783. var value = values[ i ];
  21784. if ( isNaN( value ) ) {
  21785. console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );
  21786. valid = false;
  21787. break;
  21788. }
  21789. }
  21790. }
  21791. }
  21792. return valid;
  21793. },
  21794. // removes equivalent sequential keys as common in morph target sequences
  21795. // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)
  21796. optimize: function () {
  21797. var times = this.times,
  21798. values = this.values,
  21799. stride = this.getValueSize(),
  21800. smoothInterpolation = this.getInterpolation() === InterpolateSmooth,
  21801. writeIndex = 1,
  21802. lastIndex = times.length - 1;
  21803. for ( var i = 1; i < lastIndex; ++ i ) {
  21804. var keep = false;
  21805. var time = times[ i ];
  21806. var timeNext = times[ i + 1 ];
  21807. // remove adjacent keyframes scheduled at the same time
  21808. if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {
  21809. if ( ! smoothInterpolation ) {
  21810. // remove unnecessary keyframes same as their neighbors
  21811. var offset = i * stride,
  21812. offsetP = offset - stride,
  21813. offsetN = offset + stride;
  21814. for ( var j = 0; j !== stride; ++ j ) {
  21815. var value = values[ offset + j ];
  21816. if ( value !== values[ offsetP + j ] ||
  21817. value !== values[ offsetN + j ] ) {
  21818. keep = true;
  21819. break;
  21820. }
  21821. }
  21822. } else {
  21823. keep = true;
  21824. }
  21825. }
  21826. // in-place compaction
  21827. if ( keep ) {
  21828. if ( i !== writeIndex ) {
  21829. times[ writeIndex ] = times[ i ];
  21830. var readOffset = i * stride,
  21831. writeOffset = writeIndex * stride;
  21832. for ( var j = 0; j !== stride; ++ j ) {
  21833. values[ writeOffset + j ] = values[ readOffset + j ];
  21834. }
  21835. }
  21836. ++ writeIndex;
  21837. }
  21838. }
  21839. // flush last keyframe (compaction looks ahead)
  21840. if ( lastIndex > 0 ) {
  21841. times[ writeIndex ] = times[ lastIndex ];
  21842. for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {
  21843. values[ writeOffset + j ] = values[ readOffset + j ];
  21844. }
  21845. ++ writeIndex;
  21846. }
  21847. if ( writeIndex !== times.length ) {
  21848. this.times = AnimationUtils.arraySlice( times, 0, writeIndex );
  21849. this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );
  21850. }
  21851. return this;
  21852. }
  21853. } );
  21854. /**
  21855. *
  21856. * A Track of Boolean keyframe values.
  21857. *
  21858. *
  21859. * @author Ben Houston / http://clara.io/
  21860. * @author David Sarno / http://lighthaus.us/
  21861. * @author tschw
  21862. */
  21863. function BooleanKeyframeTrack( name, times, values ) {
  21864. KeyframeTrack.call( this, name, times, values );
  21865. }
  21866. BooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
  21867. constructor: BooleanKeyframeTrack,
  21868. ValueTypeName: 'bool',
  21869. ValueBufferType: Array,
  21870. DefaultInterpolation: InterpolateDiscrete,
  21871. InterpolantFactoryMethodLinear: undefined,
  21872. InterpolantFactoryMethodSmooth: undefined
  21873. // Note: Actually this track could have a optimized / compressed
  21874. // representation of a single value and a custom interpolant that
  21875. // computes "firstValue ^ isOdd( index )".
  21876. } );
  21877. /**
  21878. *
  21879. * A Track of keyframe values that represent color.
  21880. *
  21881. *
  21882. * @author Ben Houston / http://clara.io/
  21883. * @author David Sarno / http://lighthaus.us/
  21884. * @author tschw
  21885. */
  21886. function ColorKeyframeTrack( name, times, values, interpolation ) {
  21887. KeyframeTrack.call( this, name, times, values, interpolation );
  21888. }
  21889. ColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
  21890. constructor: ColorKeyframeTrack,
  21891. ValueTypeName: 'color'
  21892. // ValueBufferType is inherited
  21893. // DefaultInterpolation is inherited
  21894. // Note: Very basic implementation and nothing special yet.
  21895. // However, this is the place for color space parameterization.
  21896. } );
  21897. /**
  21898. *
  21899. * A Track of numeric keyframe values.
  21900. *
  21901. * @author Ben Houston / http://clara.io/
  21902. * @author David Sarno / http://lighthaus.us/
  21903. * @author tschw
  21904. */
  21905. function NumberKeyframeTrack( name, times, values, interpolation ) {
  21906. KeyframeTrack.call( this, name, times, values, interpolation );
  21907. }
  21908. NumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
  21909. constructor: NumberKeyframeTrack,
  21910. ValueTypeName: 'number'
  21911. // ValueBufferType is inherited
  21912. // DefaultInterpolation is inherited
  21913. } );
  21914. /**
  21915. * Spherical linear unit quaternion interpolant.
  21916. *
  21917. * @author tschw
  21918. */
  21919. function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
  21920. Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
  21921. }
  21922. QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
  21923. constructor: QuaternionLinearInterpolant,
  21924. interpolate_: function ( i1, t0, t, t1 ) {
  21925. var result = this.resultBuffer,
  21926. values = this.sampleValues,
  21927. stride = this.valueSize,
  21928. offset = i1 * stride,
  21929. alpha = ( t - t0 ) / ( t1 - t0 );
  21930. for ( var end = offset + stride; offset !== end; offset += 4 ) {
  21931. Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );
  21932. }
  21933. return result;
  21934. }
  21935. } );
  21936. /**
  21937. *
  21938. * A Track of quaternion keyframe values.
  21939. *
  21940. * @author Ben Houston / http://clara.io/
  21941. * @author David Sarno / http://lighthaus.us/
  21942. * @author tschw
  21943. */
  21944. function QuaternionKeyframeTrack( name, times, values, interpolation ) {
  21945. KeyframeTrack.call( this, name, times, values, interpolation );
  21946. }
  21947. QuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
  21948. constructor: QuaternionKeyframeTrack,
  21949. ValueTypeName: 'quaternion',
  21950. // ValueBufferType is inherited
  21951. DefaultInterpolation: InterpolateLinear,
  21952. InterpolantFactoryMethodLinear: function ( result ) {
  21953. return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );
  21954. },
  21955. InterpolantFactoryMethodSmooth: undefined // not yet implemented
  21956. } );
  21957. /**
  21958. *
  21959. * A Track that interpolates Strings
  21960. *
  21961. *
  21962. * @author Ben Houston / http://clara.io/
  21963. * @author David Sarno / http://lighthaus.us/
  21964. * @author tschw
  21965. */
  21966. function StringKeyframeTrack( name, times, values, interpolation ) {
  21967. KeyframeTrack.call( this, name, times, values, interpolation );
  21968. }
  21969. StringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
  21970. constructor: StringKeyframeTrack,
  21971. ValueTypeName: 'string',
  21972. ValueBufferType: Array,
  21973. DefaultInterpolation: InterpolateDiscrete,
  21974. InterpolantFactoryMethodLinear: undefined,
  21975. InterpolantFactoryMethodSmooth: undefined
  21976. } );
  21977. /**
  21978. *
  21979. * A Track of vectored keyframe values.
  21980. *
  21981. *
  21982. * @author Ben Houston / http://clara.io/
  21983. * @author David Sarno / http://lighthaus.us/
  21984. * @author tschw
  21985. */
  21986. function VectorKeyframeTrack( name, times, values, interpolation ) {
  21987. KeyframeTrack.call( this, name, times, values, interpolation );
  21988. }
  21989. VectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
  21990. constructor: VectorKeyframeTrack,
  21991. ValueTypeName: 'vector'
  21992. // ValueBufferType is inherited
  21993. // DefaultInterpolation is inherited
  21994. } );
  21995. /**
  21996. *
  21997. * Reusable set of Tracks that represent an animation.
  21998. *
  21999. * @author Ben Houston / http://clara.io/
  22000. * @author David Sarno / http://lighthaus.us/
  22001. */
  22002. function AnimationClip( name, duration, tracks ) {
  22003. this.name = name;
  22004. this.tracks = tracks;
  22005. this.duration = ( duration !== undefined ) ? duration : - 1;
  22006. this.uuid = _Math.generateUUID();
  22007. // this means it should figure out its duration by scanning the tracks
  22008. if ( this.duration < 0 ) {
  22009. this.resetDuration();
  22010. }
  22011. }
  22012. function getTrackTypeForValueTypeName( typeName ) {
  22013. switch ( typeName.toLowerCase() ) {
  22014. case 'scalar':
  22015. case 'double':
  22016. case 'float':
  22017. case 'number':
  22018. case 'integer':
  22019. return NumberKeyframeTrack;
  22020. case 'vector':
  22021. case 'vector2':
  22022. case 'vector3':
  22023. case 'vector4':
  22024. return VectorKeyframeTrack;
  22025. case 'color':
  22026. return ColorKeyframeTrack;
  22027. case 'quaternion':
  22028. return QuaternionKeyframeTrack;
  22029. case 'bool':
  22030. case 'boolean':
  22031. return BooleanKeyframeTrack;
  22032. case 'string':
  22033. return StringKeyframeTrack;
  22034. }
  22035. throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );
  22036. }
  22037. function parseKeyframeTrack( json ) {
  22038. if ( json.type === undefined ) {
  22039. throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );
  22040. }
  22041. var trackType = getTrackTypeForValueTypeName( json.type );
  22042. if ( json.times === undefined ) {
  22043. var times = [], values = [];
  22044. AnimationUtils.flattenJSON( json.keys, times, values, 'value' );
  22045. json.times = times;
  22046. json.values = values;
  22047. }
  22048. // derived classes can define a static parse method
  22049. if ( trackType.parse !== undefined ) {
  22050. return trackType.parse( json );
  22051. } else {
  22052. // by default, we assume a constructor compatible with the base
  22053. return new trackType( json.name, json.times, json.values, json.interpolation );
  22054. }
  22055. }
  22056. Object.assign( AnimationClip, {
  22057. parse: function ( json ) {
  22058. var tracks = [],
  22059. jsonTracks = json.tracks,
  22060. frameTime = 1.0 / ( json.fps || 1.0 );
  22061. for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {
  22062. tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );
  22063. }
  22064. return new AnimationClip( json.name, json.duration, tracks );
  22065. },
  22066. toJSON: function ( clip ) {
  22067. var tracks = [],
  22068. clipTracks = clip.tracks;
  22069. var json = {
  22070. 'name': clip.name,
  22071. 'duration': clip.duration,
  22072. 'tracks': tracks,
  22073. 'uuid': clip.uuid
  22074. };
  22075. for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {
  22076. tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );
  22077. }
  22078. return json;
  22079. },
  22080. CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) {
  22081. var numMorphTargets = morphTargetSequence.length;
  22082. var tracks = [];
  22083. for ( var i = 0; i < numMorphTargets; i ++ ) {
  22084. var times = [];
  22085. var values = [];
  22086. times.push(
  22087. ( i + numMorphTargets - 1 ) % numMorphTargets,
  22088. i,
  22089. ( i + 1 ) % numMorphTargets );
  22090. values.push( 0, 1, 0 );
  22091. var order = AnimationUtils.getKeyframeOrder( times );
  22092. times = AnimationUtils.sortedArray( times, 1, order );
  22093. values = AnimationUtils.sortedArray( values, 1, order );
  22094. // if there is a key at the first frame, duplicate it as the
  22095. // last frame as well for perfect loop.
  22096. if ( ! noLoop && times[ 0 ] === 0 ) {
  22097. times.push( numMorphTargets );
  22098. values.push( values[ 0 ] );
  22099. }
  22100. tracks.push(
  22101. new NumberKeyframeTrack(
  22102. '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',
  22103. times, values
  22104. ).scale( 1.0 / fps ) );
  22105. }
  22106. return new AnimationClip( name, - 1, tracks );
  22107. },
  22108. findByName: function ( objectOrClipArray, name ) {
  22109. var clipArray = objectOrClipArray;
  22110. if ( ! Array.isArray( objectOrClipArray ) ) {
  22111. var o = objectOrClipArray;
  22112. clipArray = o.geometry && o.geometry.animations || o.animations;
  22113. }
  22114. for ( var i = 0; i < clipArray.length; i ++ ) {
  22115. if ( clipArray[ i ].name === name ) {
  22116. return clipArray[ i ];
  22117. }
  22118. }
  22119. return null;
  22120. },
  22121. CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) {
  22122. var animationToMorphTargets = {};
  22123. // tested with https://regex101.com/ on trick sequences
  22124. // such flamingo_flyA_003, flamingo_run1_003, crdeath0059
  22125. var pattern = /^([\w-]*?)([\d]+)$/;
  22126. // sort morph target names into animation groups based
  22127. // patterns like Walk_001, Walk_002, Run_001, Run_002
  22128. for ( var i = 0, il = morphTargets.length; i < il; i ++ ) {
  22129. var morphTarget = morphTargets[ i ];
  22130. var parts = morphTarget.name.match( pattern );
  22131. if ( parts && parts.length > 1 ) {
  22132. var name = parts[ 1 ];
  22133. var animationMorphTargets = animationToMorphTargets[ name ];
  22134. if ( ! animationMorphTargets ) {
  22135. animationToMorphTargets[ name ] = animationMorphTargets = [];
  22136. }
  22137. animationMorphTargets.push( morphTarget );
  22138. }
  22139. }
  22140. var clips = [];
  22141. for ( var name in animationToMorphTargets ) {
  22142. clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );
  22143. }
  22144. return clips;
  22145. },
  22146. // parse the animation.hierarchy format
  22147. parseAnimation: function ( animation, bones ) {
  22148. if ( ! animation ) {
  22149. console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );
  22150. return null;
  22151. }
  22152. var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {
  22153. // only return track if there are actually keys.
  22154. if ( animationKeys.length !== 0 ) {
  22155. var times = [];
  22156. var values = [];
  22157. AnimationUtils.flattenJSON( animationKeys, times, values, propertyName );
  22158. // empty keys are filtered out, so check again
  22159. if ( times.length !== 0 ) {
  22160. destTracks.push( new trackType( trackName, times, values ) );
  22161. }
  22162. }
  22163. };
  22164. var tracks = [];
  22165. var clipName = animation.name || 'default';
  22166. // automatic length determination in AnimationClip.
  22167. var duration = animation.length || - 1;
  22168. var fps = animation.fps || 30;
  22169. var hierarchyTracks = animation.hierarchy || [];
  22170. for ( var h = 0; h < hierarchyTracks.length; h ++ ) {
  22171. var animationKeys = hierarchyTracks[ h ].keys;
  22172. // skip empty tracks
  22173. if ( ! animationKeys || animationKeys.length === 0 ) continue;
  22174. // process morph targets
  22175. if ( animationKeys[ 0 ].morphTargets ) {
  22176. // figure out all morph targets used in this track
  22177. var morphTargetNames = {};
  22178. for ( var k = 0; k < animationKeys.length; k ++ ) {
  22179. if ( animationKeys[ k ].morphTargets ) {
  22180. for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {
  22181. morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;
  22182. }
  22183. }
  22184. }
  22185. // create a track for each morph target with all zero
  22186. // morphTargetInfluences except for the keys in which
  22187. // the morphTarget is named.
  22188. for ( var morphTargetName in morphTargetNames ) {
  22189. var times = [];
  22190. var values = [];
  22191. for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {
  22192. var animationKey = animationKeys[ k ];
  22193. times.push( animationKey.time );
  22194. values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );
  22195. }
  22196. tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );
  22197. }
  22198. duration = morphTargetNames.length * ( fps || 1.0 );
  22199. } else {
  22200. // ...assume skeletal animation
  22201. var boneName = '.bones[' + bones[ h ].name + ']';
  22202. addNonemptyTrack(
  22203. VectorKeyframeTrack, boneName + '.position',
  22204. animationKeys, 'pos', tracks );
  22205. addNonemptyTrack(
  22206. QuaternionKeyframeTrack, boneName + '.quaternion',
  22207. animationKeys, 'rot', tracks );
  22208. addNonemptyTrack(
  22209. VectorKeyframeTrack, boneName + '.scale',
  22210. animationKeys, 'scl', tracks );
  22211. }
  22212. }
  22213. if ( tracks.length === 0 ) {
  22214. return null;
  22215. }
  22216. var clip = new AnimationClip( clipName, duration, tracks );
  22217. return clip;
  22218. }
  22219. } );
  22220. Object.assign( AnimationClip.prototype, {
  22221. resetDuration: function () {
  22222. var tracks = this.tracks, duration = 0;
  22223. for ( var i = 0, n = tracks.length; i !== n; ++ i ) {
  22224. var track = this.tracks[ i ];
  22225. duration = Math.max( duration, track.times[ track.times.length - 1 ] );
  22226. }
  22227. this.duration = duration;
  22228. return this;
  22229. },
  22230. trim: function () {
  22231. for ( var i = 0; i < this.tracks.length; i ++ ) {
  22232. this.tracks[ i ].trim( 0, this.duration );
  22233. }
  22234. return this;
  22235. },
  22236. validate: function () {
  22237. var valid = true;
  22238. for ( var i = 0; i < this.tracks.length; i ++ ) {
  22239. valid = valid && this.tracks[ i ].validate();
  22240. }
  22241. return valid;
  22242. },
  22243. optimize: function () {
  22244. for ( var i = 0; i < this.tracks.length; i ++ ) {
  22245. this.tracks[ i ].optimize();
  22246. }
  22247. return this;
  22248. }
  22249. } );
  22250. /**
  22251. * @author mrdoob / http://mrdoob.com/
  22252. */
  22253. function MaterialLoader( manager ) {
  22254. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  22255. this.textures = {};
  22256. }
  22257. Object.assign( MaterialLoader.prototype, {
  22258. load: function ( url, onLoad, onProgress, onError ) {
  22259. var scope = this;
  22260. var loader = new FileLoader( scope.manager );
  22261. loader.load( url, function ( text ) {
  22262. onLoad( scope.parse( JSON.parse( text ) ) );
  22263. }, onProgress, onError );
  22264. },
  22265. setTextures: function ( value ) {
  22266. this.textures = value;
  22267. },
  22268. parse: function ( json ) {
  22269. var textures = this.textures;
  22270. function getTexture( name ) {
  22271. if ( textures[ name ] === undefined ) {
  22272. console.warn( 'THREE.MaterialLoader: Undefined texture', name );
  22273. }
  22274. return textures[ name ];
  22275. }
  22276. var material = new Materials[ json.type ]();
  22277. if ( json.uuid !== undefined ) material.uuid = json.uuid;
  22278. if ( json.name !== undefined ) material.name = json.name;
  22279. if ( json.color !== undefined ) material.color.setHex( json.color );
  22280. if ( json.roughness !== undefined ) material.roughness = json.roughness;
  22281. if ( json.metalness !== undefined ) material.metalness = json.metalness;
  22282. if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );
  22283. if ( json.specular !== undefined ) material.specular.setHex( json.specular );
  22284. if ( json.shininess !== undefined ) material.shininess = json.shininess;
  22285. if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;
  22286. if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;
  22287. if ( json.uniforms !== undefined ) material.uniforms = json.uniforms;
  22288. if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;
  22289. if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;
  22290. if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;
  22291. if ( json.fog !== undefined ) material.fog = json.fog;
  22292. if ( json.flatShading !== undefined ) material.flatShading = json.flatShading;
  22293. if ( json.blending !== undefined ) material.blending = json.blending;
  22294. if ( json.side !== undefined ) material.side = json.side;
  22295. if ( json.opacity !== undefined ) material.opacity = json.opacity;
  22296. if ( json.transparent !== undefined ) material.transparent = json.transparent;
  22297. if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;
  22298. if ( json.depthTest !== undefined ) material.depthTest = json.depthTest;
  22299. if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;
  22300. if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;
  22301. if ( json.wireframe !== undefined ) material.wireframe = json.wireframe;
  22302. if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;
  22303. if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;
  22304. if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;
  22305. if ( json.rotation !== undefined ) material.rotation = json.rotation;
  22306. if ( json.linewidth !== 1 ) material.linewidth = json.linewidth;
  22307. if ( json.dashSize !== undefined ) material.dashSize = json.dashSize;
  22308. if ( json.gapSize !== undefined ) material.gapSize = json.gapSize;
  22309. if ( json.scale !== undefined ) material.scale = json.scale;
  22310. if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;
  22311. if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;
  22312. if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;
  22313. if ( json.skinning !== undefined ) material.skinning = json.skinning;
  22314. if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;
  22315. if ( json.dithering !== undefined ) material.dithering = json.dithering;
  22316. if ( json.visible !== undefined ) material.visible = json.visible;
  22317. if ( json.userData !== undefined ) material.userData = json.userData;
  22318. // Deprecated
  22319. if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading
  22320. // for PointsMaterial
  22321. if ( json.size !== undefined ) material.size = json.size;
  22322. if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;
  22323. // maps
  22324. if ( json.map !== undefined ) material.map = getTexture( json.map );
  22325. if ( json.alphaMap !== undefined ) {
  22326. material.alphaMap = getTexture( json.alphaMap );
  22327. material.transparent = true;
  22328. }
  22329. if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );
  22330. if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;
  22331. if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );
  22332. if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;
  22333. if ( json.normalScale !== undefined ) {
  22334. var normalScale = json.normalScale;
  22335. if ( Array.isArray( normalScale ) === false ) {
  22336. // Blender exporter used to export a scalar. See #7459
  22337. normalScale = [ normalScale, normalScale ];
  22338. }
  22339. material.normalScale = new Vector2().fromArray( normalScale );
  22340. }
  22341. if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );
  22342. if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;
  22343. if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;
  22344. if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );
  22345. if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );
  22346. if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );
  22347. if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;
  22348. if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );
  22349. if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );
  22350. if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;
  22351. if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );
  22352. if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;
  22353. if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );
  22354. if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;
  22355. if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );
  22356. return material;
  22357. }
  22358. } );
  22359. /**
  22360. * @author mrdoob / http://mrdoob.com/
  22361. */
  22362. function BufferGeometryLoader( manager ) {
  22363. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  22364. }
  22365. Object.assign( BufferGeometryLoader.prototype, {
  22366. load: function ( url, onLoad, onProgress, onError ) {
  22367. var scope = this;
  22368. var loader = new FileLoader( scope.manager );
  22369. loader.load( url, function ( text ) {
  22370. onLoad( scope.parse( JSON.parse( text ) ) );
  22371. }, onProgress, onError );
  22372. },
  22373. parse: function ( json ) {
  22374. var geometry = new BufferGeometry();
  22375. var index = json.data.index;
  22376. if ( index !== undefined ) {
  22377. var typedArray = new TYPED_ARRAYS[ index.type ]( index.array );
  22378. geometry.setIndex( new BufferAttribute( typedArray, 1 ) );
  22379. }
  22380. var attributes = json.data.attributes;
  22381. for ( var key in attributes ) {
  22382. var attribute = attributes[ key ];
  22383. var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );
  22384. geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );
  22385. }
  22386. var groups = json.data.groups || json.data.drawcalls || json.data.offsets;
  22387. if ( groups !== undefined ) {
  22388. for ( var i = 0, n = groups.length; i !== n; ++ i ) {
  22389. var group = groups[ i ];
  22390. geometry.addGroup( group.start, group.count, group.materialIndex );
  22391. }
  22392. }
  22393. var boundingSphere = json.data.boundingSphere;
  22394. if ( boundingSphere !== undefined ) {
  22395. var center = new Vector3();
  22396. if ( boundingSphere.center !== undefined ) {
  22397. center.fromArray( boundingSphere.center );
  22398. }
  22399. geometry.boundingSphere = new Sphere( center, boundingSphere.radius );
  22400. }
  22401. return geometry;
  22402. }
  22403. } );
  22404. var TYPED_ARRAYS = {
  22405. Int8Array: Int8Array,
  22406. Uint8Array: Uint8Array,
  22407. // Workaround for IE11 pre KB2929437. See #11440
  22408. Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array,
  22409. Int16Array: Int16Array,
  22410. Uint16Array: Uint16Array,
  22411. Int32Array: Int32Array,
  22412. Uint32Array: Uint32Array,
  22413. Float32Array: Float32Array,
  22414. Float64Array: Float64Array
  22415. };
  22416. /**
  22417. * @author alteredq / http://alteredqualia.com/
  22418. */
  22419. function Loader() {}
  22420. Loader.Handlers = {
  22421. handlers: [],
  22422. add: function ( regex, loader ) {
  22423. this.handlers.push( regex, loader );
  22424. },
  22425. get: function ( file ) {
  22426. var handlers = this.handlers;
  22427. for ( var i = 0, l = handlers.length; i < l; i += 2 ) {
  22428. var regex = handlers[ i ];
  22429. var loader = handlers[ i + 1 ];
  22430. if ( regex.test( file ) ) {
  22431. return loader;
  22432. }
  22433. }
  22434. return null;
  22435. }
  22436. };
  22437. Object.assign( Loader.prototype, {
  22438. crossOrigin: 'anonymous',
  22439. onLoadStart: function () {},
  22440. onLoadProgress: function () {},
  22441. onLoadComplete: function () {},
  22442. initMaterials: function ( materials, texturePath, crossOrigin ) {
  22443. var array = [];
  22444. for ( var i = 0; i < materials.length; ++ i ) {
  22445. array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );
  22446. }
  22447. return array;
  22448. },
  22449. createMaterial: ( function () {
  22450. var BlendingMode = {
  22451. NoBlending: NoBlending,
  22452. NormalBlending: NormalBlending,
  22453. AdditiveBlending: AdditiveBlending,
  22454. SubtractiveBlending: SubtractiveBlending,
  22455. MultiplyBlending: MultiplyBlending,
  22456. CustomBlending: CustomBlending
  22457. };
  22458. var color = new Color();
  22459. var textureLoader = new TextureLoader();
  22460. var materialLoader = new MaterialLoader();
  22461. return function createMaterial( m, texturePath, crossOrigin ) {
  22462. // convert from old material format
  22463. var textures = {};
  22464. function loadTexture( path, repeat, offset, wrap, anisotropy ) {
  22465. var fullPath = texturePath + path;
  22466. var loader = Loader.Handlers.get( fullPath );
  22467. var texture;
  22468. if ( loader !== null ) {
  22469. texture = loader.load( fullPath );
  22470. } else {
  22471. textureLoader.setCrossOrigin( crossOrigin );
  22472. texture = textureLoader.load( fullPath );
  22473. }
  22474. if ( repeat !== undefined ) {
  22475. texture.repeat.fromArray( repeat );
  22476. if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;
  22477. if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;
  22478. }
  22479. if ( offset !== undefined ) {
  22480. texture.offset.fromArray( offset );
  22481. }
  22482. if ( wrap !== undefined ) {
  22483. if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;
  22484. if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;
  22485. if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;
  22486. if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;
  22487. }
  22488. if ( anisotropy !== undefined ) {
  22489. texture.anisotropy = anisotropy;
  22490. }
  22491. var uuid = _Math.generateUUID();
  22492. textures[ uuid ] = texture;
  22493. return uuid;
  22494. }
  22495. //
  22496. var json = {
  22497. uuid: _Math.generateUUID(),
  22498. type: 'MeshLambertMaterial'
  22499. };
  22500. for ( var name in m ) {
  22501. var value = m[ name ];
  22502. switch ( name ) {
  22503. case 'DbgColor':
  22504. case 'DbgIndex':
  22505. case 'opticalDensity':
  22506. case 'illumination':
  22507. break;
  22508. case 'DbgName':
  22509. json.name = value;
  22510. break;
  22511. case 'blending':
  22512. json.blending = BlendingMode[ value ];
  22513. break;
  22514. case 'colorAmbient':
  22515. case 'mapAmbient':
  22516. console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );
  22517. break;
  22518. case 'colorDiffuse':
  22519. json.color = color.fromArray( value ).getHex();
  22520. break;
  22521. case 'colorSpecular':
  22522. json.specular = color.fromArray( value ).getHex();
  22523. break;
  22524. case 'colorEmissive':
  22525. json.emissive = color.fromArray( value ).getHex();
  22526. break;
  22527. case 'specularCoef':
  22528. json.shininess = value;
  22529. break;
  22530. case 'shading':
  22531. if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';
  22532. if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';
  22533. if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';
  22534. break;
  22535. case 'mapDiffuse':
  22536. json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );
  22537. break;
  22538. case 'mapDiffuseRepeat':
  22539. case 'mapDiffuseOffset':
  22540. case 'mapDiffuseWrap':
  22541. case 'mapDiffuseAnisotropy':
  22542. break;
  22543. case 'mapEmissive':
  22544. json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );
  22545. break;
  22546. case 'mapEmissiveRepeat':
  22547. case 'mapEmissiveOffset':
  22548. case 'mapEmissiveWrap':
  22549. case 'mapEmissiveAnisotropy':
  22550. break;
  22551. case 'mapLight':
  22552. json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );
  22553. break;
  22554. case 'mapLightRepeat':
  22555. case 'mapLightOffset':
  22556. case 'mapLightWrap':
  22557. case 'mapLightAnisotropy':
  22558. break;
  22559. case 'mapAO':
  22560. json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );
  22561. break;
  22562. case 'mapAORepeat':
  22563. case 'mapAOOffset':
  22564. case 'mapAOWrap':
  22565. case 'mapAOAnisotropy':
  22566. break;
  22567. case 'mapBump':
  22568. json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );
  22569. break;
  22570. case 'mapBumpScale':
  22571. json.bumpScale = value;
  22572. break;
  22573. case 'mapBumpRepeat':
  22574. case 'mapBumpOffset':
  22575. case 'mapBumpWrap':
  22576. case 'mapBumpAnisotropy':
  22577. break;
  22578. case 'mapNormal':
  22579. json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );
  22580. break;
  22581. case 'mapNormalFactor':
  22582. json.normalScale = value;
  22583. break;
  22584. case 'mapNormalRepeat':
  22585. case 'mapNormalOffset':
  22586. case 'mapNormalWrap':
  22587. case 'mapNormalAnisotropy':
  22588. break;
  22589. case 'mapSpecular':
  22590. json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );
  22591. break;
  22592. case 'mapSpecularRepeat':
  22593. case 'mapSpecularOffset':
  22594. case 'mapSpecularWrap':
  22595. case 'mapSpecularAnisotropy':
  22596. break;
  22597. case 'mapMetalness':
  22598. json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );
  22599. break;
  22600. case 'mapMetalnessRepeat':
  22601. case 'mapMetalnessOffset':
  22602. case 'mapMetalnessWrap':
  22603. case 'mapMetalnessAnisotropy':
  22604. break;
  22605. case 'mapRoughness':
  22606. json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );
  22607. break;
  22608. case 'mapRoughnessRepeat':
  22609. case 'mapRoughnessOffset':
  22610. case 'mapRoughnessWrap':
  22611. case 'mapRoughnessAnisotropy':
  22612. break;
  22613. case 'mapAlpha':
  22614. json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );
  22615. break;
  22616. case 'mapAlphaRepeat':
  22617. case 'mapAlphaOffset':
  22618. case 'mapAlphaWrap':
  22619. case 'mapAlphaAnisotropy':
  22620. break;
  22621. case 'flipSided':
  22622. json.side = BackSide;
  22623. break;
  22624. case 'doubleSided':
  22625. json.side = DoubleSide;
  22626. break;
  22627. case 'transparency':
  22628. console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );
  22629. json.opacity = value;
  22630. break;
  22631. case 'depthTest':
  22632. case 'depthWrite':
  22633. case 'colorWrite':
  22634. case 'opacity':
  22635. case 'reflectivity':
  22636. case 'transparent':
  22637. case 'visible':
  22638. case 'wireframe':
  22639. json[ name ] = value;
  22640. break;
  22641. case 'vertexColors':
  22642. if ( value === true ) json.vertexColors = VertexColors;
  22643. if ( value === 'face' ) json.vertexColors = FaceColors;
  22644. break;
  22645. default:
  22646. console.error( 'THREE.Loader.createMaterial: Unsupported', name, value );
  22647. break;
  22648. }
  22649. }
  22650. if ( json.type === 'MeshBasicMaterial' ) delete json.emissive;
  22651. if ( json.type !== 'MeshPhongMaterial' ) delete json.specular;
  22652. if ( json.opacity < 1 ) json.transparent = true;
  22653. materialLoader.setTextures( textures );
  22654. return materialLoader.parse( json );
  22655. };
  22656. } )()
  22657. } );
  22658. /**
  22659. * @author Don McCurdy / https://www.donmccurdy.com
  22660. */
  22661. var LoaderUtils = {
  22662. decodeText: function ( array ) {
  22663. if ( typeof TextDecoder !== 'undefined' ) {
  22664. return new TextDecoder().decode( array );
  22665. }
  22666. // Avoid the String.fromCharCode.apply(null, array) shortcut, which
  22667. // throws a "maximum call stack size exceeded" error for large arrays.
  22668. var s = '';
  22669. for ( var i = 0, il = array.length; i < il; i ++ ) {
  22670. // Implicitly assumes little-endian.
  22671. s += String.fromCharCode( array[ i ] );
  22672. }
  22673. // Merges multi-byte utf-8 characters.
  22674. return decodeURIComponent( escape( s ) );
  22675. },
  22676. extractUrlBase: function ( url ) {
  22677. var index = url.lastIndexOf( '/' );
  22678. if ( index === - 1 ) return './';
  22679. return url.substr( 0, index + 1 );
  22680. }
  22681. };
  22682. /**
  22683. * @author mrdoob / http://mrdoob.com/
  22684. * @author alteredq / http://alteredqualia.com/
  22685. */
  22686. function JSONLoader( manager ) {
  22687. if ( typeof manager === 'boolean' ) {
  22688. console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );
  22689. manager = undefined;
  22690. }
  22691. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  22692. this.withCredentials = false;
  22693. }
  22694. Object.assign( JSONLoader.prototype, {
  22695. crossOrigin: 'anonymous',
  22696. load: function ( url, onLoad, onProgress, onError ) {
  22697. var scope = this;
  22698. var texturePath = this.texturePath && ( typeof this.texturePath === 'string' ) ? this.texturePath : LoaderUtils.extractUrlBase( url );
  22699. var loader = new FileLoader( this.manager );
  22700. loader.setWithCredentials( this.withCredentials );
  22701. loader.load( url, function ( text ) {
  22702. var json = JSON.parse( text );
  22703. var metadata = json.metadata;
  22704. if ( metadata !== undefined ) {
  22705. var type = metadata.type;
  22706. if ( type !== undefined ) {
  22707. if ( type.toLowerCase() === 'object' ) {
  22708. console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );
  22709. return;
  22710. }
  22711. }
  22712. }
  22713. var object = scope.parse( json, texturePath );
  22714. onLoad( object.geometry, object.materials );
  22715. }, onProgress, onError );
  22716. },
  22717. setCrossOrigin: function ( value ) {
  22718. this.crossOrigin = value;
  22719. return this;
  22720. },
  22721. setTexturePath: function ( value ) {
  22722. this.texturePath = value;
  22723. return this;
  22724. },
  22725. parse: ( function () {
  22726. function parseModel( json, geometry ) {
  22727. function isBitSet( value, position ) {
  22728. return value & ( 1 << position );
  22729. }
  22730. var i, j, fi,
  22731. offset, zLength,
  22732. colorIndex, normalIndex, uvIndex, materialIndex,
  22733. type,
  22734. isQuad,
  22735. hasMaterial,
  22736. hasFaceVertexUv,
  22737. hasFaceNormal, hasFaceVertexNormal,
  22738. hasFaceColor, hasFaceVertexColor,
  22739. vertex, face, faceA, faceB, hex, normal,
  22740. uvLayer, uv, u, v,
  22741. faces = json.faces,
  22742. vertices = json.vertices,
  22743. normals = json.normals,
  22744. colors = json.colors,
  22745. scale = json.scale,
  22746. nUvLayers = 0;
  22747. if ( json.uvs !== undefined ) {
  22748. // disregard empty arrays
  22749. for ( i = 0; i < json.uvs.length; i ++ ) {
  22750. if ( json.uvs[ i ].length ) nUvLayers ++;
  22751. }
  22752. for ( i = 0; i < nUvLayers; i ++ ) {
  22753. geometry.faceVertexUvs[ i ] = [];
  22754. }
  22755. }
  22756. offset = 0;
  22757. zLength = vertices.length;
  22758. while ( offset < zLength ) {
  22759. vertex = new Vector3();
  22760. vertex.x = vertices[ offset ++ ] * scale;
  22761. vertex.y = vertices[ offset ++ ] * scale;
  22762. vertex.z = vertices[ offset ++ ] * scale;
  22763. geometry.vertices.push( vertex );
  22764. }
  22765. offset = 0;
  22766. zLength = faces.length;
  22767. while ( offset < zLength ) {
  22768. type = faces[ offset ++ ];
  22769. isQuad = isBitSet( type, 0 );
  22770. hasMaterial = isBitSet( type, 1 );
  22771. hasFaceVertexUv = isBitSet( type, 3 );
  22772. hasFaceNormal = isBitSet( type, 4 );
  22773. hasFaceVertexNormal = isBitSet( type, 5 );
  22774. hasFaceColor = isBitSet( type, 6 );
  22775. hasFaceVertexColor = isBitSet( type, 7 );
  22776. // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);
  22777. if ( isQuad ) {
  22778. faceA = new Face3();
  22779. faceA.a = faces[ offset ];
  22780. faceA.b = faces[ offset + 1 ];
  22781. faceA.c = faces[ offset + 3 ];
  22782. faceB = new Face3();
  22783. faceB.a = faces[ offset + 1 ];
  22784. faceB.b = faces[ offset + 2 ];
  22785. faceB.c = faces[ offset + 3 ];
  22786. offset += 4;
  22787. if ( hasMaterial ) {
  22788. materialIndex = faces[ offset ++ ];
  22789. faceA.materialIndex = materialIndex;
  22790. faceB.materialIndex = materialIndex;
  22791. }
  22792. // to get face <=> uv index correspondence
  22793. fi = geometry.faces.length;
  22794. if ( hasFaceVertexUv ) {
  22795. for ( i = 0; i < nUvLayers; i ++ ) {
  22796. uvLayer = json.uvs[ i ];
  22797. geometry.faceVertexUvs[ i ][ fi ] = [];
  22798. geometry.faceVertexUvs[ i ][ fi + 1 ] = [];
  22799. for ( j = 0; j < 4; j ++ ) {
  22800. uvIndex = faces[ offset ++ ];
  22801. u = uvLayer[ uvIndex * 2 ];
  22802. v = uvLayer[ uvIndex * 2 + 1 ];
  22803. uv = new Vector2( u, v );
  22804. if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );
  22805. if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );
  22806. }
  22807. }
  22808. }
  22809. if ( hasFaceNormal ) {
  22810. normalIndex = faces[ offset ++ ] * 3;
  22811. faceA.normal.set(
  22812. normals[ normalIndex ++ ],
  22813. normals[ normalIndex ++ ],
  22814. normals[ normalIndex ]
  22815. );
  22816. faceB.normal.copy( faceA.normal );
  22817. }
  22818. if ( hasFaceVertexNormal ) {
  22819. for ( i = 0; i < 4; i ++ ) {
  22820. normalIndex = faces[ offset ++ ] * 3;
  22821. normal = new Vector3(
  22822. normals[ normalIndex ++ ],
  22823. normals[ normalIndex ++ ],
  22824. normals[ normalIndex ]
  22825. );
  22826. if ( i !== 2 ) faceA.vertexNormals.push( normal );
  22827. if ( i !== 0 ) faceB.vertexNormals.push( normal );
  22828. }
  22829. }
  22830. if ( hasFaceColor ) {
  22831. colorIndex = faces[ offset ++ ];
  22832. hex = colors[ colorIndex ];
  22833. faceA.color.setHex( hex );
  22834. faceB.color.setHex( hex );
  22835. }
  22836. if ( hasFaceVertexColor ) {
  22837. for ( i = 0; i < 4; i ++ ) {
  22838. colorIndex = faces[ offset ++ ];
  22839. hex = colors[ colorIndex ];
  22840. if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );
  22841. if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );
  22842. }
  22843. }
  22844. geometry.faces.push( faceA );
  22845. geometry.faces.push( faceB );
  22846. } else {
  22847. face = new Face3();
  22848. face.a = faces[ offset ++ ];
  22849. face.b = faces[ offset ++ ];
  22850. face.c = faces[ offset ++ ];
  22851. if ( hasMaterial ) {
  22852. materialIndex = faces[ offset ++ ];
  22853. face.materialIndex = materialIndex;
  22854. }
  22855. // to get face <=> uv index correspondence
  22856. fi = geometry.faces.length;
  22857. if ( hasFaceVertexUv ) {
  22858. for ( i = 0; i < nUvLayers; i ++ ) {
  22859. uvLayer = json.uvs[ i ];
  22860. geometry.faceVertexUvs[ i ][ fi ] = [];
  22861. for ( j = 0; j < 3; j ++ ) {
  22862. uvIndex = faces[ offset ++ ];
  22863. u = uvLayer[ uvIndex * 2 ];
  22864. v = uvLayer[ uvIndex * 2 + 1 ];
  22865. uv = new Vector2( u, v );
  22866. geometry.faceVertexUvs[ i ][ fi ].push( uv );
  22867. }
  22868. }
  22869. }
  22870. if ( hasFaceNormal ) {
  22871. normalIndex = faces[ offset ++ ] * 3;
  22872. face.normal.set(
  22873. normals[ normalIndex ++ ],
  22874. normals[ normalIndex ++ ],
  22875. normals[ normalIndex ]
  22876. );
  22877. }
  22878. if ( hasFaceVertexNormal ) {
  22879. for ( i = 0; i < 3; i ++ ) {
  22880. normalIndex = faces[ offset ++ ] * 3;
  22881. normal = new Vector3(
  22882. normals[ normalIndex ++ ],
  22883. normals[ normalIndex ++ ],
  22884. normals[ normalIndex ]
  22885. );
  22886. face.vertexNormals.push( normal );
  22887. }
  22888. }
  22889. if ( hasFaceColor ) {
  22890. colorIndex = faces[ offset ++ ];
  22891. face.color.setHex( colors[ colorIndex ] );
  22892. }
  22893. if ( hasFaceVertexColor ) {
  22894. for ( i = 0; i < 3; i ++ ) {
  22895. colorIndex = faces[ offset ++ ];
  22896. face.vertexColors.push( new Color( colors[ colorIndex ] ) );
  22897. }
  22898. }
  22899. geometry.faces.push( face );
  22900. }
  22901. }
  22902. }
  22903. function parseSkin( json, geometry ) {
  22904. var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;
  22905. if ( json.skinWeights ) {
  22906. for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {
  22907. var x = json.skinWeights[ i ];
  22908. var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;
  22909. var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;
  22910. var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;
  22911. geometry.skinWeights.push( new Vector4( x, y, z, w ) );
  22912. }
  22913. }
  22914. if ( json.skinIndices ) {
  22915. for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {
  22916. var a = json.skinIndices[ i ];
  22917. var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;
  22918. var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;
  22919. var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;
  22920. geometry.skinIndices.push( new Vector4( a, b, c, d ) );
  22921. }
  22922. }
  22923. geometry.bones = json.bones;
  22924. if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {
  22925. console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +
  22926. geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );
  22927. }
  22928. }
  22929. function parseMorphing( json, geometry ) {
  22930. var scale = json.scale;
  22931. if ( json.morphTargets !== undefined ) {
  22932. for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {
  22933. geometry.morphTargets[ i ] = {};
  22934. geometry.morphTargets[ i ].name = json.morphTargets[ i ].name;
  22935. geometry.morphTargets[ i ].vertices = [];
  22936. var dstVertices = geometry.morphTargets[ i ].vertices;
  22937. var srcVertices = json.morphTargets[ i ].vertices;
  22938. for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {
  22939. var vertex = new Vector3();
  22940. vertex.x = srcVertices[ v ] * scale;
  22941. vertex.y = srcVertices[ v + 1 ] * scale;
  22942. vertex.z = srcVertices[ v + 2 ] * scale;
  22943. dstVertices.push( vertex );
  22944. }
  22945. }
  22946. }
  22947. if ( json.morphColors !== undefined && json.morphColors.length > 0 ) {
  22948. console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' );
  22949. var faces = geometry.faces;
  22950. var morphColors = json.morphColors[ 0 ].colors;
  22951. for ( var i = 0, l = faces.length; i < l; i ++ ) {
  22952. faces[ i ].color.fromArray( morphColors, i * 3 );
  22953. }
  22954. }
  22955. }
  22956. function parseAnimations( json, geometry ) {
  22957. var outputAnimations = [];
  22958. // parse old style Bone/Hierarchy animations
  22959. var animations = [];
  22960. if ( json.animation !== undefined ) {
  22961. animations.push( json.animation );
  22962. }
  22963. if ( json.animations !== undefined ) {
  22964. if ( json.animations.length ) {
  22965. animations = animations.concat( json.animations );
  22966. } else {
  22967. animations.push( json.animations );
  22968. }
  22969. }
  22970. for ( var i = 0; i < animations.length; i ++ ) {
  22971. var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );
  22972. if ( clip ) outputAnimations.push( clip );
  22973. }
  22974. // parse implicit morph animations
  22975. if ( geometry.morphTargets ) {
  22976. // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.
  22977. var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );
  22978. outputAnimations = outputAnimations.concat( morphAnimationClips );
  22979. }
  22980. if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;
  22981. }
  22982. return function parse( json, texturePath ) {
  22983. if ( json.data !== undefined ) {
  22984. // Geometry 4.0 spec
  22985. json = json.data;
  22986. }
  22987. if ( json.scale !== undefined ) {
  22988. json.scale = 1.0 / json.scale;
  22989. } else {
  22990. json.scale = 1.0;
  22991. }
  22992. var geometry = new Geometry();
  22993. parseModel( json, geometry );
  22994. parseSkin( json, geometry );
  22995. parseMorphing( json, geometry );
  22996. parseAnimations( json, geometry );
  22997. geometry.computeFaceNormals();
  22998. geometry.computeBoundingSphere();
  22999. if ( json.materials === undefined || json.materials.length === 0 ) {
  23000. return { geometry: geometry };
  23001. } else {
  23002. var materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );
  23003. return { geometry: geometry, materials: materials };
  23004. }
  23005. };
  23006. } )()
  23007. } );
  23008. /**
  23009. * @author mrdoob / http://mrdoob.com/
  23010. */
  23011. function ObjectLoader( manager ) {
  23012. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  23013. this.texturePath = '';
  23014. }
  23015. Object.assign( ObjectLoader.prototype, {
  23016. crossOrigin: 'anonymous',
  23017. load: function ( url, onLoad, onProgress, onError ) {
  23018. if ( this.texturePath === '' ) {
  23019. this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );
  23020. }
  23021. var scope = this;
  23022. var loader = new FileLoader( scope.manager );
  23023. loader.load( url, function ( text ) {
  23024. var json = null;
  23025. try {
  23026. json = JSON.parse( text );
  23027. } catch ( error ) {
  23028. if ( onError !== undefined ) onError( error );
  23029. console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message );
  23030. return;
  23031. }
  23032. var metadata = json.metadata;
  23033. if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {
  23034. console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' );
  23035. return;
  23036. }
  23037. scope.parse( json, onLoad );
  23038. }, onProgress, onError );
  23039. },
  23040. setTexturePath: function ( value ) {
  23041. this.texturePath = value;
  23042. return this;
  23043. },
  23044. setCrossOrigin: function ( value ) {
  23045. this.crossOrigin = value;
  23046. return this;
  23047. },
  23048. parse: function ( json, onLoad ) {
  23049. var shapes = this.parseShape( json.shapes );
  23050. var geometries = this.parseGeometries( json.geometries, shapes );
  23051. var images = this.parseImages( json.images, function () {
  23052. if ( onLoad !== undefined ) onLoad( object );
  23053. } );
  23054. var textures = this.parseTextures( json.textures, images );
  23055. var materials = this.parseMaterials( json.materials, textures );
  23056. var object = this.parseObject( json.object, geometries, materials );
  23057. if ( json.animations ) {
  23058. object.animations = this.parseAnimations( json.animations );
  23059. }
  23060. if ( json.images === undefined || json.images.length === 0 ) {
  23061. if ( onLoad !== undefined ) onLoad( object );
  23062. }
  23063. return object;
  23064. },
  23065. parseShape: function ( json ) {
  23066. var shapes = {};
  23067. if ( json !== undefined ) {
  23068. for ( var i = 0, l = json.length; i < l; i ++ ) {
  23069. var shape = new Shape().fromJSON( json[ i ] );
  23070. shapes[ shape.uuid ] = shape;
  23071. }
  23072. }
  23073. return shapes;
  23074. },
  23075. parseGeometries: function ( json, shapes ) {
  23076. var geometries = {};
  23077. if ( json !== undefined ) {
  23078. var geometryLoader = new JSONLoader();
  23079. var bufferGeometryLoader = new BufferGeometryLoader();
  23080. for ( var i = 0, l = json.length; i < l; i ++ ) {
  23081. var geometry;
  23082. var data = json[ i ];
  23083. switch ( data.type ) {
  23084. case 'PlaneGeometry':
  23085. case 'PlaneBufferGeometry':
  23086. geometry = new Geometries[ data.type ](
  23087. data.width,
  23088. data.height,
  23089. data.widthSegments,
  23090. data.heightSegments
  23091. );
  23092. break;
  23093. case 'BoxGeometry':
  23094. case 'BoxBufferGeometry':
  23095. case 'CubeGeometry': // backwards compatible
  23096. geometry = new Geometries[ data.type ](
  23097. data.width,
  23098. data.height,
  23099. data.depth,
  23100. data.widthSegments,
  23101. data.heightSegments,
  23102. data.depthSegments
  23103. );
  23104. break;
  23105. case 'CircleGeometry':
  23106. case 'CircleBufferGeometry':
  23107. geometry = new Geometries[ data.type ](
  23108. data.radius,
  23109. data.segments,
  23110. data.thetaStart,
  23111. data.thetaLength
  23112. );
  23113. break;
  23114. case 'CylinderGeometry':
  23115. case 'CylinderBufferGeometry':
  23116. geometry = new Geometries[ data.type ](
  23117. data.radiusTop,
  23118. data.radiusBottom,
  23119. data.height,
  23120. data.radialSegments,
  23121. data.heightSegments,
  23122. data.openEnded,
  23123. data.thetaStart,
  23124. data.thetaLength
  23125. );
  23126. break;
  23127. case 'ConeGeometry':
  23128. case 'ConeBufferGeometry':
  23129. geometry = new Geometries[ data.type ](
  23130. data.radius,
  23131. data.height,
  23132. data.radialSegments,
  23133. data.heightSegments,
  23134. data.openEnded,
  23135. data.thetaStart,
  23136. data.thetaLength
  23137. );
  23138. break;
  23139. case 'SphereGeometry':
  23140. case 'SphereBufferGeometry':
  23141. geometry = new Geometries[ data.type ](
  23142. data.radius,
  23143. data.widthSegments,
  23144. data.heightSegments,
  23145. data.phiStart,
  23146. data.phiLength,
  23147. data.thetaStart,
  23148. data.thetaLength
  23149. );
  23150. break;
  23151. case 'DodecahedronGeometry':
  23152. case 'DodecahedronBufferGeometry':
  23153. case 'IcosahedronGeometry':
  23154. case 'IcosahedronBufferGeometry':
  23155. case 'OctahedronGeometry':
  23156. case 'OctahedronBufferGeometry':
  23157. case 'TetrahedronGeometry':
  23158. case 'TetrahedronBufferGeometry':
  23159. geometry = new Geometries[ data.type ](
  23160. data.radius,
  23161. data.detail
  23162. );
  23163. break;
  23164. case 'RingGeometry':
  23165. case 'RingBufferGeometry':
  23166. geometry = new Geometries[ data.type ](
  23167. data.innerRadius,
  23168. data.outerRadius,
  23169. data.thetaSegments,
  23170. data.phiSegments,
  23171. data.thetaStart,
  23172. data.thetaLength
  23173. );
  23174. break;
  23175. case 'TorusGeometry':
  23176. case 'TorusBufferGeometry':
  23177. geometry = new Geometries[ data.type ](
  23178. data.radius,
  23179. data.tube,
  23180. data.radialSegments,
  23181. data.tubularSegments,
  23182. data.arc
  23183. );
  23184. break;
  23185. case 'TorusKnotGeometry':
  23186. case 'TorusKnotBufferGeometry':
  23187. geometry = new Geometries[ data.type ](
  23188. data.radius,
  23189. data.tube,
  23190. data.tubularSegments,
  23191. data.radialSegments,
  23192. data.p,
  23193. data.q
  23194. );
  23195. break;
  23196. case 'LatheGeometry':
  23197. case 'LatheBufferGeometry':
  23198. geometry = new Geometries[ data.type ](
  23199. data.points,
  23200. data.segments,
  23201. data.phiStart,
  23202. data.phiLength
  23203. );
  23204. break;
  23205. case 'PolyhedronGeometry':
  23206. case 'PolyhedronBufferGeometry':
  23207. geometry = new Geometries[ data.type ](
  23208. data.vertices,
  23209. data.indices,
  23210. data.radius,
  23211. data.details
  23212. );
  23213. break;
  23214. case 'ShapeGeometry':
  23215. case 'ShapeBufferGeometry':
  23216. var geometryShapes = [];
  23217. for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) {
  23218. var shape = shapes[ data.shapes[ j ] ];
  23219. geometryShapes.push( shape );
  23220. }
  23221. geometry = new Geometries[ data.type ](
  23222. geometryShapes,
  23223. data.curveSegments
  23224. );
  23225. break;
  23226. case 'ExtrudeGeometry':
  23227. case 'ExtrudeBufferGeometry':
  23228. var geometryShapes = [];
  23229. for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) {
  23230. var shape = shapes[ data.shapes[ j ] ];
  23231. geometryShapes.push( shape );
  23232. }
  23233. var extrudePath = data.options.extrudePath;
  23234. if ( extrudePath !== undefined ) {
  23235. data.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );
  23236. }
  23237. geometry = new Geometries[ data.type ](
  23238. geometryShapes,
  23239. data.options
  23240. );
  23241. break;
  23242. case 'BufferGeometry':
  23243. geometry = bufferGeometryLoader.parse( data );
  23244. break;
  23245. case 'Geometry':
  23246. geometry = geometryLoader.parse( data, this.texturePath ).geometry;
  23247. break;
  23248. default:
  23249. console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' );
  23250. continue;
  23251. }
  23252. geometry.uuid = data.uuid;
  23253. if ( data.name !== undefined ) geometry.name = data.name;
  23254. if ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;
  23255. geometries[ data.uuid ] = geometry;
  23256. }
  23257. }
  23258. return geometries;
  23259. },
  23260. parseMaterials: function ( json, textures ) {
  23261. var materials = {};
  23262. if ( json !== undefined ) {
  23263. var loader = new MaterialLoader();
  23264. loader.setTextures( textures );
  23265. for ( var i = 0, l = json.length; i < l; i ++ ) {
  23266. var data = json[ i ];
  23267. if ( data.type === 'MultiMaterial' ) {
  23268. // Deprecated
  23269. var array = [];
  23270. for ( var j = 0; j < data.materials.length; j ++ ) {
  23271. array.push( loader.parse( data.materials[ j ] ) );
  23272. }
  23273. materials[ data.uuid ] = array;
  23274. } else {
  23275. materials[ data.uuid ] = loader.parse( data );
  23276. }
  23277. }
  23278. }
  23279. return materials;
  23280. },
  23281. parseAnimations: function ( json ) {
  23282. var animations = [];
  23283. for ( var i = 0; i < json.length; i ++ ) {
  23284. var data = json[ i ];
  23285. var clip = AnimationClip.parse( data );
  23286. if ( data.uuid !== undefined ) clip.uuid = data.uuid;
  23287. animations.push( clip );
  23288. }
  23289. return animations;
  23290. },
  23291. parseImages: function ( json, onLoad ) {
  23292. var scope = this;
  23293. var images = {};
  23294. function loadImage( url ) {
  23295. scope.manager.itemStart( url );
  23296. return loader.load( url, function () {
  23297. scope.manager.itemEnd( url );
  23298. }, undefined, function () {
  23299. scope.manager.itemEnd( url );
  23300. scope.manager.itemError( url );
  23301. } );
  23302. }
  23303. if ( json !== undefined && json.length > 0 ) {
  23304. var manager = new LoadingManager( onLoad );
  23305. var loader = new ImageLoader( manager );
  23306. loader.setCrossOrigin( this.crossOrigin );
  23307. for ( var i = 0, il = json.length; i < il; i ++ ) {
  23308. var image = json[ i ];
  23309. var url = image.url;
  23310. if ( Array.isArray( url ) ) {
  23311. // load array of images e.g CubeTexture
  23312. images[ image.uuid ] = [];
  23313. for ( var j = 0, jl = url.length; j < jl; j ++ ) {
  23314. var currentUrl = url[ j ];
  23315. var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( currentUrl ) ? currentUrl : scope.texturePath + currentUrl;
  23316. images[ image.uuid ].push( loadImage( path ) );
  23317. }
  23318. } else {
  23319. // load single image
  23320. var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;
  23321. images[ image.uuid ] = loadImage( path );
  23322. }
  23323. }
  23324. }
  23325. return images;
  23326. },
  23327. parseTextures: function ( json, images ) {
  23328. function parseConstant( value, type ) {
  23329. if ( typeof value === 'number' ) return value;
  23330. console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );
  23331. return type[ value ];
  23332. }
  23333. var textures = {};
  23334. if ( json !== undefined ) {
  23335. for ( var i = 0, l = json.length; i < l; i ++ ) {
  23336. var data = json[ i ];
  23337. if ( data.image === undefined ) {
  23338. console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid );
  23339. }
  23340. if ( images[ data.image ] === undefined ) {
  23341. console.warn( 'THREE.ObjectLoader: Undefined image', data.image );
  23342. }
  23343. var texture;
  23344. if ( Array.isArray( images[ data.image ] ) ) {
  23345. texture = new CubeTexture( images[ data.image ] );
  23346. } else {
  23347. texture = new Texture( images[ data.image ] );
  23348. }
  23349. texture.needsUpdate = true;
  23350. texture.uuid = data.uuid;
  23351. if ( data.name !== undefined ) texture.name = data.name;
  23352. if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );
  23353. if ( data.offset !== undefined ) texture.offset.fromArray( data.offset );
  23354. if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );
  23355. if ( data.center !== undefined ) texture.center.fromArray( data.center );
  23356. if ( data.rotation !== undefined ) texture.rotation = data.rotation;
  23357. if ( data.wrap !== undefined ) {
  23358. texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );
  23359. texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );
  23360. }
  23361. if ( data.format !== undefined ) texture.format = data.format;
  23362. if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );
  23363. if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );
  23364. if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;
  23365. if ( data.flipY !== undefined ) texture.flipY = data.flipY;
  23366. textures[ data.uuid ] = texture;
  23367. }
  23368. }
  23369. return textures;
  23370. },
  23371. parseObject: function ( data, geometries, materials ) {
  23372. var object;
  23373. function getGeometry( name ) {
  23374. if ( geometries[ name ] === undefined ) {
  23375. console.warn( 'THREE.ObjectLoader: Undefined geometry', name );
  23376. }
  23377. return geometries[ name ];
  23378. }
  23379. function getMaterial( name ) {
  23380. if ( name === undefined ) return undefined;
  23381. if ( Array.isArray( name ) ) {
  23382. var array = [];
  23383. for ( var i = 0, l = name.length; i < l; i ++ ) {
  23384. var uuid = name[ i ];
  23385. if ( materials[ uuid ] === undefined ) {
  23386. console.warn( 'THREE.ObjectLoader: Undefined material', uuid );
  23387. }
  23388. array.push( materials[ uuid ] );
  23389. }
  23390. return array;
  23391. }
  23392. if ( materials[ name ] === undefined ) {
  23393. console.warn( 'THREE.ObjectLoader: Undefined material', name );
  23394. }
  23395. return materials[ name ];
  23396. }
  23397. switch ( data.type ) {
  23398. case 'Scene':
  23399. object = new Scene();
  23400. if ( data.background !== undefined ) {
  23401. if ( Number.isInteger( data.background ) ) {
  23402. object.background = new Color( data.background );
  23403. }
  23404. }
  23405. if ( data.fog !== undefined ) {
  23406. if ( data.fog.type === 'Fog' ) {
  23407. object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );
  23408. } else if ( data.fog.type === 'FogExp2' ) {
  23409. object.fog = new FogExp2( data.fog.color, data.fog.density );
  23410. }
  23411. }
  23412. break;
  23413. case 'PerspectiveCamera':
  23414. object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );
  23415. if ( data.focus !== undefined ) object.focus = data.focus;
  23416. if ( data.zoom !== undefined ) object.zoom = data.zoom;
  23417. if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;
  23418. if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;
  23419. if ( data.view !== undefined ) object.view = Object.assign( {}, data.view );
  23420. break;
  23421. case 'OrthographicCamera':
  23422. object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );
  23423. if ( data.zoom !== undefined ) object.zoom = data.zoom;
  23424. if ( data.view !== undefined ) object.view = Object.assign( {}, data.view );
  23425. break;
  23426. case 'AmbientLight':
  23427. object = new AmbientLight( data.color, data.intensity );
  23428. break;
  23429. case 'DirectionalLight':
  23430. object = new DirectionalLight( data.color, data.intensity );
  23431. break;
  23432. case 'PointLight':
  23433. object = new PointLight( data.color, data.intensity, data.distance, data.decay );
  23434. break;
  23435. case 'RectAreaLight':
  23436. object = new RectAreaLight( data.color, data.intensity, data.width, data.height );
  23437. break;
  23438. case 'SpotLight':
  23439. object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );
  23440. break;
  23441. case 'HemisphereLight':
  23442. object = new HemisphereLight( data.color, data.groundColor, data.intensity );
  23443. break;
  23444. case 'SkinnedMesh':
  23445. console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' );
  23446. case 'Mesh':
  23447. var geometry = getGeometry( data.geometry );
  23448. var material = getMaterial( data.material );
  23449. if ( geometry.bones && geometry.bones.length > 0 ) {
  23450. object = new SkinnedMesh( geometry, material );
  23451. } else {
  23452. object = new Mesh( geometry, material );
  23453. }
  23454. break;
  23455. case 'LOD':
  23456. object = new LOD();
  23457. break;
  23458. case 'Line':
  23459. object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );
  23460. break;
  23461. case 'LineLoop':
  23462. object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );
  23463. break;
  23464. case 'LineSegments':
  23465. object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );
  23466. break;
  23467. case 'PointCloud':
  23468. case 'Points':
  23469. object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );
  23470. break;
  23471. case 'Sprite':
  23472. object = new Sprite( getMaterial( data.material ) );
  23473. break;
  23474. case 'Group':
  23475. object = new Group();
  23476. break;
  23477. default:
  23478. object = new Object3D();
  23479. }
  23480. object.uuid = data.uuid;
  23481. if ( data.name !== undefined ) object.name = data.name;
  23482. if ( data.matrix !== undefined ) {
  23483. object.matrix.fromArray( data.matrix );
  23484. if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;
  23485. if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );
  23486. } else {
  23487. if ( data.position !== undefined ) object.position.fromArray( data.position );
  23488. if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );
  23489. if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );
  23490. if ( data.scale !== undefined ) object.scale.fromArray( data.scale );
  23491. }
  23492. if ( data.castShadow !== undefined ) object.castShadow = data.castShadow;
  23493. if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;
  23494. if ( data.shadow ) {
  23495. if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;
  23496. if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;
  23497. if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );
  23498. if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );
  23499. }
  23500. if ( data.visible !== undefined ) object.visible = data.visible;
  23501. if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;
  23502. if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;
  23503. if ( data.userData !== undefined ) object.userData = data.userData;
  23504. if ( data.layers !== undefined ) object.layers.mask = data.layers;
  23505. if ( data.children !== undefined ) {
  23506. var children = data.children;
  23507. for ( var i = 0; i < children.length; i ++ ) {
  23508. object.add( this.parseObject( children[ i ], geometries, materials ) );
  23509. }
  23510. }
  23511. if ( data.type === 'LOD' ) {
  23512. var levels = data.levels;
  23513. for ( var l = 0; l < levels.length; l ++ ) {
  23514. var level = levels[ l ];
  23515. var child = object.getObjectByProperty( 'uuid', level.object );
  23516. if ( child !== undefined ) {
  23517. object.addLevel( child, level.distance );
  23518. }
  23519. }
  23520. }
  23521. return object;
  23522. }
  23523. } );
  23524. var TEXTURE_MAPPING = {
  23525. UVMapping: UVMapping,
  23526. CubeReflectionMapping: CubeReflectionMapping,
  23527. CubeRefractionMapping: CubeRefractionMapping,
  23528. EquirectangularReflectionMapping: EquirectangularReflectionMapping,
  23529. EquirectangularRefractionMapping: EquirectangularRefractionMapping,
  23530. SphericalReflectionMapping: SphericalReflectionMapping,
  23531. CubeUVReflectionMapping: CubeUVReflectionMapping,
  23532. CubeUVRefractionMapping: CubeUVRefractionMapping
  23533. };
  23534. var TEXTURE_WRAPPING = {
  23535. RepeatWrapping: RepeatWrapping,
  23536. ClampToEdgeWrapping: ClampToEdgeWrapping,
  23537. MirroredRepeatWrapping: MirroredRepeatWrapping
  23538. };
  23539. var TEXTURE_FILTER = {
  23540. NearestFilter: NearestFilter,
  23541. NearestMipMapNearestFilter: NearestMipMapNearestFilter,
  23542. NearestMipMapLinearFilter: NearestMipMapLinearFilter,
  23543. LinearFilter: LinearFilter,
  23544. LinearMipMapNearestFilter: LinearMipMapNearestFilter,
  23545. LinearMipMapLinearFilter: LinearMipMapLinearFilter
  23546. };
  23547. /**
  23548. * @author thespite / http://clicktorelease.com/
  23549. */
  23550. function ImageBitmapLoader( manager ) {
  23551. if ( typeof createImageBitmap === 'undefined' ) {
  23552. console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );
  23553. }
  23554. if ( typeof fetch === 'undefined' ) {
  23555. console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );
  23556. }
  23557. this.manager = manager !== undefined ? manager : DefaultLoadingManager;
  23558. this.options = undefined;
  23559. }
  23560. ImageBitmapLoader.prototype = {
  23561. constructor: ImageBitmapLoader,
  23562. setOptions: function setOptions( options ) {
  23563. this.options = options;
  23564. return this;
  23565. },
  23566. load: function ( url, onLoad, onProgress, onError ) {
  23567. if ( url === undefined ) url = '';
  23568. if ( this.path !== undefined ) url = this.path + url;
  23569. url = this.manager.resolveURL( url );
  23570. var scope = this;
  23571. var cached = Cache.get( url );
  23572. if ( cached !== undefined ) {
  23573. scope.manager.itemStart( url );
  23574. setTimeout( function () {
  23575. if ( onLoad ) onLoad( cached );
  23576. scope.manager.itemEnd( url );
  23577. }, 0 );
  23578. return cached;
  23579. }
  23580. fetch( url ).then( function ( res ) {
  23581. return res.blob();
  23582. } ).then( function ( blob ) {
  23583. return createImageBitmap( blob, scope.options );
  23584. } ).then( function ( imageBitmap ) {
  23585. Cache.add( url, imageBitmap );
  23586. if ( onLoad ) onLoad( imageBitmap );
  23587. scope.manager.itemEnd( url );
  23588. } ).catch( function ( e ) {
  23589. if ( onError ) onError( e );
  23590. scope.manager.itemEnd( url );
  23591. scope.manager.itemError( url );
  23592. } );
  23593. },
  23594. setCrossOrigin: function ( /* value */ ) {
  23595. return this;
  23596. },
  23597. setPath: function ( value ) {
  23598. this.path = value;
  23599. return this;
  23600. }
  23601. };
  23602. /**
  23603. * @author zz85 / http://www.lab4games.net/zz85/blog
  23604. * minimal class for proxing functions to Path. Replaces old "extractSubpaths()"
  23605. **/
  23606. function ShapePath() {
  23607. this.type = 'ShapePath';
  23608. this.color = new Color();
  23609. this.subPaths = [];
  23610. this.currentPath = null;
  23611. }
  23612. Object.assign( ShapePath.prototype, {
  23613. moveTo: function ( x, y ) {
  23614. this.currentPath = new Path();
  23615. this.subPaths.push( this.currentPath );
  23616. this.currentPath.moveTo( x, y );
  23617. },
  23618. lineTo: function ( x, y ) {
  23619. this.currentPath.lineTo( x, y );
  23620. },
  23621. quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {
  23622. this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );
  23623. },
  23624. bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {
  23625. this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );
  23626. },
  23627. splineThru: function ( pts ) {
  23628. this.currentPath.splineThru( pts );
  23629. },
  23630. toShapes: function ( isCCW, noHoles ) {
  23631. function toShapesNoHoles( inSubpaths ) {
  23632. var shapes = [];
  23633. for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {
  23634. var tmpPath = inSubpaths[ i ];
  23635. var tmpShape = new Shape();
  23636. tmpShape.curves = tmpPath.curves;
  23637. shapes.push( tmpShape );
  23638. }
  23639. return shapes;
  23640. }
  23641. function isPointInsidePolygon( inPt, inPolygon ) {
  23642. var polyLen = inPolygon.length;
  23643. // inPt on polygon contour => immediate success or
  23644. // toggling of inside/outside at every single! intersection point of an edge
  23645. // with the horizontal line through inPt, left of inPt
  23646. // not counting lowerY endpoints of edges and whole edges on that line
  23647. var inside = false;
  23648. for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {
  23649. var edgeLowPt = inPolygon[ p ];
  23650. var edgeHighPt = inPolygon[ q ];
  23651. var edgeDx = edgeHighPt.x - edgeLowPt.x;
  23652. var edgeDy = edgeHighPt.y - edgeLowPt.y;
  23653. if ( Math.abs( edgeDy ) > Number.EPSILON ) {
  23654. // not parallel
  23655. if ( edgeDy < 0 ) {
  23656. edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;
  23657. edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;
  23658. }
  23659. if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue;
  23660. if ( inPt.y === edgeLowPt.y ) {
  23661. if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ?
  23662. // continue; // no intersection or edgeLowPt => doesn't count !!!
  23663. } else {
  23664. var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );
  23665. if ( perpEdge === 0 ) return true; // inPt is on contour ?
  23666. if ( perpEdge < 0 ) continue;
  23667. inside = ! inside; // true intersection left of inPt
  23668. }
  23669. } else {
  23670. // parallel or collinear
  23671. if ( inPt.y !== edgeLowPt.y ) continue; // parallel
  23672. // edge lies on the same horizontal line as inPt
  23673. if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||
  23674. ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour !
  23675. // continue;
  23676. }
  23677. }
  23678. return inside;
  23679. }
  23680. var isClockWise = ShapeUtils.isClockWise;
  23681. var subPaths = this.subPaths;
  23682. if ( subPaths.length === 0 ) return [];
  23683. if ( noHoles === true ) return toShapesNoHoles( subPaths );
  23684. var solid, tmpPath, tmpShape, shapes = [];
  23685. if ( subPaths.length === 1 ) {
  23686. tmpPath = subPaths[ 0 ];
  23687. tmpShape = new Shape();
  23688. tmpShape.curves = tmpPath.curves;
  23689. shapes.push( tmpShape );
  23690. return shapes;
  23691. }
  23692. var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );
  23693. holesFirst = isCCW ? ! holesFirst : holesFirst;
  23694. // console.log("Holes first", holesFirst);
  23695. var betterShapeHoles = [];
  23696. var newShapes = [];
  23697. var newShapeHoles = [];
  23698. var mainIdx = 0;
  23699. var tmpPoints;
  23700. newShapes[ mainIdx ] = undefined;
  23701. newShapeHoles[ mainIdx ] = [];
  23702. for ( var i = 0, l = subPaths.length; i < l; i ++ ) {
  23703. tmpPath = subPaths[ i ];
  23704. tmpPoints = tmpPath.getPoints();
  23705. solid = isClockWise( tmpPoints );
  23706. solid = isCCW ? ! solid : solid;
  23707. if ( solid ) {
  23708. if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++;
  23709. newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };
  23710. newShapes[ mainIdx ].s.curves = tmpPath.curves;
  23711. if ( holesFirst ) mainIdx ++;
  23712. newShapeHoles[ mainIdx ] = [];
  23713. //console.log('cw', i);
  23714. } else {
  23715. newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );
  23716. //console.log('ccw', i);
  23717. }
  23718. }
  23719. // only Holes? -> probably all Shapes with wrong orientation
  23720. if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths );
  23721. if ( newShapes.length > 1 ) {
  23722. var ambiguous = false;
  23723. var toChange = [];
  23724. for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
  23725. betterShapeHoles[ sIdx ] = [];
  23726. }
  23727. for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
  23728. var sho = newShapeHoles[ sIdx ];
  23729. for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {
  23730. var ho = sho[ hIdx ];
  23731. var hole_unassigned = true;
  23732. for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {
  23733. if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {
  23734. if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );
  23735. if ( hole_unassigned ) {
  23736. hole_unassigned = false;
  23737. betterShapeHoles[ s2Idx ].push( ho );
  23738. } else {
  23739. ambiguous = true;
  23740. }
  23741. }
  23742. }
  23743. if ( hole_unassigned ) {
  23744. betterShapeHoles[ sIdx ].push( ho );
  23745. }
  23746. }
  23747. }
  23748. // console.log("ambiguous: ", ambiguous);
  23749. if ( toChange.length > 0 ) {
  23750. // console.log("to change: ", toChange);
  23751. if ( ! ambiguous ) newShapeHoles = betterShapeHoles;
  23752. }
  23753. }
  23754. var tmpHoles;
  23755. for ( var i = 0, il = newShapes.length; i < il; i ++ ) {
  23756. tmpShape = newShapes[ i ].s;
  23757. shapes.push( tmpShape );
  23758. tmpHoles = newShapeHoles[ i ];
  23759. for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {
  23760. tmpShape.holes.push( tmpHoles[ j ].h );
  23761. }
  23762. }
  23763. //console.log("shape", shapes);
  23764. return shapes;
  23765. }
  23766. } );
  23767. /**
  23768. * @author zz85 / http://www.lab4games.net/zz85/blog
  23769. * @author mrdoob / http://mrdoob.com/
  23770. */
  23771. function Font( data ) {
  23772. this.type = 'Font';
  23773. this.data = data;
  23774. }
  23775. Object.assign( Font.prototype, {
  23776. isFont: true,
  23777. generateShapes: function ( text, size ) {
  23778. if ( size === undefined ) size = 100;
  23779. var shapes = [];
  23780. var paths = createPaths( text, size, this.data );
  23781. for ( var p = 0, pl = paths.length; p < pl; p ++ ) {
  23782. Array.prototype.push.apply( shapes, paths[ p ].toShapes() );
  23783. }
  23784. return shapes;
  23785. }
  23786. } );
  23787. function createPaths( text, size, data ) {
  23788. var chars = Array.from ? Array.from( text ) : String( text ).split( '' ); // see #13988
  23789. var scale = size / data.resolution;
  23790. var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;
  23791. var paths = [];
  23792. var offsetX = 0, offsetY = 0;
  23793. for ( var i = 0; i < chars.length; i ++ ) {
  23794. var char = chars[ i ];
  23795. if ( char === '\n' ) {
  23796. offsetX = 0;
  23797. offsetY -= line_height;
  23798. } else {
  23799. var ret = createPath( char, scale, offsetX, offsetY, data );
  23800. offsetX += ret.offsetX;
  23801. paths.push( ret.path );
  23802. }
  23803. }
  23804. return paths;
  23805. }
  23806. function createPath( char, scale, offsetX, offsetY, data ) {
  23807. var glyph = data.glyphs[ char ] || data.glyphs[ '?' ];
  23808. if ( ! glyph ) return;
  23809. var path = new ShapePath();
  23810. var x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;
  23811. if ( glyph.o ) {
  23812. var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );
  23813. for ( var i = 0, l = outline.length; i < l; ) {
  23814. var action = outline[ i ++ ];
  23815. switch ( action ) {
  23816. case 'm': // moveTo
  23817. x = outline[ i ++ ] * scale + offsetX;
  23818. y = outline[ i ++ ] * scale + offsetY;
  23819. path.moveTo( x, y );
  23820. break;
  23821. case 'l': // lineTo
  23822. x = outline[ i ++ ] * scale + offsetX;
  23823. y = outline[ i ++ ] * scale + offsetY;
  23824. path.lineTo( x, y );
  23825. break;
  23826. case 'q': // quadraticCurveTo
  23827. cpx = outline[ i ++ ] * scale + offsetX;
  23828. cpy = outline[ i ++ ] * scale + offsetY;
  23829. cpx1 = outline[ i ++ ] * scale + offsetX;
  23830. cpy1 = outline[ i ++ ] * scale + offsetY;
  23831. path.quadraticCurveTo( cpx1, cpy1, cpx, cpy );
  23832. break;
  23833. case 'b': // bezierCurveTo
  23834. cpx = outline[ i ++ ] * scale + offsetX;
  23835. cpy = outline[ i ++ ] * scale + offsetY;
  23836. cpx1 = outline[ i ++ ] * scale + offsetX;
  23837. cpy1 = outline[ i ++ ] * scale + offsetY;
  23838. cpx2 = outline[ i ++ ] * scale + offsetX;
  23839. cpy2 = outline[ i ++ ] * scale + offsetY;
  23840. path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );
  23841. break;
  23842. }
  23843. }
  23844. }
  23845. return { offsetX: glyph.ha * scale, path: path };
  23846. }
  23847. /**
  23848. * @author mrdoob / http://mrdoob.com/
  23849. */
  23850. function FontLoader( manager ) {
  23851. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  23852. }
  23853. Object.assign( FontLoader.prototype, {
  23854. load: function ( url, onLoad, onProgress, onError ) {
  23855. var scope = this;
  23856. var loader = new FileLoader( this.manager );
  23857. loader.setPath( this.path );
  23858. loader.load( url, function ( text ) {
  23859. var json;
  23860. try {
  23861. json = JSON.parse( text );
  23862. } catch ( e ) {
  23863. console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );
  23864. json = JSON.parse( text.substring( 65, text.length - 2 ) );
  23865. }
  23866. var font = scope.parse( json );
  23867. if ( onLoad ) onLoad( font );
  23868. }, onProgress, onError );
  23869. },
  23870. parse: function ( json ) {
  23871. return new Font( json );
  23872. },
  23873. setPath: function ( value ) {
  23874. this.path = value;
  23875. return this;
  23876. }
  23877. } );
  23878. /**
  23879. * @author mrdoob / http://mrdoob.com/
  23880. */
  23881. var context;
  23882. var AudioContext = {
  23883. getContext: function () {
  23884. if ( context === undefined ) {
  23885. context = new ( window.AudioContext || window.webkitAudioContext )();
  23886. }
  23887. return context;
  23888. },
  23889. setContext: function ( value ) {
  23890. context = value;
  23891. }
  23892. };
  23893. /**
  23894. * @author Reece Aaron Lecrivain / http://reecenotes.com/
  23895. */
  23896. function AudioLoader( manager ) {
  23897. this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
  23898. }
  23899. Object.assign( AudioLoader.prototype, {
  23900. load: function ( url, onLoad, onProgress, onError ) {
  23901. var loader = new FileLoader( this.manager );
  23902. loader.setResponseType( 'arraybuffer' );
  23903. loader.load( url, function ( buffer ) {
  23904. // Create a copy of the buffer. The `decodeAudioData` method
  23905. // detaches the buffer when complete, preventing reuse.
  23906. var bufferCopy = buffer.slice( 0 );
  23907. var context = AudioContext.getContext();
  23908. context.decodeAudioData( bufferCopy, function ( audioBuffer ) {
  23909. onLoad( audioBuffer );
  23910. } );
  23911. }, onProgress, onError );
  23912. }
  23913. } );
  23914. /**
  23915. * @author mrdoob / http://mrdoob.com/
  23916. */
  23917. function StereoCamera() {
  23918. this.type = 'StereoCamera';
  23919. this.aspect = 1;
  23920. this.eyeSep = 0.064;
  23921. this.cameraL = new PerspectiveCamera();
  23922. this.cameraL.layers.enable( 1 );
  23923. this.cameraL.matrixAutoUpdate = false;
  23924. this.cameraR = new PerspectiveCamera();
  23925. this.cameraR.layers.enable( 2 );
  23926. this.cameraR.matrixAutoUpdate = false;
  23927. }
  23928. Object.assign( StereoCamera.prototype, {
  23929. update: ( function () {
  23930. var instance, focus, fov, aspect, near, far, zoom, eyeSep;
  23931. var eyeRight = new Matrix4();
  23932. var eyeLeft = new Matrix4();
  23933. return function update( camera ) {
  23934. var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||
  23935. aspect !== camera.aspect * this.aspect || near !== camera.near ||
  23936. far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep;
  23937. if ( needsUpdate ) {
  23938. instance = this;
  23939. focus = camera.focus;
  23940. fov = camera.fov;
  23941. aspect = camera.aspect * this.aspect;
  23942. near = camera.near;
  23943. far = camera.far;
  23944. zoom = camera.zoom;
  23945. // Off-axis stereoscopic effect based on
  23946. // http://paulbourke.net/stereographics/stereorender/
  23947. var projectionMatrix = camera.projectionMatrix.clone();
  23948. eyeSep = this.eyeSep / 2;
  23949. var eyeSepOnProjection = eyeSep * near / focus;
  23950. var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;
  23951. var xmin, xmax;
  23952. // translate xOffset
  23953. eyeLeft.elements[ 12 ] = - eyeSep;
  23954. eyeRight.elements[ 12 ] = eyeSep;
  23955. // for left eye
  23956. xmin = - ymax * aspect + eyeSepOnProjection;
  23957. xmax = ymax * aspect + eyeSepOnProjection;
  23958. projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );
  23959. projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
  23960. this.cameraL.projectionMatrix.copy( projectionMatrix );
  23961. // for right eye
  23962. xmin = - ymax * aspect - eyeSepOnProjection;
  23963. xmax = ymax * aspect - eyeSepOnProjection;
  23964. projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );
  23965. projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
  23966. this.cameraR.projectionMatrix.copy( projectionMatrix );
  23967. }
  23968. this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );
  23969. this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );
  23970. };
  23971. } )()
  23972. } );
  23973. /**
  23974. * Camera for rendering cube maps
  23975. * - renders scene into axis-aligned cube
  23976. *
  23977. * @author alteredq / http://alteredqualia.com/
  23978. */
  23979. function CubeCamera( near, far, cubeResolution ) {
  23980. Object3D.call( this );
  23981. this.type = 'CubeCamera';
  23982. var fov = 90, aspect = 1;
  23983. var cameraPX = new PerspectiveCamera( fov, aspect, near, far );
  23984. cameraPX.up.set( 0, - 1, 0 );
  23985. cameraPX.lookAt( new Vector3( 1, 0, 0 ) );
  23986. this.add( cameraPX );
  23987. var cameraNX = new PerspectiveCamera( fov, aspect, near, far );
  23988. cameraNX.up.set( 0, - 1, 0 );
  23989. cameraNX.lookAt( new Vector3( - 1, 0, 0 ) );
  23990. this.add( cameraNX );
  23991. var cameraPY = new PerspectiveCamera( fov, aspect, near, far );
  23992. cameraPY.up.set( 0, 0, 1 );
  23993. cameraPY.lookAt( new Vector3( 0, 1, 0 ) );
  23994. this.add( cameraPY );
  23995. var cameraNY = new PerspectiveCamera( fov, aspect, near, far );
  23996. cameraNY.up.set( 0, 0, - 1 );
  23997. cameraNY.lookAt( new Vector3( 0, - 1, 0 ) );
  23998. this.add( cameraNY );
  23999. var cameraPZ = new PerspectiveCamera( fov, aspect, near, far );
  24000. cameraPZ.up.set( 0, - 1, 0 );
  24001. cameraPZ.lookAt( new Vector3( 0, 0, 1 ) );
  24002. this.add( cameraPZ );
  24003. var cameraNZ = new PerspectiveCamera( fov, aspect, near, far );
  24004. cameraNZ.up.set( 0, - 1, 0 );
  24005. cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );
  24006. this.add( cameraNZ );
  24007. var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };
  24008. this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );
  24009. this.renderTarget.texture.name = "CubeCamera";
  24010. this.update = function ( renderer, scene ) {
  24011. if ( this.parent === null ) this.updateMatrixWorld();
  24012. var renderTarget = this.renderTarget;
  24013. var generateMipmaps = renderTarget.texture.generateMipmaps;
  24014. renderTarget.texture.generateMipmaps = false;
  24015. renderTarget.activeCubeFace = 0;
  24016. renderer.render( scene, cameraPX, renderTarget );
  24017. renderTarget.activeCubeFace = 1;
  24018. renderer.render( scene, cameraNX, renderTarget );
  24019. renderTarget.activeCubeFace = 2;
  24020. renderer.render( scene, cameraPY, renderTarget );
  24021. renderTarget.activeCubeFace = 3;
  24022. renderer.render( scene, cameraNY, renderTarget );
  24023. renderTarget.activeCubeFace = 4;
  24024. renderer.render( scene, cameraPZ, renderTarget );
  24025. renderTarget.texture.generateMipmaps = generateMipmaps;
  24026. renderTarget.activeCubeFace = 5;
  24027. renderer.render( scene, cameraNZ, renderTarget );
  24028. renderer.setRenderTarget( null );
  24029. };
  24030. this.clear = function ( renderer, color, depth, stencil ) {
  24031. var renderTarget = this.renderTarget;
  24032. for ( var i = 0; i < 6; i ++ ) {
  24033. renderTarget.activeCubeFace = i;
  24034. renderer.setRenderTarget( renderTarget );
  24035. renderer.clear( color, depth, stencil );
  24036. }
  24037. renderer.setRenderTarget( null );
  24038. };
  24039. }
  24040. CubeCamera.prototype = Object.create( Object3D.prototype );
  24041. CubeCamera.prototype.constructor = CubeCamera;
  24042. /**
  24043. * @author mrdoob / http://mrdoob.com/
  24044. */
  24045. function AudioListener() {
  24046. Object3D.call( this );
  24047. this.type = 'AudioListener';
  24048. this.context = AudioContext.getContext();
  24049. this.gain = this.context.createGain();
  24050. this.gain.connect( this.context.destination );
  24051. this.filter = null;
  24052. }
  24053. AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
  24054. constructor: AudioListener,
  24055. getInput: function () {
  24056. return this.gain;
  24057. },
  24058. removeFilter: function ( ) {
  24059. if ( this.filter !== null ) {
  24060. this.gain.disconnect( this.filter );
  24061. this.filter.disconnect( this.context.destination );
  24062. this.gain.connect( this.context.destination );
  24063. this.filter = null;
  24064. }
  24065. return this;
  24066. },
  24067. getFilter: function () {
  24068. return this.filter;
  24069. },
  24070. setFilter: function ( value ) {
  24071. if ( this.filter !== null ) {
  24072. this.gain.disconnect( this.filter );
  24073. this.filter.disconnect( this.context.destination );
  24074. } else {
  24075. this.gain.disconnect( this.context.destination );
  24076. }
  24077. this.filter = value;
  24078. this.gain.connect( this.filter );
  24079. this.filter.connect( this.context.destination );
  24080. return this;
  24081. },
  24082. getMasterVolume: function () {
  24083. return this.gain.gain.value;
  24084. },
  24085. setMasterVolume: function ( value ) {
  24086. this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );
  24087. return this;
  24088. },
  24089. updateMatrixWorld: ( function () {
  24090. var position = new Vector3();
  24091. var quaternion = new Quaternion();
  24092. var scale = new Vector3();
  24093. var orientation = new Vector3();
  24094. return function updateMatrixWorld( force ) {
  24095. Object3D.prototype.updateMatrixWorld.call( this, force );
  24096. var listener = this.context.listener;
  24097. var up = this.up;
  24098. this.matrixWorld.decompose( position, quaternion, scale );
  24099. orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );
  24100. if ( listener.positionX ) {
  24101. listener.positionX.setValueAtTime( position.x, this.context.currentTime );
  24102. listener.positionY.setValueAtTime( position.y, this.context.currentTime );
  24103. listener.positionZ.setValueAtTime( position.z, this.context.currentTime );
  24104. listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );
  24105. listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );
  24106. listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );
  24107. listener.upX.setValueAtTime( up.x, this.context.currentTime );
  24108. listener.upY.setValueAtTime( up.y, this.context.currentTime );
  24109. listener.upZ.setValueAtTime( up.z, this.context.currentTime );
  24110. } else {
  24111. listener.setPosition( position.x, position.y, position.z );
  24112. listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );
  24113. }
  24114. };
  24115. } )()
  24116. } );
  24117. /**
  24118. * @author mrdoob / http://mrdoob.com/
  24119. * @author Reece Aaron Lecrivain / http://reecenotes.com/
  24120. */
  24121. function Audio( listener ) {
  24122. Object3D.call( this );
  24123. this.type = 'Audio';
  24124. this.context = listener.context;
  24125. this.gain = this.context.createGain();
  24126. this.gain.connect( listener.getInput() );
  24127. this.autoplay = false;
  24128. this.buffer = null;
  24129. this.loop = false;
  24130. this.startTime = 0;
  24131. this.offset = 0;
  24132. this.playbackRate = 1;
  24133. this.isPlaying = false;
  24134. this.hasPlaybackControl = true;
  24135. this.sourceType = 'empty';
  24136. this.filters = [];
  24137. }
  24138. Audio.prototype = Object.assign( Object.create( Object3D.prototype ), {
  24139. constructor: Audio,
  24140. getOutput: function () {
  24141. return this.gain;
  24142. },
  24143. setNodeSource: function ( audioNode ) {
  24144. this.hasPlaybackControl = false;
  24145. this.sourceType = 'audioNode';
  24146. this.source = audioNode;
  24147. this.connect();
  24148. return this;
  24149. },
  24150. setMediaElementSource: function ( mediaElement ) {
  24151. this.hasPlaybackControl = false;
  24152. this.sourceType = 'mediaNode';
  24153. this.source = this.context.createMediaElementSource( mediaElement );
  24154. this.connect();
  24155. return this;
  24156. },
  24157. setBuffer: function ( audioBuffer ) {
  24158. this.buffer = audioBuffer;
  24159. this.sourceType = 'buffer';
  24160. if ( this.autoplay ) this.play();
  24161. return this;
  24162. },
  24163. play: function () {
  24164. if ( this.isPlaying === true ) {
  24165. console.warn( 'THREE.Audio: Audio is already playing.' );
  24166. return;
  24167. }
  24168. if ( this.hasPlaybackControl === false ) {
  24169. console.warn( 'THREE.Audio: this Audio has no playback control.' );
  24170. return;
  24171. }
  24172. var source = this.context.createBufferSource();
  24173. source.buffer = this.buffer;
  24174. source.loop = this.loop;
  24175. source.onended = this.onEnded.bind( this );
  24176. source.playbackRate.setValueAtTime( this.playbackRate, this.startTime );
  24177. this.startTime = this.context.currentTime;
  24178. source.start( this.startTime, this.offset );
  24179. this.isPlaying = true;
  24180. this.source = source;
  24181. return this.connect();
  24182. },
  24183. pause: function () {
  24184. if ( this.hasPlaybackControl === false ) {
  24185. console.warn( 'THREE.Audio: this Audio has no playback control.' );
  24186. return;
  24187. }
  24188. if ( this.isPlaying === true ) {
  24189. this.source.stop();
  24190. this.source.onended = null;
  24191. this.offset += ( this.context.currentTime - this.startTime ) * this.playbackRate;
  24192. this.isPlaying = false;
  24193. }
  24194. return this;
  24195. },
  24196. stop: function () {
  24197. if ( this.hasPlaybackControl === false ) {
  24198. console.warn( 'THREE.Audio: this Audio has no playback control.' );
  24199. return;
  24200. }
  24201. this.source.stop();
  24202. this.source.onended = null;
  24203. this.offset = 0;
  24204. this.isPlaying = false;
  24205. return this;
  24206. },
  24207. connect: function () {
  24208. if ( this.filters.length > 0 ) {
  24209. this.source.connect( this.filters[ 0 ] );
  24210. for ( var i = 1, l = this.filters.length; i < l; i ++ ) {
  24211. this.filters[ i - 1 ].connect( this.filters[ i ] );
  24212. }
  24213. this.filters[ this.filters.length - 1 ].connect( this.getOutput() );
  24214. } else {
  24215. this.source.connect( this.getOutput() );
  24216. }
  24217. return this;
  24218. },
  24219. disconnect: function () {
  24220. if ( this.filters.length > 0 ) {
  24221. this.source.disconnect( this.filters[ 0 ] );
  24222. for ( var i = 1, l = this.filters.length; i < l; i ++ ) {
  24223. this.filters[ i - 1 ].disconnect( this.filters[ i ] );
  24224. }
  24225. this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );
  24226. } else {
  24227. this.source.disconnect( this.getOutput() );
  24228. }
  24229. return this;
  24230. },
  24231. getFilters: function () {
  24232. return this.filters;
  24233. },
  24234. setFilters: function ( value ) {
  24235. if ( ! value ) value = [];
  24236. if ( this.isPlaying === true ) {
  24237. this.disconnect();
  24238. this.filters = value;
  24239. this.connect();
  24240. } else {
  24241. this.filters = value;
  24242. }
  24243. return this;
  24244. },
  24245. getFilter: function () {
  24246. return this.getFilters()[ 0 ];
  24247. },
  24248. setFilter: function ( filter ) {
  24249. return this.setFilters( filter ? [ filter ] : [] );
  24250. },
  24251. setPlaybackRate: function ( value ) {
  24252. if ( this.hasPlaybackControl === false ) {
  24253. console.warn( 'THREE.Audio: this Audio has no playback control.' );
  24254. return;
  24255. }
  24256. this.playbackRate = value;
  24257. if ( this.isPlaying === true ) {
  24258. this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );
  24259. }
  24260. return this;
  24261. },
  24262. getPlaybackRate: function () {
  24263. return this.playbackRate;
  24264. },
  24265. onEnded: function () {
  24266. this.isPlaying = false;
  24267. },
  24268. getLoop: function () {
  24269. if ( this.hasPlaybackControl === false ) {
  24270. console.warn( 'THREE.Audio: this Audio has no playback control.' );
  24271. return false;
  24272. }
  24273. return this.loop;
  24274. },
  24275. setLoop: function ( value ) {
  24276. if ( this.hasPlaybackControl === false ) {
  24277. console.warn( 'THREE.Audio: this Audio has no playback control.' );
  24278. return;
  24279. }
  24280. this.loop = value;
  24281. if ( this.isPlaying === true ) {
  24282. this.source.loop = this.loop;
  24283. }
  24284. return this;
  24285. },
  24286. getVolume: function () {
  24287. return this.gain.gain.value;
  24288. },
  24289. setVolume: function ( value ) {
  24290. this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );
  24291. return this;
  24292. }
  24293. } );
  24294. /**
  24295. * @author mrdoob / http://mrdoob.com/
  24296. */
  24297. function PositionalAudio( listener ) {
  24298. Audio.call( this, listener );
  24299. this.panner = this.context.createPanner();
  24300. this.panner.connect( this.gain );
  24301. }
  24302. PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {
  24303. constructor: PositionalAudio,
  24304. getOutput: function () {
  24305. return this.panner;
  24306. },
  24307. getRefDistance: function () {
  24308. return this.panner.refDistance;
  24309. },
  24310. setRefDistance: function ( value ) {
  24311. this.panner.refDistance = value;
  24312. return this;
  24313. },
  24314. getRolloffFactor: function () {
  24315. return this.panner.rolloffFactor;
  24316. },
  24317. setRolloffFactor: function ( value ) {
  24318. this.panner.rolloffFactor = value;
  24319. return this;
  24320. },
  24321. getDistanceModel: function () {
  24322. return this.panner.distanceModel;
  24323. },
  24324. setDistanceModel: function ( value ) {
  24325. this.panner.distanceModel = value;
  24326. return this;
  24327. },
  24328. getMaxDistance: function () {
  24329. return this.panner.maxDistance;
  24330. },
  24331. setMaxDistance: function ( value ) {
  24332. this.panner.maxDistance = value;
  24333. return this;
  24334. },
  24335. setDirectionalCone: function ( coneInnerAngle, coneOuterAngle, coneOuterGain ) {
  24336. this.panner.coneInnerAngle = coneInnerAngle;
  24337. this.panner.coneOuterAngle = coneOuterAngle;
  24338. this.panner.coneOuterGain = coneOuterGain;
  24339. return this;
  24340. },
  24341. updateMatrixWorld: ( function () {
  24342. var position = new Vector3();
  24343. var quaternion = new Quaternion();
  24344. var scale = new Vector3();
  24345. var orientation = new Vector3();
  24346. return function updateMatrixWorld( force ) {
  24347. Object3D.prototype.updateMatrixWorld.call( this, force );
  24348. var panner = this.panner;
  24349. this.matrixWorld.decompose( position, quaternion, scale );
  24350. orientation.set( 0, 0, 1 ).applyQuaternion( quaternion );
  24351. panner.setPosition( position.x, position.y, position.z );
  24352. panner.setOrientation( orientation.x, orientation.y, orientation.z );
  24353. };
  24354. } )()
  24355. } );
  24356. /**
  24357. * @author mrdoob / http://mrdoob.com/
  24358. */
  24359. function AudioAnalyser( audio, fftSize ) {
  24360. this.analyser = audio.context.createAnalyser();
  24361. this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;
  24362. this.data = new Uint8Array( this.analyser.frequencyBinCount );
  24363. audio.getOutput().connect( this.analyser );
  24364. }
  24365. Object.assign( AudioAnalyser.prototype, {
  24366. getFrequencyData: function () {
  24367. this.analyser.getByteFrequencyData( this.data );
  24368. return this.data;
  24369. },
  24370. getAverageFrequency: function () {
  24371. var value = 0, data = this.getFrequencyData();
  24372. for ( var i = 0; i < data.length; i ++ ) {
  24373. value += data[ i ];
  24374. }
  24375. return value / data.length;
  24376. }
  24377. } );
  24378. /**
  24379. *
  24380. * Buffered scene graph property that allows weighted accumulation.
  24381. *
  24382. *
  24383. * @author Ben Houston / http://clara.io/
  24384. * @author David Sarno / http://lighthaus.us/
  24385. * @author tschw
  24386. */
  24387. function PropertyMixer( binding, typeName, valueSize ) {
  24388. this.binding = binding;
  24389. this.valueSize = valueSize;
  24390. var bufferType = Float64Array,
  24391. mixFunction;
  24392. switch ( typeName ) {
  24393. case 'quaternion':
  24394. mixFunction = this._slerp;
  24395. break;
  24396. case 'string':
  24397. case 'bool':
  24398. bufferType = Array;
  24399. mixFunction = this._select;
  24400. break;
  24401. default:
  24402. mixFunction = this._lerp;
  24403. }
  24404. this.buffer = new bufferType( valueSize * 4 );
  24405. // layout: [ incoming | accu0 | accu1 | orig ]
  24406. //
  24407. // interpolators can use .buffer as their .result
  24408. // the data then goes to 'incoming'
  24409. //
  24410. // 'accu0' and 'accu1' are used frame-interleaved for
  24411. // the cumulative result and are compared to detect
  24412. // changes
  24413. //
  24414. // 'orig' stores the original state of the property
  24415. this._mixBufferRegion = mixFunction;
  24416. this.cumulativeWeight = 0;
  24417. this.useCount = 0;
  24418. this.referenceCount = 0;
  24419. }
  24420. Object.assign( PropertyMixer.prototype, {
  24421. // accumulate data in the 'incoming' region into 'accu<i>'
  24422. accumulate: function ( accuIndex, weight ) {
  24423. // note: happily accumulating nothing when weight = 0, the caller knows
  24424. // the weight and shouldn't have made the call in the first place
  24425. var buffer = this.buffer,
  24426. stride = this.valueSize,
  24427. offset = accuIndex * stride + stride,
  24428. currentWeight = this.cumulativeWeight;
  24429. if ( currentWeight === 0 ) {
  24430. // accuN := incoming * weight
  24431. for ( var i = 0; i !== stride; ++ i ) {
  24432. buffer[ offset + i ] = buffer[ i ];
  24433. }
  24434. currentWeight = weight;
  24435. } else {
  24436. // accuN := accuN + incoming * weight
  24437. currentWeight += weight;
  24438. var mix = weight / currentWeight;
  24439. this._mixBufferRegion( buffer, offset, 0, mix, stride );
  24440. }
  24441. this.cumulativeWeight = currentWeight;
  24442. },
  24443. // apply the state of 'accu<i>' to the binding when accus differ
  24444. apply: function ( accuIndex ) {
  24445. var stride = this.valueSize,
  24446. buffer = this.buffer,
  24447. offset = accuIndex * stride + stride,
  24448. weight = this.cumulativeWeight,
  24449. binding = this.binding;
  24450. this.cumulativeWeight = 0;
  24451. if ( weight < 1 ) {
  24452. // accuN := accuN + original * ( 1 - cumulativeWeight )
  24453. var originalValueOffset = stride * 3;
  24454. this._mixBufferRegion(
  24455. buffer, offset, originalValueOffset, 1 - weight, stride );
  24456. }
  24457. for ( var i = stride, e = stride + stride; i !== e; ++ i ) {
  24458. if ( buffer[ i ] !== buffer[ i + stride ] ) {
  24459. // value has changed -> update scene graph
  24460. binding.setValue( buffer, offset );
  24461. break;
  24462. }
  24463. }
  24464. },
  24465. // remember the state of the bound property and copy it to both accus
  24466. saveOriginalState: function () {
  24467. var binding = this.binding;
  24468. var buffer = this.buffer,
  24469. stride = this.valueSize,
  24470. originalValueOffset = stride * 3;
  24471. binding.getValue( buffer, originalValueOffset );
  24472. // accu[0..1] := orig -- initially detect changes against the original
  24473. for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {
  24474. buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];
  24475. }
  24476. this.cumulativeWeight = 0;
  24477. },
  24478. // apply the state previously taken via 'saveOriginalState' to the binding
  24479. restoreOriginalState: function () {
  24480. var originalValueOffset = this.valueSize * 3;
  24481. this.binding.setValue( this.buffer, originalValueOffset );
  24482. },
  24483. // mix functions
  24484. _select: function ( buffer, dstOffset, srcOffset, t, stride ) {
  24485. if ( t >= 0.5 ) {
  24486. for ( var i = 0; i !== stride; ++ i ) {
  24487. buffer[ dstOffset + i ] = buffer[ srcOffset + i ];
  24488. }
  24489. }
  24490. },
  24491. _slerp: function ( buffer, dstOffset, srcOffset, t ) {
  24492. Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );
  24493. },
  24494. _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) {
  24495. var s = 1 - t;
  24496. for ( var i = 0; i !== stride; ++ i ) {
  24497. var j = dstOffset + i;
  24498. buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;
  24499. }
  24500. }
  24501. } );
  24502. /**
  24503. *
  24504. * A reference to a real property in the scene graph.
  24505. *
  24506. *
  24507. * @author Ben Houston / http://clara.io/
  24508. * @author David Sarno / http://lighthaus.us/
  24509. * @author tschw
  24510. */
  24511. // Characters [].:/ are reserved for track binding syntax.
  24512. var RESERVED_CHARS_RE = '\\[\\]\\.:\\/';
  24513. function Composite( targetGroup, path, optionalParsedPath ) {
  24514. var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );
  24515. this._targetGroup = targetGroup;
  24516. this._bindings = targetGroup.subscribe_( path, parsedPath );
  24517. }
  24518. Object.assign( Composite.prototype, {
  24519. getValue: function ( array, offset ) {
  24520. this.bind(); // bind all binding
  24521. var firstValidIndex = this._targetGroup.nCachedObjects_,
  24522. binding = this._bindings[ firstValidIndex ];
  24523. // and only call .getValue on the first
  24524. if ( binding !== undefined ) binding.getValue( array, offset );
  24525. },
  24526. setValue: function ( array, offset ) {
  24527. var bindings = this._bindings;
  24528. for ( var i = this._targetGroup.nCachedObjects_,
  24529. n = bindings.length; i !== n; ++ i ) {
  24530. bindings[ i ].setValue( array, offset );
  24531. }
  24532. },
  24533. bind: function () {
  24534. var bindings = this._bindings;
  24535. for ( var i = this._targetGroup.nCachedObjects_,
  24536. n = bindings.length; i !== n; ++ i ) {
  24537. bindings[ i ].bind();
  24538. }
  24539. },
  24540. unbind: function () {
  24541. var bindings = this._bindings;
  24542. for ( var i = this._targetGroup.nCachedObjects_,
  24543. n = bindings.length; i !== n; ++ i ) {
  24544. bindings[ i ].unbind();
  24545. }
  24546. }
  24547. } );
  24548. function PropertyBinding( rootNode, path, parsedPath ) {
  24549. this.path = path;
  24550. this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );
  24551. this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;
  24552. this.rootNode = rootNode;
  24553. }
  24554. Object.assign( PropertyBinding, {
  24555. Composite: Composite,
  24556. create: function ( root, path, parsedPath ) {
  24557. if ( ! ( root && root.isAnimationObjectGroup ) ) {
  24558. return new PropertyBinding( root, path, parsedPath );
  24559. } else {
  24560. return new PropertyBinding.Composite( root, path, parsedPath );
  24561. }
  24562. },
  24563. /**
  24564. * Replaces spaces with underscores and removes unsupported characters from
  24565. * node names, to ensure compatibility with parseTrackName().
  24566. *
  24567. * @param {string} name Node name to be sanitized.
  24568. * @return {string}
  24569. */
  24570. sanitizeNodeName: ( function () {
  24571. var reservedRe = new RegExp( '[' + RESERVED_CHARS_RE + ']', 'g' );
  24572. return function sanitizeNodeName( name ) {
  24573. return name.replace( /\s/g, '_' ).replace( reservedRe, '' );
  24574. };
  24575. }() ),
  24576. parseTrackName: function () {
  24577. // Attempts to allow node names from any language. ES5's `\w` regexp matches
  24578. // only latin characters, and the unicode \p{L} is not yet supported. So
  24579. // instead, we exclude reserved characters and match everything else.
  24580. var wordChar = '[^' + RESERVED_CHARS_RE + ']';
  24581. var wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace( '\\.', '' ) + ']';
  24582. // Parent directories, delimited by '/' or ':'. Currently unused, but must
  24583. // be matched to parse the rest of the track name.
  24584. var directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', wordChar );
  24585. // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.
  24586. var nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot );
  24587. // Object on target node, and accessor. May not contain reserved
  24588. // characters. Accessor may contain any character except closing bracket.
  24589. var objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', wordChar );
  24590. // Property and accessor. May not contain reserved characters. Accessor may
  24591. // contain any non-bracket characters.
  24592. var propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', wordChar );
  24593. var trackRe = new RegExp( ''
  24594. + '^'
  24595. + directoryRe
  24596. + nodeRe
  24597. + objectRe
  24598. + propertyRe
  24599. + '$'
  24600. );
  24601. var supportedObjectNames = [ 'material', 'materials', 'bones' ];
  24602. return function parseTrackName( trackName ) {
  24603. var matches = trackRe.exec( trackName );
  24604. if ( ! matches ) {
  24605. throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );
  24606. }
  24607. var results = {
  24608. // directoryName: matches[ 1 ], // (tschw) currently unused
  24609. nodeName: matches[ 2 ],
  24610. objectName: matches[ 3 ],
  24611. objectIndex: matches[ 4 ],
  24612. propertyName: matches[ 5 ], // required
  24613. propertyIndex: matches[ 6 ]
  24614. };
  24615. var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );
  24616. if ( lastDot !== undefined && lastDot !== - 1 ) {
  24617. var objectName = results.nodeName.substring( lastDot + 1 );
  24618. // Object names must be checked against a whitelist. Otherwise, there
  24619. // is no way to parse 'foo.bar.baz': 'baz' must be a property, but
  24620. // 'bar' could be the objectName, or part of a nodeName (which can
  24621. // include '.' characters).
  24622. if ( supportedObjectNames.indexOf( objectName ) !== - 1 ) {
  24623. results.nodeName = results.nodeName.substring( 0, lastDot );
  24624. results.objectName = objectName;
  24625. }
  24626. }
  24627. if ( results.propertyName === null || results.propertyName.length === 0 ) {
  24628. throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );
  24629. }
  24630. return results;
  24631. };
  24632. }(),
  24633. findNode: function ( root, nodeName ) {
  24634. if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {
  24635. return root;
  24636. }
  24637. // search into skeleton bones.
  24638. if ( root.skeleton ) {
  24639. var bone = root.skeleton.getBoneByName( nodeName );
  24640. if ( bone !== undefined ) {
  24641. return bone;
  24642. }
  24643. }
  24644. // search into node subtree.
  24645. if ( root.children ) {
  24646. var searchNodeSubtree = function ( children ) {
  24647. for ( var i = 0; i < children.length; i ++ ) {
  24648. var childNode = children[ i ];
  24649. if ( childNode.name === nodeName || childNode.uuid === nodeName ) {
  24650. return childNode;
  24651. }
  24652. var result = searchNodeSubtree( childNode.children );
  24653. if ( result ) return result;
  24654. }
  24655. return null;
  24656. };
  24657. var subTreeNode = searchNodeSubtree( root.children );
  24658. if ( subTreeNode ) {
  24659. return subTreeNode;
  24660. }
  24661. }
  24662. return null;
  24663. }
  24664. } );
  24665. Object.assign( PropertyBinding.prototype, { // prototype, continued
  24666. // these are used to "bind" a nonexistent property
  24667. _getValue_unavailable: function () {},
  24668. _setValue_unavailable: function () {},
  24669. BindingType: {
  24670. Direct: 0,
  24671. EntireArray: 1,
  24672. ArrayElement: 2,
  24673. HasFromToArray: 3
  24674. },
  24675. Versioning: {
  24676. None: 0,
  24677. NeedsUpdate: 1,
  24678. MatrixWorldNeedsUpdate: 2
  24679. },
  24680. GetterByBindingType: [
  24681. function getValue_direct( buffer, offset ) {
  24682. buffer[ offset ] = this.node[ this.propertyName ];
  24683. },
  24684. function getValue_array( buffer, offset ) {
  24685. var source = this.resolvedProperty;
  24686. for ( var i = 0, n = source.length; i !== n; ++ i ) {
  24687. buffer[ offset ++ ] = source[ i ];
  24688. }
  24689. },
  24690. function getValue_arrayElement( buffer, offset ) {
  24691. buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];
  24692. },
  24693. function getValue_toArray( buffer, offset ) {
  24694. this.resolvedProperty.toArray( buffer, offset );
  24695. }
  24696. ],
  24697. SetterByBindingTypeAndVersioning: [
  24698. [
  24699. // Direct
  24700. function setValue_direct( buffer, offset ) {
  24701. this.targetObject[ this.propertyName ] = buffer[ offset ];
  24702. },
  24703. function setValue_direct_setNeedsUpdate( buffer, offset ) {
  24704. this.targetObject[ this.propertyName ] = buffer[ offset ];
  24705. this.targetObject.needsUpdate = true;
  24706. },
  24707. function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {
  24708. this.targetObject[ this.propertyName ] = buffer[ offset ];
  24709. this.targetObject.matrixWorldNeedsUpdate = true;
  24710. }
  24711. ], [
  24712. // EntireArray
  24713. function setValue_array( buffer, offset ) {
  24714. var dest = this.resolvedProperty;
  24715. for ( var i = 0, n = dest.length; i !== n; ++ i ) {
  24716. dest[ i ] = buffer[ offset ++ ];
  24717. }
  24718. },
  24719. function setValue_array_setNeedsUpdate( buffer, offset ) {
  24720. var dest = this.resolvedProperty;
  24721. for ( var i = 0, n = dest.length; i !== n; ++ i ) {
  24722. dest[ i ] = buffer[ offset ++ ];
  24723. }
  24724. this.targetObject.needsUpdate = true;
  24725. },
  24726. function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {
  24727. var dest = this.resolvedProperty;
  24728. for ( var i = 0, n = dest.length; i !== n; ++ i ) {
  24729. dest[ i ] = buffer[ offset ++ ];
  24730. }
  24731. this.targetObject.matrixWorldNeedsUpdate = true;
  24732. }
  24733. ], [
  24734. // ArrayElement
  24735. function setValue_arrayElement( buffer, offset ) {
  24736. this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
  24737. },
  24738. function setValue_arrayElement_setNeedsUpdate( buffer, offset ) {
  24739. this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
  24740. this.targetObject.needsUpdate = true;
  24741. },
  24742. function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {
  24743. this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
  24744. this.targetObject.matrixWorldNeedsUpdate = true;
  24745. }
  24746. ], [
  24747. // HasToFromArray
  24748. function setValue_fromArray( buffer, offset ) {
  24749. this.resolvedProperty.fromArray( buffer, offset );
  24750. },
  24751. function setValue_fromArray_setNeedsUpdate( buffer, offset ) {
  24752. this.resolvedProperty.fromArray( buffer, offset );
  24753. this.targetObject.needsUpdate = true;
  24754. },
  24755. function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {
  24756. this.resolvedProperty.fromArray( buffer, offset );
  24757. this.targetObject.matrixWorldNeedsUpdate = true;
  24758. }
  24759. ]
  24760. ],
  24761. getValue: function getValue_unbound( targetArray, offset ) {
  24762. this.bind();
  24763. this.getValue( targetArray, offset );
  24764. // Note: This class uses a State pattern on a per-method basis:
  24765. // 'bind' sets 'this.getValue' / 'setValue' and shadows the
  24766. // prototype version of these methods with one that represents
  24767. // the bound state. When the property is not found, the methods
  24768. // become no-ops.
  24769. },
  24770. setValue: function getValue_unbound( sourceArray, offset ) {
  24771. this.bind();
  24772. this.setValue( sourceArray, offset );
  24773. },
  24774. // create getter / setter pair for a property in the scene graph
  24775. bind: function () {
  24776. var targetObject = this.node,
  24777. parsedPath = this.parsedPath,
  24778. objectName = parsedPath.objectName,
  24779. propertyName = parsedPath.propertyName,
  24780. propertyIndex = parsedPath.propertyIndex;
  24781. if ( ! targetObject ) {
  24782. targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;
  24783. this.node = targetObject;
  24784. }
  24785. // set fail state so we can just 'return' on error
  24786. this.getValue = this._getValue_unavailable;
  24787. this.setValue = this._setValue_unavailable;
  24788. // ensure there is a value node
  24789. if ( ! targetObject ) {
  24790. console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' );
  24791. return;
  24792. }
  24793. if ( objectName ) {
  24794. var objectIndex = parsedPath.objectIndex;
  24795. // special cases were we need to reach deeper into the hierarchy to get the face materials....
  24796. switch ( objectName ) {
  24797. case 'materials':
  24798. if ( ! targetObject.material ) {
  24799. console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );
  24800. return;
  24801. }
  24802. if ( ! targetObject.material.materials ) {
  24803. console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );
  24804. return;
  24805. }
  24806. targetObject = targetObject.material.materials;
  24807. break;
  24808. case 'bones':
  24809. if ( ! targetObject.skeleton ) {
  24810. console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );
  24811. return;
  24812. }
  24813. // potential future optimization: skip this if propertyIndex is already an integer
  24814. // and convert the integer string to a true integer.
  24815. targetObject = targetObject.skeleton.bones;
  24816. // support resolving morphTarget names into indices.
  24817. for ( var i = 0; i < targetObject.length; i ++ ) {
  24818. if ( targetObject[ i ].name === objectIndex ) {
  24819. objectIndex = i;
  24820. break;
  24821. }
  24822. }
  24823. break;
  24824. default:
  24825. if ( targetObject[ objectName ] === undefined ) {
  24826. console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );
  24827. return;
  24828. }
  24829. targetObject = targetObject[ objectName ];
  24830. }
  24831. if ( objectIndex !== undefined ) {
  24832. if ( targetObject[ objectIndex ] === undefined ) {
  24833. console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );
  24834. return;
  24835. }
  24836. targetObject = targetObject[ objectIndex ];
  24837. }
  24838. }
  24839. // resolve property
  24840. var nodeProperty = targetObject[ propertyName ];
  24841. if ( nodeProperty === undefined ) {
  24842. var nodeName = parsedPath.nodeName;
  24843. console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +
  24844. '.' + propertyName + ' but it wasn\'t found.', targetObject );
  24845. return;
  24846. }
  24847. // determine versioning scheme
  24848. var versioning = this.Versioning.None;
  24849. if ( targetObject.needsUpdate !== undefined ) { // material
  24850. versioning = this.Versioning.NeedsUpdate;
  24851. this.targetObject = targetObject;
  24852. } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform
  24853. versioning = this.Versioning.MatrixWorldNeedsUpdate;
  24854. this.targetObject = targetObject;
  24855. }
  24856. // determine how the property gets bound
  24857. var bindingType = this.BindingType.Direct;
  24858. if ( propertyIndex !== undefined ) {
  24859. // access a sub element of the property array (only primitives are supported right now)
  24860. if ( propertyName === "morphTargetInfluences" ) {
  24861. // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.
  24862. // support resolving morphTarget names into indices.
  24863. if ( ! targetObject.geometry ) {
  24864. console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );
  24865. return;
  24866. }
  24867. if ( targetObject.geometry.isBufferGeometry ) {
  24868. if ( ! targetObject.geometry.morphAttributes ) {
  24869. console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );
  24870. return;
  24871. }
  24872. for ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) {
  24873. if ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) {
  24874. propertyIndex = i;
  24875. break;
  24876. }
  24877. }
  24878. } else {
  24879. if ( ! targetObject.geometry.morphTargets ) {
  24880. console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this );
  24881. return;
  24882. }
  24883. for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {
  24884. if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {
  24885. propertyIndex = i;
  24886. break;
  24887. }
  24888. }
  24889. }
  24890. }
  24891. bindingType = this.BindingType.ArrayElement;
  24892. this.resolvedProperty = nodeProperty;
  24893. this.propertyIndex = propertyIndex;
  24894. } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {
  24895. // must use copy for Object3D.Euler/Quaternion
  24896. bindingType = this.BindingType.HasFromToArray;
  24897. this.resolvedProperty = nodeProperty;
  24898. } else if ( Array.isArray( nodeProperty ) ) {
  24899. bindingType = this.BindingType.EntireArray;
  24900. this.resolvedProperty = nodeProperty;
  24901. } else {
  24902. this.propertyName = propertyName;
  24903. }
  24904. // select getter / setter
  24905. this.getValue = this.GetterByBindingType[ bindingType ];
  24906. this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];
  24907. },
  24908. unbind: function () {
  24909. this.node = null;
  24910. // back to the prototype version of getValue / setValue
  24911. // note: avoiding to mutate the shape of 'this' via 'delete'
  24912. this.getValue = this._getValue_unbound;
  24913. this.setValue = this._setValue_unbound;
  24914. }
  24915. } );
  24916. //!\ DECLARE ALIAS AFTER assign prototype !
  24917. Object.assign( PropertyBinding.prototype, {
  24918. // initial state of these methods that calls 'bind'
  24919. _getValue_unbound: PropertyBinding.prototype.getValue,
  24920. _setValue_unbound: PropertyBinding.prototype.setValue,
  24921. } );
  24922. /**
  24923. *
  24924. * A group of objects that receives a shared animation state.
  24925. *
  24926. * Usage:
  24927. *
  24928. * - Add objects you would otherwise pass as 'root' to the
  24929. * constructor or the .clipAction method of AnimationMixer.
  24930. *
  24931. * - Instead pass this object as 'root'.
  24932. *
  24933. * - You can also add and remove objects later when the mixer
  24934. * is running.
  24935. *
  24936. * Note:
  24937. *
  24938. * Objects of this class appear as one object to the mixer,
  24939. * so cache control of the individual objects must be done
  24940. * on the group.
  24941. *
  24942. * Limitation:
  24943. *
  24944. * - The animated properties must be compatible among the
  24945. * all objects in the group.
  24946. *
  24947. * - A single property can either be controlled through a
  24948. * target group or directly, but not both.
  24949. *
  24950. * @author tschw
  24951. */
  24952. function AnimationObjectGroup() {
  24953. this.uuid = _Math.generateUUID();
  24954. // cached objects followed by the active ones
  24955. this._objects = Array.prototype.slice.call( arguments );
  24956. this.nCachedObjects_ = 0; // threshold
  24957. // note: read by PropertyBinding.Composite
  24958. var indices = {};
  24959. this._indicesByUUID = indices; // for bookkeeping
  24960. for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
  24961. indices[ arguments[ i ].uuid ] = i;
  24962. }
  24963. this._paths = []; // inside: string
  24964. this._parsedPaths = []; // inside: { we don't care, here }
  24965. this._bindings = []; // inside: Array< PropertyBinding >
  24966. this._bindingsIndicesByPath = {}; // inside: indices in these arrays
  24967. var scope = this;
  24968. this.stats = {
  24969. objects: {
  24970. get total() {
  24971. return scope._objects.length;
  24972. },
  24973. get inUse() {
  24974. return this.total - scope.nCachedObjects_;
  24975. }
  24976. },
  24977. get bindingsPerObject() {
  24978. return scope._bindings.length;
  24979. }
  24980. };
  24981. }
  24982. Object.assign( AnimationObjectGroup.prototype, {
  24983. isAnimationObjectGroup: true,
  24984. add: function () {
  24985. var objects = this._objects,
  24986. nObjects = objects.length,
  24987. nCachedObjects = this.nCachedObjects_,
  24988. indicesByUUID = this._indicesByUUID,
  24989. paths = this._paths,
  24990. parsedPaths = this._parsedPaths,
  24991. bindings = this._bindings,
  24992. nBindings = bindings.length,
  24993. knownObject = undefined;
  24994. for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
  24995. var object = arguments[ i ],
  24996. uuid = object.uuid,
  24997. index = indicesByUUID[ uuid ];
  24998. if ( index === undefined ) {
  24999. // unknown object -> add it to the ACTIVE region
  25000. index = nObjects ++;
  25001. indicesByUUID[ uuid ] = index;
  25002. objects.push( object );
  25003. // accounting is done, now do the same for all bindings
  25004. for ( var j = 0, m = nBindings; j !== m; ++ j ) {
  25005. bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );
  25006. }
  25007. } else if ( index < nCachedObjects ) {
  25008. knownObject = objects[ index ];
  25009. // move existing object to the ACTIVE region
  25010. var firstActiveIndex = -- nCachedObjects,
  25011. lastCachedObject = objects[ firstActiveIndex ];
  25012. indicesByUUID[ lastCachedObject.uuid ] = index;
  25013. objects[ index ] = lastCachedObject;
  25014. indicesByUUID[ uuid ] = firstActiveIndex;
  25015. objects[ firstActiveIndex ] = object;
  25016. // accounting is done, now do the same for all bindings
  25017. for ( var j = 0, m = nBindings; j !== m; ++ j ) {
  25018. var bindingsForPath = bindings[ j ],
  25019. lastCached = bindingsForPath[ firstActiveIndex ],
  25020. binding = bindingsForPath[ index ];
  25021. bindingsForPath[ index ] = lastCached;
  25022. if ( binding === undefined ) {
  25023. // since we do not bother to create new bindings
  25024. // for objects that are cached, the binding may
  25025. // or may not exist
  25026. binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );
  25027. }
  25028. bindingsForPath[ firstActiveIndex ] = binding;
  25029. }
  25030. } else if ( objects[ index ] !== knownObject ) {
  25031. console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +
  25032. 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );
  25033. } // else the object is already where we want it to be
  25034. } // for arguments
  25035. this.nCachedObjects_ = nCachedObjects;
  25036. },
  25037. remove: function () {
  25038. var objects = this._objects,
  25039. nCachedObjects = this.nCachedObjects_,
  25040. indicesByUUID = this._indicesByUUID,
  25041. bindings = this._bindings,
  25042. nBindings = bindings.length;
  25043. for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
  25044. var object = arguments[ i ],
  25045. uuid = object.uuid,
  25046. index = indicesByUUID[ uuid ];
  25047. if ( index !== undefined && index >= nCachedObjects ) {
  25048. // move existing object into the CACHED region
  25049. var lastCachedIndex = nCachedObjects ++,
  25050. firstActiveObject = objects[ lastCachedIndex ];
  25051. indicesByUUID[ firstActiveObject.uuid ] = index;
  25052. objects[ index ] = firstActiveObject;
  25053. indicesByUUID[ uuid ] = lastCachedIndex;
  25054. objects[ lastCachedIndex ] = object;
  25055. // accounting is done, now do the same for all bindings
  25056. for ( var j = 0, m = nBindings; j !== m; ++ j ) {
  25057. var bindingsForPath = bindings[ j ],
  25058. firstActive = bindingsForPath[ lastCachedIndex ],
  25059. binding = bindingsForPath[ index ];
  25060. bindingsForPath[ index ] = firstActive;
  25061. bindingsForPath[ lastCachedIndex ] = binding;
  25062. }
  25063. }
  25064. } // for arguments
  25065. this.nCachedObjects_ = nCachedObjects;
  25066. },
  25067. // remove & forget
  25068. uncache: function () {
  25069. var objects = this._objects,
  25070. nObjects = objects.length,
  25071. nCachedObjects = this.nCachedObjects_,
  25072. indicesByUUID = this._indicesByUUID,
  25073. bindings = this._bindings,
  25074. nBindings = bindings.length;
  25075. for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
  25076. var object = arguments[ i ],
  25077. uuid = object.uuid,
  25078. index = indicesByUUID[ uuid ];
  25079. if ( index !== undefined ) {
  25080. delete indicesByUUID[ uuid ];
  25081. if ( index < nCachedObjects ) {
  25082. // object is cached, shrink the CACHED region
  25083. var firstActiveIndex = -- nCachedObjects,
  25084. lastCachedObject = objects[ firstActiveIndex ],
  25085. lastIndex = -- nObjects,
  25086. lastObject = objects[ lastIndex ];
  25087. // last cached object takes this object's place
  25088. indicesByUUID[ lastCachedObject.uuid ] = index;
  25089. objects[ index ] = lastCachedObject;
  25090. // last object goes to the activated slot and pop
  25091. indicesByUUID[ lastObject.uuid ] = firstActiveIndex;
  25092. objects[ firstActiveIndex ] = lastObject;
  25093. objects.pop();
  25094. // accounting is done, now do the same for all bindings
  25095. for ( var j = 0, m = nBindings; j !== m; ++ j ) {
  25096. var bindingsForPath = bindings[ j ],
  25097. lastCached = bindingsForPath[ firstActiveIndex ],
  25098. last = bindingsForPath[ lastIndex ];
  25099. bindingsForPath[ index ] = lastCached;
  25100. bindingsForPath[ firstActiveIndex ] = last;
  25101. bindingsForPath.pop();
  25102. }
  25103. } else {
  25104. // object is active, just swap with the last and pop
  25105. var lastIndex = -- nObjects,
  25106. lastObject = objects[ lastIndex ];
  25107. indicesByUUID[ lastObject.uuid ] = index;
  25108. objects[ index ] = lastObject;
  25109. objects.pop();
  25110. // accounting is done, now do the same for all bindings
  25111. for ( var j = 0, m = nBindings; j !== m; ++ j ) {
  25112. var bindingsForPath = bindings[ j ];
  25113. bindingsForPath[ index ] = bindingsForPath[ lastIndex ];
  25114. bindingsForPath.pop();
  25115. }
  25116. } // cached or active
  25117. } // if object is known
  25118. } // for arguments
  25119. this.nCachedObjects_ = nCachedObjects;
  25120. },
  25121. // Internal interface used by befriended PropertyBinding.Composite:
  25122. subscribe_: function ( path, parsedPath ) {
  25123. // returns an array of bindings for the given path that is changed
  25124. // according to the contained objects in the group
  25125. var indicesByPath = this._bindingsIndicesByPath,
  25126. index = indicesByPath[ path ],
  25127. bindings = this._bindings;
  25128. if ( index !== undefined ) return bindings[ index ];
  25129. var paths = this._paths,
  25130. parsedPaths = this._parsedPaths,
  25131. objects = this._objects,
  25132. nObjects = objects.length,
  25133. nCachedObjects = this.nCachedObjects_,
  25134. bindingsForPath = new Array( nObjects );
  25135. index = bindings.length;
  25136. indicesByPath[ path ] = index;
  25137. paths.push( path );
  25138. parsedPaths.push( parsedPath );
  25139. bindings.push( bindingsForPath );
  25140. for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) {
  25141. var object = objects[ i ];
  25142. bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );
  25143. }
  25144. return bindingsForPath;
  25145. },
  25146. unsubscribe_: function ( path ) {
  25147. // tells the group to forget about a property path and no longer
  25148. // update the array previously obtained with 'subscribe_'
  25149. var indicesByPath = this._bindingsIndicesByPath,
  25150. index = indicesByPath[ path ];
  25151. if ( index !== undefined ) {
  25152. var paths = this._paths,
  25153. parsedPaths = this._parsedPaths,
  25154. bindings = this._bindings,
  25155. lastBindingsIndex = bindings.length - 1,
  25156. lastBindings = bindings[ lastBindingsIndex ],
  25157. lastBindingsPath = path[ lastBindingsIndex ];
  25158. indicesByPath[ lastBindingsPath ] = index;
  25159. bindings[ index ] = lastBindings;
  25160. bindings.pop();
  25161. parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];
  25162. parsedPaths.pop();
  25163. paths[ index ] = paths[ lastBindingsIndex ];
  25164. paths.pop();
  25165. }
  25166. }
  25167. } );
  25168. /**
  25169. *
  25170. * Action provided by AnimationMixer for scheduling clip playback on specific
  25171. * objects.
  25172. *
  25173. * @author Ben Houston / http://clara.io/
  25174. * @author David Sarno / http://lighthaus.us/
  25175. * @author tschw
  25176. *
  25177. */
  25178. function AnimationAction( mixer, clip, localRoot ) {
  25179. this._mixer = mixer;
  25180. this._clip = clip;
  25181. this._localRoot = localRoot || null;
  25182. var tracks = clip.tracks,
  25183. nTracks = tracks.length,
  25184. interpolants = new Array( nTracks );
  25185. var interpolantSettings = {
  25186. endingStart: ZeroCurvatureEnding,
  25187. endingEnd: ZeroCurvatureEnding
  25188. };
  25189. for ( var i = 0; i !== nTracks; ++ i ) {
  25190. var interpolant = tracks[ i ].createInterpolant( null );
  25191. interpolants[ i ] = interpolant;
  25192. interpolant.settings = interpolantSettings;
  25193. }
  25194. this._interpolantSettings = interpolantSettings;
  25195. this._interpolants = interpolants; // bound by the mixer
  25196. // inside: PropertyMixer (managed by the mixer)
  25197. this._propertyBindings = new Array( nTracks );
  25198. this._cacheIndex = null; // for the memory manager
  25199. this._byClipCacheIndex = null; // for the memory manager
  25200. this._timeScaleInterpolant = null;
  25201. this._weightInterpolant = null;
  25202. this.loop = LoopRepeat;
  25203. this._loopCount = - 1;
  25204. // global mixer time when the action is to be started
  25205. // it's set back to 'null' upon start of the action
  25206. this._startTime = null;
  25207. // scaled local time of the action
  25208. // gets clamped or wrapped to 0..clip.duration according to loop
  25209. this.time = 0;
  25210. this.timeScale = 1;
  25211. this._effectiveTimeScale = 1;
  25212. this.weight = 1;
  25213. this._effectiveWeight = 1;
  25214. this.repetitions = Infinity; // no. of repetitions when looping
  25215. this.paused = false; // true -> zero effective time scale
  25216. this.enabled = true; // false -> zero effective weight
  25217. this.clampWhenFinished = false; // keep feeding the last frame?
  25218. this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate
  25219. this.zeroSlopeAtEnd = true; // clips for start, loop and end
  25220. }
  25221. Object.assign( AnimationAction.prototype, {
  25222. // State & Scheduling
  25223. play: function () {
  25224. this._mixer._activateAction( this );
  25225. return this;
  25226. },
  25227. stop: function () {
  25228. this._mixer._deactivateAction( this );
  25229. return this.reset();
  25230. },
  25231. reset: function () {
  25232. this.paused = false;
  25233. this.enabled = true;
  25234. this.time = 0; // restart clip
  25235. this._loopCount = - 1; // forget previous loops
  25236. this._startTime = null; // forget scheduling
  25237. return this.stopFading().stopWarping();
  25238. },
  25239. isRunning: function () {
  25240. return this.enabled && ! this.paused && this.timeScale !== 0 &&
  25241. this._startTime === null && this._mixer._isActiveAction( this );
  25242. },
  25243. // return true when play has been called
  25244. isScheduled: function () {
  25245. return this._mixer._isActiveAction( this );
  25246. },
  25247. startAt: function ( time ) {
  25248. this._startTime = time;
  25249. return this;
  25250. },
  25251. setLoop: function ( mode, repetitions ) {
  25252. this.loop = mode;
  25253. this.repetitions = repetitions;
  25254. return this;
  25255. },
  25256. // Weight
  25257. // set the weight stopping any scheduled fading
  25258. // although .enabled = false yields an effective weight of zero, this
  25259. // method does *not* change .enabled, because it would be confusing
  25260. setEffectiveWeight: function ( weight ) {
  25261. this.weight = weight;
  25262. // note: same logic as when updated at runtime
  25263. this._effectiveWeight = this.enabled ? weight : 0;
  25264. return this.stopFading();
  25265. },
  25266. // return the weight considering fading and .enabled
  25267. getEffectiveWeight: function () {
  25268. return this._effectiveWeight;
  25269. },
  25270. fadeIn: function ( duration ) {
  25271. return this._scheduleFading( duration, 0, 1 );
  25272. },
  25273. fadeOut: function ( duration ) {
  25274. return this._scheduleFading( duration, 1, 0 );
  25275. },
  25276. crossFadeFrom: function ( fadeOutAction, duration, warp ) {
  25277. fadeOutAction.fadeOut( duration );
  25278. this.fadeIn( duration );
  25279. if ( warp ) {
  25280. var fadeInDuration = this._clip.duration,
  25281. fadeOutDuration = fadeOutAction._clip.duration,
  25282. startEndRatio = fadeOutDuration / fadeInDuration,
  25283. endStartRatio = fadeInDuration / fadeOutDuration;
  25284. fadeOutAction.warp( 1.0, startEndRatio, duration );
  25285. this.warp( endStartRatio, 1.0, duration );
  25286. }
  25287. return this;
  25288. },
  25289. crossFadeTo: function ( fadeInAction, duration, warp ) {
  25290. return fadeInAction.crossFadeFrom( this, duration, warp );
  25291. },
  25292. stopFading: function () {
  25293. var weightInterpolant = this._weightInterpolant;
  25294. if ( weightInterpolant !== null ) {
  25295. this._weightInterpolant = null;
  25296. this._mixer._takeBackControlInterpolant( weightInterpolant );
  25297. }
  25298. return this;
  25299. },
  25300. // Time Scale Control
  25301. // set the time scale stopping any scheduled warping
  25302. // although .paused = true yields an effective time scale of zero, this
  25303. // method does *not* change .paused, because it would be confusing
  25304. setEffectiveTimeScale: function ( timeScale ) {
  25305. this.timeScale = timeScale;
  25306. this._effectiveTimeScale = this.paused ? 0 : timeScale;
  25307. return this.stopWarping();
  25308. },
  25309. // return the time scale considering warping and .paused
  25310. getEffectiveTimeScale: function () {
  25311. return this._effectiveTimeScale;
  25312. },
  25313. setDuration: function ( duration ) {
  25314. this.timeScale = this._clip.duration / duration;
  25315. return this.stopWarping();
  25316. },
  25317. syncWith: function ( action ) {
  25318. this.time = action.time;
  25319. this.timeScale = action.timeScale;
  25320. return this.stopWarping();
  25321. },
  25322. halt: function ( duration ) {
  25323. return this.warp( this._effectiveTimeScale, 0, duration );
  25324. },
  25325. warp: function ( startTimeScale, endTimeScale, duration ) {
  25326. var mixer = this._mixer, now = mixer.time,
  25327. interpolant = this._timeScaleInterpolant,
  25328. timeScale = this.timeScale;
  25329. if ( interpolant === null ) {
  25330. interpolant = mixer._lendControlInterpolant();
  25331. this._timeScaleInterpolant = interpolant;
  25332. }
  25333. var times = interpolant.parameterPositions,
  25334. values = interpolant.sampleValues;
  25335. times[ 0 ] = now;
  25336. times[ 1 ] = now + duration;
  25337. values[ 0 ] = startTimeScale / timeScale;
  25338. values[ 1 ] = endTimeScale / timeScale;
  25339. return this;
  25340. },
  25341. stopWarping: function () {
  25342. var timeScaleInterpolant = this._timeScaleInterpolant;
  25343. if ( timeScaleInterpolant !== null ) {
  25344. this._timeScaleInterpolant = null;
  25345. this._mixer._takeBackControlInterpolant( timeScaleInterpolant );
  25346. }
  25347. return this;
  25348. },
  25349. // Object Accessors
  25350. getMixer: function () {
  25351. return this._mixer;
  25352. },
  25353. getClip: function () {
  25354. return this._clip;
  25355. },
  25356. getRoot: function () {
  25357. return this._localRoot || this._mixer._root;
  25358. },
  25359. // Interna
  25360. _update: function ( time, deltaTime, timeDirection, accuIndex ) {
  25361. // called by the mixer
  25362. if ( ! this.enabled ) {
  25363. // call ._updateWeight() to update ._effectiveWeight
  25364. this._updateWeight( time );
  25365. return;
  25366. }
  25367. var startTime = this._startTime;
  25368. if ( startTime !== null ) {
  25369. // check for scheduled start of action
  25370. var timeRunning = ( time - startTime ) * timeDirection;
  25371. if ( timeRunning < 0 || timeDirection === 0 ) {
  25372. return; // yet to come / don't decide when delta = 0
  25373. }
  25374. // start
  25375. this._startTime = null; // unschedule
  25376. deltaTime = timeDirection * timeRunning;
  25377. }
  25378. // apply time scale and advance time
  25379. deltaTime *= this._updateTimeScale( time );
  25380. var clipTime = this._updateTime( deltaTime );
  25381. // note: _updateTime may disable the action resulting in
  25382. // an effective weight of 0
  25383. var weight = this._updateWeight( time );
  25384. if ( weight > 0 ) {
  25385. var interpolants = this._interpolants;
  25386. var propertyMixers = this._propertyBindings;
  25387. for ( var j = 0, m = interpolants.length; j !== m; ++ j ) {
  25388. interpolants[ j ].evaluate( clipTime );
  25389. propertyMixers[ j ].accumulate( accuIndex, weight );
  25390. }
  25391. }
  25392. },
  25393. _updateWeight: function ( time ) {
  25394. var weight = 0;
  25395. if ( this.enabled ) {
  25396. weight = this.weight;
  25397. var interpolant = this._weightInterpolant;
  25398. if ( interpolant !== null ) {
  25399. var interpolantValue = interpolant.evaluate( time )[ 0 ];
  25400. weight *= interpolantValue;
  25401. if ( time > interpolant.parameterPositions[ 1 ] ) {
  25402. this.stopFading();
  25403. if ( interpolantValue === 0 ) {
  25404. // faded out, disable
  25405. this.enabled = false;
  25406. }
  25407. }
  25408. }
  25409. }
  25410. this._effectiveWeight = weight;
  25411. return weight;
  25412. },
  25413. _updateTimeScale: function ( time ) {
  25414. var timeScale = 0;
  25415. if ( ! this.paused ) {
  25416. timeScale = this.timeScale;
  25417. var interpolant = this._timeScaleInterpolant;
  25418. if ( interpolant !== null ) {
  25419. var interpolantValue = interpolant.evaluate( time )[ 0 ];
  25420. timeScale *= interpolantValue;
  25421. if ( time > interpolant.parameterPositions[ 1 ] ) {
  25422. this.stopWarping();
  25423. if ( timeScale === 0 ) {
  25424. // motion has halted, pause
  25425. this.paused = true;
  25426. } else {
  25427. // warp done - apply final time scale
  25428. this.timeScale = timeScale;
  25429. }
  25430. }
  25431. }
  25432. }
  25433. this._effectiveTimeScale = timeScale;
  25434. return timeScale;
  25435. },
  25436. _updateTime: function ( deltaTime ) {
  25437. var time = this.time + deltaTime;
  25438. var duration = this._clip.duration;
  25439. var loop = this.loop;
  25440. var loopCount = this._loopCount;
  25441. var pingPong = ( loop === LoopPingPong );
  25442. if ( deltaTime === 0 ) {
  25443. if ( loopCount === - 1 ) return time;
  25444. return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;
  25445. }
  25446. if ( loop === LoopOnce ) {
  25447. if ( loopCount === - 1 ) {
  25448. // just started
  25449. this._loopCount = 0;
  25450. this._setEndings( true, true, false );
  25451. }
  25452. handle_stop: {
  25453. if ( time >= duration ) {
  25454. time = duration;
  25455. } else if ( time < 0 ) {
  25456. time = 0;
  25457. } else break handle_stop;
  25458. if ( this.clampWhenFinished ) this.paused = true;
  25459. else this.enabled = false;
  25460. this._mixer.dispatchEvent( {
  25461. type: 'finished', action: this,
  25462. direction: deltaTime < 0 ? - 1 : 1
  25463. } );
  25464. }
  25465. } else { // repetitive Repeat or PingPong
  25466. if ( loopCount === - 1 ) {
  25467. // just started
  25468. if ( deltaTime >= 0 ) {
  25469. loopCount = 0;
  25470. this._setEndings( true, this.repetitions === 0, pingPong );
  25471. } else {
  25472. // when looping in reverse direction, the initial
  25473. // transition through zero counts as a repetition,
  25474. // so leave loopCount at -1
  25475. this._setEndings( this.repetitions === 0, true, pingPong );
  25476. }
  25477. }
  25478. if ( time >= duration || time < 0 ) {
  25479. // wrap around
  25480. var loopDelta = Math.floor( time / duration ); // signed
  25481. time -= duration * loopDelta;
  25482. loopCount += Math.abs( loopDelta );
  25483. var pending = this.repetitions - loopCount;
  25484. if ( pending <= 0 ) {
  25485. // have to stop (switch state, clamp time, fire event)
  25486. if ( this.clampWhenFinished ) this.paused = true;
  25487. else this.enabled = false;
  25488. time = deltaTime > 0 ? duration : 0;
  25489. this._mixer.dispatchEvent( {
  25490. type: 'finished', action: this,
  25491. direction: deltaTime > 0 ? 1 : - 1
  25492. } );
  25493. } else {
  25494. // keep running
  25495. if ( pending === 1 ) {
  25496. // entering the last round
  25497. var atStart = deltaTime < 0;
  25498. this._setEndings( atStart, ! atStart, pingPong );
  25499. } else {
  25500. this._setEndings( false, false, pingPong );
  25501. }
  25502. this._loopCount = loopCount;
  25503. this._mixer.dispatchEvent( {
  25504. type: 'loop', action: this, loopDelta: loopDelta
  25505. } );
  25506. }
  25507. }
  25508. if ( pingPong && ( loopCount & 1 ) === 1 ) {
  25509. // invert time for the "pong round"
  25510. this.time = time;
  25511. return duration - time;
  25512. }
  25513. }
  25514. this.time = time;
  25515. return time;
  25516. },
  25517. _setEndings: function ( atStart, atEnd, pingPong ) {
  25518. var settings = this._interpolantSettings;
  25519. if ( pingPong ) {
  25520. settings.endingStart = ZeroSlopeEnding;
  25521. settings.endingEnd = ZeroSlopeEnding;
  25522. } else {
  25523. // assuming for LoopOnce atStart == atEnd == true
  25524. if ( atStart ) {
  25525. settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;
  25526. } else {
  25527. settings.endingStart = WrapAroundEnding;
  25528. }
  25529. if ( atEnd ) {
  25530. settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;
  25531. } else {
  25532. settings.endingEnd = WrapAroundEnding;
  25533. }
  25534. }
  25535. },
  25536. _scheduleFading: function ( duration, weightNow, weightThen ) {
  25537. var mixer = this._mixer, now = mixer.time,
  25538. interpolant = this._weightInterpolant;
  25539. if ( interpolant === null ) {
  25540. interpolant = mixer._lendControlInterpolant();
  25541. this._weightInterpolant = interpolant;
  25542. }
  25543. var times = interpolant.parameterPositions,
  25544. values = interpolant.sampleValues;
  25545. times[ 0 ] = now; values[ 0 ] = weightNow;
  25546. times[ 1 ] = now + duration; values[ 1 ] = weightThen;
  25547. return this;
  25548. }
  25549. } );
  25550. /**
  25551. *
  25552. * Player for AnimationClips.
  25553. *
  25554. *
  25555. * @author Ben Houston / http://clara.io/
  25556. * @author David Sarno / http://lighthaus.us/
  25557. * @author tschw
  25558. */
  25559. function AnimationMixer( root ) {
  25560. this._root = root;
  25561. this._initMemoryManager();
  25562. this._accuIndex = 0;
  25563. this.time = 0;
  25564. this.timeScale = 1.0;
  25565. }
  25566. AnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
  25567. constructor: AnimationMixer,
  25568. _bindAction: function ( action, prototypeAction ) {
  25569. var root = action._localRoot || this._root,
  25570. tracks = action._clip.tracks,
  25571. nTracks = tracks.length,
  25572. bindings = action._propertyBindings,
  25573. interpolants = action._interpolants,
  25574. rootUuid = root.uuid,
  25575. bindingsByRoot = this._bindingsByRootAndName,
  25576. bindingsByName = bindingsByRoot[ rootUuid ];
  25577. if ( bindingsByName === undefined ) {
  25578. bindingsByName = {};
  25579. bindingsByRoot[ rootUuid ] = bindingsByName;
  25580. }
  25581. for ( var i = 0; i !== nTracks; ++ i ) {
  25582. var track = tracks[ i ],
  25583. trackName = track.name,
  25584. binding = bindingsByName[ trackName ];
  25585. if ( binding !== undefined ) {
  25586. bindings[ i ] = binding;
  25587. } else {
  25588. binding = bindings[ i ];
  25589. if ( binding !== undefined ) {
  25590. // existing binding, make sure the cache knows
  25591. if ( binding._cacheIndex === null ) {
  25592. ++ binding.referenceCount;
  25593. this._addInactiveBinding( binding, rootUuid, trackName );
  25594. }
  25595. continue;
  25596. }
  25597. var path = prototypeAction && prototypeAction.
  25598. _propertyBindings[ i ].binding.parsedPath;
  25599. binding = new PropertyMixer(
  25600. PropertyBinding.create( root, trackName, path ),
  25601. track.ValueTypeName, track.getValueSize() );
  25602. ++ binding.referenceCount;
  25603. this._addInactiveBinding( binding, rootUuid, trackName );
  25604. bindings[ i ] = binding;
  25605. }
  25606. interpolants[ i ].resultBuffer = binding.buffer;
  25607. }
  25608. },
  25609. _activateAction: function ( action ) {
  25610. if ( ! this._isActiveAction( action ) ) {
  25611. if ( action._cacheIndex === null ) {
  25612. // this action has been forgotten by the cache, but the user
  25613. // appears to be still using it -> rebind
  25614. var rootUuid = ( action._localRoot || this._root ).uuid,
  25615. clipUuid = action._clip.uuid,
  25616. actionsForClip = this._actionsByClip[ clipUuid ];
  25617. this._bindAction( action,
  25618. actionsForClip && actionsForClip.knownActions[ 0 ] );
  25619. this._addInactiveAction( action, clipUuid, rootUuid );
  25620. }
  25621. var bindings = action._propertyBindings;
  25622. // increment reference counts / sort out state
  25623. for ( var i = 0, n = bindings.length; i !== n; ++ i ) {
  25624. var binding = bindings[ i ];
  25625. if ( binding.useCount ++ === 0 ) {
  25626. this._lendBinding( binding );
  25627. binding.saveOriginalState();
  25628. }
  25629. }
  25630. this._lendAction( action );
  25631. }
  25632. },
  25633. _deactivateAction: function ( action ) {
  25634. if ( this._isActiveAction( action ) ) {
  25635. var bindings = action._propertyBindings;
  25636. // decrement reference counts / sort out state
  25637. for ( var i = 0, n = bindings.length; i !== n; ++ i ) {
  25638. var binding = bindings[ i ];
  25639. if ( -- binding.useCount === 0 ) {
  25640. binding.restoreOriginalState();
  25641. this._takeBackBinding( binding );
  25642. }
  25643. }
  25644. this._takeBackAction( action );
  25645. }
  25646. },
  25647. // Memory manager
  25648. _initMemoryManager: function () {
  25649. this._actions = []; // 'nActiveActions' followed by inactive ones
  25650. this._nActiveActions = 0;
  25651. this._actionsByClip = {};
  25652. // inside:
  25653. // {
  25654. // knownActions: Array< AnimationAction > - used as prototypes
  25655. // actionByRoot: AnimationAction - lookup
  25656. // }
  25657. this._bindings = []; // 'nActiveBindings' followed by inactive ones
  25658. this._nActiveBindings = 0;
  25659. this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >
  25660. this._controlInterpolants = []; // same game as above
  25661. this._nActiveControlInterpolants = 0;
  25662. var scope = this;
  25663. this.stats = {
  25664. actions: {
  25665. get total() {
  25666. return scope._actions.length;
  25667. },
  25668. get inUse() {
  25669. return scope._nActiveActions;
  25670. }
  25671. },
  25672. bindings: {
  25673. get total() {
  25674. return scope._bindings.length;
  25675. },
  25676. get inUse() {
  25677. return scope._nActiveBindings;
  25678. }
  25679. },
  25680. controlInterpolants: {
  25681. get total() {
  25682. return scope._controlInterpolants.length;
  25683. },
  25684. get inUse() {
  25685. return scope._nActiveControlInterpolants;
  25686. }
  25687. }
  25688. };
  25689. },
  25690. // Memory management for AnimationAction objects
  25691. _isActiveAction: function ( action ) {
  25692. var index = action._cacheIndex;
  25693. return index !== null && index < this._nActiveActions;
  25694. },
  25695. _addInactiveAction: function ( action, clipUuid, rootUuid ) {
  25696. var actions = this._actions,
  25697. actionsByClip = this._actionsByClip,
  25698. actionsForClip = actionsByClip[ clipUuid ];
  25699. if ( actionsForClip === undefined ) {
  25700. actionsForClip = {
  25701. knownActions: [ action ],
  25702. actionByRoot: {}
  25703. };
  25704. action._byClipCacheIndex = 0;
  25705. actionsByClip[ clipUuid ] = actionsForClip;
  25706. } else {
  25707. var knownActions = actionsForClip.knownActions;
  25708. action._byClipCacheIndex = knownActions.length;
  25709. knownActions.push( action );
  25710. }
  25711. action._cacheIndex = actions.length;
  25712. actions.push( action );
  25713. actionsForClip.actionByRoot[ rootUuid ] = action;
  25714. },
  25715. _removeInactiveAction: function ( action ) {
  25716. var actions = this._actions,
  25717. lastInactiveAction = actions[ actions.length - 1 ],
  25718. cacheIndex = action._cacheIndex;
  25719. lastInactiveAction._cacheIndex = cacheIndex;
  25720. actions[ cacheIndex ] = lastInactiveAction;
  25721. actions.pop();
  25722. action._cacheIndex = null;
  25723. var clipUuid = action._clip.uuid,
  25724. actionsByClip = this._actionsByClip,
  25725. actionsForClip = actionsByClip[ clipUuid ],
  25726. knownActionsForClip = actionsForClip.knownActions,
  25727. lastKnownAction =
  25728. knownActionsForClip[ knownActionsForClip.length - 1 ],
  25729. byClipCacheIndex = action._byClipCacheIndex;
  25730. lastKnownAction._byClipCacheIndex = byClipCacheIndex;
  25731. knownActionsForClip[ byClipCacheIndex ] = lastKnownAction;
  25732. knownActionsForClip.pop();
  25733. action._byClipCacheIndex = null;
  25734. var actionByRoot = actionsForClip.actionByRoot,
  25735. rootUuid = ( action._localRoot || this._root ).uuid;
  25736. delete actionByRoot[ rootUuid ];
  25737. if ( knownActionsForClip.length === 0 ) {
  25738. delete actionsByClip[ clipUuid ];
  25739. }
  25740. this._removeInactiveBindingsForAction( action );
  25741. },
  25742. _removeInactiveBindingsForAction: function ( action ) {
  25743. var bindings = action._propertyBindings;
  25744. for ( var i = 0, n = bindings.length; i !== n; ++ i ) {
  25745. var binding = bindings[ i ];
  25746. if ( -- binding.referenceCount === 0 ) {
  25747. this._removeInactiveBinding( binding );
  25748. }
  25749. }
  25750. },
  25751. _lendAction: function ( action ) {
  25752. // [ active actions | inactive actions ]
  25753. // [ active actions >| inactive actions ]
  25754. // s a
  25755. // <-swap->
  25756. // a s
  25757. var actions = this._actions,
  25758. prevIndex = action._cacheIndex,
  25759. lastActiveIndex = this._nActiveActions ++,
  25760. firstInactiveAction = actions[ lastActiveIndex ];
  25761. action._cacheIndex = lastActiveIndex;
  25762. actions[ lastActiveIndex ] = action;
  25763. firstInactiveAction._cacheIndex = prevIndex;
  25764. actions[ prevIndex ] = firstInactiveAction;
  25765. },
  25766. _takeBackAction: function ( action ) {
  25767. // [ active actions | inactive actions ]
  25768. // [ active actions |< inactive actions ]
  25769. // a s
  25770. // <-swap->
  25771. // s a
  25772. var actions = this._actions,
  25773. prevIndex = action._cacheIndex,
  25774. firstInactiveIndex = -- this._nActiveActions,
  25775. lastActiveAction = actions[ firstInactiveIndex ];
  25776. action._cacheIndex = firstInactiveIndex;
  25777. actions[ firstInactiveIndex ] = action;
  25778. lastActiveAction._cacheIndex = prevIndex;
  25779. actions[ prevIndex ] = lastActiveAction;
  25780. },
  25781. // Memory management for PropertyMixer objects
  25782. _addInactiveBinding: function ( binding, rootUuid, trackName ) {
  25783. var bindingsByRoot = this._bindingsByRootAndName,
  25784. bindingByName = bindingsByRoot[ rootUuid ],
  25785. bindings = this._bindings;
  25786. if ( bindingByName === undefined ) {
  25787. bindingByName = {};
  25788. bindingsByRoot[ rootUuid ] = bindingByName;
  25789. }
  25790. bindingByName[ trackName ] = binding;
  25791. binding._cacheIndex = bindings.length;
  25792. bindings.push( binding );
  25793. },
  25794. _removeInactiveBinding: function ( binding ) {
  25795. var bindings = this._bindings,
  25796. propBinding = binding.binding,
  25797. rootUuid = propBinding.rootNode.uuid,
  25798. trackName = propBinding.path,
  25799. bindingsByRoot = this._bindingsByRootAndName,
  25800. bindingByName = bindingsByRoot[ rootUuid ],
  25801. lastInactiveBinding = bindings[ bindings.length - 1 ],
  25802. cacheIndex = binding._cacheIndex;
  25803. lastInactiveBinding._cacheIndex = cacheIndex;
  25804. bindings[ cacheIndex ] = lastInactiveBinding;
  25805. bindings.pop();
  25806. delete bindingByName[ trackName ];
  25807. remove_empty_map: {
  25808. for ( var _ in bindingByName ) break remove_empty_map; // eslint-disable-line no-unused-vars
  25809. delete bindingsByRoot[ rootUuid ];
  25810. }
  25811. },
  25812. _lendBinding: function ( binding ) {
  25813. var bindings = this._bindings,
  25814. prevIndex = binding._cacheIndex,
  25815. lastActiveIndex = this._nActiveBindings ++,
  25816. firstInactiveBinding = bindings[ lastActiveIndex ];
  25817. binding._cacheIndex = lastActiveIndex;
  25818. bindings[ lastActiveIndex ] = binding;
  25819. firstInactiveBinding._cacheIndex = prevIndex;
  25820. bindings[ prevIndex ] = firstInactiveBinding;
  25821. },
  25822. _takeBackBinding: function ( binding ) {
  25823. var bindings = this._bindings,
  25824. prevIndex = binding._cacheIndex,
  25825. firstInactiveIndex = -- this._nActiveBindings,
  25826. lastActiveBinding = bindings[ firstInactiveIndex ];
  25827. binding._cacheIndex = firstInactiveIndex;
  25828. bindings[ firstInactiveIndex ] = binding;
  25829. lastActiveBinding._cacheIndex = prevIndex;
  25830. bindings[ prevIndex ] = lastActiveBinding;
  25831. },
  25832. // Memory management of Interpolants for weight and time scale
  25833. _lendControlInterpolant: function () {
  25834. var interpolants = this._controlInterpolants,
  25835. lastActiveIndex = this._nActiveControlInterpolants ++,
  25836. interpolant = interpolants[ lastActiveIndex ];
  25837. if ( interpolant === undefined ) {
  25838. interpolant = new LinearInterpolant(
  25839. new Float32Array( 2 ), new Float32Array( 2 ),
  25840. 1, this._controlInterpolantsResultBuffer );
  25841. interpolant.__cacheIndex = lastActiveIndex;
  25842. interpolants[ lastActiveIndex ] = interpolant;
  25843. }
  25844. return interpolant;
  25845. },
  25846. _takeBackControlInterpolant: function ( interpolant ) {
  25847. var interpolants = this._controlInterpolants,
  25848. prevIndex = interpolant.__cacheIndex,
  25849. firstInactiveIndex = -- this._nActiveControlInterpolants,
  25850. lastActiveInterpolant = interpolants[ firstInactiveIndex ];
  25851. interpolant.__cacheIndex = firstInactiveIndex;
  25852. interpolants[ firstInactiveIndex ] = interpolant;
  25853. lastActiveInterpolant.__cacheIndex = prevIndex;
  25854. interpolants[ prevIndex ] = lastActiveInterpolant;
  25855. },
  25856. _controlInterpolantsResultBuffer: new Float32Array( 1 ),
  25857. // return an action for a clip optionally using a custom root target
  25858. // object (this method allocates a lot of dynamic memory in case a
  25859. // previously unknown clip/root combination is specified)
  25860. clipAction: function ( clip, optionalRoot ) {
  25861. var root = optionalRoot || this._root,
  25862. rootUuid = root.uuid,
  25863. clipObject = typeof clip === 'string' ?
  25864. AnimationClip.findByName( root, clip ) : clip,
  25865. clipUuid = clipObject !== null ? clipObject.uuid : clip,
  25866. actionsForClip = this._actionsByClip[ clipUuid ],
  25867. prototypeAction = null;
  25868. if ( actionsForClip !== undefined ) {
  25869. var existingAction =
  25870. actionsForClip.actionByRoot[ rootUuid ];
  25871. if ( existingAction !== undefined ) {
  25872. return existingAction;
  25873. }
  25874. // we know the clip, so we don't have to parse all
  25875. // the bindings again but can just copy
  25876. prototypeAction = actionsForClip.knownActions[ 0 ];
  25877. // also, take the clip from the prototype action
  25878. if ( clipObject === null )
  25879. clipObject = prototypeAction._clip;
  25880. }
  25881. // clip must be known when specified via string
  25882. if ( clipObject === null ) return null;
  25883. // allocate all resources required to run it
  25884. var newAction = new AnimationAction( this, clipObject, optionalRoot );
  25885. this._bindAction( newAction, prototypeAction );
  25886. // and make the action known to the memory manager
  25887. this._addInactiveAction( newAction, clipUuid, rootUuid );
  25888. return newAction;
  25889. },
  25890. // get an existing action
  25891. existingAction: function ( clip, optionalRoot ) {
  25892. var root = optionalRoot || this._root,
  25893. rootUuid = root.uuid,
  25894. clipObject = typeof clip === 'string' ?
  25895. AnimationClip.findByName( root, clip ) : clip,
  25896. clipUuid = clipObject ? clipObject.uuid : clip,
  25897. actionsForClip = this._actionsByClip[ clipUuid ];
  25898. if ( actionsForClip !== undefined ) {
  25899. return actionsForClip.actionByRoot[ rootUuid ] || null;
  25900. }
  25901. return null;
  25902. },
  25903. // deactivates all previously scheduled actions
  25904. stopAllAction: function () {
  25905. var actions = this._actions,
  25906. nActions = this._nActiveActions,
  25907. bindings = this._bindings,
  25908. nBindings = this._nActiveBindings;
  25909. this._nActiveActions = 0;
  25910. this._nActiveBindings = 0;
  25911. for ( var i = 0; i !== nActions; ++ i ) {
  25912. actions[ i ].reset();
  25913. }
  25914. for ( var i = 0; i !== nBindings; ++ i ) {
  25915. bindings[ i ].useCount = 0;
  25916. }
  25917. return this;
  25918. },
  25919. // advance the time and update apply the animation
  25920. update: function ( deltaTime ) {
  25921. deltaTime *= this.timeScale;
  25922. var actions = this._actions,
  25923. nActions = this._nActiveActions,
  25924. time = this.time += deltaTime,
  25925. timeDirection = Math.sign( deltaTime ),
  25926. accuIndex = this._accuIndex ^= 1;
  25927. // run active actions
  25928. for ( var i = 0; i !== nActions; ++ i ) {
  25929. var action = actions[ i ];
  25930. action._update( time, deltaTime, timeDirection, accuIndex );
  25931. }
  25932. // update scene graph
  25933. var bindings = this._bindings,
  25934. nBindings = this._nActiveBindings;
  25935. for ( var i = 0; i !== nBindings; ++ i ) {
  25936. bindings[ i ].apply( accuIndex );
  25937. }
  25938. return this;
  25939. },
  25940. // return this mixer's root target object
  25941. getRoot: function () {
  25942. return this._root;
  25943. },
  25944. // free all resources specific to a particular clip
  25945. uncacheClip: function ( clip ) {
  25946. var actions = this._actions,
  25947. clipUuid = clip.uuid,
  25948. actionsByClip = this._actionsByClip,
  25949. actionsForClip = actionsByClip[ clipUuid ];
  25950. if ( actionsForClip !== undefined ) {
  25951. // note: just calling _removeInactiveAction would mess up the
  25952. // iteration state and also require updating the state we can
  25953. // just throw away
  25954. var actionsToRemove = actionsForClip.knownActions;
  25955. for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {
  25956. var action = actionsToRemove[ i ];
  25957. this._deactivateAction( action );
  25958. var cacheIndex = action._cacheIndex,
  25959. lastInactiveAction = actions[ actions.length - 1 ];
  25960. action._cacheIndex = null;
  25961. action._byClipCacheIndex = null;
  25962. lastInactiveAction._cacheIndex = cacheIndex;
  25963. actions[ cacheIndex ] = lastInactiveAction;
  25964. actions.pop();
  25965. this._removeInactiveBindingsForAction( action );
  25966. }
  25967. delete actionsByClip[ clipUuid ];
  25968. }
  25969. },
  25970. // free all resources specific to a particular root target object
  25971. uncacheRoot: function ( root ) {
  25972. var rootUuid = root.uuid,
  25973. actionsByClip = this._actionsByClip;
  25974. for ( var clipUuid in actionsByClip ) {
  25975. var actionByRoot = actionsByClip[ clipUuid ].actionByRoot,
  25976. action = actionByRoot[ rootUuid ];
  25977. if ( action !== undefined ) {
  25978. this._deactivateAction( action );
  25979. this._removeInactiveAction( action );
  25980. }
  25981. }
  25982. var bindingsByRoot = this._bindingsByRootAndName,
  25983. bindingByName = bindingsByRoot[ rootUuid ];
  25984. if ( bindingByName !== undefined ) {
  25985. for ( var trackName in bindingByName ) {
  25986. var binding = bindingByName[ trackName ];
  25987. binding.restoreOriginalState();
  25988. this._removeInactiveBinding( binding );
  25989. }
  25990. }
  25991. },
  25992. // remove a targeted clip from the cache
  25993. uncacheAction: function ( clip, optionalRoot ) {
  25994. var action = this.existingAction( clip, optionalRoot );
  25995. if ( action !== null ) {
  25996. this._deactivateAction( action );
  25997. this._removeInactiveAction( action );
  25998. }
  25999. }
  26000. } );
  26001. /**
  26002. * @author mrdoob / http://mrdoob.com/
  26003. */
  26004. function Uniform( value ) {
  26005. if ( typeof value === 'string' ) {
  26006. console.warn( 'THREE.Uniform: Type parameter is no longer needed.' );
  26007. value = arguments[ 1 ];
  26008. }
  26009. this.value = value;
  26010. }
  26011. Uniform.prototype.clone = function () {
  26012. return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );
  26013. };
  26014. /**
  26015. * @author benaadams / https://twitter.com/ben_a_adams
  26016. */
  26017. function InstancedBufferGeometry() {
  26018. BufferGeometry.call( this );
  26019. this.type = 'InstancedBufferGeometry';
  26020. this.maxInstancedCount = undefined;
  26021. }
  26022. InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), {
  26023. constructor: InstancedBufferGeometry,
  26024. isInstancedBufferGeometry: true,
  26025. copy: function ( source ) {
  26026. BufferGeometry.prototype.copy.call( this, source );
  26027. this.maxInstancedCount = source.maxInstancedCount;
  26028. return this;
  26029. },
  26030. clone: function () {
  26031. return new this.constructor().copy( this );
  26032. }
  26033. } );
  26034. /**
  26035. * @author benaadams / https://twitter.com/ben_a_adams
  26036. */
  26037. function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {
  26038. InterleavedBuffer.call( this, array, stride );
  26039. this.meshPerAttribute = meshPerAttribute || 1;
  26040. }
  26041. InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), {
  26042. constructor: InstancedInterleavedBuffer,
  26043. isInstancedInterleavedBuffer: true,
  26044. copy: function ( source ) {
  26045. InterleavedBuffer.prototype.copy.call( this, source );
  26046. this.meshPerAttribute = source.meshPerAttribute;
  26047. return this;
  26048. }
  26049. } );
  26050. /**
  26051. * @author benaadams / https://twitter.com/ben_a_adams
  26052. */
  26053. function InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {
  26054. BufferAttribute.call( this, array, itemSize );
  26055. this.meshPerAttribute = meshPerAttribute || 1;
  26056. }
  26057. InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), {
  26058. constructor: InstancedBufferAttribute,
  26059. isInstancedBufferAttribute: true,
  26060. copy: function ( source ) {
  26061. BufferAttribute.prototype.copy.call( this, source );
  26062. this.meshPerAttribute = source.meshPerAttribute;
  26063. return this;
  26064. }
  26065. } );
  26066. /**
  26067. * @author mrdoob / http://mrdoob.com/
  26068. * @author bhouston / http://clara.io/
  26069. * @author stephomi / http://stephaneginier.com/
  26070. */
  26071. function Raycaster( origin, direction, near, far ) {
  26072. this.ray = new Ray( origin, direction );
  26073. // direction is assumed to be normalized (for accurate distance calculations)
  26074. this.near = near || 0;
  26075. this.far = far || Infinity;
  26076. this.params = {
  26077. Mesh: {},
  26078. Line: {},
  26079. LOD: {},
  26080. Points: { threshold: 1 },
  26081. Sprite: {}
  26082. };
  26083. Object.defineProperties( this.params, {
  26084. PointCloud: {
  26085. get: function () {
  26086. console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );
  26087. return this.Points;
  26088. }
  26089. }
  26090. } );
  26091. }
  26092. function ascSort( a, b ) {
  26093. return a.distance - b.distance;
  26094. }
  26095. function intersectObject( object, raycaster, intersects, recursive ) {
  26096. if ( object.visible === false ) return;
  26097. object.raycast( raycaster, intersects );
  26098. if ( recursive === true ) {
  26099. var children = object.children;
  26100. for ( var i = 0, l = children.length; i < l; i ++ ) {
  26101. intersectObject( children[ i ], raycaster, intersects, true );
  26102. }
  26103. }
  26104. }
  26105. Object.assign( Raycaster.prototype, {
  26106. linePrecision: 1,
  26107. set: function ( origin, direction ) {
  26108. // direction is assumed to be normalized (for accurate distance calculations)
  26109. this.ray.set( origin, direction );
  26110. },
  26111. setFromCamera: function ( coords, camera ) {
  26112. if ( ( camera && camera.isPerspectiveCamera ) ) {
  26113. this.ray.origin.setFromMatrixPosition( camera.matrixWorld );
  26114. this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();
  26115. } else if ( ( camera && camera.isOrthographicCamera ) ) {
  26116. this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera
  26117. this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );
  26118. } else {
  26119. console.error( 'THREE.Raycaster: Unsupported camera type.' );
  26120. }
  26121. },
  26122. intersectObject: function ( object, recursive, optionalTarget ) {
  26123. var intersects = optionalTarget || [];
  26124. intersectObject( object, this, intersects, recursive );
  26125. intersects.sort( ascSort );
  26126. return intersects;
  26127. },
  26128. intersectObjects: function ( objects, recursive, optionalTarget ) {
  26129. var intersects = optionalTarget || [];
  26130. if ( Array.isArray( objects ) === false ) {
  26131. console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );
  26132. return intersects;
  26133. }
  26134. for ( var i = 0, l = objects.length; i < l; i ++ ) {
  26135. intersectObject( objects[ i ], this, intersects, recursive );
  26136. }
  26137. intersects.sort( ascSort );
  26138. return intersects;
  26139. }
  26140. } );
  26141. /**
  26142. * @author alteredq / http://alteredqualia.com/
  26143. */
  26144. function Clock( autoStart ) {
  26145. this.autoStart = ( autoStart !== undefined ) ? autoStart : true;
  26146. this.startTime = 0;
  26147. this.oldTime = 0;
  26148. this.elapsedTime = 0;
  26149. this.running = false;
  26150. }
  26151. Object.assign( Clock.prototype, {
  26152. start: function () {
  26153. this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732
  26154. this.oldTime = this.startTime;
  26155. this.elapsedTime = 0;
  26156. this.running = true;
  26157. },
  26158. stop: function () {
  26159. this.getElapsedTime();
  26160. this.running = false;
  26161. this.autoStart = false;
  26162. },
  26163. getElapsedTime: function () {
  26164. this.getDelta();
  26165. return this.elapsedTime;
  26166. },
  26167. getDelta: function () {
  26168. var diff = 0;
  26169. if ( this.autoStart && ! this.running ) {
  26170. this.start();
  26171. return 0;
  26172. }
  26173. if ( this.running ) {
  26174. var newTime = ( typeof performance === 'undefined' ? Date : performance ).now();
  26175. diff = ( newTime - this.oldTime ) / 1000;
  26176. this.oldTime = newTime;
  26177. this.elapsedTime += diff;
  26178. }
  26179. return diff;
  26180. }
  26181. } );
  26182. /**
  26183. * @author bhouston / http://clara.io
  26184. * @author WestLangley / http://github.com/WestLangley
  26185. *
  26186. * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system
  26187. *
  26188. * The poles (phi) are at the positive and negative y axis.
  26189. * The equator starts at positive z.
  26190. */
  26191. function Spherical( radius, phi, theta ) {
  26192. this.radius = ( radius !== undefined ) ? radius : 1.0;
  26193. this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole
  26194. this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere
  26195. return this;
  26196. }
  26197. Object.assign( Spherical.prototype, {
  26198. set: function ( radius, phi, theta ) {
  26199. this.radius = radius;
  26200. this.phi = phi;
  26201. this.theta = theta;
  26202. return this;
  26203. },
  26204. clone: function () {
  26205. return new this.constructor().copy( this );
  26206. },
  26207. copy: function ( other ) {
  26208. this.radius = other.radius;
  26209. this.phi = other.phi;
  26210. this.theta = other.theta;
  26211. return this;
  26212. },
  26213. // restrict phi to be betwee EPS and PI-EPS
  26214. makeSafe: function () {
  26215. var EPS = 0.000001;
  26216. this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );
  26217. return this;
  26218. },
  26219. setFromVector3: function ( vec3 ) {
  26220. this.radius = vec3.length();
  26221. if ( this.radius === 0 ) {
  26222. this.theta = 0;
  26223. this.phi = 0;
  26224. } else {
  26225. this.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis
  26226. this.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle
  26227. }
  26228. return this;
  26229. }
  26230. } );
  26231. /**
  26232. * @author Mugen87 / https://github.com/Mugen87
  26233. *
  26234. * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system
  26235. *
  26236. */
  26237. function Cylindrical( radius, theta, y ) {
  26238. this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane
  26239. this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis
  26240. this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane
  26241. return this;
  26242. }
  26243. Object.assign( Cylindrical.prototype, {
  26244. set: function ( radius, theta, y ) {
  26245. this.radius = radius;
  26246. this.theta = theta;
  26247. this.y = y;
  26248. return this;
  26249. },
  26250. clone: function () {
  26251. return new this.constructor().copy( this );
  26252. },
  26253. copy: function ( other ) {
  26254. this.radius = other.radius;
  26255. this.theta = other.theta;
  26256. this.y = other.y;
  26257. return this;
  26258. },
  26259. setFromVector3: function ( vec3 ) {
  26260. this.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );
  26261. this.theta = Math.atan2( vec3.x, vec3.z );
  26262. this.y = vec3.y;
  26263. return this;
  26264. }
  26265. } );
  26266. /**
  26267. * @author bhouston / http://clara.io
  26268. */
  26269. function Box2( min, max ) {
  26270. this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );
  26271. this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );
  26272. }
  26273. Object.assign( Box2.prototype, {
  26274. set: function ( min, max ) {
  26275. this.min.copy( min );
  26276. this.max.copy( max );
  26277. return this;
  26278. },
  26279. setFromPoints: function ( points ) {
  26280. this.makeEmpty();
  26281. for ( var i = 0, il = points.length; i < il; i ++ ) {
  26282. this.expandByPoint( points[ i ] );
  26283. }
  26284. return this;
  26285. },
  26286. setFromCenterAndSize: function () {
  26287. var v1 = new Vector2();
  26288. return function setFromCenterAndSize( center, size ) {
  26289. var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
  26290. this.min.copy( center ).sub( halfSize );
  26291. this.max.copy( center ).add( halfSize );
  26292. return this;
  26293. };
  26294. }(),
  26295. clone: function () {
  26296. return new this.constructor().copy( this );
  26297. },
  26298. copy: function ( box ) {
  26299. this.min.copy( box.min );
  26300. this.max.copy( box.max );
  26301. return this;
  26302. },
  26303. makeEmpty: function () {
  26304. this.min.x = this.min.y = + Infinity;
  26305. this.max.x = this.max.y = - Infinity;
  26306. return this;
  26307. },
  26308. isEmpty: function () {
  26309. // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
  26310. return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );
  26311. },
  26312. getCenter: function ( target ) {
  26313. if ( target === undefined ) {
  26314. console.warn( 'THREE.Box2: .getCenter() target is now required' );
  26315. target = new Vector2();
  26316. }
  26317. return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
  26318. },
  26319. getSize: function ( target ) {
  26320. if ( target === undefined ) {
  26321. console.warn( 'THREE.Box2: .getSize() target is now required' );
  26322. target = new Vector2();
  26323. }
  26324. return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );
  26325. },
  26326. expandByPoint: function ( point ) {
  26327. this.min.min( point );
  26328. this.max.max( point );
  26329. return this;
  26330. },
  26331. expandByVector: function ( vector ) {
  26332. this.min.sub( vector );
  26333. this.max.add( vector );
  26334. return this;
  26335. },
  26336. expandByScalar: function ( scalar ) {
  26337. this.min.addScalar( - scalar );
  26338. this.max.addScalar( scalar );
  26339. return this;
  26340. },
  26341. containsPoint: function ( point ) {
  26342. return point.x < this.min.x || point.x > this.max.x ||
  26343. point.y < this.min.y || point.y > this.max.y ? false : true;
  26344. },
  26345. containsBox: function ( box ) {
  26346. return this.min.x <= box.min.x && box.max.x <= this.max.x &&
  26347. this.min.y <= box.min.y && box.max.y <= this.max.y;
  26348. },
  26349. getParameter: function ( point, target ) {
  26350. // This can potentially have a divide by zero if the box
  26351. // has a size dimension of 0.
  26352. if ( target === undefined ) {
  26353. console.warn( 'THREE.Box2: .getParameter() target is now required' );
  26354. target = new Vector2();
  26355. }
  26356. return target.set(
  26357. ( point.x - this.min.x ) / ( this.max.x - this.min.x ),
  26358. ( point.y - this.min.y ) / ( this.max.y - this.min.y )
  26359. );
  26360. },
  26361. intersectsBox: function ( box ) {
  26362. // using 4 splitting planes to rule out intersections
  26363. return box.max.x < this.min.x || box.min.x > this.max.x ||
  26364. box.max.y < this.min.y || box.min.y > this.max.y ? false : true;
  26365. },
  26366. clampPoint: function ( point, target ) {
  26367. if ( target === undefined ) {
  26368. console.warn( 'THREE.Box2: .clampPoint() target is now required' );
  26369. target = new Vector2();
  26370. }
  26371. return target.copy( point ).clamp( this.min, this.max );
  26372. },
  26373. distanceToPoint: function () {
  26374. var v1 = new Vector2();
  26375. return function distanceToPoint( point ) {
  26376. var clampedPoint = v1.copy( point ).clamp( this.min, this.max );
  26377. return clampedPoint.sub( point ).length();
  26378. };
  26379. }(),
  26380. intersect: function ( box ) {
  26381. this.min.max( box.min );
  26382. this.max.min( box.max );
  26383. return this;
  26384. },
  26385. union: function ( box ) {
  26386. this.min.min( box.min );
  26387. this.max.max( box.max );
  26388. return this;
  26389. },
  26390. translate: function ( offset ) {
  26391. this.min.add( offset );
  26392. this.max.add( offset );
  26393. return this;
  26394. },
  26395. equals: function ( box ) {
  26396. return box.min.equals( this.min ) && box.max.equals( this.max );
  26397. }
  26398. } );
  26399. /**
  26400. * @author bhouston / http://clara.io
  26401. */
  26402. function Line3( start, end ) {
  26403. this.start = ( start !== undefined ) ? start : new Vector3();
  26404. this.end = ( end !== undefined ) ? end : new Vector3();
  26405. }
  26406. Object.assign( Line3.prototype, {
  26407. set: function ( start, end ) {
  26408. this.start.copy( start );
  26409. this.end.copy( end );
  26410. return this;
  26411. },
  26412. clone: function () {
  26413. return new this.constructor().copy( this );
  26414. },
  26415. copy: function ( line ) {
  26416. this.start.copy( line.start );
  26417. this.end.copy( line.end );
  26418. return this;
  26419. },
  26420. getCenter: function ( target ) {
  26421. if ( target === undefined ) {
  26422. console.warn( 'THREE.Line3: .getCenter() target is now required' );
  26423. target = new Vector3();
  26424. }
  26425. return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );
  26426. },
  26427. delta: function ( target ) {
  26428. if ( target === undefined ) {
  26429. console.warn( 'THREE.Line3: .delta() target is now required' );
  26430. target = new Vector3();
  26431. }
  26432. return target.subVectors( this.end, this.start );
  26433. },
  26434. distanceSq: function () {
  26435. return this.start.distanceToSquared( this.end );
  26436. },
  26437. distance: function () {
  26438. return this.start.distanceTo( this.end );
  26439. },
  26440. at: function ( t, target ) {
  26441. if ( target === undefined ) {
  26442. console.warn( 'THREE.Line3: .at() target is now required' );
  26443. target = new Vector3();
  26444. }
  26445. return this.delta( target ).multiplyScalar( t ).add( this.start );
  26446. },
  26447. closestPointToPointParameter: function () {
  26448. var startP = new Vector3();
  26449. var startEnd = new Vector3();
  26450. return function closestPointToPointParameter( point, clampToLine ) {
  26451. startP.subVectors( point, this.start );
  26452. startEnd.subVectors( this.end, this.start );
  26453. var startEnd2 = startEnd.dot( startEnd );
  26454. var startEnd_startP = startEnd.dot( startP );
  26455. var t = startEnd_startP / startEnd2;
  26456. if ( clampToLine ) {
  26457. t = _Math.clamp( t, 0, 1 );
  26458. }
  26459. return t;
  26460. };
  26461. }(),
  26462. closestPointToPoint: function ( point, clampToLine, target ) {
  26463. var t = this.closestPointToPointParameter( point, clampToLine );
  26464. if ( target === undefined ) {
  26465. console.warn( 'THREE.Line3: .closestPointToPoint() target is now required' );
  26466. target = new Vector3();
  26467. }
  26468. return this.delta( target ).multiplyScalar( t ).add( this.start );
  26469. },
  26470. applyMatrix4: function ( matrix ) {
  26471. this.start.applyMatrix4( matrix );
  26472. this.end.applyMatrix4( matrix );
  26473. return this;
  26474. },
  26475. equals: function ( line ) {
  26476. return line.start.equals( this.start ) && line.end.equals( this.end );
  26477. }
  26478. } );
  26479. /**
  26480. * @author alteredq / http://alteredqualia.com/
  26481. */
  26482. function ImmediateRenderObject( material ) {
  26483. Object3D.call( this );
  26484. this.material = material;
  26485. this.render = function ( /* renderCallback */ ) {};
  26486. }
  26487. ImmediateRenderObject.prototype = Object.create( Object3D.prototype );
  26488. ImmediateRenderObject.prototype.constructor = ImmediateRenderObject;
  26489. ImmediateRenderObject.prototype.isImmediateRenderObject = true;
  26490. /**
  26491. * @author mrdoob / http://mrdoob.com/
  26492. * @author WestLangley / http://github.com/WestLangley
  26493. */
  26494. function VertexNormalsHelper( object, size, hex, linewidth ) {
  26495. this.object = object;
  26496. this.size = ( size !== undefined ) ? size : 1;
  26497. var color = ( hex !== undefined ) ? hex : 0xff0000;
  26498. var width = ( linewidth !== undefined ) ? linewidth : 1;
  26499. //
  26500. var nNormals = 0;
  26501. var objGeometry = this.object.geometry;
  26502. if ( objGeometry && objGeometry.isGeometry ) {
  26503. nNormals = objGeometry.faces.length * 3;
  26504. } else if ( objGeometry && objGeometry.isBufferGeometry ) {
  26505. nNormals = objGeometry.attributes.normal.count;
  26506. }
  26507. //
  26508. var geometry = new BufferGeometry();
  26509. var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );
  26510. geometry.addAttribute( 'position', positions );
  26511. LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );
  26512. //
  26513. this.matrixAutoUpdate = false;
  26514. this.update();
  26515. }
  26516. VertexNormalsHelper.prototype = Object.create( LineSegments.prototype );
  26517. VertexNormalsHelper.prototype.constructor = VertexNormalsHelper;
  26518. VertexNormalsHelper.prototype.update = ( function () {
  26519. var v1 = new Vector3();
  26520. var v2 = new Vector3();
  26521. var normalMatrix = new Matrix3();
  26522. return function update() {
  26523. var keys = [ 'a', 'b', 'c' ];
  26524. this.object.updateMatrixWorld( true );
  26525. normalMatrix.getNormalMatrix( this.object.matrixWorld );
  26526. var matrixWorld = this.object.matrixWorld;
  26527. var position = this.geometry.attributes.position;
  26528. //
  26529. var objGeometry = this.object.geometry;
  26530. if ( objGeometry && objGeometry.isGeometry ) {
  26531. var vertices = objGeometry.vertices;
  26532. var faces = objGeometry.faces;
  26533. var idx = 0;
  26534. for ( var i = 0, l = faces.length; i < l; i ++ ) {
  26535. var face = faces[ i ];
  26536. for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {
  26537. var vertex = vertices[ face[ keys[ j ] ] ];
  26538. var normal = face.vertexNormals[ j ];
  26539. v1.copy( vertex ).applyMatrix4( matrixWorld );
  26540. v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );
  26541. position.setXYZ( idx, v1.x, v1.y, v1.z );
  26542. idx = idx + 1;
  26543. position.setXYZ( idx, v2.x, v2.y, v2.z );
  26544. idx = idx + 1;
  26545. }
  26546. }
  26547. } else if ( objGeometry && objGeometry.isBufferGeometry ) {
  26548. var objPos = objGeometry.attributes.position;
  26549. var objNorm = objGeometry.attributes.normal;
  26550. var idx = 0;
  26551. // for simplicity, ignore index and drawcalls, and render every normal
  26552. for ( var j = 0, jl = objPos.count; j < jl; j ++ ) {
  26553. v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );
  26554. v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );
  26555. v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );
  26556. position.setXYZ( idx, v1.x, v1.y, v1.z );
  26557. idx = idx + 1;
  26558. position.setXYZ( idx, v2.x, v2.y, v2.z );
  26559. idx = idx + 1;
  26560. }
  26561. }
  26562. position.needsUpdate = true;
  26563. };
  26564. }() );
  26565. /**
  26566. * @author alteredq / http://alteredqualia.com/
  26567. * @author mrdoob / http://mrdoob.com/
  26568. * @author WestLangley / http://github.com/WestLangley
  26569. */
  26570. function SpotLightHelper( light, color ) {
  26571. Object3D.call( this );
  26572. this.light = light;
  26573. this.light.updateMatrixWorld();
  26574. this.matrix = light.matrixWorld;
  26575. this.matrixAutoUpdate = false;
  26576. this.color = color;
  26577. var geometry = new BufferGeometry();
  26578. var positions = [
  26579. 0, 0, 0, 0, 0, 1,
  26580. 0, 0, 0, 1, 0, 1,
  26581. 0, 0, 0, - 1, 0, 1,
  26582. 0, 0, 0, 0, 1, 1,
  26583. 0, 0, 0, 0, - 1, 1
  26584. ];
  26585. for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {
  26586. var p1 = ( i / l ) * Math.PI * 2;
  26587. var p2 = ( j / l ) * Math.PI * 2;
  26588. positions.push(
  26589. Math.cos( p1 ), Math.sin( p1 ), 1,
  26590. Math.cos( p2 ), Math.sin( p2 ), 1
  26591. );
  26592. }
  26593. geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
  26594. var material = new LineBasicMaterial( { fog: false } );
  26595. this.cone = new LineSegments( geometry, material );
  26596. this.add( this.cone );
  26597. this.update();
  26598. }
  26599. SpotLightHelper.prototype = Object.create( Object3D.prototype );
  26600. SpotLightHelper.prototype.constructor = SpotLightHelper;
  26601. SpotLightHelper.prototype.dispose = function () {
  26602. this.cone.geometry.dispose();
  26603. this.cone.material.dispose();
  26604. };
  26605. SpotLightHelper.prototype.update = function () {
  26606. var vector = new Vector3();
  26607. var vector2 = new Vector3();
  26608. return function update() {
  26609. this.light.updateMatrixWorld();
  26610. var coneLength = this.light.distance ? this.light.distance : 1000;
  26611. var coneWidth = coneLength * Math.tan( this.light.angle );
  26612. this.cone.scale.set( coneWidth, coneWidth, coneLength );
  26613. vector.setFromMatrixPosition( this.light.matrixWorld );
  26614. vector2.setFromMatrixPosition( this.light.target.matrixWorld );
  26615. this.cone.lookAt( vector2.sub( vector ) );
  26616. if ( this.color !== undefined ) {
  26617. this.cone.material.color.set( this.color );
  26618. } else {
  26619. this.cone.material.color.copy( this.light.color );
  26620. }
  26621. };
  26622. }();
  26623. /**
  26624. * @author Sean Griffin / http://twitter.com/sgrif
  26625. * @author Michael Guerrero / http://realitymeltdown.com
  26626. * @author mrdoob / http://mrdoob.com/
  26627. * @author ikerr / http://verold.com
  26628. * @author Mugen87 / https://github.com/Mugen87
  26629. */
  26630. function getBoneList( object ) {
  26631. var boneList = [];
  26632. if ( object && object.isBone ) {
  26633. boneList.push( object );
  26634. }
  26635. for ( var i = 0; i < object.children.length; i ++ ) {
  26636. boneList.push.apply( boneList, getBoneList( object.children[ i ] ) );
  26637. }
  26638. return boneList;
  26639. }
  26640. function SkeletonHelper( object ) {
  26641. var bones = getBoneList( object );
  26642. var geometry = new BufferGeometry();
  26643. var vertices = [];
  26644. var colors = [];
  26645. var color1 = new Color( 0, 0, 1 );
  26646. var color2 = new Color( 0, 1, 0 );
  26647. for ( var i = 0; i < bones.length; i ++ ) {
  26648. var bone = bones[ i ];
  26649. if ( bone.parent && bone.parent.isBone ) {
  26650. vertices.push( 0, 0, 0 );
  26651. vertices.push( 0, 0, 0 );
  26652. colors.push( color1.r, color1.g, color1.b );
  26653. colors.push( color2.r, color2.g, color2.b );
  26654. }
  26655. }
  26656. geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  26657. geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
  26658. var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );
  26659. LineSegments.call( this, geometry, material );
  26660. this.root = object;
  26661. this.bones = bones;
  26662. this.matrix = object.matrixWorld;
  26663. this.matrixAutoUpdate = false;
  26664. }
  26665. SkeletonHelper.prototype = Object.create( LineSegments.prototype );
  26666. SkeletonHelper.prototype.constructor = SkeletonHelper;
  26667. SkeletonHelper.prototype.updateMatrixWorld = function () {
  26668. var vector = new Vector3();
  26669. var boneMatrix = new Matrix4();
  26670. var matrixWorldInv = new Matrix4();
  26671. return function updateMatrixWorld( force ) {
  26672. var bones = this.bones;
  26673. var geometry = this.geometry;
  26674. var position = geometry.getAttribute( 'position' );
  26675. matrixWorldInv.getInverse( this.root.matrixWorld );
  26676. for ( var i = 0, j = 0; i < bones.length; i ++ ) {
  26677. var bone = bones[ i ];
  26678. if ( bone.parent && bone.parent.isBone ) {
  26679. boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );
  26680. vector.setFromMatrixPosition( boneMatrix );
  26681. position.setXYZ( j, vector.x, vector.y, vector.z );
  26682. boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );
  26683. vector.setFromMatrixPosition( boneMatrix );
  26684. position.setXYZ( j + 1, vector.x, vector.y, vector.z );
  26685. j += 2;
  26686. }
  26687. }
  26688. geometry.getAttribute( 'position' ).needsUpdate = true;
  26689. Object3D.prototype.updateMatrixWorld.call( this, force );
  26690. };
  26691. }();
  26692. /**
  26693. * @author alteredq / http://alteredqualia.com/
  26694. * @author mrdoob / http://mrdoob.com/
  26695. */
  26696. function PointLightHelper( light, sphereSize, color ) {
  26697. this.light = light;
  26698. this.light.updateMatrixWorld();
  26699. this.color = color;
  26700. var geometry = new SphereBufferGeometry( sphereSize, 4, 2 );
  26701. var material = new MeshBasicMaterial( { wireframe: true, fog: false } );
  26702. Mesh.call( this, geometry, material );
  26703. this.matrix = this.light.matrixWorld;
  26704. this.matrixAutoUpdate = false;
  26705. this.update();
  26706. /*
  26707. var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );
  26708. var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );
  26709. this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
  26710. this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );
  26711. var d = light.distance;
  26712. if ( d === 0.0 ) {
  26713. this.lightDistance.visible = false;
  26714. } else {
  26715. this.lightDistance.scale.set( d, d, d );
  26716. }
  26717. this.add( this.lightDistance );
  26718. */
  26719. }
  26720. PointLightHelper.prototype = Object.create( Mesh.prototype );
  26721. PointLightHelper.prototype.constructor = PointLightHelper;
  26722. PointLightHelper.prototype.dispose = function () {
  26723. this.geometry.dispose();
  26724. this.material.dispose();
  26725. };
  26726. PointLightHelper.prototype.update = function () {
  26727. if ( this.color !== undefined ) {
  26728. this.material.color.set( this.color );
  26729. } else {
  26730. this.material.color.copy( this.light.color );
  26731. }
  26732. /*
  26733. var d = this.light.distance;
  26734. if ( d === 0.0 ) {
  26735. this.lightDistance.visible = false;
  26736. } else {
  26737. this.lightDistance.visible = true;
  26738. this.lightDistance.scale.set( d, d, d );
  26739. }
  26740. */
  26741. };
  26742. /**
  26743. * @author abelnation / http://github.com/abelnation
  26744. * @author Mugen87 / http://github.com/Mugen87
  26745. * @author WestLangley / http://github.com/WestLangley
  26746. */
  26747. function RectAreaLightHelper( light, color ) {
  26748. Object3D.call( this );
  26749. this.light = light;
  26750. this.light.updateMatrixWorld();
  26751. this.matrix = light.matrixWorld;
  26752. this.matrixAutoUpdate = false;
  26753. this.color = color;
  26754. var material = new LineBasicMaterial( { fog: false } );
  26755. var geometry = new BufferGeometry();
  26756. geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) );
  26757. this.line = new Line( geometry, material );
  26758. this.add( this.line );
  26759. this.update();
  26760. }
  26761. RectAreaLightHelper.prototype = Object.create( Object3D.prototype );
  26762. RectAreaLightHelper.prototype.constructor = RectAreaLightHelper;
  26763. RectAreaLightHelper.prototype.dispose = function () {
  26764. this.children[ 0 ].geometry.dispose();
  26765. this.children[ 0 ].material.dispose();
  26766. };
  26767. RectAreaLightHelper.prototype.update = function () {
  26768. // calculate new dimensions of the helper
  26769. var hx = this.light.width * 0.5;
  26770. var hy = this.light.height * 0.5;
  26771. var position = this.line.geometry.attributes.position;
  26772. var array = position.array;
  26773. // update vertices
  26774. array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;
  26775. array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;
  26776. array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;
  26777. array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0;
  26778. array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0;
  26779. position.needsUpdate = true;
  26780. if ( this.color !== undefined ) {
  26781. this.line.material.color.set( this.color );
  26782. } else {
  26783. this.line.material.color.copy( this.light.color );
  26784. }
  26785. };
  26786. /**
  26787. * @author alteredq / http://alteredqualia.com/
  26788. * @author mrdoob / http://mrdoob.com/
  26789. * @author Mugen87 / https://github.com/Mugen87
  26790. */
  26791. function HemisphereLightHelper( light, size, color ) {
  26792. Object3D.call( this );
  26793. this.light = light;
  26794. this.light.updateMatrixWorld();
  26795. this.matrix = light.matrixWorld;
  26796. this.matrixAutoUpdate = false;
  26797. this.color = color;
  26798. var geometry = new OctahedronBufferGeometry( size );
  26799. geometry.rotateY( Math.PI * 0.5 );
  26800. this.material = new MeshBasicMaterial( { wireframe: true, fog: false } );
  26801. if ( this.color === undefined ) this.material.vertexColors = VertexColors;
  26802. var position = geometry.getAttribute( 'position' );
  26803. var colors = new Float32Array( position.count * 3 );
  26804. geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );
  26805. this.add( new Mesh( geometry, this.material ) );
  26806. this.update();
  26807. }
  26808. HemisphereLightHelper.prototype = Object.create( Object3D.prototype );
  26809. HemisphereLightHelper.prototype.constructor = HemisphereLightHelper;
  26810. HemisphereLightHelper.prototype.dispose = function () {
  26811. this.children[ 0 ].geometry.dispose();
  26812. this.children[ 0 ].material.dispose();
  26813. };
  26814. HemisphereLightHelper.prototype.update = function () {
  26815. var vector = new Vector3();
  26816. var color1 = new Color();
  26817. var color2 = new Color();
  26818. return function update() {
  26819. var mesh = this.children[ 0 ];
  26820. if ( this.color !== undefined ) {
  26821. this.material.color.set( this.color );
  26822. } else {
  26823. var colors = mesh.geometry.getAttribute( 'color' );
  26824. color1.copy( this.light.color );
  26825. color2.copy( this.light.groundColor );
  26826. for ( var i = 0, l = colors.count; i < l; i ++ ) {
  26827. var color = ( i < ( l / 2 ) ) ? color1 : color2;
  26828. colors.setXYZ( i, color.r, color.g, color.b );
  26829. }
  26830. colors.needsUpdate = true;
  26831. }
  26832. mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );
  26833. };
  26834. }();
  26835. /**
  26836. * @author mrdoob / http://mrdoob.com/
  26837. */
  26838. function GridHelper( size, divisions, color1, color2 ) {
  26839. size = size || 10;
  26840. divisions = divisions || 10;
  26841. color1 = new Color( color1 !== undefined ? color1 : 0x444444 );
  26842. color2 = new Color( color2 !== undefined ? color2 : 0x888888 );
  26843. var center = divisions / 2;
  26844. var step = size / divisions;
  26845. var halfSize = size / 2;
  26846. var vertices = [], colors = [];
  26847. for ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {
  26848. vertices.push( - halfSize, 0, k, halfSize, 0, k );
  26849. vertices.push( k, 0, - halfSize, k, 0, halfSize );
  26850. var color = i === center ? color1 : color2;
  26851. color.toArray( colors, j ); j += 3;
  26852. color.toArray( colors, j ); j += 3;
  26853. color.toArray( colors, j ); j += 3;
  26854. color.toArray( colors, j ); j += 3;
  26855. }
  26856. var geometry = new BufferGeometry();
  26857. geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  26858. geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
  26859. var material = new LineBasicMaterial( { vertexColors: VertexColors } );
  26860. LineSegments.call( this, geometry, material );
  26861. }
  26862. GridHelper.prototype = Object.create( LineSegments.prototype );
  26863. GridHelper.prototype.constructor = GridHelper;
  26864. /**
  26865. * @author mrdoob / http://mrdoob.com/
  26866. * @author Mugen87 / http://github.com/Mugen87
  26867. * @author Hectate / http://www.github.com/Hectate
  26868. */
  26869. function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {
  26870. radius = radius || 10;
  26871. radials = radials || 16;
  26872. circles = circles || 8;
  26873. divisions = divisions || 64;
  26874. color1 = new Color( color1 !== undefined ? color1 : 0x444444 );
  26875. color2 = new Color( color2 !== undefined ? color2 : 0x888888 );
  26876. var vertices = [];
  26877. var colors = [];
  26878. var x, z;
  26879. var v, i, j, r, color;
  26880. // create the radials
  26881. for ( i = 0; i <= radials; i ++ ) {
  26882. v = ( i / radials ) * ( Math.PI * 2 );
  26883. x = Math.sin( v ) * radius;
  26884. z = Math.cos( v ) * radius;
  26885. vertices.push( 0, 0, 0 );
  26886. vertices.push( x, 0, z );
  26887. color = ( i & 1 ) ? color1 : color2;
  26888. colors.push( color.r, color.g, color.b );
  26889. colors.push( color.r, color.g, color.b );
  26890. }
  26891. // create the circles
  26892. for ( i = 0; i <= circles; i ++ ) {
  26893. color = ( i & 1 ) ? color1 : color2;
  26894. r = radius - ( radius / circles * i );
  26895. for ( j = 0; j < divisions; j ++ ) {
  26896. // first vertex
  26897. v = ( j / divisions ) * ( Math.PI * 2 );
  26898. x = Math.sin( v ) * r;
  26899. z = Math.cos( v ) * r;
  26900. vertices.push( x, 0, z );
  26901. colors.push( color.r, color.g, color.b );
  26902. // second vertex
  26903. v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );
  26904. x = Math.sin( v ) * r;
  26905. z = Math.cos( v ) * r;
  26906. vertices.push( x, 0, z );
  26907. colors.push( color.r, color.g, color.b );
  26908. }
  26909. }
  26910. var geometry = new BufferGeometry();
  26911. geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  26912. geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
  26913. var material = new LineBasicMaterial( { vertexColors: VertexColors } );
  26914. LineSegments.call( this, geometry, material );
  26915. }
  26916. PolarGridHelper.prototype = Object.create( LineSegments.prototype );
  26917. PolarGridHelper.prototype.constructor = PolarGridHelper;
  26918. /**
  26919. * @author mrdoob / http://mrdoob.com/
  26920. * @author WestLangley / http://github.com/WestLangley
  26921. */
  26922. function FaceNormalsHelper( object, size, hex, linewidth ) {
  26923. // FaceNormalsHelper only supports THREE.Geometry
  26924. this.object = object;
  26925. this.size = ( size !== undefined ) ? size : 1;
  26926. var color = ( hex !== undefined ) ? hex : 0xffff00;
  26927. var width = ( linewidth !== undefined ) ? linewidth : 1;
  26928. //
  26929. var nNormals = 0;
  26930. var objGeometry = this.object.geometry;
  26931. if ( objGeometry && objGeometry.isGeometry ) {
  26932. nNormals = objGeometry.faces.length;
  26933. } else {
  26934. console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );
  26935. }
  26936. //
  26937. var geometry = new BufferGeometry();
  26938. var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );
  26939. geometry.addAttribute( 'position', positions );
  26940. LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );
  26941. //
  26942. this.matrixAutoUpdate = false;
  26943. this.update();
  26944. }
  26945. FaceNormalsHelper.prototype = Object.create( LineSegments.prototype );
  26946. FaceNormalsHelper.prototype.constructor = FaceNormalsHelper;
  26947. FaceNormalsHelper.prototype.update = ( function () {
  26948. var v1 = new Vector3();
  26949. var v2 = new Vector3();
  26950. var normalMatrix = new Matrix3();
  26951. return function update() {
  26952. this.object.updateMatrixWorld( true );
  26953. normalMatrix.getNormalMatrix( this.object.matrixWorld );
  26954. var matrixWorld = this.object.matrixWorld;
  26955. var position = this.geometry.attributes.position;
  26956. //
  26957. var objGeometry = this.object.geometry;
  26958. var vertices = objGeometry.vertices;
  26959. var faces = objGeometry.faces;
  26960. var idx = 0;
  26961. for ( var i = 0, l = faces.length; i < l; i ++ ) {
  26962. var face = faces[ i ];
  26963. var normal = face.normal;
  26964. v1.copy( vertices[ face.a ] )
  26965. .add( vertices[ face.b ] )
  26966. .add( vertices[ face.c ] )
  26967. .divideScalar( 3 )
  26968. .applyMatrix4( matrixWorld );
  26969. v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );
  26970. position.setXYZ( idx, v1.x, v1.y, v1.z );
  26971. idx = idx + 1;
  26972. position.setXYZ( idx, v2.x, v2.y, v2.z );
  26973. idx = idx + 1;
  26974. }
  26975. position.needsUpdate = true;
  26976. };
  26977. }() );
  26978. /**
  26979. * @author alteredq / http://alteredqualia.com/
  26980. * @author mrdoob / http://mrdoob.com/
  26981. * @author WestLangley / http://github.com/WestLangley
  26982. */
  26983. function DirectionalLightHelper( light, size, color ) {
  26984. Object3D.call( this );
  26985. this.light = light;
  26986. this.light.updateMatrixWorld();
  26987. this.matrix = light.matrixWorld;
  26988. this.matrixAutoUpdate = false;
  26989. this.color = color;
  26990. if ( size === undefined ) size = 1;
  26991. var geometry = new BufferGeometry();
  26992. geometry.addAttribute( 'position', new Float32BufferAttribute( [
  26993. - size, size, 0,
  26994. size, size, 0,
  26995. size, - size, 0,
  26996. - size, - size, 0,
  26997. - size, size, 0
  26998. ], 3 ) );
  26999. var material = new LineBasicMaterial( { fog: false } );
  27000. this.lightPlane = new Line( geometry, material );
  27001. this.add( this.lightPlane );
  27002. geometry = new BufferGeometry();
  27003. geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );
  27004. this.targetLine = new Line( geometry, material );
  27005. this.add( this.targetLine );
  27006. this.update();
  27007. }
  27008. DirectionalLightHelper.prototype = Object.create( Object3D.prototype );
  27009. DirectionalLightHelper.prototype.constructor = DirectionalLightHelper;
  27010. DirectionalLightHelper.prototype.dispose = function () {
  27011. this.lightPlane.geometry.dispose();
  27012. this.lightPlane.material.dispose();
  27013. this.targetLine.geometry.dispose();
  27014. this.targetLine.material.dispose();
  27015. };
  27016. DirectionalLightHelper.prototype.update = function () {
  27017. var v1 = new Vector3();
  27018. var v2 = new Vector3();
  27019. var v3 = new Vector3();
  27020. return function update() {
  27021. v1.setFromMatrixPosition( this.light.matrixWorld );
  27022. v2.setFromMatrixPosition( this.light.target.matrixWorld );
  27023. v3.subVectors( v2, v1 );
  27024. this.lightPlane.lookAt( v3 );
  27025. if ( this.color !== undefined ) {
  27026. this.lightPlane.material.color.set( this.color );
  27027. this.targetLine.material.color.set( this.color );
  27028. } else {
  27029. this.lightPlane.material.color.copy( this.light.color );
  27030. this.targetLine.material.color.copy( this.light.color );
  27031. }
  27032. this.targetLine.lookAt( v3 );
  27033. this.targetLine.scale.z = v3.length();
  27034. };
  27035. }();
  27036. /**
  27037. * @author alteredq / http://alteredqualia.com/
  27038. * @author Mugen87 / https://github.com/Mugen87
  27039. *
  27040. * - shows frustum, line of sight and up of the camera
  27041. * - suitable for fast updates
  27042. * - based on frustum visualization in lightgl.js shadowmap example
  27043. * http://evanw.github.com/lightgl.js/tests/shadowmap.html
  27044. */
  27045. function CameraHelper( camera ) {
  27046. var geometry = new BufferGeometry();
  27047. var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );
  27048. var vertices = [];
  27049. var colors = [];
  27050. var pointMap = {};
  27051. // colors
  27052. var colorFrustum = new Color( 0xffaa00 );
  27053. var colorCone = new Color( 0xff0000 );
  27054. var colorUp = new Color( 0x00aaff );
  27055. var colorTarget = new Color( 0xffffff );
  27056. var colorCross = new Color( 0x333333 );
  27057. // near
  27058. addLine( 'n1', 'n2', colorFrustum );
  27059. addLine( 'n2', 'n4', colorFrustum );
  27060. addLine( 'n4', 'n3', colorFrustum );
  27061. addLine( 'n3', 'n1', colorFrustum );
  27062. // far
  27063. addLine( 'f1', 'f2', colorFrustum );
  27064. addLine( 'f2', 'f4', colorFrustum );
  27065. addLine( 'f4', 'f3', colorFrustum );
  27066. addLine( 'f3', 'f1', colorFrustum );
  27067. // sides
  27068. addLine( 'n1', 'f1', colorFrustum );
  27069. addLine( 'n2', 'f2', colorFrustum );
  27070. addLine( 'n3', 'f3', colorFrustum );
  27071. addLine( 'n4', 'f4', colorFrustum );
  27072. // cone
  27073. addLine( 'p', 'n1', colorCone );
  27074. addLine( 'p', 'n2', colorCone );
  27075. addLine( 'p', 'n3', colorCone );
  27076. addLine( 'p', 'n4', colorCone );
  27077. // up
  27078. addLine( 'u1', 'u2', colorUp );
  27079. addLine( 'u2', 'u3', colorUp );
  27080. addLine( 'u3', 'u1', colorUp );
  27081. // target
  27082. addLine( 'c', 't', colorTarget );
  27083. addLine( 'p', 'c', colorCross );
  27084. // cross
  27085. addLine( 'cn1', 'cn2', colorCross );
  27086. addLine( 'cn3', 'cn4', colorCross );
  27087. addLine( 'cf1', 'cf2', colorCross );
  27088. addLine( 'cf3', 'cf4', colorCross );
  27089. function addLine( a, b, color ) {
  27090. addPoint( a, color );
  27091. addPoint( b, color );
  27092. }
  27093. function addPoint( id, color ) {
  27094. vertices.push( 0, 0, 0 );
  27095. colors.push( color.r, color.g, color.b );
  27096. if ( pointMap[ id ] === undefined ) {
  27097. pointMap[ id ] = [];
  27098. }
  27099. pointMap[ id ].push( ( vertices.length / 3 ) - 1 );
  27100. }
  27101. geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  27102. geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
  27103. LineSegments.call( this, geometry, material );
  27104. this.camera = camera;
  27105. if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();
  27106. this.matrix = camera.matrixWorld;
  27107. this.matrixAutoUpdate = false;
  27108. this.pointMap = pointMap;
  27109. this.update();
  27110. }
  27111. CameraHelper.prototype = Object.create( LineSegments.prototype );
  27112. CameraHelper.prototype.constructor = CameraHelper;
  27113. CameraHelper.prototype.update = function () {
  27114. var geometry, pointMap;
  27115. var vector = new Vector3();
  27116. var camera = new Camera();
  27117. function setPoint( point, x, y, z ) {
  27118. vector.set( x, y, z ).unproject( camera );
  27119. var points = pointMap[ point ];
  27120. if ( points !== undefined ) {
  27121. var position = geometry.getAttribute( 'position' );
  27122. for ( var i = 0, l = points.length; i < l; i ++ ) {
  27123. position.setXYZ( points[ i ], vector.x, vector.y, vector.z );
  27124. }
  27125. }
  27126. }
  27127. return function update() {
  27128. geometry = this.geometry;
  27129. pointMap = this.pointMap;
  27130. var w = 1, h = 1;
  27131. // we need just camera projection matrix
  27132. // world matrix must be identity
  27133. camera.projectionMatrix.copy( this.camera.projectionMatrix );
  27134. // center / target
  27135. setPoint( 'c', 0, 0, - 1 );
  27136. setPoint( 't', 0, 0, 1 );
  27137. // near
  27138. setPoint( 'n1', - w, - h, - 1 );
  27139. setPoint( 'n2', w, - h, - 1 );
  27140. setPoint( 'n3', - w, h, - 1 );
  27141. setPoint( 'n4', w, h, - 1 );
  27142. // far
  27143. setPoint( 'f1', - w, - h, 1 );
  27144. setPoint( 'f2', w, - h, 1 );
  27145. setPoint( 'f3', - w, h, 1 );
  27146. setPoint( 'f4', w, h, 1 );
  27147. // up
  27148. setPoint( 'u1', w * 0.7, h * 1.1, - 1 );
  27149. setPoint( 'u2', - w * 0.7, h * 1.1, - 1 );
  27150. setPoint( 'u3', 0, h * 2, - 1 );
  27151. // cross
  27152. setPoint( 'cf1', - w, 0, 1 );
  27153. setPoint( 'cf2', w, 0, 1 );
  27154. setPoint( 'cf3', 0, - h, 1 );
  27155. setPoint( 'cf4', 0, h, 1 );
  27156. setPoint( 'cn1', - w, 0, - 1 );
  27157. setPoint( 'cn2', w, 0, - 1 );
  27158. setPoint( 'cn3', 0, - h, - 1 );
  27159. setPoint( 'cn4', 0, h, - 1 );
  27160. geometry.getAttribute( 'position' ).needsUpdate = true;
  27161. };
  27162. }();
  27163. /**
  27164. * @author mrdoob / http://mrdoob.com/
  27165. * @author Mugen87 / http://github.com/Mugen87
  27166. */
  27167. function BoxHelper( object, color ) {
  27168. this.object = object;
  27169. if ( color === undefined ) color = 0xffff00;
  27170. var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
  27171. var positions = new Float32Array( 8 * 3 );
  27172. var geometry = new BufferGeometry();
  27173. geometry.setIndex( new BufferAttribute( indices, 1 ) );
  27174. geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );
  27175. LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );
  27176. this.matrixAutoUpdate = false;
  27177. this.update();
  27178. }
  27179. BoxHelper.prototype = Object.create( LineSegments.prototype );
  27180. BoxHelper.prototype.constructor = BoxHelper;
  27181. BoxHelper.prototype.update = ( function () {
  27182. var box = new Box3();
  27183. return function update( object ) {
  27184. if ( object !== undefined ) {
  27185. console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );
  27186. }
  27187. if ( this.object !== undefined ) {
  27188. box.setFromObject( this.object );
  27189. }
  27190. if ( box.isEmpty() ) return;
  27191. var min = box.min;
  27192. var max = box.max;
  27193. /*
  27194. 5____4
  27195. 1/___0/|
  27196. | 6__|_7
  27197. 2/___3/
  27198. 0: max.x, max.y, max.z
  27199. 1: min.x, max.y, max.z
  27200. 2: min.x, min.y, max.z
  27201. 3: max.x, min.y, max.z
  27202. 4: max.x, max.y, min.z
  27203. 5: min.x, max.y, min.z
  27204. 6: min.x, min.y, min.z
  27205. 7: max.x, min.y, min.z
  27206. */
  27207. var position = this.geometry.attributes.position;
  27208. var array = position.array;
  27209. array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;
  27210. array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;
  27211. array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;
  27212. array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;
  27213. array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;
  27214. array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;
  27215. array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;
  27216. array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;
  27217. position.needsUpdate = true;
  27218. this.geometry.computeBoundingSphere();
  27219. };
  27220. } )();
  27221. BoxHelper.prototype.setFromObject = function ( object ) {
  27222. this.object = object;
  27223. this.update();
  27224. return this;
  27225. };
  27226. /**
  27227. * @author WestLangley / http://github.com/WestLangley
  27228. */
  27229. function Box3Helper( box, hex ) {
  27230. this.type = 'Box3Helper';
  27231. this.box = box;
  27232. var color = ( hex !== undefined ) ? hex : 0xffff00;
  27233. var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
  27234. var positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];
  27235. var geometry = new BufferGeometry();
  27236. geometry.setIndex( new BufferAttribute( indices, 1 ) );
  27237. geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
  27238. LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );
  27239. this.geometry.computeBoundingSphere();
  27240. }
  27241. Box3Helper.prototype = Object.create( LineSegments.prototype );
  27242. Box3Helper.prototype.constructor = Box3Helper;
  27243. Box3Helper.prototype.updateMatrixWorld = function ( force ) {
  27244. var box = this.box;
  27245. if ( box.isEmpty() ) return;
  27246. box.getCenter( this.position );
  27247. box.getSize( this.scale );
  27248. this.scale.multiplyScalar( 0.5 );
  27249. Object3D.prototype.updateMatrixWorld.call( this, force );
  27250. };
  27251. /**
  27252. * @author WestLangley / http://github.com/WestLangley
  27253. */
  27254. function PlaneHelper( plane, size, hex ) {
  27255. this.type = 'PlaneHelper';
  27256. this.plane = plane;
  27257. this.size = ( size === undefined ) ? 1 : size;
  27258. var color = ( hex !== undefined ) ? hex : 0xffff00;
  27259. var positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];
  27260. var geometry = new BufferGeometry();
  27261. geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
  27262. geometry.computeBoundingSphere();
  27263. Line.call( this, geometry, new LineBasicMaterial( { color: color } ) );
  27264. //
  27265. var positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];
  27266. var geometry2 = new BufferGeometry();
  27267. geometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );
  27268. geometry2.computeBoundingSphere();
  27269. this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) );
  27270. }
  27271. PlaneHelper.prototype = Object.create( Line.prototype );
  27272. PlaneHelper.prototype.constructor = PlaneHelper;
  27273. PlaneHelper.prototype.updateMatrixWorld = function ( force ) {
  27274. var scale = - this.plane.constant;
  27275. if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter
  27276. this.scale.set( 0.5 * this.size, 0.5 * this.size, scale );
  27277. this.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here
  27278. this.lookAt( this.plane.normal );
  27279. Object3D.prototype.updateMatrixWorld.call( this, force );
  27280. };
  27281. /**
  27282. * @author WestLangley / http://github.com/WestLangley
  27283. * @author zz85 / http://github.com/zz85
  27284. * @author bhouston / http://clara.io
  27285. *
  27286. * Creates an arrow for visualizing directions
  27287. *
  27288. * Parameters:
  27289. * dir - Vector3
  27290. * origin - Vector3
  27291. * length - Number
  27292. * color - color in hex value
  27293. * headLength - Number
  27294. * headWidth - Number
  27295. */
  27296. var lineGeometry, coneGeometry;
  27297. function ArrowHelper( dir, origin, length, color, headLength, headWidth ) {
  27298. // dir is assumed to be normalized
  27299. Object3D.call( this );
  27300. if ( color === undefined ) color = 0xffff00;
  27301. if ( length === undefined ) length = 1;
  27302. if ( headLength === undefined ) headLength = 0.2 * length;
  27303. if ( headWidth === undefined ) headWidth = 0.2 * headLength;
  27304. if ( lineGeometry === undefined ) {
  27305. lineGeometry = new BufferGeometry();
  27306. lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );
  27307. coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );
  27308. coneGeometry.translate( 0, - 0.5, 0 );
  27309. }
  27310. this.position.copy( origin );
  27311. this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );
  27312. this.line.matrixAutoUpdate = false;
  27313. this.add( this.line );
  27314. this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );
  27315. this.cone.matrixAutoUpdate = false;
  27316. this.add( this.cone );
  27317. this.setDirection( dir );
  27318. this.setLength( length, headLength, headWidth );
  27319. }
  27320. ArrowHelper.prototype = Object.create( Object3D.prototype );
  27321. ArrowHelper.prototype.constructor = ArrowHelper;
  27322. ArrowHelper.prototype.setDirection = ( function () {
  27323. var axis = new Vector3();
  27324. var radians;
  27325. return function setDirection( dir ) {
  27326. // dir is assumed to be normalized
  27327. if ( dir.y > 0.99999 ) {
  27328. this.quaternion.set( 0, 0, 0, 1 );
  27329. } else if ( dir.y < - 0.99999 ) {
  27330. this.quaternion.set( 1, 0, 0, 0 );
  27331. } else {
  27332. axis.set( dir.z, 0, - dir.x ).normalize();
  27333. radians = Math.acos( dir.y );
  27334. this.quaternion.setFromAxisAngle( axis, radians );
  27335. }
  27336. };
  27337. }() );
  27338. ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {
  27339. if ( headLength === undefined ) headLength = 0.2 * length;
  27340. if ( headWidth === undefined ) headWidth = 0.2 * headLength;
  27341. this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );
  27342. this.line.updateMatrix();
  27343. this.cone.scale.set( headWidth, headLength, headWidth );
  27344. this.cone.position.y = length;
  27345. this.cone.updateMatrix();
  27346. };
  27347. ArrowHelper.prototype.setColor = function ( color ) {
  27348. this.line.material.color.copy( color );
  27349. this.cone.material.color.copy( color );
  27350. };
  27351. /**
  27352. * @author sroucheray / http://sroucheray.org/
  27353. * @author mrdoob / http://mrdoob.com/
  27354. */
  27355. function AxesHelper( size ) {
  27356. size = size || 1;
  27357. var vertices = [
  27358. 0, 0, 0, size, 0, 0,
  27359. 0, 0, 0, 0, size, 0,
  27360. 0, 0, 0, 0, 0, size
  27361. ];
  27362. var colors = [
  27363. 1, 0, 0, 1, 0.6, 0,
  27364. 0, 1, 0, 0.6, 1, 0,
  27365. 0, 0, 1, 0, 0.6, 1
  27366. ];
  27367. var geometry = new BufferGeometry();
  27368. geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  27369. geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
  27370. var material = new LineBasicMaterial( { vertexColors: VertexColors } );
  27371. LineSegments.call( this, geometry, material );
  27372. }
  27373. AxesHelper.prototype = Object.create( LineSegments.prototype );
  27374. AxesHelper.prototype.constructor = AxesHelper;
  27375. /**
  27376. * @author mrdoob / http://mrdoob.com/
  27377. */
  27378. function Face4( a, b, c, d, normal, color, materialIndex ) {
  27379. console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );
  27380. return new Face3( a, b, c, normal, color, materialIndex );
  27381. }
  27382. var LineStrip = 0;
  27383. var LinePieces = 1;
  27384. function MeshFaceMaterial( materials ) {
  27385. console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );
  27386. return materials;
  27387. }
  27388. function MultiMaterial( materials ) {
  27389. if ( materials === undefined ) materials = [];
  27390. console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );
  27391. materials.isMultiMaterial = true;
  27392. materials.materials = materials;
  27393. materials.clone = function () {
  27394. return materials.slice();
  27395. };
  27396. return materials;
  27397. }
  27398. function PointCloud( geometry, material ) {
  27399. console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );
  27400. return new Points( geometry, material );
  27401. }
  27402. function Particle( material ) {
  27403. console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );
  27404. return new Sprite( material );
  27405. }
  27406. function ParticleSystem( geometry, material ) {
  27407. console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );
  27408. return new Points( geometry, material );
  27409. }
  27410. function PointCloudMaterial( parameters ) {
  27411. console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );
  27412. return new PointsMaterial( parameters );
  27413. }
  27414. function ParticleBasicMaterial( parameters ) {
  27415. console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );
  27416. return new PointsMaterial( parameters );
  27417. }
  27418. function ParticleSystemMaterial( parameters ) {
  27419. console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );
  27420. return new PointsMaterial( parameters );
  27421. }
  27422. function Vertex( x, y, z ) {
  27423. console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );
  27424. return new Vector3( x, y, z );
  27425. }
  27426. //
  27427. function DynamicBufferAttribute( array, itemSize ) {
  27428. console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );
  27429. return new BufferAttribute( array, itemSize ).setDynamic( true );
  27430. }
  27431. function Int8Attribute( array, itemSize ) {
  27432. console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );
  27433. return new Int8BufferAttribute( array, itemSize );
  27434. }
  27435. function Uint8Attribute( array, itemSize ) {
  27436. console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );
  27437. return new Uint8BufferAttribute( array, itemSize );
  27438. }
  27439. function Uint8ClampedAttribute( array, itemSize ) {
  27440. console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );
  27441. return new Uint8ClampedBufferAttribute( array, itemSize );
  27442. }
  27443. function Int16Attribute( array, itemSize ) {
  27444. console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );
  27445. return new Int16BufferAttribute( array, itemSize );
  27446. }
  27447. function Uint16Attribute( array, itemSize ) {
  27448. console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );
  27449. return new Uint16BufferAttribute( array, itemSize );
  27450. }
  27451. function Int32Attribute( array, itemSize ) {
  27452. console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );
  27453. return new Int32BufferAttribute( array, itemSize );
  27454. }
  27455. function Uint32Attribute( array, itemSize ) {
  27456. console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );
  27457. return new Uint32BufferAttribute( array, itemSize );
  27458. }
  27459. function Float32Attribute( array, itemSize ) {
  27460. console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );
  27461. return new Float32BufferAttribute( array, itemSize );
  27462. }
  27463. function Float64Attribute( array, itemSize ) {
  27464. console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );
  27465. return new Float64BufferAttribute( array, itemSize );
  27466. }
  27467. //
  27468. Curve.create = function ( construct, getPoint ) {
  27469. console.log( 'THREE.Curve.create() has been deprecated' );
  27470. construct.prototype = Object.create( Curve.prototype );
  27471. construct.prototype.constructor = construct;
  27472. construct.prototype.getPoint = getPoint;
  27473. return construct;
  27474. };
  27475. //
  27476. Object.assign( CurvePath.prototype, {
  27477. createPointsGeometry: function ( divisions ) {
  27478. console.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );
  27479. // generate geometry from path points (for Line or Points objects)
  27480. var pts = this.getPoints( divisions );
  27481. return this.createGeometry( pts );
  27482. },
  27483. createSpacedPointsGeometry: function ( divisions ) {
  27484. console.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );
  27485. // generate geometry from equidistant sampling along the path
  27486. var pts = this.getSpacedPoints( divisions );
  27487. return this.createGeometry( pts );
  27488. },
  27489. createGeometry: function ( points ) {
  27490. console.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );
  27491. var geometry = new Geometry();
  27492. for ( var i = 0, l = points.length; i < l; i ++ ) {
  27493. var point = points[ i ];
  27494. geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );
  27495. }
  27496. return geometry;
  27497. }
  27498. } );
  27499. //
  27500. Object.assign( Path.prototype, {
  27501. fromPoints: function ( points ) {
  27502. console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );
  27503. this.setFromPoints( points );
  27504. }
  27505. } );
  27506. //
  27507. function ClosedSplineCurve3( points ) {
  27508. console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );
  27509. CatmullRomCurve3.call( this, points );
  27510. this.type = 'catmullrom';
  27511. this.closed = true;
  27512. }
  27513. ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );
  27514. //
  27515. function SplineCurve3( points ) {
  27516. console.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );
  27517. CatmullRomCurve3.call( this, points );
  27518. this.type = 'catmullrom';
  27519. }
  27520. SplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );
  27521. //
  27522. function Spline( points ) {
  27523. console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );
  27524. CatmullRomCurve3.call( this, points );
  27525. this.type = 'catmullrom';
  27526. }
  27527. Spline.prototype = Object.create( CatmullRomCurve3.prototype );
  27528. Object.assign( Spline.prototype, {
  27529. initFromArray: function ( /* a */ ) {
  27530. console.error( 'THREE.Spline: .initFromArray() has been removed.' );
  27531. },
  27532. getControlPointsArray: function ( /* optionalTarget */ ) {
  27533. console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );
  27534. },
  27535. reparametrizeByArcLength: function ( /* samplingCoef */ ) {
  27536. console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );
  27537. }
  27538. } );
  27539. //
  27540. function AxisHelper( size ) {
  27541. console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );
  27542. return new AxesHelper( size );
  27543. }
  27544. function BoundingBoxHelper( object, color ) {
  27545. console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );
  27546. return new BoxHelper( object, color );
  27547. }
  27548. function EdgesHelper( object, hex ) {
  27549. console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );
  27550. return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );
  27551. }
  27552. GridHelper.prototype.setColors = function () {
  27553. console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );
  27554. };
  27555. SkeletonHelper.prototype.update = function () {
  27556. console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );
  27557. };
  27558. function WireframeHelper( object, hex ) {
  27559. console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );
  27560. return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );
  27561. }
  27562. //
  27563. Object.assign( Loader.prototype, {
  27564. extractUrlBase: function ( url ) {
  27565. console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );
  27566. return LoaderUtils.extractUrlBase( url );
  27567. }
  27568. } );
  27569. function XHRLoader( manager ) {
  27570. console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );
  27571. return new FileLoader( manager );
  27572. }
  27573. function BinaryTextureLoader( manager ) {
  27574. console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );
  27575. return new DataTextureLoader( manager );
  27576. }
  27577. //
  27578. Object.assign( Box2.prototype, {
  27579. center: function ( optionalTarget ) {
  27580. console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );
  27581. return this.getCenter( optionalTarget );
  27582. },
  27583. empty: function () {
  27584. console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );
  27585. return this.isEmpty();
  27586. },
  27587. isIntersectionBox: function ( box ) {
  27588. console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );
  27589. return this.intersectsBox( box );
  27590. },
  27591. size: function ( optionalTarget ) {
  27592. console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );
  27593. return this.getSize( optionalTarget );
  27594. }
  27595. } );
  27596. Object.assign( Box3.prototype, {
  27597. center: function ( optionalTarget ) {
  27598. console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );
  27599. return this.getCenter( optionalTarget );
  27600. },
  27601. empty: function () {
  27602. console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );
  27603. return this.isEmpty();
  27604. },
  27605. isIntersectionBox: function ( box ) {
  27606. console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );
  27607. return this.intersectsBox( box );
  27608. },
  27609. isIntersectionSphere: function ( sphere ) {
  27610. console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
  27611. return this.intersectsSphere( sphere );
  27612. },
  27613. size: function ( optionalTarget ) {
  27614. console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );
  27615. return this.getSize( optionalTarget );
  27616. }
  27617. } );
  27618. Line3.prototype.center = function ( optionalTarget ) {
  27619. console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );
  27620. return this.getCenter( optionalTarget );
  27621. };
  27622. Object.assign( _Math, {
  27623. random16: function () {
  27624. console.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' );
  27625. return Math.random();
  27626. },
  27627. nearestPowerOfTwo: function ( value ) {
  27628. console.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' );
  27629. return _Math.floorPowerOfTwo( value );
  27630. },
  27631. nextPowerOfTwo: function ( value ) {
  27632. console.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' );
  27633. return _Math.ceilPowerOfTwo( value );
  27634. }
  27635. } );
  27636. Object.assign( Matrix3.prototype, {
  27637. flattenToArrayOffset: function ( array, offset ) {
  27638. console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." );
  27639. return this.toArray( array, offset );
  27640. },
  27641. multiplyVector3: function ( vector ) {
  27642. console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );
  27643. return vector.applyMatrix3( this );
  27644. },
  27645. multiplyVector3Array: function ( /* a */ ) {
  27646. console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );
  27647. },
  27648. applyToBuffer: function ( buffer /*, offset, length */ ) {
  27649. console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );
  27650. return this.applyToBufferAttribute( buffer );
  27651. },
  27652. applyToVector3Array: function ( /* array, offset, length */ ) {
  27653. console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );
  27654. }
  27655. } );
  27656. Object.assign( Matrix4.prototype, {
  27657. extractPosition: function ( m ) {
  27658. console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );
  27659. return this.copyPosition( m );
  27660. },
  27661. flattenToArrayOffset: function ( array, offset ) {
  27662. console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." );
  27663. return this.toArray( array, offset );
  27664. },
  27665. getPosition: function () {
  27666. var v1;
  27667. return function getPosition() {
  27668. if ( v1 === undefined ) v1 = new Vector3();
  27669. console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );
  27670. return v1.setFromMatrixColumn( this, 3 );
  27671. };
  27672. }(),
  27673. setRotationFromQuaternion: function ( q ) {
  27674. console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );
  27675. return this.makeRotationFromQuaternion( q );
  27676. },
  27677. multiplyToArray: function () {
  27678. console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );
  27679. },
  27680. multiplyVector3: function ( vector ) {
  27681. console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
  27682. return vector.applyMatrix4( this );
  27683. },
  27684. multiplyVector4: function ( vector ) {
  27685. console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
  27686. return vector.applyMatrix4( this );
  27687. },
  27688. multiplyVector3Array: function ( /* a */ ) {
  27689. console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );
  27690. },
  27691. rotateAxis: function ( v ) {
  27692. console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );
  27693. v.transformDirection( this );
  27694. },
  27695. crossVector: function ( vector ) {
  27696. console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
  27697. return vector.applyMatrix4( this );
  27698. },
  27699. translate: function () {
  27700. console.error( 'THREE.Matrix4: .translate() has been removed.' );
  27701. },
  27702. rotateX: function () {
  27703. console.error( 'THREE.Matrix4: .rotateX() has been removed.' );
  27704. },
  27705. rotateY: function () {
  27706. console.error( 'THREE.Matrix4: .rotateY() has been removed.' );
  27707. },
  27708. rotateZ: function () {
  27709. console.error( 'THREE.Matrix4: .rotateZ() has been removed.' );
  27710. },
  27711. rotateByAxis: function () {
  27712. console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );
  27713. },
  27714. applyToBuffer: function ( buffer /*, offset, length */ ) {
  27715. console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );
  27716. return this.applyToBufferAttribute( buffer );
  27717. },
  27718. applyToVector3Array: function ( /* array, offset, length */ ) {
  27719. console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );
  27720. },
  27721. makeFrustum: function ( left, right, bottom, top, near, far ) {
  27722. console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );
  27723. return this.makePerspective( left, right, top, bottom, near, far );
  27724. }
  27725. } );
  27726. Plane.prototype.isIntersectionLine = function ( line ) {
  27727. console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );
  27728. return this.intersectsLine( line );
  27729. };
  27730. Quaternion.prototype.multiplyVector3 = function ( vector ) {
  27731. console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );
  27732. return vector.applyQuaternion( this );
  27733. };
  27734. Object.assign( Ray.prototype, {
  27735. isIntersectionBox: function ( box ) {
  27736. console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );
  27737. return this.intersectsBox( box );
  27738. },
  27739. isIntersectionPlane: function ( plane ) {
  27740. console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );
  27741. return this.intersectsPlane( plane );
  27742. },
  27743. isIntersectionSphere: function ( sphere ) {
  27744. console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
  27745. return this.intersectsSphere( sphere );
  27746. }
  27747. } );
  27748. Object.assign( Triangle.prototype, {
  27749. area: function () {
  27750. console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );
  27751. return this.getArea();
  27752. },
  27753. barycoordFromPoint: function ( point, target ) {
  27754. console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );
  27755. return this.getBarycoord( point, target );
  27756. },
  27757. midpoint: function ( target ) {
  27758. console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );
  27759. return this.getMidpoint( target );
  27760. },
  27761. normal: function ( target ) {
  27762. console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );
  27763. return this.getNormal( target );
  27764. },
  27765. plane: function ( target ) {
  27766. console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );
  27767. return this.getPlane( target );
  27768. }
  27769. } );
  27770. Object.assign( Triangle, {
  27771. barycoordFromPoint: function ( point, a, b, c, target ) {
  27772. console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );
  27773. return Triangle.getBarycoord( point, a, b, c, target );
  27774. },
  27775. normal: function ( a, b, c, target ) {
  27776. console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );
  27777. return Triangle.getNormal( a, b, c, target );
  27778. }
  27779. } );
  27780. Object.assign( Shape.prototype, {
  27781. extractAllPoints: function ( divisions ) {
  27782. console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );
  27783. return this.extractPoints( divisions );
  27784. },
  27785. extrude: function ( options ) {
  27786. console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );
  27787. return new ExtrudeGeometry( this, options );
  27788. },
  27789. makeGeometry: function ( options ) {
  27790. console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );
  27791. return new ShapeGeometry( this, options );
  27792. }
  27793. } );
  27794. Object.assign( Vector2.prototype, {
  27795. fromAttribute: function ( attribute, index, offset ) {
  27796. console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );
  27797. return this.fromBufferAttribute( attribute, index, offset );
  27798. },
  27799. distanceToManhattan: function ( v ) {
  27800. console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );
  27801. return this.manhattanDistanceTo( v );
  27802. },
  27803. lengthManhattan: function () {
  27804. console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );
  27805. return this.manhattanLength();
  27806. }
  27807. } );
  27808. Object.assign( Vector3.prototype, {
  27809. setEulerFromRotationMatrix: function () {
  27810. console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );
  27811. },
  27812. setEulerFromQuaternion: function () {
  27813. console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );
  27814. },
  27815. getPositionFromMatrix: function ( m ) {
  27816. console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );
  27817. return this.setFromMatrixPosition( m );
  27818. },
  27819. getScaleFromMatrix: function ( m ) {
  27820. console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );
  27821. return this.setFromMatrixScale( m );
  27822. },
  27823. getColumnFromMatrix: function ( index, matrix ) {
  27824. console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );
  27825. return this.setFromMatrixColumn( matrix, index );
  27826. },
  27827. applyProjection: function ( m ) {
  27828. console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );
  27829. return this.applyMatrix4( m );
  27830. },
  27831. fromAttribute: function ( attribute, index, offset ) {
  27832. console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );
  27833. return this.fromBufferAttribute( attribute, index, offset );
  27834. },
  27835. distanceToManhattan: function ( v ) {
  27836. console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );
  27837. return this.manhattanDistanceTo( v );
  27838. },
  27839. lengthManhattan: function () {
  27840. console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );
  27841. return this.manhattanLength();
  27842. }
  27843. } );
  27844. Object.assign( Vector4.prototype, {
  27845. fromAttribute: function ( attribute, index, offset ) {
  27846. console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );
  27847. return this.fromBufferAttribute( attribute, index, offset );
  27848. },
  27849. lengthManhattan: function () {
  27850. console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );
  27851. return this.manhattanLength();
  27852. }
  27853. } );
  27854. //
  27855. Object.assign( Geometry.prototype, {
  27856. computeTangents: function () {
  27857. console.error( 'THREE.Geometry: .computeTangents() has been removed.' );
  27858. },
  27859. computeLineDistances: function () {
  27860. console.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' );
  27861. }
  27862. } );
  27863. Object.assign( Object3D.prototype, {
  27864. getChildByName: function ( name ) {
  27865. console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );
  27866. return this.getObjectByName( name );
  27867. },
  27868. renderDepth: function () {
  27869. console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );
  27870. },
  27871. translate: function ( distance, axis ) {
  27872. console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );
  27873. return this.translateOnAxis( axis, distance );
  27874. },
  27875. getWorldRotation: function () {
  27876. console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );
  27877. }
  27878. } );
  27879. Object.defineProperties( Object3D.prototype, {
  27880. eulerOrder: {
  27881. get: function () {
  27882. console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
  27883. return this.rotation.order;
  27884. },
  27885. set: function ( value ) {
  27886. console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
  27887. this.rotation.order = value;
  27888. }
  27889. },
  27890. useQuaternion: {
  27891. get: function () {
  27892. console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
  27893. },
  27894. set: function () {
  27895. console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
  27896. }
  27897. }
  27898. } );
  27899. Object.defineProperties( LOD.prototype, {
  27900. objects: {
  27901. get: function () {
  27902. console.warn( 'THREE.LOD: .objects has been renamed to .levels.' );
  27903. return this.levels;
  27904. }
  27905. }
  27906. } );
  27907. Object.defineProperty( Skeleton.prototype, 'useVertexTexture', {
  27908. get: function () {
  27909. console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );
  27910. },
  27911. set: function () {
  27912. console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );
  27913. }
  27914. } );
  27915. Object.defineProperty( Curve.prototype, '__arcLengthDivisions', {
  27916. get: function () {
  27917. console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );
  27918. return this.arcLengthDivisions;
  27919. },
  27920. set: function ( value ) {
  27921. console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );
  27922. this.arcLengthDivisions = value;
  27923. }
  27924. } );
  27925. //
  27926. PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {
  27927. console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " +
  27928. "Use .setFocalLength and .filmGauge for a photographic setup." );
  27929. if ( filmGauge !== undefined ) this.filmGauge = filmGauge;
  27930. this.setFocalLength( focalLength );
  27931. };
  27932. //
  27933. Object.defineProperties( Light.prototype, {
  27934. onlyShadow: {
  27935. set: function () {
  27936. console.warn( 'THREE.Light: .onlyShadow has been removed.' );
  27937. }
  27938. },
  27939. shadowCameraFov: {
  27940. set: function ( value ) {
  27941. console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );
  27942. this.shadow.camera.fov = value;
  27943. }
  27944. },
  27945. shadowCameraLeft: {
  27946. set: function ( value ) {
  27947. console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );
  27948. this.shadow.camera.left = value;
  27949. }
  27950. },
  27951. shadowCameraRight: {
  27952. set: function ( value ) {
  27953. console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );
  27954. this.shadow.camera.right = value;
  27955. }
  27956. },
  27957. shadowCameraTop: {
  27958. set: function ( value ) {
  27959. console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );
  27960. this.shadow.camera.top = value;
  27961. }
  27962. },
  27963. shadowCameraBottom: {
  27964. set: function ( value ) {
  27965. console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );
  27966. this.shadow.camera.bottom = value;
  27967. }
  27968. },
  27969. shadowCameraNear: {
  27970. set: function ( value ) {
  27971. console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );
  27972. this.shadow.camera.near = value;
  27973. }
  27974. },
  27975. shadowCameraFar: {
  27976. set: function ( value ) {
  27977. console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );
  27978. this.shadow.camera.far = value;
  27979. }
  27980. },
  27981. shadowCameraVisible: {
  27982. set: function () {
  27983. console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );
  27984. }
  27985. },
  27986. shadowBias: {
  27987. set: function ( value ) {
  27988. console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );
  27989. this.shadow.bias = value;
  27990. }
  27991. },
  27992. shadowDarkness: {
  27993. set: function () {
  27994. console.warn( 'THREE.Light: .shadowDarkness has been removed.' );
  27995. }
  27996. },
  27997. shadowMapWidth: {
  27998. set: function ( value ) {
  27999. console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );
  28000. this.shadow.mapSize.width = value;
  28001. }
  28002. },
  28003. shadowMapHeight: {
  28004. set: function ( value ) {
  28005. console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );
  28006. this.shadow.mapSize.height = value;
  28007. }
  28008. }
  28009. } );
  28010. //
  28011. Object.defineProperties( BufferAttribute.prototype, {
  28012. length: {
  28013. get: function () {
  28014. console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );
  28015. return this.array.length;
  28016. }
  28017. },
  28018. copyIndicesArray: function ( /* indices */ ) {
  28019. console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );
  28020. }
  28021. } );
  28022. Object.assign( BufferGeometry.prototype, {
  28023. addIndex: function ( index ) {
  28024. console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );
  28025. this.setIndex( index );
  28026. },
  28027. addDrawCall: function ( start, count, indexOffset ) {
  28028. if ( indexOffset !== undefined ) {
  28029. console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );
  28030. }
  28031. console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );
  28032. this.addGroup( start, count );
  28033. },
  28034. clearDrawCalls: function () {
  28035. console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );
  28036. this.clearGroups();
  28037. },
  28038. computeTangents: function () {
  28039. console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );
  28040. },
  28041. computeOffsets: function () {
  28042. console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );
  28043. }
  28044. } );
  28045. Object.defineProperties( BufferGeometry.prototype, {
  28046. drawcalls: {
  28047. get: function () {
  28048. console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );
  28049. return this.groups;
  28050. }
  28051. },
  28052. offsets: {
  28053. get: function () {
  28054. console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );
  28055. return this.groups;
  28056. }
  28057. }
  28058. } );
  28059. //
  28060. Object.assign( ExtrudeBufferGeometry.prototype, {
  28061. getArrays: function () {
  28062. console.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' );
  28063. },
  28064. addShapeList: function () {
  28065. console.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' );
  28066. },
  28067. addShape: function () {
  28068. console.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' );
  28069. }
  28070. } );
  28071. //
  28072. Object.defineProperties( Uniform.prototype, {
  28073. dynamic: {
  28074. set: function () {
  28075. console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );
  28076. }
  28077. },
  28078. onUpdate: {
  28079. value: function () {
  28080. console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );
  28081. return this;
  28082. }
  28083. }
  28084. } );
  28085. //
  28086. Object.defineProperties( Material.prototype, {
  28087. wrapAround: {
  28088. get: function () {
  28089. console.warn( 'THREE.Material: .wrapAround has been removed.' );
  28090. },
  28091. set: function () {
  28092. console.warn( 'THREE.Material: .wrapAround has been removed.' );
  28093. }
  28094. },
  28095. wrapRGB: {
  28096. get: function () {
  28097. console.warn( 'THREE.Material: .wrapRGB has been removed.' );
  28098. return new Color();
  28099. }
  28100. },
  28101. shading: {
  28102. get: function () {
  28103. console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
  28104. },
  28105. set: function ( value ) {
  28106. console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
  28107. this.flatShading = ( value === FlatShading );
  28108. }
  28109. }
  28110. } );
  28111. Object.defineProperties( MeshPhongMaterial.prototype, {
  28112. metal: {
  28113. get: function () {
  28114. console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );
  28115. return false;
  28116. },
  28117. set: function () {
  28118. console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );
  28119. }
  28120. }
  28121. } );
  28122. Object.defineProperties( ShaderMaterial.prototype, {
  28123. derivatives: {
  28124. get: function () {
  28125. console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
  28126. return this.extensions.derivatives;
  28127. },
  28128. set: function ( value ) {
  28129. console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
  28130. this.extensions.derivatives = value;
  28131. }
  28132. }
  28133. } );
  28134. //
  28135. Object.assign( WebGLRenderer.prototype, {
  28136. animate: function ( callback ) {
  28137. console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' );
  28138. this.setAnimationLoop( callback );
  28139. },
  28140. getCurrentRenderTarget: function () {
  28141. console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );
  28142. return this.getRenderTarget();
  28143. },
  28144. getMaxAnisotropy: function () {
  28145. console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );
  28146. return this.capabilities.getMaxAnisotropy();
  28147. },
  28148. getPrecision: function () {
  28149. console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );
  28150. return this.capabilities.precision;
  28151. },
  28152. resetGLState: function () {
  28153. console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );
  28154. return this.state.reset();
  28155. },
  28156. supportsFloatTextures: function () {
  28157. console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' );
  28158. return this.extensions.get( 'OES_texture_float' );
  28159. },
  28160. supportsHalfFloatTextures: function () {
  28161. console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' );
  28162. return this.extensions.get( 'OES_texture_half_float' );
  28163. },
  28164. supportsStandardDerivatives: function () {
  28165. console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' );
  28166. return this.extensions.get( 'OES_standard_derivatives' );
  28167. },
  28168. supportsCompressedTextureS3TC: function () {
  28169. console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' );
  28170. return this.extensions.get( 'WEBGL_compressed_texture_s3tc' );
  28171. },
  28172. supportsCompressedTexturePVRTC: function () {
  28173. console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' );
  28174. return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );
  28175. },
  28176. supportsBlendMinMax: function () {
  28177. console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' );
  28178. return this.extensions.get( 'EXT_blend_minmax' );
  28179. },
  28180. supportsVertexTextures: function () {
  28181. console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );
  28182. return this.capabilities.vertexTextures;
  28183. },
  28184. supportsInstancedArrays: function () {
  28185. console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' );
  28186. return this.extensions.get( 'ANGLE_instanced_arrays' );
  28187. },
  28188. enableScissorTest: function ( boolean ) {
  28189. console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );
  28190. this.setScissorTest( boolean );
  28191. },
  28192. initMaterial: function () {
  28193. console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );
  28194. },
  28195. addPrePlugin: function () {
  28196. console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );
  28197. },
  28198. addPostPlugin: function () {
  28199. console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );
  28200. },
  28201. updateShadowMap: function () {
  28202. console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );
  28203. },
  28204. setFaceCulling: function () {
  28205. console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );
  28206. }
  28207. } );
  28208. Object.defineProperties( WebGLRenderer.prototype, {
  28209. shadowMapEnabled: {
  28210. get: function () {
  28211. return this.shadowMap.enabled;
  28212. },
  28213. set: function ( value ) {
  28214. console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );
  28215. this.shadowMap.enabled = value;
  28216. }
  28217. },
  28218. shadowMapType: {
  28219. get: function () {
  28220. return this.shadowMap.type;
  28221. },
  28222. set: function ( value ) {
  28223. console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );
  28224. this.shadowMap.type = value;
  28225. }
  28226. },
  28227. shadowMapCullFace: {
  28228. get: function () {
  28229. console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );
  28230. return undefined;
  28231. },
  28232. set: function ( /* value */ ) {
  28233. console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );
  28234. }
  28235. }
  28236. } );
  28237. Object.defineProperties( WebGLShadowMap.prototype, {
  28238. cullFace: {
  28239. get: function () {
  28240. console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );
  28241. return undefined;
  28242. },
  28243. set: function ( /* cullFace */ ) {
  28244. console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );
  28245. }
  28246. },
  28247. renderReverseSided: {
  28248. get: function () {
  28249. console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );
  28250. return undefined;
  28251. },
  28252. set: function () {
  28253. console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );
  28254. }
  28255. },
  28256. renderSingleSided: {
  28257. get: function () {
  28258. console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );
  28259. return undefined;
  28260. },
  28261. set: function () {
  28262. console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );
  28263. }
  28264. }
  28265. } );
  28266. //
  28267. Object.defineProperties( WebGLRenderTarget.prototype, {
  28268. wrapS: {
  28269. get: function () {
  28270. console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
  28271. return this.texture.wrapS;
  28272. },
  28273. set: function ( value ) {
  28274. console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
  28275. this.texture.wrapS = value;
  28276. }
  28277. },
  28278. wrapT: {
  28279. get: function () {
  28280. console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
  28281. return this.texture.wrapT;
  28282. },
  28283. set: function ( value ) {
  28284. console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
  28285. this.texture.wrapT = value;
  28286. }
  28287. },
  28288. magFilter: {
  28289. get: function () {
  28290. console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
  28291. return this.texture.magFilter;
  28292. },
  28293. set: function ( value ) {
  28294. console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
  28295. this.texture.magFilter = value;
  28296. }
  28297. },
  28298. minFilter: {
  28299. get: function () {
  28300. console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
  28301. return this.texture.minFilter;
  28302. },
  28303. set: function ( value ) {
  28304. console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
  28305. this.texture.minFilter = value;
  28306. }
  28307. },
  28308. anisotropy: {
  28309. get: function () {
  28310. console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
  28311. return this.texture.anisotropy;
  28312. },
  28313. set: function ( value ) {
  28314. console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
  28315. this.texture.anisotropy = value;
  28316. }
  28317. },
  28318. offset: {
  28319. get: function () {
  28320. console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
  28321. return this.texture.offset;
  28322. },
  28323. set: function ( value ) {
  28324. console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
  28325. this.texture.offset = value;
  28326. }
  28327. },
  28328. repeat: {
  28329. get: function () {
  28330. console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
  28331. return this.texture.repeat;
  28332. },
  28333. set: function ( value ) {
  28334. console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
  28335. this.texture.repeat = value;
  28336. }
  28337. },
  28338. format: {
  28339. get: function () {
  28340. console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
  28341. return this.texture.format;
  28342. },
  28343. set: function ( value ) {
  28344. console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
  28345. this.texture.format = value;
  28346. }
  28347. },
  28348. type: {
  28349. get: function () {
  28350. console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
  28351. return this.texture.type;
  28352. },
  28353. set: function ( value ) {
  28354. console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
  28355. this.texture.type = value;
  28356. }
  28357. },
  28358. generateMipmaps: {
  28359. get: function () {
  28360. console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
  28361. return this.texture.generateMipmaps;
  28362. },
  28363. set: function ( value ) {
  28364. console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
  28365. this.texture.generateMipmaps = value;
  28366. }
  28367. }
  28368. } );
  28369. //
  28370. Object.defineProperties( WebVRManager.prototype, {
  28371. standing: {
  28372. set: function ( /* value */ ) {
  28373. console.warn( 'THREE.WebVRManager: .standing has been removed.' );
  28374. }
  28375. }
  28376. } );
  28377. //
  28378. Audio.prototype.load = function ( file ) {
  28379. console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );
  28380. var scope = this;
  28381. var audioLoader = new AudioLoader();
  28382. audioLoader.load( file, function ( buffer ) {
  28383. scope.setBuffer( buffer );
  28384. } );
  28385. return this;
  28386. };
  28387. AudioAnalyser.prototype.getData = function () {
  28388. console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );
  28389. return this.getFrequencyData();
  28390. };
  28391. //
  28392. CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {
  28393. console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );
  28394. return this.update( renderer, scene );
  28395. };
  28396. //
  28397. var GeometryUtils = {
  28398. merge: function ( geometry1, geometry2, materialIndexOffset ) {
  28399. console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );
  28400. var matrix;
  28401. if ( geometry2.isMesh ) {
  28402. geometry2.matrixAutoUpdate && geometry2.updateMatrix();
  28403. matrix = geometry2.matrix;
  28404. geometry2 = geometry2.geometry;
  28405. }
  28406. geometry1.merge( geometry2, matrix, materialIndexOffset );
  28407. },
  28408. center: function ( geometry ) {
  28409. console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );
  28410. return geometry.center();
  28411. }
  28412. };
  28413. ImageUtils.crossOrigin = undefined;
  28414. ImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) {
  28415. console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );
  28416. var loader = new TextureLoader();
  28417. loader.setCrossOrigin( this.crossOrigin );
  28418. var texture = loader.load( url, onLoad, undefined, onError );
  28419. if ( mapping ) texture.mapping = mapping;
  28420. return texture;
  28421. };
  28422. ImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) {
  28423. console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );
  28424. var loader = new CubeTextureLoader();
  28425. loader.setCrossOrigin( this.crossOrigin );
  28426. var texture = loader.load( urls, onLoad, undefined, onError );
  28427. if ( mapping ) texture.mapping = mapping;
  28428. return texture;
  28429. };
  28430. ImageUtils.loadCompressedTexture = function () {
  28431. console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );
  28432. };
  28433. ImageUtils.loadCompressedTextureCube = function () {
  28434. console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );
  28435. };
  28436. //
  28437. function Projector() {
  28438. console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );
  28439. this.projectVector = function ( vector, camera ) {
  28440. console.warn( 'THREE.Projector: .projectVector() is now vector.project().' );
  28441. vector.project( camera );
  28442. };
  28443. this.unprojectVector = function ( vector, camera ) {
  28444. console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );
  28445. vector.unproject( camera );
  28446. };
  28447. this.pickingRay = function () {
  28448. console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );
  28449. };
  28450. }
  28451. //
  28452. function CanvasRenderer() {
  28453. console.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );
  28454. this.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
  28455. this.clear = function () {};
  28456. this.render = function () {};
  28457. this.setClearColor = function () {};
  28458. this.setSize = function () {};
  28459. }
  28460. //
  28461. var SceneUtils = {
  28462. createMultiMaterialObject: function ( /* geometry, materials */ ) {
  28463. console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );
  28464. },
  28465. detach: function ( /* child, parent, scene */ ) {
  28466. console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );
  28467. },
  28468. attach: function ( /* child, scene, parent */ ) {
  28469. console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );
  28470. }
  28471. };
  28472. //
  28473. function LensFlare() {
  28474. console.error( 'THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js' );
  28475. }
  28476. export { WebGLRenderTargetCube, WebGLRenderTarget, WebGLRenderer, ShaderLib, UniformsLib, UniformsUtils, ShaderChunk, FogExp2, Fog, Scene, Sprite, LOD, SkinnedMesh, Skeleton, Bone, Mesh, LineSegments, LineLoop, Line, Points, Group, VideoTexture, DataTexture, CompressedTexture, CubeTexture, CanvasTexture, DepthTexture, Texture, CompressedTextureLoader, DataTextureLoader, CubeTextureLoader, TextureLoader, ObjectLoader, MaterialLoader, BufferGeometryLoader, DefaultLoadingManager, LoadingManager, JSONLoader, ImageLoader, ImageBitmapLoader, FontLoader, FileLoader, Loader, LoaderUtils, Cache, AudioLoader, SpotLightShadow, SpotLight, PointLight, RectAreaLight, HemisphereLight, DirectionalLightShadow, DirectionalLight, AmbientLight, LightShadow, Light, StereoCamera, PerspectiveCamera, OrthographicCamera, CubeCamera, ArrayCamera, Camera, AudioListener, PositionalAudio, AudioContext, AudioAnalyser, Audio, VectorKeyframeTrack, StringKeyframeTrack, QuaternionKeyframeTrack, NumberKeyframeTrack, ColorKeyframeTrack, BooleanKeyframeTrack, PropertyMixer, PropertyBinding, KeyframeTrack, AnimationUtils, AnimationObjectGroup, AnimationMixer, AnimationClip, Uniform, InstancedBufferGeometry, BufferGeometry, Geometry, InterleavedBufferAttribute, InstancedInterleavedBuffer, InterleavedBuffer, InstancedBufferAttribute, Face3, Object3D, Raycaster, Layers, EventDispatcher, Clock, QuaternionLinearInterpolant, LinearInterpolant, DiscreteInterpolant, CubicInterpolant, Interpolant, Triangle, _Math as Math, Spherical, Cylindrical, Plane, Frustum, Sphere, Ray, Matrix4, Matrix3, Box3, Box2, Line3, Euler, Vector4, Vector3, Vector2, Quaternion, Color, ImmediateRenderObject, VertexNormalsHelper, SpotLightHelper, SkeletonHelper, PointLightHelper, RectAreaLightHelper, HemisphereLightHelper, GridHelper, PolarGridHelper, FaceNormalsHelper, DirectionalLightHelper, CameraHelper, BoxHelper, Box3Helper, PlaneHelper, ArrowHelper, AxesHelper, Shape, Path, ShapePath, Font, CurvePath, Curve, ImageUtils, ShapeUtils, WebGLUtils, WireframeGeometry, ParametricGeometry, ParametricBufferGeometry, TetrahedronGeometry, TetrahedronBufferGeometry, OctahedronGeometry, OctahedronBufferGeometry, IcosahedronGeometry, IcosahedronBufferGeometry, DodecahedronGeometry, DodecahedronBufferGeometry, PolyhedronGeometry, PolyhedronBufferGeometry, TubeGeometry, TubeBufferGeometry, TorusKnotGeometry, TorusKnotBufferGeometry, TorusGeometry, TorusBufferGeometry, TextGeometry, TextBufferGeometry, SphereGeometry, SphereBufferGeometry, RingGeometry, RingBufferGeometry, PlaneGeometry, PlaneBufferGeometry, LatheGeometry, LatheBufferGeometry, ShapeGeometry, ShapeBufferGeometry, ExtrudeGeometry, ExtrudeBufferGeometry, EdgesGeometry, ConeGeometry, ConeBufferGeometry, CylinderGeometry, CylinderBufferGeometry, CircleGeometry, CircleBufferGeometry, BoxGeometry, BoxBufferGeometry, ShadowMaterial, SpriteMaterial, RawShaderMaterial, ShaderMaterial, PointsMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshPhongMaterial, MeshToonMaterial, MeshNormalMaterial, MeshLambertMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshBasicMaterial, LineDashedMaterial, LineBasicMaterial, Material, Float64BufferAttribute, Float32BufferAttribute, Uint32BufferAttribute, Int32BufferAttribute, Uint16BufferAttribute, Int16BufferAttribute, Uint8ClampedBufferAttribute, Uint8BufferAttribute, Int8BufferAttribute, BufferAttribute, ArcCurve, CatmullRomCurve3, CubicBezierCurve, CubicBezierCurve3, EllipseCurve, LineCurve, LineCurve3, QuadraticBezierCurve, QuadraticBezierCurve3, SplineCurve, REVISION, MOUSE, CullFaceNone, CullFaceBack, CullFaceFront, CullFaceFrontBack, FrontFaceDirectionCW, FrontFaceDirectionCCW, BasicShadowMap, PCFShadowMap, PCFSoftShadowMap, FrontSide, BackSide, DoubleSide, FlatShading, SmoothShading, NoColors, FaceColors, VertexColors, NoBlending, NormalBlending, AdditiveBlending, SubtractiveBlending, MultiplyBlending, CustomBlending, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, ZeroFactor, OneFactor, SrcColorFactor, OneMinusSrcColorFactor, SrcAlphaFactor, OneMinusSrcAlphaFactor, DstAlphaFactor, OneMinusDstAlphaFactor, DstColorFactor, OneMinusDstColorFactor, SrcAlphaSaturateFactor, NeverDepth, AlwaysDepth, LessDepth, LessEqualDepth, EqualDepth, GreaterEqualDepth, GreaterDepth, NotEqualDepth, MultiplyOperation, MixOperation, AddOperation, NoToneMapping, LinearToneMapping, ReinhardToneMapping, Uncharted2ToneMapping, CineonToneMapping, UVMapping, CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping, SphericalReflectionMapping, CubeUVReflectionMapping, CubeUVRefractionMapping, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter, NearestMipMapNearestFilter, NearestMipMapLinearFilter, LinearFilter, LinearMipMapNearestFilter, LinearMipMapLinearFilter, UnsignedByteType, ByteType, ShortType, UnsignedShortType, IntType, UnsignedIntType, FloatType, HalfFloatType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShort565Type, UnsignedInt248Type, AlphaFormat, RGBFormat, RGBAFormat, LuminanceFormat, LuminanceAlphaFormat, RGBEFormat, DepthFormat, DepthStencilFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, LoopOnce, LoopRepeat, LoopPingPong, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, ZeroCurvatureEnding, ZeroSlopeEnding, WrapAroundEnding, TrianglesDrawMode, TriangleStripDrawMode, TriangleFanDrawMode, LinearEncoding, sRGBEncoding, GammaEncoding, RGBEEncoding, LogLuvEncoding, RGBM7Encoding, RGBM16Encoding, RGBDEncoding, BasicDepthPacking, RGBADepthPacking, TangentSpaceNormalMap, ObjectSpaceNormalMap, Matrix, BoxGeometry as CubeGeometry, Face4, LineStrip, LinePieces, MeshFaceMaterial, MultiMaterial, PointCloud, Particle, ParticleSystem, PointCloudMaterial, ParticleBasicMaterial, ParticleSystemMaterial, Vertex, DynamicBufferAttribute, Int8Attribute, Uint8Attribute, Uint8ClampedAttribute, Int16Attribute, Uint16Attribute, Int32Attribute, Uint32Attribute, Float32Attribute, Float64Attribute, ClosedSplineCurve3, SplineCurve3, Spline, AxisHelper, BoundingBoxHelper, EdgesHelper, WireframeHelper, XHRLoader, BinaryTextureLoader, GeometryUtils, Projector, CanvasRenderer, SceneUtils, LensFlare };
  28477. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWUubW9kdWxlLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcG9seWZpbGxzLmpzIiwiLi4vc3JjL2NvcmUvRXZlbnREaXNwYXRjaGVyLmpzIiwiLi4vc3JjL2NvbnN0YW50cy5qcyIsIi4uL3NyYy9tYXRoL01hdGguanMiLCIuLi9zcmMvbWF0aC9WZWN0b3IyLmpzIiwiLi4vc3JjL21hdGgvTWF0cml4NC5qcyIsIi4uL3NyYy9tYXRoL1F1YXRlcm5pb24uanMiLCIuLi9zcmMvbWF0aC9WZWN0b3IzLmpzIiwiLi4vc3JjL21hdGgvTWF0cml4My5qcyIsIi4uL3NyYy9leHRyYXMvSW1hZ2VVdGlscy5qcyIsIi4uL3NyYy90ZXh0dXJlcy9UZXh0dXJlLmpzIiwiLi4vc3JjL21hdGgvVmVjdG9yNC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvV2ViR0xSZW5kZXJUYXJnZXQuanMiLCIuLi9zcmMvcmVuZGVyZXJzL1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9EYXRhVGV4dHVyZS5qcyIsIi4uL3NyYy9tYXRoL0JveDMuanMiLCIuLi9zcmMvbWF0aC9TcGhlcmUuanMiLCIuLi9zcmMvbWF0aC9QbGFuZS5qcyIsIi4uL3NyYy9tYXRoL0ZydXN0dW0uanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvVW5pZm9ybXNVdGlscy5qcyIsIi4uL3NyYy9tYXRoL0NvbG9yLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1VuaWZvcm1zTGliLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xBbmltYXRpb24uanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMQXR0cmlidXRlcy5qcyIsIi4uL3NyYy9tYXRoL0V1bGVyLmpzIiwiLi4vc3JjL2NvcmUvTGF5ZXJzLmpzIiwiLi4vc3JjL2NvcmUvT2JqZWN0M0QuanMiLCIuLi9zcmMvY2FtZXJhcy9DYW1lcmEuanMiLCIuLi9zcmMvY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMiLCIuLi9zcmMvY29yZS9GYWNlMy5qcyIsIi4uL3NyYy9jb3JlL0dlb21ldHJ5LmpzIiwiLi4vc3JjL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzIiwiLi4vc3JjL2NvcmUvRGlyZWN0R2VvbWV0cnkuanMiLCIuLi9zcmMvdXRpbHMuanMiLCIuLi9zcmMvY29yZS9CdWZmZXJHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0JveEdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvUGxhbmVHZW9tZXRyeS5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hCYXNpY01hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9TaGFkZXJNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRoL1JheS5qcyIsIi4uL3NyYy9tYXRoL1RyaWFuZ2xlLmpzIiwiLi4vc3JjL29iamVjdHMvTWVzaC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xCYWNrZ3JvdW5kLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTEJ1ZmZlclJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTENhcGFiaWxpdGllcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xDbGlwcGluZy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xFeHRlbnNpb25zLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTEdlb21ldHJpZXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTEluZm8uanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMTW9ycGh0YXJnZXRzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTE9iamVjdHMuanMiLCIuLi9zcmMvdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMVW5pZm9ybXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMU2hhZGVyLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTFByb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMUHJvZ3JhbXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMUHJvcGVydGllcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xSZW5kZXJMaXN0cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xMaWdodHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMUmVuZGVyU3RhdGVzLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoRGVwdGhNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaERpc3RhbmNlTWF0ZXJpYWwuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMU2hhZG93TWFwLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTFN0YXRlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTFRleHR1cmVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTFV0aWxzLmpzIiwiLi4vc3JjL29iamVjdHMvR3JvdXAuanMiLCIuLi9zcmMvY2FtZXJhcy9QZXJzcGVjdGl2ZUNhbWVyYS5qcyIsIi4uL3NyYy9jYW1lcmFzL0FycmF5Q2FtZXJhLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJ2ci9XZWJWUk1hbmFnZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYnZyL1dlYlhSTWFuYWdlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvV2ViR0xSZW5kZXJlci5qcyIsIi4uL3NyYy9zY2VuZXMvRm9nRXhwMi5qcyIsIi4uL3NyYy9zY2VuZXMvRm9nLmpzIiwiLi4vc3JjL3NjZW5lcy9TY2VuZS5qcyIsIi4uL3NyYy9jb3JlL0ludGVybGVhdmVkQnVmZmVyLmpzIiwiLi4vc3JjL2NvcmUvSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL1Nwcml0ZU1hdGVyaWFsLmpzIiwiLi4vc3JjL29iamVjdHMvU3ByaXRlLmpzIiwiLi4vc3JjL29iamVjdHMvTE9ELmpzIiwiLi4vc3JjL29iamVjdHMvU2tlbGV0b24uanMiLCIuLi9zcmMvb2JqZWN0cy9Cb25lLmpzIiwiLi4vc3JjL29iamVjdHMvU2tpbm5lZE1lc2guanMiLCIuLi9zcmMvbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzIiwiLi4vc3JjL29iamVjdHMvTGluZS5qcyIsIi4uL3NyYy9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyIsIi4uL3NyYy9vYmplY3RzL0xpbmVMb29wLmpzIiwiLi4vc3JjL21hdGVyaWFscy9Qb2ludHNNYXRlcmlhbC5qcyIsIi4uL3NyYy9vYmplY3RzL1BvaW50cy5qcyIsIi4uL3NyYy90ZXh0dXJlcy9WaWRlb1RleHR1cmUuanMiLCIuLi9zcmMvdGV4dHVyZXMvQ29tcHJlc3NlZFRleHR1cmUuanMiLCIuLi9zcmMvdGV4dHVyZXMvQ2FudmFzVGV4dHVyZS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9EZXB0aFRleHR1cmUuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9XaXJlZnJhbWVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1BhcmFtZXRyaWNHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1BvbHloZWRyb25HZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1RldHJhaGVkcm9uR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9PY3RhaGVkcm9uR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9JY29zYWhlZHJvbkdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvRG9kZWNhaGVkcm9uR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9UdWJlR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9Ub3J1c0tub3RHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1RvcnVzR2VvbWV0cnkuanMiLCIuLi9zcmMvZXh0cmFzL0VhcmN1dC5qcyIsIi4uL3NyYy9leHRyYXMvU2hhcGVVdGlscy5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0V4dHJ1ZGVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1RleHRHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1NwaGVyZUdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvUmluZ0dlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvTGF0aGVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1NoYXBlR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9FZGdlc0dlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvQ3lsaW5kZXJHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0NvbmVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0NpcmNsZUdlb21ldHJ5LmpzIiwiLi4vc3JjL21hdGVyaWFscy9TaGFkb3dNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvUmF3U2hhZGVyTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hTdGFuZGFyZE1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoUGh5c2ljYWxNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaFBob25nTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hUb29uTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hOb3JtYWxNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaExhbWJlcnRNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTGluZURhc2hlZE1hdGVyaWFsLmpzIiwiLi4vc3JjL2xvYWRlcnMvQ2FjaGUuanMiLCIuLi9zcmMvbG9hZGVycy9Mb2FkaW5nTWFuYWdlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0ZpbGVMb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9Db21wcmVzc2VkVGV4dHVyZUxvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0RhdGFUZXh0dXJlTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvSW1hZ2VMb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9DdWJlVGV4dHVyZUxvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL1RleHR1cmVMb2FkZXIuanMiLCIuLi9zcmMvZXh0cmFzL2NvcmUvQ3VydmUuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9FbGxpcHNlQ3VydmUuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9BcmNDdXJ2ZS5qcyIsIi4uL3NyYy9leHRyYXMvY3VydmVzL0NhdG11bGxSb21DdXJ2ZTMuanMiLCIuLi9zcmMvZXh0cmFzL2NvcmUvSW50ZXJwb2xhdGlvbnMuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9DdWJpY0JlemllckN1cnZlLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvQ3ViaWNCZXppZXJDdXJ2ZTMuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9MaW5lQ3VydmUuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9MaW5lQ3VydmUzLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvUXVhZHJhdGljQmV6aWVyQ3VydmUuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9RdWFkcmF0aWNCZXppZXJDdXJ2ZTMuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9TcGxpbmVDdXJ2ZS5qcyIsIi4uL3NyYy9leHRyYXMvY29yZS9DdXJ2ZVBhdGguanMiLCIuLi9zcmMvZXh0cmFzL2NvcmUvUGF0aC5qcyIsIi4uL3NyYy9leHRyYXMvY29yZS9TaGFwZS5qcyIsIi4uL3NyYy9saWdodHMvTGlnaHQuanMiLCIuLi9zcmMvbGlnaHRzL0hlbWlzcGhlcmVMaWdodC5qcyIsIi4uL3NyYy9saWdodHMvTGlnaHRTaGFkb3cuanMiLCIuLi9zcmMvbGlnaHRzL1Nwb3RMaWdodFNoYWRvdy5qcyIsIi4uL3NyYy9saWdodHMvU3BvdExpZ2h0LmpzIiwiLi4vc3JjL2xpZ2h0cy9Qb2ludExpZ2h0LmpzIiwiLi4vc3JjL2xpZ2h0cy9EaXJlY3Rpb25hbExpZ2h0U2hhZG93LmpzIiwiLi4vc3JjL2xpZ2h0cy9EaXJlY3Rpb25hbExpZ2h0LmpzIiwiLi4vc3JjL2xpZ2h0cy9BbWJpZW50TGlnaHQuanMiLCIuLi9zcmMvbGlnaHRzL1JlY3RBcmVhTGlnaHQuanMiLCIuLi9zcmMvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmpzIiwiLi4vc3JjL21hdGgvSW50ZXJwb2xhbnQuanMiLCIuLi9zcmMvbWF0aC9pbnRlcnBvbGFudHMvQ3ViaWNJbnRlcnBvbGFudC5qcyIsIi4uL3NyYy9tYXRoL2ludGVycG9sYW50cy9MaW5lYXJJbnRlcnBvbGFudC5qcyIsIi4uL3NyYy9tYXRoL2ludGVycG9sYW50cy9EaXNjcmV0ZUludGVycG9sYW50LmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9LZXlmcmFtZVRyYWNrLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi90cmFja3MvQm9vbGVhbktleWZyYW1lVHJhY2suanMiLCIuLi9zcmMvYW5pbWF0aW9uL3RyYWNrcy9Db2xvcktleWZyYW1lVHJhY2suanMiLCIuLi9zcmMvYW5pbWF0aW9uL3RyYWNrcy9OdW1iZXJLZXlmcmFtZVRyYWNrLmpzIiwiLi4vc3JjL21hdGgvaW50ZXJwb2xhbnRzL1F1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5qcyIsIi4uL3NyYy9hbmltYXRpb24vdHJhY2tzL1F1YXRlcm5pb25LZXlmcmFtZVRyYWNrLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi90cmFja3MvU3RyaW5nS2V5ZnJhbWVUcmFjay5qcyIsIi4uL3NyYy9hbmltYXRpb24vdHJhY2tzL1ZlY3RvcktleWZyYW1lVHJhY2suanMiLCIuLi9zcmMvYW5pbWF0aW9uL0FuaW1hdGlvbkNsaXAuanMiLCIuLi9zcmMvbG9hZGVycy9NYXRlcmlhbExvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0J1ZmZlckdlb21ldHJ5TG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvTG9hZGVyVXRpbHMuanMiLCIuLi9zcmMvbG9hZGVycy9KU09OTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvT2JqZWN0TG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvSW1hZ2VCaXRtYXBMb2FkZXIuanMiLCIuLi9zcmMvZXh0cmFzL2NvcmUvU2hhcGVQYXRoLmpzIiwiLi4vc3JjL2V4dHJhcy9jb3JlL0ZvbnQuanMiLCIuLi9zcmMvbG9hZGVycy9Gb250TG9hZGVyLmpzIiwiLi4vc3JjL2F1ZGlvL0F1ZGlvQ29udGV4dC5qcyIsIi4uL3NyYy9sb2FkZXJzL0F1ZGlvTG9hZGVyLmpzIiwiLi4vc3JjL2NhbWVyYXMvU3RlcmVvQ2FtZXJhLmpzIiwiLi4vc3JjL2NhbWVyYXMvQ3ViZUNhbWVyYS5qcyIsIi4uL3NyYy9hdWRpby9BdWRpb0xpc3RlbmVyLmpzIiwiLi4vc3JjL2F1ZGlvL0F1ZGlvLmpzIiwiLi4vc3JjL2F1ZGlvL1Bvc2l0aW9uYWxBdWRpby5qcyIsIi4uL3NyYy9hdWRpby9BdWRpb0FuYWx5c2VyLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9Qcm9wZXJ0eU1peGVyLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9Qcm9wZXJ0eUJpbmRpbmcuanMiLCIuLi9zcmMvYW5pbWF0aW9uL0FuaW1hdGlvbk9iamVjdEdyb3VwLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9BbmltYXRpb25BY3Rpb24uanMiLCIuLi9zcmMvYW5pbWF0aW9uL0FuaW1hdGlvbk1peGVyLmpzIiwiLi4vc3JjL2NvcmUvVW5pZm9ybS5qcyIsIi4uL3NyYy9jb3JlL0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LmpzIiwiLi4vc3JjL2NvcmUvSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIuanMiLCIuLi9zcmMvY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMiLCIuLi9zcmMvY29yZS9SYXljYXN0ZXIuanMiLCIuLi9zcmMvY29yZS9DbG9jay5qcyIsIi4uL3NyYy9tYXRoL1NwaGVyaWNhbC5qcyIsIi4uL3NyYy9tYXRoL0N5bGluZHJpY2FsLmpzIiwiLi4vc3JjL21hdGgvQm94Mi5qcyIsIi4uL3NyYy9tYXRoL0xpbmUzLmpzIiwiLi4vc3JjL2V4dHJhcy9vYmplY3RzL0ltbWVkaWF0ZVJlbmRlck9iamVjdC5qcyIsIi4uL3NyYy9oZWxwZXJzL1ZlcnRleE5vcm1hbHNIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9TcG90TGlnaHRIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9Ta2VsZXRvbkhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL1BvaW50TGlnaHRIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9SZWN0QXJlYUxpZ2h0SGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvSGVtaXNwaGVyZUxpZ2h0SGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvR3JpZEhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL1BvbGFyR3JpZEhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0ZhY2VOb3JtYWxzSGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvRGlyZWN0aW9uYWxMaWdodEhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0NhbWVyYUhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0JveEhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0JveDNIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9QbGFuZUhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0Fycm93SGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvQXhlc0hlbHBlci5qcyIsIi4uL3NyYy9UaHJlZS5MZWdhY3kuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gUG9seWZpbGxzXG5cbmlmICggTnVtYmVyLkVQU0lMT04gPT09IHVuZGVmaW5lZCApIHtcblxuXHROdW1iZXIuRVBTSUxPTiA9IE1hdGgucG93KCAyLCAtIDUyICk7XG5cbn1cblxuaWYgKCBOdW1iZXIuaXNJbnRlZ2VyID09PSB1bmRlZmluZWQgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9OdW1iZXIvaXNJbnRlZ2VyXG5cblx0TnVtYmVyLmlzSW50ZWdlciA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSggdmFsdWUgKSAmJiBNYXRoLmZsb29yKCB2YWx1ZSApID09PSB2YWx1ZTtcblxuXHR9O1xuXG59XG5cbi8vXG5cbmlmICggTWF0aC5zaWduID09PSB1bmRlZmluZWQgKSB7XG5cblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9zaWduXG5cblx0TWF0aC5zaWduID0gZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0cmV0dXJuICggeCA8IDAgKSA/IC0gMSA6ICggeCA+IDAgKSA/IDEgOiArIHg7XG5cblx0fTtcblxufVxuXG5pZiAoICduYW1lJyBpbiBGdW5jdGlvbi5wcm90b3R5cGUgPT09IGZhbHNlICkge1xuXG5cdC8vIE1pc3NpbmcgaW4gSUVcblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vbmFtZVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggRnVuY3Rpb24ucHJvdG90eXBlLCAnbmFtZScsIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLm1hdGNoKCAvXlxccypmdW5jdGlvblxccyooW15cXChcXHNdKikvIClbIDEgXTtcblxuXHRcdH1cblxuXHR9ICk7XG5cbn1cblxuaWYgKCBPYmplY3QuYXNzaWduID09PSB1bmRlZmluZWQgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5cblx0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgb3V0cHV0ID0gT2JqZWN0KCB0YXJnZXQgKTtcblxuXHRcdFx0Zm9yICggdmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCArKyApIHtcblxuXHRcdFx0XHR2YXIgc291cmNlID0gYXJndW1lbnRzWyBpbmRleCBdO1xuXG5cdFx0XHRcdGlmICggc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIG5leHRLZXkgaW4gc291cmNlICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggc291cmNlLCBuZXh0S2V5ICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0b3V0cHV0WyBuZXh0S2V5IF0gPSBzb3VyY2VbIG5leHRLZXkgXTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdFx0fTtcblxuXHR9ICkoKTtcblxufVxuIiwiLyoqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL2V2ZW50ZGlzcGF0Y2hlci5qcy9cbiAqL1xuXG5mdW5jdGlvbiBFdmVudERpc3BhdGNoZXIoKSB7fVxuXG5PYmplY3QuYXNzaWduKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7XG5cblx0YWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cblx0XHRpZiAoIGxpc3RlbmVyc1sgdHlwZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGxpc3RlbmVyc1sgdHlwZSBdID0gW107XG5cblx0XHR9XG5cblx0XHRpZiAoIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgPT09IC0gMSApIHtcblxuXHRcdFx0bGlzdGVuZXJzWyB0eXBlIF0ucHVzaCggbGlzdGVuZXIgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGhhc0V2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuXHRcdHJldHVybiBsaXN0ZW5lcnNbIHR5cGUgXSAhPT0gdW5kZWZpbmVkICYmIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgIT09IC0gMTtcblxuXHR9LFxuXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHR2YXIgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgdHlwZSBdO1xuXG5cdFx0aWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBpbmRleCA9IGxpc3RlbmVyQXJyYXkuaW5kZXhPZiggbGlzdGVuZXIgKTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xuXG5cdFx0XHRcdGxpc3RlbmVyQXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cdFx0dmFyIGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIGV2ZW50LnR5cGUgXTtcblxuXHRcdGlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRldmVudC50YXJnZXQgPSB0aGlzO1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBsaXN0ZW5lckFycmF5LnNsaWNlKCAwICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXJyYXlbIGkgXS5jYWxsKCB0aGlzLCBldmVudCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgRXZlbnREaXNwYXRjaGVyIH07XG4iLCJleHBvcnQgdmFyIFJFVklTSU9OID0gJzk1JztcbmV4cG9ydCB2YXIgTU9VU0UgPSB7IExFRlQ6IDAsIE1JRERMRTogMSwgUklHSFQ6IDIgfTtcbmV4cG9ydCB2YXIgQ3VsbEZhY2VOb25lID0gMDtcbmV4cG9ydCB2YXIgQ3VsbEZhY2VCYWNrID0gMTtcbmV4cG9ydCB2YXIgQ3VsbEZhY2VGcm9udCA9IDI7XG5leHBvcnQgdmFyIEN1bGxGYWNlRnJvbnRCYWNrID0gMztcbmV4cG9ydCB2YXIgRnJvbnRGYWNlRGlyZWN0aW9uQ1cgPSAwO1xuZXhwb3J0IHZhciBGcm9udEZhY2VEaXJlY3Rpb25DQ1cgPSAxO1xuZXhwb3J0IHZhciBCYXNpY1NoYWRvd01hcCA9IDA7XG5leHBvcnQgdmFyIFBDRlNoYWRvd01hcCA9IDE7XG5leHBvcnQgdmFyIFBDRlNvZnRTaGFkb3dNYXAgPSAyO1xuZXhwb3J0IHZhciBGcm9udFNpZGUgPSAwO1xuZXhwb3J0IHZhciBCYWNrU2lkZSA9IDE7XG5leHBvcnQgdmFyIERvdWJsZVNpZGUgPSAyO1xuZXhwb3J0IHZhciBGbGF0U2hhZGluZyA9IDE7XG5leHBvcnQgdmFyIFNtb290aFNoYWRpbmcgPSAyO1xuZXhwb3J0IHZhciBOb0NvbG9ycyA9IDA7XG5leHBvcnQgdmFyIEZhY2VDb2xvcnMgPSAxO1xuZXhwb3J0IHZhciBWZXJ0ZXhDb2xvcnMgPSAyO1xuZXhwb3J0IHZhciBOb0JsZW5kaW5nID0gMDtcbmV4cG9ydCB2YXIgTm9ybWFsQmxlbmRpbmcgPSAxO1xuZXhwb3J0IHZhciBBZGRpdGl2ZUJsZW5kaW5nID0gMjtcbmV4cG9ydCB2YXIgU3VidHJhY3RpdmVCbGVuZGluZyA9IDM7XG5leHBvcnQgdmFyIE11bHRpcGx5QmxlbmRpbmcgPSA0O1xuZXhwb3J0IHZhciBDdXN0b21CbGVuZGluZyA9IDU7XG5leHBvcnQgdmFyIEFkZEVxdWF0aW9uID0gMTAwO1xuZXhwb3J0IHZhciBTdWJ0cmFjdEVxdWF0aW9uID0gMTAxO1xuZXhwb3J0IHZhciBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiA9IDEwMjtcbmV4cG9ydCB2YXIgTWluRXF1YXRpb24gPSAxMDM7XG5leHBvcnQgdmFyIE1heEVxdWF0aW9uID0gMTA0O1xuZXhwb3J0IHZhciBaZXJvRmFjdG9yID0gMjAwO1xuZXhwb3J0IHZhciBPbmVGYWN0b3IgPSAyMDE7XG5leHBvcnQgdmFyIFNyY0NvbG9yRmFjdG9yID0gMjAyO1xuZXhwb3J0IHZhciBPbmVNaW51c1NyY0NvbG9yRmFjdG9yID0gMjAzO1xuZXhwb3J0IHZhciBTcmNBbHBoYUZhY3RvciA9IDIwNDtcbmV4cG9ydCB2YXIgT25lTWludXNTcmNBbHBoYUZhY3RvciA9IDIwNTtcbmV4cG9ydCB2YXIgRHN0QWxwaGFGYWN0b3IgPSAyMDY7XG5leHBvcnQgdmFyIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgPSAyMDc7XG5leHBvcnQgdmFyIERzdENvbG9yRmFjdG9yID0gMjA4O1xuZXhwb3J0IHZhciBPbmVNaW51c0RzdENvbG9yRmFjdG9yID0gMjA5O1xuZXhwb3J0IHZhciBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yID0gMjEwO1xuZXhwb3J0IHZhciBOZXZlckRlcHRoID0gMDtcbmV4cG9ydCB2YXIgQWx3YXlzRGVwdGggPSAxO1xuZXhwb3J0IHZhciBMZXNzRGVwdGggPSAyO1xuZXhwb3J0IHZhciBMZXNzRXF1YWxEZXB0aCA9IDM7XG5leHBvcnQgdmFyIEVxdWFsRGVwdGggPSA0O1xuZXhwb3J0IHZhciBHcmVhdGVyRXF1YWxEZXB0aCA9IDU7XG5leHBvcnQgdmFyIEdyZWF0ZXJEZXB0aCA9IDY7XG5leHBvcnQgdmFyIE5vdEVxdWFsRGVwdGggPSA3O1xuZXhwb3J0IHZhciBNdWx0aXBseU9wZXJhdGlvbiA9IDA7XG5leHBvcnQgdmFyIE1peE9wZXJhdGlvbiA9IDE7XG5leHBvcnQgdmFyIEFkZE9wZXJhdGlvbiA9IDI7XG5leHBvcnQgdmFyIE5vVG9uZU1hcHBpbmcgPSAwO1xuZXhwb3J0IHZhciBMaW5lYXJUb25lTWFwcGluZyA9IDE7XG5leHBvcnQgdmFyIFJlaW5oYXJkVG9uZU1hcHBpbmcgPSAyO1xuZXhwb3J0IHZhciBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcgPSAzO1xuZXhwb3J0IHZhciBDaW5lb25Ub25lTWFwcGluZyA9IDQ7XG5leHBvcnQgdmFyIFVWTWFwcGluZyA9IDMwMDtcbmV4cG9ydCB2YXIgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nID0gMzAxO1xuZXhwb3J0IHZhciBDdWJlUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDI7XG5leHBvcnQgdmFyIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nID0gMzAzO1xuZXhwb3J0IHZhciBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyA9IDMwNDtcbmV4cG9ydCB2YXIgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDU7XG5leHBvcnQgdmFyIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nID0gMzA2O1xuZXhwb3J0IHZhciBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyA9IDMwNztcbmV4cG9ydCB2YXIgUmVwZWF0V3JhcHBpbmcgPSAxMDAwO1xuZXhwb3J0IHZhciBDbGFtcFRvRWRnZVdyYXBwaW5nID0gMTAwMTtcbmV4cG9ydCB2YXIgTWlycm9yZWRSZXBlYXRXcmFwcGluZyA9IDEwMDI7XG5leHBvcnQgdmFyIE5lYXJlc3RGaWx0ZXIgPSAxMDAzO1xuZXhwb3J0IHZhciBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDQ7XG5leHBvcnQgdmFyIE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA1O1xuZXhwb3J0IHZhciBMaW5lYXJGaWx0ZXIgPSAxMDA2O1xuZXhwb3J0IHZhciBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNztcbmV4cG9ydCB2YXIgTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyID0gMTAwODtcbmV4cG9ydCB2YXIgVW5zaWduZWRCeXRlVHlwZSA9IDEwMDk7XG5leHBvcnQgdmFyIEJ5dGVUeXBlID0gMTAxMDtcbmV4cG9ydCB2YXIgU2hvcnRUeXBlID0gMTAxMTtcbmV4cG9ydCB2YXIgVW5zaWduZWRTaG9ydFR5cGUgPSAxMDEyO1xuZXhwb3J0IHZhciBJbnRUeXBlID0gMTAxMztcbmV4cG9ydCB2YXIgVW5zaWduZWRJbnRUeXBlID0gMTAxNDtcbmV4cG9ydCB2YXIgRmxvYXRUeXBlID0gMTAxNTtcbmV4cG9ydCB2YXIgSGFsZkZsb2F0VHlwZSA9IDEwMTY7XG5leHBvcnQgdmFyIFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSA9IDEwMTc7XG5leHBvcnQgdmFyIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSA9IDEwMTg7XG5leHBvcnQgdmFyIFVuc2lnbmVkU2hvcnQ1NjVUeXBlID0gMTAxOTtcbmV4cG9ydCB2YXIgVW5zaWduZWRJbnQyNDhUeXBlID0gMTAyMDtcbmV4cG9ydCB2YXIgQWxwaGFGb3JtYXQgPSAxMDIxO1xuZXhwb3J0IHZhciBSR0JGb3JtYXQgPSAxMDIyO1xuZXhwb3J0IHZhciBSR0JBRm9ybWF0ID0gMTAyMztcbmV4cG9ydCB2YXIgTHVtaW5hbmNlRm9ybWF0ID0gMTAyNDtcbmV4cG9ydCB2YXIgTHVtaW5hbmNlQWxwaGFGb3JtYXQgPSAxMDI1O1xuZXhwb3J0IHZhciBSR0JFRm9ybWF0ID0gUkdCQUZvcm1hdDtcbmV4cG9ydCB2YXIgRGVwdGhGb3JtYXQgPSAxMDI2O1xuZXhwb3J0IHZhciBEZXB0aFN0ZW5jaWxGb3JtYXQgPSAxMDI3O1xuZXhwb3J0IHZhciBSR0JfUzNUQ19EWFQxX0Zvcm1hdCA9IDMzNzc2O1xuZXhwb3J0IHZhciBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgPSAzMzc3NztcbmV4cG9ydCB2YXIgUkdCQV9TM1RDX0RYVDNfRm9ybWF0ID0gMzM3Nzg7XG5leHBvcnQgdmFyIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCA9IDMzNzc5O1xuZXhwb3J0IHZhciBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDM1ODQwO1xuZXhwb3J0IHZhciBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQxO1xuZXhwb3J0IHZhciBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAzNTg0MjtcbmV4cG9ydCB2YXIgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMzU4NDM7XG5leHBvcnQgdmFyIFJHQl9FVEMxX0Zvcm1hdCA9IDM2MTk2O1xuZXhwb3J0IHZhciBSR0JBX0FTVENfNHg0X0Zvcm1hdCA9IDM3ODA4O1xuZXhwb3J0IHZhciBSR0JBX0FTVENfNXg0X0Zvcm1hdCA9IDM3ODA5O1xuZXhwb3J0IHZhciBSR0JBX0FTVENfNXg1X0Zvcm1hdCA9IDM3ODEwO1xuZXhwb3J0IHZhciBSR0JBX0FTVENfNng1X0Zvcm1hdCA9IDM3ODExO1xuZXhwb3J0IHZhciBSR0JBX0FTVENfNng2X0Zvcm1hdCA9IDM3ODEyO1xuZXhwb3J0IHZhciBSR0JBX0FTVENfOHg1X0Zvcm1hdCA9IDM3ODEzO1xuZXhwb3J0IHZhciBSR0JBX0FTVENfOHg2X0Zvcm1hdCA9IDM3ODE0O1xuZXhwb3J0IHZhciBSR0JBX0FTVENfOHg4X0Zvcm1hdCA9IDM3ODE1O1xuZXhwb3J0IHZhciBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgPSAzNzgxNjtcbmV4cG9ydCB2YXIgUkdCQV9BU1RDXzEweDZfRm9ybWF0ID0gMzc4MTc7XG5leHBvcnQgdmFyIFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCA9IDM3ODE4O1xuZXhwb3J0IHZhciBSR0JBX0FTVENfMTB4MTBfRm9ybWF0ID0gMzc4MTk7XG5leHBvcnQgdmFyIFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQgPSAzNzgyMDtcbmV4cG9ydCB2YXIgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCA9IDM3ODIxO1xuZXhwb3J0IHZhciBMb29wT25jZSA9IDIyMDA7XG5leHBvcnQgdmFyIExvb3BSZXBlYXQgPSAyMjAxO1xuZXhwb3J0IHZhciBMb29wUGluZ1BvbmcgPSAyMjAyO1xuZXhwb3J0IHZhciBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMDtcbmV4cG9ydCB2YXIgSW50ZXJwb2xhdGVMaW5lYXIgPSAyMzAxO1xuZXhwb3J0IHZhciBJbnRlcnBvbGF0ZVNtb290aCA9IDIzMDI7XG5leHBvcnQgdmFyIFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwO1xuZXhwb3J0IHZhciBaZXJvU2xvcGVFbmRpbmcgPSAyNDAxO1xuZXhwb3J0IHZhciBXcmFwQXJvdW5kRW5kaW5nID0gMjQwMjtcbmV4cG9ydCB2YXIgVHJpYW5nbGVzRHJhd01vZGUgPSAwO1xuZXhwb3J0IHZhciBUcmlhbmdsZVN0cmlwRHJhd01vZGUgPSAxO1xuZXhwb3J0IHZhciBUcmlhbmdsZUZhbkRyYXdNb2RlID0gMjtcbmV4cG9ydCB2YXIgTGluZWFyRW5jb2RpbmcgPSAzMDAwO1xuZXhwb3J0IHZhciBzUkdCRW5jb2RpbmcgPSAzMDAxO1xuZXhwb3J0IHZhciBHYW1tYUVuY29kaW5nID0gMzAwNztcbmV4cG9ydCB2YXIgUkdCRUVuY29kaW5nID0gMzAwMjtcbmV4cG9ydCB2YXIgTG9nTHV2RW5jb2RpbmcgPSAzMDAzO1xuZXhwb3J0IHZhciBSR0JNN0VuY29kaW5nID0gMzAwNDtcbmV4cG9ydCB2YXIgUkdCTTE2RW5jb2RpbmcgPSAzMDA1O1xuZXhwb3J0IHZhciBSR0JERW5jb2RpbmcgPSAzMDA2O1xuZXhwb3J0IHZhciBCYXNpY0RlcHRoUGFja2luZyA9IDMyMDA7XG5leHBvcnQgdmFyIFJHQkFEZXB0aFBhY2tpbmcgPSAzMjAxO1xuZXhwb3J0IHZhciBUYW5nZW50U3BhY2VOb3JtYWxNYXAgPSAwO1xuZXhwb3J0IHZhciBPYmplY3RTcGFjZU5vcm1hbE1hcCA9IDE7XG5cbi8veHN0XG5leHBvcnQgdmFyIE1hdHJpeCA9IHtcbiAgICB0eXBlOiBGbG9hdDMyQXJyYXksXG4gICAgY3JlYXRlOiBmdW5jdGlvbihhLCBjLCBiLCBkLCBlLCBmLCBnLCBoLCBrLCBuLCBtLCBsLCBwLCByLCBzLCB1KSB7XG4gICAgICAgIHZhciBxID0gbmV3IE1hdHJpeC50eXBlKDE2KTtcbiAgICAgICAgcVswXSA9IGE7XG4gICAgICAgIHFbNF0gPSBjO1xuICAgICAgICBxWzhdID0gYjtcbiAgICAgICAgcVsxMl0gPSBkO1xuICAgICAgICBxWzFdID0gZTtcbiAgICAgICAgcVs1XSA9IGY7XG4gICAgICAgIHFbOV0gPSBnO1xuICAgICAgICBxWzEzXSA9IGg7XG4gICAgICAgIHFbMl0gPSBrO1xuICAgICAgICBxWzZdID0gbjtcbiAgICAgICAgcVsxMF0gPSBtO1xuICAgICAgICBxWzE0XSA9IGw7XG4gICAgICAgIHFbM10gPSBwO1xuICAgICAgICBxWzddID0gcjtcbiAgICAgICAgcVsxMV0gPSBzO1xuICAgICAgICBxWzE1XSA9IHU7XG4gICAgICAgIHJldHVybiBxXG4gICAgfSxcbiAgICBlbXB0eTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWF0cml4LnR5cGUoMTYpXG4gICAgfSxcbiAgICBpZGVudGl0eTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhID0gbmV3IE1hdHJpeC50eXBlKDE2KTtcbiAgICAgICAgYVswXSA9IDE7XG4gICAgICAgIGFbNF0gPSAwO1xuICAgICAgICBhWzhdID0gMDtcbiAgICAgICAgYVsxMl0gPSAwO1xuICAgICAgICBhWzFdID0gMDtcbiAgICAgICAgYVs1XSA9IDE7XG4gICAgICAgIGFbOV0gPSAwO1xuICAgICAgICBhWzEzXSA9IDA7XG4gICAgICAgIGFbMl0gPSAwO1xuICAgICAgICBhWzZdID0gMDtcbiAgICAgICAgYVsxMF0gPSAxO1xuICAgICAgICBhWzE0XSA9IDA7XG4gICAgICAgIGFbM10gPSAwO1xuICAgICAgICBhWzddID0gMDtcbiAgICAgICAgYVsxMV0gPSAwO1xuICAgICAgICBhWzE1XSA9IDE7XG4gICAgICAgIHJldHVybiBhXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKGEsIGMsIGIsIGQsIGUsIGYsIGcsIGgsIGssIG4sIG0sIGwsIHAsIHIsIHMsIHUsIHEpIHtcbiAgICAgICAgYVswXSA9IGM7XG4gICAgICAgIGFbNF0gPSBiO1xuICAgICAgICBhWzhdID0gZDtcbiAgICAgICAgYVsxMl0gPSBlO1xuICAgICAgICBhWzFdID0gZjtcbiAgICAgICAgYVs1XSA9IGc7XG4gICAgICAgIGFbOV0gPSBoO1xuICAgICAgICBhWzEzXSA9IGs7XG4gICAgICAgIGFbMl0gPSBuO1xuICAgICAgICBhWzZdID0gbTtcbiAgICAgICAgYVsxMF0gPSBsO1xuICAgICAgICBhWzE0XSA9IHA7XG4gICAgICAgIGFbM10gPSByO1xuICAgICAgICBhWzddID0gcztcbiAgICAgICAgYVsxMV0gPSB1O1xuICAgICAgICBhWzE1XSA9IHFcbiAgICB9LFxuICAgIHRyYW5zbGF0aW9uOiBmdW5jdGlvbihhLCBjLCBiLCBkKSB7XG4gICAgICAgIE1hdHJpeC5zZXQoYSwgMSwgMCwgMCwgYywgMCwgMSwgMCwgYiwgMCwgMCwgMSwgZCwgMCwgMCwgMCwgMSk7XG4gICAgICAgIHJldHVybiBhXG4gICAgfSxcbiAgICByb3RhdGlvbjogZnVuY3Rpb24oYSwgYywgYikge1xuICAgICAgICBhWzBdID0gMTtcbiAgICAgICAgYVs0XSA9IDA7XG4gICAgICAgIGFbOF0gPSAwO1xuICAgICAgICBhWzEyXSA9IDA7XG4gICAgICAgIGFbMV0gPSAwO1xuICAgICAgICBhWzVdID0gMTtcbiAgICAgICAgYVs5XSA9IDA7XG4gICAgICAgIGFbMTNdID0gMDtcbiAgICAgICAgYVsyXSA9IDA7XG4gICAgICAgIGFbNl0gPSAwO1xuICAgICAgICBhWzEwXSA9IDE7XG4gICAgICAgIGFbMTRdID0gMDtcbiAgICAgICAgYVszXSA9IDA7XG4gICAgICAgIGFbN10gPSAwO1xuICAgICAgICBhWzExXSA9IDA7XG4gICAgICAgIGFbMTVdID0gMTtcbiAgICAgICAgdmFyIGQgPSAwLjAxNzQ1MzI5MjUgKiBjO1xuICAgICAgICBjID0gTWF0aC5zaW4oZCk7XG4gICAgICAgIGQgPSBNYXRoLmNvcyhkKTtcbiAgICAgICAgc3dpdGNoIChiKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGFbNV0gPSBkO1xuICAgICAgICAgICAgYVs5XSA9IC1jO1xuICAgICAgICAgICAgYVs2XSA9IGM7XG4gICAgICAgICAgICBhWzEwXSA9IGQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgYVswXSA9IGQ7XG4gICAgICAgICAgICBhWzhdID0gYztcbiAgICAgICAgICAgIGFbMl0gPSAtYztcbiAgICAgICAgICAgIGFbMTBdID0gZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBhWzBdID0gZCxcbiAgICAgICAgICAgIGFbNF0gPSAtYyxcbiAgICAgICAgICAgIGFbMV0gPSBjLFxuICAgICAgICAgICAgYVs1XSA9IGRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYVxuICAgIH0sXG4gICAgbXVsOiBmdW5jdGlvbihhLCBjLCBiKSB7XG4gICAgICAgIHZhciBkID0gY1swXVxuICAgICAgICAgICwgZSA9IGNbMV1cbiAgICAgICAgICAsIGYgPSBjWzJdXG4gICAgICAgICAgLCBnID0gY1szXVxuICAgICAgICAgICwgaCA9IGNbNF1cbiAgICAgICAgICAsIGsgPSBjWzVdXG4gICAgICAgICAgLCBuID0gY1s2XVxuICAgICAgICAgICwgbSA9IGNbN11cbiAgICAgICAgICAsIGwgPSBjWzhdXG4gICAgICAgICAgLCBwID0gY1s5XVxuICAgICAgICAgICwgciA9IGNbMTBdXG4gICAgICAgICAgLCBzID0gY1sxMV1cbiAgICAgICAgICAsIHUgPSBjWzEyXVxuICAgICAgICAgICwgcSA9IGNbMTNdXG4gICAgICAgICAgLCB4ID0gY1sxNF07XG4gICAgICAgIGMgPSBjWzE1XTtcbiAgICAgICAgdmFyIHcgPSBiWzBdXG4gICAgICAgICAgLCB2ID0gYlsxXVxuICAgICAgICAgICwgdCA9IGJbMl1cbiAgICAgICAgICAsIHkgPSBiWzNdO1xuICAgICAgICBhWzBdID0gdyAqIGQgKyB2ICogaCArIHQgKiBsICsgeSAqIHU7XG4gICAgICAgIGFbMV0gPSB3ICogZSArIHYgKiBrICsgdCAqIHAgKyB5ICogcTtcbiAgICAgICAgYVsyXSA9IHcgKiBmICsgdiAqIG4gKyB0ICogciArIHkgKiB4O1xuICAgICAgICBhWzNdID0gdyAqIGcgKyB2ICogbSArIHQgKiBzICsgeSAqIGM7XG4gICAgICAgIHcgPSBiWzRdO1xuICAgICAgICB2ID0gYls1XTtcbiAgICAgICAgdCA9IGJbNl07XG4gICAgICAgIHkgPSBiWzddO1xuICAgICAgICBhWzRdID0gdyAqIGQgKyB2ICogaCArIHQgKiBsICsgeSAqIHU7XG4gICAgICAgIGFbNV0gPSB3ICogZSArIHYgKiBrICsgdCAqIHAgKyB5ICogcTtcbiAgICAgICAgYVs2XSA9IHcgKiBmICsgdiAqIG4gKyB0ICogciArIHkgKiB4O1xuICAgICAgICBhWzddID0gdyAqIGcgKyB2ICogbSArIHQgKiBzICsgeSAqIGM7XG4gICAgICAgIHcgPSBiWzhdO1xuICAgICAgICB2ID0gYls5XTtcbiAgICAgICAgdCA9IGJbMTBdO1xuICAgICAgICB5ID0gYlsxMV07XG4gICAgICAgIGFbOF0gPSB3ICogZCArIHYgKiBoICsgdCAqIGwgKyB5ICogdTtcbiAgICAgICAgYVs5XSA9IHcgKiBlICsgdiAqIGsgKyB0ICogcCArIHkgKiBxO1xuICAgICAgICBhWzEwXSA9IHcgKiBmICsgdiAqIG4gKyB0ICogciArIHkgKiB4O1xuICAgICAgICBhWzExXSA9IHcgKiBnICsgdiAqIG0gKyB0ICogcyArIHkgKiBjO1xuICAgICAgICB3ID0gYlsxMl07XG4gICAgICAgIHYgPSBiWzEzXTtcbiAgICAgICAgdCA9IGJbMTRdO1xuICAgICAgICB5ID0gYlsxNV07XG4gICAgICAgIGFbMTJdID0gdyAqIGQgKyB2ICogaCArIHQgKiBsICsgeSAqIHU7XG4gICAgICAgIGFbMTNdID0gdyAqIGUgKyB2ICogayArIHQgKiBwICsgeSAqIHE7XG4gICAgICAgIGFbMTRdID0gdyAqIGYgKyB2ICogbiArIHQgKiByICsgeSAqIHg7XG4gICAgICAgIGFbMTVdID0gdyAqIGcgKyB2ICogbSArIHQgKiBzICsgeSAqIGM7XG4gICAgICAgIHJldHVybiBhXG4gICAgfSxcbiAgICBpbnZlcnQ6IGZ1bmN0aW9uKGEsIGMpIHtcbiAgICAgICAgdmFyIGIgPSBjWzBdXG4gICAgICAgICAgLCBkID0gY1sxXVxuICAgICAgICAgICwgZSA9IGNbMl1cbiAgICAgICAgICAsIGYgPSBjWzNdXG4gICAgICAgICAgLCBnID0gY1s0XVxuICAgICAgICAgICwgaCA9IGNbNV1cbiAgICAgICAgICAsIGsgPSBjWzZdXG4gICAgICAgICAgLCBuID0gY1s3XVxuICAgICAgICAgICwgbSA9IGNbOF1cbiAgICAgICAgICAsIGwgPSBjWzldXG4gICAgICAgICAgLCBwID0gY1sxMF1cbiAgICAgICAgICAsIHIgPSBjWzExXVxuICAgICAgICAgICwgcyA9IGNbMTJdXG4gICAgICAgICAgLCB1ID0gY1sxM11cbiAgICAgICAgICAsIHEgPSBjWzE0XVxuICAgICAgICAgICwgeCA9IGNbMTVdXG4gICAgICAgICAgLCB3ID0gYiAqIGggLSBkICogZ1xuICAgICAgICAgICwgdiA9IGIgKiBrIC0gZSAqIGdcbiAgICAgICAgICAsIHQgPSBiICogbiAtIGYgKiBnXG4gICAgICAgICAgLCB5ID0gZCAqIGsgLSBlICogaFxuICAgICAgICAgICwgRSA9IGQgKiBuIC0gZiAqIGhcbiAgICAgICAgICAsIEYgPSBlICogbiAtIGYgKiBrXG4gICAgICAgICAgLCBBID0gbSAqIHUgLSBsICogc1xuICAgICAgICAgICwgQiA9IG0gKiBxIC0gcCAqIHNcbiAgICAgICAgICAsIHogPSBtICogeCAtIHIgKiBzXG4gICAgICAgICAgLCBDID0gbCAqIHEgLSBwICogdVxuICAgICAgICAgICwgRyA9IGwgKiB4IC0gciAqIHVcbiAgICAgICAgICAsIEggPSBwICogeCAtIHIgKiBxXG4gICAgICAgICAgLCBEID0gdyAqIEggLSB2ICogRyArIHQgKiBDICsgeSAqIHogLSBFICogQiArIEYgKiBBO1xuICAgICAgICBpZiAoIUQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgRCA9IDEgLyBEO1xuICAgICAgICBhWzBdID0gKGggKiBIIC0gayAqIEcgKyBuICogQykgKiBEO1xuICAgICAgICBhWzFdID0gKGUgKiBHIC0gZCAqIEggLSBmICogQykgKiBEO1xuICAgICAgICBhWzJdID0gKHUgKiBGIC0gcSAqIEUgKyB4ICogeSkgKiBEO1xuICAgICAgICBhWzNdID0gKHAgKiBFIC0gbCAqIEYgLSByICogeSkgKiBEO1xuICAgICAgICBhWzRdID0gKGsgKiB6IC0gZyAqIEggLSBuICogQikgKiBEO1xuICAgICAgICBhWzVdID0gKGIgKiBIIC0gZSAqIHogKyBmICogQikgKiBEO1xuICAgICAgICBhWzZdID0gKHEgKiB0IC0gcyAqIEYgLSB4ICogdikgKiBEO1xuICAgICAgICBhWzddID0gKG0gKiBGIC0gcCAqIHQgKyByICogdikgKiBEO1xuICAgICAgICBhWzhdID0gKGcgKiBHIC0gaCAqIHogKyBuICogQSkgKiBEO1xuICAgICAgICBhWzldID0gKGQgKiB6IC0gYiAqIEcgLSBmICogQSkgKiBEO1xuICAgICAgICBhWzEwXSA9IChzICogRSAtIHUgKiB0ICsgeCAqIHcpICogRDtcbiAgICAgICAgYVsxMV0gPSAobCAqIHQgLSBtICogRSAtIHIgKiB3KSAqIEQ7XG4gICAgICAgIGFbMTJdID0gKGggKiBCIC0gZyAqIEMgLSBrICogQSkgKiBEO1xuICAgICAgICBhWzEzXSA9IChiICogQyAtIGQgKiBCICsgZSAqIEEpICogRDtcbiAgICAgICAgYVsxNF0gPSAodSAqIHYgLSBzICogeSAtIHEgKiB3KSAqIEQ7XG4gICAgICAgIGFbMTVdID0gKG0gKiB5IC0gbCAqIHYgKyBwICogdykgKiBEO1xuICAgICAgICByZXR1cm4gYVxuICAgIH0sXG4gICAgdHJhbnNwb3NlOiBmdW5jdGlvbihhLCBjKSB7XG4gICAgICAgIGFbMF0gPSBjWzBdO1xuICAgICAgICBhWzRdID0gY1sxXTtcbiAgICAgICAgYVs4XSA9IGNbMl07XG4gICAgICAgIGFbMTJdID0gY1szXTtcbiAgICAgICAgYVsxXSA9IGNbNF07XG4gICAgICAgIGFbNV0gPSBjWzVdO1xuICAgICAgICBhWzldID0gY1s2XTtcbiAgICAgICAgYVsxM10gPSBjWzddO1xuICAgICAgICBhWzJdID0gY1s4XTtcbiAgICAgICAgYVs2XSA9IGNbOV07XG4gICAgICAgIGFbMTBdID0gY1sxMF07XG4gICAgICAgIGFbMTRdID0gY1sxMV07XG4gICAgICAgIGFbM10gPSBjWzEyXTtcbiAgICAgICAgYVs3XSA9IGNbMTNdO1xuICAgICAgICBhWzExXSA9IGNbMTRdO1xuICAgICAgICBhWzE1XSA9IGNbMTVdO1xuICAgICAgICByZXR1cm4gYVxuICAgIH0sXG4gICAgbXVsNDogZnVuY3Rpb24oYSwgYywgYiwgZCwgZSwgZikge1xuICAgICAgICBhWzBdID0gY1swXSAqIGIgKyBjWzRdICogZCArIGNbOF0gKiBlICsgY1sxMl0gKiBmO1xuICAgICAgICBhWzFdID0gY1sxXSAqIGIgKyBjWzVdICogZCArIGNbOV0gKiBlICsgY1sxM10gKiBmO1xuICAgICAgICBhWzJdID0gY1syXSAqIGIgKyBjWzZdICogZCArIGNbMTBdICogZSArIGNbMTRdICogZjtcbiAgICAgICAgYVszXSA9IGNbM10gKiBiICsgY1s3XSAqIGQgKyBjWzExXSAqIGUgKyBjWzE1XSAqIGY7XG4gICAgICAgIHJldHVybiBhXG4gICAgfSxcbiAgICBtdWxQb2ludDogZnVuY3Rpb24oYSwgYywgYiwgZCwgZSkge1xuICAgICAgICBhWzBdID0gY1swXSAqIGIgKyBjWzRdICogZCArIGNbOF0gKiBlICsgY1sxMl07XG4gICAgICAgIGFbMV0gPSBjWzFdICogYiArIGNbNV0gKiBkICsgY1s5XSAqIGUgKyBjWzEzXTtcbiAgICAgICAgYVsyXSA9IGNbMl0gKiBiICsgY1s2XSAqIGQgKyBjWzEwXSAqIGUgKyBjWzE0XTtcbiAgICAgICAgcmV0dXJuIGFcbiAgICB9LFxuICAgIG11bFZlYzogZnVuY3Rpb24oYSwgYywgYiwgZCwgZSkge1xuICAgICAgICBhWzBdID0gY1swXSAqIGIgKyBjWzRdICogZCArIGNbOF0gKiBlO1xuICAgICAgICBhWzFdID0gY1sxXSAqIGIgKyBjWzVdICogZCArIGNbOV0gKiBlO1xuICAgICAgICBhWzJdID0gY1syXSAqIGIgKyBjWzZdICogZCArIGNbMTBdICogZTtcbiAgICAgICAgcmV0dXJuIGFcbiAgICB9LFxuICAgIHBlcnNwZWN0aXZlOiBmdW5jdGlvbihhLCBjLCBiLCBkLCBlLCBmKSB7XG4gICAgICAgIGYgPSBmIHx8IDA7XG4gICAgICAgIGMgPSAxIC8gTWF0aC50YW4oMC4wMDg3MjY2NDYyNSAqIGMpO1xuICAgICAgICBhWzBdID0gYyAvIGI7XG4gICAgICAgIGFbMV0gPSBhWzJdID0gYVszXSA9IDA7XG4gICAgICAgIGFbNV0gPSBjO1xuICAgICAgICBhWzRdID0gYVs2XSA9IGFbN10gPSAwO1xuICAgICAgICBhWzhdID0gYVs5XSA9IDA7XG4gICAgICAgIGFbMTBdID0gKGUgKyBkKSAvIChkIC0gZSkgLSAzLjA1MTgwNDRFLTUgKiBmO1xuICAgICAgICBhWzExXSA9IC0xO1xuICAgICAgICBhWzE0XSA9IDIgKiBlICogZCAvIChkIC0gZSk7XG4gICAgICAgIGFbMTJdID0gYVsxM10gPSBhWzE1XSA9IDA7XG4gICAgICAgIHJldHVybiBhXG4gICAgfSxcbiAgICBwZXJzcGVjdGl2ZUluZmluaXRlOiBmdW5jdGlvbihhLCBjLCBiLCBkLCBlKSB7XG4gICAgICAgIGUgPSBlIHx8IDA7XG4gICAgICAgIGMgPSAxIC8gTWF0aC50YW4oMC4wMDg3MjY2NDYyNSAqIGMpO1xuICAgICAgICBhWzBdID0gYyAvIGI7XG4gICAgICAgIGFbMV0gPSBhWzJdID0gYVszXSA9IDA7XG4gICAgICAgIGFbNV0gPSBjO1xuICAgICAgICBhWzRdID0gYVs2XSA9IGFbN10gPSAwO1xuICAgICAgICBhWzhdID0gYVs5XSA9IDA7XG4gICAgICAgIGFbMTBdID0gYVsxMV0gPSAtMSAtIDMuMDUxODA0NEUtNSAqIGU7XG4gICAgICAgIGFbMTRdID0gLTIgKiBkO1xuICAgICAgICBhWzEyXSA9IGFbMTNdID0gYVsxNV0gPSAwO1xuICAgICAgICByZXR1cm4gYVxuICAgIH0sXG4gICAgb3J0aG86IGZ1bmN0aW9uKGEsIGMsIGIsIGQsIGUsIGYsIGcsIGgpIHtcbiAgICAgICAgdmFyIGsgPSAxIC8gKGIgLSBjKVxuICAgICAgICAgICwgbiA9IDEgLyAoZSAtIGQpXG4gICAgICAgICAgLCBtID0gMSAvIChnIC0gZik7XG4gICAgICAgIGFbMF0gPSBrICsgaztcbiAgICAgICAgYVsxXSA9IGFbMl0gPSBhWzNdID0gMDtcbiAgICAgICAgYVs1XSA9IG4gKyBuO1xuICAgICAgICBhWzRdID0gYVs2XSA9IGFbN10gPSAwO1xuICAgICAgICBhWzEyXSA9IC0oYiArIGMpICogaztcbiAgICAgICAgYVsxM10gPSAtKGUgKyBkKSAqIG47XG4gICAgICAgIGFbMTBdID0gLShtICsgbSkgLSAzLjA1MTgwNDRFLTUgKiAoaCB8fCAwKTtcbiAgICAgICAgYVsxNF0gPSAtKGcgKyBmKSAqIG07XG4gICAgICAgIGFbOF0gPSBhWzldID0gYVsxMV0gPSAwO1xuICAgICAgICBhWzE1XSA9IDE7XG4gICAgICAgIHJldHVybiBhXG4gICAgfSxcbiAgICBsb29rQXQ6IGZ1bmN0aW9uKGEsIGMsIGIsIGQpIHtcbiAgICAgICAgdmFyIGUgPSBhLnN1YmFycmF5KDAsIDMpXG4gICAgICAgICAgLCBmID0gYS5zdWJhcnJheSg0LCA3KVxuICAgICAgICAgICwgZyA9IGEuc3ViYXJyYXkoOCwgMTEpO1xuICAgICAgICBWZWN0LnN1YihnLCBjLCBiKTtcbiAgICAgICAgVmVjdC5jcm9zcyhlLCBkLCBnKTtcbiAgICAgICAgVmVjdC5ub3JtYWxpemUoZywgZyk7XG4gICAgICAgIFZlY3Qubm9ybWFsaXplKGUsIGUpO1xuICAgICAgICBWZWN0LmNyb3NzKGYsIGcsIGUpO1xuICAgICAgICBNYXRyaXguc2V0KGEsIGVbMF0sIGVbMV0sIGVbMl0sIC1WZWN0LmRvdChlLCBjKSwgZlswXSwgZlsxXSwgZlsyXSwgLVZlY3QuZG90KGYsIGMpLCBnWzBdLCBnWzFdLCBnWzJdLCAtVmVjdC5kb3QoZywgYyksIDAsIDAsIDAsIDEpXG4gICAgfSxcbiAgICBjb3B5OiBmdW5jdGlvbihhLCBjKSB7XG4gICAgICAgIGZvciAodmFyIGIgPSAwOyAxNiA+IGI7ICsrYilcbiAgICAgICAgICAgIGFbYl0gPSBjW2JdXG4gICAgfSxcbiAgICBjb3B5VG9CdWZmZXI6IGZ1bmN0aW9uKGEsIGMsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgZCA9IDA7IDE2ID4gZDsgKytkKVxuICAgICAgICAgICAgYVtjICsgZF0gPSBiW2RdXG4gICAgfVxufTsiLCIvKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBfTWF0aCA9IHtcblxuXHRERUcyUkFEOiBNYXRoLlBJIC8gMTgwLFxuXHRSQUQyREVHOiAxODAgLyBNYXRoLlBJLFxuXG5cdGdlbmVyYXRlVVVJRDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNTAzNC9ob3ctdG8tY3JlYXRlLWEtZ3VpZC11dWlkLWluLWphdmFzY3JpcHQvMjE5NjMxMzYjMjE5NjMxMzZcblxuXHRcdHZhciBsdXQgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDI1NjsgaSArKyApIHtcblxuXHRcdFx0bHV0WyBpIF0gPSAoIGkgPCAxNiA/ICcwJyA6ICcnICkgKyAoIGkgKS50b1N0cmluZyggMTYgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKSB7XG5cblx0XHRcdHZhciBkMCA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMSA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMiA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMyA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciB1dWlkID0gbHV0WyBkMCAmIDB4ZmYgXSArIGx1dFsgZDAgPj4gOCAmIDB4ZmYgXSArIGx1dFsgZDAgPj4gMTYgJiAweGZmIF0gKyBsdXRbIGQwID4+IDI0ICYgMHhmZiBdICsgJy0nICtcblx0XHRcdFx0bHV0WyBkMSAmIDB4ZmYgXSArIGx1dFsgZDEgPj4gOCAmIDB4ZmYgXSArICctJyArIGx1dFsgZDEgPj4gMTYgJiAweDBmIHwgMHg0MCBdICsgbHV0WyBkMSA+PiAyNCAmIDB4ZmYgXSArICctJyArXG5cdFx0XHRcdGx1dFsgZDIgJiAweDNmIHwgMHg4MCBdICsgbHV0WyBkMiA+PiA4ICYgMHhmZiBdICsgJy0nICsgbHV0WyBkMiA+PiAxNiAmIDB4ZmYgXSArIGx1dFsgZDIgPj4gMjQgJiAweGZmIF0gK1xuXHRcdFx0XHRsdXRbIGQzICYgMHhmZiBdICsgbHV0WyBkMyA+PiA4ICYgMHhmZiBdICsgbHV0WyBkMyA+PiAxNiAmIDB4ZmYgXSArIGx1dFsgZDMgPj4gMjQgJiAweGZmIF07XG5cblx0XHRcdC8vIC50b1VwcGVyQ2FzZSgpIGhlcmUgZmxhdHRlbnMgY29uY2F0ZW5hdGVkIHN0cmluZ3MgdG8gc2F2ZSBoZWFwIG1lbW9yeSBzcGFjZS5cblx0XHRcdHJldHVybiB1dWlkLnRvVXBwZXJDYXNlKCk7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIHZhbHVlLCBtaW4sIG1heCApIHtcblxuXHRcdHJldHVybiBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB2YWx1ZSApICk7XG5cblx0fSxcblxuXHQvLyBjb21wdXRlIGV1Y2xpZGlhbiBtb2R1bG8gb2YgbSAlIG5cblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9kdWxvX29wZXJhdGlvblxuXG5cdGV1Y2xpZGVhbk1vZHVsbzogZnVuY3Rpb24gKCBuLCBtICkge1xuXG5cdFx0cmV0dXJuICggKCBuICUgbSApICsgbSApICUgbTtcblxuXHR9LFxuXG5cdC8vIExpbmVhciBtYXBwaW5nIGZyb20gcmFuZ2UgPGExLCBhMj4gdG8gcmFuZ2UgPGIxLCBiMj5cblxuXHRtYXBMaW5lYXI6IGZ1bmN0aW9uICggeCwgYTEsIGEyLCBiMSwgYjIgKSB7XG5cblx0XHRyZXR1cm4gYjEgKyAoIHggLSBhMSApICogKCBiMiAtIGIxICkgLyAoIGEyIC0gYTEgKTtcblxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpbmVhcl9pbnRlcnBvbGF0aW9uXG5cblx0bGVycDogZnVuY3Rpb24gKCB4LCB5LCB0ICkge1xuXG5cdFx0cmV0dXJuICggMSAtIHQgKSAqIHggKyB0ICogeTtcblxuXHR9LFxuXG5cdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcFxuXG5cdHNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqICggMyAtIDIgKiB4ICk7XG5cblx0fSxcblxuXHRzbW9vdGhlcnN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSArIDEwICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gaW50ZWdlciBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsXG5cblx0cmFuZEludDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7XG5cblx0XHRyZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkge1xuXG5cdFx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBmbG9hdCBmcm9tIDwtcmFuZ2UvMiwgcmFuZ2UvMj4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXRTcHJlYWQ6IGZ1bmN0aW9uICggcmFuZ2UgKSB7XG5cblx0XHRyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1hdGgucmFuZG9tKCkgKTtcblxuXHR9LFxuXG5cdGRlZ1RvUmFkOiBmdW5jdGlvbiAoIGRlZ3JlZXMgKSB7XG5cblx0XHRyZXR1cm4gZGVncmVlcyAqIF9NYXRoLkRFRzJSQUQ7XG5cblx0fSxcblxuXHRyYWRUb0RlZzogZnVuY3Rpb24gKCByYWRpYW5zICkge1xuXG5cdFx0cmV0dXJuIHJhZGlhbnMgKiBfTWF0aC5SQUQyREVHO1xuXG5cdH0sXG5cblx0aXNQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuICggdmFsdWUgJiAoIHZhbHVlIC0gMSApICkgPT09IDAgJiYgdmFsdWUgIT09IDA7XG5cblx0fSxcblxuXHRjZWlsUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5jZWlsKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcblxuXHR9LFxuXG5cdGZsb29yUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5mbG9vciggTWF0aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7XG5cblx0fVxuXG59O1xuXG5cbmV4cG9ydCB7IF9NYXRoIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3IyKCB4LCB5ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWZWN0b3IyLnByb3RvdHlwZSwge1xuXG5cdFwid2lkdGhcIjoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLng7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLnggPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdFwiaGVpZ2h0XCI6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy55O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy55ID0gdmFsdWU7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0aXNWZWN0b3IyOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCArPSB2Lng7XG5cdFx0dGhpcy55ICs9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gdi54ICogcztcblx0XHR0aGlzLnkgKz0gdi55ICogcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAtPSB2Lng7XG5cdFx0dGhpcy55IC09IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGU6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAvPSB2Lng7XG5cdFx0dGhpcy55IC89IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDM6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdO1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtaW4gPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciBtYXggPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XG5cblx0fSxcblxuXHRjcm9zczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueSAtIHRoaXMueSAqIHYueDtcblxuXHR9LFxuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKTtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9LFxuXG5cdGFuZ2xlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBjb21wdXRlcyB0aGUgYW5nbGUgaW4gcmFkaWFucyB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvc2l0aXZlIHgtYXhpc1xuXG5cdFx0dmFyIGFuZ2xlID0gTWF0aC5hdGFuMiggdGhpcy55LCB0aGlzLnggKTtcblxuXHRcdGlmICggYW5nbGUgPCAwICkgYW5nbGUgKz0gMiAqIE1hdGguUEk7XG5cblx0XHRyZXR1cm4gYW5nbGU7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcXVhcmVkOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgZHggPSB0aGlzLnggLSB2LngsIGR5ID0gdGhpcy55IC0gdi55O1xuXHRcdHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICk7XG5cblx0fSxcblxuXHRzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bGVycFZlY3RvcnM6IGZ1bmN0aW9uICggdjEsIHYyLCBhbHBoYSApIHtcblxuXHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTtcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlQXJvdW5kOiBmdW5jdGlvbiAoIGNlbnRlciwgYW5nbGUgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCBhbmdsZSApLCBzID0gTWF0aC5zaW4oIGFuZ2xlICk7XG5cblx0XHR2YXIgeCA9IHRoaXMueCAtIGNlbnRlci54O1xuXHRcdHZhciB5ID0gdGhpcy55IC0gY2VudGVyLnk7XG5cblx0XHR0aGlzLnggPSB4ICogYyAtIHkgKiBzICsgY2VudGVyLng7XG5cdFx0dGhpcy55ID0geCAqIHMgKyB5ICogYyArIGNlbnRlci55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgVmVjdG9yMiB9O1xuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMy5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBqb3JkaV9yb3MgLyBodHRwOi8vcGxhdHRzb2Z0LmNvbVxuICogQGF1dGhvciBEMXBsbzFkIC8gaHR0cDovL2dpdGh1Yi5jb20vRDFwbG8xZFxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIHRpbWtuaXAgLyBodHRwOi8vd3d3LmZsb29ycGxhbm5lci5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBNYXRyaXg0KCkge1xuXG5cdHRoaXMuZWxlbWVudHMgPSBbXG5cblx0XHQxLCAwLCAwLCAwLFxuXHRcdDAsIDEsIDAsIDAsXG5cdFx0MCwgMCwgMSwgMCxcblx0XHQwLCAwLCAwLCAxXG5cblx0XTtcblxuXHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAwICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuJyApO1xuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwge1xuXG5cdGlzTWF0cml4NDogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggbjExLCBuMTIsIG4xMywgbjE0LCBuMjEsIG4yMiwgbjIzLCBuMjQsIG4zMSwgbjMyLCBuMzMsIG4zNCwgbjQxLCBuNDIsIG40MywgbjQ0ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBuMTE7IHRlWyA0IF0gPSBuMTI7IHRlWyA4IF0gPSBuMTM7IHRlWyAxMiBdID0gbjE0O1xuXHRcdHRlWyAxIF0gPSBuMjE7IHRlWyA1IF0gPSBuMjI7IHRlWyA5IF0gPSBuMjM7IHRlWyAxMyBdID0gbjI0O1xuXHRcdHRlWyAyIF0gPSBuMzE7IHRlWyA2IF0gPSBuMzI7IHRlWyAxMCBdID0gbjMzOyB0ZVsgMTQgXSA9IG4zNDtcblx0XHR0ZVsgMyBdID0gbjQxOyB0ZVsgNyBdID0gbjQyOyB0ZVsgMTEgXSA9IG40MzsgdGVbIDE1IF0gPSBuNDQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlkZW50aXR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgMCxcblx0XHRcdDAsIDEsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgTWF0cml4NCgpLmZyb21BcnJheSggdGhpcy5lbGVtZW50cyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTsgdGVbIDMgXSA9IG1lWyAzIF07XG5cdFx0dGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdOyB0ZVsgNiBdID0gbWVbIDYgXTsgdGVbIDcgXSA9IG1lWyA3IF07XG5cdFx0dGVbIDggXSA9IG1lWyA4IF07IHRlWyA5IF0gPSBtZVsgOSBdOyB0ZVsgMTAgXSA9IG1lWyAxMCBdOyB0ZVsgMTEgXSA9IG1lWyAxMSBdO1xuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07IHRlWyAxMyBdID0gbWVbIDEzIF07IHRlWyAxNCBdID0gbWVbIDE0IF07IHRlWyAxNSBdID0gbWVbIDE1IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cywgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDEyIF0gPSBtZVsgMTIgXTtcblx0XHR0ZVsgMTMgXSA9IG1lWyAxMyBdO1xuXHRcdHRlWyAxNCBdID0gbWVbIDE0IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4dHJhY3RCYXNpczogZnVuY3Rpb24gKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0eEF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMCApO1xuXHRcdHlBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDEgKTtcblx0XHR6QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VCYXNpczogZnVuY3Rpb24gKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cdFx0XHR4QXhpcy54LCB5QXhpcy54LCB6QXhpcy54LCAwLFxuXHRcdFx0eEF4aXMueSwgeUF4aXMueSwgekF4aXMueSwgMCxcblx0XHRcdHhBeGlzLnosIHlBeGlzLnosIHpBeGlzLnosIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXh0cmFjdFJvdGF0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGV4dHJhY3RSb3RhdGlvbiggbSApIHtcblxuXHRcdFx0Ly8gdGhpcyBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCByZWZsZWN0aW9uIG1hdHJpY2VzXG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0XHR2YXIgc2NhbGVYID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzY2FsZVkgPSAxIC8gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHNjYWxlWiA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7XG5cblx0XHRcdHRlWyAwIF0gPSBtZVsgMCBdICogc2NhbGVYO1xuXHRcdFx0dGVbIDEgXSA9IG1lWyAxIF0gKiBzY2FsZVg7XG5cdFx0XHR0ZVsgMiBdID0gbWVbIDIgXSAqIHNjYWxlWDtcblx0XHRcdHRlWyAzIF0gPSAwO1xuXG5cdFx0XHR0ZVsgNCBdID0gbWVbIDQgXSAqIHNjYWxlWTtcblx0XHRcdHRlWyA1IF0gPSBtZVsgNSBdICogc2NhbGVZO1xuXHRcdFx0dGVbIDYgXSA9IG1lWyA2IF0gKiBzY2FsZVk7XG5cdFx0XHR0ZVsgNyBdID0gMDtcblxuXHRcdFx0dGVbIDggXSA9IG1lWyA4IF0gKiBzY2FsZVo7XG5cdFx0XHR0ZVsgOSBdID0gbWVbIDkgXSAqIHNjYWxlWjtcblx0XHRcdHRlWyAxMCBdID0gbWVbIDEwIF0gKiBzY2FsZVo7XG5cdFx0XHR0ZVsgMTEgXSA9IDA7XG5cblx0XHRcdHRlWyAxMiBdID0gMDtcblx0XHRcdHRlWyAxMyBdID0gMDtcblx0XHRcdHRlWyAxNCBdID0gMDtcblx0XHRcdHRlWyAxNSBdID0gMTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtYWtlUm90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgeCA9IGV1bGVyLngsIHkgPSBldWxlci55LCB6ID0gZXVsZXIuejtcblx0XHR2YXIgYSA9IE1hdGguY29zKCB4ICksIGIgPSBNYXRoLnNpbiggeCApO1xuXHRcdHZhciBjID0gTWF0aC5jb3MoIHkgKSwgZCA9IE1hdGguc2luKCB5ICk7XG5cdFx0dmFyIGUgPSBNYXRoLmNvcyggeiApLCBmID0gTWF0aC5zaW4oIHogKTtcblxuXHRcdGlmICggZXVsZXIub3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gYyAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gZDtcblxuXHRcdFx0dGVbIDEgXSA9IGFmICsgYmUgKiBkO1xuXHRcdFx0dGVbIDUgXSA9IGFlIC0gYmYgKiBkO1xuXHRcdFx0dGVbIDkgXSA9IC0gYiAqIGM7XG5cblx0XHRcdHRlWyAyIF0gPSBiZiAtIGFlICogZDtcblx0XHRcdHRlWyA2IF0gPSBiZSArIGFmICogZDtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgKyBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7XG5cdFx0XHR0ZVsgOCBdID0gYSAqIGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhICogZjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSAtIGI7XG5cblx0XHRcdHRlWyAyIF0gPSBjZiAqIGIgLSBkZTtcblx0XHRcdHRlWyA2IF0gPSBkZiArIGNlICogYjtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgLSBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gLSBhICogZjtcblx0XHRcdHRlWyA4IF0gPSBkZSArIGNmICogYjtcblxuXHRcdFx0dGVbIDEgXSA9IGNmICsgZGUgKiBiO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGRmIC0gY2UgKiBiO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBhICogZDtcblx0XHRcdHRlWyA2IF0gPSBiO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dmFyIGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZSAqIGQgLSBhZjtcblx0XHRcdHRlWyA4IF0gPSBhZSAqIGQgKyBiZjtcblxuXHRcdFx0dGVbIDEgXSA9IGMgKiBmO1xuXHRcdFx0dGVbIDUgXSA9IGJmICogZCArIGFlO1xuXHRcdFx0dGVbIDkgXSA9IGFmICogZCAtIGJlO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBkO1xuXHRcdFx0dGVbIDYgXSA9IGIgKiBjO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dmFyIGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZCAtIGFjICogZjtcblx0XHRcdHRlWyA4IF0gPSBiYyAqIGYgKyBhZDtcblxuXHRcdFx0dGVbIDEgXSA9IGY7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gLSBiICogZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZCAqIGU7XG5cdFx0XHR0ZVsgNiBdID0gYWQgKiBmICsgYmM7XG5cdFx0XHR0ZVsgMTAgXSA9IGFjIC0gYmQgKiBmO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gZjtcblx0XHRcdHRlWyA4IF0gPSBkICogZTtcblxuXHRcdFx0dGVbIDEgXSA9IGFjICogZiArIGJkO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGFkICogZiAtIGJjO1xuXG5cdFx0XHR0ZVsgMiBdID0gYmMgKiBmIC0gYWQ7XG5cdFx0XHR0ZVsgNiBdID0gYiAqIGU7XG5cdFx0XHR0ZVsgMTAgXSA9IGJkICogZiArIGFjO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm90dG9tIHJvd1xuXHRcdHRlWyAzIF0gPSAwO1xuXHRcdHRlWyA3IF0gPSAwO1xuXHRcdHRlWyAxMSBdID0gMDtcblxuXHRcdC8vIGxhc3QgY29sdW1uXG5cdFx0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMTQgXSA9IDA7XG5cdFx0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHplcm8gPSBuZXcgVmVjdG9yMyggMCwgMCwgMCApO1xuXHRcdHZhciBvbmUgPSBuZXcgVmVjdG9yMyggMSwgMSwgMSApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIG1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jb21wb3NlKCB6ZXJvLCBxLCBvbmUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHggPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB5ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgeiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCBleWUsIHRhcmdldCwgdXAgKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRcdHouc3ViVmVjdG9ycyggZXllLCB0YXJnZXQgKTtcblxuXHRcdFx0aWYgKCB6Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gZXllIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uXG5cblx0XHRcdFx0ei56ID0gMTtcblxuXHRcdFx0fVxuXG5cdFx0XHR6Lm5vcm1hbGl6ZSgpO1xuXHRcdFx0eC5jcm9zc1ZlY3RvcnMoIHVwLCB6ICk7XG5cblx0XHRcdGlmICggeC5sZW5ndGhTcSgpID09PSAwICkge1xuXG5cdFx0XHRcdC8vIHVwIGFuZCB6IGFyZSBwYXJhbGxlbFxuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIHVwLnogKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdHoueCArPSAwLjAwMDE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHoueiArPSAwLjAwMDE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHoubm9ybWFsaXplKCk7XG5cdFx0XHRcdHguY3Jvc3NWZWN0b3JzKCB1cCwgeiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHgubm9ybWFsaXplKCk7XG5cdFx0XHR5LmNyb3NzVmVjdG9ycyggeiwgeCApO1xuXG5cdFx0XHR0ZVsgMCBdID0geC54OyB0ZVsgNCBdID0geS54OyB0ZVsgOCBdID0gei54O1xuXHRcdFx0dGVbIDEgXSA9IHgueTsgdGVbIDUgXSA9IHkueTsgdGVbIDkgXSA9IHoueTtcblx0XHRcdHRlWyAyIF0gPSB4Lno7IHRlWyA2IF0gPSB5Lno7IHRlWyAxMCBdID0gei56O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIG0sIG4gKSB7XG5cblx0XHRpZiAoIG4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBhZSA9IGEuZWxlbWVudHM7XG5cdFx0dmFyIGJlID0gYi5lbGVtZW50cztcblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyA0IF0sIGExMyA9IGFlWyA4IF0sIGExNCA9IGFlWyAxMiBdO1xuXHRcdHZhciBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNSBdLCBhMjMgPSBhZVsgOSBdLCBhMjQgPSBhZVsgMTMgXTtcblx0XHR2YXIgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDYgXSwgYTMzID0gYWVbIDEwIF0sIGEzNCA9IGFlWyAxNCBdO1xuXHRcdHZhciBhNDEgPSBhZVsgMyBdLCBhNDIgPSBhZVsgNyBdLCBhNDMgPSBhZVsgMTEgXSwgYTQ0ID0gYWVbIDE1IF07XG5cblx0XHR2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDQgXSwgYjEzID0gYmVbIDggXSwgYjE0ID0gYmVbIDEyIF07XG5cdFx0dmFyIGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA1IF0sIGIyMyA9IGJlWyA5IF0sIGIyNCA9IGJlWyAxMyBdO1xuXHRcdHZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNiBdLCBiMzMgPSBiZVsgMTAgXSwgYjM0ID0gYmVbIDE0IF07XG5cdFx0dmFyIGI0MSA9IGJlWyAzIF0sIGI0MiA9IGJlWyA3IF0sIGI0MyA9IGJlWyAxMSBdLCBiNDQgPSBiZVsgMTUgXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7XG5cdFx0dGVbIDQgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMiArIGExNCAqIGI0Mjtcblx0XHR0ZVsgOCBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzICsgYTE0ICogYjQzO1xuXHRcdHRlWyAxMiBdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0O1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTtcblx0XHR0ZVsgNSBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyICsgYTI0ICogYjQyO1xuXHRcdHRlWyA5IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzMgKyBhMjQgKiBiNDM7XG5cdFx0dGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxICsgYTM0ICogYjQxO1xuXHRcdHRlWyA2IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzIgKyBhMzQgKiBiNDI7XG5cdFx0dGVbIDEwIF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzMgKyBhMzQgKiBiNDM7XG5cdFx0dGVbIDE0IF0gPSBhMzEgKiBiMTQgKyBhMzIgKiBiMjQgKyBhMzMgKiBiMzQgKyBhMzQgKiBiNDQ7XG5cblx0XHR0ZVsgMyBdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxO1xuXHRcdHRlWyA3IF0gPSBhNDEgKiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBiMzIgKyBhNDQgKiBiNDI7XG5cdFx0dGVbIDExIF0gPSBhNDEgKiBiMTMgKyBhNDIgKiBiMjMgKyBhNDMgKiBiMzMgKyBhNDQgKiBiNDM7XG5cdFx0dGVbIDE1IF0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA4IF0gKj0gczsgdGVbIDEyIF0gKj0gcztcblx0XHR0ZVsgMSBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDkgXSAqPSBzOyB0ZVsgMTMgXSAqPSBzO1xuXHRcdHRlWyAyIF0gKj0gczsgdGVbIDYgXSAqPSBzOyB0ZVsgMTAgXSAqPSBzOyB0ZVsgMTQgXSAqPSBzO1xuXHRcdHRlWyAzIF0gKj0gczsgdGVbIDcgXSAqPSBzOyB0ZVsgMTEgXSAqPSBzOyB0ZVsgMTUgXSAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2MS54ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdFx0djEueSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHRcdHYxLnogPSBhdHRyaWJ1dGUuZ2V0WiggaSApO1xuXG5cdFx0XHRcdHYxLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5zZXRYWVooIGksIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXR0cmlidXRlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgbjExID0gdGVbIDAgXSwgbjEyID0gdGVbIDQgXSwgbjEzID0gdGVbIDggXSwgbjE0ID0gdGVbIDEyIF07XG5cdFx0dmFyIG4yMSA9IHRlWyAxIF0sIG4yMiA9IHRlWyA1IF0sIG4yMyA9IHRlWyA5IF0sIG4yNCA9IHRlWyAxMyBdO1xuXHRcdHZhciBuMzEgPSB0ZVsgMiBdLCBuMzIgPSB0ZVsgNiBdLCBuMzMgPSB0ZVsgMTAgXSwgbjM0ID0gdGVbIDE0IF07XG5cdFx0dmFyIG40MSA9IHRlWyAzIF0sIG40MiA9IHRlWyA3IF0sIG40MyA9IHRlWyAxMSBdLCBuNDQgPSB0ZVsgMTUgXTtcblxuXHRcdC8vVE9ETzogbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50XG5cdFx0Ly8oIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bSApXG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0bjQxICogKFxuXHRcdFx0XHQrIG4xNCAqIG4yMyAqIG4zMlxuXHRcdFx0XHQgLSBuMTMgKiBuMjQgKiBuMzJcblx0XHRcdFx0IC0gbjE0ICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMiAqIG4yNCAqIG4zM1xuXHRcdFx0XHQgKyBuMTMgKiBuMjIgKiBuMzRcblx0XHRcdFx0IC0gbjEyICogbjIzICogbjM0XG5cdFx0XHQpICtcblx0XHRcdG40MiAqIChcblx0XHRcdFx0KyBuMTEgKiBuMjMgKiBuMzRcblx0XHRcdFx0IC0gbjExICogbjI0ICogbjMzXG5cdFx0XHRcdCArIG4xNCAqIG4yMSAqIG4zM1xuXHRcdFx0XHQgLSBuMTMgKiBuMjEgKiBuMzRcblx0XHRcdFx0ICsgbjEzICogbjI0ICogbjMxXG5cdFx0XHRcdCAtIG4xNCAqIG4yMyAqIG4zMVxuXHRcdFx0KSArXG5cdFx0XHRuNDMgKiAoXG5cdFx0XHRcdCsgbjExICogbjI0ICogbjMyXG5cdFx0XHRcdCAtIG4xMSAqIG4yMiAqIG4zNFxuXHRcdFx0XHQgLSBuMTQgKiBuMjEgKiBuMzJcblx0XHRcdFx0ICsgbjEyICogbjIxICogbjM0XG5cdFx0XHRcdCArIG4xNCAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTIgKiBuMjQgKiBuMzFcblx0XHRcdCkgK1xuXHRcdFx0bjQ0ICogKFxuXHRcdFx0XHQtIG4xMyAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTEgKiBuMjMgKiBuMzJcblx0XHRcdFx0ICsgbjExICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMyAqIG4yMSAqIG4zMlxuXHRcdFx0XHQgLSBuMTIgKiBuMjEgKiBuMzNcblx0XHRcdFx0ICsgbjEyICogbjIzICogbjMxXG5cdFx0XHQpXG5cblx0XHQpO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB0bXA7XG5cblx0XHR0bXAgPSB0ZVsgMSBdOyB0ZVsgMSBdID0gdGVbIDQgXTsgdGVbIDQgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMiBdOyB0ZVsgMiBdID0gdGVbIDggXTsgdGVbIDggXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgNiBdOyB0ZVsgNiBdID0gdGVbIDkgXTsgdGVbIDkgXSA9IHRtcDtcblxuXHRcdHRtcCA9IHRlWyAzIF07IHRlWyAzIF0gPSB0ZVsgMTIgXTsgdGVbIDEyIF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDcgXTsgdGVbIDcgXSA9IHRlWyAxMyBdOyB0ZVsgMTMgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMTEgXTsgdGVbIDExIF0gPSB0ZVsgMTQgXTsgdGVbIDE0IF0gPSB0bXA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBvc2l0aW9uOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDEyIF0gPSB2Lng7XG5cdFx0dGVbIDEzIF0gPSB2Lnk7XG5cdFx0dGVbIDE0IF0gPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEludmVyc2U6IGZ1bmN0aW9uICggbSwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7XG5cblx0XHQvLyBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG1cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzLFxuXHRcdFx0bWUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRuMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLCBuNDEgPSBtZVsgMyBdLFxuXHRcdFx0bjEyID0gbWVbIDQgXSwgbjIyID0gbWVbIDUgXSwgbjMyID0gbWVbIDYgXSwgbjQyID0gbWVbIDcgXSxcblx0XHRcdG4xMyA9IG1lWyA4IF0sIG4yMyA9IG1lWyA5IF0sIG4zMyA9IG1lWyAxMCBdLCBuNDMgPSBtZVsgMTEgXSxcblx0XHRcdG4xNCA9IG1lWyAxMiBdLCBuMjQgPSBtZVsgMTMgXSwgbjM0ID0gbWVbIDE0IF0sIG40NCA9IG1lWyAxNSBdLFxuXG5cdFx0XHR0MTEgPSBuMjMgKiBuMzQgKiBuNDIgLSBuMjQgKiBuMzMgKiBuNDIgKyBuMjQgKiBuMzIgKiBuNDMgLSBuMjIgKiBuMzQgKiBuNDMgLSBuMjMgKiBuMzIgKiBuNDQgKyBuMjIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTIgPSBuMTQgKiBuMzMgKiBuNDIgLSBuMTMgKiBuMzQgKiBuNDIgLSBuMTQgKiBuMzIgKiBuNDMgKyBuMTIgKiBuMzQgKiBuNDMgKyBuMTMgKiBuMzIgKiBuNDQgLSBuMTIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTMgPSBuMTMgKiBuMjQgKiBuNDIgLSBuMTQgKiBuMjMgKiBuNDIgKyBuMTQgKiBuMjIgKiBuNDMgLSBuMTIgKiBuMjQgKiBuNDMgLSBuMTMgKiBuMjIgKiBuNDQgKyBuMTIgKiBuMjMgKiBuNDQsXG5cdFx0XHR0MTQgPSBuMTQgKiBuMjMgKiBuMzIgLSBuMTMgKiBuMjQgKiBuMzIgLSBuMTQgKiBuMjIgKiBuMzMgKyBuMTIgKiBuMjQgKiBuMzMgKyBuMTMgKiBuMjIgKiBuMzQgLSBuMTIgKiBuMjMgKiBuMzQ7XG5cblx0XHR2YXIgZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzICsgbjQxICogdDE0O1xuXG5cdFx0aWYgKCBkZXQgPT09IDAgKSB7XG5cblx0XHRcdHZhciBtc2cgPSBcIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMFwiO1xuXG5cdFx0XHRpZiAoIHRocm93T25EZWdlbmVyYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBtc2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5pZGVudGl0eSgpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4yMiAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMiAqIG40MSArIG4yNCAqIG4zMSAqIG40MiAtIG4yMSAqIG4zNCAqIG40MiAtIG4yMiAqIG4zMSAqIG40NCArIG4yMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAzIF0gPSAoIG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDQgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMTMgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzMgKiBuNDEgKyBuMTQgKiBuMzEgKiBuNDMgLSBuMTEgKiBuMzQgKiBuNDMgLSBuMTMgKiBuMzEgKiBuNDQgKyBuMTEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNiBdID0gKCBuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIgKyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyA4IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAqIG40MiAtIG4xMSAqIG4yNCAqIG40MiAtIG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAxMSBdID0gKCBuMTMgKiBuMjIgKiBuNDEgLSBuMTIgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjEgKiBuNDIgKyBuMTEgKiBuMjMgKiBuNDIgKyBuMTIgKiBuMjEgKiBuNDMgLSBuMTEgKiBuMjIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyAxMiBdID0gdDE0ICogZGV0SW52O1xuXHRcdHRlWyAxMyBdID0gKCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjtcblx0XHR0ZVsgMTQgXSA9ICggbjE0ICogbjIyICogbjMxIC0gbjEyICogbjI0ICogbjMxIC0gbjE0ICogbjIxICogbjMyICsgbjExICogbjI0ICogbjMyICsgbjEyICogbjIxICogbjM0IC0gbjExICogbjIyICogbjM0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgeCA9IHYueCwgeSA9IHYueSwgeiA9IHYuejtcblxuXHRcdHRlWyAwIF0gKj0geDsgdGVbIDQgXSAqPSB5OyB0ZVsgOCBdICo9IHo7XG5cdFx0dGVbIDEgXSAqPSB4OyB0ZVsgNSBdICo9IHk7IHRlWyA5IF0gKj0gejtcblx0XHR0ZVsgMiBdICo9IHg7IHRlWyA2IF0gKj0geTsgdGVbIDEwIF0gKj0gejtcblx0XHR0ZVsgMyBdICo9IHg7IHRlWyA3IF0gKj0geTsgdGVbIDExIF0gKj0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0TWF4U2NhbGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgc2NhbGVYU3EgPSB0ZVsgMCBdICogdGVbIDAgXSArIHRlWyAxIF0gKiB0ZVsgMSBdICsgdGVbIDIgXSAqIHRlWyAyIF07XG5cdFx0dmFyIHNjYWxlWVNxID0gdGVbIDQgXSAqIHRlWyA0IF0gKyB0ZVsgNSBdICogdGVbIDUgXSArIHRlWyA2IF0gKiB0ZVsgNiBdO1xuXHRcdHZhciBzY2FsZVpTcSA9IHRlWyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBdO1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApO1xuXG5cdH0sXG5cblx0bWFrZVRyYW5zbGF0aW9uOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgeCxcblx0XHRcdDAsIDEsIDAsIHksXG5cdFx0XHQwLCAwLCAxLCB6LFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uWDogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLCAwLFxuXHRcdFx0MCwgYywgLSBzLCAwLFxuXHRcdFx0MCwgcywgYywgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvblk6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0IGMsIDAsIHMsIDAsXG5cdFx0XHQgMCwgMSwgMCwgMCxcblx0XHRcdC0gcywgMCwgYywgMCxcblx0XHRcdCAwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25aOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdGMsIC0gcywgMCwgMCxcblx0XHRcdHMsIGMsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcFxuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXHRcdHZhciB0ID0gMSAtIGM7XG5cdFx0dmFyIHggPSBheGlzLngsIHkgPSBheGlzLnksIHogPSBheGlzLno7XG5cdFx0dmFyIHR4ID0gdCAqIHgsIHR5ID0gdCAqIHk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0dHggKiB4ICsgYywgdHggKiB5IC0gcyAqIHosIHR4ICogeiArIHMgKiB5LCAwLFxuXHRcdFx0dHggKiB5ICsgcyAqIHosIHR5ICogeSArIGMsIHR5ICogeiAtIHMgKiB4LCAwLFxuXHRcdFx0dHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMgKiB4LCB0ICogeiAqIHogKyBjLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdCByZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHgsIDAsIDAsIDAsXG5cdFx0XHQwLCB5LCAwLCAwLFxuXHRcdFx0MCwgMCwgeiwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTaGVhcjogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIHksIHosIDAsXG5cdFx0XHR4LCAxLCB6LCAwLFxuXHRcdFx0eCwgeSwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXBvc2U6IGZ1bmN0aW9uICggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciB4ID0gcXVhdGVybmlvbi5feCwgeSA9IHF1YXRlcm5pb24uX3ksIHogPSBxdWF0ZXJuaW9uLl96LCB3ID0gcXVhdGVybmlvbi5fdztcblx0XHR2YXIgeDIgPSB4ICsgeCxcdHkyID0geSArIHksIHoyID0geiArIHo7XG5cdFx0dmFyIHh4ID0geCAqIHgyLCB4eSA9IHggKiB5MiwgeHogPSB4ICogejI7XG5cdFx0dmFyIHl5ID0geSAqIHkyLCB5eiA9IHkgKiB6MiwgenogPSB6ICogejI7XG5cdFx0dmFyIHd4ID0gdyAqIHgyLCB3eSA9IHcgKiB5Miwgd3ogPSB3ICogejI7XG5cblx0XHR2YXIgc3ggPSBzY2FsZS54LCBzeSA9IHNjYWxlLnksIHN6ID0gc2NhbGUuejtcblxuXHQgICAgICAgIHRlWyAwIF0gPSAoIDEgLSAoIHl5ICsgenogKSApICogc3g7XG5cdCAgICAgICAgdGVbIDEgXSA9ICggeHkgKyB3eiApICogc3g7XG5cdCAgICAgICAgdGVbIDIgXSA9ICggeHogLSB3eSApICogc3g7XG5cdCAgICAgICAgdGVbIDMgXSA9IDA7XG5cblx0ICAgICAgICB0ZVsgNCBdID0gKCB4eSAtIHd6ICkgKiBzeTtcblx0ICAgICAgICB0ZVsgNSBdID0gKCAxIC0gKCB4eCArIHp6ICkgKSAqIHN5O1xuXHQgICAgICAgIHRlWyA2IF0gPSAoIHl6ICsgd3ggKSAqIHN5O1xuXHQgICAgICAgIHRlWyA3IF0gPSAwO1xuXG5cdCAgICAgICAgdGVbIDggXSA9ICggeHogKyB3eSApICogc3o7XG5cdCAgICAgICAgdGVbIDkgXSA9ICggeXogLSB3eCApICogc3o7XG5cdCAgICAgICAgdGVbIDEwIF0gPSAoIDEgLSAoIHh4ICsgeXkgKSApICogc3o7XG5cdCAgICAgICAgdGVbIDExIF0gPSAwO1xuXG5cdCAgICAgICAgdGVbIDEyIF0gPSBwb3NpdGlvbi54O1xuXHQgICAgICAgIHRlWyAxMyBdID0gcG9zaXRpb24ueTtcblx0ICAgICAgICB0ZVsgMTQgXSA9IHBvc2l0aW9uLno7XG5cdCAgICAgICAgdGVbIDE1IF0gPSAxO1xuXG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkZWNvbXBvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0XHR2YXIgc3ggPSB2ZWN0b3Iuc2V0KCB0ZVsgMCBdLCB0ZVsgMSBdLCB0ZVsgMiBdICkubGVuZ3RoKCk7XG5cdFx0XHR2YXIgc3kgPSB2ZWN0b3Iuc2V0KCB0ZVsgNCBdLCB0ZVsgNSBdLCB0ZVsgNiBdICkubGVuZ3RoKCk7XG5cdFx0XHR2YXIgc3ogPSB2ZWN0b3Iuc2V0KCB0ZVsgOCBdLCB0ZVsgOSBdLCB0ZVsgMTAgXSApLmxlbmd0aCgpO1xuXG5cdFx0XHQvLyBpZiBkZXRlcm1pbmUgaXMgbmVnYXRpdmUsIHdlIG5lZWQgdG8gaW52ZXJ0IG9uZSBzY2FsZVxuXHRcdFx0dmFyIGRldCA9IHRoaXMuZGV0ZXJtaW5hbnQoKTtcblx0XHRcdGlmICggZGV0IDwgMCApIHN4ID0gLSBzeDtcblxuXHRcdFx0cG9zaXRpb24ueCA9IHRlWyAxMiBdO1xuXHRcdFx0cG9zaXRpb24ueSA9IHRlWyAxMyBdO1xuXHRcdFx0cG9zaXRpb24ueiA9IHRlWyAxNCBdO1xuXG5cdFx0XHQvLyBzY2FsZSB0aGUgcm90YXRpb24gcGFydFxuXHRcdFx0bWF0cml4LmNvcHkoIHRoaXMgKTtcblxuXHRcdFx0dmFyIGludlNYID0gMSAvIHN4O1xuXHRcdFx0dmFyIGludlNZID0gMSAvIHN5O1xuXHRcdFx0dmFyIGludlNaID0gMSAvIHN6O1xuXG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDAgXSAqPSBpbnZTWDtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMSBdICo9IGludlNYO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAyIF0gKj0gaW52U1g7XG5cblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgNCBdICo9IGludlNZO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA1IF0gKj0gaW52U1k7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDYgXSAqPSBpbnZTWTtcblxuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA4IF0gKj0gaW52U1o7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDkgXSAqPSBpbnZTWjtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMTAgXSAqPSBpbnZTWjtcblxuXHRcdFx0cXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0XHRzY2FsZS54ID0gc3g7XG5cdFx0XHRzY2FsZS55ID0gc3k7XG5cdFx0XHRzY2FsZS56ID0gc3o7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bWFrZVBlcnNwZWN0aXZlOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXG5cdFx0aWYgKCBmYXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHggPSAyICogbmVhciAvICggcmlnaHQgLSBsZWZ0ICk7XG5cdFx0dmFyIHkgPSAyICogbmVhciAvICggdG9wIC0gYm90dG9tICk7XG5cblx0XHR2YXIgYSA9ICggcmlnaHQgKyBsZWZ0ICkgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciBiID0gKCB0b3AgKyBib3R0b20gKSAvICggdG9wIC0gYm90dG9tICk7XG5cdFx0dmFyIGMgPSAtICggZmFyICsgbmVhciApIC8gKCBmYXIgLSBuZWFyICk7XG5cdFx0dmFyIGQgPSAtIDIgKiBmYXIgKiBuZWFyIC8gKCBmYXIgLSBuZWFyICk7XG5cblx0XHR0ZVsgMCBdID0geDtcdHRlWyA0IF0gPSAwO1x0dGVbIDggXSA9IGE7XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEgXSA9IDA7XHR0ZVsgNSBdID0geTtcdHRlWyA5IF0gPSBiO1x0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAyIF0gPSAwO1x0dGVbIDYgXSA9IDA7XHR0ZVsgMTAgXSA9IGM7XHR0ZVsgMTQgXSA9IGQ7XG5cdFx0dGVbIDMgXSA9IDA7XHR0ZVsgNyBdID0gMDtcdHRlWyAxMSBdID0gLSAxO1x0dGVbIDE1IF0gPSAwO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlT3J0aG9ncmFwaGljOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgdyA9IDEuMCAvICggcmlnaHQgLSBsZWZ0ICk7XG5cdFx0dmFyIGggPSAxLjAgLyAoIHRvcCAtIGJvdHRvbSApO1xuXHRcdHZhciBwID0gMS4wIC8gKCBmYXIgLSBuZWFyICk7XG5cblx0XHR2YXIgeCA9ICggcmlnaHQgKyBsZWZ0ICkgKiB3O1xuXHRcdHZhciB5ID0gKCB0b3AgKyBib3R0b20gKSAqIGg7XG5cdFx0dmFyIHogPSAoIGZhciArIG5lYXIgKSAqIHA7XG5cblx0XHR0ZVsgMCBdID0gMiAqIHc7XHR0ZVsgNCBdID0gMDtcdHRlWyA4IF0gPSAwO1x0dGVbIDEyIF0gPSAtIHg7XG5cdFx0dGVbIDEgXSA9IDA7XHR0ZVsgNSBdID0gMiAqIGg7XHR0ZVsgOSBdID0gMDtcdHRlWyAxMyBdID0gLSB5O1xuXHRcdHRlWyAyIF0gPSAwO1x0dGVbIDYgXSA9IDA7XHR0ZVsgMTAgXSA9IC0gMiAqIHA7XHR0ZVsgMTQgXSA9IC0gejtcblx0XHR0ZVsgMyBdID0gMDtcdHRlWyA3IF0gPSAwO1x0dGVbIDExIF0gPSAwO1x0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcblxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA3IF0gPSB0ZVsgNyBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDkgXSA9IHRlWyA5IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEwIF0gPSB0ZVsgMTAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTEgXSA9IHRlWyAxMSBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDEyIF0gPSB0ZVsgMTIgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTMgXSA9IHRlWyAxMyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxNCBdID0gdGVbIDE0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDE1IF0gPSB0ZVsgMTUgXTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXHQvL3Rvb2xiYWfph4znmoRNYXRyaXgucm90YXRpb25cblx0cm90YXRpb246ZnVuY3Rpb24oYSxjLCBiKXtcblx0XHRhWzBdID0gMTtcblx0XHRhWzRdID0gMDtcblx0XHRhWzhdID0gMDtcblx0XHRhWzEyXSA9IDA7XG5cdFx0YVsxXSA9IDA7XG5cdFx0YVs1XSA9IDE7XG5cdFx0YVs5XSA9IDA7XG5cdFx0YVsxM10gPSAwO1xuXHRcdGFbMl0gPSAwO1xuXHRcdGFbNl0gPSAwO1xuXHRcdGFbMTBdID0gMTtcblx0XHRhWzE0XSA9IDA7XG5cdFx0YVszXSA9IDA7XG5cdFx0YVs3XSA9IDA7XG5cdFx0YVsxMV0gPSAwO1xuXHRcdGFbMTVdID0gMTtcblx0XHR2YXIgZCA9IDAuMDE3NDUzMjkyNSAqIGM7XG5cdFx0YyA9IE1hdGguc2luKGQpO1xuXHRcdGQgPSBNYXRoLmNvcyhkKTtcblx0XHRzd2l0Y2ggKGIpIHtcblx0XHRjYXNlIDA6XG5cdFx0XHRhWzVdID0gZDtcblx0XHRcdGFbOV0gPSAtYztcblx0XHRcdGFbNl0gPSBjO1xuXHRcdFx0YVsxMF0gPSBkO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0YVswXSA9IGQ7XG5cdFx0XHRhWzhdID0gYztcblx0XHRcdGFbMl0gPSAtYztcblx0XHRcdGFbMTBdID0gZDtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdGFbMF0gPSBkLFxuXHRcdFx0YVs0XSA9IC1jLFxuXHRcdFx0YVsxXSA9IGMsXG5cdFx0XHRhWzVdID0gZFxuXHRcdH1cblx0XHRyZXR1cm4gYVxuXHR9LFxuXHRtdWw6ZnVuY3Rpb24oYSxjLCBiKXtcblx0XHR2YXIgZCA9IGNbMF1cblx0XHQsIGUgPSBjWzFdXG5cdFx0LCBmID0gY1syXVxuXHRcdCwgZyA9IGNbM11cblx0XHQsIGggPSBjWzRdXG5cdFx0LCBrID0gY1s1XVxuXHRcdCwgbiA9IGNbNl1cblx0XHQsIG0gPSBjWzddXG5cdFx0LCBsID0gY1s4XVxuXHRcdCwgcCA9IGNbOV1cblx0XHQsIHIgPSBjWzEwXVxuXHRcdCwgcyA9IGNbMTFdXG5cdFx0LCB1ID0gY1sxMl1cblx0XHQsIHEgPSBjWzEzXVxuXHRcdCwgeCA9IGNbMTRdO1xuXHQgIGMgPSBjWzE1XTtcblx0ICB2YXIgdyA9IGJbMF1cblx0XHQsIHYgPSBiWzFdXG5cdFx0LCB0ID0gYlsyXVxuXHRcdCwgeSA9IGJbM107XG5cdCAgYVswXSA9IHcgKiBkICsgdiAqIGggKyB0ICogbCArIHkgKiB1O1xuXHQgIGFbMV0gPSB3ICogZSArIHYgKiBrICsgdCAqIHAgKyB5ICogcTtcblx0ICBhWzJdID0gdyAqIGYgKyB2ICogbiArIHQgKiByICsgeSAqIHg7XG5cdCAgYVszXSA9IHcgKiBnICsgdiAqIG0gKyB0ICogcyArIHkgKiBjO1xuXHQgIHcgPSBiWzRdO1xuXHQgIHYgPSBiWzVdO1xuXHQgIHQgPSBiWzZdO1xuXHQgIHkgPSBiWzddO1xuXHQgIGFbNF0gPSB3ICogZCArIHYgKiBoICsgdCAqIGwgKyB5ICogdTtcblx0ICBhWzVdID0gdyAqIGUgKyB2ICogayArIHQgKiBwICsgeSAqIHE7XG5cdCAgYVs2XSA9IHcgKiBmICsgdiAqIG4gKyB0ICogciArIHkgKiB4O1xuXHQgIGFbN10gPSB3ICogZyArIHYgKiBtICsgdCAqIHMgKyB5ICogYztcblx0ICB3ID0gYls4XTtcblx0ICB2ID0gYls5XTtcblx0ICB0ID0gYlsxMF07XG5cdCAgeSA9IGJbMTFdO1xuXHQgIGFbOF0gPSB3ICogZCArIHYgKiBoICsgdCAqIGwgKyB5ICogdTtcblx0ICBhWzldID0gdyAqIGUgKyB2ICogayArIHQgKiBwICsgeSAqIHE7XG5cdCAgYVsxMF0gPSB3ICogZiArIHYgKiBuICsgdCAqIHIgKyB5ICogeDtcblx0ICBhWzExXSA9IHcgKiBnICsgdiAqIG0gKyB0ICogcyArIHkgKiBjO1xuXHQgIHcgPSBiWzEyXTtcblx0ICB2ID0gYlsxM107XG5cdCAgdCA9IGJbMTRdO1xuXHQgIHkgPSBiWzE1XTtcblx0ICBhWzEyXSA9IHcgKiBkICsgdiAqIGggKyB0ICogbCArIHkgKiB1O1xuXHQgIGFbMTNdID0gdyAqIGUgKyB2ICogayArIHQgKiBwICsgeSAqIHE7XG5cdCAgYVsxNF0gPSB3ICogZiArIHYgKiBuICsgdCAqIHIgKyB5ICogeDtcblx0ICBhWzE1XSA9IHcgKiBnICsgdiAqIG0gKyB0ICogcyArIHkgKiBjO1xuXHQgIHJldHVybiBhXG5cdH0sXG5cdGludmVydDogZnVuY3Rpb24oYSwgYykge1xuXHRcdHZhciBiID0gY1swXVxuXHRcdCAgLCBkID0gY1sxXVxuXHRcdCAgLCBlID0gY1syXVxuXHRcdCAgLCBmID0gY1szXVxuXHRcdCAgLCBnID0gY1s0XVxuXHRcdCAgLCBoID0gY1s1XVxuXHRcdCAgLCBrID0gY1s2XVxuXHRcdCAgLCBuID0gY1s3XVxuXHRcdCAgLCBtID0gY1s4XVxuXHRcdCAgLCBsID0gY1s5XVxuXHRcdCAgLCBwID0gY1sxMF1cblx0XHQgICwgciA9IGNbMTFdXG5cdFx0ICAsIHMgPSBjWzEyXVxuXHRcdCAgLCB1ID0gY1sxM11cblx0XHQgICwgcSA9IGNbMTRdXG5cdFx0ICAsIHggPSBjWzE1XVxuXHRcdCAgLCB3ID0gYiAqIGggLSBkICogZ1xuXHRcdCAgLCB2ID0gYiAqIGsgLSBlICogZ1xuXHRcdCAgLCB0ID0gYiAqIG4gLSBmICogZ1xuXHRcdCAgLCB5ID0gZCAqIGsgLSBlICogaFxuXHRcdCAgLCBFID0gZCAqIG4gLSBmICogaFxuXHRcdCAgLCBGID0gZSAqIG4gLSBmICoga1xuXHRcdCAgLCBBID0gbSAqIHUgLSBsICogc1xuXHRcdCAgLCBCID0gbSAqIHEgLSBwICogc1xuXHRcdCAgLCB6ID0gbSAqIHggLSByICogc1xuXHRcdCAgLCBDID0gbCAqIHEgLSBwICogdVxuXHRcdCAgLCBHID0gbCAqIHggLSByICogdVxuXHRcdCAgLCBIID0gcCAqIHggLSByICogcVxuXHRcdCAgLCBEID0gdyAqIEggLSB2ICogRyArIHQgKiBDICsgeSAqIHogLSBFICogQiArIEYgKiBBO1xuXHRcdGlmICghRClcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdEQgPSAxIC8gRDtcblx0XHRhWzBdID0gKGggKiBIIC0gayAqIEcgKyBuICogQykgKiBEO1xuXHRcdGFbMV0gPSAoZSAqIEcgLSBkICogSCAtIGYgKiBDKSAqIEQ7XG5cdFx0YVsyXSA9ICh1ICogRiAtIHEgKiBFICsgeCAqIHkpICogRDtcblx0XHRhWzNdID0gKHAgKiBFIC0gbCAqIEYgLSByICogeSkgKiBEO1xuXHRcdGFbNF0gPSAoayAqIHogLSBnICogSCAtIG4gKiBCKSAqIEQ7XG5cdFx0YVs1XSA9IChiICogSCAtIGUgKiB6ICsgZiAqIEIpICogRDtcblx0XHRhWzZdID0gKHEgKiB0IC0gcyAqIEYgLSB4ICogdikgKiBEO1xuXHRcdGFbN10gPSAobSAqIEYgLSBwICogdCArIHIgKiB2KSAqIEQ7XG5cdFx0YVs4XSA9IChnICogRyAtIGggKiB6ICsgbiAqIEEpICogRDtcblx0XHRhWzldID0gKGQgKiB6IC0gYiAqIEcgLSBmICogQSkgKiBEO1xuXHRcdGFbMTBdID0gKHMgKiBFIC0gdSAqIHQgKyB4ICogdykgKiBEO1xuXHRcdGFbMTFdID0gKGwgKiB0IC0gbSAqIEUgLSByICogdykgKiBEO1xuXHRcdGFbMTJdID0gKGggKiBCIC0gZyAqIEMgLSBrICogQSkgKiBEO1xuXHRcdGFbMTNdID0gKGIgKiBDIC0gZCAqIEIgKyBlICogQSkgKiBEO1xuXHRcdGFbMTRdID0gKHUgKiB2IC0gcyAqIHkgLSBxICogdykgKiBEO1xuXHRcdGFbMTVdID0gKG0gKiB5IC0gbCAqIHYgKyBwICogdykgKiBEO1xuXHRcdHJldHVybiBhXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IE1hdHJpeDQgfTtcbiIsImltcG9ydCB7IF9NYXRoIH0gZnJvbSAnLi9NYXRoLmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUXVhdGVybmlvbiggeCwgeSwgeiwgdyApIHtcblxuXHR0aGlzLl94ID0geCB8fCAwO1xuXHR0aGlzLl95ID0geSB8fCAwO1xuXHR0aGlzLl96ID0geiB8fCAwO1xuXHR0aGlzLl93ID0gKCB3ICE9PSB1bmRlZmluZWQgKSA/IHcgOiAxO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFF1YXRlcm5pb24sIHtcblxuXHRzbGVycDogZnVuY3Rpb24gKCBxYSwgcWIsIHFtLCB0ICkge1xuXG5cdFx0cmV0dXJuIHFtLmNvcHkoIHFhICkuc2xlcnAoIHFiLCB0ICk7XG5cblx0fSxcblxuXHRzbGVycEZsYXQ6IGZ1bmN0aW9uICggZHN0LCBkc3RPZmZzZXQsIHNyYzAsIHNyY09mZnNldDAsIHNyYzEsIHNyY09mZnNldDEsIHQgKSB7XG5cblx0XHQvLyBmdXp6LWZyZWUsIGFycmF5LWJhc2VkIFF1YXRlcm5pb24gU0xFUlAgb3BlcmF0aW9uXG5cblx0XHR2YXIgeDAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMCBdLFxuXHRcdFx0eTAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMSBdLFxuXHRcdFx0ejAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMiBdLFxuXHRcdFx0dzAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMyBdLFxuXG5cdFx0XHR4MSA9IHNyYzFbIHNyY09mZnNldDEgKyAwIF0sXG5cdFx0XHR5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF0sXG5cdFx0XHR6MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF0sXG5cdFx0XHR3MSA9IHNyYzFbIHNyY09mZnNldDEgKyAzIF07XG5cblx0XHRpZiAoIHcwICE9PSB3MSB8fCB4MCAhPT0geDEgfHwgeTAgIT09IHkxIHx8IHowICE9PSB6MSApIHtcblxuXHRcdFx0dmFyIHMgPSAxIC0gdCxcblxuXHRcdFx0XHRjb3MgPSB4MCAqIHgxICsgeTAgKiB5MSArIHowICogejEgKyB3MCAqIHcxLFxuXG5cdFx0XHRcdGRpciA9ICggY29zID49IDAgPyAxIDogLSAxICksXG5cdFx0XHRcdHNxclNpbiA9IDEgLSBjb3MgKiBjb3M7XG5cblx0XHRcdC8vIFNraXAgdGhlIFNsZXJwIGZvciB0aW55IHN0ZXBzIHRvIGF2b2lkIG51bWVyaWMgcHJvYmxlbXM6XG5cdFx0XHRpZiAoIHNxclNpbiA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdHZhciBzaW4gPSBNYXRoLnNxcnQoIHNxclNpbiApLFxuXHRcdFx0XHRcdGxlbiA9IE1hdGguYXRhbjIoIHNpbiwgY29zICogZGlyICk7XG5cblx0XHRcdFx0cyA9IE1hdGguc2luKCBzICogbGVuICkgLyBzaW47XG5cdFx0XHRcdHQgPSBNYXRoLnNpbiggdCAqIGxlbiApIC8gc2luO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB0RGlyID0gdCAqIGRpcjtcblxuXHRcdFx0eDAgPSB4MCAqIHMgKyB4MSAqIHREaXI7XG5cdFx0XHR5MCA9IHkwICogcyArIHkxICogdERpcjtcblx0XHRcdHowID0gejAgKiBzICsgejEgKiB0RGlyO1xuXHRcdFx0dzAgPSB3MCAqIHMgKyB3MSAqIHREaXI7XG5cblx0XHRcdC8vIE5vcm1hbGl6ZSBpbiBjYXNlIHdlIGp1c3QgZGlkIGEgbGVycDpcblx0XHRcdGlmICggcyA9PT0gMSAtIHQgKSB7XG5cblx0XHRcdFx0dmFyIGYgPSAxIC8gTWF0aC5zcXJ0KCB4MCAqIHgwICsgeTAgKiB5MCArIHowICogejAgKyB3MCAqIHcwICk7XG5cblx0XHRcdFx0eDAgKj0gZjtcblx0XHRcdFx0eTAgKj0gZjtcblx0XHRcdFx0ejAgKj0gZjtcblx0XHRcdFx0dzAgKj0gZjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZHN0WyBkc3RPZmZzZXQgXSA9IHgwO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDMgXSA9IHcwO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggUXVhdGVybmlvbi5wcm90b3R5cGUsIHtcblxuXHR4OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3g7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl94ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0ejoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl96O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feiA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR3OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3c7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl93ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbi5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHtcblxuXHRcdHRoaXMuX3ggPSB4O1xuXHRcdHRoaXMuX3kgPSB5O1xuXHRcdHRoaXMuX3ogPSB6O1xuXHRcdHRoaXMuX3cgPSB3O1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHRoaXMuX3ggPSBxdWF0ZXJuaW9uLng7XG5cdFx0dGhpcy5feSA9IHF1YXRlcm5pb24ueTtcblx0XHR0aGlzLl96ID0gcXVhdGVybmlvbi56O1xuXHRcdHRoaXMuX3cgPSBxdWF0ZXJuaW9uLnc7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyLCB1cGRhdGUgKSB7XG5cblx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB4ID0gZXVsZXIuX3gsIHkgPSBldWxlci5feSwgeiA9IGV1bGVyLl96LCBvcmRlciA9IGV1bGVyLm9yZGVyO1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvZmlsZWV4Y2hhbmdlL1xuXHRcdC8vIFx0MjA2OTYtZnVuY3Rpb24tdG8tY29udmVydC1iZXR3ZWVuLWRjbS1ldWxlci1hbmdsZXMtcXVhdGVybmlvbnMtYW5kLWV1bGVyLXZlY3RvcnMvXG5cdFx0Ly9cdGNvbnRlbnQvU3BpbkNhbGMubVxuXG5cdFx0dmFyIGNvcyA9IE1hdGguY29zO1xuXHRcdHZhciBzaW4gPSBNYXRoLnNpbjtcblxuXHRcdHZhciBjMSA9IGNvcyggeCAvIDIgKTtcblx0XHR2YXIgYzIgPSBjb3MoIHkgLyAyICk7XG5cdFx0dmFyIGMzID0gY29zKCB6IC8gMiApO1xuXG5cdFx0dmFyIHMxID0gc2luKCB4IC8gMiApO1xuXHRcdHZhciBzMiA9IHNpbiggeSAvIDIgKTtcblx0XHR2YXIgczMgPSBzaW4oIHogLyAyICk7XG5cblx0XHRpZiAoIG9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVhaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH1cblxuXHRcdGlmICggdXBkYXRlICE9PSBmYWxzZSApIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL2FuZ2xlVG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHZhciBoYWxmQW5nbGUgPSBhbmdsZSAvIDIsIHMgPSBNYXRoLnNpbiggaGFsZkFuZ2xlICk7XG5cblx0XHR0aGlzLl94ID0gYXhpcy54ICogcztcblx0XHR0aGlzLl95ID0gYXhpcy55ICogcztcblx0XHR0aGlzLl96ID0gYXhpcy56ICogcztcblx0XHR0aGlzLl93ID0gTWF0aC5jb3MoIGhhbGZBbmdsZSApO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvUXVhdGVybmlvbi9pbmRleC5odG1cblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR2YXIgdGUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLFxuXHRcdFx0bTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXSxcblx0XHRcdG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdLFxuXG5cdFx0XHR0cmFjZSA9IG0xMSArIG0yMiArIG0zMyxcblx0XHRcdHM7XG5cblx0XHRpZiAoIHRyYWNlID4gMCApIHtcblxuXHRcdFx0cyA9IDAuNSAvIE1hdGguc3FydCggdHJhY2UgKyAxLjAgKTtcblxuXHRcdFx0dGhpcy5fdyA9IDAuMjUgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTMyIC0gbTIzICkgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEzIC0gbTMxICkgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIxIC0gbTEyICkgKiBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTExID4gbTIyICYmIG0xMSA+IG0zMyApIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTExIC0gbTIyIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0zMiAtIG0yMyApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3kgPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAoIG0xMyArIG0zMSApIC8gcztcblxuXHRcdH0gZWxzZSBpZiAoIG0yMiA+IG0zMyApIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTIyIC0gbTExIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0xMyAtIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3ogPSAoIG0yMyArIG0zMiApIC8gcztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0zMyAtIG0xMSAtIG0yMiApO1xuXG5cdFx0XHR0aGlzLl93ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMTMgKyBtMzEgKSAvIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMjMgKyBtMzIgKSAvIHM7XG5cdFx0XHR0aGlzLl96ID0gMC4yNSAqIHM7XG5cblx0XHR9XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVVuaXRWZWN0b3JzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBhc3N1bWVzIGRpcmVjdGlvbiB2ZWN0b3JzIHZGcm9tIGFuZCB2VG8gYXJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHI7XG5cblx0XHR2YXIgRVBTID0gMC4wMDAwMDE7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVVuaXRWZWN0b3JzKCB2RnJvbSwgdlRvICkge1xuXG5cdFx0XHRpZiAoIHYxID09PSB1bmRlZmluZWQgKSB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdHIgPSB2RnJvbS5kb3QoIHZUbyApICsgMTtcblxuXHRcdFx0aWYgKCByIDwgRVBTICkge1xuXG5cdFx0XHRcdHIgPSAwO1xuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIHZGcm9tLnggKSA+IE1hdGguYWJzKCB2RnJvbS56ICkgKSB7XG5cblx0XHRcdFx0XHR2MS5zZXQoIC0gdkZyb20ueSwgdkZyb20ueCwgMCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR2MS5zZXQoIDAsIC0gdkZyb20ueiwgdkZyb20ueSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2MS5jcm9zc1ZlY3RvcnMoIHZGcm9tLCB2VG8gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl94ID0gdjEueDtcblx0XHRcdHRoaXMuX3kgPSB2MS55O1xuXHRcdFx0dGhpcy5feiA9IHYxLno7XG5cdFx0XHR0aGlzLl93ID0gcjtcblxuXHRcdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhbmdsZVRvOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHRyZXR1cm4gMiAqIE1hdGguYWNvcyggTWF0aC5hYnMoIF9NYXRoLmNsYW1wKCB0aGlzLmRvdCggcSApLCAtIDEsIDEgKSApICk7XG5cblx0fSxcblxuXHRyb3RhdGVUb3dhcmRzOiBmdW5jdGlvbiAoIHEsIHN0ZXAgKSB7XG5cblx0XHR2YXIgYW5nbGUgPSB0aGlzLmFuZ2xlVG8oIHEgKTtcblxuXHRcdGlmICggYW5nbGUgPT09IDAgKSByZXR1cm4gdGhpcztcblxuXHRcdHZhciB0ID0gTWF0aC5taW4oIDEsIHN0ZXAgLyBhbmdsZSApO1xuXG5cdFx0dGhpcy5zbGVycCggcSwgdCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpbnZlcnNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBxdWF0ZXJuaW9uIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxuXG5cdFx0cmV0dXJuIHRoaXMuY29uanVnYXRlKCk7XG5cblx0fSxcblxuXHRjb25qdWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX3ggKj0gLSAxO1xuXHRcdHRoaXMuX3kgKj0gLSAxO1xuXHRcdHRoaXMuX3ogKj0gLSAxO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB2Ll94ICsgdGhpcy5feSAqIHYuX3kgKyB0aGlzLl96ICogdi5feiArIHRoaXMuX3cgKiB2Ll93O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdztcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGwgPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0aWYgKCBsID09PSAwICkge1xuXG5cdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdHRoaXMuX3kgPSAwO1xuXHRcdFx0dGhpcy5feiA9IDA7XG5cdFx0XHR0aGlzLl93ID0gMTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGwgPSAxIC8gbDtcblxuXHRcdFx0dGhpcy5feCA9IHRoaXMuX3ggKiBsO1xuXHRcdFx0dGhpcy5feSA9IHRoaXMuX3kgKiBsO1xuXHRcdFx0dGhpcy5feiA9IHRoaXMuX3ogKiBsO1xuXHRcdFx0dGhpcy5fdyA9IHRoaXMuX3cgKiBsO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHEsIHAgKSB7XG5cblx0XHRpZiAoIHAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlRdWF0ZXJuaW9ucyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggdGhpcywgcSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5UXVhdGVybmlvbnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdC8vIGZyb20gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9jb2RlL2luZGV4Lmh0bVxuXG5cdFx0dmFyIHFheCA9IGEuX3gsIHFheSA9IGEuX3ksIHFheiA9IGEuX3osIHFhdyA9IGEuX3c7XG5cdFx0dmFyIHFieCA9IGIuX3gsIHFieSA9IGIuX3ksIHFieiA9IGIuX3osIHFidyA9IGIuX3c7XG5cblx0XHR0aGlzLl94ID0gcWF4ICogcWJ3ICsgcWF3ICogcWJ4ICsgcWF5ICogcWJ6IC0gcWF6ICogcWJ5O1xuXHRcdHRoaXMuX3kgPSBxYXkgKiBxYncgKyBxYXcgKiBxYnkgKyBxYXogKiBxYnggLSBxYXggKiBxYno7XG5cdFx0dGhpcy5feiA9IHFheiAqIHFidyArIHFhdyAqIHFieiArIHFheCAqIHFieSAtIHFheSAqIHFieDtcblx0XHR0aGlzLl93ID0gcWF3ICogcWJ3IC0gcWF4ICogcWJ4IC0gcWF5ICogcWJ5IC0gcWF6ICogcWJ6O1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNsZXJwOiBmdW5jdGlvbiAoIHFiLCB0ICkge1xuXG5cdFx0aWYgKCB0ID09PSAwICkgcmV0dXJuIHRoaXM7XG5cdFx0aWYgKCB0ID09PSAxICkgcmV0dXJuIHRoaXMuY29weSggcWIgKTtcblxuXHRcdHZhciB4ID0gdGhpcy5feCwgeSA9IHRoaXMuX3ksIHogPSB0aGlzLl96LCB3ID0gdGhpcy5fdztcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvc2xlcnAvXG5cblx0XHR2YXIgY29zSGFsZlRoZXRhID0gdyAqIHFiLl93ICsgeCAqIHFiLl94ICsgeSAqIHFiLl95ICsgeiAqIHFiLl96O1xuXG5cdFx0aWYgKCBjb3NIYWxmVGhldGEgPCAwICkge1xuXG5cdFx0XHR0aGlzLl93ID0gLSBxYi5fdztcblx0XHRcdHRoaXMuX3ggPSAtIHFiLl94O1xuXHRcdFx0dGhpcy5feSA9IC0gcWIuX3k7XG5cdFx0XHR0aGlzLl96ID0gLSBxYi5fejtcblxuXHRcdFx0Y29zSGFsZlRoZXRhID0gLSBjb3NIYWxmVGhldGE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmNvcHkoIHFiICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA+PSAxLjAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB3O1xuXHRcdFx0dGhpcy5feCA9IHg7XG5cdFx0XHR0aGlzLl95ID0geTtcblx0XHRcdHRoaXMuX3ogPSB6O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBzcXJTaW5IYWxmVGhldGEgPSAxLjAgLSBjb3NIYWxmVGhldGEgKiBjb3NIYWxmVGhldGE7XG5cblx0XHRpZiAoIHNxclNpbkhhbGZUaGV0YSA8PSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0dmFyIHMgPSAxIC0gdDtcblx0XHRcdHRoaXMuX3cgPSBzICogdyArIHQgKiB0aGlzLl93O1xuXHRcdFx0dGhpcy5feCA9IHMgKiB4ICsgdCAqIHRoaXMuX3g7XG5cdFx0XHR0aGlzLl95ID0gcyAqIHkgKyB0ICogdGhpcy5feTtcblx0XHRcdHRoaXMuX3ogPSBzICogeiArIHQgKiB0aGlzLl96O1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHRcdH1cblxuXHRcdHZhciBzaW5IYWxmVGhldGEgPSBNYXRoLnNxcnQoIHNxclNpbkhhbGZUaGV0YSApO1xuXHRcdHZhciBoYWxmVGhldGEgPSBNYXRoLmF0YW4yKCBzaW5IYWxmVGhldGEsIGNvc0hhbGZUaGV0YSApO1xuXHRcdHZhciByYXRpb0EgPSBNYXRoLnNpbiggKCAxIC0gdCApICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGEsXG5cdFx0XHRyYXRpb0IgPSBNYXRoLnNpbiggdCAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhO1xuXG5cdFx0dGhpcy5fdyA9ICggdyAqIHJhdGlvQSArIHRoaXMuX3cgKiByYXRpb0IgKTtcblx0XHR0aGlzLl94ID0gKCB4ICogcmF0aW9BICsgdGhpcy5feCAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3kgPSAoIHkgKiByYXRpb0EgKyB0aGlzLl95ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feiA9ICggeiAqIHJhdGlvQSArIHRoaXMuX3ogKiByYXRpb0IgKTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHJldHVybiAoIHF1YXRlcm5pb24uX3ggPT09IHRoaXMuX3ggKSAmJiAoIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kgKSAmJiAoIHF1YXRlcm5pb24uX3ogPT09IHRoaXMuX3ogKSAmJiAoIHF1YXRlcm5pb24uX3cgPT09IHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl93O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG5cbmV4cG9ydCB7IFF1YXRlcm5pb24gfTtcbiIsImltcG9ydCB7IF9NYXRoIH0gZnJvbSAnLi9NYXRoLmpzJztcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuL01hdHJpeDQuanMnO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vUXVhdGVybmlvbi5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3Iga2lsZSAvIGh0dHA6Ly9raWxlLnN0cmF2YWdhbnphLm9yZy9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFZlY3RvcjMoIHgsIHksIHogKSB7XG5cblx0dGhpcy54ID0geCB8fCAwO1xuXHR0aGlzLnkgPSB5IHx8IDA7XG5cdHRoaXMueiA9IHogfHwgMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBWZWN0b3IzLnByb3RvdHlwZSwge1xuXG5cdGlzVmVjdG9yMzogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cdFx0dGhpcy55ID0geTtcblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblx0XHR0aGlzLnogPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggeCApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggeSApIHtcblxuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggeiApIHtcblxuXHRcdHRoaXMueiA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCwgdmFsdWUgKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMjogdGhpcy56ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXHRcdHRoaXMueiA9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCArPSB2Lng7XG5cdFx0dGhpcy55ICs9IHYueTtcblx0XHR0aGlzLnogKz0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXHRcdHRoaXMueiArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXHRcdHRoaXMueiA9IGEueiArIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gdi54ICogcztcblx0XHR0aGlzLnkgKz0gdi55ICogcztcblx0XHR0aGlzLnogKz0gdi56ICogcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAtPSB2Lng7XG5cdFx0dGhpcy55IC09IHYueTtcblx0XHR0aGlzLnogLT0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXHRcdHRoaXMueiAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXHRcdHRoaXMueiA9IGEueiAtIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLm11bHRpcGx5VmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICo9IHYueDtcblx0XHR0aGlzLnkgKj0gdi55O1xuXHRcdHRoaXMueiAqPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcblx0XHR0aGlzLnogKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCAqIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgKiBiLnk7XG5cdFx0dGhpcy56ID0gYS56ICogYi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseUV1bGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlFdWxlciggZXVsZXIgKSB7XG5cblx0XHRcdGlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseUF4aXNBbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5QXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFwcGx5TWF0cml4MzogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF0gKiB6O1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdICogejtcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDggXSAqIHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dmFyIHcgPSAxIC8gKCBlWyAzIF0gKiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUgXSApO1xuXG5cdFx0dGhpcy54ID0gKCBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHogKyBlWyAxMiBdICkgKiB3O1xuXHRcdHRoaXMueSA9ICggZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSApICogdztcblx0XHR0aGlzLnogPSAoIGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHogKyBlWyAxNCBdICkgKiB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBxeCA9IHEueCwgcXkgPSBxLnksIHF6ID0gcS56LCBxdyA9IHEudztcblxuXHRcdC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjdG9yXG5cblx0XHR2YXIgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHk7XG5cdFx0dmFyIGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6O1xuXHRcdHZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcblx0XHR2YXIgaXcgPSAtIHF4ICogeCAtIHF5ICogeSAtIHF6ICogejtcblxuXHRcdC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcblxuXHRcdHRoaXMueCA9IGl4ICogcXcgKyBpdyAqIC0gcXggKyBpeSAqIC0gcXogLSBpeiAqIC0gcXk7XG5cdFx0dGhpcy55ID0gaXkgKiBxdyArIGl3ICogLSBxeSArIGl6ICogLSBxeCAtIGl4ICogLSBxejtcblx0XHR0aGlzLnogPSBpeiAqIHF3ICsgaXcgKiAtIHF6ICsgaXggKiAtIHF5IC0gaXkgKiAtIHF4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwcm9qZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBwcm9qZWN0KCBjYW1lcmEgKSB7XG5cblx0XHRcdG1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgbWF0cml4LmdldEludmVyc2UoIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dW5wcm9qZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1bnByb2plY3QoIGNhbWVyYSApIHtcblxuXHRcdFx0bWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZCwgbWF0cml4LmdldEludmVyc2UoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICkgKTtcblx0XHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2Zvcm1EaXJlY3Rpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGlucHV0OiBUSFJFRS5NYXRyaXg0IGFmZmluZSBtYXRyaXhcblx0XHQvLyB2ZWN0b3IgaW50ZXJwcmV0ZWQgYXMgYSBkaXJlY3Rpb25cblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogejtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHo7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogejtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0ZGl2aWRlOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggLz0gdi54O1xuXHRcdHRoaXMueSAvPSB2Lnk7XG5cdFx0dGhpcy56IC89IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtaW4gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtYXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwsIG1pblZhbCApO1xuXHRcdFx0bWF4LnNldCggbWF4VmFsLCBtYXhWYWwsIG1heFZhbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsYW1wTGVuZ3RoOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVsdGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkgKTtcblxuXHR9LFxuXG5cdGZsb29yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmZsb29yKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VpbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguY2VpbCggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9ICggdGhpcy56IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnogKSA6IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXHRcdHRoaXMueiA9IC0gdGhpcy56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2Lno7XG5cblx0fSxcblxuXHQvLyBUT0RPIGxlbmd0aFNxdWFyZWQ/XG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLno7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiApO1xuXG5cdH0sXG5cblx0bWFuaGF0dGFuTGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRoaXMueiApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cdFx0dGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bGVycFZlY3RvcnM6IGZ1bmN0aW9uICggdjEsIHYyLCBhbHBoYSApIHtcblxuXHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTtcblxuXHR9LFxuXG5cdGNyb3NzOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmNyb3NzVmVjdG9ycyggdGhpcywgdiApO1xuXG5cdH0sXG5cblx0Y3Jvc3NWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR2YXIgYXggPSBhLngsIGF5ID0gYS55LCBheiA9IGEuejtcblx0XHR2YXIgYnggPSBiLngsIGJ5ID0gYi55LCBieiA9IGIuejtcblxuXHRcdHRoaXMueCA9IGF5ICogYnogLSBheiAqIGJ5O1xuXHRcdHRoaXMueSA9IGF6ICogYnggLSBheCAqIGJ6O1xuXHRcdHRoaXMueiA9IGF4ICogYnkgLSBheSAqIGJ4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwcm9qZWN0T25WZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dmFyIHNjYWxhciA9IHZlY3Rvci5kb3QoIHRoaXMgKSAvIHZlY3Rvci5sZW5ndGhTcSgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weSggdmVjdG9yICkubXVsdGlwbHlTY2FsYXIoIHNjYWxhciApO1xuXG5cdH0sXG5cblx0cHJvamVjdE9uUGxhbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcHJvamVjdE9uUGxhbmUoIHBsYW5lTm9ybWFsICkge1xuXG5cdFx0XHR2MS5jb3B5KCB0aGlzICkucHJvamVjdE9uVmVjdG9yKCBwbGFuZU5vcm1hbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zdWIoIHYxICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyZWZsZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByZWZsZWN0IGluY2lkZW50IHZlY3RvciBvZmYgcGxhbmUgb3J0aG9nb25hbCB0byBub3JtYWxcblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJlZmxlY3QoIG5vcm1hbCApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc3ViKCB2MS5jb3B5KCBub3JtYWwgKS5tdWx0aXBseVNjYWxhciggMiAqIHRoaXMuZG90KCBub3JtYWwgKSApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhbmdsZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGhldGEgPSB0aGlzLmRvdCggdiApIC8gKCBNYXRoLnNxcnQoIHRoaXMubGVuZ3RoU3EoKSAqIHYubGVuZ3RoU3EoKSApICk7XG5cblx0XHQvLyBjbGFtcCwgdG8gaGFuZGxlIG51bWVyaWNhbCBwcm9ibGVtc1xuXG5cdFx0cmV0dXJuIE1hdGguYWNvcyggX01hdGguY2xhbXAoIHRoZXRhLCAtIDEsIDEgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwgZHogPSB0aGlzLnogLSB2Lno7XG5cblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6O1xuXG5cdH0sXG5cblx0bWFuaGF0dGFuRGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKSArIE1hdGguYWJzKCB0aGlzLnogLSB2LnogKTtcblxuXHR9LFxuXG5cdHNldEZyb21TcGhlcmljYWw6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHZhciBzaW5QaGlSYWRpdXMgPSBNYXRoLnNpbiggcy5waGkgKSAqIHMucmFkaXVzO1xuXG5cdFx0dGhpcy54ID0gc2luUGhpUmFkaXVzICogTWF0aC5zaW4oIHMudGhldGEgKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNvcyggcy5waGkgKSAqIHMucmFkaXVzO1xuXHRcdHRoaXMueiA9IHNpblBoaVJhZGl1cyAqIE1hdGguY29zKCBzLnRoZXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21DeWxpbmRyaWNhbDogZnVuY3Rpb24gKCBjICkge1xuXG5cdFx0dGhpcy54ID0gYy5yYWRpdXMgKiBNYXRoLnNpbiggYy50aGV0YSApO1xuXHRcdHRoaXMueSA9IGMueTtcblx0XHR0aGlzLnogPSBjLnJhZGl1cyAqIE1hdGguY29zKCBjLnRoZXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMTIgXTtcblx0XHR0aGlzLnkgPSBlWyAxMyBdO1xuXHRcdHRoaXMueiA9IGVbIDE0IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhTY2FsZTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHN4ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7XG5cdFx0dmFyIHN5ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7XG5cdFx0dmFyIHN6ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7XG5cblx0XHR0aGlzLnggPSBzeDtcblx0XHR0aGlzLnkgPSBzeTtcblx0XHR0aGlzLnogPSBzejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeENvbHVtbjogZnVuY3Rpb24gKCBtLCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmZyb21BcnJheSggbS5lbGVtZW50cywgaW5kZXggKiA0ICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgJiYgKCB2LnogPT09IHRoaXMueiApICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy54ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cdFx0dGhpcy56ID0gYXJyYXlbIG9mZnNldCArIDIgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IFZlY3RvcjMgfTtcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBNYXRyaXgzKCkge1xuXG5cdHRoaXMuZWxlbWVudHMgPSBbXG5cblx0XHQxLCAwLCAwLFxuXHRcdDAsIDEsIDAsXG5cdFx0MCwgMCwgMVxuXG5cdF07XG5cblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0cml4My5wcm90b3R5cGUsIHtcblxuXHRpc01hdHJpeDM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4yMSwgbjIyLCBuMjMsIG4zMSwgbjMyLCBuMzMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG4xMTsgdGVbIDEgXSA9IG4yMTsgdGVbIDIgXSA9IG4zMTtcblx0XHR0ZVsgMyBdID0gbjEyOyB0ZVsgNCBdID0gbjIyOyB0ZVsgNSBdID0gbjMyO1xuXHRcdHRlWyA2IF0gPSBuMTM7IHRlWyA3IF0gPSBuMjM7IHRlWyA4IF0gPSBuMzM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlkZW50aXR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCxcblx0XHRcdDAsIDEsIDAsXG5cdFx0XHQwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KCB0aGlzLmVsZW1lbnRzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdO1xuXHRcdHRlWyAzIF0gPSBtZVsgMyBdOyB0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07XG5cdFx0dGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdOyB0ZVsgOCBdID0gbWVbIDggXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0bWVbIDAgXSwgbWVbIDQgXSwgbWVbIDggXSxcblx0XHRcdG1lWyAxIF0sIG1lWyA1IF0sIG1lWyA5IF0sXG5cdFx0XHRtZVsgMiBdLCBtZVsgNiBdLCBtZVsgMTAgXVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0djEueCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7XG5cdFx0XHRcdHYxLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApO1xuXHRcdFx0XHR2MS56ID0gYXR0cmlidXRlLmdldFooIGkgKTtcblxuXHRcdFx0XHR2MS5hcHBseU1hdHJpeDMoIHRoaXMgKTtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuc2V0WFlaKCBpLCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGF0dHJpYnV0ZTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7XG5cblx0fSxcblxuXHRwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlNYXRyaWNlczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGFlID0gYS5lbGVtZW50cztcblx0XHR2YXIgYmUgPSBiLmVsZW1lbnRzO1xuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYTExID0gYWVbIDAgXSwgYTEyID0gYWVbIDMgXSwgYTEzID0gYWVbIDYgXTtcblx0XHR2YXIgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDQgXSwgYTIzID0gYWVbIDcgXTtcblx0XHR2YXIgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDUgXSwgYTMzID0gYWVbIDggXTtcblxuXHRcdHZhciBiMTEgPSBiZVsgMCBdLCBiMTIgPSBiZVsgMyBdLCBiMTMgPSBiZVsgNiBdO1xuXHRcdHZhciBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNCBdLCBiMjMgPSBiZVsgNyBdO1xuXHRcdHZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNSBdLCBiMzMgPSBiZVsgOCBdO1xuXG5cdFx0dGVbIDAgXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSArIGExMyAqIGIzMTtcblx0XHR0ZVsgMyBdID0gYTExICogYjEyICsgYTEyICogYjIyICsgYTEzICogYjMyO1xuXHRcdHRlWyA2IF0gPSBhMTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzM7XG5cblx0XHR0ZVsgMSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMxO1xuXHRcdHRlWyA0IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMgKiBiMzI7XG5cdFx0dGVbIDcgXSA9IGEyMSAqIGIxMyArIGEyMiAqIGIyMyArIGEyMyAqIGIzMztcblxuXHRcdHRlWyAyIF0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMgKiBiMzE7XG5cdFx0dGVbIDUgXSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMjtcblx0XHR0ZVsgOCBdID0gYTMxICogYjEzICsgYTMyICogYjIzICsgYTMzICogYjMzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gKj0gczsgdGVbIDMgXSAqPSBzOyB0ZVsgNiBdICo9IHM7XG5cdFx0dGVbIDEgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA3IF0gKj0gcztcblx0XHR0ZVsgMiBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDggXSAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkZXRlcm1pbmFudDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhID0gdGVbIDAgXSwgYiA9IHRlWyAxIF0sIGMgPSB0ZVsgMiBdLFxuXHRcdFx0ZCA9IHRlWyAzIF0sIGUgPSB0ZVsgNCBdLCBmID0gdGVbIDUgXSxcblx0XHRcdGcgPSB0ZVsgNiBdLCBoID0gdGVbIDcgXSwgaSA9IHRlWyA4IF07XG5cblx0XHRyZXR1cm4gYSAqIGUgKiBpIC0gYSAqIGYgKiBoIC0gYiAqIGQgKiBpICsgYiAqIGYgKiBnICsgYyAqIGQgKiBoIC0gYyAqIGUgKiBnO1xuXG5cdH0sXG5cblx0Z2V0SW52ZXJzZTogZnVuY3Rpb24gKCBtYXRyaXgsIHRocm93T25EZWdlbmVyYXRlICkge1xuXG5cdFx0aWYgKCBtYXRyaXggJiYgbWF0cml4LmlzTWF0cml4NCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIG5vIGxvbmdlciB0YWtlcyBhIE1hdHJpeDQgYXJndW1lbnQuXCIgKTtcblxuXHRcdH1cblxuXHRcdHZhciBtZSA9IG1hdHJpeC5lbGVtZW50cyxcblx0XHRcdHRlID0gdGhpcy5lbGVtZW50cyxcblxuXHRcdFx0bjExID0gbWVbIDAgXSwgbjIxID0gbWVbIDEgXSwgbjMxID0gbWVbIDIgXSxcblx0XHRcdG4xMiA9IG1lWyAzIF0sIG4yMiA9IG1lWyA0IF0sIG4zMiA9IG1lWyA1IF0sXG5cdFx0XHRuMTMgPSBtZVsgNiBdLCBuMjMgPSBtZVsgNyBdLCBuMzMgPSBtZVsgOCBdLFxuXG5cdFx0XHR0MTEgPSBuMzMgKiBuMjIgLSBuMzIgKiBuMjMsXG5cdFx0XHR0MTIgPSBuMzIgKiBuMTMgLSBuMzMgKiBuMTIsXG5cdFx0XHR0MTMgPSBuMjMgKiBuMTIgLSBuMjIgKiBuMTMsXG5cblx0XHRcdGRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMztcblxuXHRcdGlmICggZGV0ID09PSAwICkge1xuXG5cdFx0XHR2YXIgbXNnID0gXCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDBcIjtcblxuXHRcdFx0aWYgKCB0aHJvd09uRGVnZW5lcmF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggbXNnICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuaWRlbnRpdHkoKTtcblxuXHRcdH1cblxuXHRcdHZhciBkZXRJbnYgPSAxIC8gZGV0O1xuXG5cdFx0dGVbIDAgXSA9IHQxMSAqIGRldEludjtcblx0XHR0ZVsgMSBdID0gKCBuMzEgKiBuMjMgLSBuMzMgKiBuMjEgKSAqIGRldEludjtcblx0XHR0ZVsgMiBdID0gKCBuMzIgKiBuMjEgLSBuMzEgKiBuMjIgKSAqIGRldEludjtcblxuXHRcdHRlWyAzIF0gPSB0MTIgKiBkZXRJbnY7XG5cdFx0dGVbIDQgXSA9ICggbjMzICogbjExIC0gbjMxICogbjEzICkgKiBkZXRJbnY7XG5cdFx0dGVbIDUgXSA9ICggbjMxICogbjEyIC0gbjMyICogbjExICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgNiBdID0gdDEzICogZGV0SW52O1xuXHRcdHRlWyA3IF0gPSAoIG4yMSAqIG4xMyAtIG4yMyAqIG4xMSApICogZGV0SW52O1xuXHRcdHRlWyA4IF0gPSAoIG4yMiAqIG4xMSAtIG4yMSAqIG4xMiApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0bXAsIG0gPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dG1wID0gbVsgMSBdOyBtWyAxIF0gPSBtWyAzIF07IG1bIDMgXSA9IHRtcDtcblx0XHR0bXAgPSBtWyAyIF07IG1bIDIgXSA9IG1bIDYgXTsgbVsgNiBdID0gdG1wO1xuXHRcdHRtcCA9IG1bIDUgXTsgbVsgNSBdID0gbVsgNyBdOyBtWyA3IF0gPSB0bXA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldE5vcm1hbE1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXg0ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQoIG1hdHJpeDQgKS5nZXRJbnZlcnNlKCB0aGlzICkudHJhbnNwb3NlKCk7XG5cblx0fSxcblxuXHR0cmFuc3Bvc2VJbnRvQXJyYXk6IGZ1bmN0aW9uICggciApIHtcblxuXHRcdHZhciBtID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHJbIDAgXSA9IG1bIDAgXTtcblx0XHRyWyAxIF0gPSBtWyAzIF07XG5cdFx0clsgMiBdID0gbVsgNiBdO1xuXHRcdHJbIDMgXSA9IG1bIDEgXTtcblx0XHRyWyA0IF0gPSBtWyA0IF07XG5cdFx0clsgNSBdID0gbVsgNyBdO1xuXHRcdHJbIDYgXSA9IG1bIDIgXTtcblx0XHRyWyA3IF0gPSBtWyA1IF07XG5cdFx0clsgOCBdID0gbVsgOCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRVdlRyYW5zZm9ybTogZnVuY3Rpb24gKCB0eCwgdHksIHN4LCBzeSwgcm90YXRpb24sIGN4LCBjeSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHJvdGF0aW9uICk7XG5cdFx0dmFyIHMgPSBNYXRoLnNpbiggcm90YXRpb24gKTtcblxuXHRcdHRoaXMuc2V0KFxuXHRcdFx0c3ggKiBjLCBzeCAqIHMsIC0gc3ggKiAoIGMgKiBjeCArIHMgKiBjeSApICsgY3ggKyB0eCxcblx0XHRcdC0gc3kgKiBzLCBzeSAqIGMsIC0gc3kgKiAoIC0gcyAqIGN4ICsgYyAqIGN5ICkgKyBjeSArIHR5LFxuXHRcdFx0MCwgMCwgMVxuXHRcdCk7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCBzeCwgc3kgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSAqPSBzeDsgdGVbIDMgXSAqPSBzeDsgdGVbIDYgXSAqPSBzeDtcblx0XHR0ZVsgMSBdICo9IHN5OyB0ZVsgNCBdICo9IHN5OyB0ZVsgNyBdICo9IHN5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGU6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApO1xuXHRcdHZhciBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IHRlWyAwIF0sIGExMiA9IHRlWyAzIF0sIGExMyA9IHRlWyA2IF07XG5cdFx0dmFyIGEyMSA9IHRlWyAxIF0sIGEyMiA9IHRlWyA0IF0sIGEyMyA9IHRlWyA3IF07XG5cblx0XHR0ZVsgMCBdID0gYyAqIGExMSArIHMgKiBhMjE7XG5cdFx0dGVbIDMgXSA9IGMgKiBhMTIgKyBzICogYTIyO1xuXHRcdHRlWyA2IF0gPSBjICogYTEzICsgcyAqIGEyMztcblxuXHRcdHRlWyAxIF0gPSAtIHMgKiBhMTEgKyBjICogYTIxO1xuXHRcdHRlWyA0IF0gPSAtIHMgKiBhMTIgKyBjICogYTIyO1xuXHRcdHRlWyA3IF0gPSAtIHMgKiBhMTMgKyBjICogYTIzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggdHgsIHR5ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gKz0gdHggKiB0ZVsgMiBdOyB0ZVsgMyBdICs9IHR4ICogdGVbIDUgXTsgdGVbIDYgXSArPSB0eCAqIHRlWyA4IF07XG5cdFx0dGVbIDEgXSArPSB0eSAqIHRlWyAyIF07IHRlWyA0IF0gKz0gdHkgKiB0ZVsgNSBdOyB0ZVsgNyBdICs9IHR5ICogdGVbIDggXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBNYXRyaXgzIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL1xuICovXG5cbnZhciBJbWFnZVV0aWxzID0ge1xuXG5cdGdldERhdGFVUkw6IGZ1bmN0aW9uICggaW1hZ2UgKSB7XG5cblx0XHR2YXIgY2FudmFzO1xuXG5cdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkge1xuXG5cdFx0XHRjYW52YXMgPSBpbWFnZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRcdFx0Y2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyggaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHRcdFx0XHRjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcblx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cblx0XHRcdGlmICggaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZURhdGEgKSB7XG5cblx0XHRcdFx0Y29udGV4dC5wdXRJbWFnZURhdGEoIGltYWdlLCAwLCAwICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggY2FudmFzLndpZHRoID4gMjA0OCB8fCBjYW52YXMuaGVpZ2h0ID4gMjA0OCApIHtcblxuXHRcdFx0cmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoICdpbWFnZS9qcGVnJywgMC42ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gY2FudmFzLnRvRGF0YVVSTCggJ2ltYWdlL3BuZycgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbmV4cG9ydCB7IEltYWdlVXRpbHMgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKi9cblxuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vY29yZS9FdmVudERpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgVVZNYXBwaW5nIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsIENsYW1wVG9FZGdlV3JhcHBpbmcsIFJlcGVhdFdyYXBwaW5nLCBMaW5lYXJFbmNvZGluZywgVW5zaWduZWRCeXRlVHlwZSwgUkdCQUZvcm1hdCwgTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyLCBMaW5lYXJGaWx0ZXIgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgX01hdGggfSBmcm9tICcuLi9tYXRoL01hdGguanMnO1xuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XG5pbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi4vbWF0aC9NYXRyaXgzLmpzJztcbmltcG9ydCB7IEltYWdlVXRpbHMgfSBmcm9tICcuLi9leHRyYXMvSW1hZ2VVdGlscy5qcyc7XG5cbnZhciB0ZXh0dXJlSWQgPSAwO1xuXG5mdW5jdGlvbiBUZXh0dXJlKCBpbWFnZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IHRleHR1cmVJZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5pbWFnZSA9IGltYWdlICE9PSB1bmRlZmluZWQgPyBpbWFnZSA6IFRleHR1cmUuREVGQVVMVF9JTUFHRTtcblx0dGhpcy5taXBtYXBzID0gW107XG5cblx0dGhpcy5tYXBwaW5nID0gbWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFwcGluZyA6IFRleHR1cmUuREVGQVVMVF9NQVBQSU5HO1xuXG5cdHRoaXMud3JhcFMgPSB3cmFwUyAhPT0gdW5kZWZpbmVkID8gd3JhcFMgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXHR0aGlzLndyYXBUID0gd3JhcFQgIT09IHVuZGVmaW5lZCA/IHdyYXBUIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyO1xuXG5cdHRoaXMuYW5pc290cm9weSA9IGFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCA/IGFuaXNvdHJvcHkgOiAxO1xuXG5cdHRoaXMuZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBSR0JBRm9ybWF0O1xuXHR0aGlzLnR5cGUgPSB0eXBlICE9PSB1bmRlZmluZWQgPyB0eXBlIDogVW5zaWduZWRCeXRlVHlwZTtcblxuXHR0aGlzLm9mZnNldCA9IG5ldyBWZWN0b3IyKCAwLCAwICk7XG5cdHRoaXMucmVwZWF0ID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblx0dGhpcy5jZW50ZXIgPSBuZXcgVmVjdG9yMiggMCwgMCApO1xuXHR0aGlzLnJvdGF0aW9uID0gMDtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlO1xuXHR0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSB0cnVlO1xuXHR0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IHRydWU7XG5cdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gNDtcdC8vIHZhbGlkIHZhbHVlczogMSwgMiwgNCwgOCAoc2VlIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvb3BlbmdsZXMvc2RrL2RvY3MvbWFuL3hodG1sL2dsUGl4ZWxTdG9yZWkueG1sKVxuXG5cdC8vIFZhbHVlcyBvZiBlbmNvZGluZyAhPT0gVEhSRUUuTGluZWFyRW5jb2Rpbmcgb25seSBzdXBwb3J0ZWQgb24gbWFwLCBlbnZNYXAgYW5kIGVtaXNzaXZlTWFwLlxuXHQvL1xuXHQvLyBBbHNvIGNoYW5naW5nIHRoZSBlbmNvZGluZyBhZnRlciBhbHJlYWR5IHVzZWQgYnkgYSBNYXRlcmlhbCB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IG1ha2UgdGhlIE1hdGVyaWFsXG5cdC8vIHVwZGF0ZS4gIFlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCBNYXRlcmlhbC5uZWVkc1VwZGF0ZSB0byB0cmlnZ2VyIGl0IHRvIHJlY29tcGlsZS5cblx0dGhpcy5lbmNvZGluZyA9IGVuY29kaW5nICE9PSB1bmRlZmluZWQgPyBlbmNvZGluZyA6IExpbmVhckVuY29kaW5nO1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cdHRoaXMub25VcGRhdGUgPSBudWxsO1xuXG59XG5cblRleHR1cmUuREVGQVVMVF9JTUFHRSA9IHVuZGVmaW5lZDtcblRleHR1cmUuREVGQVVMVF9NQVBQSU5HID0gVVZNYXBwaW5nO1xuXG5UZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBUZXh0dXJlLFxuXG5cdGlzVGV4dHVyZTogdHJ1ZSxcblxuXHR1cGRhdGVNYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKCB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55LCB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55LCB0aGlzLnJvdGF0aW9uLCB0aGlzLmNlbnRlci54LCB0aGlzLmNlbnRlci55ICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMuaW1hZ2UgPSBzb3VyY2UuaW1hZ2U7XG5cdFx0dGhpcy5taXBtYXBzID0gc291cmNlLm1pcG1hcHMuc2xpY2UoIDAgKTtcblxuXHRcdHRoaXMubWFwcGluZyA9IHNvdXJjZS5tYXBwaW5nO1xuXG5cdFx0dGhpcy53cmFwUyA9IHNvdXJjZS53cmFwUztcblx0XHR0aGlzLndyYXBUID0gc291cmNlLndyYXBUO1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBzb3VyY2UubWFnRmlsdGVyO1xuXHRcdHRoaXMubWluRmlsdGVyID0gc291cmNlLm1pbkZpbHRlcjtcblxuXHRcdHRoaXMuYW5pc290cm9weSA9IHNvdXJjZS5hbmlzb3Ryb3B5O1xuXG5cdFx0dGhpcy5mb3JtYXQgPSBzb3VyY2UuZm9ybWF0O1xuXHRcdHRoaXMudHlwZSA9IHNvdXJjZS50eXBlO1xuXG5cdFx0dGhpcy5vZmZzZXQuY29weSggc291cmNlLm9mZnNldCApO1xuXHRcdHRoaXMucmVwZWF0LmNvcHkoIHNvdXJjZS5yZXBlYXQgKTtcblx0XHR0aGlzLmNlbnRlci5jb3B5KCBzb3VyY2UuY2VudGVyICk7XG5cdFx0dGhpcy5yb3RhdGlvbiA9IHNvdXJjZS5yb3RhdGlvbjtcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4LmNvcHkoIHNvdXJjZS5tYXRyaXggKTtcblxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gc291cmNlLmdlbmVyYXRlTWlwbWFwcztcblx0XHR0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbHlBbHBoYTtcblx0XHR0aGlzLmZsaXBZID0gc291cmNlLmZsaXBZO1xuXHRcdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gc291cmNlLnVucGFja0FsaWdubWVudDtcblx0XHR0aGlzLmVuY29kaW5nID0gc291cmNlLmVuY29kaW5nO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBpc1Jvb3RPYmplY3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTtcblxuXHRcdGlmICggISBpc1Jvb3RPYmplY3QgJiYgbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG91dHB1dCA9IHtcblxuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnVGV4dHVyZScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ1RleHR1cmUudG9KU09OJ1xuXHRcdFx0fSxcblxuXHRcdFx0dXVpZDogdGhpcy51dWlkLFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLFxuXG5cdFx0XHRtYXBwaW5nOiB0aGlzLm1hcHBpbmcsXG5cblx0XHRcdHJlcGVhdDogWyB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55IF0sXG5cdFx0XHRvZmZzZXQ6IFsgdGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQueSBdLFxuXHRcdFx0Y2VudGVyOiBbIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgXSxcblx0XHRcdHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuXG5cdFx0XHR3cmFwOiBbIHRoaXMud3JhcFMsIHRoaXMud3JhcFQgXSxcblxuXHRcdFx0Zm9ybWF0OiB0aGlzLmZvcm1hdCxcblx0XHRcdG1pbkZpbHRlcjogdGhpcy5taW5GaWx0ZXIsXG5cdFx0XHRtYWdGaWx0ZXI6IHRoaXMubWFnRmlsdGVyLFxuXHRcdFx0YW5pc290cm9weTogdGhpcy5hbmlzb3Ryb3B5LFxuXG5cdFx0XHRmbGlwWTogdGhpcy5mbGlwWVxuXG5cdFx0fTtcblxuXHRcdGlmICggdGhpcy5pbWFnZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBUT0RPOiBNb3ZlIHRvIFRIUkVFLkltYWdlXG5cblx0XHRcdHZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7XG5cblx0XHRcdGlmICggaW1hZ2UudXVpZCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGltYWdlLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsgLy8gVUdIXG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCAhIGlzUm9vdE9iamVjdCAmJiBtZXRhLmltYWdlc1sgaW1hZ2UudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmFyIHVybDtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGltYWdlICkgKSB7XG5cblx0XHRcdFx0XHQvLyBwcm9jZXNzIGFycmF5IG9mIGltYWdlcyBlLmcuIEN1YmVUZXh0dXJlXG5cblx0XHRcdFx0XHR1cmwgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGltYWdlLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHVybC5wdXNoKCBJbWFnZVV0aWxzLmdldERhdGFVUkwoIGltYWdlWyBpIF0gKSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBwcm9jZXNzIHNpbmdsZSBpbWFnZVxuXG5cdFx0XHRcdFx0dXJsID0gSW1hZ2VVdGlscy5nZXREYXRhVVJMKCBpbWFnZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtZXRhLmltYWdlc1sgaW1hZ2UudXVpZCBdID0ge1xuXHRcdFx0XHRcdHV1aWQ6IGltYWdlLnV1aWQsXG5cdFx0XHRcdFx0dXJsOiB1cmxcblx0XHRcdFx0fTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvdXRwdXQuaW1hZ2UgPSBpbWFnZS51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAhIGlzUm9vdE9iamVjdCApIHtcblxuXHRcdFx0bWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gPSBvdXRwdXQ7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fSxcblxuXHR0cmFuc2Zvcm1VdjogZnVuY3Rpb24gKCB1diApIHtcblxuXHRcdGlmICggdGhpcy5tYXBwaW5nICE9PSBVVk1hcHBpbmcgKSByZXR1cm47XG5cblx0XHR1di5hcHBseU1hdHJpeDMoIHRoaXMubWF0cml4ICk7XG5cblx0XHRpZiAoIHV2LnggPCAwIHx8IHV2LnggPiAxICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLndyYXBTICkge1xuXG5cdFx0XHRcdGNhc2UgUmVwZWF0V3JhcHBpbmc6XG5cblx0XHRcdFx0XHR1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6XG5cblx0XHRcdFx0XHR1di54ID0gdXYueCA8IDAgPyAwIDogMTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6XG5cblx0XHRcdFx0XHRpZiAoIE1hdGguYWJzKCBNYXRoLmZsb29yKCB1di54ICkgJSAyICkgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdHV2LnggPSBNYXRoLmNlaWwoIHV2LnggKSAtIHV2Lng7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB1di55IDwgMCB8fCB1di55ID4gMSApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy53cmFwVCApIHtcblxuXHRcdFx0XHRjYXNlIFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueSA9IHV2LnkgPCAwID8gMCA6IDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0aWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueSApICUgMiApID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHR1di55ID0gTWF0aC5jZWlsKCB1di55ICkgLSB1di55O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mbGlwWSApIHtcblxuXHRcdFx0dXYueSA9IDEgLSB1di55O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIFRleHR1cmUucHJvdG90eXBlLCBcIm5lZWRzVXBkYXRlXCIsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IFRleHR1cmUgfTtcbiIsIi8qKlxuICogQGF1dGhvciBzdXBlcmVnZ2JlcnQgLyBodHRwOi8vd3d3LnBhdWxicnVudC5jby51ay9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFZlY3RvcjQoIHgsIHksIHosIHcgKSB7XG5cblx0dGhpcy54ID0geCB8fCAwO1xuXHR0aGlzLnkgPSB5IHx8IDA7XG5cdHRoaXMueiA9IHogfHwgMDtcblx0dGhpcy53ID0gKCB3ICE9PSB1bmRlZmluZWQgKSA/IHcgOiAxO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7XG5cblx0aXNWZWN0b3I0OiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cdFx0dGhpcy53ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXHRcdHRoaXMudyA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCB6ICkge1xuXG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCB3ICkge1xuXG5cdFx0dGhpcy53ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDM6IHRoaXMudyA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRjYXNlIDM6IHJldHVybiB0aGlzLnc7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXHRcdHRoaXMueiA9IHYuejtcblx0XHR0aGlzLncgPSAoIHYudyAhPT0gdW5kZWZpbmVkICkgPyB2LncgOiAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXHRcdHRoaXMueiArPSB2Lno7XG5cdFx0dGhpcy53ICs9IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblx0XHR0aGlzLncgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cdFx0dGhpcy53ID0gYS53ICsgYi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsZWRWZWN0b3I6IGZ1bmN0aW9uICggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXHRcdHRoaXMueiArPSB2LnogKiBzO1xuXHRcdHRoaXMudyArPSB2LncgKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXHRcdHRoaXMueiAtPSB2Lno7XG5cdFx0dGhpcy53IC09IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblx0XHR0aGlzLncgLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cdFx0dGhpcy53ID0gYS53IC0gYi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcblx0XHR0aGlzLncgKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56LCB3ID0gdGhpcy53O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogeiArIGVbIDEyIF0gKiB3O1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKiB3O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHogKyBlWyAxNCBdICogdztcblx0XHR0aGlzLncgPSBlWyAzIF0gKiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUgXSAqIHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xuXG5cdH0sXG5cblx0c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9xdWF0ZXJuaW9uVG9BbmdsZS9pbmRleC5odG1cblxuXHRcdC8vIHEgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0XHR0aGlzLncgPSAyICogTWF0aC5hY29zKCBxLncgKTtcblxuXHRcdHZhciBzID0gTWF0aC5zcXJ0KCAxIC0gcS53ICogcS53ICk7XG5cblx0XHRpZiAoIHMgPCAwLjAwMDEgKSB7XG5cblx0XHRcdHRoaXMueCA9IDE7XG5cdFx0XHR0aGlzLnkgPSAwO1xuXHRcdFx0dGhpcy56ID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMueCA9IHEueCAvIHM7XG5cdFx0XHR0aGlzLnkgPSBxLnkgLyBzO1xuXHRcdFx0dGhpcy56ID0gcS56IC8gcztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9BbmdsZS9pbmRleC5odG1cblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR2YXIgYW5nbGUsIHgsIHksIHosXHRcdC8vIHZhcmlhYmxlcyBmb3IgcmVzdWx0XG5cdFx0XHRlcHNpbG9uID0gMC4wMSxcdFx0Ly8gbWFyZ2luIHRvIGFsbG93IGZvciByb3VuZGluZyBlcnJvcnNcblx0XHRcdGVwc2lsb24yID0gMC4xLFx0XHQvLyBtYXJnaW4gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAwIGFuZCAxODAgZGVncmVlc1xuXG5cdFx0XHR0ZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF07XG5cblx0XHRpZiAoICggTWF0aC5hYnMoIG0xMiAtIG0yMSApIDwgZXBzaWxvbiApICYmXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMTMgLSBtMzEgKSA8IGVwc2lsb24gKSAmJlxuXHRcdCAgICAgKCBNYXRoLmFicyggbTIzIC0gbTMyICkgPCBlcHNpbG9uICkgKSB7XG5cblx0XHRcdC8vIHNpbmd1bGFyaXR5IGZvdW5kXG5cdFx0XHQvLyBmaXJzdCBjaGVjayBmb3IgaWRlbnRpdHkgbWF0cml4IHdoaWNoIG11c3QgaGF2ZSArMSBmb3IgYWxsIHRlcm1zXG5cdFx0XHQvLyBpbiBsZWFkaW5nIGRpYWdvbmFsIGFuZCB6ZXJvIGluIG90aGVyIHRlcm1zXG5cblx0XHRcdGlmICggKCBNYXRoLmFicyggbTEyICsgbTIxICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0xMyArIG0zMSApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgKyBtMzIgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTExICsgbTIyICsgbTMzIC0gMyApIDwgZXBzaWxvbjIgKSApIHtcblxuXHRcdFx0XHQvLyB0aGlzIHNpbmd1bGFyaXR5IGlzIGlkZW50aXR5IG1hdHJpeCBzbyBhbmdsZSA9IDBcblxuXHRcdFx0XHR0aGlzLnNldCggMSwgMCwgMCwgMCApO1xuXG5cdFx0XHRcdHJldHVybiB0aGlzOyAvLyB6ZXJvIGFuZ2xlLCBhcmJpdHJhcnkgYXhpc1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG90aGVyd2lzZSB0aGlzIHNpbmd1bGFyaXR5IGlzIGFuZ2xlID0gMTgwXG5cblx0XHRcdGFuZ2xlID0gTWF0aC5QSTtcblxuXHRcdFx0dmFyIHh4ID0gKCBtMTEgKyAxICkgLyAyO1xuXHRcdFx0dmFyIHl5ID0gKCBtMjIgKyAxICkgLyAyO1xuXHRcdFx0dmFyIHp6ID0gKCBtMzMgKyAxICkgLyAyO1xuXHRcdFx0dmFyIHh5ID0gKCBtMTIgKyBtMjEgKSAvIDQ7XG5cdFx0XHR2YXIgeHogPSAoIG0xMyArIG0zMSApIC8gNDtcblx0XHRcdHZhciB5eiA9ICggbTIzICsgbTMyICkgLyA0O1xuXG5cdFx0XHRpZiAoICggeHggPiB5eSApICYmICggeHggPiB6eiApICkge1xuXG5cdFx0XHRcdC8vIG0xMSBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtXG5cblx0XHRcdFx0aWYgKCB4eCA8IGVwc2lsb24gKSB7XG5cblx0XHRcdFx0XHR4ID0gMDtcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eiA9IDAuNzA3MTA2NzgxO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR4ID0gTWF0aC5zcXJ0KCB4eCApO1xuXHRcdFx0XHRcdHkgPSB4eSAvIHg7XG5cdFx0XHRcdFx0eiA9IHh6IC8geDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIHl5ID4genogKSB7XG5cblx0XHRcdFx0Ly8gbTIyIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cblxuXHRcdFx0XHRpZiAoIHl5IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR5ID0gMDtcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHkgPSBNYXRoLnNxcnQoIHl5ICk7XG5cdFx0XHRcdFx0eCA9IHh5IC8geTtcblx0XHRcdFx0XHR6ID0geXogLyB5O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBtMzMgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybSBzbyBiYXNlIHJlc3VsdCBvbiB0aGlzXG5cblx0XHRcdFx0aWYgKCB6eiA8IGVwc2lsb24gKSB7XG5cblx0XHRcdFx0XHR4ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eSA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHogPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR6ID0gTWF0aC5zcXJ0KCB6eiApO1xuXHRcdFx0XHRcdHggPSB4eiAvIHo7XG5cdFx0XHRcdFx0eSA9IHl6IC8gejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXQoIHgsIHksIHosIGFuZ2xlICk7XG5cblx0XHRcdHJldHVybiB0aGlzOyAvLyByZXR1cm4gMTgwIGRlZyByb3RhdGlvblxuXG5cdFx0fVxuXG5cdFx0Ly8gYXMgd2UgaGF2ZSByZWFjaGVkIGhlcmUgdGhlcmUgYXJlIG5vIHNpbmd1bGFyaXRpZXMgc28gd2UgY2FuIGhhbmRsZSBub3JtYWxseVxuXG5cdFx0dmFyIHMgPSBNYXRoLnNxcnQoICggbTMyIC0gbTIzICkgKiAoIG0zMiAtIG0yMyApICtcblx0XHQgICAgICAgICAgICAgICAgICAgKCBtMTMgLSBtMzEgKSAqICggbTEzIC0gbTMxICkgK1xuXHRcdCAgICAgICAgICAgICAgICAgICAoIG0yMSAtIG0xMiApICogKCBtMjEgLSBtMTIgKSApOyAvLyB1c2VkIHRvIG5vcm1hbGl6ZVxuXG5cdFx0aWYgKCBNYXRoLmFicyggcyApIDwgMC4wMDEgKSBzID0gMTtcblxuXHRcdC8vIHByZXZlbnQgZGl2aWRlIGJ5IHplcm8sIHNob3VsZCBub3QgaGFwcGVuIGlmIG1hdHJpeCBpcyBvcnRob2dvbmFsIGFuZCBzaG91bGQgYmVcblx0XHQvLyBjYXVnaHQgYnkgc2luZ3VsYXJpdHkgdGVzdCBhYm92ZSwgYnV0IEkndmUgbGVmdCBpdCBpbiBqdXN0IGluIGNhc2VcblxuXHRcdHRoaXMueCA9ICggbTMyIC0gbTIzICkgLyBzO1xuXHRcdHRoaXMueSA9ICggbTEzIC0gbTMxICkgLyBzO1xuXHRcdHRoaXMueiA9ICggbTIxIC0gbTEyICkgLyBzO1xuXHRcdHRoaXMudyA9IE1hdGguYWNvcyggKCBtMTEgKyBtMjIgKyBtMzMgLSAxICkgLyAyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1pbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5taW4oIHRoaXMueiwgdi56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5taW4oIHRoaXMudywgdi53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1heDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIHRoaXMueiwgdi56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5tYXgoIHRoaXMudywgdi53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2VcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW4ueSwgTWF0aC5taW4oIG1heC55LCB0aGlzLnkgKSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCBtaW4ueiwgTWF0aC5taW4oIG1heC56LCB0aGlzLnogKSApO1xuXHRcdHRoaXMudyA9IE1hdGgubWF4KCBtaW4udywgTWF0aC5taW4oIG1heC53LCB0aGlzLncgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcFNjYWxhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1pbiwgbWF4O1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0aWYgKCBtaW4gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtaW4gPSBuZXcgVmVjdG9yNCgpO1xuXHRcdFx0XHRtYXggPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdG1pbi5zZXQoIG1pblZhbCwgbWluVmFsLCBtaW5WYWwsIG1pblZhbCApO1xuXHRcdFx0bWF4LnNldCggbWF4VmFsLCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGguZmxvb3IoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLmNlaWwoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5yb3VuZCggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSAoIHRoaXMudyA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy53ICkgOiBNYXRoLmZsb29yKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblx0XHR0aGlzLncgPSAtIHRoaXMudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56ICsgdGhpcy53ICogdi53O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLnc7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudyApO1xuXG5cdH0sXG5cblx0bWFuaGF0dGFuTGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRoaXMueiApICsgTWF0aC5hYnMoIHRoaXMudyApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cdFx0dGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTtcblx0XHR0aGlzLncgKz0gKCB2LncgLSB0aGlzLncgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdjIsIHYxICkubXVsdGlwbHlTY2FsYXIoIGFscGhhICkuYWRkKCB2MSApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSAmJiAoIHYudyA9PT0gdGhpcy53ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLnogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMudyA9IGFycmF5WyBvZmZzZXQgKyAzIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLnc7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcblx0XHR0aGlzLncgPSBhdHRyaWJ1dGUuZ2V0VyggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IFZlY3RvcjQgfTtcbiIsImltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uL2NvcmUvRXZlbnREaXNwYXRjaGVyLmpzJztcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9UZXh0dXJlLmpzJztcbmltcG9ydCB7IExpbmVhckZpbHRlciB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0LmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBNYXJpdXMgS2ludGVsIC8gaHR0cHM6Ly9naXRodWIuY29tL2tpbnRlbFxuICovXG5cbi8qXG4gSW4gb3B0aW9ucywgd2UgY2FuIHNwZWNpZnk6XG4gKiBUZXh0dXJlIHBhcmFtZXRlcnMgZm9yIGFuIGF1dG8tZ2VuZXJhdGVkIHRhcmdldCB0ZXh0dXJlXG4gKiBkZXB0aEJ1ZmZlci9zdGVuY2lsQnVmZmVyOiBCb29sZWFucyB0byBpbmRpY2F0ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgdGhlc2UgYnVmZmVyc1xuKi9cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkge1xuXG5cdHRoaXMud2lkdGggPSB3aWR0aDtcblx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0dGhpcy5zY2lzc29yID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0dGhpcy5zY2lzc29yVGVzdCA9IGZhbHNlO1xuXG5cdHRoaXMudmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdGlmICggb3B0aW9ucy5taW5GaWx0ZXIgPT09IHVuZGVmaW5lZCApIG9wdGlvbnMubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdHRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlKCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb3B0aW9ucy53cmFwUywgb3B0aW9ucy53cmFwVCwgb3B0aW9ucy5tYWdGaWx0ZXIsIG9wdGlvbnMubWluRmlsdGVyLCBvcHRpb25zLmZvcm1hdCwgb3B0aW9ucy50eXBlLCBvcHRpb25zLmFuaXNvdHJvcHksIG9wdGlvbnMuZW5jb2RpbmcgKTtcblxuXHR0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gb3B0aW9ucy5nZW5lcmF0ZU1pcG1hcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZ2VuZXJhdGVNaXBtYXBzIDogdHJ1ZTtcblxuXHR0aGlzLmRlcHRoQnVmZmVyID0gb3B0aW9ucy5kZXB0aEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aEJ1ZmZlciA6IHRydWU7XG5cdHRoaXMuc3RlbmNpbEJ1ZmZlciA9IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdGVuY2lsQnVmZmVyIDogdHJ1ZTtcblx0dGhpcy5kZXB0aFRleHR1cmUgPSBvcHRpb25zLmRlcHRoVGV4dHVyZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aFRleHR1cmUgOiBudWxsO1xuXG59XG5cbldlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBXZWJHTFJlbmRlclRhcmdldCxcblxuXHRpc1dlYkdMUmVuZGVyVGFyZ2V0OiB0cnVlLFxuXG5cdHNldFNpemU6IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdGlmICggdGhpcy53aWR0aCAhPT0gd2lkdGggfHwgdGhpcy5oZWlnaHQgIT09IGhlaWdodCApIHtcblxuXHRcdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xuXHRcdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRcdHRoaXMuZGlzcG9zZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3cG9ydC5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHR0aGlzLnNjaXNzb3Iuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHRoaXMudmlld3BvcnQuY29weSggc291cmNlLnZpZXdwb3J0ICk7XG5cblx0XHR0aGlzLnRleHR1cmUgPSBzb3VyY2UudGV4dHVyZS5jbG9uZSgpO1xuXG5cdFx0dGhpcy5kZXB0aEJ1ZmZlciA9IHNvdXJjZS5kZXB0aEJ1ZmZlcjtcblx0XHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBzb3VyY2Uuc3RlbmNpbEJ1ZmZlcjtcblx0XHR0aGlzLmRlcHRoVGV4dHVyZSA9IHNvdXJjZS5kZXB0aFRleHR1cmU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IFdlYkdMUmVuZGVyVGFyZ2V0IH07XG4iLCJpbXBvcnQgeyBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gJy4vV2ViR0xSZW5kZXJUYXJnZXQuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb21cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldEN1YmUoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7XG5cblx0V2ViR0xSZW5kZXJUYXJnZXQuY2FsbCggdGhpcywgd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xuXG5cdHRoaXMuYWN0aXZlQ3ViZUZhY2UgPSAwOyAvLyBQWCAwLCBOWCAxLCBQWSAyLCBOWSAzLCBQWiA0LCBOWiA1XG5cdHRoaXMuYWN0aXZlTWlwTWFwTGV2ZWwgPSAwO1xuXG59XG5cbldlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUgKTtcbldlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBXZWJHTFJlbmRlclRhcmdldEN1YmU7XG5cbldlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPSB0cnVlO1xuXG5cbmV4cG9ydCB7IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL1RleHR1cmUuanMnO1xuaW1wb3J0IHsgTmVhcmVzdEZpbHRlciB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlKCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IGRhdGE6IGRhdGEsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XG5cbn1cblxuRGF0YVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkRhdGFUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGFUZXh0dXJlO1xuXG5EYXRhVGV4dHVyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZSA9IHRydWU7XG5cblxuZXhwb3J0IHsgRGF0YVRleHR1cmUgfTtcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi9TcGhlcmUuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIEJveDMoIG1pbiwgbWF4ICkge1xuXG5cdHRoaXMubWluID0gKCBtaW4gIT09IHVuZGVmaW5lZCApID8gbWluIDogbmV3IFZlY3RvcjMoICsgSW5maW5pdHksICsgSW5maW5pdHksICsgSW5maW5pdHkgKTtcblx0dGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9yMyggLSBJbmZpbml0eSwgLSBJbmZpbml0eSwgLSBJbmZpbml0eSApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJveDMucHJvdG90eXBlLCB7XG5cblx0aXNCb3gzOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIG1pbiApO1xuXHRcdHRoaXMubWF4LmNvcHkoIG1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHR2YXIgbWluWCA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblkgPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5aID0gKyBJbmZpbml0eTtcblxuXHRcdHZhciBtYXhYID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WSA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFogPSAtIEluZmluaXR5O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHR2YXIgeCA9IGFycmF5WyBpIF07XG5cdFx0XHR2YXIgeSA9IGFycmF5WyBpICsgMSBdO1xuXHRcdFx0dmFyIHogPSBhcnJheVsgaSArIDIgXTtcblxuXHRcdFx0aWYgKCB4IDwgbWluWCApIG1pblggPSB4O1xuXHRcdFx0aWYgKCB5IDwgbWluWSApIG1pblkgPSB5O1xuXHRcdFx0aWYgKCB6IDwgbWluWiApIG1pblogPSB6O1xuXG5cdFx0XHRpZiAoIHggPiBtYXhYICkgbWF4WCA9IHg7XG5cdFx0XHRpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7XG5cdFx0XHRpZiAoIHogPiBtYXhaICkgbWF4WiA9IHo7XG5cblx0XHR9XG5cblx0XHR0aGlzLm1pbi5zZXQoIG1pblgsIG1pblksIG1pblogKTtcblx0XHR0aGlzLm1heC5zZXQoIG1heFgsIG1heFksIG1heFogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHR2YXIgbWluWCA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblkgPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5aID0gKyBJbmZpbml0eTtcblxuXHRcdHZhciBtYXhYID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WSA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFogPSAtIEluZmluaXR5O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHggPSBhdHRyaWJ1dGUuZ2V0WCggaSApO1xuXHRcdFx0dmFyIHkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApO1xuXHRcdFx0dmFyIHogPSBhdHRyaWJ1dGUuZ2V0WiggaSApO1xuXG5cdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7XG5cblx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblx0XHRcdGlmICggeiA+IG1heFogKSBtYXhaID0gejtcblxuXHRcdH1cblxuXHRcdHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApO1xuXHRcdHRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIHBvaW50c1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21DZW50ZXJBbmRTaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21DZW50ZXJBbmRTaXplKCBjZW50ZXIsIHNpemUgKSB7XG5cblx0XHRcdHZhciBoYWxmU2l6ZSA9IHYxLmNvcHkoIHNpemUgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0XHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHRcdHRoaXMubWF4LmNvcHkoIGNlbnRlciApLmFkZCggaGFsZlNpemUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XG5cblx0XHRyZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdCggb2JqZWN0ICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXguY29weSggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gdGhpcy5taW4ueiA9ICsgSW5maW5pdHk7XG5cdFx0dGhpcy5tYXgueCA9IHRoaXMubWF4LnkgPSB0aGlzLm1heC56ID0gLSBJbmZpbml0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aXNFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdGhpcyBpcyBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNhdXNlIHZvbHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXNcblxuXHRcdHJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSApIHx8ICggdGhpcy5tYXgueiA8IHRoaXMubWluLnogKTtcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZ2V0Q2VudGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdH0sXG5cblx0Z2V0U2l6ZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCwgMCApIDogdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggcG9pbnQgKTtcblx0XHR0aGlzLm1heC5tYXgoIHBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHRoaXMubWluLnN1YiggdmVjdG9yICk7XG5cdFx0dGhpcy5tYXguYWRkKCB2ZWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApO1xuXHRcdHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5T2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBDb21wdXRlcyB0aGUgd29ybGQtYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBvZiBhbiBvYmplY3QgKGluY2x1ZGluZyBpdHMgY2hpbGRyZW4pLFxuXHRcdC8vIGFjY291bnRpbmcgZm9yIGJvdGggdGhlIG9iamVjdCdzLCBhbmQgY2hpbGRyZW4ncywgd29ybGQgdHJhbnNmb3Jtc1xuXG5cdFx0dmFyIHNjb3BlLCBpLCBsO1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZ1bmN0aW9uIHRyYXZlcnNlKCBub2RlICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSBub2RlLmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cblx0XHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHYxLmNvcHkoIHZlcnRpY2VzWyBpIF0gKTtcblx0XHRcdFx0XHRcdHYxLmFwcGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0XHRzY29wZS5leHBhbmRCeVBvaW50KCB2MSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR2YXIgYXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2MS5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGkgKS5hcHBseU1hdHJpeDQoIG5vZGUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHRcdFx0XHRzY29wZS5leHBhbmRCeVBvaW50KCB2MSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZXhwYW5kQnlPYmplY3QoIG9iamVjdCApIHtcblxuXHRcdFx0c2NvcGUgPSB0aGlzO1xuXG5cdFx0XHRvYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0b2JqZWN0LnRyYXZlcnNlKCB0cmF2ZXJzZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdHBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55IHx8XG5cdFx0XHRwb2ludC56IDwgdGhpcy5taW4ueiB8fCBwb2ludC56ID4gdGhpcy5tYXgueiA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiB0aGlzLm1pbi54IDw9IGJveC5taW4ueCAmJiBib3gubWF4LnggPD0gdGhpcy5tYXgueCAmJlxuXHRcdFx0dGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4LnkgJiZcblx0XHRcdHRoaXMubWluLnogPD0gYm94Lm1pbi56ICYmIGJveC5tYXgueiA8PSB0aGlzLm1heC56O1xuXG5cdH0sXG5cblx0Z2V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHQvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveFxuXHRcdC8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuXG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldChcblx0XHRcdCggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSxcblx0XHRcdCggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKSxcblx0XHRcdCggcG9pbnQueiAtIHRoaXMubWluLnogKSAvICggdGhpcy5tYXgueiAtIHRoaXMubWluLnogKVxuXHRcdCk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdC8vIHVzaW5nIDYgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zLlxuXHRcdHJldHVybiBib3gubWF4LnggPCB0aGlzLm1pbi54IHx8IGJveC5taW4ueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdGJveC5tYXgueSA8IHRoaXMubWluLnkgfHwgYm94Lm1pbi55ID4gdGhpcy5tYXgueSB8fFxuXHRcdFx0Ym94Lm1heC56IDwgdGhpcy5taW4ueiB8fCBib3gubWluLnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgY2xvc2VzdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSB7XG5cblx0XHRcdC8vIEZpbmQgdGhlIHBvaW50IG9uIHRoZSBBQUJCIGNsb3Nlc3QgdG8gdGhlIHNwaGVyZSBjZW50ZXIuXG5cdFx0XHR0aGlzLmNsYW1wUG9pbnQoIHNwaGVyZS5jZW50ZXIsIGNsb3Nlc3RQb2ludCApO1xuXG5cdFx0XHQvLyBJZiB0aGF0IHBvaW50IGlzIGluc2lkZSB0aGUgc3BoZXJlLCB0aGUgQUFCQiBhbmQgc3BoZXJlIGludGVyc2VjdC5cblx0XHRcdHJldHVybiBjbG9zZXN0UG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQoIHNwaGVyZS5jZW50ZXIgKSA8PSAoIHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdC8vIFdlIGNvbXB1dGUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZG90IHByb2R1Y3QgdmFsdWVzLiBJZiB0aG9zZSB2YWx1ZXNcblx0XHQvLyBhcmUgb24gdGhlIHNhbWUgc2lkZSAoYmFjayBvciBmcm9udCkgb2YgdGhlIHBsYW5lLCB0aGVuIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cblxuXHRcdHZhciBtaW4sIG1heDtcblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnggPiAwICkge1xuXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XG5cblx0XHR9XG5cblx0XHRpZiAoIHBsYW5lLm5vcm1hbC55ID4gMCApIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcblxuXHRcdH1cblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnogPiAwICkge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuICggbWluIDw9IHBsYW5lLmNvbnN0YW50ICYmIG1heCA+PSBwbGFuZS5jb25zdGFudCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1RyaWFuZ2xlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRyaWFuZ2xlIGNlbnRlcmVkIHZlcnRpY2VzXG5cdFx0dmFyIHYwID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyB0cmlhbmdsZSBlZGdlIHZlY3RvcnNcblx0XHR2YXIgZjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBmMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0ZXN0QXhpcyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZXh0ZW50cyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdHJpYW5nbGVOb3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gc2F0Rm9yQXhlcyggYXhlcyApIHtcblxuXHRcdFx0dmFyIGksIGo7XG5cblx0XHRcdGZvciAoIGkgPSAwLCBqID0gYXhlcy5sZW5ndGggLSAzOyBpIDw9IGo7IGkgKz0gMyApIHtcblxuXHRcdFx0XHR0ZXN0QXhpcy5mcm9tQXJyYXkoIGF4ZXMsIGkgKTtcblx0XHRcdFx0Ly8gcHJvamVjdCB0aGUgYWFiYiBvbnRvIHRoZSBzZXBlcmF0aW5nIGF4aXNcblx0XHRcdFx0dmFyIHIgPSBleHRlbnRzLnggKiBNYXRoLmFicyggdGVzdEF4aXMueCApICsgZXh0ZW50cy55ICogTWF0aC5hYnMoIHRlc3RBeGlzLnkgKSArIGV4dGVudHMueiAqIE1hdGguYWJzKCB0ZXN0QXhpcy56ICk7XG5cdFx0XHRcdC8vIHByb2plY3QgYWxsIDMgdmVydGljZXMgb2YgdGhlIHRyaWFuZ2xlIG9udG8gdGhlIHNlcGVyYXRpbmcgYXhpc1xuXHRcdFx0XHR2YXIgcDAgPSB2MC5kb3QoIHRlc3RBeGlzICk7XG5cdFx0XHRcdHZhciBwMSA9IHYxLmRvdCggdGVzdEF4aXMgKTtcblx0XHRcdFx0dmFyIHAyID0gdjIuZG90KCB0ZXN0QXhpcyApO1xuXHRcdFx0XHQvLyBhY3R1YWwgdGVzdCwgYmFzaWNhbGx5IHNlZSBpZiBlaXRoZXIgb2YgdGhlIG1vc3QgZXh0cmVtZSBvZiB0aGUgdHJpYW5nbGUgcG9pbnRzIGludGVyc2VjdHMgclxuXHRcdFx0XHRpZiAoIE1hdGgubWF4KCAtIE1hdGgubWF4KCBwMCwgcDEsIHAyICksIE1hdGgubWluKCBwMCwgcDEsIHAyICkgKSA+IHIgKSB7XG5cblx0XHRcdFx0XHQvLyBwb2ludHMgb2YgdGhlIHByb2plY3RlZCB0cmlhbmdsZSBhcmUgb3V0c2lkZSB0aGUgcHJvamVjdGVkIGhhbGYtbGVuZ3RoIG9mIHRoZSBhYWJiXG5cdFx0XHRcdFx0Ly8gdGhlIGF4aXMgaXMgc2VwZXJhdGluZyBhbmQgd2UgY2FuIGV4aXRcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNUcmlhbmdsZSggdHJpYW5nbGUgKSB7XG5cblx0XHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNvbXB1dGUgYm94IGNlbnRlciBhbmQgZXh0ZW50c1xuXHRcdFx0dGhpcy5nZXRDZW50ZXIoIGNlbnRlciApO1xuXHRcdFx0ZXh0ZW50cy5zdWJWZWN0b3JzKCB0aGlzLm1heCwgY2VudGVyICk7XG5cblx0XHRcdC8vIHRyYW5zbGF0ZSB0cmlhbmdsZSB0byBhYWJiIG9yaWdpblxuXHRcdFx0djAuc3ViVmVjdG9ycyggdHJpYW5nbGUuYSwgY2VudGVyICk7XG5cdFx0XHR2MS5zdWJWZWN0b3JzKCB0cmlhbmdsZS5iLCBjZW50ZXIgKTtcblx0XHRcdHYyLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmMsIGNlbnRlciApO1xuXG5cdFx0XHQvLyBjb21wdXRlIGVkZ2UgdmVjdG9ycyBmb3IgdHJpYW5nbGVcblx0XHRcdGYwLnN1YlZlY3RvcnMoIHYxLCB2MCApO1xuXHRcdFx0ZjEuc3ViVmVjdG9ycyggdjIsIHYxICk7XG5cdFx0XHRmMi5zdWJWZWN0b3JzKCB2MCwgdjIgKTtcblxuXHRcdFx0Ly8gdGVzdCBhZ2FpbnN0IGF4ZXMgdGhhdCBhcmUgZ2l2ZW4gYnkgY3Jvc3MgcHJvZHVjdCBjb21iaW5hdGlvbnMgb2YgdGhlIGVkZ2VzIG9mIHRoZSB0cmlhbmdsZSBhbmQgdGhlIGVkZ2VzIG9mIHRoZSBhYWJiXG5cdFx0XHQvLyBtYWtlIGFuIGF4aXMgdGVzdGluZyBvZiBlYWNoIG9mIHRoZSAzIHNpZGVzIG9mIHRoZSBhYWJiIGFnYWluc3QgZWFjaCBvZiB0aGUgMyBzaWRlcyBvZiB0aGUgdHJpYW5nbGUgPSA5IGF4aXMgb2Ygc2VwYXJhdGlvblxuXHRcdFx0Ly8gYXhpc19paiA9IHVfaSB4IGZfaiAodTAsIHUxLCB1MiA9IGZhY2Ugbm9ybWFscyBvZiBhYWJiID0geCx5LHogYXhlcyB2ZWN0b3JzIHNpbmNlIGFhYmIgaXMgYXhpcyBhbGlnbmVkKVxuXHRcdFx0dmFyIGF4ZXMgPSBbXG5cdFx0XHRcdDAsIC0gZjAueiwgZjAueSwgMCwgLSBmMS56LCBmMS55LCAwLCAtIGYyLnosIGYyLnksXG5cdFx0XHRcdGYwLnosIDAsIC0gZjAueCwgZjEueiwgMCwgLSBmMS54LCBmMi56LCAwLCAtIGYyLngsXG5cdFx0XHRcdC0gZjAueSwgZjAueCwgMCwgLSBmMS55LCBmMS54LCAwLCAtIGYyLnksIGYyLngsIDBcblx0XHRcdF07XG5cdFx0XHRpZiAoICEgc2F0Rm9yQXhlcyggYXhlcyApICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyB0ZXN0IDMgZmFjZSBub3JtYWxzIGZyb20gdGhlIGFhYmJcblx0XHRcdGF4ZXMgPSBbIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEgXTtcblx0XHRcdGlmICggISBzYXRGb3JBeGVzKCBheGVzICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGZpbmFsbHkgdGVzdGluZyB0aGUgZmFjZSBub3JtYWwgb2YgdGhlIHRyaWFuZ2xlXG5cdFx0XHQvLyB1c2UgYWxyZWFkeSBleGlzdGluZyB0cmlhbmdsZSBlZGdlIHZlY3RvcnMgaGVyZVxuXHRcdFx0dHJpYW5nbGVOb3JtYWwuY3Jvc3NWZWN0b3JzKCBmMCwgZjEgKTtcblx0XHRcdGF4ZXMgPSBbIHRyaWFuZ2xlTm9ybWFsLngsIHRyaWFuZ2xlTm9ybWFsLnksIHRyaWFuZ2xlTm9ybWFsLnogXTtcblx0XHRcdHJldHVybiBzYXRGb3JBeGVzKCBheGVzICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRcdHZhciBjbGFtcGVkUG9pbnQgPSB2MS5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblx0XHRcdHJldHVybiBjbGFtcGVkUG9pbnQuc3ViKCBwb2ludCApLmxlbmd0aCgpO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0Qm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0Qm91bmRpbmdTcGhlcmUoIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZ2V0Qm91bmRpbmdTcGhlcmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5nZXRDZW50ZXIoIHRhcmdldC5jZW50ZXIgKTtcblxuXHRcdFx0dGFyZ2V0LnJhZGl1cyA9IHRoaXMuZ2V0U2l6ZSggdjEgKS5sZW5ndGgoKSAqIDAuNTtcblxuXHRcdFx0cmV0dXJuIHRhcmdldDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcblxuXHRcdC8vIGVuc3VyZSB0aGF0IGlmIHRoZXJlIGlzIG5vIG92ZXJsYXAsIHRoZSByZXN1bHQgaXMgZnVsbHkgZW1wdHksIG5vdCBzbGlnaHRseSBlbXB0eSB3aXRoIG5vbi1pbmYvK2luZiB2YWx1ZXMgdGhhdCB3aWxsIGNhdXNlIHN1YnNlcXVlbmNlIGludGVyc2VjdHMgdG8gZXJyb25lb3VzbHkgcmV0dXJuIHZhbGlkIHZhbHVlcy5cblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgdGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dW5pb246IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHQvLyB0cmFuc2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC5cblx0XHRpZiAoIHRoaXMuaXNFbXB0eSggKSApIHJldHVybiB0aGlzO1xuXG5cdFx0dmFyIG0gPSBtYXRyaXguZWxlbWVudHM7XG5cblx0XHR2YXIgeGF4ID0gbVsgMCBdICogdGhpcy5taW4ueCwgeGF5ID0gbVsgMSBdICogdGhpcy5taW4ueCwgeGF6ID0gbVsgMiBdICogdGhpcy5taW4ueDtcblx0XHR2YXIgeGJ4ID0gbVsgMCBdICogdGhpcy5tYXgueCwgeGJ5ID0gbVsgMSBdICogdGhpcy5tYXgueCwgeGJ6ID0gbVsgMiBdICogdGhpcy5tYXgueDtcblx0XHR2YXIgeWF4ID0gbVsgNCBdICogdGhpcy5taW4ueSwgeWF5ID0gbVsgNSBdICogdGhpcy5taW4ueSwgeWF6ID0gbVsgNiBdICogdGhpcy5taW4ueTtcblx0XHR2YXIgeWJ4ID0gbVsgNCBdICogdGhpcy5tYXgueSwgeWJ5ID0gbVsgNSBdICogdGhpcy5tYXgueSwgeWJ6ID0gbVsgNiBdICogdGhpcy5tYXgueTtcblx0XHR2YXIgemF4ID0gbVsgOCBdICogdGhpcy5taW4ueiwgemF5ID0gbVsgOSBdICogdGhpcy5taW4ueiwgemF6ID0gbVsgMTAgXSAqIHRoaXMubWluLno7XG5cdFx0dmFyIHpieCA9IG1bIDggXSAqIHRoaXMubWF4LnosIHpieSA9IG1bIDkgXSAqIHRoaXMubWF4LnosIHpieiA9IG1bIDEwIF0gKiB0aGlzLm1heC56O1xuXG5cdFx0dGhpcy5taW4ueCA9IE1hdGgubWluKCB4YXgsIHhieCApICsgTWF0aC5taW4oIHlheCwgeWJ4ICkgKyBNYXRoLm1pbiggemF4LCB6YnggKSArIG1bIDEyIF07XG5cdFx0dGhpcy5taW4ueSA9IE1hdGgubWluKCB4YXksIHhieSApICsgTWF0aC5taW4oIHlheSwgeWJ5ICkgKyBNYXRoLm1pbiggemF5LCB6YnkgKSArIG1bIDEzIF07XG5cdFx0dGhpcy5taW4ueiA9IE1hdGgubWluKCB4YXosIHhieiApICsgTWF0aC5taW4oIHlheiwgeWJ6ICkgKyBNYXRoLm1pbiggemF6LCB6YnogKSArIG1bIDE0IF07XG5cdFx0dGhpcy5tYXgueCA9IE1hdGgubWF4KCB4YXgsIHhieCApICsgTWF0aC5tYXgoIHlheCwgeWJ4ICkgKyBNYXRoLm1heCggemF4LCB6YnggKSArIG1bIDEyIF07XG5cdFx0dGhpcy5tYXgueSA9IE1hdGgubWF4KCB4YXksIHhieSApICsgTWF0aC5tYXgoIHlheSwgeWJ5ICkgKyBNYXRoLm1heCggemF5LCB6YnkgKSArIG1bIDEzIF07XG5cdFx0dGhpcy5tYXgueiA9IE1hdGgubWF4KCB4YXosIHhieiApICsgTWF0aC5tYXgoIHlheiwgeWJ6ICkgKyBNYXRoLm1heCggemF6LCB6YnogKSArIG1bIDE0IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgQm94MyB9O1xuIiwiaW1wb3J0IHsgQm94MyB9IGZyb20gJy4vQm94My5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwaGVyZSggY2VudGVyLCByYWRpdXMgKSB7XG5cblx0dGhpcy5jZW50ZXIgPSAoIGNlbnRlciAhPT0gdW5kZWZpbmVkICkgPyBjZW50ZXIgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU3BoZXJlLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBjZW50ZXIsIHJhZGl1cyApIHtcblxuXHRcdHRoaXMuY2VudGVyLmNvcHkoIGNlbnRlciApO1xuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm94ID0gbmV3IEJveDMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tUG9pbnRzKCBwb2ludHMsIG9wdGlvbmFsQ2VudGVyICkge1xuXG5cdFx0XHR2YXIgY2VudGVyID0gdGhpcy5jZW50ZXI7XG5cblx0XHRcdGlmICggb3B0aW9uYWxDZW50ZXIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjZW50ZXIuY29weSggb3B0aW9uYWxDZW50ZXIgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRib3guc2V0RnJvbVBvaW50cyggcG9pbnRzICkuZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbWF4UmFkaXVzU3EgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50c1sgaSBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5jb3B5KCBzcGhlcmUuY2VudGVyICk7XG5cdFx0dGhpcy5yYWRpdXMgPSBzcGhlcmUucmFkaXVzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuICggdGhpcy5yYWRpdXMgPD0gMCApO1xuXG5cdH0sXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiAoIHBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvKCB0aGlzLmNlbnRlciApIC0gdGhpcy5yYWRpdXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dmFyIHJhZGl1c1N1bSA9IHRoaXMucmFkaXVzICsgc3BoZXJlLnJhZGl1cztcblxuXHRcdHJldHVybiBzcGhlcmUuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggcmFkaXVzU3VtICogcmFkaXVzU3VtICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1NwaGVyZSggdGhpcyApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMuY2VudGVyICkgKSA8PSB0aGlzLnJhZGl1cztcblxuXHR9LFxuXG5cdGNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdHZhciBkZWx0YUxlbmd0aFNxID0gdGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGhlcmU6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuY29weSggcG9pbnQgKTtcblxuXHRcdGlmICggZGVsdGFMZW5ndGhTcSA+ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICkge1xuXG5cdFx0XHR0YXJnZXQuc3ViKCB0aGlzLmNlbnRlciApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0dGFyZ2V0Lm11bHRpcGx5U2NhbGFyKCB0aGlzLnJhZGl1cyApLmFkZCggdGhpcy5jZW50ZXIgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fSxcblxuXHRnZXRCb3VuZGluZ0JveDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGhlcmU6IC5nZXRCb3VuZGluZ0JveCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgQm94MygpO1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LnNldCggdGhpcy5jZW50ZXIsIHRoaXMuY2VudGVyICk7XG5cdFx0dGFyZ2V0LmV4cGFuZEJ5U2NhbGFyKCB0aGlzLnJhZGl1cyApO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXHRcdHRoaXMucmFkaXVzID0gdGhpcy5yYWRpdXMgKiBtYXRyaXguZ2V0TWF4U2NhbGVPbkF4aXMoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHtcblxuXHRcdHRoaXMuY2VudGVyLmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gc3BoZXJlLmNlbnRlci5lcXVhbHMoIHRoaXMuY2VudGVyICkgJiYgKCBzcGhlcmUucmFkaXVzID09PSB0aGlzLnJhZGl1cyApO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IFNwaGVyZSB9O1xuIiwiaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4vTWF0cml4My5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUGxhbmUoIG5vcm1hbCwgY29uc3RhbnQgKSB7XG5cblx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdHRoaXMubm9ybWFsID0gKCBub3JtYWwgIT09IHVuZGVmaW5lZCApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblx0dGhpcy5jb25zdGFudCA9ICggY29uc3RhbnQgIT09IHVuZGVmaW5lZCApID8gY29uc3RhbnQgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFBsYW5lLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBub3JtYWwsIGNvbnN0YW50ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IGNvbnN0YW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnRzOiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5zZXQoIHgsIHksIHogKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggbm9ybWFsLCBwb2ludCApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHBvaW50LmRvdCggdGhpcy5ub3JtYWwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNvcGxhbmFyUG9pbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCBhLCBiLCBjICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gdjEuc3ViVmVjdG9ycyggYywgYiApLmNyb3NzKCB2Mi5zdWJWZWN0b3JzKCBhLCBiICkgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Ly8gUTogc2hvdWxkIGFuIGVycm9yIGJlIHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT9cblxuXHRcdFx0dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBhICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBwbGFuZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gcGxhbmUuY29uc3RhbnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gTm90ZTogd2lsbCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIHBsYW5lIGlzIGludmFsaWQuXG5cblx0XHR2YXIgaW52ZXJzZU5vcm1hbExlbmd0aCA9IDEuMCAvIHRoaXMubm9ybWFsLmxlbmd0aCgpO1xuXHRcdHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKCBpbnZlcnNlTm9ybWFsTGVuZ3RoICk7XG5cdFx0dGhpcy5jb25zdGFudCAqPSBpbnZlcnNlTm9ybWFsTGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29uc3RhbnQgKj0gLSAxO1xuXHRcdHRoaXMubm9ybWFsLm5lZ2F0ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWwuZG90KCBwb2ludCApICsgdGhpcy5jb25zdGFudDtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgLSBzcGhlcmUucmFkaXVzO1xuXG5cdH0sXG5cblx0cHJvamVjdFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QbGFuZTogLnByb2plY3RQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAtIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBwb2ludCApICkuYWRkKCBwb2ludCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0TGluZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKCBsaW5lLCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pbnRlcnNlY3RMaW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZGlyZWN0aW9uID0gbGluZS5kZWx0YSggdjEgKTtcblxuXHRcdFx0dmFyIGRlbm9taW5hdG9yID0gdGhpcy5ub3JtYWwuZG90KCBkaXJlY3Rpb24gKTtcblxuXHRcdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRcdGlmICggdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHJldHVybiB0YXJnZXQuY29weSggbGluZS5zdGFydCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVbnN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gaGFuZGxlIHRoaXMgY2FzZS5cblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0XHRpZiAoIHQgPCAwIHx8IHQgPiAxICkge1xuXG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBkaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggbGluZS5zdGFydCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c0xpbmU6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdC8vIE5vdGU6IHRoaXMgdGVzdHMgaWYgYSBsaW5lIGludGVyc2VjdHMgdGhlIHBsYW5lLCBub3Qgd2hldGhlciBpdCAob3IgaXRzIGVuZC1wb2ludHMpIGFyZSBjb3BsYW5hciB3aXRoIGl0LlxuXG5cdFx0dmFyIHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICk7XG5cdFx0dmFyIGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5lbmQgKTtcblxuXHRcdHJldHVybiAoIHN0YXJ0U2lnbiA8IDAgJiYgZW5kU2lnbiA+IDAgKSB8fCAoIGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDAgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXgzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXgsIG9wdGlvbmFsTm9ybWFsTWF0cml4ICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsTWF0cml4ID0gb3B0aW9uYWxOb3JtYWxNYXRyaXggfHwgbTEuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0dmFyIHJlZmVyZW5jZVBvaW50ID0gdGhpcy5jb3BsYW5hclBvaW50KCB2MSApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdHZhciBub3JtYWwgPSB0aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR0aGlzLmNvbnN0YW50ID0gLSByZWZlcmVuY2VQb2ludC5kb3QoIG5vcm1hbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNvbnN0YW50IC09IG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBwbGFuZS5ub3JtYWwuZXF1YWxzKCB0aGlzLm5vcm1hbCApICYmICggcGxhbmUuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQgKTtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBQbGFuZSB9O1xuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMy5qcyc7XG5pbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuL1NwaGVyZS5qcyc7XG5pbXBvcnQgeyBQbGFuZSB9IGZyb20gJy4vUGxhbmUuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIEZydXN0dW0oIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XG5cblx0dGhpcy5wbGFuZXMgPSBbXG5cblx0XHQoIHAwICE9PSB1bmRlZmluZWQgKSA/IHAwIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwMSAhPT0gdW5kZWZpbmVkICkgPyBwMSA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDIgIT09IHVuZGVmaW5lZCApID8gcDIgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHAzICE9PSB1bmRlZmluZWQgKSA/IHAzIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwNCAhPT0gdW5kZWZpbmVkICkgPyBwNCA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDUgIT09IHVuZGVmaW5lZCApID8gcDUgOiBuZXcgUGxhbmUoKVxuXG5cdF07XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRnJ1c3R1bS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdHBsYW5lc1sgMCBdLmNvcHkoIHAwICk7XG5cdFx0cGxhbmVzWyAxIF0uY29weSggcDEgKTtcblx0XHRwbGFuZXNbIDIgXS5jb3B5KCBwMiApO1xuXHRcdHBsYW5lc1sgMyBdLmNvcHkoIHAzICk7XG5cdFx0cGxhbmVzWyA0IF0uY29weSggcDQgKTtcblx0XHRwbGFuZXNbIDUgXS5jb3B5KCBwNSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBmcnVzdHVtICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0cGxhbmVzWyBpIF0uY29weSggZnJ1c3R1bS5wbGFuZXNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblx0XHR2YXIgbWUwID0gbWVbIDAgXSwgbWUxID0gbWVbIDEgXSwgbWUyID0gbWVbIDIgXSwgbWUzID0gbWVbIDMgXTtcblx0XHR2YXIgbWU0ID0gbWVbIDQgXSwgbWU1ID0gbWVbIDUgXSwgbWU2ID0gbWVbIDYgXSwgbWU3ID0gbWVbIDcgXTtcblx0XHR2YXIgbWU4ID0gbWVbIDggXSwgbWU5ID0gbWVbIDkgXSwgbWUxMCA9IG1lWyAxMCBdLCBtZTExID0gbWVbIDExIF07XG5cdFx0dmFyIG1lMTIgPSBtZVsgMTIgXSwgbWUxMyA9IG1lWyAxMyBdLCBtZTE0ID0gbWVbIDE0IF0sIG1lMTUgPSBtZVsgMTUgXTtcblxuXHRcdHBsYW5lc1sgMCBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMCwgbWU3IC0gbWU0LCBtZTExIC0gbWU4LCBtZTE1IC0gbWUxMiApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgMSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMCwgbWU3ICsgbWU0LCBtZTExICsgbWU4LCBtZTE1ICsgbWUxMiApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgMiBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMSwgbWU3ICsgbWU1LCBtZTExICsgbWU5LCBtZTE1ICsgbWUxMyApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgMyBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMSwgbWU3IC0gbWU1LCBtZTExIC0gbWU5LCBtZTE1IC0gbWUxMyApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgNCBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMiwgbWU3IC0gbWU2LCBtZTExIC0gbWUxMCwgbWUxNSAtIG1lMTQgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDUgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTIsIG1lNyArIG1lNiwgbWUxMSArIG1lMTAsIG1lMTUgKyBtZTE0ICkubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGludGVyc2VjdHNPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKVxuXHRcdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlIClcblx0XHRcdFx0LmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c1Nwcml0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzU3ByaXRlKCBzcHJpdGUgKSB7XG5cblx0XHRcdHNwaGVyZS5jZW50ZXIuc2V0KCAwLCAwLCAwICk7XG5cdFx0XHRzcGhlcmUucmFkaXVzID0gMC43MDcxMDY3ODExODY1NDc2O1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cdFx0dmFyIGNlbnRlciA9IHNwaGVyZS5jZW50ZXI7XG5cdFx0dmFyIG5lZ1JhZGl1cyA9IC0gc3BoZXJlLnJhZGl1cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggY2VudGVyICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCBuZWdSYWRpdXMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzQm94KCBib3ggKSB7XG5cblx0XHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgcGxhbmUgPSBwbGFuZXNbIGkgXTtcblxuXHRcdFx0XHQvLyBjb3JuZXIgYXQgbWF4IGRpc3RhbmNlXG5cblx0XHRcdFx0cC54ID0gcGxhbmUubm9ybWFsLnggPiAwID8gYm94Lm1heC54IDogYm94Lm1pbi54O1xuXHRcdFx0XHRwLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWF4LnkgOiBib3gubWluLnk7XG5cdFx0XHRcdHAueiA9IHBsYW5lLm5vcm1hbC56ID4gMCA/IGJveC5tYXgueiA6IGJveC5taW4uejtcblxuXHRcdFx0XHRpZiAoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggcCApIDwgMCApIHtcblxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgRnJ1c3R1bSB9O1xuIiwiaW1wb3J0IGFscGhhbWFwX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvYWxwaGFtYXBfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgYWxwaGFtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2FscGhhbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgYWxwaGF0ZXN0X2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvYWxwaGF0ZXN0X2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGFvbWFwX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvYW9tYXBfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgYW9tYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2FvbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgYmVnaW5fdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvYmVnaW5fdmVydGV4Lmdsc2wnO1xuaW1wb3J0IGJlZ2lubm9ybWFsX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2JlZ2lubm9ybWFsX3ZlcnRleC5nbHNsJztcbmltcG9ydCBic2RmcyBmcm9tICcuL1NoYWRlckNodW5rL2JzZGZzLmdsc2wnO1xuaW1wb3J0IGJ1bXBtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2J1bXBtYXBfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9jbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9jbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9jbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgY29sb3JfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9jb2xvcl9mcmFnbWVudC5nbHNsJztcbmltcG9ydCBjb2xvcl9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvY29sb3JfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBjb2xvcl9wYXJzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2NvbG9yX3BhcnNfdmVydGV4Lmdsc2wnO1xuaW1wb3J0IGNvbG9yX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2NvbG9yX3ZlcnRleC5nbHNsJztcbmltcG9ydCBjb21tb24gZnJvbSAnLi9TaGFkZXJDaHVuay9jb21tb24uZ2xzbCc7XG5pbXBvcnQgY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGRlZmF1bHRub3JtYWxfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvZGVmYXVsdG5vcm1hbF92ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4Lmdsc2wnO1xuaW1wb3J0IGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9kaXNwbGFjZW1lbnRtYXBfdmVydGV4Lmdsc2wnO1xuaW1wb3J0IGVtaXNzaXZlbWFwX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZW1pc3NpdmVtYXBfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZW5jb2RpbmdzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZW5jb2RpbmdzX2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGVuY29kaW5nc19wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZW52bWFwX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZW52bWFwX2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGVudm1hcF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZW52bWFwX3BhcnNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZW52bWFwX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvZW52bWFwX3BhcnNfdmVydGV4Lmdsc2wnO1xuaW1wb3J0IGVudm1hcF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9lbnZtYXBfdmVydGV4Lmdsc2wnO1xuaW1wb3J0IGZvZ192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9mb2dfdmVydGV4Lmdsc2wnO1xuaW1wb3J0IGZvZ19wYXJzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2ZvZ19wYXJzX3ZlcnRleC5nbHNsJztcbmltcG9ydCBmb2dfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9mb2dfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZm9nX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9mb2dfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBsaWdodG1hcF9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0bWFwX2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9saWdodG1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c19sYW1iZXJ0X3ZlcnRleC5nbHNsJztcbmltcG9ydCBsaWdodHNfcGFyc19iZWdpbiBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c19wYXJzX2JlZ2luLmdsc2wnO1xuaW1wb3J0IGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgbGlnaHRzX3Bob25nX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX3Bob25nX2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgbGlnaHRzX2ZyYWdtZW50X2JlZ2luIGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX2ZyYWdtZW50X2JlZ2luLmdsc2wnO1xuaW1wb3J0IGxpZ2h0c19mcmFnbWVudF9tYXBzIGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX2ZyYWdtZW50X21hcHMuZ2xzbCc7XG5pbXBvcnQgbGlnaHRzX2ZyYWdtZW50X2VuZCBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c19mcmFnbWVudF9lbmQuZ2xzbCc7XG5pbXBvcnQgbG9nZGVwdGhidWZfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9sb2dkZXB0aGJ1Zl9mcmFnbWVudC5nbHNsJztcbmltcG9ydCBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4Lmdsc2wnO1xuaW1wb3J0IGxvZ2RlcHRoYnVmX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2xvZ2RlcHRoYnVmX3ZlcnRleC5nbHNsJztcbmltcG9ydCBtYXBfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9tYXBfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgbWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9tYXBfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBtYXBfcGFydGljbGVfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9tYXBfcGFydGljbGVfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9tYXBfcGFydGljbGVfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBtZXRhbG5lc3NtYXBfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9tZXRhbG5lc3NtYXBfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9tZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBtb3JwaG5vcm1hbF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9tb3JwaG5vcm1hbF92ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9tb3JwaHRhcmdldF9wYXJzX3ZlcnRleC5nbHNsJztcbmltcG9ydCBtb3JwaHRhcmdldF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9tb3JwaHRhcmdldF92ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgbm9ybWFsX2ZyYWdtZW50X2JlZ2luIGZyb20gJy4vU2hhZGVyQ2h1bmsvbm9ybWFsX2ZyYWdtZW50X2JlZ2luLmdsc2wnO1xuaW1wb3J0IG5vcm1hbF9mcmFnbWVudF9tYXBzIGZyb20gJy4vU2hhZGVyQ2h1bmsvbm9ybWFsX2ZyYWdtZW50X21hcHMuZ2xzbCc7XG5pbXBvcnQgbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9ub3JtYWxtYXBfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBwYWNraW5nIGZyb20gJy4vU2hhZGVyQ2h1bmsvcGFja2luZy5nbHNsJztcbmltcG9ydCBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudC5nbHNsJztcbmltcG9ydCBwcm9qZWN0X3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL3Byb2plY3RfdmVydGV4Lmdsc2wnO1xuaW1wb3J0IGRpdGhlcmluZ19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2RpdGhlcmluZ19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2RpdGhlcmluZ19wYXJzX2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHJvdWdobmVzc21hcF9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3JvdWdobmVzc21hcF9mcmFnbWVudC5nbHNsJztcbmltcG9ydCByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3JvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgc2hhZG93bWFwX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvc2hhZG93bWFwX3BhcnNfdmVydGV4Lmdsc2wnO1xuaW1wb3J0IHNoYWRvd21hcF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9zaGFkb3dtYXBfdmVydGV4Lmdsc2wnO1xuaW1wb3J0IHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3NoYWRvd21hc2tfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCBza2luYmFzZV92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9za2luYmFzZV92ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgc2tpbm5pbmdfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9za2lubmluZ19wYXJzX3ZlcnRleC5nbHNsJztcbmltcG9ydCBza2lubmluZ192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9za2lubmluZ192ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgc2tpbm5vcm1hbF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9za2lubm9ybWFsX3ZlcnRleC5nbHNsJztcbmltcG9ydCBzcGVjdWxhcm1hcF9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3NwZWN1bGFybWFwX2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9zcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHRvbmVtYXBwaW5nX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvdG9uZW1hcHBpbmdfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3RvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgdXZfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3V2X3BhcnNfZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgdXZfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay91dl9wYXJzX3ZlcnRleC5nbHNsJztcbmltcG9ydCB1dl92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay91dl92ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgdXYyX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay91djJfcGFyc19mcmFnbWVudC5nbHNsJztcbmltcG9ydCB1djJfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay91djJfcGFyc192ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgdXYyX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL3V2Ml92ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgd29ybGRwb3NfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvd29ybGRwb3NfdmVydGV4Lmdsc2wnO1xuXG5pbXBvcnQgY3ViZV9mcmFnIGZyb20gJy4vU2hhZGVyTGliL2N1YmVfZnJhZy5nbHNsJztcbmltcG9ydCBjdWJlX3ZlcnQgZnJvbSAnLi9TaGFkZXJMaWIvY3ViZV92ZXJ0Lmdsc2wnO1xuaW1wb3J0IGRlcHRoX2ZyYWcgZnJvbSAnLi9TaGFkZXJMaWIvZGVwdGhfZnJhZy5nbHNsJztcbmltcG9ydCBkZXB0aF92ZXJ0IGZyb20gJy4vU2hhZGVyTGliL2RlcHRoX3ZlcnQuZ2xzbCc7XG5pbXBvcnQgZGlzdGFuY2VSR0JBX2ZyYWcgZnJvbSAnLi9TaGFkZXJMaWIvZGlzdGFuY2VSR0JBX2ZyYWcuZ2xzbCc7XG5pbXBvcnQgZGlzdGFuY2VSR0JBX3ZlcnQgZnJvbSAnLi9TaGFkZXJMaWIvZGlzdGFuY2VSR0JBX3ZlcnQuZ2xzbCc7XG5pbXBvcnQgZXF1aXJlY3RfZnJhZyBmcm9tICcuL1NoYWRlckxpYi9lcXVpcmVjdF9mcmFnLmdsc2wnO1xuaW1wb3J0IGVxdWlyZWN0X3ZlcnQgZnJvbSAnLi9TaGFkZXJMaWIvZXF1aXJlY3RfdmVydC5nbHNsJztcbmltcG9ydCBsaW5lZGFzaGVkX2ZyYWcgZnJvbSAnLi9TaGFkZXJMaWIvbGluZWRhc2hlZF9mcmFnLmdsc2wnO1xuaW1wb3J0IGxpbmVkYXNoZWRfdmVydCBmcm9tICcuL1NoYWRlckxpYi9saW5lZGFzaGVkX3ZlcnQuZ2xzbCc7XG5pbXBvcnQgbWVzaGJhc2ljX2ZyYWcgZnJvbSAnLi9TaGFkZXJMaWIvbWVzaGJhc2ljX2ZyYWcuZ2xzbCc7XG5pbXBvcnQgbWVzaGJhc2ljX3ZlcnQgZnJvbSAnLi9TaGFkZXJMaWIvbWVzaGJhc2ljX3ZlcnQuZ2xzbCc7XG5pbXBvcnQgbWVzaGxhbWJlcnRfZnJhZyBmcm9tICcuL1NoYWRlckxpYi9tZXNobGFtYmVydF9mcmFnLmdsc2wnO1xuaW1wb3J0IG1lc2hsYW1iZXJ0X3ZlcnQgZnJvbSAnLi9TaGFkZXJMaWIvbWVzaGxhbWJlcnRfdmVydC5nbHNsJztcbmltcG9ydCBtZXNocGhvbmdfZnJhZyBmcm9tICcuL1NoYWRlckxpYi9tZXNocGhvbmdfZnJhZy5nbHNsJztcbmltcG9ydCBtZXNocGhvbmdfdmVydCBmcm9tICcuL1NoYWRlckxpYi9tZXNocGhvbmdfdmVydC5nbHNsJztcbmltcG9ydCBtZXNocGh5c2ljYWxfZnJhZyBmcm9tICcuL1NoYWRlckxpYi9tZXNocGh5c2ljYWxfZnJhZy5nbHNsJztcbmltcG9ydCBtZXNocGh5c2ljYWxfdmVydCBmcm9tICcuL1NoYWRlckxpYi9tZXNocGh5c2ljYWxfdmVydC5nbHNsJztcbmltcG9ydCBub3JtYWxfZnJhZyBmcm9tICcuL1NoYWRlckxpYi9ub3JtYWxfZnJhZy5nbHNsJztcbmltcG9ydCBub3JtYWxfdmVydCBmcm9tICcuL1NoYWRlckxpYi9ub3JtYWxfdmVydC5nbHNsJztcbmltcG9ydCBwb2ludHNfZnJhZyBmcm9tICcuL1NoYWRlckxpYi9wb2ludHNfZnJhZy5nbHNsJztcbmltcG9ydCBwb2ludHNfdmVydCBmcm9tICcuL1NoYWRlckxpYi9wb2ludHNfdmVydC5nbHNsJztcbmltcG9ydCBzaGFkb3dfZnJhZyBmcm9tICcuL1NoYWRlckxpYi9zaGFkb3dfZnJhZy5nbHNsJztcbmltcG9ydCBzaGFkb3dfdmVydCBmcm9tICcuL1NoYWRlckxpYi9zaGFkb3dfdmVydC5nbHNsJztcbmltcG9ydCBzcHJpdGVfZnJhZyBmcm9tICcuL1NoYWRlckxpYi9zcHJpdGVfZnJhZy5nbHNsJztcbmltcG9ydCBzcHJpdGVfdmVydCBmcm9tICcuL1NoYWRlckxpYi9zcHJpdGVfdmVydC5nbHNsJztcblxuaW1wb3J0IG1hdGRpdGhlciBmcm9tICcuL1NoYWRlckNodW5rL21hdGRpdGhlci5nbHNsJztcbmltcG9ydCBtYXRsaWdodGluZyBmcm9tICcuL1NoYWRlckNodW5rL21hdGxpZ2h0aW5nLmdsc2wnO1xuaW1wb3J0IG1hdG1pY3JvZmliZXIgZnJvbSAnLi9TaGFkZXJDaHVuay9tYXRtaWNyb2ZpYmVyLmdsc2wnO1xuaW1wb3J0IG1hdHNhbXBsaW5nIGZyb20gJy4vU2hhZGVyQ2h1bmsvbWF0c2FtcGxpbmcuZ2xzbCc7XG5pbXBvcnQgbWF0c2hhZG93cyBmcm9tICcuL1NoYWRlckNodW5rL21hdHNoYWRvd3MuZ2xzbCc7XG5pbXBvcnQgbWF0c2tpbiBmcm9tICcuL1NoYWRlckNodW5rL21hdHNraW4uZ2xzbCc7XG5pbXBvcnQgbWF0c3RyaXBzIGZyb20gJy4vU2hhZGVyQ2h1bmsvbWF0c3RyaXBzLmdsc2wnO1xuaW1wb3J0IGFscGhhcHJlcGFzc2ZyYWcgZnJvbSAnLi9TaGFkZXJMaWIvYWxwaGFwcmVwYXNzZnJhZy5nbHNsJztcbmltcG9ydCBhbHBoYXByZXBhc3N2ZXJ0IGZyb20gJy4vU2hhZGVyTGliL2FscGhhcHJlcGFzc3ZlcnQuZ2xzbCc7XG5pbXBvcnQgYmxvb20gZnJvbSAnLi9TaGFkZXJMaWIvYmxvb20uZ2xzbCc7XG5pbXBvcnQgYmxvb21zaHJpbmsgZnJvbSAnLi9TaGFkZXJMaWIvYmxvb21zaHJpbmsuZ2xzbCc7XG5pbXBvcnQgZm9nZnJhZyBmcm9tICcuL1NoYWRlckxpYi9mb2dmcmFnLmdsc2wnO1xuaW1wb3J0IGZvZ3ZlcnQgZnJvbSAnLi9TaGFkZXJMaWIvZm9ndmVydC5nbHNsJztcbmltcG9ydCBtYXRmcmFnIGZyb20gJy4vU2hhZGVyTGliL21hdGZyYWcuZ2xzbCc7XG5pbXBvcnQgbWF0dmVydCBmcm9tICcuL1NoYWRlckxpYi9tYXR2ZXJ0Lmdsc2wnO1xuaW1wb3J0IHBvc3RhYSBmcm9tICcuL1NoYWRlckxpYi9wb3N0YWEuZ2xzbCc7XG5pbXBvcnQgcG9zdGZyYWcgZnJvbSAnLi9TaGFkZXJMaWIvcG9zdGZyYWcuZ2xzbCc7XG5pbXBvcnQgcG9zdHZlcnQgZnJvbSAnLi9TaGFkZXJMaWIvcG9zdHZlcnQuZ2xzbCc7XG5pbXBvcnQgc2hhZG93Zmxvb3JmcmFnIGZyb20gJy4vU2hhZGVyTGliL3NoYWRvd2Zsb29yZnJhZy5nbHNsJztcbmltcG9ydCBzaGFkb3dmbG9vcnZlcnQgZnJvbSAnLi9TaGFkZXJMaWIvc2hhZG93Zmxvb3J2ZXJ0Lmdsc2wnO1xuaW1wb3J0IHNoYWRvd2ZyYWcgZnJvbSAnLi9TaGFkZXJMaWIvc2hhZG93ZnJhZy5nbHNsJztcbmltcG9ydCBzaGFkb3d2ZXJ0IGZyb20gJy4vU2hhZGVyTGliL3NoYWRvd3ZlcnQuZ2xzbCc7XG5pbXBvcnQgc2t5IGZyb20gJy4vU2hhZGVyTGliL3NreS5nbHNsJztcbmltcG9ydCBza3lTSCBmcm9tICcuL1NoYWRlckxpYi9za3lTSC5nbHNsJztcbmltcG9ydCBza3l2ZXJ0IGZyb20gJy4vU2hhZGVyTGliL3NreXZlcnQuZ2xzbCc7XG5pbXBvcnQgd2lyZWZyYWcgZnJvbSAnLi9TaGFkZXJMaWIvd2lyZWZyYWcuZ2xzbCc7XG5pbXBvcnQgd2lyZXZlcnQgZnJvbSAnLi9TaGFkZXJMaWIvd2lyZXZlcnQuZ2xzbCc7XG5cbmV4cG9ydCB2YXIgU2hhZGVyQ2h1bmsgPSB7XG5cdGFscGhhbWFwX2ZyYWdtZW50OiBhbHBoYW1hcF9mcmFnbWVudCxcblx0YWxwaGFtYXBfcGFyc19mcmFnbWVudDogYWxwaGFtYXBfcGFyc19mcmFnbWVudCxcblx0YWxwaGF0ZXN0X2ZyYWdtZW50OiBhbHBoYXRlc3RfZnJhZ21lbnQsXG5cdGFvbWFwX2ZyYWdtZW50OiBhb21hcF9mcmFnbWVudCxcblx0YW9tYXBfcGFyc19mcmFnbWVudDogYW9tYXBfcGFyc19mcmFnbWVudCxcblx0YmVnaW5fdmVydGV4OiBiZWdpbl92ZXJ0ZXgsXG5cdGJlZ2lubm9ybWFsX3ZlcnRleDogYmVnaW5ub3JtYWxfdmVydGV4LFxuXHRic2RmczogYnNkZnMsXG5cdGJ1bXBtYXBfcGFyc19mcmFnbWVudDogYnVtcG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50LFxuXHRjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleCxcblx0Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleDogY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCxcblx0Y29sb3JfZnJhZ21lbnQ6IGNvbG9yX2ZyYWdtZW50LFxuXHRjb2xvcl9wYXJzX2ZyYWdtZW50OiBjb2xvcl9wYXJzX2ZyYWdtZW50LFxuXHRjb2xvcl9wYXJzX3ZlcnRleDogY29sb3JfcGFyc192ZXJ0ZXgsXG5cdGNvbG9yX3ZlcnRleDogY29sb3JfdmVydGV4LFxuXHRjb21tb246IGNvbW1vbixcblx0Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50OiBjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQsXG5cdGRlZmF1bHRub3JtYWxfdmVydGV4OiBkZWZhdWx0bm9ybWFsX3ZlcnRleCxcblx0ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXgsXG5cdGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXgsXG5cdGVtaXNzaXZlbWFwX2ZyYWdtZW50OiBlbWlzc2l2ZW1hcF9mcmFnbWVudCxcblx0ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDogZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCxcblx0ZW5jb2RpbmdzX2ZyYWdtZW50OiBlbmNvZGluZ3NfZnJhZ21lbnQsXG5cdGVuY29kaW5nc19wYXJzX2ZyYWdtZW50OiBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCxcblx0ZW52bWFwX2ZyYWdtZW50OiBlbnZtYXBfZnJhZ21lbnQsXG5cdGVudm1hcF9wYXJzX2ZyYWdtZW50OiBlbnZtYXBfcGFyc19mcmFnbWVudCxcblx0ZW52bWFwX3BhcnNfdmVydGV4OiBlbnZtYXBfcGFyc192ZXJ0ZXgsXG5cdGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiBlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudCxcblx0ZW52bWFwX3ZlcnRleDogZW52bWFwX3ZlcnRleCxcblx0Zm9nX3ZlcnRleDogZm9nX3ZlcnRleCxcblx0Zm9nX3BhcnNfdmVydGV4OiBmb2dfcGFyc192ZXJ0ZXgsXG5cdGZvZ19mcmFnbWVudDogZm9nX2ZyYWdtZW50LFxuXHRmb2dfcGFyc19mcmFnbWVudDogZm9nX3BhcnNfZnJhZ21lbnQsXG5cdGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ6IGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0bWFwX2ZyYWdtZW50OiBsaWdodG1hcF9mcmFnbWVudCxcblx0bGlnaHRtYXBfcGFyc19mcmFnbWVudDogbGlnaHRtYXBfcGFyc19mcmFnbWVudCxcblx0bGlnaHRzX2xhbWJlcnRfdmVydGV4OiBsaWdodHNfbGFtYmVydF92ZXJ0ZXgsXG5cdGxpZ2h0c19wYXJzX2JlZ2luOiBsaWdodHNfcGFyc19iZWdpbixcblx0bGlnaHRzX3Bob25nX2ZyYWdtZW50OiBsaWdodHNfcGhvbmdfZnJhZ21lbnQsXG5cdGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiBsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCxcblx0bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQsXG5cdGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCxcblx0bGlnaHRzX2ZyYWdtZW50X2JlZ2luOiBsaWdodHNfZnJhZ21lbnRfYmVnaW4sXG5cdGxpZ2h0c19mcmFnbWVudF9tYXBzOiBsaWdodHNfZnJhZ21lbnRfbWFwcyxcblx0bGlnaHRzX2ZyYWdtZW50X2VuZDogbGlnaHRzX2ZyYWdtZW50X2VuZCxcblx0bG9nZGVwdGhidWZfZnJhZ21lbnQ6IGxvZ2RlcHRoYnVmX2ZyYWdtZW50LFxuXHRsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50LFxuXHRsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleDogbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXgsXG5cdGxvZ2RlcHRoYnVmX3ZlcnRleDogbG9nZGVwdGhidWZfdmVydGV4LFxuXHRtYXBfZnJhZ21lbnQ6IG1hcF9mcmFnbWVudCxcblx0bWFwX3BhcnNfZnJhZ21lbnQ6IG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRtYXBfcGFydGljbGVfZnJhZ21lbnQ6IG1hcF9wYXJ0aWNsZV9mcmFnbWVudCxcblx0bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ6IG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50LFxuXHRtZXRhbG5lc3NtYXBfZnJhZ21lbnQ6IG1ldGFsbmVzc21hcF9mcmFnbWVudCxcblx0bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50LFxuXHRtb3JwaG5vcm1hbF92ZXJ0ZXg6IG1vcnBobm9ybWFsX3ZlcnRleCxcblx0bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4LFxuXHRtb3JwaHRhcmdldF92ZXJ0ZXg6IG1vcnBodGFyZ2V0X3ZlcnRleCxcblx0bm9ybWFsX2ZyYWdtZW50X2JlZ2luOiBub3JtYWxfZnJhZ21lbnRfYmVnaW4sXG5cdG5vcm1hbF9mcmFnbWVudF9tYXBzOiBub3JtYWxfZnJhZ21lbnRfbWFwcyxcblx0bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRwYWNraW5nOiBwYWNraW5nLFxuXHRwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50LFxuXHRwcm9qZWN0X3ZlcnRleDogcHJvamVjdF92ZXJ0ZXgsXG5cdGRpdGhlcmluZ19mcmFnbWVudDogZGl0aGVyaW5nX2ZyYWdtZW50LFxuXHRkaXRoZXJpbmdfcGFyc19mcmFnbWVudDogZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQsXG5cdHJvdWdobmVzc21hcF9mcmFnbWVudDogcm91Z2huZXNzbWFwX2ZyYWdtZW50LFxuXHRyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudDogcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQsXG5cdHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXBfcGFyc19mcmFnbWVudCxcblx0c2hhZG93bWFwX3BhcnNfdmVydGV4OiBzaGFkb3dtYXBfcGFyc192ZXJ0ZXgsXG5cdHNoYWRvd21hcF92ZXJ0ZXg6IHNoYWRvd21hcF92ZXJ0ZXgsXG5cdHNoYWRvd21hc2tfcGFyc19mcmFnbWVudDogc2hhZG93bWFza19wYXJzX2ZyYWdtZW50LFxuXHRza2luYmFzZV92ZXJ0ZXg6IHNraW5iYXNlX3ZlcnRleCxcblx0c2tpbm5pbmdfcGFyc192ZXJ0ZXg6IHNraW5uaW5nX3BhcnNfdmVydGV4LFxuXHRza2lubmluZ192ZXJ0ZXg6IHNraW5uaW5nX3ZlcnRleCxcblx0c2tpbm5vcm1hbF92ZXJ0ZXg6IHNraW5ub3JtYWxfdmVydGV4LFxuXHRzcGVjdWxhcm1hcF9mcmFnbWVudDogc3BlY3VsYXJtYXBfZnJhZ21lbnQsXG5cdHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6IHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQsXG5cdHRvbmVtYXBwaW5nX2ZyYWdtZW50OiB0b25lbWFwcGluZ19mcmFnbWVudCxcblx0dG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDogdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCxcblx0dXZfcGFyc19mcmFnbWVudDogdXZfcGFyc19mcmFnbWVudCxcblx0dXZfcGFyc192ZXJ0ZXg6IHV2X3BhcnNfdmVydGV4LFxuXHR1dl92ZXJ0ZXg6IHV2X3ZlcnRleCxcblx0dXYyX3BhcnNfZnJhZ21lbnQ6IHV2Ml9wYXJzX2ZyYWdtZW50LFxuXHR1djJfcGFyc192ZXJ0ZXg6IHV2Ml9wYXJzX3ZlcnRleCxcblx0dXYyX3ZlcnRleDogdXYyX3ZlcnRleCxcblx0d29ybGRwb3NfdmVydGV4OiB3b3JsZHBvc192ZXJ0ZXgsXG5cblx0Y3ViZV9mcmFnOiBjdWJlX2ZyYWcsXG5cdGN1YmVfdmVydDogY3ViZV92ZXJ0LFxuXHRkZXB0aF9mcmFnOiBkZXB0aF9mcmFnLFxuXHRkZXB0aF92ZXJ0OiBkZXB0aF92ZXJ0LFxuXHRkaXN0YW5jZVJHQkFfZnJhZzogZGlzdGFuY2VSR0JBX2ZyYWcsXG5cdGRpc3RhbmNlUkdCQV92ZXJ0OiBkaXN0YW5jZVJHQkFfdmVydCxcblx0ZXF1aXJlY3RfZnJhZzogZXF1aXJlY3RfZnJhZyxcblx0ZXF1aXJlY3RfdmVydDogZXF1aXJlY3RfdmVydCxcblx0bGluZWRhc2hlZF9mcmFnOiBsaW5lZGFzaGVkX2ZyYWcsXG5cdGxpbmVkYXNoZWRfdmVydDogbGluZWRhc2hlZF92ZXJ0LFxuXHRtZXNoYmFzaWNfZnJhZzogbWVzaGJhc2ljX2ZyYWcsXG5cdG1lc2hiYXNpY192ZXJ0OiBtZXNoYmFzaWNfdmVydCxcblx0bWVzaGxhbWJlcnRfZnJhZzogbWVzaGxhbWJlcnRfZnJhZyxcblx0bWVzaGxhbWJlcnRfdmVydDogbWVzaGxhbWJlcnRfdmVydCxcblx0bWVzaHBob25nX2ZyYWc6IG1lc2hwaG9uZ19mcmFnLFxuXHRtZXNocGhvbmdfdmVydDogbWVzaHBob25nX3ZlcnQsXG5cdG1lc2hwaHlzaWNhbF9mcmFnOiBtZXNocGh5c2ljYWxfZnJhZyxcblx0bWVzaHBoeXNpY2FsX3ZlcnQ6IG1lc2hwaHlzaWNhbF92ZXJ0LFxuXHRub3JtYWxfZnJhZzogbm9ybWFsX2ZyYWcsXG5cdG5vcm1hbF92ZXJ0OiBub3JtYWxfdmVydCxcblx0cG9pbnRzX2ZyYWc6IHBvaW50c19mcmFnLFxuXHRwb2ludHNfdmVydDogcG9pbnRzX3ZlcnQsXG5cdHNoYWRvd19mcmFnOiBzaGFkb3dfZnJhZyxcblx0c2hhZG93X3ZlcnQ6IHNoYWRvd192ZXJ0LFxuXHRzcHJpdGVfZnJhZzogc3ByaXRlX2ZyYWcsXG5cdHNwcml0ZV92ZXJ0OiBzcHJpdGVfdmVydCxcblxuXHRtYXRkaXRoZXI6bWF0ZGl0aGVyLFxuXHRtYXRsaWdodGluZzptYXRsaWdodGluZyxcblx0bWF0bWljcm9maWJlcjptYXRtaWNyb2ZpYmVyLFxuXHRtYXRzYW1wbGluZzptYXRzYW1wbGluZyxcblx0bWF0c2hhZG93czptYXRzaGFkb3dzLFxuXHRtYXRza2luOm1hdHNraW4sXG5cdG1hdHN0cmlwczptYXRzdHJpcHMsXG5cdGFscGhhcHJlcGFzc2ZyYWc6YWxwaGFwcmVwYXNzZnJhZyxcblx0YWxwaGFwcmVwYXNzdmVydDphbHBoYXByZXBhc3N2ZXJ0LFxuXHRibG9vbTpibG9vbSxcblx0Ymxvb21zaHJpbms6Ymxvb21zaHJpbmssXG5cdGZvZ2ZyYWc6Zm9nZnJhZyxcblx0Zm9ndmVydDpmb2d2ZXJ0LFxuXHRtYXRmcmFnOm1hdGZyYWcsXG5cdG1hdHZlcnQ6bWF0dmVydCxcblx0cG9zdGFhOnBvc3RhYSxcblx0cG9zdGZyYWc6cG9zdGZyYWcsXG5cdHBvc3R2ZXJ0OnBvc3R2ZXJ0LFxuXHRzaGFkb3dmbG9vcmZyYWc6c2hhZG93Zmxvb3JmcmFnLFxuXHRzaGFkb3dmbG9vcnZlcnQ6c2hhZG93Zmxvb3J2ZXJ0LFxuXHRzaGFkb3dmcmFnOnNoYWRvd2ZyYWcsXG5cdHNoYWRvd3ZlcnQ6c2hhZG93dmVydCxcblx0c2t5OnNreSxcblx0c2t5U0g6c2t5U0gsXG5cdHNreXZlcnQ6c2t5dmVydCxcblx0d2lyZWZyYWc6d2lyZWZyYWcsXG5cdHdpcmV2ZXJ0OndpcmV2ZXJ0XG59O1xuIiwiLyoqXG4gKiBVbmlmb3JtIFV0aWxpdGllc1xuICovXG5cbnZhciBVbmlmb3Jtc1V0aWxzID0ge1xuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIHVuaWZvcm1zICkge1xuXG5cdFx0dmFyIG1lcmdlZCA9IHt9O1xuXG5cdFx0Zm9yICggdmFyIHUgPSAwOyB1IDwgdW5pZm9ybXMubGVuZ3RoOyB1ICsrICkge1xuXG5cdFx0XHR2YXIgdG1wID0gdGhpcy5jbG9uZSggdW5pZm9ybXNbIHUgXSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgcCBpbiB0bXAgKSB7XG5cblx0XHRcdFx0bWVyZ2VkWyBwIF0gPSB0bXBbIHAgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1lcmdlZDtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoIHVuaWZvcm1zX3NyYyApIHtcblxuXHRcdHZhciB1bmlmb3Jtc19kc3QgPSB7fTtcblxuXHRcdGZvciAoIHZhciB1IGluIHVuaWZvcm1zX3NyYyApIHtcblxuXHRcdFx0dW5pZm9ybXNfZHN0WyB1IF0gPSB7fTtcblxuXHRcdFx0Zm9yICggdmFyIHAgaW4gdW5pZm9ybXNfc3JjWyB1IF0gKSB7XG5cblx0XHRcdFx0dmFyIHBhcmFtZXRlcl9zcmMgPSB1bmlmb3Jtc19zcmNbIHUgXVsgcCBdO1xuXG5cdFx0XHRcdGlmICggcGFyYW1ldGVyX3NyYyAmJiAoIHBhcmFtZXRlcl9zcmMuaXNDb2xvciB8fFxuXHRcdFx0XHRcdHBhcmFtZXRlcl9zcmMuaXNNYXRyaXgzIHx8IHBhcmFtZXRlcl9zcmMuaXNNYXRyaXg0IHx8XG5cdFx0XHRcdFx0cGFyYW1ldGVyX3NyYy5pc1ZlY3RvcjIgfHwgcGFyYW1ldGVyX3NyYy5pc1ZlY3RvcjMgfHwgcGFyYW1ldGVyX3NyYy5pc1ZlY3RvcjQgfHxcblx0XHRcdFx0XHRwYXJhbWV0ZXJfc3JjLmlzVGV4dHVyZSApICkge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmMuY2xvbmUoKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBwYXJhbWV0ZXJfc3JjICkgKSB7XG5cblx0XHRcdFx0XHR1bmlmb3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYy5zbGljZSgpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR1bmlmb3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmlmb3Jtc19kc3Q7XG5cblx0fVxuXG59O1xuXG5cbmV4cG9ydCB7IFVuaWZvcm1zVXRpbHMgfTtcbiIsImltcG9ydCB7IF9NYXRoIH0gZnJvbSAnLi9NYXRoLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBDb2xvcktleXdvcmRzID0geyAnYWxpY2VibHVlJzogMHhGMEY4RkYsICdhbnRpcXVld2hpdGUnOiAweEZBRUJENywgJ2FxdWEnOiAweDAwRkZGRiwgJ2FxdWFtYXJpbmUnOiAweDdGRkZENCwgJ2F6dXJlJzogMHhGMEZGRkYsXG5cdCdiZWlnZSc6IDB4RjVGNURDLCAnYmlzcXVlJzogMHhGRkU0QzQsICdibGFjayc6IDB4MDAwMDAwLCAnYmxhbmNoZWRhbG1vbmQnOiAweEZGRUJDRCwgJ2JsdWUnOiAweDAwMDBGRiwgJ2JsdWV2aW9sZXQnOiAweDhBMkJFMixcblx0J2Jyb3duJzogMHhBNTJBMkEsICdidXJseXdvb2QnOiAweERFQjg4NywgJ2NhZGV0Ymx1ZSc6IDB4NUY5RUEwLCAnY2hhcnRyZXVzZSc6IDB4N0ZGRjAwLCAnY2hvY29sYXRlJzogMHhEMjY5MUUsICdjb3JhbCc6IDB4RkY3RjUwLFxuXHQnY29ybmZsb3dlcmJsdWUnOiAweDY0OTVFRCwgJ2Nvcm5zaWxrJzogMHhGRkY4REMsICdjcmltc29uJzogMHhEQzE0M0MsICdjeWFuJzogMHgwMEZGRkYsICdkYXJrYmx1ZSc6IDB4MDAwMDhCLCAnZGFya2N5YW4nOiAweDAwOEI4Qixcblx0J2Rhcmtnb2xkZW5yb2QnOiAweEI4ODYwQiwgJ2RhcmtncmF5JzogMHhBOUE5QTksICdkYXJrZ3JlZW4nOiAweDAwNjQwMCwgJ2RhcmtncmV5JzogMHhBOUE5QTksICdkYXJra2hha2knOiAweEJEQjc2QiwgJ2RhcmttYWdlbnRhJzogMHg4QjAwOEIsXG5cdCdkYXJrb2xpdmVncmVlbic6IDB4NTU2QjJGLCAnZGFya29yYW5nZSc6IDB4RkY4QzAwLCAnZGFya29yY2hpZCc6IDB4OTkzMkNDLCAnZGFya3JlZCc6IDB4OEIwMDAwLCAnZGFya3NhbG1vbic6IDB4RTk5NjdBLCAnZGFya3NlYWdyZWVuJzogMHg4RkJDOEYsXG5cdCdkYXJrc2xhdGVibHVlJzogMHg0ODNEOEIsICdkYXJrc2xhdGVncmF5JzogMHgyRjRGNEYsICdkYXJrc2xhdGVncmV5JzogMHgyRjRGNEYsICdkYXJrdHVycXVvaXNlJzogMHgwMENFRDEsICdkYXJrdmlvbGV0JzogMHg5NDAwRDMsXG5cdCdkZWVwcGluayc6IDB4RkYxNDkzLCAnZGVlcHNreWJsdWUnOiAweDAwQkZGRiwgJ2RpbWdyYXknOiAweDY5Njk2OSwgJ2RpbWdyZXknOiAweDY5Njk2OSwgJ2RvZGdlcmJsdWUnOiAweDFFOTBGRiwgJ2ZpcmVicmljayc6IDB4QjIyMjIyLFxuXHQnZmxvcmFsd2hpdGUnOiAweEZGRkFGMCwgJ2ZvcmVzdGdyZWVuJzogMHgyMjhCMjIsICdmdWNoc2lhJzogMHhGRjAwRkYsICdnYWluc2Jvcm8nOiAweERDRENEQywgJ2dob3N0d2hpdGUnOiAweEY4RjhGRiwgJ2dvbGQnOiAweEZGRDcwMCxcblx0J2dvbGRlbnJvZCc6IDB4REFBNTIwLCAnZ3JheSc6IDB4ODA4MDgwLCAnZ3JlZW4nOiAweDAwODAwMCwgJ2dyZWVueWVsbG93JzogMHhBREZGMkYsICdncmV5JzogMHg4MDgwODAsICdob25leWRldyc6IDB4RjBGRkYwLCAnaG90cGluayc6IDB4RkY2OUI0LFxuXHQnaW5kaWFucmVkJzogMHhDRDVDNUMsICdpbmRpZ28nOiAweDRCMDA4MiwgJ2l2b3J5JzogMHhGRkZGRjAsICdraGFraSc6IDB4RjBFNjhDLCAnbGF2ZW5kZXInOiAweEU2RTZGQSwgJ2xhdmVuZGVyYmx1c2gnOiAweEZGRjBGNSwgJ2xhd25ncmVlbic6IDB4N0NGQzAwLFxuXHQnbGVtb25jaGlmZm9uJzogMHhGRkZBQ0QsICdsaWdodGJsdWUnOiAweEFERDhFNiwgJ2xpZ2h0Y29yYWwnOiAweEYwODA4MCwgJ2xpZ2h0Y3lhbic6IDB4RTBGRkZGLCAnbGlnaHRnb2xkZW5yb2R5ZWxsb3cnOiAweEZBRkFEMiwgJ2xpZ2h0Z3JheSc6IDB4RDNEM0QzLFxuXHQnbGlnaHRncmVlbic6IDB4OTBFRTkwLCAnbGlnaHRncmV5JzogMHhEM0QzRDMsICdsaWdodHBpbmsnOiAweEZGQjZDMSwgJ2xpZ2h0c2FsbW9uJzogMHhGRkEwN0EsICdsaWdodHNlYWdyZWVuJzogMHgyMEIyQUEsICdsaWdodHNreWJsdWUnOiAweDg3Q0VGQSxcblx0J2xpZ2h0c2xhdGVncmF5JzogMHg3Nzg4OTksICdsaWdodHNsYXRlZ3JleSc6IDB4Nzc4ODk5LCAnbGlnaHRzdGVlbGJsdWUnOiAweEIwQzRERSwgJ2xpZ2h0eWVsbG93JzogMHhGRkZGRTAsICdsaW1lJzogMHgwMEZGMDAsICdsaW1lZ3JlZW4nOiAweDMyQ0QzMixcblx0J2xpbmVuJzogMHhGQUYwRTYsICdtYWdlbnRhJzogMHhGRjAwRkYsICdtYXJvb24nOiAweDgwMDAwMCwgJ21lZGl1bWFxdWFtYXJpbmUnOiAweDY2Q0RBQSwgJ21lZGl1bWJsdWUnOiAweDAwMDBDRCwgJ21lZGl1bW9yY2hpZCc6IDB4QkE1NUQzLFxuXHQnbWVkaXVtcHVycGxlJzogMHg5MzcwREIsICdtZWRpdW1zZWFncmVlbic6IDB4M0NCMzcxLCAnbWVkaXVtc2xhdGVibHVlJzogMHg3QjY4RUUsICdtZWRpdW1zcHJpbmdncmVlbic6IDB4MDBGQTlBLCAnbWVkaXVtdHVycXVvaXNlJzogMHg0OEQxQ0MsXG5cdCdtZWRpdW12aW9sZXRyZWQnOiAweEM3MTU4NSwgJ21pZG5pZ2h0Ymx1ZSc6IDB4MTkxOTcwLCAnbWludGNyZWFtJzogMHhGNUZGRkEsICdtaXN0eXJvc2UnOiAweEZGRTRFMSwgJ21vY2Nhc2luJzogMHhGRkU0QjUsICduYXZham93aGl0ZSc6IDB4RkZERUFELFxuXHQnbmF2eSc6IDB4MDAwMDgwLCAnb2xkbGFjZSc6IDB4RkRGNUU2LCAnb2xpdmUnOiAweDgwODAwMCwgJ29saXZlZHJhYic6IDB4NkI4RTIzLCAnb3JhbmdlJzogMHhGRkE1MDAsICdvcmFuZ2VyZWQnOiAweEZGNDUwMCwgJ29yY2hpZCc6IDB4REE3MEQ2LFxuXHQncGFsZWdvbGRlbnJvZCc6IDB4RUVFOEFBLCAncGFsZWdyZWVuJzogMHg5OEZCOTgsICdwYWxldHVycXVvaXNlJzogMHhBRkVFRUUsICdwYWxldmlvbGV0cmVkJzogMHhEQjcwOTMsICdwYXBheWF3aGlwJzogMHhGRkVGRDUsICdwZWFjaHB1ZmYnOiAweEZGREFCOSxcblx0J3BlcnUnOiAweENEODUzRiwgJ3BpbmsnOiAweEZGQzBDQiwgJ3BsdW0nOiAweEREQTBERCwgJ3Bvd2RlcmJsdWUnOiAweEIwRTBFNiwgJ3B1cnBsZSc6IDB4ODAwMDgwLCAncmViZWNjYXB1cnBsZSc6IDB4NjYzMzk5LCAncmVkJzogMHhGRjAwMDAsICdyb3N5YnJvd24nOiAweEJDOEY4Rixcblx0J3JveWFsYmx1ZSc6IDB4NDE2OUUxLCAnc2FkZGxlYnJvd24nOiAweDhCNDUxMywgJ3NhbG1vbic6IDB4RkE4MDcyLCAnc2FuZHlicm93bic6IDB4RjRBNDYwLCAnc2VhZ3JlZW4nOiAweDJFOEI1NywgJ3NlYXNoZWxsJzogMHhGRkY1RUUsXG5cdCdzaWVubmEnOiAweEEwNTIyRCwgJ3NpbHZlcic6IDB4QzBDMEMwLCAnc2t5Ymx1ZSc6IDB4ODdDRUVCLCAnc2xhdGVibHVlJzogMHg2QTVBQ0QsICdzbGF0ZWdyYXknOiAweDcwODA5MCwgJ3NsYXRlZ3JleSc6IDB4NzA4MDkwLCAnc25vdyc6IDB4RkZGQUZBLFxuXHQnc3ByaW5nZ3JlZW4nOiAweDAwRkY3RiwgJ3N0ZWVsYmx1ZSc6IDB4NDY4MkI0LCAndGFuJzogMHhEMkI0OEMsICd0ZWFsJzogMHgwMDgwODAsICd0aGlzdGxlJzogMHhEOEJGRDgsICd0b21hdG8nOiAweEZGNjM0NywgJ3R1cnF1b2lzZSc6IDB4NDBFMEQwLFxuXHQndmlvbGV0JzogMHhFRTgyRUUsICd3aGVhdCc6IDB4RjVERUIzLCAnd2hpdGUnOiAweEZGRkZGRiwgJ3doaXRlc21va2UnOiAweEY1RjVGNSwgJ3llbGxvdyc6IDB4RkZGRjAwLCAneWVsbG93Z3JlZW4nOiAweDlBQ0QzMiB9O1xuXG5mdW5jdGlvbiBDb2xvciggciwgZywgYiApIHtcblxuXHRpZiAoIGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHQvLyByIGlzIFRIUkVFLkNvbG9yLCBoZXggb3Igc3RyaW5nXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCByICk7XG5cblx0fVxuXG5cdHJldHVybiB0aGlzLnNldFJHQiggciwgZywgYiApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbG9yLnByb3RvdHlwZSwge1xuXG5cdGlzQ29sb3I6IHRydWUsXG5cblx0cjogMSwgZzogMSwgYjogMSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdHRoaXMuY29weSggdmFsdWUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHRoaXMuc2V0SGV4KCB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdFx0dGhpcy5zZXRTdHlsZSggdmFsdWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMuciA9IHNjYWxhcjtcblx0XHR0aGlzLmcgPSBzY2FsYXI7XG5cdFx0dGhpcy5iID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIZXg6IGZ1bmN0aW9uICggaGV4ICkge1xuXG5cdFx0aGV4ID0gTWF0aC5mbG9vciggaGV4ICk7XG5cblx0XHR0aGlzLnIgPSAoIGhleCA+PiAxNiAmIDI1NSApIC8gMjU1O1xuXHRcdHRoaXMuZyA9ICggaGV4ID4+IDggJiAyNTUgKSAvIDI1NTtcblx0XHR0aGlzLmIgPSAoIGhleCAmIDI1NSApIC8gMjU1O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSR0I6IGZ1bmN0aW9uICggciwgZywgYiApIHtcblxuXHRcdHRoaXMuciA9IHI7XG5cdFx0dGhpcy5nID0gZztcblx0XHR0aGlzLmIgPSBiO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIU0w6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIGh1ZTJyZ2IoIHAsIHEsIHQgKSB7XG5cblx0XHRcdGlmICggdCA8IDAgKSB0ICs9IDE7XG5cdFx0XHRpZiAoIHQgPiAxICkgdCAtPSAxO1xuXHRcdFx0aWYgKCB0IDwgMSAvIDYgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiB0O1xuXHRcdFx0aWYgKCB0IDwgMSAvIDIgKSByZXR1cm4gcTtcblx0XHRcdGlmICggdCA8IDIgLyAzICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogKCAyIC8gMyAtIHQgKTtcblx0XHRcdHJldHVybiBwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEhTTCggaCwgcywgbCApIHtcblxuXHRcdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblx0XHRcdGggPSBfTWF0aC5ldWNsaWRlYW5Nb2R1bG8oIGgsIDEgKTtcblx0XHRcdHMgPSBfTWF0aC5jbGFtcCggcywgMCwgMSApO1xuXHRcdFx0bCA9IF9NYXRoLmNsYW1wKCBsLCAwLCAxICk7XG5cblx0XHRcdGlmICggcyA9PT0gMCApIHtcblxuXHRcdFx0XHR0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBwID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSAoIGwgKiBzICk7XG5cdFx0XHRcdHZhciBxID0gKCAyICogbCApIC0gcDtcblxuXHRcdFx0XHR0aGlzLnIgPSBodWUycmdiKCBxLCBwLCBoICsgMSAvIDMgKTtcblx0XHRcdFx0dGhpcy5nID0gaHVlMnJnYiggcSwgcCwgaCApO1xuXHRcdFx0XHR0aGlzLmIgPSBodWUycmdiKCBxLCBwLCBoIC0gMSAvIDMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldFN0eWxlOiBmdW5jdGlvbiAoIHN0eWxlICkge1xuXG5cdFx0ZnVuY3Rpb24gaGFuZGxlQWxwaGEoIHN0cmluZyApIHtcblxuXHRcdFx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBzdHJpbmcgKSA8IDEgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0dmFyIG07XG5cblx0XHRpZiAoIG0gPSAvXigoPzpyZ2J8aHNsKWE/KVxcKFxccyooW15cXCldKilcXCkvLmV4ZWMoIHN0eWxlICkgKSB7XG5cblx0XHRcdC8vIHJnYiAvIGhzbFxuXG5cdFx0XHR2YXIgY29sb3I7XG5cdFx0XHR2YXIgbmFtZSA9IG1bIDEgXTtcblx0XHRcdHZhciBjb21wb25lbnRzID0gbVsgMiBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ3JnYic6XG5cdFx0XHRcdGNhc2UgJ3JnYmEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDI1NSwwLDApIHJnYmEoMjU1LDAsMCwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMjU1O1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDI1NTtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAyNTU7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDEwMCUsMCUsMCUpIHJnYmEoMTAwJSwwJSwwJSwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAxMDA7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnaHNsJzpcblx0XHRcdFx0Y2FzZSAnaHNsYSc6XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL14oWzAtOV0qXFwuP1swLTldKylcXHMqLFxccyooXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqKCxcXHMqKFswLTldKlxcLj9bMC05XSspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBoc2woMTIwLDUwJSw1MCUpIGhzbGEoMTIwLDUwJSw1MCUsMC41KVxuXHRcdFx0XHRcdFx0dmFyIGggPSBwYXJzZUZsb2F0KCBjb2xvclsgMSBdICkgLyAzNjA7XG5cdFx0XHRcdFx0XHR2YXIgcyA9IHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dmFyIGwgPSBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSAvIDEwMDtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0SFNMKCBoLCBzLCBsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggbSA9IC9eXFwjKFtBLUZhLWYwLTldKykkLy5leGVjKCBzdHlsZSApICkge1xuXG5cdFx0XHQvLyBoZXggY29sb3JcblxuXHRcdFx0dmFyIGhleCA9IG1bIDEgXTtcblx0XHRcdHZhciBzaXplID0gaGV4Lmxlbmd0aDtcblxuXHRcdFx0aWYgKCBzaXplID09PSAzICkge1xuXG5cdFx0XHRcdC8vICNmZjBcblx0XHRcdFx0dGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhleC5jaGFyQXQoIDAgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDEgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0fSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHtcblxuXHRcdFx0XHQvLyAjZmYwMDAwXG5cdFx0XHRcdHRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAzICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuYiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCA0ICkgKyBoZXguY2hhckF0KCA1ICksIDE2ICkgLyAyNTU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggc3R5bGUgJiYgc3R5bGUubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Ly8gY29sb3Iga2V5d29yZHNcblx0XHRcdHZhciBoZXggPSBDb2xvcktleXdvcmRzWyBzdHlsZSBdO1xuXG5cdFx0XHRpZiAoIGhleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIHJlZFxuXHRcdFx0XHR0aGlzLnNldEhleCggaGV4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdW5rbm93biBjb2xvclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAnICsgc3R5bGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnIsIHRoaXMuZywgdGhpcy5iICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yID0gY29sb3Iucjtcblx0XHR0aGlzLmcgPSBjb2xvci5nO1xuXHRcdHRoaXMuYiA9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlHYW1tYVRvTGluZWFyOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIGdhbW1hRmFjdG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlMaW5lYXJUb0dhbW1hOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dmFyIHNhZmVJbnZlcnNlID0gKCBnYW1tYUZhY3RvciA+IDAgKSA/ICggMS4wIC8gZ2FtbWFGYWN0b3IgKSA6IDEuMDtcblxuXHRcdHRoaXMuciA9IE1hdGgucG93KCBjb2xvci5yLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuZyA9IE1hdGgucG93KCBjb2xvci5nLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBzYWZlSW52ZXJzZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb252ZXJ0R2FtbWFUb0xpbmVhcjogZnVuY3Rpb24gKCBnYW1tYUZhY3RvciApIHtcblxuXHRcdHRoaXMuY29weUdhbW1hVG9MaW5lYXIoIHRoaXMsIGdhbW1hRmFjdG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnZlcnRMaW5lYXJUb0dhbW1hOiBmdW5jdGlvbiAoIGdhbW1hRmFjdG9yICkge1xuXG5cdFx0dGhpcy5jb3B5TGluZWFyVG9HYW1tYSggdGhpcywgZ2FtbWFGYWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVNSR0JUb0xpbmVhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0ZnVuY3Rpb24gU1JHQlRvTGluZWFyKCBjICkge1xuXG5cdFx0XHRyZXR1cm4gKCBjIDwgMC4wNDA0NSApID8gYyAqIDAuMDc3Mzk5MzgwOCA6IE1hdGgucG93KCBjICogMC45NDc4NjcyOTg2ICsgMC4wNTIxMzI3MDE0LCAyLjQgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb3B5U1JHQlRvTGluZWFyKCBjb2xvciApIHtcblxuXHRcdFx0dGhpcy5yID0gU1JHQlRvTGluZWFyKCBjb2xvci5yICk7XG5cdFx0XHR0aGlzLmcgPSBTUkdCVG9MaW5lYXIoIGNvbG9yLmcgKTtcblx0XHRcdHRoaXMuYiA9IFNSR0JUb0xpbmVhciggY29sb3IuYiApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvcHlMaW5lYXJUb1NSR0I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIExpbmVhclRvU1JHQiggYyApIHtcblxuXHRcdFx0cmV0dXJuICggYyA8IDAuMDAzMTMwOCApID8gYyAqIDEyLjkyIDogMS4wNTUgKiAoIE1hdGgucG93KCBjLCAwLjQxNjY2ICkgKSAtIDAuMDU1O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvcHlMaW5lYXJUb1NSR0IoIGNvbG9yICkge1xuXG5cdFx0XHR0aGlzLnIgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLnIgKTtcblx0XHRcdHRoaXMuZyA9IExpbmVhclRvU1JHQiggY29sb3IuZyApO1xuXHRcdFx0dGhpcy5iID0gTGluZWFyVG9TUkdCKCBjb2xvci5iICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udmVydFNSR0JUb0xpbmVhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jb3B5U1JHQlRvTGluZWFyKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnZlcnRMaW5lYXJUb1NSR0I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29weUxpbmVhclRvU1JHQiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRIZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMuciAqIDI1NSApIDw8IDE2IF4gKCB0aGlzLmcgKiAyNTUgKSA8PCA4IF4gKCB0aGlzLmIgKiAyNTUgKSA8PCAwO1xuXG5cdH0sXG5cblx0Z2V0SGV4U3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gKCAnMDAwMDAwJyArIHRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7XG5cblx0fSxcblxuXHRnZXRIU0w6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IHsgaDogMCwgczogMCwgbDogMCB9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR2YXIgbWF4ID0gTWF0aC5tYXgoIHIsIGcsIGIgKTtcblx0XHR2YXIgbWluID0gTWF0aC5taW4oIHIsIGcsIGIgKTtcblxuXHRcdHZhciBodWUsIHNhdHVyYXRpb247XG5cdFx0dmFyIGxpZ2h0bmVzcyA9ICggbWluICsgbWF4ICkgLyAyLjA7XG5cblx0XHRpZiAoIG1pbiA9PT0gbWF4ICkge1xuXG5cdFx0XHRodWUgPSAwO1xuXHRcdFx0c2F0dXJhdGlvbiA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgZGVsdGEgPSBtYXggLSBtaW47XG5cblx0XHRcdHNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAoIG1heCArIG1pbiApIDogZGVsdGEgLyAoIDIgLSBtYXggLSBtaW4gKTtcblxuXHRcdFx0c3dpdGNoICggbWF4ICkge1xuXG5cdFx0XHRcdGNhc2UgcjogaHVlID0gKCBnIC0gYiApIC8gZGVsdGEgKyAoIGcgPCBiID8gNiA6IDAgKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgZzogaHVlID0gKCBiIC0gciApIC8gZGVsdGEgKyAyOyBicmVhaztcblx0XHRcdFx0Y2FzZSBiOiBodWUgPSAoIHIgLSBnICkgLyBkZWx0YSArIDQ7IGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGh1ZSAvPSA2O1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmggPSBodWU7XG5cdFx0dGFyZ2V0LnMgPSBzYXR1cmF0aW9uO1xuXHRcdHRhcmdldC5sID0gbGlnaHRuZXNzO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGdldFN0eWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gJ3JnYignICsgKCAoIHRoaXMuciAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuZyAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuYiAqIDI1NSApIHwgMCApICsgJyknO1xuXG5cdH0sXG5cblx0b2Zmc2V0SFNMOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaHNsID0ge307XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gKCBoLCBzLCBsICkge1xuXG5cdFx0XHR0aGlzLmdldEhTTCggaHNsICk7XG5cblx0XHRcdGhzbC5oICs9IGg7IGhzbC5zICs9IHM7IGhzbC5sICs9IGw7XG5cblx0XHRcdHRoaXMuc2V0SFNMKCBoc2wuaCwgaHNsLnMsIGhzbC5sICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YWRkOiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yICs9IGNvbG9yLnI7XG5cdFx0dGhpcy5nICs9IGNvbG9yLmc7XG5cdFx0dGhpcy5iICs9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZENvbG9yczogZnVuY3Rpb24gKCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgY29sb3IyLnI7XG5cdFx0dGhpcy5nID0gY29sb3IxLmcgKyBjb2xvcjIuZztcblx0XHR0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciArPSBzO1xuXHRcdHRoaXMuZyArPSBzO1xuXHRcdHRoaXMuYiArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhpcy5yIC0gY29sb3IuciApO1xuXHRcdHRoaXMuZyA9IE1hdGgubWF4KCAwLCB0aGlzLmcgLSBjb2xvci5nICk7XG5cdFx0dGhpcy5iID0gTWF0aC5tYXgoIDAsIHRoaXMuYiAtIGNvbG9yLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgKj0gY29sb3Iucjtcblx0XHR0aGlzLmcgKj0gY29sb3IuZztcblx0XHR0aGlzLmIgKj0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciAqPSBzO1xuXHRcdHRoaXMuZyAqPSBzO1xuXHRcdHRoaXMuYiAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuciArPSAoIGNvbG9yLnIgLSB0aGlzLnIgKSAqIGFscGhhO1xuXHRcdHRoaXMuZyArPSAoIGNvbG9yLmcgLSB0aGlzLmcgKSAqIGFscGhhO1xuXHRcdHRoaXMuYiArPSAoIGNvbG9yLmIgLSB0aGlzLmIgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHJldHVybiAoIGMuciA9PT0gdGhpcy5yICkgJiYgKCBjLmcgPT09IHRoaXMuZyApICYmICggYy5iID09PSB0aGlzLmIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5nID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLmIgPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5yO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLmc7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuYjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0SGV4KCk7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgQ29sb3IgfTtcbiIsImltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvci5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcbmltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDMuanMnO1xuXG4vKipcbiAqIFVuaWZvcm1zIGxpYnJhcnkgZm9yIHNoYXJlZCB3ZWJnbCBzaGFkZXJzXG4gKi9cblxudmFyIFVuaWZvcm1zTGliID0ge1xuXG5cdGNvbW1vbjoge1xuXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXG5cblx0XHRtYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHR1dlRyYW5zZm9ybTogeyB2YWx1ZTogbmV3IE1hdHJpeDMoKSB9LFxuXG5cdFx0YWxwaGFNYXA6IHsgdmFsdWU6IG51bGwgfSxcblxuXHR9LFxuXG5cdHNwZWN1bGFybWFwOiB7XG5cblx0XHRzcGVjdWxhck1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXG5cdH0sXG5cblx0ZW52bWFwOiB7XG5cblx0XHRlbnZNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRmbGlwRW52TWFwOiB7IHZhbHVlOiAtIDEgfSxcblx0XHRyZWZsZWN0aXZpdHk6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdHJlZnJhY3Rpb25SYXRpbzogeyB2YWx1ZTogMC45OCB9LFxuXHRcdG1heE1pcExldmVsOiB7IHZhbHVlOiAwIH1cblxuXHR9LFxuXG5cdGFvbWFwOiB7XG5cblx0XHRhb01hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGFvTWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH1cblxuXHR9LFxuXG5cdGxpZ2h0bWFwOiB7XG5cblx0XHRsaWdodE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGxpZ2h0TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH1cblxuXHR9LFxuXG5cdGVtaXNzaXZlbWFwOiB7XG5cblx0XHRlbWlzc2l2ZU1hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRidW1wbWFwOiB7XG5cblx0XHRidW1wTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YnVtcFNjYWxlOiB7IHZhbHVlOiAxIH1cblxuXHR9LFxuXG5cdG5vcm1hbG1hcDoge1xuXG5cdFx0bm9ybWFsTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0bm9ybWFsU2NhbGU6IHsgdmFsdWU6IG5ldyBWZWN0b3IyKCAxLCAxICkgfVxuXG5cdH0sXG5cblx0ZGlzcGxhY2VtZW50bWFwOiB7XG5cblx0XHRkaXNwbGFjZW1lbnRNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRkaXNwbGFjZW1lbnRTY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdGRpc3BsYWNlbWVudEJpYXM6IHsgdmFsdWU6IDAgfVxuXG5cdH0sXG5cblx0cm91Z2huZXNzbWFwOiB7XG5cblx0XHRyb3VnaG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0bWV0YWxuZXNzbWFwOiB7XG5cblx0XHRtZXRhbG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0Z3JhZGllbnRtYXA6IHtcblxuXHRcdGdyYWRpZW50TWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGZvZzoge1xuXG5cdFx0Zm9nRGVuc2l0eTogeyB2YWx1ZTogMC4wMDAyNSB9LFxuXHRcdGZvZ05lYXI6IHsgdmFsdWU6IDEgfSxcblx0XHRmb2dGYXI6IHsgdmFsdWU6IDIwMDAgfSxcblx0XHRmb2dDb2xvcjogeyB2YWx1ZTogbmV3IENvbG9yKCAweGZmZmZmZiApIH1cblxuXHR9LFxuXG5cdGxpZ2h0czoge1xuXG5cdFx0YW1iaWVudExpZ2h0Q29sb3I6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRkaXJlY3Rpb25hbExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRjb2xvcjoge30sXG5cblx0XHRcdHNoYWRvdzoge30sXG5cdFx0XHRzaGFkb3dCaWFzOiB7fSxcblx0XHRcdHNoYWRvd1JhZGl1czoge30sXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fVxuXHRcdH0gfSxcblxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0c3BvdExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRkaXN0YW5jZToge30sXG5cdFx0XHRjb25lQ29zOiB7fSxcblx0XHRcdHBlbnVtYnJhQ29zOiB7fSxcblx0XHRcdGRlY2F5OiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XG5cdFx0fSB9LFxuXG5cdFx0c3BvdFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcblx0XHRzcG90U2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0cG9pbnRMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRjb2xvcjoge30sXG5cdFx0XHRwb3NpdGlvbjoge30sXG5cdFx0XHRkZWNheToge30sXG5cdFx0XHRkaXN0YW5jZToge30sXG5cblx0XHRcdHNoYWRvdzoge30sXG5cdFx0XHRzaGFkb3dCaWFzOiB7fSxcblx0XHRcdHNoYWRvd1JhZGl1czoge30sXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fSxcblx0XHRcdHNoYWRvd0NhbWVyYU5lYXI6IHt9LFxuXHRcdFx0c2hhZG93Q2FtZXJhRmFyOiB7fVxuXHRcdH0gfSxcblxuXHRcdHBvaW50U2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxuXHRcdHBvaW50U2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0aGVtaXNwaGVyZUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRza3lDb2xvcjoge30sXG5cdFx0XHRncm91bmRDb2xvcjoge31cblx0XHR9IH0sXG5cblx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogUmVjdEFyZWFMaWdodCBCUkRGIGRhdGEgbmVlZHMgdG8gYmUgbW92ZWQgZnJvbSBleGFtcGxlIHRvIG1haW4gc3JjXG5cdFx0cmVjdEFyZWFMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRjb2xvcjoge30sXG5cdFx0XHRwb3NpdGlvbjoge30sXG5cdFx0XHR3aWR0aDoge30sXG5cdFx0XHRoZWlnaHQ6IHt9XG5cdFx0fSB9XG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdGRpZmZ1c2U6IHsgdmFsdWU6IG5ldyBDb2xvciggMHhlZWVlZWUgKSB9LFxuXHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdHNpemU6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdHNjYWxlOiB7IHZhbHVlOiAxLjAgfSxcblx0XHRtYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHR1dlRyYW5zZm9ybTogeyB2YWx1ZTogbmV3IE1hdHJpeDMoKSB9XG5cblx0fSxcblxuXHRzcHJpdGU6IHtcblxuXHRcdGRpZmZ1c2U6IHsgdmFsdWU6IG5ldyBDb2xvciggMHhlZWVlZWUgKSB9LFxuXHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdGNlbnRlcjogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDAuNSwgMC41ICkgfSxcblx0XHRyb3RhdGlvbjogeyB2YWx1ZTogMC4wIH0sXG5cdFx0bWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0dXZUcmFuc2Zvcm06IHsgdmFsdWU6IG5ldyBNYXRyaXgzKCkgfVxuXG5cdH1cblxufTtcblxuZXhwb3J0IHsgVW5pZm9ybXNMaWIgfTtcbiIsImltcG9ydCB7IFNoYWRlckNodW5rIH0gZnJvbSAnLi9TaGFkZXJDaHVuay5qcyc7XG5pbXBvcnQgeyBVbmlmb3Jtc1V0aWxzIH0gZnJvbSAnLi9Vbmlmb3Jtc1V0aWxzLmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgVW5pZm9ybXNMaWIgfSBmcm9tICcuL1VuaWZvcm1zTGliLmpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvci5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICovXG5cbnZhciBTaGFkZXJMaWIgPSB7XG5cblx0YmFzaWM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfZnJhZ1xuXG5cdH0sXG5cblx0bGFtYmVydDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X2ZyYWdcblxuXHR9LFxuXG5cdHBob25nOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZ3JhZGllbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcblx0XHRcdFx0c3BlY3VsYXI6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgxMTExMTEgKSB9LFxuXHRcdFx0XHRzaGluaW5lc3M6IHsgdmFsdWU6IDMwIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfZnJhZ1xuXG5cdH0sXG5cblx0c3RhbmRhcmQ6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIucm91Z2huZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubWV0YWxuZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXG5cdFx0XHRcdHJvdWdobmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdG1ldGFsbmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdGVudk1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9IC8vIHRlbXBvcmFyeVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnXG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5wb2ludHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfZnJhZ1xuXG5cdH0sXG5cblx0ZGFzaGVkOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0e1xuXHRcdFx0XHRzY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRkYXNoU2l6ZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHR0b3RhbFNpemU6IHsgdmFsdWU6IDIgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWdcblxuXHR9LFxuXG5cdGRlcHRoOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnXG5cblx0fSxcblxuXHRub3JtYWw6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1hbF9mcmFnXG5cblx0fSxcblxuXHRzcHJpdGU6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcHJpdGUsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnNwcml0ZV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5zcHJpdGVfZnJhZ1xuXG5cdH0sXG5cblx0LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvL1x0Q3ViZSBtYXAgc2hhZGVyXG5cdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Y3ViZToge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdHRDdWJlOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHR0RmxpcDogeyB2YWx1ZTogLSAxIH0sXG5cdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdH0sXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuY3ViZV9mcmFnXG5cblx0fSxcblxuXHRlcXVpcmVjdDoge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdHRFcXVpcmVjdDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdH0sXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmVxdWlyZWN0X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmVxdWlyZWN0X2ZyYWdcblxuXHR9LFxuXG5cdGRpc3RhbmNlUkdCQToge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdHtcblx0XHRcdFx0cmVmZXJlbmNlUG9zaXRpb246IHsgdmFsdWU6IG5ldyBWZWN0b3IzKCkgfSxcblx0XHRcdFx0bmVhckRpc3RhbmNlOiB7IHZhbHVlOiAxIH0sXG5cdFx0XHRcdGZhckRpc3RhbmNlOiB7IHZhbHVlOiAxMDAwIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfZnJhZ1xuXG5cdH0sXG5cblx0c2hhZG93OiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0e1xuXHRcdFx0XHRjb2xvcjogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwICkgfSxcblx0XHRcdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH1cblx0XHRcdH0sXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5zaGFkb3dfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuc2hhZG93X2ZyYWdcblxuXHR9XG5cbn07XG5cblNoYWRlckxpYi5waHlzaWNhbCA9IHtcblxuXHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFNoYWRlckxpYi5zdGFuZGFyZC51bmlmb3Jtcyxcblx0XHR7XG5cdFx0XHRjbGVhckNvYXQ6IHsgdmFsdWU6IDAgfSxcblx0XHRcdGNsZWFyQ29hdFJvdWdobmVzczogeyB2YWx1ZTogMCB9XG5cdFx0fVxuXHRdICksXG5cblx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCxcblx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnXG5cbn07XG5cblxuZXhwb3J0IHsgU2hhZGVyTGliIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xBbmltYXRpb24oKSB7XG5cblx0dmFyIGNvbnRleHQgPSBudWxsO1xuXHR2YXIgaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0dmFyIGFuaW1hdGlvbkxvb3AgPSBudWxsO1xuXG5cdGZ1bmN0aW9uIG9uQW5pbWF0aW9uRnJhbWUoIHRpbWUsIGZyYW1lICkge1xuXG5cdFx0aWYgKCBpc0FuaW1hdGluZyA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRhbmltYXRpb25Mb29wKCB0aW1lLCBmcmFtZSApO1xuXG5cdFx0Y29udGV4dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIG9uQW5pbWF0aW9uRnJhbWUgKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGlmICggaXNBbmltYXRpbmcgPT09IHRydWUgKSByZXR1cm47XG5cdFx0XHRpZiAoIGFuaW1hdGlvbkxvb3AgPT09IG51bGwgKSByZXR1cm47XG5cblx0XHRcdGNvbnRleHQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBvbkFuaW1hdGlvbkZyYW1lICk7XG5cblx0XHRcdGlzQW5pbWF0aW5nID0gdHJ1ZTtcblxuXHRcdH0sXG5cblx0XHRzdG9wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGlzQW5pbWF0aW5nID0gZmFsc2U7XG5cblx0XHR9LFxuXG5cdFx0c2V0QW5pbWF0aW9uTG9vcDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdFx0YW5pbWF0aW9uTG9vcCA9IGNhbGxiYWNrO1xuXG5cdFx0fSxcblxuXHRcdHNldENvbnRleHQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnRleHQgPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbmV4cG9ydCB7IFdlYkdMQW5pbWF0aW9uIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xBdHRyaWJ1dGVzKCBnbCApIHtcblxuXHR2YXIgYnVmZmVycyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0ZnVuY3Rpb24gY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0dmFyIHVzYWdlID0gYXR0cmlidXRlLmR5bmFtaWMgPyBnbC5EWU5BTUlDX0RSQVcgOiBnbC5TVEFUSUNfRFJBVztcblxuXHRcdHZhciBidWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIGJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApO1xuXG5cdFx0YXR0cmlidXRlLm9uVXBsb2FkQ2FsbGJhY2soKTtcblxuXHRcdHZhciB0eXBlID0gZ2wuRkxPQVQ7XG5cblx0XHRpZiAoIGFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuRkxPQVQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBkYXRhIGJ1ZmZlciBmb3JtYXQ6IEZsb2F0NjRBcnJheS4nICk7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfU0hPUlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5TSE9SVDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9JTlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDMyQXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5JTlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLkJZVEU7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9CWVRFO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGJ1ZmZlcjogYnVmZmVyLFxuXHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdGJ5dGVzUGVyRWxlbWVudDogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsXG5cdFx0XHR2ZXJzaW9uOiBhdHRyaWJ1dGUudmVyc2lvblxuXHRcdH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZUJ1ZmZlciggYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0dmFyIHVwZGF0ZVJhbmdlID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5keW5hbWljID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wuYnVmZmVyRGF0YSggYnVmZmVyVHlwZSwgYXJyYXksIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHR9IGVsc2UgaWYgKCB1cGRhdGVSYW5nZS5jb3VudCA9PT0gLSAxICkge1xuXG5cdFx0XHQvLyBOb3QgdXNpbmcgdXBkYXRlIHJhbmdlc1xuXG5cdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCAwLCBhcnJheSApO1xuXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlUmFuZ2UuY291bnQgPT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5LicgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIHVwZGF0ZVJhbmdlLm9mZnNldCAqIGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxuXHRcdFx0XHRhcnJheS5zdWJhcnJheSggdXBkYXRlUmFuZ2Uub2Zmc2V0LCB1cGRhdGVSYW5nZS5vZmZzZXQgKyB1cGRhdGVSYW5nZS5jb3VudCApICk7XG5cblx0XHRcdHVwZGF0ZVJhbmdlLmNvdW50ID0gLSAxOyAvLyByZXNldCByYW5nZVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGdldCggYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlcnMuZ2V0KCBhdHRyaWJ1dGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XG5cblx0XHR2YXIgZGF0YSA9IGJ1ZmZlcnMuZ2V0KCBhdHRyaWJ1dGUgKTtcblxuXHRcdGlmICggZGF0YSApIHtcblxuXHRcdFx0Z2wuZGVsZXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciApO1xuXG5cdFx0XHRidWZmZXJzLmRlbGV0ZSggYXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0dmFyIGRhdGEgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YnVmZmVycy5zZXQoIGF0dHJpYnV0ZSwgY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSApO1xuXG5cdFx0fSBlbHNlIGlmICggZGF0YS52ZXJzaW9uIDwgYXR0cmlidXRlLnZlcnNpb24gKSB7XG5cblx0XHRcdHVwZGF0ZUJ1ZmZlciggZGF0YS5idWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApO1xuXG5cdFx0XHRkYXRhLnZlcnNpb24gPSBhdHRyaWJ1dGUudmVyc2lvbjtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZ2V0LFxuXHRcdHJlbW92ZTogcmVtb3ZlLFxuXHRcdHVwZGF0ZTogdXBkYXRlXG5cblx0fTtcblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMQXR0cmlidXRlcyB9O1xuIiwiaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vUXVhdGVybmlvbi5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuL01hdHJpeDQuanMnO1xuaW1wb3J0IHsgX01hdGggfSBmcm9tICcuL01hdGguanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBFdWxlciggeCwgeSwgeiwgb3JkZXIgKSB7XG5cblx0dGhpcy5feCA9IHggfHwgMDtcblx0dGhpcy5feSA9IHkgfHwgMDtcblx0dGhpcy5feiA9IHogfHwgMDtcblx0dGhpcy5fb3JkZXIgPSBvcmRlciB8fCBFdWxlci5EZWZhdWx0T3JkZXI7XG5cbn1cblxuRXVsZXIuUm90YXRpb25PcmRlcnMgPSBbICdYWVonLCAnWVpYJywgJ1pYWScsICdYWlknLCAnWVhaJywgJ1pZWCcgXTtcblxuRXVsZXIuRGVmYXVsdE9yZGVyID0gJ1hZWic7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBFdWxlci5wcm90b3R5cGUsIHtcblxuXHR4OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3g7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl94ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0ejoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl96O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feiA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRvcmRlcjoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl9vcmRlcjtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX29yZGVyID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggRXVsZXIucHJvdG90eXBlLCB7XG5cblx0aXNFdWxlcjogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgb3JkZXIgKSB7XG5cblx0XHR0aGlzLl94ID0geDtcblx0XHR0aGlzLl95ID0geTtcblx0XHR0aGlzLl96ID0gejtcblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX29yZGVyICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0dGhpcy5feCA9IGV1bGVyLl94O1xuXHRcdHRoaXMuX3kgPSBldWxlci5feTtcblx0XHR0aGlzLl96ID0gZXVsZXIuX3o7XG5cdFx0dGhpcy5fb3JkZXIgPSBldWxlci5fb3JkZXI7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0sIG9yZGVyLCB1cGRhdGUgKSB7XG5cblx0XHR2YXIgY2xhbXAgPSBfTWF0aC5jbGFtcDtcblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR2YXIgdGUgPSBtLmVsZW1lbnRzO1xuXHRcdHZhciBtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdO1xuXHRcdHZhciBtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdO1xuXHRcdHZhciBtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdG9yZGVyID0gb3JkZXIgfHwgdGhpcy5fb3JkZXI7XG5cblx0XHRpZiAoIG9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dGhpcy5feSA9IE1hdGguYXNpbiggY2xhbXAoIG0xMywgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTEzICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XG5cdFx0XHRcdHRoaXMuX3ogPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0yMywgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTIzICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMjIgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApO1xuXHRcdFx0XHR0aGlzLl96ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCBjbGFtcCggbTMyLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMzIgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gMDtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dGhpcy5feSA9IE1hdGguYXNpbiggLSBjbGFtcCggbTMxLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMzEgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1laWCcgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSBNYXRoLmFzaW4oIGNsYW1wKCBtMjEsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0yMSApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0yMiApO1xuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMTIsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0xMiApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZ2l2ZW4gdW5zdXBwb3J0ZWQgb3JkZXI6ICcgKyBvcmRlciApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlcjtcblxuXHRcdGlmICggdXBkYXRlICE9PSBmYWxzZSApIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVF1YXRlcm5pb24oIHEsIG9yZGVyLCB1cGRhdGUgKSB7XG5cblx0XHRcdG1hdHJpeC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG1hdHJpeCwgb3JkZXIsIHVwZGF0ZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uICggdiwgb3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXQoIHYueCwgdi55LCB2LnosIG9yZGVyIHx8IHRoaXMuX29yZGVyICk7XG5cblx0fSxcblxuXHRyZW9yZGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBXQVJOSU5HOiB0aGlzIGRpc2NhcmRzIHJldm9sdXRpb24gaW5mb3JtYXRpb24gLWJob3VzdG9uXG5cblx0XHR2YXIgcSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmVvcmRlciggbmV3T3JkZXIgKSB7XG5cblx0XHRcdHEuc2V0RnJvbUV1bGVyKCB0aGlzICk7XG5cblx0XHRcdHJldHVybiB0aGlzLnNldEZyb21RdWF0ZXJuaW9uKCBxLCBuZXdPcmRlciApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0cmV0dXJuICggZXVsZXIuX3ggPT09IHRoaXMuX3ggKSAmJiAoIGV1bGVyLl95ID09PSB0aGlzLl95ICkgJiYgKCBldWxlci5feiA9PT0gdGhpcy5feiApICYmICggZXVsZXIuX29yZGVyID09PSB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dGhpcy5feCA9IGFycmF5WyAwIF07XG5cdFx0dGhpcy5feSA9IGFycmF5WyAxIF07XG5cdFx0dGhpcy5feiA9IGFycmF5WyAyIF07XG5cdFx0aWYgKCBhcnJheVsgMyBdICE9PSB1bmRlZmluZWQgKSB0aGlzLl9vcmRlciA9IGFycmF5WyAzIF07XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMuX3g7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuX3o7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMuX29yZGVyO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0dG9WZWN0b3IzOiBmdW5jdGlvbiAoIG9wdGlvbmFsUmVzdWx0ICkge1xuXG5cdFx0aWYgKCBvcHRpb25hbFJlc3VsdCApIHtcblxuXHRcdFx0cmV0dXJuIG9wdGlvbmFsUmVzdWx0LnNldCggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IzKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRvbkNoYW5nZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRvbkNoYW5nZUNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgRXVsZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMYXllcnMoKSB7XG5cblx0dGhpcy5tYXNrID0gMSB8IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTGF5ZXJzLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrID0gMSA8PCBjaGFubmVsIHwgMDtcblxuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrIHw9IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHR0b2dnbGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayBePSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH0sXG5cblx0ZGlzYWJsZTogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrICY9IH4gKCAxIDw8IGNoYW5uZWwgfCAwICk7XG5cblx0fSxcblxuXHR0ZXN0OiBmdW5jdGlvbiAoIGxheWVycyApIHtcblxuXHRcdHJldHVybiAoIHRoaXMubWFzayAmIGxheWVycy5tYXNrICkgIT09IDA7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgTGF5ZXJzIH07XG4iLCJpbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vbWF0aC9RdWF0ZXJuaW9uLmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuL0V2ZW50RGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBFdWxlciB9IGZyb20gJy4uL21hdGgvRXVsZXIuanMnO1xuaW1wb3J0IHsgTGF5ZXJzIH0gZnJvbSAnLi9MYXllcnMuanMnO1xuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uL21hdGgvTWF0cml4My5qcyc7XG5pbXBvcnQgeyBfTWF0aCB9IGZyb20gJy4uL21hdGgvTWF0aC5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGVsZXBoYW50YXR3b3JrIC8gd3d3LmVsZXBoYW50YXR3b3JrLmNoXG4gKi9cblxudmFyIG9iamVjdDNESWQgPSAwO1xuXG5mdW5jdGlvbiBPYmplY3QzRCgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IG9iamVjdDNESWQgKysgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnT2JqZWN0M0QnO1xuXG5cdHRoaXMucGFyZW50ID0gbnVsbDtcblx0dGhpcy5jaGlsZHJlbiA9IFtdO1xuXG5cdHRoaXMudXAgPSBPYmplY3QzRC5EZWZhdWx0VXAuY2xvbmUoKTtcblxuXHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgcm90YXRpb24gPSBuZXcgRXVsZXIoKTtcblx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHR2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMyggMSwgMSwgMSApO1xuXG5cdGZ1bmN0aW9uIG9uUm90YXRpb25DaGFuZ2UoKSB7XG5cblx0XHRxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggcm90YXRpb24sIGZhbHNlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uUXVhdGVybmlvbkNoYW5nZSgpIHtcblxuXHRcdHJvdGF0aW9uLnNldEZyb21RdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLCB1bmRlZmluZWQsIGZhbHNlICk7XG5cblx0fVxuXG5cdHJvdGF0aW9uLm9uQ2hhbmdlKCBvblJvdGF0aW9uQ2hhbmdlICk7XG5cdHF1YXRlcm5pb24ub25DaGFuZ2UoIG9uUXVhdGVybmlvbkNoYW5nZSApO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0cG9zaXRpb246IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogcG9zaXRpb25cblx0XHR9LFxuXHRcdHJvdGF0aW9uOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHJvdGF0aW9uXG5cdFx0fSxcblx0XHRxdWF0ZXJuaW9uOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHF1YXRlcm5pb25cblx0XHR9LFxuXHRcdHNjYWxlOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHNjYWxlXG5cdFx0fSxcblx0XHRtb2RlbFZpZXdNYXRyaXg6IHtcblx0XHRcdHZhbHVlOiBuZXcgTWF0cml4NCgpXG5cdFx0fSxcblx0XHRub3JtYWxNYXRyaXg6IHtcblx0XHRcdHZhbHVlOiBuZXcgTWF0cml4MygpXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLm1hdHJpeFdvcmxkID0gbmV3IE1hdHJpeDQoKTtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBPYmplY3QzRC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZTtcblx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5sYXllcnMgPSBuZXcgTGF5ZXJzKCk7XG5cdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gZmFsc2U7XG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xuXG5cdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHRydWU7XG5cdHRoaXMucmVuZGVyT3JkZXIgPSAwO1xuXG5cdHRoaXMudXNlckRhdGEgPSB7fTtcblxufVxuXG5PYmplY3QzRC5EZWZhdWx0VXAgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlO1xuXG5PYmplY3QzRC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogT2JqZWN0M0QsXG5cblx0aXNPYmplY3QzRDogdHJ1ZSxcblxuXHRvbkJlZm9yZVJlbmRlcjogZnVuY3Rpb24gKCkge30sXG5cdG9uQWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHRoaXMubWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdHRoaXMubWF0cml4LmRlY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XG5cblx0fSxcblxuXHRhcHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggcSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyLCB0cnVlICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHQvLyBhc3N1bWVzIHEgaXMgbm9ybWFsaXplZFxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLmNvcHkoIHEgKTtcblxuXHR9LFxuXG5cdHJvdGF0ZU9uQXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIG9iamVjdCBvbiBheGlzIGluIG9iamVjdCBzcGFjZVxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0XHR2YXIgcTEgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZU9uQXhpcyggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRcdHExLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5tdWx0aXBseSggcTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVPbldvcmxkQXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIG9iamVjdCBvbiBheGlzIGluIHdvcmxkIHNwYWNlXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblx0XHQvLyBtZXRob2QgYXNzdW1lcyBubyByb3RhdGVkIHBhcmVudFxuXG5cdFx0dmFyIHExID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVPbldvcmxkQXhpcyggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRcdHExLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggcTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMSwgMCwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVZKCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAwLCAxICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBvYmplY3QgYnkgZGlzdGFuY2UgYWxvbmcgYXhpcyBpbiBvYmplY3Qgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkge1xuXG5cdFx0XHR2MS5jb3B5KCBheGlzICkuYXBwbHlRdWF0ZXJuaW9uKCB0aGlzLnF1YXRlcm5pb24gKTtcblxuXHRcdFx0dGhpcy5wb3NpdGlvbi5hZGQoIHYxLm11bHRpcGx5U2NhbGFyKCBkaXN0YW5jZSApICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVYKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWSggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVooIGRpc3RhbmNlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bG9jYWxUb1dvcmxkOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0fSxcblxuXHR3b3JsZFRvTG9jYWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gd29ybGRUb0xvY2FsKCB2ZWN0b3IgKSB7XG5cblx0XHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtMS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICkgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gVGhpcyBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCBvYmplY3RzIHdpdGggcm90YXRlZCBhbmQvb3IgdHJhbnNsYXRlZCBwYXJlbnQocylcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCB4LCB5LCB6ICkge1xuXG5cdFx0XHRpZiAoIHguaXNWZWN0b3IzICkge1xuXG5cdFx0XHRcdHZlY3Rvci5jb3B5KCB4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmVjdG9yLnNldCggeCwgeSwgeiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGhpcy5pc0NhbWVyYSApIHtcblxuXHRcdFx0XHRtMS5sb29rQXQoIHRoaXMucG9zaXRpb24sIHZlY3RvciwgdGhpcy51cCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG0xLmxvb2tBdCggdmVjdG9yLCB0aGlzLnBvc2l0aW9uLCB0aGlzLnVwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbTEgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFkZDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuYWRkKCBhcmd1bWVudHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QgPT09IHRoaXMgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuXCIsIG9iamVjdCApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRpZiAoICggb2JqZWN0ICYmIG9iamVjdC5pc09iamVjdDNEICkgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LnBhcmVudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRvYmplY3QucGFyZW50LnJlbW92ZSggb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0b2JqZWN0LnBhcmVudCA9IHRoaXM7XG5cdFx0XHRvYmplY3QuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnYWRkZWQnIH0gKTtcblxuXHRcdFx0dGhpcy5jaGlsZHJlbi5wdXNoKCBvYmplY3QgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELlwiLCBvYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5yZW1vdmUoIGFyZ3VtZW50c1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR2YXIgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xuXG5cdFx0XHRvYmplY3QucGFyZW50ID0gbnVsbDtcblxuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ3JlbW92ZWQnIH0gKTtcblxuXHRcdFx0dGhpcy5jaGlsZHJlbi5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5SWQ6IGZ1bmN0aW9uICggaWQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCAnaWQnLCBpZCApO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0QnlOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCAnbmFtZScsIG5hbWUgKTtcblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5UHJvcGVydHk6IGZ1bmN0aW9uICggbmFtZSwgdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXNbIG5hbWUgXSA9PT0gdmFsdWUgKSByZXR1cm4gdGhpcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlblsgaSBdO1xuXHRcdFx0dmFyIG9iamVjdCA9IGNoaWxkLmdldE9iamVjdEJ5UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7XG5cblx0XHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG9iamVjdDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHR9LFxuXG5cdGdldFdvcmxkUG9zaXRpb246IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFBvc2l0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0Z2V0V29ybGRRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRRdWF0ZXJuaW9uKCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFF1YXRlcm5pb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHBvc2l0aW9uLCB0YXJnZXQsIHNjYWxlICk7XG5cblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRXb3JsZFNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZFNjYWxlKCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFNjYWxlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgdGFyZ2V0ICk7XG5cblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRXb3JsZERpcmVjdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkRGlyZWN0aW9uKCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZERpcmVjdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5nZXRXb3JsZFF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIDAsIDAsIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJheWNhc3Q6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHRyYXZlcnNlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0Y2FsbGJhY2soIHRoaXMgKTtcblxuXHRcdHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjaGlsZHJlblsgaSBdLnRyYXZlcnNlKCBjYWxsYmFjayApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dHJhdmVyc2VWaXNpYmxlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Y2FsbGJhY2soIHRoaXMgKTtcblxuXHRcdHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjaGlsZHJlblsgaSBdLnRyYXZlcnNlVmlzaWJsZSggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRyYXZlcnNlQW5jZXN0b3JzOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKCBwYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdGNhbGxiYWNrKCBwYXJlbnQgKTtcblxuXHRcdFx0cGFyZW50LnRyYXZlcnNlQW5jZXN0b3JzKCBjYWxsYmFjayApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm1hdHJpeC5jb21wb3NlKCB0aGlzLnBvc2l0aW9uLCB0aGlzLnF1YXRlcm5pb24sIHRoaXMuc2NhbGUgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlICkgdGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlIHx8IGZvcmNlICkge1xuXG5cdFx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weSggdGhpcy5tYXRyaXggKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMoIHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHRmb3JjZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgY2hpbGRyZW5cblxuXHRcdHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjaGlsZHJlblsgaSBdLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHQvLyBtZXRhIGlzIGEgc3RyaW5nIHdoZW4gY2FsbGVkIGZyb20gSlNPTi5zdHJpbmdpZnlcblx0XHR2YXIgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHR2YXIgb3V0cHV0ID0ge307XG5cblx0XHQvLyBtZXRhIGlzIGEgaGFzaCB1c2VkIHRvIGNvbGxlY3QgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLlxuXHRcdC8vIG5vdCBwcm92aWRpbmcgaXQgaW1wbGllcyB0aGF0IHRoaXMgaXMgdGhlIHJvb3Qgb2JqZWN0XG5cdFx0Ly8gYmVpbmcgc2VyaWFsaXplZC5cblx0XHRpZiAoIGlzUm9vdE9iamVjdCApIHtcblxuXHRcdFx0Ly8gaW5pdGlhbGl6ZSBtZXRhIG9ialxuXHRcdFx0bWV0YSA9IHtcblx0XHRcdFx0Z2VvbWV0cmllczoge30sXG5cdFx0XHRcdG1hdGVyaWFsczoge30sXG5cdFx0XHRcdHRleHR1cmVzOiB7fSxcblx0XHRcdFx0aW1hZ2VzOiB7fSxcblx0XHRcdFx0c2hhcGVzOiB7fVxuXHRcdFx0fTtcblxuXHRcdFx0b3V0cHV0Lm1ldGFkYXRhID0ge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdPYmplY3QnLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdPYmplY3QzRC50b0pTT04nXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc3RhbmRhcmQgT2JqZWN0M0Qgc2VyaWFsaXphdGlvblxuXG5cdFx0dmFyIG9iamVjdCA9IHt9O1xuXG5cdFx0b2JqZWN0LnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0b2JqZWN0LnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBvYmplY3QubmFtZSA9IHRoaXMubmFtZTtcblx0XHRpZiAoIHRoaXMuY2FzdFNoYWRvdyA9PT0gdHJ1ZSApIG9iamVjdC5jYXN0U2hhZG93ID0gdHJ1ZTtcblx0XHRpZiAoIHRoaXMucmVjZWl2ZVNoYWRvdyA9PT0gdHJ1ZSApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSBvYmplY3QudmlzaWJsZSA9IGZhbHNlO1xuXHRcdGlmICggdGhpcy5mcnVzdHVtQ3VsbGVkID09PSBmYWxzZSApIG9iamVjdC5mcnVzdHVtQ3VsbGVkID0gZmFsc2U7XG5cdFx0aWYgKCB0aGlzLnJlbmRlck9yZGVyICE9PSAwICkgb2JqZWN0LnJlbmRlck9yZGVyID0gdGhpcy5yZW5kZXJPcmRlcjtcblx0XHRpZiAoIEpTT04uc3RyaW5naWZ5KCB0aGlzLnVzZXJEYXRhICkgIT09ICd7fScgKSBvYmplY3QudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhO1xuXG5cdFx0b2JqZWN0LmxheWVycyA9IHRoaXMubGF5ZXJzLm1hc2s7XG5cdFx0b2JqZWN0Lm1hdHJpeCA9IHRoaXMubWF0cml4LnRvQXJyYXkoKTtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlID09PSBmYWxzZSApIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0XHQvL1xuXG5cdFx0ZnVuY3Rpb24gc2VyaWFsaXplKCBsaWJyYXJ5LCBlbGVtZW50ICkge1xuXG5cdFx0XHRpZiAoIGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bGlicmFyeVsgZWxlbWVudC51dWlkIF0gPSBlbGVtZW50LnRvSlNPTiggbWV0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtZW50LnV1aWQ7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuaXNNZXNoIHx8IHRoaXMuaXNMaW5lIHx8IHRoaXMuaXNQb2ludHMgKSB7XG5cblx0XHRcdG9iamVjdC5nZW9tZXRyeSA9IHNlcmlhbGl6ZSggbWV0YS5nZW9tZXRyaWVzLCB0aGlzLmdlb21ldHJ5ICk7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbWV0ZXJzLnNoYXBlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHZhciBzaGFwZXMgPSBwYXJhbWV0ZXJzLnNoYXBlcztcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZXMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMubWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHR2YXIgdXVpZHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLm1hdGVyaWFsLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR1dWlkcy5wdXNoKCBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsWyBpIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSB1dWlkcztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpZiAoIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0b2JqZWN0LmNoaWxkcmVuID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG9iamVjdC5jaGlsZHJlbi5wdXNoKCB0aGlzLmNoaWxkcmVuWyBpIF0udG9KU09OKCBtZXRhICkub2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cmllcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuZ2VvbWV0cmllcyApO1xuXHRcdFx0dmFyIG1hdGVyaWFscyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEubWF0ZXJpYWxzICk7XG5cdFx0XHR2YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XG5cdFx0XHR2YXIgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTtcblx0XHRcdHZhciBzaGFwZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnNoYXBlcyApO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJpZXMubGVuZ3RoID4gMCApIG91dHB1dC5nZW9tZXRyaWVzID0gZ2VvbWV0cmllcztcblx0XHRcdGlmICggbWF0ZXJpYWxzLmxlbmd0aCA+IDAgKSBvdXRwdXQubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgb3V0cHV0LnRleHR1cmVzID0gdGV4dHVyZXM7XG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgb3V0cHV0LmltYWdlcyA9IGltYWdlcztcblx0XHRcdGlmICggc2hhcGVzLmxlbmd0aCA+IDAgKSBvdXRwdXQuc2hhcGVzID0gc2hhcGVzO1xuXG5cdFx0fVxuXG5cdFx0b3V0cHV0Lm9iamVjdCA9IG9iamVjdDtcblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0XHQvLyBleHRyYWN0IGRhdGEgZnJvbSB0aGUgY2FjaGUgaGFzaFxuXHRcdC8vIHJlbW92ZSBtZXRhZGF0YSBvbiBlYWNoIGl0ZW1cblx0XHQvLyBhbmQgcmV0dXJuIGFzIGFycmF5XG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICggcmVjdXJzaXZlICkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcywgcmVjdXJzaXZlICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0aWYgKCByZWN1cnNpdmUgPT09IHVuZGVmaW5lZCApIHJlY3Vyc2l2ZSA9IHRydWU7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMudXAuY29weSggc291cmNlLnVwICk7XG5cblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIHNvdXJjZS5wb3NpdGlvbiApO1xuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBzb3VyY2UucXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUuY29weSggc291cmNlLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7XG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCBzb3VyY2UubWF0cml4V29ybGQgKTtcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXG5cdFx0dGhpcy5sYXllcnMubWFzayA9IHNvdXJjZS5sYXllcnMubWFzaztcblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblxuXHRcdHRoaXMuY2FzdFNoYWRvdyA9IHNvdXJjZS5jYXN0U2hhZG93O1xuXHRcdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gc291cmNlLmZydXN0dW1DdWxsZWQ7XG5cdFx0dGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjtcblxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcblxuXHRcdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBjaGlsZCA9IHNvdXJjZS5jaGlsZHJlblsgaSBdO1xuXHRcdFx0XHR0aGlzLmFkZCggY2hpbGQuY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBPYmplY3QzRCB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuKi9cblxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vbWF0aC9RdWF0ZXJuaW9uLmpzJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcblxuZnVuY3Rpb24gQ2FtZXJhKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2FtZXJhJztcblxuXHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMucHJvamVjdGlvbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbn1cblxuQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IENhbWVyYSxcblxuXHRpc0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXguY29weSggc291cmNlLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNhbWVyYTogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgLSAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuZXhwb3J0IHsgQ2FtZXJhIH07XG4iLCJpbXBvcnQgeyBDYW1lcmEgfSBmcm9tICcuL0NhbWVyYS5qcyc7XG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGFyb3NlIC8gaHR0cDovL2dpdGh1Yi5jb20vYXJvc2VcbiAqL1xuXG5mdW5jdGlvbiBPcnRob2dyYXBoaWNDYW1lcmEoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXG5cdENhbWVyYS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ09ydGhvZ3JhcGhpY0NhbWVyYSc7XG5cblx0dGhpcy56b29tID0gMTtcblx0dGhpcy52aWV3ID0gbnVsbDtcblxuXHR0aGlzLmxlZnQgPSBsZWZ0O1xuXHR0aGlzLnJpZ2h0ID0gcmlnaHQ7XG5cdHRoaXMudG9wID0gdG9wO1xuXHR0aGlzLmJvdHRvbSA9IGJvdHRvbTtcblxuXHR0aGlzLm5lYXIgPSAoIG5lYXIgIT09IHVuZGVmaW5lZCApID8gbmVhciA6IDAuMTtcblx0dGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAyMDAwO1xuXG5cdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG59XG5cbk9ydGhvZ3JhcGhpY0NhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDYW1lcmEucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogT3J0aG9ncmFwaGljQ2FtZXJhLFxuXG5cdGlzT3J0aG9ncmFwaGljQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRDYW1lcmEucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMubGVmdCA9IHNvdXJjZS5sZWZ0O1xuXHRcdHRoaXMucmlnaHQgPSBzb3VyY2UucmlnaHQ7XG5cdFx0dGhpcy50b3AgPSBzb3VyY2UudG9wO1xuXHRcdHRoaXMuYm90dG9tID0gc291cmNlLmJvdHRvbTtcblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XG5cblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Vmlld09mZnNldDogZnVuY3Rpb24gKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3ID0ge1xuXHRcdFx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdFx0XHRmdWxsV2lkdGg6IDEsXG5cdFx0XHRcdGZ1bGxIZWlnaHQ6IDEsXG5cdFx0XHRcdG9mZnNldFg6IDAsXG5cdFx0XHRcdG9mZnNldFk6IDAsXG5cdFx0XHRcdHdpZHRoOiAxLFxuXHRcdFx0XHRoZWlnaHQ6IDFcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XG5cdFx0dGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDtcblx0XHR0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7XG5cdFx0dGhpcy52aWV3Lm9mZnNldFggPSB4O1xuXHRcdHRoaXMudmlldy5vZmZzZXRZID0geTtcblx0XHR0aGlzLnZpZXcud2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHRjbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHR1cGRhdGVQcm9qZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZHggPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvICggMiAqIHRoaXMuem9vbSApO1xuXHRcdHZhciBkeSA9ICggdGhpcy50b3AgLSB0aGlzLmJvdHRvbSApIC8gKCAyICogdGhpcy56b29tICk7XG5cdFx0dmFyIGN4ID0gKCB0aGlzLnJpZ2h0ICsgdGhpcy5sZWZ0ICkgLyAyO1xuXHRcdHZhciBjeSA9ICggdGhpcy50b3AgKyB0aGlzLmJvdHRvbSApIC8gMjtcblxuXHRcdHZhciBsZWZ0ID0gY3ggLSBkeDtcblx0XHR2YXIgcmlnaHQgPSBjeCArIGR4O1xuXHRcdHZhciB0b3AgPSBjeSArIGR5O1xuXHRcdHZhciBib3R0b20gPSBjeSAtIGR5O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgJiYgdGhpcy52aWV3LmVuYWJsZWQgKSB7XG5cblx0XHRcdHZhciB6b29tVyA9IHRoaXMuem9vbSAvICggdGhpcy52aWV3LndpZHRoIC8gdGhpcy52aWV3LmZ1bGxXaWR0aCApO1xuXHRcdFx0dmFyIHpvb21IID0gdGhpcy56b29tIC8gKCB0aGlzLnZpZXcuaGVpZ2h0IC8gdGhpcy52aWV3LmZ1bGxIZWlnaHQgKTtcblx0XHRcdHZhciBzY2FsZVcgPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvIHRoaXMudmlldy53aWR0aDtcblx0XHRcdHZhciBzY2FsZUggPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvIHRoaXMudmlldy5oZWlnaHQ7XG5cblx0XHRcdGxlZnQgKz0gc2NhbGVXICogKCB0aGlzLnZpZXcub2Zmc2V0WCAvIHpvb21XICk7XG5cdFx0XHRyaWdodCA9IGxlZnQgKyBzY2FsZVcgKiAoIHRoaXMudmlldy53aWR0aCAvIHpvb21XICk7XG5cdFx0XHR0b3AgLT0gc2NhbGVIICogKCB0aGlzLnZpZXcub2Zmc2V0WSAvIHpvb21IICk7XG5cdFx0XHRib3R0b20gPSB0b3AgLSBzY2FsZUggKiAoIHRoaXMudmlldy5oZWlnaHQgLyB6b29tSCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VPcnRob2dyYXBoaWMoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgdGhpcy5uZWFyLCB0aGlzLmZhciApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTtcblx0XHRkYXRhLm9iamVjdC5sZWZ0ID0gdGhpcy5sZWZ0O1xuXHRcdGRhdGEub2JqZWN0LnJpZ2h0ID0gdGhpcy5yaWdodDtcblx0XHRkYXRhLm9iamVjdC50b3AgPSB0aGlzLnRvcDtcblx0XHRkYXRhLm9iamVjdC5ib3R0b20gPSB0aGlzLmJvdHRvbTtcblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgT3J0aG9ncmFwaGljQ2FtZXJhIH07XG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRmFjZTMoIGEsIGIsIGMsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0dGhpcy5hID0gYTtcblx0dGhpcy5iID0gYjtcblx0dGhpcy5jID0gYztcblxuXHR0aGlzLm5vcm1hbCA9ICggbm9ybWFsICYmIG5vcm1hbC5pc1ZlY3RvcjMgKSA/IG5vcm1hbCA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudmVydGV4Tm9ybWFscyA9IEFycmF5LmlzQXJyYXkoIG5vcm1hbCApID8gbm9ybWFsIDogW107XG5cblx0dGhpcy5jb2xvciA9ICggY29sb3IgJiYgY29sb3IuaXNDb2xvciApID8gY29sb3IgOiBuZXcgQ29sb3IoKTtcblx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBBcnJheS5pc0FycmF5KCBjb2xvciApID8gY29sb3IgOiBbXTtcblxuXHR0aGlzLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4ICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbEluZGV4IDogMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGYWNlMy5wcm90b3R5cGUsIHtcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmEgPSBzb3VyY2UuYTtcblx0XHR0aGlzLmIgPSBzb3VyY2UuYjtcblx0XHR0aGlzLmMgPSBzb3VyY2UuYztcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIHNvdXJjZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdFx0dGhpcy5tYXRlcmlhbEluZGV4ID0gc291cmNlLm1hdGVyaWFsSW5kZXg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gc291cmNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGV4Tm9ybWFsc1sgaSBdID0gc291cmNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGV4Q29sb3JzWyBpIF0gPSBzb3VyY2UudmVydGV4Q29sb3JzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IEZhY2UzIH07XG4iLCJpbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuL0V2ZW50RGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBGYWNlMyB9IGZyb20gJy4vRmFjZTMuanMnO1xuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uL21hdGgvTWF0cml4My5qcyc7XG5pbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZS5qcyc7XG5pbXBvcnQgeyBCb3gzIH0gZnJvbSAnLi4vbWF0aC9Cb3gzLmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4vT2JqZWN0M0QuanMnO1xuaW1wb3J0IHsgX01hdGggfSBmcm9tICcuLi9tYXRoL01hdGguanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG52YXIgZ2VvbWV0cnlJZCA9IDA7IC8vIEdlb21ldHJ5IHVzZXMgZXZlbiBudW1iZXJzIGFzIElkXG5cbmZ1bmN0aW9uIEdlb21ldHJ5KCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogZ2VvbWV0cnlJZCArPSAyIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ0dlb21ldHJ5JztcblxuXHR0aGlzLnZlcnRpY2VzID0gW107XG5cdHRoaXMuY29sb3JzID0gW107XG5cdHRoaXMuZmFjZXMgPSBbXTtcblx0dGhpcy5mYWNlVmVydGV4VXZzID0gW1tdXTtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IFtdO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IFtdO1xuXG5cdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXG5cdHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHQvLyB1cGRhdGUgZmxhZ3NcblxuXHR0aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxufVxuXG5HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogR2VvbWV0cnksXG5cblx0aXNHZW9tZXRyeTogdHJ1ZSxcblxuXHRhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSB0aGlzLnZlcnRpY2VzWyBpIF07XG5cdFx0XHR2ZXJ0ZXguYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblx0XHRcdGZhY2Uubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0ZmFjZS52ZXJ0ZXhOb3JtYWxzWyBqIF0uYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHgtYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWCggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHktYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVZKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWSggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHotYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWiggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBnZW9tZXRyeVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBzY2FsZSBnZW9tZXRyeVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzY2FsZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVNjYWxlKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqID0gbmV3IE9iamVjdDNEKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCB2ZWN0b3IgKSB7XG5cblx0XHRcdG9iai5sb29rQXQoIHZlY3RvciApO1xuXG5cdFx0XHRvYmoudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG9iai5tYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGZyb21CdWZmZXJHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4ICE9PSBudWxsID8gZ2VvbWV0cnkuaW5kZXguYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0dmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cdFx0dmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbCAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIGNvbG9ycyA9IGF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMuY29sb3IuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIHV2cyA9IGF0dHJpYnV0ZXMudXYgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMudXYuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIHV2czIgPSBhdHRyaWJ1dGVzLnV2MiAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy51djIuYXJyYXkgOiB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdID0gW107XG5cblx0XHR2YXIgdGVtcE5vcm1hbHMgPSBbXTtcblx0XHR2YXIgdGVtcFVWcyA9IFtdO1xuXHRcdHZhciB0ZW1wVVZzMiA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMywgaiArPSAyICkge1xuXG5cdFx0XHRzY29wZS52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9zaXRpb25zWyBpIF0sIHBvc2l0aW9uc1sgaSArIDEgXSwgcG9zaXRpb25zWyBpICsgMiBdICkgKTtcblxuXHRcdFx0aWYgKCBub3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGVtcE5vcm1hbHMucHVzaCggbmV3IFZlY3RvcjMoIG5vcm1hbHNbIGkgXSwgbm9ybWFsc1sgaSArIDEgXSwgbm9ybWFsc1sgaSArIDIgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjb2xvcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5jb2xvcnMucHVzaCggbmV3IENvbG9yKCBjb2xvcnNbIGkgXSwgY29sb3JzWyBpICsgMSBdLCBjb2xvcnNbIGkgKyAyIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGVtcFVWcy5wdXNoKCBuZXcgVmVjdG9yMiggdXZzWyBqIF0sIHV2c1sgaiArIDEgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGVtcFVWczIucHVzaCggbmV3IFZlY3RvcjIoIHV2czJbIGogXSwgdXZzMlsgaiArIDEgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGFkZEZhY2UoIGEsIGIsIGMsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gbm9ybWFscyAhPT0gdW5kZWZpbmVkID8gWyB0ZW1wTm9ybWFsc1sgYSBdLmNsb25lKCksIHRlbXBOb3JtYWxzWyBiIF0uY2xvbmUoKSwgdGVtcE5vcm1hbHNbIGMgXS5jbG9uZSgpIF0gOiBbXTtcblx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSBjb2xvcnMgIT09IHVuZGVmaW5lZCA/IFsgc2NvcGUuY29sb3JzWyBhIF0uY2xvbmUoKSwgc2NvcGUuY29sb3JzWyBiIF0uY2xvbmUoKSwgc2NvcGUuY29sb3JzWyBjIF0uY2xvbmUoKSBdIDogW107XG5cblx0XHRcdHZhciBmYWNlID0gbmV3IEZhY2UzKCBhLCBiLCBjLCB2ZXJ0ZXhOb3JtYWxzLCB2ZXJ0ZXhDb2xvcnMsIG1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0c2NvcGUuZmFjZXMucHVzaCggZmFjZSApO1xuXG5cdFx0XHRpZiAoIHV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLmZhY2VWZXJ0ZXhVdnNbIDAgXS5wdXNoKCBbIHRlbXBVVnNbIGEgXS5jbG9uZSgpLCB0ZW1wVVZzWyBiIF0uY2xvbmUoKSwgdGVtcFVWc1sgYyBdLmNsb25lKCkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLmZhY2VWZXJ0ZXhVdnNbIDEgXS5wdXNoKCBbIHRlbXBVVnMyWyBhIF0uY2xvbmUoKSwgdGVtcFVWczJbIGIgXS5jbG9uZSgpLCB0ZW1wVVZzMlsgYyBdLmNsb25lKCkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0aWYgKCBncm91cHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblxuXHRcdFx0XHR2YXIgc3RhcnQgPSBncm91cC5zdGFydDtcblx0XHRcdFx0dmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSBzdGFydCwgamwgPSBzdGFydCArIGNvdW50OyBqIDwgamw7IGogKz0gMyApIHtcblxuXHRcdFx0XHRcdGlmICggaW5kaWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRhZGRGYWNlKCBpbmRpY2VzWyBqIF0sIGluZGljZXNbIGogKyAxIF0sIGluZGljZXNbIGogKyAyIF0sIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGFkZEZhY2UoIGosIGogKyAxLCBqICsgMiwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBpbmRpY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGFkZEZhY2UoIGluZGljZXNbIGkgXSwgaW5kaWNlc1sgaSArIDEgXSwgaW5kaWNlc1sgaSArIDIgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC8gMzsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0YWRkRmFjZSggaSwgaSArIDEsIGkgKyAyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjZW50ZXIoKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBvZmZzZXQgKS5uZWdhdGUoKTtcblxuXHRcdFx0dGhpcy50cmFuc2xhdGUoIG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnogKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR2YXIgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7XG5cdFx0dmFyIHJhZGl1cyA9IHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzO1xuXG5cdFx0dmFyIHMgPSByYWRpdXMgPT09IDAgPyAxIDogMS4wIC8gcmFkaXVzO1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0bWF0cml4LnNldChcblx0XHRcdHMsIDAsIDAsIC0gcyAqIGNlbnRlci54LFxuXHRcdFx0MCwgcywgMCwgLSBzICogY2VudGVyLnksXG5cdFx0XHQwLCAwLCBzLCAtIHMgKiBjZW50ZXIueixcblx0XHRcdDAsIDAsIDAsIDFcblx0XHQpO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXB1dGVGYWNlTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Zm9yICggdmFyIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHR2YXIgdkEgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmEgXTtcblx0XHRcdHZhciB2QiA9IHRoaXMudmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0dmFyIHZDID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5jIF07XG5cblx0XHRcdGNiLnN1YlZlY3RvcnMoIHZDLCB2QiApO1xuXHRcdFx0YWIuc3ViVmVjdG9ycyggdkEsIHZCICk7XG5cdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0Y2Iubm9ybWFsaXplKCk7XG5cblx0XHRcdGZhY2Uubm9ybWFsLmNvcHkoIGNiICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCBhcmVhV2VpZ2h0ZWQgKSB7XG5cblx0XHRpZiAoIGFyZWFXZWlnaHRlZCA9PT0gdW5kZWZpbmVkICkgYXJlYVdlaWdodGVkID0gdHJ1ZTtcblxuXHRcdHZhciB2LCB2bCwgZiwgZmwsIGZhY2UsIHZlcnRpY2VzO1xuXG5cdFx0dmVydGljZXMgPSBuZXcgQXJyYXkoIHRoaXMudmVydGljZXMubGVuZ3RoICk7XG5cblx0XHRmb3IgKCB2ID0gMCwgdmwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICsrICkge1xuXG5cdFx0XHR2ZXJ0aWNlc1sgdiBdID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdGlmICggYXJlYVdlaWdodGVkICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXggbm9ybWFscyB3ZWlnaHRlZCBieSB0cmlhbmdsZSBhcmVhc1xuXHRcdFx0Ly8gaHR0cDovL3d3dy5pcXVpbGV6bGVzLm9yZy93d3cvYXJ0aWNsZXMvbm9ybWFscy9ub3JtYWxzLmh0bVxuXG5cdFx0XHR2YXIgdkEsIHZCLCB2Qztcblx0XHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdHZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHRcdHZCID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5iIF07XG5cdFx0XHRcdHZDID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5jIF07XG5cblx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggdkMsIHZCICk7XG5cdFx0XHRcdGFiLnN1YlZlY3RvcnMoIHZBLCB2QiApO1xuXHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5hIF0uYWRkKCBjYiApO1xuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5iIF0uYWRkKCBjYiApO1xuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5jIF0uYWRkKCBjYiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXG5cdFx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYSBdLmFkZCggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYiBdLmFkZCggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYyBdLmFkZCggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Zm9yICggdiA9IDAsIHZsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArKyApIHtcblxuXHRcdFx0dmVydGljZXNbIHYgXS5ub3JtYWxpemUoKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5hIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmIgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0uY29weSggdmVydGljZXNbIGZhY2UuYyBdICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdID0gdmVydGljZXNbIGZhY2UuYSBdLmNsb25lKCk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXSA9IHZlcnRpY2VzWyBmYWNlLmIgXS5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0gPSB2ZXJ0aWNlc1sgZmFjZS5jIF0uY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZiwgZmwsIGZhY2U7XG5cblx0XHR0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdGlmICggdmVydGV4Tm9ybWFscy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXS5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0uY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0gPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0gPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZmFjZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlTW9ycGhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaSwgaWwsIGYsIGZsLCBmYWNlO1xuXG5cdFx0Ly8gc2F2ZSBvcmlnaW5hbCBub3JtYWxzXG5cdFx0Ly8gLSBjcmVhdGUgdGVtcCB2YXJpYWJsZXMgb24gZmlyc3QgYWNjZXNzXG5cdFx0Ly8gICBvdGhlcndpc2UganVzdCBjb3B5IChmb3IgZmFzdGVyIHJlcGVhdGVkIGNhbGxzKVxuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0aWYgKCAhIGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0ZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmNsb25lKCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzICkgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCAhIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXSApIHtcblxuXHRcdFx0XHRcdGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXSA9IGZhY2UudmVydGV4Tm9ybWFsc1sgaSBdLmNsb25lKCk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gdXNlIHRlbXAgZ2VvbWV0cnkgdG8gY29tcHV0ZSBmYWNlIGFuZCB2ZXJ0ZXggbm9ybWFscyBmb3IgZWFjaCBtb3JwaFxuXG5cdFx0dmFyIHRtcEdlbyA9IG5ldyBHZW9tZXRyeSgpO1xuXHRcdHRtcEdlby5mYWNlcyA9IHRoaXMuZmFjZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Ly8gY3JlYXRlIG9uIGZpcnN0IGFjY2Vzc1xuXG5cdFx0XHRpZiAoICEgdGhpcy5tb3JwaE5vcm1hbHNbIGkgXSApIHtcblxuXHRcdFx0XHR0aGlzLm1vcnBoTm9ybWFsc1sgaSBdID0ge307XG5cdFx0XHRcdHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMgPSBbXTtcblx0XHRcdFx0dGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzID0gW107XG5cblx0XHRcdFx0dmFyIGRzdE5vcm1hbHNGYWNlID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscztcblx0XHRcdFx0dmFyIGRzdE5vcm1hbHNWZXJ0ZXggPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdFx0dmFyIGZhY2VOb3JtYWwsIHZlcnRleE5vcm1hbHM7XG5cblx0XHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRcdGZhY2VOb3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0XHRcdHZlcnRleE5vcm1hbHMgPSB7IGE6IG5ldyBWZWN0b3IzKCksIGI6IG5ldyBWZWN0b3IzKCksIGM6IG5ldyBWZWN0b3IzKCkgfTtcblxuXHRcdFx0XHRcdGRzdE5vcm1hbHNGYWNlLnB1c2goIGZhY2VOb3JtYWwgKTtcblx0XHRcdFx0XHRkc3ROb3JtYWxzVmVydGV4LnB1c2goIHZlcnRleE5vcm1hbHMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1vcnBoTm9ybWFscyA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF07XG5cblx0XHRcdC8vIHNldCB2ZXJ0aWNlcyB0byBtb3JwaCB0YXJnZXRcblxuXHRcdFx0dG1wR2VvLnZlcnRpY2VzID0gdGhpcy5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcztcblxuXHRcdFx0Ly8gY29tcHV0ZSBtb3JwaCBub3JtYWxzXG5cblx0XHRcdHRtcEdlby5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblx0XHRcdHRtcEdlby5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdFx0XHQvLyBzdG9yZSBtb3JwaCBub3JtYWxzXG5cblx0XHRcdHZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdFx0ZmFjZU5vcm1hbCA9IG1vcnBoTm9ybWFscy5mYWNlTm9ybWFsc1sgZiBdO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzID0gbW9ycGhOb3JtYWxzLnZlcnRleE5vcm1hbHNbIGYgXTtcblxuXHRcdFx0XHRmYWNlTm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFscy5hLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMCBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHMuYi5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDEgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzLmMuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAyIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gcmVzdG9yZSBvcmlnaW5hbCBub3JtYWxzXG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRmYWNlLm5vcm1hbCA9IGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWw7XG5cdFx0XHRmYWNlLnZlcnRleE5vcm1hbHMgPSBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tUG9pbnRzKCB0aGlzLnZlcnRpY2VzICk7XG5cblx0fSxcblxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApO1xuXG5cdH0sXG5cblx0bWVyZ2U6IGZ1bmN0aW9uICggZ2VvbWV0cnksIG1hdHJpeCwgbWF0ZXJpYWxJbmRleE9mZnNldCApIHtcblxuXHRcdGlmICggISAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5HZW9tZXRyeS4nLCBnZW9tZXRyeSApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG5vcm1hbE1hdHJpeCxcblx0XHRcdHZlcnRleE9mZnNldCA9IHRoaXMudmVydGljZXMubGVuZ3RoLFxuXHRcdFx0dmVydGljZXMxID0gdGhpcy52ZXJ0aWNlcyxcblx0XHRcdHZlcnRpY2VzMiA9IGdlb21ldHJ5LnZlcnRpY2VzLFxuXHRcdFx0ZmFjZXMxID0gdGhpcy5mYWNlcyxcblx0XHRcdGZhY2VzMiA9IGdlb21ldHJ5LmZhY2VzLFxuXHRcdFx0dXZzMSA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdLFxuXHRcdFx0dXZzMiA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXSxcblx0XHRcdGNvbG9yczEgPSB0aGlzLmNvbG9ycyxcblx0XHRcdGNvbG9yczIgPSBnZW9tZXRyeS5jb2xvcnM7XG5cblx0XHRpZiAoIG1hdGVyaWFsSW5kZXhPZmZzZXQgPT09IHVuZGVmaW5lZCApIG1hdGVyaWFsSW5kZXhPZmZzZXQgPSAwO1xuXG5cdFx0aWYgKCBtYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdmVydGljZXNcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB2ZXJ0aWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSB2ZXJ0aWNlczJbIGkgXTtcblxuXHRcdFx0dmFyIHZlcnRleENvcHkgPSB2ZXJ0ZXguY2xvbmUoKTtcblxuXHRcdFx0aWYgKCBtYXRyaXggIT09IHVuZGVmaW5lZCApIHZlcnRleENvcHkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdFx0dmVydGljZXMxLnB1c2goIHZlcnRleENvcHkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbG9yc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNvbG9yczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbG9yczEucHVzaCggY29sb3JzMlsgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2VzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBmYWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXMyWyBpIF0sIGZhY2VDb3B5LCBub3JtYWwsIGNvbG9yLFxuXHRcdFx0XHRmYWNlVmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscyxcblx0XHRcdFx0ZmFjZVZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRmYWNlQ29weSA9IG5ldyBGYWNlMyggZmFjZS5hICsgdmVydGV4T2Zmc2V0LCBmYWNlLmIgKyB2ZXJ0ZXhPZmZzZXQsIGZhY2UuYyArIHZlcnRleE9mZnNldCApO1xuXHRcdFx0ZmFjZUNvcHkubm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdGlmICggbm9ybWFsTWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZmFjZUNvcHkubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdG5vcm1hbCA9IGZhY2VWZXJ0ZXhOb3JtYWxzWyBqIF0uY2xvbmUoKTtcblxuXHRcdFx0XHRpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0bm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZhY2VDb3B5LnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZmFjZUNvcHkuY29sb3IuY29weSggZmFjZS5jb2xvciApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZVZlcnRleENvbG9ycy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRjb2xvciA9IGZhY2VWZXJ0ZXhDb2xvcnNbIGogXTtcblx0XHRcdFx0ZmFjZUNvcHkudmVydGV4Q29sb3JzLnB1c2goIGNvbG9yLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmYWNlQ29weS5tYXRlcmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4ICsgbWF0ZXJpYWxJbmRleE9mZnNldDtcblxuXHRcdFx0ZmFjZXMxLnB1c2goIGZhY2VDb3B5ICk7XG5cblx0XHR9XG5cblx0XHQvLyB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHV2czIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB1diA9IHV2czJbIGkgXSwgdXZDb3B5ID0gW107XG5cblx0XHRcdGlmICggdXYgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gdXYubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dXZDb3B5LnB1c2goIHV2WyBqIF0uY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHV2czEucHVzaCggdXZDb3B5ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtZXJnZU1lc2g6IGZ1bmN0aW9uICggbWVzaCApIHtcblxuXHRcdGlmICggISAoIG1lc2ggJiYgbWVzaC5pc01lc2ggKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5Lm1lcmdlTWVzaCgpOiBtZXNoIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5NZXNoLicsIG1lc2ggKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggbWVzaC5tYXRyaXhBdXRvVXBkYXRlICkgbWVzaC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdHRoaXMubWVyZ2UoIG1lc2guZ2VvbWV0cnksIG1lc2gubWF0cml4ICk7XG5cblx0fSxcblxuXHQvKlxuXHQgKiBDaGVja3MgZm9yIGR1cGxpY2F0ZSB2ZXJ0aWNlcyB3aXRoIGhhc2htYXAuXG5cdCAqIER1cGxpY2F0ZWQgdmVydGljZXMgYXJlIHJlbW92ZWRcblx0ICogYW5kIGZhY2VzJyB2ZXJ0aWNlcyBhcmUgdXBkYXRlZC5cblx0ICovXG5cblx0bWVyZ2VWZXJ0aWNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZlcnRpY2VzTWFwID0ge307IC8vIEhhc2htYXAgZm9yIGxvb2tpbmcgdXAgdmVydGljZXMgYnkgcG9zaXRpb24gY29vcmRpbmF0ZXMgKGFuZCBtYWtpbmcgc3VyZSB0aGV5IGFyZSB1bmlxdWUpXG5cdFx0dmFyIHVuaXF1ZSA9IFtdLCBjaGFuZ2VzID0gW107XG5cblx0XHR2YXIgdiwga2V5O1xuXHRcdHZhciBwcmVjaXNpb25Qb2ludHMgPSA0OyAvLyBudW1iZXIgb2YgZGVjaW1hbCBwb2ludHMsIGUuZy4gNCBmb3IgZXBzaWxvbiBvZiAwLjAwMDFcblx0XHR2YXIgcHJlY2lzaW9uID0gTWF0aC5wb3coIDEwLCBwcmVjaXNpb25Qb2ludHMgKTtcblx0XHR2YXIgaSwgaWwsIGZhY2U7XG5cdFx0dmFyIGluZGljZXMsIGosIGpsO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0diA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdGtleSA9IE1hdGgucm91bmQoIHYueCAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi55ICogcHJlY2lzaW9uICkgKyAnXycgKyBNYXRoLnJvdW5kKCB2LnogKiBwcmVjaXNpb24gKTtcblxuXHRcdFx0aWYgKCB2ZXJ0aWNlc01hcFsga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR2ZXJ0aWNlc01hcFsga2V5IF0gPSBpO1xuXHRcdFx0XHR1bmlxdWUucHVzaCggdGhpcy52ZXJ0aWNlc1sgaSBdICk7XG5cdFx0XHRcdGNoYW5nZXNbIGkgXSA9IHVuaXF1ZS5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ0R1cGxpY2F0ZSB2ZXJ0ZXggZm91bmQuICcsIGksICcgY291bGQgYmUgdXNpbmcgJywgdmVydGljZXNNYXBba2V5XSk7XG5cdFx0XHRcdGNoYW5nZXNbIGkgXSA9IGNoYW5nZXNbIHZlcnRpY2VzTWFwWyBrZXkgXSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdC8vIGlmIGZhY2VzIGFyZSBjb21wbGV0ZWx5IGRlZ2VuZXJhdGUgYWZ0ZXIgbWVyZ2luZyB2ZXJ0aWNlcywgd2Vcblx0XHQvLyBoYXZlIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlIGdlb21ldHJ5LlxuXHRcdHZhciBmYWNlSW5kaWNlc1RvUmVtb3ZlID0gW107XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgaSBdO1xuXG5cdFx0XHRmYWNlLmEgPSBjaGFuZ2VzWyBmYWNlLmEgXTtcblx0XHRcdGZhY2UuYiA9IGNoYW5nZXNbIGZhY2UuYiBdO1xuXHRcdFx0ZmFjZS5jID0gY2hhbmdlc1sgZmFjZS5jIF07XG5cblx0XHRcdGluZGljZXMgPSBbIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgXTtcblxuXHRcdFx0Ly8gaWYgYW55IGR1cGxpY2F0ZSB2ZXJ0aWNlcyBhcmUgZm91bmQgaW4gYSBGYWNlM1xuXHRcdFx0Ly8gd2UgaGF2ZSB0byByZW1vdmUgdGhlIGZhY2UgYXMgbm90aGluZyBjYW4gYmUgc2F2ZWRcblx0XHRcdGZvciAoIHZhciBuID0gMDsgbiA8IDM7IG4gKysgKSB7XG5cblx0XHRcdFx0aWYgKCBpbmRpY2VzWyBuIF0gPT09IGluZGljZXNbICggbiArIDEgKSAlIDMgXSApIHtcblxuXHRcdFx0XHRcdGZhY2VJbmRpY2VzVG9SZW1vdmUucHVzaCggaSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Zm9yICggaSA9IGZhY2VJbmRpY2VzVG9SZW1vdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC0tICkge1xuXG5cdFx0XHR2YXIgaWR4ID0gZmFjZUluZGljZXNUb1JlbW92ZVsgaSBdO1xuXG5cdFx0XHR0aGlzLmZhY2VzLnNwbGljZSggaWR4LCAxICk7XG5cblx0XHRcdGZvciAoIGogPSAwLCBqbCA9IHRoaXMuZmFjZVZlcnRleFV2cy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnNbIGogXS5zcGxpY2UoIGlkeCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBVc2UgdW5pcXVlIHNldCBvZiB2ZXJ0aWNlc1xuXG5cdFx0dmFyIGRpZmYgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCAtIHVuaXF1ZS5sZW5ndGg7XG5cdFx0dGhpcy52ZXJ0aWNlcyA9IHVuaXF1ZTtcblx0XHRyZXR1cm4gZGlmZjtcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBwb2ludCA9IHBvaW50c1sgaSBdO1xuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c29ydEZhY2VzQnlNYXRlcmlhbEluZGV4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZmFjZXMgPSB0aGlzLmZhY2VzO1xuXHRcdHZhciBsZW5ndGggPSBmYWNlcy5sZW5ndGg7XG5cblx0XHQvLyB0YWcgZmFjZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0ZmFjZXNbIGkgXS5faWQgPSBpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc29ydCBmYWNlc1xuXG5cdFx0ZnVuY3Rpb24gbWF0ZXJpYWxJbmRleFNvcnQoIGEsIGIgKSB7XG5cblx0XHRcdHJldHVybiBhLm1hdGVyaWFsSW5kZXggLSBiLm1hdGVyaWFsSW5kZXg7XG5cblx0XHR9XG5cblx0XHRmYWNlcy5zb3J0KCBtYXRlcmlhbEluZGV4U29ydCApO1xuXG5cdFx0Ly8gc29ydCB1dnNcblxuXHRcdHZhciB1dnMxID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF07XG5cdFx0dmFyIHV2czIgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXTtcblxuXHRcdHZhciBuZXdVdnMxLCBuZXdVdnMyO1xuXG5cdFx0aWYgKCB1dnMxICYmIHV2czEubGVuZ3RoID09PSBsZW5ndGggKSBuZXdVdnMxID0gW107XG5cdFx0aWYgKCB1dnMyICYmIHV2czIubGVuZ3RoID09PSBsZW5ndGggKSBuZXdVdnMyID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpZCA9IGZhY2VzWyBpIF0uX2lkO1xuXG5cdFx0XHRpZiAoIG5ld1V2czEgKSBuZXdVdnMxLnB1c2goIHV2czFbIGlkIF0gKTtcblx0XHRcdGlmICggbmV3VXZzMiApIG5ld1V2czIucHVzaCggdXZzMlsgaWQgXSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBuZXdVdnMxICkgdGhpcy5mYWNlVmVydGV4VXZzWyAwIF0gPSBuZXdVdnMxO1xuXHRcdGlmICggbmV3VXZzMiApIHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdID0gbmV3VXZzMjtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdHZW9tZXRyeScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0dlb21ldHJ5LnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgR2VvbWV0cnkgc2VyaWFsaXphdGlvblxuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0XHRcdGlmICggcGFyYW1ldGVyc1sga2V5IF0gIT09IHVuZGVmaW5lZCApIGRhdGFbIGtleSBdID0gcGFyYW1ldGVyc1sga2V5IF07XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cblx0XHR9XG5cblx0XHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1sgaSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGZhY2VzID0gW107XG5cdFx0dmFyIG5vcm1hbHMgPSBbXTtcblx0XHR2YXIgbm9ybWFsc0hhc2ggPSB7fTtcblx0XHR2YXIgY29sb3JzID0gW107XG5cdFx0dmFyIGNvbG9yc0hhc2ggPSB7fTtcblx0XHR2YXIgdXZzID0gW107XG5cdFx0dmFyIHV2c0hhc2ggPSB7fTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuZmFjZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblxuXHRcdFx0dmFyIGhhc01hdGVyaWFsID0gdHJ1ZTtcblx0XHRcdHZhciBoYXNGYWNlVXYgPSBmYWxzZTsgLy8gZGVwcmVjYXRlZFxuXHRcdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF0gIT09IHVuZGVmaW5lZDtcblx0XHRcdHZhciBoYXNGYWNlTm9ybWFsID0gZmFjZS5ub3JtYWwubGVuZ3RoKCkgPiAwO1xuXHRcdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoID4gMDtcblx0XHRcdHZhciBoYXNGYWNlQ29sb3IgPSBmYWNlLmNvbG9yLnIgIT09IDEgfHwgZmFjZS5jb2xvci5nICE9PSAxIHx8IGZhY2UuY29sb3IuYiAhPT0gMTtcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4Q29sb3IgPSBmYWNlLnZlcnRleENvbG9ycy5sZW5ndGggPiAwO1xuXG5cdFx0XHR2YXIgZmFjZVR5cGUgPSAwO1xuXG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDAsIDAgKTsgLy8gaXNRdWFkXG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDEsIGhhc01hdGVyaWFsICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDIsIGhhc0ZhY2VVdiApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAzLCBoYXNGYWNlVmVydGV4VXYgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNCwgaGFzRmFjZU5vcm1hbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA1LCBoYXNGYWNlVmVydGV4Tm9ybWFsICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDYsIGhhc0ZhY2VDb2xvciApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA3LCBoYXNGYWNlVmVydGV4Q29sb3IgKTtcblxuXHRcdFx0ZmFjZXMucHVzaCggZmFjZVR5cGUgKTtcblx0XHRcdGZhY2VzLnB1c2goIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgKTtcblx0XHRcdGZhY2VzLnB1c2goIGZhY2UubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHtcblxuXHRcdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF07XG5cblx0XHRcdFx0ZmFjZXMucHVzaChcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAxIF0gKSxcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAyIF0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRmYWNlcy5wdXNoKCBnZXROb3JtYWxJbmRleCggZmFjZS5ub3JtYWwgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0XHRmYWNlcy5wdXNoKFxuXHRcdFx0XHRcdGdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMSBdICksXG5cdFx0XHRcdFx0Z2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDIgXSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0ZmFjZXMucHVzaCggZ2V0Q29sb3JJbmRleCggZmFjZS5jb2xvciApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Q29sb3IgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goXG5cdFx0XHRcdFx0Z2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDEgXSApLFxuXHRcdFx0XHRcdGdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMiBdIClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gc2V0Qml0KCB2YWx1ZSwgcG9zaXRpb24sIGVuYWJsZWQgKSB7XG5cblx0XHRcdHJldHVybiBlbmFibGVkID8gdmFsdWUgfCAoIDEgPDwgcG9zaXRpb24gKSA6IHZhbHVlICYgKCB+ICggMSA8PCBwb3NpdGlvbiApICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXROb3JtYWxJbmRleCggbm9ybWFsICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IG5vcm1hbC54LnRvU3RyaW5nKCkgKyBub3JtYWwueS50b1N0cmluZygpICsgbm9ybWFsLnoudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCBub3JtYWxzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG5vcm1hbHNIYXNoWyBoYXNoIF07XG5cblx0XHRcdH1cblxuXHRcdFx0bm9ybWFsc0hhc2hbIGhhc2ggXSA9IG5vcm1hbHMubGVuZ3RoIC8gMztcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHRyZXR1cm4gbm9ybWFsc0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldENvbG9ySW5kZXgoIGNvbG9yICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IGNvbG9yLnIudG9TdHJpbmcoKSArIGNvbG9yLmcudG9TdHJpbmcoKSArIGNvbG9yLmIudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCBjb2xvcnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gY29sb3JzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbG9yc0hhc2hbIGhhc2ggXSA9IGNvbG9ycy5sZW5ndGg7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IuZ2V0SGV4KCkgKTtcblxuXHRcdFx0cmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldFV2SW5kZXgoIHV2ICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IHV2LngudG9TdHJpbmcoKSArIHV2LnkudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCB1dnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdXZzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHV2c0hhc2hbIGhhc2ggXSA9IHV2cy5sZW5ndGggLyAyO1xuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0cmV0dXJuIHV2c0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGRhdGEuZGF0YSA9IHt9O1xuXG5cdFx0ZGF0YS5kYXRhLnZlcnRpY2VzID0gdmVydGljZXM7XG5cdFx0ZGF0YS5kYXRhLm5vcm1hbHMgPSBub3JtYWxzO1xuXHRcdGlmICggY29sb3JzLmxlbmd0aCA+IDAgKSBkYXRhLmRhdGEuY29sb3JzID0gY29sb3JzO1xuXHRcdGlmICggdXZzLmxlbmd0aCA+IDAgKSBkYXRhLmRhdGEudXZzID0gWyB1dnMgXTsgLy8gdGVtcG9yYWwgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuXHRcdGRhdGEuZGF0YS5mYWNlcyA9IGZhY2VzO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Lypcblx0XHQgLy8gSGFuZGxlIHByaW1pdGl2ZXNcblxuXHRcdCB2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdCBpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdCB2YXIgdmFsdWVzID0gW107XG5cblx0XHQgZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0IHZhbHVlcy5wdXNoKCBwYXJhbWV0ZXJzWyBrZXkgXSApO1xuXG5cdFx0IH1cblxuXHRcdCB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApO1xuXHRcdCB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7XG5cdFx0IHJldHVybiBnZW9tZXRyeTtcblxuXHRcdCB9XG5cblx0XHQgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXHRcdCAqL1xuXG5cdFx0cmV0dXJuIG5ldyBHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dmFyIGksIGlsLCBqLCBqbCwgaywga2w7XG5cblx0XHQvLyByZXNldFxuXG5cdFx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHRcdHRoaXMuY29sb3JzID0gW107XG5cdFx0dGhpcy5mYWNlcyA9IFtdO1xuXHRcdHRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07XG5cdFx0dGhpcy5tb3JwaFRhcmdldHMgPSBbXTtcblx0XHR0aGlzLm1vcnBoTm9ybWFscyA9IFtdO1xuXHRcdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0XHR0aGlzLnNraW5JbmRpY2VzID0gW107XG5cdFx0dGhpcy5saW5lRGlzdGFuY2VzID0gW107XG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0XHQvLyBuYW1lXG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdC8vIHZlcnRpY2VzXG5cblx0XHR2YXIgdmVydGljZXMgPSBzb3VyY2UudmVydGljZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbG9yc1xuXG5cdFx0dmFyIGNvbG9ycyA9IHNvdXJjZS5jb2xvcnM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29sb3JzLnB1c2goIGNvbG9yc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2VzXG5cblx0XHR2YXIgZmFjZXMgPSBzb3VyY2UuZmFjZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBmYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5mYWNlcy5wdXNoKCBmYWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2UgdmVydGV4IHV2c1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gc291cmNlLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlVmVydGV4VXZzID0gc291cmNlLmZhY2VWZXJ0ZXhVdnNbIGkgXTtcblxuXHRcdFx0aWYgKCB0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaiA9IDAsIGpsID0gZmFjZVZlcnRleFV2cy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgdXZzID0gZmFjZVZlcnRleFV2c1sgaiBdLCB1dnNDb3B5ID0gW107XG5cblx0XHRcdFx0Zm9yICggayA9IDAsIGtsID0gdXZzLmxlbmd0aDsgayA8IGtsOyBrICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHV2ID0gdXZzWyBrIF07XG5cblx0XHRcdFx0XHR1dnNDb3B5LnB1c2goIHV2LmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBpIF0ucHVzaCggdXZzQ29weSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCB0YXJnZXRzXG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0ge307XG5cdFx0XHRtb3JwaFRhcmdldC5uYW1lID0gbW9ycGhUYXJnZXRzWyBpIF0ubmFtZTtcblxuXHRcdFx0Ly8gdmVydGljZXNcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0LnZlcnRpY2VzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaFRhcmdldC52ZXJ0aWNlcy5wdXNoKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbm9ybWFsc1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldC5ub3JtYWxzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdG1vcnBoVGFyZ2V0Lm5vcm1hbHMucHVzaCggbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFsc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdC8vIG1vcnBoIG5vcm1hbHNcblxuXHRcdHZhciBtb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gbW9ycGhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbW9ycGhOb3JtYWwgPSB7fTtcblxuXHRcdFx0Ly8gdmVydGV4IG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhOb3JtYWwudmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgc3JjVmVydGV4Tm9ybWFsID0gbW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFsc1sgaiBdO1xuXHRcdFx0XHRcdHZhciBkZXN0VmVydGV4Tm9ybWFsID0ge307XG5cblx0XHRcdFx0XHRkZXN0VmVydGV4Tm9ybWFsLmEgPSBzcmNWZXJ0ZXhOb3JtYWwuYS5jbG9uZSgpO1xuXHRcdFx0XHRcdGRlc3RWZXJ0ZXhOb3JtYWwuYiA9IHNyY1ZlcnRleE5vcm1hbC5iLmNsb25lKCk7XG5cdFx0XHRcdFx0ZGVzdFZlcnRleE5vcm1hbC5jID0gc3JjVmVydGV4Tm9ybWFsLmMuY2xvbmUoKTtcblxuXHRcdFx0XHRcdG1vcnBoTm9ybWFsLnZlcnRleE5vcm1hbHMucHVzaCggZGVzdFZlcnRleE5vcm1hbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmYWNlIG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoTm9ybWFsLmZhY2VOb3JtYWxzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaE5vcm1hbC5mYWNlTm9ybWFscy5wdXNoKCBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFsc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaE5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWwgKTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW4gd2VpZ2h0c1xuXG5cdFx0dmFyIHNraW5XZWlnaHRzID0gc291cmNlLnNraW5XZWlnaHRzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gc2tpbldlaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuc2tpbldlaWdodHMucHVzaCggc2tpbldlaWdodHNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBza2luIGluZGljZXNcblxuXHRcdHZhciBza2luSW5kaWNlcyA9IHNvdXJjZS5za2luSW5kaWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNraW5JbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnNraW5JbmRpY2VzLnB1c2goIHNraW5JbmRpY2VzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbGluZSBkaXN0YW5jZXNcblxuXHRcdHZhciBsaW5lRGlzdGFuY2VzID0gc291cmNlLmxpbmVEaXN0YW5jZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBsaW5lRGlzdGFuY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmxpbmVEaXN0YW5jZXMucHVzaCggbGluZURpc3RhbmNlc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBib3hcblxuXHRcdHZhciBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDtcblxuXHRcdGlmICggYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgc3BoZXJlXG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBmbGFnc1xuXG5cdFx0dGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBzb3VyY2UuZWxlbWVudHNOZWVkVXBkYXRlO1xuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gc291cmNlLnZlcnRpY2VzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnV2c05lZWRVcGRhdGUgPSBzb3VyY2UudXZzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gc291cmNlLm5vcm1hbHNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IHNvdXJjZS5jb2xvcnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBzb3VyY2UubGluZURpc3RhbmNlc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gc291cmNlLmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IEdlb21ldHJ5IH07XG4iLCJpbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0LmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xuXG5cdH1cblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcblx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyBpdGVtU2l6ZSA6IDA7XG5cdHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7XG5cblx0dGhpcy5keW5hbWljID0gZmFsc2U7XG5cdHRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9O1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGlzQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdG9uVXBsb2FkQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHNldEFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHRoaXMuaXRlbVNpemUgOiAwO1xuXHRcdHRoaXMuYXJyYXkgPSBhcnJheTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RHluYW1pYzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZHluYW1pYyA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXHRcdHRoaXMuYXJyYXkgPSBuZXcgc291cmNlLmFycmF5LmNvbnN0cnVjdG9yKCBzb3VyY2UuYXJyYXkgKTtcblx0XHR0aGlzLml0ZW1TaXplID0gc291cmNlLml0ZW1TaXplO1xuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XG5cdFx0dGhpcy5ub3JtYWxpemVkID0gc291cmNlLm5vcm1hbGl6ZWQ7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSBzb3VyY2UuZHluYW1pYztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUF0OiBmdW5jdGlvbiAoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIgKSB7XG5cblx0XHRpbmRleDEgKj0gdGhpcy5pdGVtU2l6ZTtcblx0XHRpbmRleDIgKj0gYXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5pdGVtU2l6ZTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHR0aGlzLmFycmF5LnNldCggYXJyYXkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUNvbG9yc0FycmF5OiBmdW5jdGlvbiAoIGNvbG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGNvbG9yID0gY29sb3JzWyBpIF07XG5cblx0XHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCk6IGNvbG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0Y29sb3IgPSBuZXcgQ29sb3IoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5yO1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IuZztcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLmI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlWZWN0b3Iyc0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yMnNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlWZWN0b3Izc0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IuejtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjRzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07XG5cblx0XHRcdGlmICggdmVjdG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdHZlY3RvciA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCBpbmRleCwgeCApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WTogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxIF07XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIGluZGV4LCB5ICkge1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WjogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF07XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIGluZGV4LCB6ICkge1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0VzogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAzIF07XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIGluZGV4LCB3ICkge1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFk6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHkgKSB7XG5cblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVpXOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25VcGxvYWQ6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5hcnJheSwgdGhpcy5pdGVtU2l6ZSApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gSW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhDbGFtcGVkQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gSW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MTZCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDMyQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5GbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBGbG9hdDY0QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDY0QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5GbG9hdDY0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU7XG5cbi8vXG5cbmV4cG9ydCB7XG5cdEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUsXG5cdEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUsXG5cdFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSxcblx0SW50MzJCdWZmZXJBdHRyaWJ1dGUsXG5cdFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSxcblx0SW50MTZCdWZmZXJBdHRyaWJ1dGUsXG5cdFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSxcblx0VWludDhCdWZmZXJBdHRyaWJ1dGUsXG5cdEludDhCdWZmZXJBdHRyaWJ1dGUsXG5cdEJ1ZmZlckF0dHJpYnV0ZVxufTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcblxuZnVuY3Rpb24gRGlyZWN0R2VvbWV0cnkoKSB7XG5cblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLm5vcm1hbHMgPSBbXTtcblx0dGhpcy5jb2xvcnMgPSBbXTtcblx0dGhpcy51dnMgPSBbXTtcblx0dGhpcy51dnMyID0gW107XG5cblx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHt9O1xuXG5cdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXG5cdC8vIHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHQvLyB1cGRhdGUgZmxhZ3NcblxuXHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRGlyZWN0R2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0Y29tcHV0ZUdyb3VwczogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBncm91cDtcblx0XHR2YXIgZ3JvdXBzID0gW107XG5cdFx0dmFyIG1hdGVyaWFsSW5kZXggPSB1bmRlZmluZWQ7XG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHQvLyBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmYWNlLm1hdGVyaWFsSW5kZXggIT09IG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRncm91cC5jb3VudCA9ICggaSAqIDMgKSAtIGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHRcdGdyb3Vwcy5wdXNoKCBncm91cCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRncm91cCA9IHtcblx0XHRcdFx0XHRzdGFydDogaSAqIDMsXG5cdFx0XHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleFxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRncm91cHMucHVzaCggZ3JvdXAgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuZ3JvdXBzID0gZ3JvdXBzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzO1xuXG5cdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IGZhY2VWZXJ0ZXhVdnNbIDAgXSAmJiBmYWNlVmVydGV4VXZzWyAwIF0ubGVuZ3RoID4gMDtcblx0XHR2YXIgaGFzRmFjZVZlcnRleFV2MiA9IGZhY2VWZXJ0ZXhVdnNbIDEgXSAmJiBmYWNlVmVydGV4VXZzWyAxIF0ubGVuZ3RoID4gMDtcblxuXHRcdC8vIG1vcnBoc1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHR2YXIgbW9ycGhUYXJnZXRzTGVuZ3RoID0gbW9ycGhUYXJnZXRzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNQb3NpdGlvbjtcblxuXHRcdGlmICggbW9ycGhUYXJnZXRzTGVuZ3RoID4gMCApIHtcblxuXHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb24gPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbW9ycGhUYXJnZXRzTGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c1Bvc2l0aW9uWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5wb3NpdGlvbiA9IG1vcnBoVGFyZ2V0c1Bvc2l0aW9uO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lm1vcnBoTm9ybWFscztcblx0XHR2YXIgbW9ycGhOb3JtYWxzTGVuZ3RoID0gbW9ycGhOb3JtYWxzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHRpZiAoIG1vcnBoTm9ybWFsc0xlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbCA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWwgPSBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHR9XG5cblx0XHQvLyBza2luc1xuXG5cdFx0dmFyIHNraW5JbmRpY2VzID0gZ2VvbWV0cnkuc2tpbkluZGljZXM7XG5cdFx0dmFyIHNraW5XZWlnaHRzID0gZ2VvbWV0cnkuc2tpbldlaWdodHM7XG5cblx0XHR2YXIgaGFzU2tpbkluZGljZXMgPSBza2luSW5kaWNlcy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblx0XHR2YXIgaGFzU2tpbldlaWdodHMgPSBza2luV2VpZ2h0cy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdC8vXG5cblx0XHRpZiAoIHZlcnRpY2VzLmxlbmd0aCA+IDAgJiYgZmFjZXMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRGlyZWN0R2VvbWV0cnk6IEZhY2VsZXNzIGdlb21ldHJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuJyApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZmFjZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggdmVydGljZXNbIGZhY2UuYSBdLCB2ZXJ0aWNlc1sgZmFjZS5iIF0sIHZlcnRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR0aGlzLm5vcm1hbHMucHVzaCggdmVydGV4Tm9ybWFsc1sgMCBdLCB2ZXJ0ZXhOb3JtYWxzWyAxIF0sIHZlcnRleE5vcm1hbHNbIDIgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBub3JtYWwgPSBmYWNlLm5vcm1hbDtcblxuXHRcdFx0XHR0aGlzLm5vcm1hbHMucHVzaCggbm9ybWFsLCBub3JtYWwsIG5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhDb2xvcnMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHRoaXMuY29sb3JzLnB1c2goIHZlcnRleENvbG9yc1sgMCBdLCB2ZXJ0ZXhDb2xvcnNbIDEgXSwgdmVydGV4Q29sb3JzWyAyIF0gKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgY29sb3IgPSBmYWNlLmNvbG9yO1xuXG5cdFx0XHRcdHRoaXMuY29sb3JzLnB1c2goIGNvbG9yLCBjb2xvciwgY29sb3IgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4VXZzID0gZmFjZVZlcnRleFV2c1sgMCBdWyBpIF07XG5cblx0XHRcdFx0aWYgKCB2ZXJ0ZXhVdnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMudXZzLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdiAnLCBpICk7XG5cblx0XHRcdFx0XHR0aGlzLnV2cy5wdXNoKCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2MiA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4VXZzID0gZmFjZVZlcnRleFV2c1sgMSBdWyBpIF07XG5cblx0XHRcdFx0aWYgKCB2ZXJ0ZXhVdnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMudXZzMi5wdXNoKCB2ZXJ0ZXhVdnNbIDAgXSwgdmVydGV4VXZzWyAxIF0sIHZlcnRleFV2c1sgMiBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYyICcsIGkgKTtcblxuXHRcdFx0XHRcdHRoaXMudXZzMi5wdXNoKCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG1vcnBoc1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBtb3JwaFRhcmdldHNMZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBqIF0udmVydGljZXM7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb25bIGogXS5wdXNoKCBtb3JwaFRhcmdldFsgZmFjZS5hIF0sIG1vcnBoVGFyZ2V0WyBmYWNlLmIgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYyBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgbW9ycGhOb3JtYWxzTGVuZ3RoOyBqICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaiBdLnZlcnRleE5vcm1hbHNbIGkgXTtcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNOb3JtYWxbIGogXS5wdXNoKCBtb3JwaE5vcm1hbC5hLCBtb3JwaE5vcm1hbC5iLCBtb3JwaE5vcm1hbC5jICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc2tpbnNcblxuXHRcdFx0aWYgKCBoYXNTa2luSW5kaWNlcyApIHtcblxuXHRcdFx0XHR0aGlzLnNraW5JbmRpY2VzLnB1c2goIHNraW5JbmRpY2VzWyBmYWNlLmEgXSwgc2tpbkluZGljZXNbIGZhY2UuYiBdLCBza2luSW5kaWNlc1sgZmFjZS5jIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc1NraW5XZWlnaHRzICkge1xuXG5cdFx0XHRcdHRoaXMuc2tpbldlaWdodHMucHVzaCggc2tpbldlaWdodHNbIGZhY2UuYSBdLCBza2luV2VpZ2h0c1sgZmFjZS5iIF0sIHNraW5XZWlnaHRzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvbXB1dGVHcm91cHMoIGdlb21ldHJ5ICk7XG5cblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnV2c05lZWRVcGRhdGUgPSBnZW9tZXRyeS51dnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBEaXJlY3RHZW9tZXRyeSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIGFycmF5TWluKCBhcnJheSApIHtcblxuXHRpZiAoIGFycmF5Lmxlbmd0aCA9PT0gMCApIHJldHVybiBJbmZpbml0eTtcblxuXHR2YXIgbWluID0gYXJyYXlbIDAgXTtcblxuXHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyArKyBpICkge1xuXG5cdFx0aWYgKCBhcnJheVsgaSBdIDwgbWluICkgbWluID0gYXJyYXlbIGkgXTtcblxuXHR9XG5cblx0cmV0dXJuIG1pbjtcblxufVxuXG5mdW5jdGlvbiBhcnJheU1heCggYXJyYXkgKSB7XG5cblx0aWYgKCBhcnJheS5sZW5ndGggPT09IDAgKSByZXR1cm4gLSBJbmZpbml0eTtcblxuXHR2YXIgbWF4ID0gYXJyYXlbIDAgXTtcblxuXHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyArKyBpICkge1xuXG5cdFx0aWYgKCBhcnJheVsgaSBdID4gbWF4ICkgbWF4ID0gYXJyYXlbIGkgXTtcblxuXHR9XG5cblx0cmV0dXJuIG1heDtcblxufVxuXG5leHBvcnQgeyBhcnJheU1pbiwgYXJyYXlNYXggfTtcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgQm94MyB9IGZyb20gJy4uL21hdGgvQm94My5qcyc7XG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuL0V2ZW50RGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUsIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUsIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgVWludDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUuanMnO1xuaW1wb3J0IHsgRGlyZWN0R2VvbWV0cnkgfSBmcm9tICcuL0RpcmVjdEdlb21ldHJ5LmpzJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi9PYmplY3QzRC5qcyc7XG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcbmltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuLi9tYXRoL01hdHJpeDMuanMnO1xuaW1wb3J0IHsgX01hdGggfSBmcm9tICcuLi9tYXRoL01hdGguanMnO1xuaW1wb3J0IHsgYXJyYXlNYXggfSBmcm9tICcuLi91dGlscy5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIGJ1ZmZlckdlb21ldHJ5SWQgPSAxOyAvLyBCdWZmZXJHZW9tZXRyeSB1c2VzIG9kZCBudW1iZXJzIGFzIElkXG5cbmZ1bmN0aW9uIEJ1ZmZlckdlb21ldHJ5KCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogYnVmZmVyR2VvbWV0cnlJZCArPSAyIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLmluZGV4ID0gbnVsbDtcblx0dGhpcy5hdHRyaWJ1dGVzID0ge307XG5cblx0dGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTtcblxuXHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHR0aGlzLmRyYXdSYW5nZSA9IHsgc3RhcnQ6IDAsIGNvdW50OiBJbmZpbml0eSB9O1xuXG5cdHRoaXMudXNlckRhdGEgPSB7fTtcblxufVxuXG5CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQnVmZmVyR2VvbWV0cnksXG5cblx0aXNCdWZmZXJHZW9tZXRyeTogdHJ1ZSxcblxuXHRnZXRJbmRleDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuaW5kZXg7XG5cblx0fSxcblxuXHRzZXRJbmRleDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggaW5kZXggKSApIHtcblxuXHRcdFx0dGhpcy5pbmRleCA9IG5ldyAoIGFycmF5TWF4KCBpbmRleCApID4gNjU1MzUgPyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgOiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgKSggaW5kZXgsIDEgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuaW5kZXggPSBpbmRleDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGFkZEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lLCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRpZiAoICEgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzQnVmZmVyQXR0cmlidXRlICkgJiYgISAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0cmlidXRlICkuJyApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFyZ3VtZW50c1sgMSBdLCBhcmd1bWVudHNbIDIgXSApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG5hbWUgPT09ICdpbmRleCcgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmFkZEF0dHJpYnV0ZTogVXNlIC5zZXRJbmRleCgpIGZvciBpbmRleCBhdHRyaWJ1dGUuJyApO1xuXHRcdFx0dGhpcy5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gPSBhdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdH0sXG5cblx0cmVtb3ZlQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRkZWxldGUgdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHRoaXMuZ3JvdXBzLnB1c2goIHtcblxuXHRcdFx0c3RhcnQ6IHN0YXJ0LFxuXHRcdFx0Y291bnQ6IGNvdW50LFxuXHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDBcblxuXHRcdH0gKTtcblxuXHR9LFxuXG5cdGNsZWFyR3JvdXBzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdH0sXG5cblx0c2V0RHJhd1JhbmdlOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XG5cdFx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHR2YXIgbm9ybWFsID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdGlmICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRcdG5vcm1hbE1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBub3JtYWwgKTtcblx0XHRcdG5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25YKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeS1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2NhbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHNjYWxlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNjYWxlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlU2NhbGUoIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmogPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIHZlY3RvciApIHtcblxuXHRcdFx0b2JqLmxvb2tBdCggdmVjdG9yICk7XG5cblx0XHRcdG9iai51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggb2JqLm1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjZW50ZXIoKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBvZmZzZXQgKS5uZWdhdGUoKTtcblxuXHRcdFx0dGhpcy50cmFuc2xhdGUoIG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnogKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuc2V0RnJvbU9iamVjdCgpLiBDb252ZXJ0aW5nJywgb2JqZWN0LCB0aGlzICk7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iamVjdC5pc1BvaW50cyB8fCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMsIDMgKTtcblx0XHRcdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMsIDMgKTtcblxuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucy5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKSApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIGNvbG9ycy5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApICk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlcyAmJiBnZW9tZXRyeS5saW5lRGlzdGFuY2VzLmxlbmd0aCA9PT0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMubGVuZ3RoLCAxICk7XG5cblx0XHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBsaW5lRGlzdGFuY2VzLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dGhpcy5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdHBvc2l0aW9uLnB1c2goIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgMyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZUZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHR2YXIgZGlyZWN0ID0gZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0ZGlyZWN0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRpcmVjdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkaXJlY3QudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0Lm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Z2VvbWV0cnkgPSBkaXJlY3Q7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkubm9ybWFscyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5jb2xvcjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy51djtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2U7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVHcm91cHMoIG9iamVjdC5nZW9tZXRyeSApO1xuXHRcdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Z2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSA9IG5ldyBEaXJlY3RHZW9tZXRyeSgpLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdHJldHVybiB0aGlzLmZyb21EaXJlY3RHZW9tZXRyeSggZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSApO1xuXG5cdH0sXG5cblx0ZnJvbURpcmVjdEdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMgKTtcblx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICkgKTtcblxuXHRcdGlmICggZ2VvbWV0cnkubm9ybWFscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMubGVuZ3RoICogMyApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5jb2xvcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS51dnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnV2cy5sZW5ndGggKiAyICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2czIubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2czIgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS51dnMyLmxlbmd0aCAqIDIgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAndXYyJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzMiwgMiApLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMyICkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHQvLyBtb3JwaHNcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXG5cdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhUYXJnZXQubGVuZ3RoICogMywgMyApO1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggbW9ycGhUYXJnZXQgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nXG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luSW5kaWNlcyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5JbmRleCcsIHNraW5JbmRpY2VzLmNvcHlWZWN0b3I0c0FycmF5KCBnZW9tZXRyeS5za2luSW5kaWNlcyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luV2VpZ2h0cyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnLCBza2luV2VpZ2h0cy5jb3B5VmVjdG9yNHNBcnJheSggZ2VvbWV0cnkuc2tpbldlaWdodHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnggKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueSApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi56ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3g6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgXCJwb3NpdGlvblwiIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkge1xuXG5cdFx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGlmICggcG9zaXRpb24gKSB7XG5cblx0XHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXG5cdFx0XHRcdGJveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXHRcdFx0XHRib3guZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0XHQvLyBob3BpbmcgdG8gZmluZCBhIGJvdW5kaW5nU3BoZXJlIHdpdGggYSByYWRpdXMgc21hbGxlciB0aGFuIHRoZVxuXHRcdFx0XHQvLyBib3VuZGluZ1NwaGVyZSBvZiB0aGUgYm91bmRpbmdCb3g6IHNxcnQoMykgc21hbGxlciBpbiB0aGUgYmVzdCBjYXNlXG5cblx0XHRcdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb24uY291bnQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlY3Rvci54ID0gcG9zaXRpb24uZ2V0WCggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci55ID0gcG9zaXRpb24uZ2V0WSggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci56ID0gcG9zaXRpb24uZ2V0WiggaSApO1xuXHRcdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHZlY3RvciApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0XHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzICkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29tcHV0ZUZhY2VOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cdFx0dmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb25zLmxlbmd0aCApLCAzICkgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyByZXNldCBleGlzdGluZyBub3JtYWxzIHRvIHplcm9cblxuXHRcdFx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheVsgaSBdID0gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgcEEgPSBuZXcgVmVjdG9yMygpLCBwQiA9IG5ldyBWZWN0b3IzKCksIHBDID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Ly8gaW5kZXhlZCBlbGVtZW50c1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXG5cdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0aWYgKCBncm91cHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5hZGRHcm91cCggMCwgaW5kaWNlcy5sZW5ndGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGdyb3Vwcy5sZW5ndGg7IGogPCBqbDsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaiBdO1xuXG5cdFx0XHRcdFx0dmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdFx0dmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IHN0YXJ0LCBpbCA9IHN0YXJ0ICsgY291bnQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHR2QSA9IGluZGljZXNbIGkgKyAwIF0gKiAzO1xuXHRcdFx0XHRcdFx0dkIgPSBpbmRpY2VzWyBpICsgMSBdICogMztcblx0XHRcdFx0XHRcdHZDID0gaW5kaWNlc1sgaSArIDIgXSAqIDM7XG5cblx0XHRcdFx0XHRcdHBBLmZyb21BcnJheSggcG9zaXRpb25zLCB2QSApO1xuXHRcdFx0XHRcdFx0cEIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZCICk7XG5cdFx0XHRcdFx0XHRwQy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkMgKTtcblxuXHRcdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcblx0XHRcdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSBdICs9IGNiLng7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSArIDEgXSArPSBjYi55O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkEgKyAyIF0gKz0gY2IuejtcblxuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgXSArPSBjYi54O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgKyAxIF0gKz0gY2IueTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZCICsgMiBdICs9IGNiLno7XG5cblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDIF0gKz0gY2IueDtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDICsgMSBdICs9IGNiLnk7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QyArIDIgXSArPSBjYi56O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBub24taW5kZXhlZCBlbGVtZW50cyAodW5jb25uZWN0ZWQgdHJpYW5nbGUgc291cClcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlsOyBpICs9IDkgKSB7XG5cblx0XHRcdFx0XHRwQS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSApO1xuXHRcdFx0XHRcdHBCLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgMyApO1xuXHRcdFx0XHRcdHBDLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgNiApO1xuXG5cdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XG5cdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpIF0gPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAxIF0gPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAyIF0gPSBjYi56O1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDMgXSA9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDQgXSA9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDUgXSA9IGNiLno7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNiBdID0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNyBdID0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgOCBdID0gY2IuejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7XG5cblx0XHRcdGF0dHJpYnV0ZXMubm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQnVmZmVyR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cblx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0J1RIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXQ9MC4gJ1xuXHRcdFx0XHQrICdVc2UgQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoKSBmb3IgbG9zc2xlc3MgbWVyZ2UuJ1xuXHRcdFx0KTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZTEgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciBhdHRyaWJ1dGVBcnJheTEgPSBhdHRyaWJ1dGUxLmFycmF5O1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlMiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdO1xuXHRcdFx0dmFyIGF0dHJpYnV0ZUFycmF5MiA9IGF0dHJpYnV0ZTIuYXJyYXk7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGVTaXplID0gYXR0cmlidXRlMi5pdGVtU2l6ZTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gYXR0cmlidXRlU2l6ZSAqIG9mZnNldDsgaSA8IGF0dHJpYnV0ZUFycmF5Mi5sZW5ndGg7IGkgKyssIGogKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlQXJyYXkxWyBqIF0gPSBhdHRyaWJ1dGVBcnJheTJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRub3JtYWxpemVOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBub3JtYWxpemVOb3JtYWxzKCkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBub3JtYWxzLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVjdG9yLnggPSBub3JtYWxzLmdldFgoIGkgKTtcblx0XHRcdFx0dmVjdG9yLnkgPSBub3JtYWxzLmdldFkoIGkgKTtcblx0XHRcdFx0dmVjdG9yLnogPSBub3JtYWxzLmdldFooIGkgKTtcblxuXHRcdFx0XHR2ZWN0b3Iubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0bm9ybWFscy5zZXRYWVooIGksIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dG9Ob25JbmRleGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGljZXMgPSB0aGlzLmluZGV4LmFycmF5O1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdFx0dmFyIGl0ZW1TaXplID0gYXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0XHR2YXIgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0ZW1TaXplICk7XG5cblx0XHRcdHZhciBpbmRleCA9IDAsIGluZGV4MiA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNbIGkgXSAqIGl0ZW1TaXplO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGl0ZW1TaXplOyBqICsrICkge1xuXG5cdFx0XHRcdFx0YXJyYXkyWyBpbmRleDIgKysgXSA9IGFycmF5WyBpbmRleCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeTIuYWRkQXR0cmlidXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheTIsIGl0ZW1TaXplICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdGdlb21ldHJ5Mi5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnkyO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0J1ZmZlckdlb21ldHJ5Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQnVmZmVyR2VvbWV0cnkudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBCdWZmZXJHZW9tZXRyeSBzZXJpYWxpemF0aW9uXG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblx0XHRpZiAoIE9iamVjdC5rZXlzKCB0aGlzLnVzZXJEYXRhICkubGVuZ3RoID4gMCApIGRhdGEudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXG5cdFx0fVxuXG5cdFx0ZGF0YS5kYXRhID0geyBhdHRyaWJ1dGVzOiB7fSB9O1xuXG5cdFx0dmFyIGluZGV4ID0gdGhpcy5pbmRleDtcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBpbmRleC5hcnJheSApO1xuXG5cdFx0XHRkYXRhLmRhdGEuaW5kZXggPSB7XG5cdFx0XHRcdHR5cGU6IGluZGV4LmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRcdGFycmF5OiBhcnJheVxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07XG5cblx0XHRcdHZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhdHRyaWJ1dGUuYXJyYXkgKTtcblxuXHRcdFx0ZGF0YS5kYXRhLmF0dHJpYnV0ZXNbIGtleSBdID0ge1xuXHRcdFx0XHRpdGVtU2l6ZTogYXR0cmlidXRlLml0ZW1TaXplLFxuXHRcdFx0XHR0eXBlOiBhdHRyaWJ1dGUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxcblx0XHRcdFx0YXJyYXk6IGFycmF5LFxuXHRcdFx0XHRub3JtYWxpemVkOiBhdHRyaWJ1dGUubm9ybWFsaXplZFxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGRhdGEuZGF0YS5ncm91cHMgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggZ3JvdXBzICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHRoaXMuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHRkYXRhLmRhdGEuYm91bmRpbmdTcGhlcmUgPSB7XG5cdFx0XHRcdGNlbnRlcjogYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxcblx0XHRcdFx0cmFkaXVzOiBib3VuZGluZ1NwaGVyZS5yYWRpdXNcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvKlxuXHRcdCAvLyBIYW5kbGUgcHJpbWl0aXZlc1xuXG5cdFx0IHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0IGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0IHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdCBmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHQgdmFsdWVzLnB1c2goIHBhcmFtZXRlcnNbIGtleSBdICk7XG5cblx0XHQgfVxuXG5cdFx0IHZhciBnZW9tZXRyeSA9IE9iamVjdC5jcmVhdGUoIHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlICk7XG5cdFx0IHRoaXMuY29uc3RydWN0b3IuYXBwbHkoIGdlb21ldHJ5LCB2YWx1ZXMgKTtcblx0XHQgcmV0dXJuIGdlb21ldHJ5O1xuXG5cdFx0IH1cblxuXHRcdCByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cdFx0ICovXG5cblx0XHRyZXR1cm4gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR2YXIgbmFtZSwgaSwgbDtcblxuXHRcdC8vIHJlc2V0XG5cblx0XHR0aGlzLmluZGV4ID0gbnVsbDtcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcblx0XHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXHRcdHRoaXMuZ3JvdXBzID0gW107XG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0XHQvLyBuYW1lXG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdC8vIGluZGV4XG5cblx0XHR2YXIgaW5kZXggPSBzb3VyY2UuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnNldEluZGV4KCBpbmRleC5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBhdHRyaWJ1dGVzXG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHNvdXJjZS5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCBhdHRyaWJ1dGVzXG5cblx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gc291cmNlLm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBbXTtcblx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdOyAvLyBtb3JwaEF0dHJpYnV0ZTogYXJyYXkgb2YgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZXNcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIG1vcnBoQXR0cmlidXRlWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcblxuXHRcdH1cblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0dmFyIGdyb3VwcyA9IHNvdXJjZS5ncm91cHM7XG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdHRoaXMuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgYm94XG5cblx0XHR2YXIgYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3g7XG5cblx0XHRpZiAoIGJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIHNwaGVyZVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBkcmF3IHJhbmdlXG5cblx0XHR0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHNvdXJjZS5kcmF3UmFuZ2Uuc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBzb3VyY2UuZHJhd1JhbmdlLmNvdW50O1xuXG5cdFx0Ly8gdXNlciBkYXRhXG5cblx0XHR0aGlzLnVzZXJEYXRhID0gc291cmNlLnVzZXJEYXRhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcblxuLy8gQm94R2VvbWV0cnlcblxuZnVuY3Rpb24gQm94R2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBCb3hCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQm94R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Cb3hHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hHZW9tZXRyeTtcblxuLy8gQm94QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR3aWR0aCA9IHdpZHRoIHx8IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXHRkZXB0aCA9IGRlcHRoIHx8IDE7XG5cblx0Ly8gc2VnbWVudHNcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXHRkZXB0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggZGVwdGhTZWdtZW50cyApIHx8IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBudW1iZXJPZlZlcnRpY2VzID0gMDtcblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXG5cdC8vIGJ1aWxkIGVhY2ggc2lkZSBvZiB0aGUgYm94IGdlb21ldHJ5XG5cblx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweFxuXHRidWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIC0gd2lkdGgsIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAxICk7IC8vIG54XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIDEsIHdpZHRoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAyICk7IC8vIHB5XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMyApOyAvLyBueVxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgNCApOyAvLyBwelxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAtIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgLSBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDUgKTsgLy8gbnpcblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0ZnVuY3Rpb24gYnVpbGRQbGFuZSggdSwgdiwgdywgdWRpciwgdmRpciwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdyaWRYLCBncmlkWSwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHZhciBzZWdtZW50V2lkdGggPSB3aWR0aCAvIGdyaWRYO1xuXHRcdHZhciBzZWdtZW50SGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XG5cblx0XHR2YXIgd2lkdGhIYWxmID0gd2lkdGggLyAyO1xuXHRcdHZhciBoZWlnaHRIYWxmID0gaGVpZ2h0IC8gMjtcblx0XHR2YXIgZGVwdGhIYWxmID0gZGVwdGggLyAyO1xuXG5cdFx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0XHR2YXIgZ3JpZFkxID0gZ3JpZFkgKyAxO1xuXG5cdFx0dmFyIHZlcnRleENvdW50ZXIgPSAwO1xuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdHZhciBpeCwgaXk7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0XHR2YXIgeSA9IGl5ICogc2VnbWVudEhlaWdodCAtIGhlaWdodEhhbGY7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xuXG5cdFx0XHRcdHZhciB4ID0gaXggKiBzZWdtZW50V2lkdGggLSB3aWR0aEhhbGY7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IHggKiB1ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHYgXSA9IHkgKiB2ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoSGFsZjtcblxuXHRcdFx0XHQvLyBub3cgYXBwbHkgdmVjdG9yIHRvIHZlcnRleCBidWZmZXJcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IDA7XG5cdFx0XHRcdHZlY3RvclsgdiBdID0gMDtcblx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aCA+IDAgPyAxIDogLSAxO1xuXG5cdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gbm9ybWFsIGJ1ZmZlclxuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdC8vIHV2c1xuXG5cdFx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHRcdHV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTtcblxuXHRcdFx0XHQvLyBjb3VudGVyc1xuXG5cdFx0XHRcdHZlcnRleENvdW50ZXIgKz0gMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gaW5kaWNlc1xuXG5cdFx0Ly8gMS4geW91IG5lZWQgdGhyZWUgaW5kaWNlcyB0byBkcmF3IGEgc2luZ2xlIGZhY2Vcblx0XHQvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlc1xuXHRcdC8vIDMuIHNvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgc2l4ICgyKjMpIGluZGljZXMgcGVyIHNlZ21lbnRcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdFx0dmFyIGIgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHR2YXIgYyA9IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0dmFyIGQgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHRcdC8vIGluY3JlYXNlIGNvdW50ZXJcblxuXHRcdFx0XHRncm91cENvdW50ICs9IDY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0XHQvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzXG5cblx0XHRudW1iZXJPZlZlcnRpY2VzICs9IHZlcnRleENvdW50ZXI7XG5cblx0fVxuXG59XG5cbkJveEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94QnVmZmVyR2VvbWV0cnk7XG5cblxuZXhwb3J0IHsgQm94R2VvbWV0cnksIEJveEJ1ZmZlckdlb21ldHJ5IH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9HZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcblxuLy8gUGxhbmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUGxhbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBsYW5lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVHZW9tZXRyeTtcblxuLy8gUGxhbmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR3aWR0aCA9IHdpZHRoIHx8IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXG5cdHZhciB3aWR0aF9oYWxmID0gd2lkdGggLyAyO1xuXHR2YXIgaGVpZ2h0X2hhbGYgPSBoZWlnaHQgLyAyO1xuXG5cdHZhciBncmlkWCA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCAxO1xuXHR2YXIgZ3JpZFkgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cblx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0dmFyIGdyaWRZMSA9IGdyaWRZICsgMTtcblxuXHR2YXIgc2VnbWVudF93aWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdHZhciBzZWdtZW50X2hlaWdodCA9IGhlaWdodCAvIGdyaWRZO1xuXG5cdHZhciBpeCwgaXk7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0dmFyIHkgPSBpeSAqIHNlZ21lbnRfaGVpZ2h0IC0gaGVpZ2h0X2hhbGY7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIHggPSBpeCAqIHNlZ21lbnRfd2lkdGggLSB3aWR0aF9oYWxmO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAtIHksIDAgKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBpeCArIGdyaWRYMSAqIGl5O1xuXHRcdFx0dmFyIGIgPSBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHR2YXIgYyA9ICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0dmFyIGQgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogaXk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5QbGFuZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGxhbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUJ1ZmZlckdlb21ldHJ5O1xuXG5cbmV4cG9ydCB7IFBsYW5lR2VvbWV0cnksIFBsYW5lQnVmZmVyR2VvbWV0cnkgfTtcbiIsImltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uL2NvcmUvRXZlbnREaXNwYXRjaGVyLmpzJztcbmltcG9ydCB7IE5vQ29sb3JzLCBGcm9udFNpZGUsIEZsYXRTaGFkaW5nLCBOb3JtYWxCbGVuZGluZywgTGVzc0VxdWFsRGVwdGgsIEFkZEVxdWF0aW9uLCBPbmVNaW51c1NyY0FscGhhRmFjdG9yLCBTcmNBbHBoYUZhY3RvciB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBfTWF0aCB9IGZyb20gJy4uL21hdGgvTWF0aC5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxudmFyIG1hdGVyaWFsSWQgPSAwO1xuXG5mdW5jdGlvbiBNYXRlcmlhbCgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IG1hdGVyaWFsSWQgKysgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZm9nID0gdHJ1ZTtcblx0dGhpcy5saWdodHMgPSB0cnVlO1xuXG5cdHRoaXMuYmxlbmRpbmcgPSBOb3JtYWxCbGVuZGluZztcblx0dGhpcy5zaWRlID0gRnJvbnRTaWRlO1xuXHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XG5cdHRoaXMudmVydGV4Q29sb3JzID0gTm9Db2xvcnM7IC8vIFRIUkVFLk5vQ29sb3JzLCBUSFJFRS5WZXJ0ZXhDb2xvcnMsIFRIUkVFLkZhY2VDb2xvcnNcblxuXHR0aGlzLm9wYWNpdHkgPSAxO1xuXHR0aGlzLnRyYW5zcGFyZW50ID0gZmFsc2U7XG5cblx0dGhpcy5ibGVuZFNyYyA9IFNyY0FscGhhRmFjdG9yO1xuXHR0aGlzLmJsZW5kRHN0ID0gT25lTWludXNTcmNBbHBoYUZhY3Rvcjtcblx0dGhpcy5ibGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247XG5cdHRoaXMuYmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdHRoaXMuYmxlbmREc3RBbHBoYSA9IG51bGw7XG5cdHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblxuXHR0aGlzLmRlcHRoRnVuYyA9IExlc3NFcXVhbERlcHRoO1xuXHR0aGlzLmRlcHRoVGVzdCA9IHRydWU7XG5cdHRoaXMuZGVwdGhXcml0ZSA9IHRydWU7XG5cblx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IG51bGw7XG5cdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IGZhbHNlO1xuXHR0aGlzLmNsaXBTaGFkb3dzID0gZmFsc2U7XG5cblx0dGhpcy5zaGFkb3dTaWRlID0gbnVsbDtcblxuXHR0aGlzLmNvbG9yV3JpdGUgPSB0cnVlO1xuXG5cdHRoaXMucHJlY2lzaW9uID0gbnVsbDsgLy8gb3ZlcnJpZGUgdGhlIHJlbmRlcmVyJ3MgZGVmYXVsdCBwcmVjaXNpb24gZm9yIHRoaXMgbWF0ZXJpYWxcblxuXHR0aGlzLnBvbHlnb25PZmZzZXQgPSBmYWxzZTtcblx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gMDtcblx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSAwO1xuXG5cdHRoaXMuZGl0aGVyaW5nID0gZmFsc2U7XG5cblx0dGhpcy5hbHBoYVRlc3QgPSAwO1xuXHR0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlO1xuXG5cdHRoaXMub3ZlcmRyYXcgPSAwOyAvLyBPdmVyZHJhd24gcGl4ZWxzICh0eXBpY2FsbHkgYmV0d2VlbiAwIGFuZCAxKSBmb3IgZml4aW5nIGFudGlhbGlhc2luZyBnYXBzIGluIENhbnZhc1JlbmRlcmVyXG5cblx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcblxuXHR0aGlzLnVzZXJEYXRhID0ge307XG5cblx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cbn1cblxuTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE1hdGVyaWFsLFxuXG5cdGlzTWF0ZXJpYWw6IHRydWUsXG5cblx0b25CZWZvcmVDb21waWxlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRzZXRWYWx1ZXM6IGZ1bmN0aW9uICggdmFsdWVzICkge1xuXG5cdFx0aWYgKCB2YWx1ZXMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gdmFsdWVzICkge1xuXG5cdFx0XHR2YXIgbmV3VmFsdWUgPSB2YWx1ZXNbIGtleSBdO1xuXG5cdFx0XHRpZiAoIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdGVyaWFsOiAnXCIgKyBrZXkgKyBcIicgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC5cIiApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eSBpZiBzaGFkaW5nIGlzIHNldCBpbiB0aGUgY29uc3RydWN0b3Jcblx0XHRcdGlmICgga2V5ID09PSAnc2hhZGluZycgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cdFx0XHRcdHRoaXMuZmxhdFNoYWRpbmcgPSAoIG5ld1ZhbHVlID09PSBGbGF0U2hhZGluZyApID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY3VycmVudFZhbHVlID0gdGhpc1sga2V5IF07XG5cblx0XHRcdGlmICggY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLlwiICsgdGhpcy50eXBlICsgXCI6ICdcIiArIGtleSArIFwiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIG1hdGVyaWFsLlwiICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc0NvbG9yICkge1xuXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5zZXQoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc1ZlY3RvcjMgKSAmJiAoIG5ld1ZhbHVlICYmIG5ld1ZhbHVlLmlzVmVjdG9yMyApICkge1xuXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5jb3B5KCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBrZXkgPT09ICdvdmVyZHJhdycgKSB7XG5cblx0XHRcdFx0Ly8gZW5zdXJlIG92ZXJkcmF3IGlzIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggbGVnYWN5IGJvb2xlYW4gdHlwZVxuXHRcdFx0XHR0aGlzWyBrZXkgXSA9IE51bWJlciggbmV3VmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzWyBrZXkgXSA9IG5ld1ZhbHVlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBpc1Jvb3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTtcblxuXHRcdGlmICggaXNSb290ICkge1xuXG5cdFx0XHRtZXRhID0ge1xuXHRcdFx0XHR0ZXh0dXJlczoge30sXG5cdFx0XHRcdGltYWdlczoge31cblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ01hdGVyaWFsJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnTWF0ZXJpYWwudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBNYXRlcmlhbCBzZXJpYWxpemF0aW9uXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAmJiB0aGlzLmNvbG9yLmlzQ29sb3IgKSBkYXRhLmNvbG9yID0gdGhpcy5jb2xvci5nZXRIZXgoKTtcblxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEucm91Z2huZXNzID0gdGhpcy5yb3VnaG5lc3M7XG5cdFx0aWYgKCB0aGlzLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5tZXRhbG5lc3MgPSB0aGlzLm1ldGFsbmVzcztcblxuXHRcdGlmICggdGhpcy5lbWlzc2l2ZSAmJiB0aGlzLmVtaXNzaXZlLmlzQ29sb3IgKSBkYXRhLmVtaXNzaXZlID0gdGhpcy5lbWlzc2l2ZS5nZXRIZXgoKTtcblx0XHRpZiAoIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgIT09IDEgKSBkYXRhLmVtaXNzaXZlSW50ZW5zaXR5ID0gdGhpcy5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHRcdGlmICggdGhpcy5zcGVjdWxhciAmJiB0aGlzLnNwZWN1bGFyLmlzQ29sb3IgKSBkYXRhLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhci5nZXRIZXgoKTtcblx0XHRpZiAoIHRoaXMuc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnNoaW5pbmVzcyA9IHRoaXMuc2hpbmluZXNzO1xuXHRcdGlmICggdGhpcy5jbGVhckNvYXQgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJDb2F0ID0gdGhpcy5jbGVhckNvYXQ7XG5cdFx0aWYgKCB0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5jbGVhckNvYXRSb3VnaG5lc3MgPSB0aGlzLmNsZWFyQ29hdFJvdWdobmVzcztcblxuXHRcdGlmICggdGhpcy5tYXAgJiYgdGhpcy5tYXAuaXNUZXh0dXJlICkgZGF0YS5tYXAgPSB0aGlzLm1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5hbHBoYU1hcCAmJiB0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSApIGRhdGEuYWxwaGFNYXAgPSB0aGlzLmFscGhhTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLmxpZ2h0TWFwICYmIHRoaXMubGlnaHRNYXAuaXNUZXh0dXJlICkgZGF0YS5saWdodE1hcCA9IHRoaXMubGlnaHRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdGlmICggdGhpcy5hb01hcCAmJiB0aGlzLmFvTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5hb01hcCA9IHRoaXMuYW9NYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuYW9NYXBJbnRlbnNpdHkgPSB0aGlzLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJ1bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5idW1wTWFwID0gdGhpcy5idW1wTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmJ1bXBTY2FsZSA9IHRoaXMuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm5vcm1hbE1hcCAmJiB0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEubm9ybWFsTWFwID0gdGhpcy5ub3JtYWxNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEubm9ybWFsTWFwVHlwZSA9IHRoaXMubm9ybWFsTWFwVHlwZTtcblx0XHRcdGRhdGEubm9ybWFsU2NhbGUgPSB0aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5kaXNwbGFjZW1lbnRNYXAgJiYgdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudE1hcCA9IHRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudFNjYWxlID0gdGhpcy5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50QmlhcyA9IHRoaXMuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3NNYXAgJiYgdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5yb3VnaG5lc3NNYXAgPSB0aGlzLnJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5tZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlTWFwICYmIHRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlICkgZGF0YS5lbWlzc2l2ZU1hcCA9IHRoaXMuZW1pc3NpdmVNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFyTWFwID0gdGhpcy5zcGVjdWxhck1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVudk1hcCAmJiB0aGlzLmVudk1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZW52TWFwID0gdGhpcy5lbnZNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHk7IC8vIFNjYWxlIGJlaGluZCBlbnZNYXBcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ncmFkaWVudE1hcCAmJiB0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5ncmFkaWVudE1hcCA9IHRoaXMuZ3JhZGllbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5zaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemUgPSB0aGlzLnNpemU7XG5cdFx0aWYgKCB0aGlzLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplQXR0ZW51YXRpb24gPSB0aGlzLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdGlmICggdGhpcy5ibGVuZGluZyAhPT0gTm9ybWFsQmxlbmRpbmcgKSBkYXRhLmJsZW5kaW5nID0gdGhpcy5ibGVuZGluZztcblx0XHRpZiAoIHRoaXMuZmxhdFNoYWRpbmcgPT09IHRydWUgKSBkYXRhLmZsYXRTaGFkaW5nID0gdGhpcy5mbGF0U2hhZGluZztcblx0XHRpZiAoIHRoaXMuc2lkZSAhPT0gRnJvbnRTaWRlICkgZGF0YS5zaWRlID0gdGhpcy5zaWRlO1xuXHRcdGlmICggdGhpcy52ZXJ0ZXhDb2xvcnMgIT09IE5vQ29sb3JzICkgZGF0YS52ZXJ0ZXhDb2xvcnMgPSB0aGlzLnZlcnRleENvbG9ycztcblxuXHRcdGlmICggdGhpcy5vcGFjaXR5IDwgMSApIGRhdGEub3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcblx0XHRpZiAoIHRoaXMudHJhbnNwYXJlbnQgPT09IHRydWUgKSBkYXRhLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDtcblxuXHRcdGRhdGEuZGVwdGhGdW5jID0gdGhpcy5kZXB0aEZ1bmM7XG5cdFx0ZGF0YS5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDtcblx0XHRkYXRhLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGU7XG5cblx0XHQvLyByb3RhdGlvbiAoU3ByaXRlTWF0ZXJpYWwpXG5cdFx0aWYgKCB0aGlzLnJvdGF0aW9uICE9PSAwICkgZGF0YS5yb3RhdGlvbiA9IHRoaXMucm90YXRpb247XG5cblx0XHRpZiAoIHRoaXMubGluZXdpZHRoICE9PSAxICkgZGF0YS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aDtcblx0XHRpZiAoIHRoaXMuZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZGFzaFNpemUgPSB0aGlzLmRhc2hTaXplO1xuXHRcdGlmICggdGhpcy5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmdhcFNpemUgPSB0aGlzLmdhcFNpemU7XG5cdFx0aWYgKCB0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQgKSBkYXRhLnNjYWxlID0gdGhpcy5zY2FsZTtcblxuXHRcdGlmICggdGhpcy5kaXRoZXJpbmcgPT09IHRydWUgKSBkYXRhLmRpdGhlcmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7XG5cdFx0aWYgKCB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIGRhdGEucHJlbXVsdGlwbGllZEFscGhhID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lID09PSB0cnVlICkgZGF0YS53aXJlZnJhbWUgPSB0aGlzLndpcmVmcmFtZTtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSApIGRhdGEud2lyZWZyYW1lTGluZXdpZHRoID0gdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVqb2luICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHRpZiAoIHRoaXMubW9ycGhUYXJnZXRzID09PSB0cnVlICkgZGF0YS5tb3JwaFRhcmdldHMgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5za2lubmluZyA9PT0gdHJ1ZSApIGRhdGEuc2tpbm5pbmcgPSB0cnVlO1xuXG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgZGF0YS52aXNpYmxlID0gZmFsc2U7XG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgZGF0YS51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XG5cblx0XHQvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT05cblxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xuXG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0dmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xuXHRcdFx0dmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBkYXRhLmltYWdlcyA9IGltYWdlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XG5cdFx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xuXG5cdFx0dGhpcy5ibGVuZGluZyA9IHNvdXJjZS5ibGVuZGluZztcblx0XHR0aGlzLnNpZGUgPSBzb3VyY2Uuc2lkZTtcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xuXHRcdHRoaXMudmVydGV4Q29sb3JzID0gc291cmNlLnZlcnRleENvbG9ycztcblxuXHRcdHRoaXMub3BhY2l0eSA9IHNvdXJjZS5vcGFjaXR5O1xuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSBzb3VyY2UudHJhbnNwYXJlbnQ7XG5cblx0XHR0aGlzLmJsZW5kU3JjID0gc291cmNlLmJsZW5kU3JjO1xuXHRcdHRoaXMuYmxlbmREc3QgPSBzb3VyY2UuYmxlbmREc3Q7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uID0gc291cmNlLmJsZW5kRXF1YXRpb247XG5cdFx0dGhpcy5ibGVuZFNyY0FscGhhID0gc291cmNlLmJsZW5kU3JjQWxwaGE7XG5cdFx0dGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0dGhpcy5kZXB0aEZ1bmMgPSBzb3VyY2UuZGVwdGhGdW5jO1xuXHRcdHRoaXMuZGVwdGhUZXN0ID0gc291cmNlLmRlcHRoVGVzdDtcblx0XHR0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTtcblxuXHRcdHRoaXMuY29sb3JXcml0ZSA9IHNvdXJjZS5jb2xvcldyaXRlO1xuXG5cdFx0dGhpcy5wcmVjaXNpb24gPSBzb3VyY2UucHJlY2lzaW9uO1xuXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNlLnBvbHlnb25PZmZzZXQ7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gc291cmNlLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBzb3VyY2UucG9seWdvbk9mZnNldFVuaXRzO1xuXG5cdFx0dGhpcy5kaXRoZXJpbmcgPSBzb3VyY2UuZGl0aGVyaW5nO1xuXG5cdFx0dGhpcy5hbHBoYVRlc3QgPSBzb3VyY2UuYWxwaGFUZXN0O1xuXHRcdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gc291cmNlLnByZW11bHRpcGxpZWRBbHBoYTtcblxuXHRcdHRoaXMub3ZlcmRyYXcgPSBzb3VyY2Uub3ZlcmRyYXc7XG5cblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XG5cblx0XHR0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzO1xuXHRcdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IHNvdXJjZS5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0dmFyIHNyY1BsYW5lcyA9IHNvdXJjZS5jbGlwcGluZ1BsYW5lcyxcblx0XHRcdGRzdFBsYW5lcyA9IG51bGw7XG5cblx0XHRpZiAoIHNyY1BsYW5lcyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIG4gPSBzcmNQbGFuZXMubGVuZ3RoO1xuXHRcdFx0ZHN0UGxhbmVzID0gbmV3IEFycmF5KCBuICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApXG5cdFx0XHRcdGRzdFBsYW5lc1sgaSBdID0gc3JjUGxhbmVzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBkc3RQbGFuZXM7XG5cblx0XHR0aGlzLnNoYWRvd1NpZGUgPSBzb3VyY2Uuc2hhZG93U2lkZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgTWF0ZXJpYWwgfTtcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBNdWx0aXBseU9wZXJhdGlvbiB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICBkZXB0aFRlc3Q6IDxib29sPixcbiAqICBkZXB0aFdyaXRlOiA8Ym9vbD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGVtaXNzaXZlXG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZW52TWFwID0gbnVsbDtcblx0dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hCYXNpY01hdGVyaWFsO1xuXG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoQmFzaWNNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbmV4cG9ydCB7IE1lc2hCYXNpY01hdGVyaWFsIH07XG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgVW5pZm9ybXNVdGlscyB9IGZyb20gJy4uL3JlbmRlcmVycy9zaGFkZXJzL1VuaWZvcm1zVXRpbHMuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBkZWZpbmVzOiB7IFwibGFiZWxcIiA6IFwidmFsdWVcIiB9LFxuICogIHVuaWZvcm1zOiB7IFwicGFyYW1ldGVyMVwiOiB7IHZhbHVlOiAxLjAgfSwgXCJwYXJhbWV0ZXIyXCI6IHsgdmFsdWUyOiAyIH0gfSxcbiAqXG4gKiAgZnJhZ21lbnRTaGFkZXI6IDxzdHJpbmc+LFxuICogIHZlcnRleFNoYWRlcjogPHN0cmluZz4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgbGlnaHRzOiA8Ym9vbD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTaGFkZXJNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYWRlck1hdGVyaWFsJztcblxuXHR0aGlzLmRlZmluZXMgPSB7fTtcblx0dGhpcy51bmlmb3JtcyA9IHt9O1xuXG5cdHRoaXMudmVydGV4U2hhZGVyID0gJ3ZvaWQgbWFpbigpIHtcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XFxufSc7XG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSAndm9pZCBtYWluKCkge1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApO1xcbn0nO1xuXG5cdHRoaXMubGluZXdpZHRoID0gMTtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBzY2VuZSBmb2dcblx0dGhpcy5saWdodHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBzY2VuZSBsaWdodHNcblx0dGhpcy5jbGlwcGluZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXNcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2tpbm5pbmcgYXR0cmlidXRlIHN0cmVhbXNcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCB0YXJnZXRzXG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7IC8vIHNldCB0byB1c2UgbW9ycGggbm9ybWFsc1xuXG5cdHRoaXMuZXh0ZW5zaW9ucyA9IHtcblx0XHRkZXJpdmF0aXZlczogZmFsc2UsIC8vIHNldCB0byB1c2UgZGVyaXZhdGl2ZXNcblx0XHRmcmFnRGVwdGg6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGZyYWdtZW50IGRlcHRoIHZhbHVlc1xuXHRcdGRyYXdCdWZmZXJzOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBkcmF3IGJ1ZmZlcnNcblx0XHRzaGFkZXJUZXh0dXJlTE9EOiBmYWxzZSAvLyBzZXQgdG8gdXNlIHNoYWRlciB0ZXh0dXJlIExPRFxuXHR9O1xuXG5cdC8vIFdoZW4gcmVuZGVyZWQgZ2VvbWV0cnkgZG9lc24ndCBpbmNsdWRlIHRoZXNlIGF0dHJpYnV0ZXMgYnV0IHRoZSBtYXRlcmlhbCBkb2VzLFxuXHQvLyB1c2UgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgaW4gV2ViR0wuIFRoaXMgYXZvaWRzIGVycm9ycyB3aGVuIGJ1ZmZlciBkYXRhIGlzIG1pc3NpbmcuXG5cdHRoaXMuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IHtcblx0XHQnY29sb3InOiBbIDEsIDEsIDEgXSxcblx0XHQndXYnOiBbIDAsIDAgXSxcblx0XHQndXYyJzogWyAwLCAwIF1cblx0fTtcblxuXHR0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWUgPSB1bmRlZmluZWQ7XG5cdHRoaXMudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0aWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIHBhcmFtZXRlcnMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdyBiZSBkZWZpbmVkIGluIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxuXHR9XG5cbn1cblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFkZXJNYXRlcmlhbDtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZGVyTWF0ZXJpYWwgPSB0cnVlO1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBzb3VyY2UuZnJhZ21lbnRTaGFkZXI7XG5cdHRoaXMudmVydGV4U2hhZGVyID0gc291cmNlLnZlcnRleFNoYWRlcjtcblxuXHR0aGlzLnVuaWZvcm1zID0gVW5pZm9ybXNVdGlscy5jbG9uZSggc291cmNlLnVuaWZvcm1zICk7XG5cblx0dGhpcy5kZWZpbmVzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5kZWZpbmVzICk7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xuXHR0aGlzLmNsaXBwaW5nID0gc291cmNlLmNsaXBwaW5nO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0dGhpcy5leHRlbnNpb25zID0gc291cmNlLmV4dGVuc2lvbnM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0dmFyIGRhdGEgPSBNYXRlcmlhbC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRkYXRhLnVuaWZvcm1zID0gdGhpcy51bmlmb3Jtcztcblx0ZGF0YS52ZXJ0ZXhTaGFkZXIgPSB0aGlzLnZlcnRleFNoYWRlcjtcblx0ZGF0YS5mcmFnbWVudFNoYWRlciA9IHRoaXMuZnJhZ21lbnRTaGFkZXI7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cblxuZXhwb3J0IHsgU2hhZGVyTWF0ZXJpYWwgfTtcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBSYXkoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdHRoaXMub3JpZ2luID0gKCBvcmlnaW4gIT09IHVuZGVmaW5lZCApID8gb3JpZ2luIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5kaXJlY3Rpb24gPSAoIGRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkICkgPyBkaXJlY3Rpb24gOiBuZXcgVmVjdG9yMygpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFJheS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XG5cblx0XHR0aGlzLm9yaWdpbi5jb3B5KCBvcmlnaW4gKTtcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCBkaXJlY3Rpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcmF5ICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggcmF5Lm9yaWdpbiApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHJheS5kaXJlY3Rpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXQ6IGZ1bmN0aW9uICggdCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHR9LFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggdiApLnN1YiggdGhpcy5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cmVjYXN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJlY2FzdCggdCApIHtcblxuXHRcdFx0dGhpcy5vcmlnaW4uY29weSggdGhpcy5hdCggdCwgdjEgKSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHRhcmdldC5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5vcmlnaW4gKTtcblxuXHRcdHZhciBkaXJlY3Rpb25EaXN0YW5jZSA9IHRhcmdldC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRpcmVjdGlvbkRpc3RhbmNlIDwgMCApIHtcblxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBkaXJlY3Rpb25EaXN0YW5jZSApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlU3FUb1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGRpcmVjdGlvbkRpc3RhbmNlID0gdjEuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICkuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0XHQvLyBwb2ludCBiZWhpbmQgdGhlIHJheVxuXG5cdFx0XHRpZiAoIGRpcmVjdGlvbkRpc3RhbmNlIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0djEuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRcdHJldHVybiB2MS5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGRpc3RhbmNlU3FUb1NlZ21lbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzZWdDZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzZWdEaXIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBkaWZmID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9TZWdtZW50KCB2MCwgdjEsIG9wdGlvbmFsUG9pbnRPblJheSwgb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHtcblxuXHRcdFx0Ly8gZnJvbSBodHRwOi8vd3d3Lmdlb21ldHJpY3Rvb2xzLmNvbS9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0ZURpc3RSYXlTZWdtZW50Lmhcblx0XHRcdC8vIEl0IHJldHVybnMgdGhlIG1pbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSByYXkgYW5kIHRoZSBzZWdtZW50XG5cdFx0XHQvLyBkZWZpbmVkIGJ5IHYwIGFuZCB2MVxuXHRcdFx0Ly8gSXQgY2FuIGFsc28gc2V0IHR3byBvcHRpb25hbCB0YXJnZXRzIDpcblx0XHRcdC8vIC0gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHJheVxuXHRcdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgc2VnbWVudFxuXG5cdFx0XHRzZWdDZW50ZXIuY29weSggdjAgKS5hZGQoIHYxICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXHRcdFx0c2VnRGlyLmNvcHkoIHYxICkuc3ViKCB2MCApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0ZGlmZi5jb3B5KCB0aGlzLm9yaWdpbiApLnN1Yiggc2VnQ2VudGVyICk7XG5cblx0XHRcdHZhciBzZWdFeHRlbnQgPSB2MC5kaXN0YW5jZVRvKCB2MSApICogMC41O1xuXHRcdFx0dmFyIGEwMSA9IC0gdGhpcy5kaXJlY3Rpb24uZG90KCBzZWdEaXIgKTtcblx0XHRcdHZhciBiMCA9IGRpZmYuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXHRcdFx0dmFyIGIxID0gLSBkaWZmLmRvdCggc2VnRGlyICk7XG5cdFx0XHR2YXIgYyA9IGRpZmYubGVuZ3RoU3EoKTtcblx0XHRcdHZhciBkZXQgPSBNYXRoLmFicyggMSAtIGEwMSAqIGEwMSApO1xuXHRcdFx0dmFyIHMwLCBzMSwgc3FyRGlzdCwgZXh0RGV0O1xuXG5cdFx0XHRpZiAoIGRldCA+IDAgKSB7XG5cblx0XHRcdFx0Ly8gVGhlIHJheSBhbmQgc2VnbWVudCBhcmUgbm90IHBhcmFsbGVsLlxuXG5cdFx0XHRcdHMwID0gYTAxICogYjEgLSBiMDtcblx0XHRcdFx0czEgPSBhMDEgKiBiMCAtIGIxO1xuXHRcdFx0XHRleHREZXQgPSBzZWdFeHRlbnQgKiBkZXQ7XG5cblx0XHRcdFx0aWYgKCBzMCA+PSAwICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzMSA+PSAtIGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBzMSA8PSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDBcblx0XHRcdFx0XHRcdFx0Ly8gTWluaW11bSBhdCBpbnRlcmlvciBwb2ludHMgb2YgcmF5IGFuZCBzZWdtZW50LlxuXG5cdFx0XHRcdFx0XHRcdHZhciBpbnZEZXQgPSAxIC8gZGV0O1xuXHRcdFx0XHRcdFx0XHRzMCAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRcdHMxICo9IGludkRldDtcblx0XHRcdFx0XHRcdFx0c3FyRGlzdCA9IHMwICogKCBzMCArIGEwMSAqIHMxICsgMiAqIGIwICkgKyBzMSAqICggYTAxICogczAgKyBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyByZWdpb24gMVxuXG5cdFx0XHRcdFx0XHRcdHMxID0gc2VnRXh0ZW50O1xuXHRcdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiA1XG5cblx0XHRcdFx0XHRcdHMxID0gLSBzZWdFeHRlbnQ7XG5cdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIHMxIDw9IC0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gNFxuXG5cdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggLSBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzMSA9ICggczAgPiAwICkgPyAtIHNlZ0V4dGVudCA6IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggczEgPD0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gM1xuXG5cdFx0XHRcdFx0XHRzMCA9IDA7XG5cdFx0XHRcdFx0XHRzMSA9IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDJcblxuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHNlZ0V4dGVudCArIGIwICkgKTtcblx0XHRcdFx0XHRcdHMxID0gKCBzMCA+IDAgKSA/IHNlZ0V4dGVudCA6IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBSYXkgYW5kIHNlZ21lbnQgYXJlIHBhcmFsbGVsLlxuXG5cdFx0XHRcdHMxID0gKCBhMDEgPiAwICkgPyAtIHNlZ0V4dGVudCA6IHNlZ0V4dGVudDtcblx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb3B0aW9uYWxQb2ludE9uUmF5ICkge1xuXG5cdFx0XHRcdG9wdGlvbmFsUG9pbnRPblJheS5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBzMCApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XG5cblx0XHRcdFx0b3B0aW9uYWxQb2ludE9uU2VnbWVudC5jb3B5KCBzZWdEaXIgKS5tdWx0aXBseVNjYWxhciggczEgKS5hZGQoIHNlZ0NlbnRlciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzcXJEaXN0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0U3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdFNwaGVyZSggc3BoZXJlLCB0YXJnZXQgKSB7XG5cblx0XHRcdHYxLnN1YlZlY3RvcnMoIHNwaGVyZS5jZW50ZXIsIHRoaXMub3JpZ2luICk7XG5cdFx0XHR2YXIgdGNhID0gdjEuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXHRcdFx0dmFyIGQyID0gdjEuZG90KCB2MSApIC0gdGNhICogdGNhO1xuXHRcdFx0dmFyIHJhZGl1czIgPSBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cztcblxuXHRcdFx0aWYgKCBkMiA+IHJhZGl1czIgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0dmFyIHRoYyA9IE1hdGguc3FydCggcmFkaXVzMiAtIGQyICk7XG5cblx0XHRcdC8vIHQwID0gZmlyc3QgaW50ZXJzZWN0IHBvaW50IC0gZW50cmFuY2Ugb24gZnJvbnQgb2Ygc3BoZXJlXG5cdFx0XHR2YXIgdDAgPSB0Y2EgLSB0aGM7XG5cblx0XHRcdC8vIHQxID0gc2Vjb25kIGludGVyc2VjdCBwb2ludCAtIGV4aXQgcG9pbnQgb24gYmFjayBvZiBzcGhlcmVcblx0XHRcdHZhciB0MSA9IHRjYSArIHRoYztcblxuXHRcdFx0Ly8gdGVzdCB0byBzZWUgaWYgYm90aCB0MCBhbmQgdDEgYXJlIGJlaGluZCB0aGUgcmF5IC0gaWYgc28sIHJldHVybiBudWxsXG5cdFx0XHRpZiAoIHQwIDwgMCAmJiB0MSA8IDAgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0Ly8gdGVzdCB0byBzZWUgaWYgdDAgaXMgYmVoaW5kIHRoZSByYXk6XG5cdFx0XHQvLyBpZiBpdCBpcywgdGhlIHJheSBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgc28gcmV0dXJuIHRoZSBzZWNvbmQgZXhpdCBwb2ludCBzY2FsZWQgYnkgdDEsXG5cdFx0XHQvLyBpbiBvcmRlciB0byBhbHdheXMgcmV0dXJuIGFuIGludGVyc2VjdCBwb2ludCB0aGF0IGlzIGluIGZyb250IG9mIHRoZSByYXkuXG5cdFx0XHRpZiAoIHQwIDwgMCApIHJldHVybiB0aGlzLmF0KCB0MSwgdGFyZ2V0ICk7XG5cblx0XHRcdC8vIGVsc2UgdDAgaXMgaW4gZnJvbnQgb2YgdGhlIHJheSwgc28gcmV0dXJuIHRoZSBmaXJzdCBjb2xsaXNpb24gcG9pbnQgc2NhbGVkIGJ5IHQwXG5cdFx0XHRyZXR1cm4gdGhpcy5hdCggdDAsIHRhcmdldCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSA8PSBzcGhlcmUucmFkaXVzO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0dmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSB7XG5cblx0XHRcdC8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW5cblx0XHRcdGlmICggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApID09PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIE51bGwgaXMgcHJlZmVyYWJsZSB0byB1bmRlZmluZWQgc2luY2UgdW5kZWZpbmVkIG1lYW5zLi4uLiBpdCBpcyB1bmRlZmluZWRcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgdCA9IC0gKCB0aGlzLm9yaWdpbi5kb3QoIHBsYW5lLm5vcm1hbCApICsgcGxhbmUuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0Ly8gUmV0dXJuIGlmIHRoZSByYXkgbmV2ZXIgaW50ZXJzZWN0cyB0aGUgcGxhbmVcblxuXHRcdHJldHVybiB0ID49IDAgPyB0IDogbnVsbDtcblxuXHR9LFxuXG5cdGludGVyc2VjdFBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lLCB0YXJnZXQgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuZGlzdGFuY2VUb1BsYW5lKCBwbGFuZSApO1xuXG5cdFx0aWYgKCB0ID09PSBudWxsICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmF0KCB0LCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdC8vIGNoZWNrIGlmIHRoZSByYXkgbGllcyBvbiB0aGUgcGxhbmUgZmlyc3RcblxuXHRcdHZhciBkaXN0VG9Qb2ludCA9IHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKTtcblxuXHRcdGlmICggZGlzdFRvUG9pbnQgPT09IDAgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgKiBkaXN0VG9Qb2ludCA8IDAgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmF5IG9yaWdpbiBpcyBiZWhpbmQgdGhlIHBsYW5lIChhbmQgaXMgcG9pbnRpbmcgYmVoaW5kIGl0KVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0Qm94OiBmdW5jdGlvbiAoIGJveCwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHRtaW4sIHRtYXgsIHR5bWluLCB0eW1heCwgdHptaW4sIHR6bWF4O1xuXG5cdFx0dmFyIGludmRpcnggPSAxIC8gdGhpcy5kaXJlY3Rpb24ueCxcblx0XHRcdGludmRpcnkgPSAxIC8gdGhpcy5kaXJlY3Rpb24ueSxcblx0XHRcdGludmRpcnogPSAxIC8gdGhpcy5kaXJlY3Rpb24uejtcblxuXHRcdHZhciBvcmlnaW4gPSB0aGlzLm9yaWdpbjtcblxuXHRcdGlmICggaW52ZGlyeCA+PSAwICkge1xuXG5cdFx0XHR0bWluID0gKCBib3gubWluLnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblx0XHRcdHRtYXggPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dG1pbiA9ICggYm94Lm1heC54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cdFx0XHR0bWF4ID0gKCBib3gubWluLnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblxuXHRcdH1cblxuXHRcdGlmICggaW52ZGlyeSA+PSAwICkge1xuXG5cdFx0XHR0eW1pbiA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cdFx0XHR0eW1heCA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0eW1pbiA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cdFx0XHR0eW1heCA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdG1pbiA+IHR5bWF4ICkgfHwgKCB0eW1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xuXG5cdFx0Ly8gVGhlc2UgbGluZXMgYWxzbyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdG1pbiBvciB0bWF4IGlzIE5hTlxuXHRcdC8vIChyZXN1bHQgb2YgMCAqIEluZmluaXR5KS4geCAhPT0geCByZXR1cm5zIHRydWUgaWYgeCBpcyBOYU5cblxuXHRcdGlmICggdHltaW4gPiB0bWluIHx8IHRtaW4gIT09IHRtaW4gKSB0bWluID0gdHltaW47XG5cblx0XHRpZiAoIHR5bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4ICkgdG1heCA9IHR5bWF4O1xuXG5cdFx0aWYgKCBpbnZkaXJ6ID49IDAgKSB7XG5cblx0XHRcdHR6bWluID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblx0XHRcdHR6bWF4ID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHR6bWluID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblx0XHRcdHR6bWF4ID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblxuXHRcdH1cblxuXHRcdGlmICggKCB0bWluID4gdHptYXggKSB8fCAoIHR6bWluID4gdG1heCApICkgcmV0dXJuIG51bGw7XG5cblx0XHRpZiAoIHR6bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR6bWluO1xuXG5cdFx0aWYgKCB0em1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0em1heDtcblxuXHRcdC8vcmV0dXJuIHBvaW50IGNsb3Nlc3QgdG8gdGhlIHJheSAocG9zaXRpdmUgc2lkZSlcblxuXHRcdGlmICggdG1heCA8IDAgKSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiB0aGlzLmF0KCB0bWluID49IDAgPyB0bWluIDogdG1heCwgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzQm94KCBib3ggKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmludGVyc2VjdEJveCggYm94LCB2ICkgIT09IG51bGw7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGludGVyc2VjdFRyaWFuZ2xlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBDb21wdXRlIHRoZSBvZmZzZXQgb3JpZ2luLCBlZGdlcywgYW5kIG5vcm1hbC5cblx0XHR2YXIgZGlmZiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVkZ2UxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZWRnZTIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdFRyaWFuZ2xlKCBhLCBiLCBjLCBiYWNrZmFjZUN1bGxpbmcsIHRhcmdldCApIHtcblxuXHRcdFx0Ly8gZnJvbSBodHRwOi8vd3d3Lmdlb21ldHJpY3Rvb2xzLmNvbS9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0ZUludHJSYXkzVHJpYW5nbGUzLmhcblxuXHRcdFx0ZWRnZTEuc3ViVmVjdG9ycyggYiwgYSApO1xuXHRcdFx0ZWRnZTIuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdFx0bm9ybWFsLmNyb3NzVmVjdG9ycyggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdC8vIFNvbHZlIFEgKyB0KkQgPSBiMSpFMSArIGIyKkUyIChRID0ga0RpZmYsIEQgPSByYXkgZGlyZWN0aW9uLFxuXHRcdFx0Ly8gRTEgPSBrRWRnZTEsIEUyID0ga0VkZ2UyLCBOID0gQ3Jvc3MoRTEsRTIpKSBieVxuXHRcdFx0Ly8gICB8RG90KEQsTil8KmIxID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoUSxFMikpXG5cdFx0XHQvLyAgIHxEb3QoRCxOKXwqYjIgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9zcyhFMSxRKSlcblx0XHRcdC8vICAgfERvdChELE4pfCp0ID0gLXNpZ24oRG90KEQsTikpKkRvdChRLE4pXG5cdFx0XHR2YXIgRGROID0gdGhpcy5kaXJlY3Rpb24uZG90KCBub3JtYWwgKTtcblx0XHRcdHZhciBzaWduO1xuXG5cdFx0XHRpZiAoIERkTiA+IDAgKSB7XG5cblx0XHRcdFx0aWYgKCBiYWNrZmFjZUN1bGxpbmcgKSByZXR1cm4gbnVsbDtcblx0XHRcdFx0c2lnbiA9IDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIERkTiA8IDAgKSB7XG5cblx0XHRcdFx0c2lnbiA9IC0gMTtcblx0XHRcdFx0RGROID0gLSBEZE47XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0ZGlmZi5zdWJWZWN0b3JzKCB0aGlzLm9yaWdpbiwgYSApO1xuXHRcdFx0dmFyIERkUXhFMiA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIGVkZ2UyLmNyb3NzVmVjdG9ycyggZGlmZiwgZWRnZTIgKSApO1xuXG5cdFx0XHQvLyBiMSA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBEZFF4RTIgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBEZEUxeFEgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBlZGdlMS5jcm9zcyggZGlmZiApICk7XG5cblx0XHRcdC8vIGIyIDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIERkRTF4USA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gYjErYjIgPiAxLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggRGRReEUyICsgRGRFMXhRID4gRGROICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIExpbmUgaW50ZXJzZWN0cyB0cmlhbmdsZSwgY2hlY2sgaWYgcmF5IGRvZXMuXG5cdFx0XHR2YXIgUWROID0gLSBzaWduICogZGlmZi5kb3QoIG5vcm1hbCApO1xuXG5cdFx0XHQvLyB0IDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIFFkTiA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmF5IGludGVyc2VjdHMgdHJpYW5nbGUuXG5cdFx0XHRyZXR1cm4gdGhpcy5hdCggUWROIC8gRGROLCB0YXJnZXQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXg0ICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KCBtYXRyaXg0ICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXg0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCByYXkgKSB7XG5cblx0XHRyZXR1cm4gcmF5Lm9yaWdpbi5lcXVhbHMoIHRoaXMub3JpZ2luICkgJiYgcmF5LmRpcmVjdGlvbi5lcXVhbHMoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgUmF5IH07XG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFRyaWFuZ2xlKCBhLCBiLCBjICkge1xuXG5cdHRoaXMuYSA9ICggYSAhPT0gdW5kZWZpbmVkICkgPyBhIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5iID0gKCBiICE9PSB1bmRlZmluZWQgKSA/IGIgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmMgPSAoIGMgIT09IHVuZGVmaW5lZCApID8gYyA6IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUsIHtcblxuXHRnZXROb3JtYWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0Tm9ybWFsKCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXROb3JtYWwoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRhcmdldC5zdWJWZWN0b3JzKCBjLCBiICk7XG5cdFx0XHR2MC5zdWJWZWN0b3JzKCBhLCBiICk7XG5cdFx0XHR0YXJnZXQuY3Jvc3MoIHYwICk7XG5cblx0XHRcdHZhciB0YXJnZXRMZW5ndGhTcSA9IHRhcmdldC5sZW5ndGhTcSgpO1xuXHRcdFx0aWYgKCB0YXJnZXRMZW5ndGhTcSA+IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRhcmdldC5tdWx0aXBseVNjYWxhciggMSAvIE1hdGguc3FydCggdGFyZ2V0TGVuZ3RoU3EgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAwLCAwLCAwICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHQvLyBzdGF0aWMvaW5zdGFuY2UgbWV0aG9kIHRvIGNhbGN1bGF0ZSBiYXJ5Y2VudHJpYyBjb29yZGluYXRlc1xuXHQvLyBiYXNlZCBvbjogaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BvaW50aW5wb2x5L2RlZmF1bHQuaHRtbFxuXHRnZXRCYXJ5Y29vcmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHRhcmdldCApIHtcblxuXHRcdFx0djAuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdFx0djEuc3ViVmVjdG9ycyggYiwgYSApO1xuXHRcdFx0djIuc3ViVmVjdG9ycyggcG9pbnQsIGEgKTtcblxuXHRcdFx0dmFyIGRvdDAwID0gdjAuZG90KCB2MCApO1xuXHRcdFx0dmFyIGRvdDAxID0gdjAuZG90KCB2MSApO1xuXHRcdFx0dmFyIGRvdDAyID0gdjAuZG90KCB2MiApO1xuXHRcdFx0dmFyIGRvdDExID0gdjEuZG90KCB2MSApO1xuXHRcdFx0dmFyIGRvdDEyID0gdjEuZG90KCB2MiApO1xuXG5cdFx0XHR2YXIgZGVub20gPSAoIGRvdDAwICogZG90MTEgLSBkb3QwMSAqIGRvdDAxICk7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXRCYXJ5Y29vcmQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNvbGxpbmVhciBvciBzaW5ndWxhciB0cmlhbmdsZVxuXHRcdFx0aWYgKCBkZW5vbSA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBhcmJpdHJhcnkgbG9jYXRpb24gb3V0c2lkZSBvZiB0cmlhbmdsZT9cblx0XHRcdFx0Ly8gbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgYmVzdCBpZGVhLCBtYXliZSBzaG91bGQgYmUgcmV0dXJuaW5nIHVuZGVmaW5lZFxuXHRcdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggLSAyLCAtIDEsIC0gMSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbnZEZW5vbSA9IDEgLyBkZW5vbTtcblx0XHRcdHZhciB1ID0gKCBkb3QxMSAqIGRvdDAyIC0gZG90MDEgKiBkb3QxMiApICogaW52RGVub207XG5cdFx0XHR2YXIgdiA9ICggZG90MDAgKiBkb3QxMiAtIGRvdDAxICogZG90MDIgKSAqIGludkRlbm9tO1xuXG5cdFx0XHQvLyBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyBtdXN0IGFsd2F5cyBzdW0gdG8gMVxuXHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIDEgLSB1IC0gdiwgdiwgdSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb250YWluc1BvaW50KCBwb2ludCwgYSwgYiwgYyApIHtcblxuXHRcdFx0VHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgdjEgKTtcblxuXHRcdFx0cmV0dXJuICggdjEueCA+PSAwICkgJiYgKCB2MS55ID49IDAgKSAmJiAoICggdjEueCArIHYxLnkgKSA8PSAxICk7XG5cblx0XHR9O1xuXG5cdH0oKVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBhLCBiLCBjICkge1xuXG5cdFx0dGhpcy5hLmNvcHkoIGEgKTtcblx0XHR0aGlzLmIuY29weSggYiApO1xuXHRcdHRoaXMuYy5jb3B5KCBjICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHNBbmRJbmRpY2VzOiBmdW5jdGlvbiAoIHBvaW50cywgaTAsIGkxLCBpMiApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCBwb2ludHNbIGkwIF0gKTtcblx0XHR0aGlzLmIuY29weSggcG9pbnRzWyBpMSBdICk7XG5cdFx0dGhpcy5jLmNvcHkoIHBvaW50c1sgaTIgXSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCB0cmlhbmdsZS5hICk7XG5cdFx0dGhpcy5iLmNvcHkoIHRyaWFuZ2xlLmIgKTtcblx0XHR0aGlzLmMuY29weSggdHJpYW5nbGUuYyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRBcmVhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0QXJlYSgpIHtcblxuXHRcdFx0djAuc3ViVmVjdG9ycyggdGhpcy5jLCB0aGlzLmIgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICk7XG5cblx0XHRcdHJldHVybiB2MC5jcm9zcyggdjEgKS5sZW5ndGgoKSAqIDAuNTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGdldE1pZHBvaW50OiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0TWlkcG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5hLCB0aGlzLmIgKS5hZGQoIHRoaXMuYyApLm11bHRpcGx5U2NhbGFyKCAxIC8gMyApO1xuXG5cdH0sXG5cblx0Z2V0Tm9ybWFsOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5nZXROb3JtYWwoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRhcmdldCApO1xuXG5cdH0sXG5cblx0Z2V0UGxhbmU6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXRQbGFuZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tQ29wbGFuYXJQb2ludHMoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblxuXHR9LFxuXG5cdGdldEJhcnljb29yZDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRhcmdldCApO1xuXG5cdH0sXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5jb250YWluc1BvaW50KCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNUcmlhbmdsZSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZhYiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZhYyA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZiYyA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZhcCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZicCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZjcCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludCggcCwgdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGEgPSB0aGlzLmEsIGIgPSB0aGlzLmIsIGMgPSB0aGlzLmM7XG5cdFx0XHR2YXIgdiwgdztcblxuXHRcdFx0Ly8gYWxnb3JpdGhtIHRoYW5rcyB0byBSZWFsLVRpbWUgQ29sbGlzaW9uIERldGVjdGlvbiBieSBDaHJpc3RlciBFcmljc29uLFxuXHRcdFx0Ly8gcHVibGlzaGVkIGJ5IE1vcmdhbiBLYXVmbWFubiBQdWJsaXNoZXJzLCAoYykgMjAwNSBFbHNldmllciBJbmMuLFxuXHRcdFx0Ly8gdW5kZXIgdGhlIGFjY29tcGFueWluZyBsaWNlbnNlOyBzZWUgY2hhcHRlciA1LjEuNSBmb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24uXG5cdFx0XHQvLyBiYXNpY2FsbHksIHdlJ3JlIGRpc3Rpbmd1aXNoaW5nIHdoaWNoIG9mIHRoZSB2b3Jvbm9pIHJlZ2lvbnMgb2YgdGhlIHRyaWFuZ2xlXG5cdFx0XHQvLyB0aGUgcG9pbnQgbGllcyBpbiB3aXRoIHRoZSBtaW5pbXVtIGFtb3VudCBvZiByZWR1bmRhbnQgY29tcHV0YXRpb24uXG5cblx0XHRcdHZhYi5zdWJWZWN0b3JzKCBiLCBhICk7XG5cdFx0XHR2YWMuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdFx0dmFwLnN1YlZlY3RvcnMoIHAsIGEgKTtcblx0XHRcdHZhciBkMSA9IHZhYi5kb3QoIHZhcCApO1xuXHRcdFx0dmFyIGQyID0gdmFjLmRvdCggdmFwICk7XG5cdFx0XHRpZiAoIGQxIDw9IDAgJiYgZDIgPD0gMCApIHtcblxuXHRcdFx0XHQvLyB2ZXJ0ZXggcmVnaW9uIG9mIEE7IGJhcnljZW50cmljIGNvb3JkcyAoMSwgMCwgMClcblx0XHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBhICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmJwLnN1YlZlY3RvcnMoIHAsIGIgKTtcblx0XHRcdHZhciBkMyA9IHZhYi5kb3QoIHZicCApO1xuXHRcdFx0dmFyIGQ0ID0gdmFjLmRvdCggdmJwICk7XG5cdFx0XHRpZiAoIGQzID49IDAgJiYgZDQgPD0gZDMgKSB7XG5cblx0XHRcdFx0Ly8gdmVydGV4IHJlZ2lvbiBvZiBCOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDAsIDEsIDApXG5cdFx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB2YyA9IGQxICogZDQgLSBkMyAqIGQyO1xuXHRcdFx0aWYgKCB2YyA8PSAwICYmIGQxID49IDAgJiYgZDMgPD0gMCApIHtcblxuXHRcdFx0XHR2ID0gZDEgLyAoIGQxIC0gZDMgKTtcblx0XHRcdFx0Ly8gZWRnZSByZWdpb24gb2YgQUI7IGJhcnljZW50cmljIGNvb3JkcyAoMS12LCB2LCAwKVxuXHRcdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGEgKS5hZGRTY2FsZWRWZWN0b3IoIHZhYiwgdiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZjcC5zdWJWZWN0b3JzKCBwLCBjICk7XG5cdFx0XHR2YXIgZDUgPSB2YWIuZG90KCB2Y3AgKTtcblx0XHRcdHZhciBkNiA9IHZhYy5kb3QoIHZjcCApO1xuXHRcdFx0aWYgKCBkNiA+PSAwICYmIGQ1IDw9IGQ2ICkge1xuXG5cdFx0XHRcdC8vIHZlcnRleCByZWdpb24gb2YgQzsgYmFyeWNlbnRyaWMgY29vcmRzICgwLCAwLCAxKVxuXHRcdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdmIgPSBkNSAqIGQyIC0gZDEgKiBkNjtcblx0XHRcdGlmICggdmIgPD0gMCAmJiBkMiA+PSAwICYmIGQ2IDw9IDAgKSB7XG5cblx0XHRcdFx0dyA9IGQyIC8gKCBkMiAtIGQ2ICk7XG5cdFx0XHRcdC8vIGVkZ2UgcmVnaW9uIG9mIEFDOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDEtdywgMCwgdylcblx0XHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBhICkuYWRkU2NhbGVkVmVjdG9yKCB2YWMsIHcgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdmEgPSBkMyAqIGQ2IC0gZDUgKiBkNDtcblx0XHRcdGlmICggdmEgPD0gMCAmJiAoIGQ0IC0gZDMgKSA+PSAwICYmICggZDUgLSBkNiApID49IDAgKSB7XG5cblx0XHRcdFx0dmJjLnN1YlZlY3RvcnMoIGMsIGIgKTtcblx0XHRcdFx0dyA9ICggZDQgLSBkMyApIC8gKCAoIGQ0IC0gZDMgKSArICggZDUgLSBkNiApICk7XG5cdFx0XHRcdC8vIGVkZ2UgcmVnaW9uIG9mIEJDOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDAsIDEtdywgdylcblx0XHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBiICkuYWRkU2NhbGVkVmVjdG9yKCB2YmMsIHcgKTsgLy8gZWRnZSByZWdpb24gb2YgQkNcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmYWNlIHJlZ2lvblxuXHRcdFx0dmFyIGRlbm9tID0gMSAvICggdmEgKyB2YiArIHZjICk7XG5cdFx0XHQvLyB1ID0gdmEgKiBkZW5vbVxuXHRcdFx0diA9IHZiICogZGVub207XG5cdFx0XHR3ID0gdmMgKiBkZW5vbTtcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYSApLmFkZFNjYWxlZFZlY3RvciggdmFiLCB2ICkuYWRkU2NhbGVkVmVjdG9yKCB2YWMsIHcgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHtcblxuXHRcdHJldHVybiB0cmlhbmdsZS5hLmVxdWFscyggdGhpcy5hICkgJiYgdHJpYW5nbGUuYi5lcXVhbHMoIHRoaXMuYiApICYmIHRyaWFuZ2xlLmMuZXF1YWxzKCB0aGlzLmMgKTtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBUcmlhbmdsZSB9O1xuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcbmltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlLmpzJztcbmltcG9ydCB7IFJheSB9IGZyb20gJy4uL21hdGgvUmF5LmpzJztcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcbmltcG9ydCB7IFRyaWFuZ2xlIH0gZnJvbSAnLi4vbWF0aC9UcmlhbmdsZS5qcyc7XG5pbXBvcnQgeyBGYWNlMyB9IGZyb20gJy4uL2NvcmUvRmFjZTMuanMnO1xuaW1wb3J0IHsgRG91YmxlU2lkZSwgQmFja1NpZGUsIFRyaWFuZ2xlc0RyYXdNb2RlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IE1lc2hCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL01lc2hCYXNpY01hdGVyaWFsLmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBqb25vYnIxIC8gaHR0cDovL2pvbm9icjEuY29tL1xuICovXG5cbmZ1bmN0aW9uIE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2gnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTtcblxuXHR0aGlzLmRyYXdNb2RlID0gVHJpYW5nbGVzRHJhd01vZGU7XG5cblx0dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKTtcblxufVxuXG5NZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE1lc2gsXG5cblx0aXNNZXNoOiB0cnVlLFxuXG5cdHNldERyYXdNb2RlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5kcmF3TW9kZSA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZHJhd01vZGUgPSBzb3VyY2UuZHJhd01vZGU7XG5cblx0XHRpZiAoIHNvdXJjZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHNvdXJjZS5tb3JwaFRhcmdldERpY3Rpb25hcnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1cGRhdGVNb3JwaFRhcmdldHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0dmFyIG0sIG1sLCBuYW1lO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xuXHRcdFx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyggbW9ycGhBdHRyaWJ1dGVzICk7XG5cblx0XHRcdGlmICgga2V5cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sga2V5c1sgMCBdIF07XG5cblx0XHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTtcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yICggbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRcdG5hbWUgPSBtb3JwaEF0dHJpYnV0ZVsgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XG5cblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTtcblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCAmJiBtb3JwaFRhcmdldHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xuXG5cdFx0XHRcdGZvciAoIG0gPSAwLCBtbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcblxuXHRcdFx0XHRcdG5hbWUgPSBtb3JwaFRhcmdldHNbIG0gXS5uYW1lIHx8IFN0cmluZyggbSApO1xuXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHJheSA9IG5ldyBSYXkoKTtcblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0dmFyIHZBID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdkIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2QyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdGVtcEEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB0ZW1wQiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHRlbXBDID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB1dkEgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB1dkIgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB1dkMgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0dmFyIGJhcnljb29yZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgaW50ZXJzZWN0aW9uUG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBpbnRlcnNlY3Rpb25Qb2ludFdvcmxkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZ1bmN0aW9uIHV2SW50ZXJzZWN0aW9uKCBwb2ludCwgcDEsIHAyLCBwMywgdXYxLCB1djIsIHV2MyApIHtcblxuXHRcdFx0VHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBwb2ludCwgcDEsIHAyLCBwMywgYmFyeWNvb3JkICk7XG5cblx0XHRcdHV2MS5tdWx0aXBseVNjYWxhciggYmFyeWNvb3JkLnggKTtcblx0XHRcdHV2Mi5tdWx0aXBseVNjYWxhciggYmFyeWNvb3JkLnkgKTtcblx0XHRcdHV2My5tdWx0aXBseVNjYWxhciggYmFyeWNvb3JkLnogKTtcblxuXHRcdFx0dXYxLmFkZCggdXYyICkuYWRkKCB1djMgKTtcblxuXHRcdFx0cmV0dXJuIHV2MS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBwQSwgcEIsIHBDLCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGludGVyc2VjdDtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHtcblxuXHRcdFx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBDLCBwQiwgcEEsIHRydWUsIHBvaW50ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBwQSwgcEIsIHBDLCBtYXRlcmlhbC5zaWRlICE9PSBEb3VibGVTaWRlLCBwb2ludCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdGludGVyc2VjdGlvblBvaW50V29ybGQuY29weSggcG9pbnQgKTtcblx0XHRcdGludGVyc2VjdGlvblBvaW50V29ybGQuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0cG9pbnQ6IGludGVyc2VjdGlvblBvaW50V29ybGQuY2xvbmUoKSxcblx0XHRcdFx0b2JqZWN0OiBvYmplY3Rcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCBvYmplY3QsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICkge1xuXG5cdFx0XHR2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYSApO1xuXHRcdFx0dkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGIgKTtcblx0XHRcdHZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBjICk7XG5cblx0XHRcdHZhciBpbnRlcnNlY3Rpb24gPSBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHZBLCB2QiwgdkMsIGludGVyc2VjdGlvblBvaW50ICk7XG5cblx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdGlmICggdXYgKSB7XG5cblx0XHRcdFx0XHR1dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGEgKTtcblx0XHRcdFx0XHR1dkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGIgKTtcblx0XHRcdFx0XHR1dkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGMgKTtcblxuXHRcdFx0XHRcdGludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNlY3Rpb25Qb2ludCwgdkEsIHZCLCB2QywgdXZBLCB1dkIsIHV2QyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgZmFjZSA9IG5ldyBGYWNlMyggYSwgYiwgYyApO1xuXHRcdFx0XHRUcmlhbmdsZS5nZXROb3JtYWwoIHZBLCB2QiwgdkMsIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2UgPSBmYWNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpbnRlcnNlY3Rpb247XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHQvLyBDaGVjayBib3VuZGluZ0JveCBiZWZvcmUgY29udGludWluZ1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcmF5LmludGVyc2VjdHNCb3goIGdlb21ldHJ5LmJvdW5kaW5nQm94ICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbnRlcnNlY3Rpb247XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgYSwgYiwgYztcblx0XHRcdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdHZhciB1diA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXY7XG5cdFx0XHRcdHZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cdFx0XHRcdHZhciBkcmF3UmFuZ2UgPSBnZW9tZXRyeS5kcmF3UmFuZ2U7XG5cdFx0XHRcdHZhciBpLCBqLCBpbCwgamw7XG5cdFx0XHRcdHZhciBncm91cCwgZ3JvdXBNYXRlcmlhbDtcblx0XHRcdFx0dmFyIHN0YXJ0LCBlbmQ7XG5cblx0XHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdC8vIGluZGV4ZWQgYnVmZmVyIGdlb21ldHJ5XG5cblx0XHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0XHRcdFx0XHRncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHRzdGFydCA9IE1hdGgubWF4KCBncm91cC5zdGFydCwgZHJhd1JhbmdlLnN0YXJ0ICk7XG5cdFx0XHRcdFx0XHRcdGVuZCA9IE1hdGgubWluKCAoIGdyb3VwLnN0YXJ0ICsgZ3JvdXAuY291bnQgKSwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdFx0XHRcdGZvciAoIGogPSBzdGFydCwgamwgPSBlbmQ7IGogPCBqbDsgaiArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0YSA9IGluZGV4LmdldFgoIGogKTtcblx0XHRcdFx0XHRcdFx0XHRiID0gaW5kZXguZ2V0WCggaiArIDEgKTtcblx0XHRcdFx0XHRcdFx0XHRjID0gaW5kZXguZ2V0WCggaiArIDIgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIGdyb3VwTWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaiAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIGluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xuXHRcdFx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xuXHRcdFx0XHRcdFx0ZW5kID0gTWF0aC5taW4oIGluZGV4LmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRcdGEgPSBpbmRleC5nZXRYKCBpICk7XG5cdFx0XHRcdFx0XHRcdGIgPSBpbmRleC5nZXRYKCBpICsgMSApO1xuXHRcdFx0XHRcdFx0XHRjID0gaW5kZXguZ2V0WCggaSArIDIgKTtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBpbmRleGVkIGJ1ZmZlciBzZW1hbnRpY3Ncblx0XHRcdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcblxuXHRcdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDAsIGlsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHRcdFx0XHRcdGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHN0YXJ0ID0gTWF0aC5tYXgoIGdyb3VwLnN0YXJ0LCBkcmF3UmFuZ2Uuc3RhcnQgKTtcblx0XHRcdFx0XHRcdFx0ZW5kID0gTWF0aC5taW4oICggZ3JvdXAuc3RhcnQgKyBncm91cC5jb3VudCApLCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaiA9IHN0YXJ0LCBqbCA9IGVuZDsgaiA8IGpsOyBqICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRhID0gajtcblx0XHRcdFx0XHRcdFx0XHRiID0gaiArIDE7XG5cdFx0XHRcdFx0XHRcdFx0YyA9IGogKyAyO1xuXG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgZ3JvdXBNYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBqIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gbm9uLWluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xuXHRcdFx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xuXHRcdFx0XHRcdFx0ZW5kID0gTWF0aC5taW4oIHBvc2l0aW9uLmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRcdGEgPSBpO1xuXHRcdFx0XHRcdFx0XHRiID0gaSArIDE7XG5cdFx0XHRcdFx0XHRcdGMgPSBpICsgMjtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBub24taW5kZXhlZCBidWZmZXIgc2VtYW50aWNzXG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGZ2QSwgZnZCLCBmdkM7XG5cdFx0XHRcdHZhciBpc011bHRpTWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHRcdFx0dmFyIHV2cztcblxuXHRcdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXTtcblx0XHRcdFx0aWYgKCBmYWNlVmVydGV4VXZzLmxlbmd0aCA+IDAgKSB1dnMgPSBmYWNlVmVydGV4VXZzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGYgXTtcblx0XHRcdFx0XHR2YXIgZmFjZU1hdGVyaWFsID0gaXNNdWx0aU1hdGVyaWFsID8gbWF0ZXJpYWxbIGZhY2UubWF0ZXJpYWxJbmRleCBdIDogbWF0ZXJpYWw7XG5cblx0XHRcdFx0XHRpZiAoIGZhY2VNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHRmdkEgPSB2ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHRcdFx0ZnZCID0gdmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHRcdGZ2QyA9IHZlcnRpY2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0XHRcdGlmICggZmFjZU1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHRcdFx0XHRcdHZhciBtb3JwaEluZmx1ZW5jZXMgPSB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcblxuXHRcdFx0XHRcdFx0dkEuc2V0KCAwLCAwLCAwICk7XG5cdFx0XHRcdFx0XHR2Qi5zZXQoIDAsIDAsIDAgKTtcblx0XHRcdFx0XHRcdHZDLnNldCggMCwgMCwgMCApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgdCA9IDAsIHRsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgdCA8IHRsOyB0ICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBpbmZsdWVuY2UgPSBtb3JwaEluZmx1ZW5jZXNbIHQgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGluZmx1ZW5jZSA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRcdHZhciB0YXJnZXRzID0gbW9ycGhUYXJnZXRzWyB0IF0udmVydGljZXM7XG5cblx0XHRcdFx0XHRcdFx0dkEuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQS5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmEgXSwgZnZBICksIGluZmx1ZW5jZSApO1xuXHRcdFx0XHRcdFx0XHR2Qi5hZGRTY2FsZWRWZWN0b3IoIHRlbXBCLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYiBdLCBmdkIgKSwgaW5mbHVlbmNlICk7XG5cdFx0XHRcdFx0XHRcdHZDLmFkZFNjYWxlZFZlY3RvciggdGVtcEMuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5jIF0sIGZ2QyApLCBpbmZsdWVuY2UgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2QS5hZGQoIGZ2QSApO1xuXHRcdFx0XHRcdFx0dkIuYWRkKCBmdkIgKTtcblx0XHRcdFx0XHRcdHZDLmFkZCggZnZDICk7XG5cblx0XHRcdFx0XHRcdGZ2QSA9IHZBO1xuXHRcdFx0XHRcdFx0ZnZCID0gdkI7XG5cdFx0XHRcdFx0XHRmdkMgPSB2QztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCB0aGlzLCBmYWNlTWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBmdkEsIGZ2QiwgZnZDLCBpbnRlcnNlY3Rpb25Qb2ludCApO1xuXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdXZzICYmIHV2c1sgZiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciB1dnNfZiA9IHV2c1sgZiBdO1xuXHRcdFx0XHRcdFx0XHR1dkEuY29weSggdXZzX2ZbIDAgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkIuY29weSggdXZzX2ZbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkMuY29weSggdXZzX2ZbIDIgXSApO1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNlY3Rpb25Qb2ludCwgZnZBLCBmdkIsIGZ2QywgdXZBLCB1dkIsIHV2QyApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlID0gZmFjZTtcblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBmO1xuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBNZXNoIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgQmFja1NpZGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgT3J0aG9ncmFwaGljQ2FtZXJhIH0gZnJvbSAnLi4vLi4vY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMnO1xuaW1wb3J0IHsgQm94QnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi8uLi9nZW9tZXRyaWVzL0JveEdlb21ldHJ5LmpzJztcbmltcG9ydCB7IFBsYW5lQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi8uLi9nZW9tZXRyaWVzL1BsYW5lR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi8uLi9tYXRlcmlhbHMvTWVzaEJhc2ljTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuLi8uLi9tYXRlcmlhbHMvU2hhZGVyTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi8uLi9vYmplY3RzL01lc2guanMnO1xuaW1wb3J0IHsgU2hhZGVyTGliIH0gZnJvbSAnLi4vc2hhZGVycy9TaGFkZXJMaWIuanMnO1xuXG5mdW5jdGlvbiBXZWJHTEJhY2tncm91bmQoIHJlbmRlcmVyLCBzdGF0ZSwgb2JqZWN0cywgcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdHZhciBjbGVhckNvbG9yID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR2YXIgY2xlYXJBbHBoYSA9IDA7XG5cblx0dmFyIHBsYW5lQ2FtZXJhLCBwbGFuZU1lc2g7XG5cdHZhciBib3hNZXNoO1xuXG5cdGZ1bmN0aW9uIHJlbmRlciggcmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgZm9yY2VDbGVhciApIHtcblxuXHRcdHZhciBiYWNrZ3JvdW5kID0gc2NlbmUuYmFja2dyb3VuZDtcblxuXHRcdGlmICggYmFja2dyb3VuZCA9PT0gbnVsbCApIHtcblxuXHRcdFx0c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc0NvbG9yICkge1xuXG5cdFx0XHRzZXRDbGVhciggYmFja2dyb3VuZCwgMSApO1xuXHRcdFx0Zm9yY2VDbGVhciA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlbmRlcmVyLmF1dG9DbGVhciB8fCBmb3JjZUNsZWFyICkge1xuXG5cdFx0XHRyZW5kZXJlci5jbGVhciggcmVuZGVyZXIuYXV0b0NsZWFyQ29sb3IsIHJlbmRlcmVyLmF1dG9DbGVhckRlcHRoLCByZW5kZXJlci5hdXRvQ2xlYXJTdGVuY2lsICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlICkge1xuXG5cdFx0XHRpZiAoIGJveE1lc2ggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRib3hNZXNoID0gbmV3IE1lc2goXG5cdFx0XHRcdFx0bmV3IEJveEJ1ZmZlckdlb21ldHJ5KCAxLCAxLCAxICksXG5cdFx0XHRcdFx0bmV3IFNoYWRlck1hdGVyaWFsKCB7XG5cdFx0XHRcdFx0XHR1bmlmb3JtczogU2hhZGVyTGliLmN1YmUudW5pZm9ybXMsXG5cdFx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckxpYi5jdWJlLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS5mcmFnbWVudFNoYWRlcixcblx0XHRcdFx0XHRcdHNpZGU6IEJhY2tTaWRlLFxuXHRcdFx0XHRcdFx0ZGVwdGhUZXN0OiB0cnVlLFxuXHRcdFx0XHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXG5cdFx0XHRcdFx0XHRmb2c6IGZhbHNlXG5cdFx0XHRcdFx0fSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ym94TWVzaC5nZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICdub3JtYWwnICk7XG5cdFx0XHRcdGJveE1lc2guZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAndXYnICk7XG5cblx0XHRcdFx0Ym94TWVzaC5vbkJlZm9yZVJlbmRlciA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fTtcblxuXHRcdFx0XHRvYmplY3RzLnVwZGF0ZSggYm94TWVzaCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJveE1lc2gubWF0ZXJpYWwudW5pZm9ybXMudEN1YmUudmFsdWUgPSBiYWNrZ3JvdW5kO1xuXG5cdFx0XHRyZW5kZXJMaXN0LnB1c2goIGJveE1lc2gsIGJveE1lc2guZ2VvbWV0cnksIGJveE1lc2gubWF0ZXJpYWwsIDAsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGlmICggcGxhbmVDYW1lcmEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRwbGFuZUNhbWVyYSA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gMSwgMSwgMSwgLSAxLCAwLCAxICk7XG5cblx0XHRcdFx0cGxhbmVNZXNoID0gbmV3IE1lc2goXG5cdFx0XHRcdFx0bmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIDIsIDIgKSxcblx0XHRcdFx0XHRuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgZGVwdGhUZXN0OiBmYWxzZSwgZGVwdGhXcml0ZTogZmFsc2UsIGZvZzogZmFsc2UgfSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0b2JqZWN0cy51cGRhdGUoIHBsYW5lTWVzaCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC5tYXAgPSBiYWNrZ3JvdW5kO1xuXG5cdFx0XHQvLyBUT0RPIFB1c2ggdGhpcyB0byByZW5kZXJMaXN0XG5cblx0XHRcdHJlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggcGxhbmVDYW1lcmEsIG51bGwsIHBsYW5lTWVzaC5nZW9tZXRyeSwgcGxhbmVNZXNoLm1hdGVyaWFsLCBwbGFuZU1lc2gsIG51bGwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0Q2xlYXIoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIsIGFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldENsZWFyQ29sb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIGNsZWFyQ29sb3I7XG5cblx0XHR9LFxuXHRcdHNldENsZWFyQ29sb3I6IGZ1bmN0aW9uICggY29sb3IsIGFscGhhICkge1xuXG5cdFx0XHRjbGVhckNvbG9yLnNldCggY29sb3IgKTtcblx0XHRcdGNsZWFyQWxwaGEgPSBhbHBoYSAhPT0gdW5kZWZpbmVkID8gYWxwaGEgOiAxO1xuXHRcdFx0c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblxuXHRcdH0sXG5cdFx0Z2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gY2xlYXJBbHBoYTtcblxuXHRcdH0sXG5cdFx0c2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24gKCBhbHBoYSApIHtcblxuXHRcdFx0Y2xlYXJBbHBoYSA9IGFscGhhO1xuXHRcdFx0c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblxuXHRcdH0sXG5cdFx0cmVuZGVyOiByZW5kZXJcblxuXHR9O1xuXG59XG5cblxuZXhwb3J0IHsgV2ViR0xCYWNrZ3JvdW5kIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm8sIGNhcGFiaWxpdGllcyApIHtcblxuXHR2YXIgbW9kZTtcblxuXHRmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHtcblxuXHRcdG1vZGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyKCBzdGFydCwgY291bnQgKSB7XG5cblx0XHRnbC5kcmF3QXJyYXlzKCBtb2RlLCBzdGFydCwgY291bnQgKTtcblxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBzdGFydCwgY291bnQgKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uO1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGdsO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvblsgY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gJ2RyYXdBcnJheXNJbnN0YW5jZWQnIDogJ2RyYXdBcnJheXNJbnN0YW5jZWRBTkdMRScgXSggbW9kZSwgc3RhcnQsIGNvdW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlLCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XG5cdHRoaXMucmVuZGVyID0gcmVuZGVyO1xuXHR0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlcztcblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMQnVmZmVyUmVuZGVyZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENhcGFiaWxpdGllcyggZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIG1heEFuaXNvdHJvcHk7XG5cblx0ZnVuY3Rpb24gZ2V0TWF4QW5pc290cm9weSgpIHtcblxuXHRcdGlmICggbWF4QW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIG1heEFuaXNvdHJvcHk7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IGdsLmdldFBhcmFtZXRlciggZXh0ZW5zaW9uLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IDA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF4QW5pc290cm9weTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKSB7XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ2hpZ2hwJyApIHtcblxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLlZFUlRFWF9TSEFERVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmXG5cdFx0XHQgICAgIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuRlJBR01FTlRfU0hBREVSLCBnbC5ISUdIX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ2hpZ2hwJztcblxuXHRcdFx0fVxuXG5cdFx0XHRwcmVjaXNpb24gPSAnbWVkaXVtcCc7XG5cblx0XHR9XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ21lZGl1bXAnICkge1xuXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuVkVSVEVYX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCAmJlxuXHRcdFx0ICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ21lZGl1bXAnO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gJ2xvd3AnO1xuXG5cdH1cblxuXHR2YXIgaXNXZWJHTDIgPSB0eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2wgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuXG5cdHZhciBwcmVjaXNpb24gPSBwYXJhbWV0ZXJzLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVjaXNpb24gOiAnaGlnaHAnO1xuXHR2YXIgbWF4UHJlY2lzaW9uID0gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKTtcblxuXHRpZiAoIG1heFByZWNpc2lvbiAhPT0gcHJlY2lzaW9uICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjonLCBwcmVjaXNpb24sICdub3Qgc3VwcG9ydGVkLCB1c2luZycsIG1heFByZWNpc2lvbiwgJ2luc3RlYWQuJyApO1xuXHRcdHByZWNpc2lvbiA9IG1heFByZWNpc2lvbjtcblxuXHR9XG5cblx0dmFyIGxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPSBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPT09IHRydWU7XG5cblx0dmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xuXHR2YXIgbWF4VmVydGV4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xuXHR2YXIgbWF4VGV4dHVyZVNpemUgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9URVhUVVJFX1NJWkUgKTtcblx0dmFyIG1heEN1YmVtYXBTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICk7XG5cblx0dmFyIG1heEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfQVRUUklCUyApO1xuXHR2YXIgbWF4VmVydGV4VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTICk7XG5cdHZhciBtYXhWYXJ5aW5ncyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZBUllJTkdfVkVDVE9SUyApO1xuXHR2YXIgbWF4RnJhZ21lbnRVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyApO1xuXG5cdHZhciB2ZXJ0ZXhUZXh0dXJlcyA9IG1heFZlcnRleFRleHR1cmVzID4gMDtcblx0dmFyIGZsb2F0RnJhZ21lbnRUZXh0dXJlcyA9IGlzV2ViR0wyIHx8ICEhIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cdHZhciBmbG9hdFZlcnRleFRleHR1cmVzID0gdmVydGV4VGV4dHVyZXMgJiYgZmxvYXRGcmFnbWVudFRleHR1cmVzO1xuXG5cdHJldHVybiB7XG5cblx0XHRpc1dlYkdMMjogaXNXZWJHTDIsXG5cblx0XHRnZXRNYXhBbmlzb3Ryb3B5OiBnZXRNYXhBbmlzb3Ryb3B5LFxuXHRcdGdldE1heFByZWNpc2lvbjogZ2V0TWF4UHJlY2lzaW9uLFxuXG5cdFx0cHJlY2lzaW9uOiBwcmVjaXNpb24sXG5cdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixcblxuXHRcdG1heFRleHR1cmVzOiBtYXhUZXh0dXJlcyxcblx0XHRtYXhWZXJ0ZXhUZXh0dXJlczogbWF4VmVydGV4VGV4dHVyZXMsXG5cdFx0bWF4VGV4dHVyZVNpemU6IG1heFRleHR1cmVTaXplLFxuXHRcdG1heEN1YmVtYXBTaXplOiBtYXhDdWJlbWFwU2l6ZSxcblxuXHRcdG1heEF0dHJpYnV0ZXM6IG1heEF0dHJpYnV0ZXMsXG5cdFx0bWF4VmVydGV4VW5pZm9ybXM6IG1heFZlcnRleFVuaWZvcm1zLFxuXHRcdG1heFZhcnlpbmdzOiBtYXhWYXJ5aW5ncyxcblx0XHRtYXhGcmFnbWVudFVuaWZvcm1zOiBtYXhGcmFnbWVudFVuaWZvcm1zLFxuXG5cdFx0dmVydGV4VGV4dHVyZXM6IHZlcnRleFRleHR1cmVzLFxuXHRcdGZsb2F0RnJhZ21lbnRUZXh0dXJlczogZmxvYXRGcmFnbWVudFRleHR1cmVzLFxuXHRcdGZsb2F0VmVydGV4VGV4dHVyZXM6IGZsb2F0VmVydGV4VGV4dHVyZXNcblxuXHR9O1xuXG59XG5cblxuZXhwb3J0IHsgV2ViR0xDYXBhYmlsaXRpZXMgfTtcbiIsIi8qKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDMuanMnO1xuaW1wb3J0IHsgUGxhbmUgfSBmcm9tICcuLi8uLi9tYXRoL1BsYW5lLmpzJztcblxuZnVuY3Rpb24gV2ViR0xDbGlwcGluZygpIHtcblxuXHR2YXIgc2NvcGUgPSB0aGlzLFxuXG5cdFx0Z2xvYmFsU3RhdGUgPSBudWxsLFxuXHRcdG51bUdsb2JhbFBsYW5lcyA9IDAsXG5cdFx0bG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSxcblx0XHRyZW5kZXJpbmdTaGFkb3dzID0gZmFsc2UsXG5cblx0XHRwbGFuZSA9IG5ldyBQbGFuZSgpLFxuXHRcdHZpZXdOb3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLFxuXG5cdFx0dW5pZm9ybSA9IHsgdmFsdWU6IG51bGwsIG5lZWRzVXBkYXRlOiBmYWxzZSB9O1xuXG5cdHRoaXMudW5pZm9ybSA9IHVuaWZvcm07XG5cdHRoaXMubnVtUGxhbmVzID0gMDtcblx0dGhpcy5udW1JbnRlcnNlY3Rpb24gPSAwO1xuXG5cdHRoaXMuaW5pdCA9IGZ1bmN0aW9uICggcGxhbmVzLCBlbmFibGVMb2NhbENsaXBwaW5nLCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgZW5hYmxlZCA9XG5cdFx0XHRwbGFuZXMubGVuZ3RoICE9PSAwIHx8XG5cdFx0XHRlbmFibGVMb2NhbENsaXBwaW5nIHx8XG5cdFx0XHQvLyBlbmFibGUgc3RhdGUgb2YgcHJldmlvdXMgZnJhbWUgLSB0aGUgY2xpcHBpbmcgY29kZSBoYXMgdG9cblx0XHRcdC8vIHJ1biBhbm90aGVyIGZyYW1lIGluIG9yZGVyIHRvIHJlc2V0IHRoZSBzdGF0ZTpcblx0XHRcdG51bUdsb2JhbFBsYW5lcyAhPT0gMCB8fFxuXHRcdFx0bG9jYWxDbGlwcGluZ0VuYWJsZWQ7XG5cblx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGVuYWJsZUxvY2FsQ2xpcHBpbmc7XG5cblx0XHRnbG9iYWxTdGF0ZSA9IHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCAwICk7XG5cdFx0bnVtR2xvYmFsUGxhbmVzID0gcGxhbmVzLmxlbmd0aDtcblxuXHRcdHJldHVybiBlbmFibGVkO1xuXG5cdH07XG5cblx0dGhpcy5iZWdpblNoYWRvd3MgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZW5kZXJpbmdTaGFkb3dzID0gdHJ1ZTtcblx0XHRwcm9qZWN0UGxhbmVzKCBudWxsICk7XG5cblx0fTtcblxuXHR0aGlzLmVuZFNoYWRvd3MgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZW5kZXJpbmdTaGFkb3dzID0gZmFsc2U7XG5cdFx0cmVzZXRHbG9iYWxTdGF0ZSgpO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTdGF0ZSA9IGZ1bmN0aW9uICggcGxhbmVzLCBjbGlwSW50ZXJzZWN0aW9uLCBjbGlwU2hhZG93cywgY2FtZXJhLCBjYWNoZSwgZnJvbUNhY2hlICkge1xuXG5cdFx0aWYgKCAhIGxvY2FsQ2xpcHBpbmdFbmFibGVkIHx8IHBsYW5lcyA9PT0gbnVsbCB8fCBwbGFuZXMubGVuZ3RoID09PSAwIHx8IHJlbmRlcmluZ1NoYWRvd3MgJiYgISBjbGlwU2hhZG93cyApIHtcblxuXHRcdFx0Ly8gdGhlcmUncyBubyBsb2NhbCBjbGlwcGluZ1xuXG5cdFx0XHRpZiAoIHJlbmRlcmluZ1NoYWRvd3MgKSB7XG5cblx0XHRcdFx0Ly8gdGhlcmUncyBubyBnbG9iYWwgY2xpcHBpbmdcblxuXHRcdFx0XHRwcm9qZWN0UGxhbmVzKCBudWxsICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVzZXRHbG9iYWxTdGF0ZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbkdsb2JhbCA9IHJlbmRlcmluZ1NoYWRvd3MgPyAwIDogbnVtR2xvYmFsUGxhbmVzLFxuXHRcdFx0XHRsR2xvYmFsID0gbkdsb2JhbCAqIDQsXG5cblx0XHRcdFx0ZHN0QXJyYXkgPSBjYWNoZS5jbGlwcGluZ1N0YXRlIHx8IG51bGw7XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBkc3RBcnJheTsgLy8gZW5zdXJlIHVuaXF1ZSBzdGF0ZVxuXG5cdFx0XHRkc3RBcnJheSA9IHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBsR2xvYmFsLCBmcm9tQ2FjaGUgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBsR2xvYmFsOyArKyBpICkge1xuXG5cdFx0XHRcdGRzdEFycmF5WyBpIF0gPSBnbG9iYWxTdGF0ZVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNhY2hlLmNsaXBwaW5nU3RhdGUgPSBkc3RBcnJheTtcblx0XHRcdHRoaXMubnVtSW50ZXJzZWN0aW9uID0gY2xpcEludGVyc2VjdGlvbiA/IHRoaXMubnVtUGxhbmVzIDogMDtcblx0XHRcdHRoaXMubnVtUGxhbmVzICs9IG5HbG9iYWw7XG5cblx0XHR9XG5cblxuXHR9O1xuXG5cdGZ1bmN0aW9uIHJlc2V0R2xvYmFsU3RhdGUoKSB7XG5cblx0XHRpZiAoIHVuaWZvcm0udmFsdWUgIT09IGdsb2JhbFN0YXRlICkge1xuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZ2xvYmFsU3RhdGU7XG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gbnVtR2xvYmFsUGxhbmVzID4gMDtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG51bUdsb2JhbFBsYW5lcztcblx0XHRzY29wZS5udW1JbnRlcnNlY3Rpb24gPSAwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgZHN0T2Zmc2V0LCBza2lwVHJhbnNmb3JtICkge1xuXG5cdFx0dmFyIG5QbGFuZXMgPSBwbGFuZXMgIT09IG51bGwgPyBwbGFuZXMubGVuZ3RoIDogMCxcblx0XHRcdGRzdEFycmF5ID0gbnVsbDtcblxuXHRcdGlmICggblBsYW5lcyAhPT0gMCApIHtcblxuXHRcdFx0ZHN0QXJyYXkgPSB1bmlmb3JtLnZhbHVlO1xuXG5cdFx0XHRpZiAoIHNraXBUcmFuc2Zvcm0gIT09IHRydWUgfHwgZHN0QXJyYXkgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIGZsYXRTaXplID0gZHN0T2Zmc2V0ICsgblBsYW5lcyAqIDQsXG5cdFx0XHRcdFx0dmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7XG5cblx0XHRcdFx0dmlld05vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHRpZiAoIGRzdEFycmF5ID09PSBudWxsIHx8IGRzdEFycmF5Lmxlbmd0aCA8IGZsYXRTaXplICkge1xuXG5cdFx0XHRcdFx0ZHN0QXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBmbGF0U2l6ZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGk0ID0gZHN0T2Zmc2V0OyBpICE9PSBuUGxhbmVzOyArKyBpLCBpNCArPSA0ICkge1xuXG5cdFx0XHRcdFx0cGxhbmUuY29weSggcGxhbmVzWyBpIF0gKS5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXgsIHZpZXdOb3JtYWxNYXRyaXggKTtcblxuXHRcdFx0XHRcdHBsYW5lLm5vcm1hbC50b0FycmF5KCBkc3RBcnJheSwgaTQgKTtcblx0XHRcdFx0XHRkc3RBcnJheVsgaTQgKyAzIF0gPSBwbGFuZS5jb25zdGFudDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5O1xuXHRcdFx0dW5pZm9ybS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRzY29wZS5udW1QbGFuZXMgPSBuUGxhbmVzO1xuXG5cdFx0cmV0dXJuIGRzdEFycmF5O1xuXG5cdH1cblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMQ2xpcHBpbmcgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEV4dGVuc2lvbnMoIGdsICkge1xuXG5cdHZhciBleHRlbnNpb25zID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnNbIG5hbWUgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBleHRlbnNpb25zWyBuYW1lIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdFx0c3dpdGNoICggbmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9kZXB0aF90ZXh0dXJlJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Yyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCBuYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIG5hbWUgKyAnIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRleHRlbnNpb25zWyBuYW1lIF0gPSBleHRlbnNpb247XG5cblx0XHRcdHJldHVybiBleHRlbnNpb247XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMRXh0ZW5zaW9ucyB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmltcG9ydCB7IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgVWludDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi8uLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IGFycmF5TWF4IH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5mdW5jdGlvbiBXZWJHTEdlb21ldHJpZXMoIGdsLCBhdHRyaWJ1dGVzLCBpbmZvICkge1xuXG5cdHZhciBnZW9tZXRyaWVzID0ge307XG5cdHZhciB3aXJlZnJhbWVBdHRyaWJ1dGVzID0ge307XG5cblx0ZnVuY3Rpb24gb25HZW9tZXRyeURpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gZXZlbnQudGFyZ2V0O1xuXHRcdHZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYnVmZmVyZ2VvbWV0cnkuaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGJ1ZmZlcmdlb21ldHJ5LmF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBidWZmZXJnZW9tZXRyeS5hdHRyaWJ1dGVzWyBuYW1lIF0gKTtcblxuXHRcdH1cblxuXHRcdGdlb21ldHJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTtcblxuXHRcdGRlbGV0ZSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0dmFyIGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZGVsZXRlIHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYnVmZmVyZ2VvbWV0cnkgKSByZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0XHRnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5cblx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpLnNldEZyb21PYmplY3QoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5O1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXSA9IGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyArKztcblxuXHRcdHJldHVybiBidWZmZXJnZW9tZXRyeTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGluZGV4LCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGFycmF5WyBpIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkgcmV0dXJuIGF0dHJpYnV0ZTtcblxuXHRcdHZhciBpbmRpY2VzID0gW107XG5cblx0XHR2YXIgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gY29uc29sZS50aW1lKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0aWYgKCBnZW9tZXRyeUluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBhcnJheVsgaSArIDAgXTtcblx0XHRcdFx0dmFyIGIgPSBhcnJheVsgaSArIDEgXTtcblx0XHRcdFx0dmFyIGMgPSBhcnJheVsgaSArIDIgXTtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gZ2VvbWV0cnlBdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSAoIGFycmF5Lmxlbmd0aCAvIDMgKSAtIDE7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBpICsgMDtcblx0XHRcdFx0dmFyIGIgPSBpICsgMTtcblx0XHRcdFx0dmFyIGMgPSBpICsgMjtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29uc29sZS50aW1lRW5kKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0YXR0cmlidXRlID0gbmV3ICggYXJyYXlNYXgoIGluZGljZXMgKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGljZXMsIDEgKTtcblxuXHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBhdHRyaWJ1dGUsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7XG5cblx0XHR3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdID0gYXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZ2V0LFxuXHRcdHVwZGF0ZTogdXBkYXRlLFxuXG5cdFx0Z2V0V2lyZWZyYW1lQXR0cmlidXRlOiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGVcblxuXHR9O1xuXG59XG5cblxuZXhwb3J0IHsgV2ViR0xHZW9tZXRyaWVzIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0dmFyIG1vZGU7XG5cblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XG5cblx0XHRtb2RlID0gdmFsdWU7XG5cblx0fVxuXG5cdHZhciB0eXBlLCBieXRlc1BlckVsZW1lbnQ7XG5cblx0ZnVuY3Rpb24gc2V0SW5kZXgoIHZhbHVlICkge1xuXG5cdFx0dHlwZSA9IHZhbHVlLnR5cGU7XG5cdFx0Ynl0ZXNQZXJFbGVtZW50ID0gdmFsdWUuYnl0ZXNQZXJFbGVtZW50O1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdGdsLmRyYXdFbGVtZW50cyggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBnbDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvblsgY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gJ2RyYXdFbGVtZW50c0luc3RhbmNlZCcgOiAnZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUnIF0oIG1vZGUsIGNvdW50LCB0eXBlLCBzdGFydCAqIGJ5dGVzUGVyRWxlbWVudCwgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKTtcblxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSwgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKTtcblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLnNldE1vZGUgPSBzZXRNb2RlO1xuXHR0aGlzLnNldEluZGV4ID0gc2V0SW5kZXg7XG5cdHRoaXMucmVuZGVyID0gcmVuZGVyO1xuXHR0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlcztcblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyIH07XG4iLCIvKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gV2ViR0xJbmZvKCBnbCApIHtcblxuXHR2YXIgbWVtb3J5ID0ge1xuXHRcdGdlb21ldHJpZXM6IDAsXG5cdFx0dGV4dHVyZXM6IDBcblx0fTtcblxuXHR2YXIgcmVuZGVyID0ge1xuXHRcdGZyYW1lOiAwLFxuXHRcdGNhbGxzOiAwLFxuXHRcdHRyaWFuZ2xlczogMCxcblx0XHRwb2ludHM6IDAsXG5cdFx0bGluZXM6IDBcblx0fTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIGNvdW50LCBtb2RlLCBpbnN0YW5jZUNvdW50ICkge1xuXG5cdFx0aW5zdGFuY2VDb3VudCA9IGluc3RhbmNlQ291bnQgfHwgMTtcblxuXHRcdHJlbmRlci5jYWxscyArKztcblxuXHRcdHN3aXRjaCAoIG1vZGUgKSB7XG5cblx0XHRcdGNhc2UgZ2wuVFJJQU5HTEVTOlxuXHRcdFx0XHRyZW5kZXIudHJpYW5nbGVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC8gMyApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBnbC5UUklBTkdMRV9TVFJJUDpcblx0XHRcdGNhc2UgZ2wuVFJJQU5HTEVfRkFOOlxuXHRcdFx0XHRyZW5kZXIudHJpYW5nbGVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC0gMiApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBnbC5MSU5FUzpcblx0XHRcdFx0cmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC8gMiApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBnbC5MSU5FX1NUUklQOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLSAxICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLkxJTkVfTE9PUDpcblx0XHRcdFx0cmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiBjb3VudDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgZ2wuUE9JTlRTOlxuXHRcdFx0XHRyZW5kZXIucG9pbnRzICs9IGluc3RhbmNlQ291bnQgKiBjb3VudDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEluZm86IFVua25vd24gZHJhdyBtb2RlOicsIG1vZGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0cmVuZGVyLmZyYW1lICsrO1xuXHRcdHJlbmRlci5jYWxscyA9IDA7XG5cdFx0cmVuZGVyLnRyaWFuZ2xlcyA9IDA7XG5cdFx0cmVuZGVyLnBvaW50cyA9IDA7XG5cdFx0cmVuZGVyLmxpbmVzID0gMDtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRtZW1vcnk6IG1lbW9yeSxcblx0XHRyZW5kZXI6IHJlbmRlcixcblx0XHRwcm9ncmFtczogbnVsbCxcblx0XHRhdXRvUmVzZXQ6IHRydWUsXG5cdFx0cmVzZXQ6IHJlc2V0LFxuXHRcdHVwZGF0ZTogdXBkYXRlXG5cdH07XG5cbn1cblxuXG5leHBvcnQgeyBXZWJHTEluZm8gfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBhYnNOdW1lcmljYWxTb3J0KCBhLCBiICkge1xuXG5cdHJldHVybiBNYXRoLmFicyggYlsgMSBdICkgLSBNYXRoLmFicyggYVsgMSBdICk7XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xNb3JwaHRhcmdldHMoIGdsICkge1xuXG5cdHZhciBpbmZsdWVuY2VzTGlzdCA9IHt9O1xuXHR2YXIgbW9ycGhJbmZsdWVuY2VzID0gbmV3IEZsb2F0MzJBcnJheSggOCApO1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHByb2dyYW0gKSB7XG5cblx0XHR2YXIgb2JqZWN0SW5mbHVlbmNlcyA9IG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7XG5cblx0XHR2YXIgbGVuZ3RoID0gb2JqZWN0SW5mbHVlbmNlcy5sZW5ndGg7XG5cblx0XHR2YXIgaW5mbHVlbmNlcyA9IGluZmx1ZW5jZXNMaXN0WyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBpbmZsdWVuY2VzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGluaXRpYWxpc2UgbGlzdFxuXG5cdFx0XHRpbmZsdWVuY2VzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRpbmZsdWVuY2VzWyBpIF0gPSBbIGksIDAgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpbmZsdWVuY2VzTGlzdFsgZ2VvbWV0cnkuaWQgXSA9IGluZmx1ZW5jZXM7XG5cblx0XHR9XG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzID0gbWF0ZXJpYWwubW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHR2YXIgbW9ycGhOb3JtYWxzID0gbWF0ZXJpYWwubW9ycGhOb3JtYWxzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHQvLyBSZW1vdmUgY3VycmVudCBtb3JwaEF0dHJpYnV0ZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBpbmZsdWVuY2VbIDEgXSAhPT0gMCApIHtcblxuXHRcdFx0XHRpZiAoIG1vcnBoVGFyZ2V0cyApIGdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGkgKTtcblx0XHRcdFx0aWYgKCBtb3JwaE5vcm1hbHMgKSBnZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICdtb3JwaE5vcm1hbCcgKyBpICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIENvbGxlY3QgaW5mbHVlbmNlc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW5mbHVlbmNlID0gaW5mbHVlbmNlc1sgaSBdO1xuXG5cdFx0XHRpbmZsdWVuY2VbIDAgXSA9IGk7XG5cdFx0XHRpbmZsdWVuY2VbIDEgXSA9IG9iamVjdEluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdH1cblxuXHRcdGluZmx1ZW5jZXMuc29ydCggYWJzTnVtZXJpY2FsU29ydCApO1xuXG5cdFx0Ly8gQWRkIG1vcnBoQXR0cmlidXRlc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgODsgaSArKyApIHtcblxuXHRcdFx0dmFyIGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBpbmZsdWVuY2UgKSB7XG5cblx0XHRcdFx0dmFyIGluZGV4ID0gaW5mbHVlbmNlWyAwIF07XG5cdFx0XHRcdHZhciB2YWx1ZSA9IGluZmx1ZW5jZVsgMSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgKSB7XG5cblx0XHRcdFx0XHRpZiAoIG1vcnBoVGFyZ2V0cyApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGksIG1vcnBoVGFyZ2V0c1sgaW5kZXggXSApO1xuXHRcdFx0XHRcdGlmICggbW9ycGhOb3JtYWxzICkgZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSwgbW9ycGhOb3JtYWxzWyBpbmRleCBdICk7XG5cblx0XHRcdFx0XHRtb3JwaEluZmx1ZW5jZXNbIGkgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRtb3JwaEluZmx1ZW5jZXNbIGkgXSA9IDA7XG5cblx0XHR9XG5cblx0XHRwcm9ncmFtLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoIGdsLCAnbW9ycGhUYXJnZXRJbmZsdWVuY2VzJywgbW9ycGhJbmZsdWVuY2VzICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHR1cGRhdGU6IHVwZGF0ZVxuXG5cdH07XG5cbn1cblxuXG5leHBvcnQgeyBXZWJHTE1vcnBodGFyZ2V0cyB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMT2JqZWN0cyggZ2VvbWV0cmllcywgaW5mbyApIHtcblxuXHR2YXIgdXBkYXRlTGlzdCA9IHt9O1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGZyYW1lID0gaW5mby5yZW5kZXIuZnJhbWU7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllcy5nZXQoIG9iamVjdCwgZ2VvbWV0cnkgKTtcblxuXHRcdC8vIFVwZGF0ZSBvbmNlIHBlciBmcmFtZVxuXG5cdFx0aWYgKCB1cGRhdGVMaXN0WyBidWZmZXJnZW9tZXRyeS5pZCBdICE9PSBmcmFtZSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdGJ1ZmZlcmdlb21ldHJ5LnVwZGF0ZUZyb21PYmplY3QoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJpZXMudXBkYXRlKCBidWZmZXJnZW9tZXRyeSApO1xuXG5cdFx0XHR1cGRhdGVMaXN0WyBidWZmZXJnZW9tZXRyeS5pZCBdID0gZnJhbWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHR1cGRhdGVMaXN0ID0ge307XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHR1cGRhdGU6IHVwZGF0ZSxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cblx0fTtcblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMT2JqZWN0cyB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL1RleHR1cmUuanMnO1xuaW1wb3J0IHsgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcblxuZnVuY3Rpb24gQ3ViZVRleHR1cmUoIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHtcblxuXHRpbWFnZXMgPSBpbWFnZXMgIT09IHVuZGVmaW5lZCA/IGltYWdlcyA6IFtdO1xuXHRtYXBwaW5nID0gbWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFwcGluZyA6IEN1YmVSZWZsZWN0aW9uTWFwcGluZztcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblxufVxuXG5DdWJlVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuQ3ViZVRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViZVRleHR1cmU7XG5cbkN1YmVUZXh0dXJlLnByb3RvdHlwZS5pc0N1YmVUZXh0dXJlID0gdHJ1ZTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBDdWJlVGV4dHVyZS5wcm90b3R5cGUsICdpbWFnZXMnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5pbWFnZTtcblxuXHR9LFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuaW1hZ2UgPSB2YWx1ZTtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBDdWJlVGV4dHVyZSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqXG4gKiBVbmlmb3JtcyBvZiBhIHByb2dyYW0uXG4gKiBUaG9zZSBmb3JtIGEgdHJlZSBzdHJ1Y3R1cmUgd2l0aCBhIHNwZWNpYWwgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgdGhlIHJvb3QsXG4gKiB3aGljaCB5b3UgZ2V0IGJ5IGNhbGxpbmcgJ25ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKScuXG4gKlxuICpcbiAqIFByb3BlcnRpZXMgb2YgaW5uZXIgbm9kZXMgaW5jbHVkaW5nIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyOlxuICpcbiAqIC5zZXEgLSBhcnJheSBvZiBuZXN0ZWQgdW5pZm9ybXNcbiAqIC5tYXAgLSBuZXN0ZWQgdW5pZm9ybXMgYnkgbmFtZVxuICpcbiAqXG4gKiBNZXRob2RzIG9mIGFsbCBub2RlcyBleGNlcHQgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6XG4gKlxuICogLnNldFZhbHVlKCBnbCwgdmFsdWUsIFtyZW5kZXJlcl0gKVxuICpcbiAqIFx0XHR1cGxvYWRzIGEgdW5pZm9ybSB2YWx1ZShzKVxuICogIFx0dGhlICdyZW5kZXJlcicgcGFyYW1ldGVyIGlzIG5lZWRlZCBmb3Igc2FtcGxlciB1bmlmb3Jtc1xuICpcbiAqXG4gKiBTdGF0aWMgbWV0aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAocmVuZGVyZXIgZmFjdG9yaXphdGlvbnMpOlxuICpcbiAqIC51cGxvYWQoIGdsLCBzZXEsIHZhbHVlcywgcmVuZGVyZXIgKVxuICpcbiAqIFx0XHRzZXRzIHVuaWZvcm1zIGluICdzZXEnIHRvICd2YWx1ZXNbaWRdLnZhbHVlJ1xuICpcbiAqIC5zZXFXaXRoVmFsdWUoIHNlcSwgdmFsdWVzICkgOiBmaWx0ZXJlZFNlcVxuICpcbiAqIFx0XHRmaWx0ZXJzICdzZXEnIGVudHJpZXMgd2l0aCBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHZhbHVlc1xuICpcbiAqXG4gKiBNZXRob2RzIG9mIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyIChyZW5kZXJlciBmYWN0b3JpemF0aW9ucyk6XG4gKlxuICogLnNldFZhbHVlKCBnbCwgbmFtZSwgdmFsdWUgKVxuICpcbiAqIFx0XHRzZXRzIHVuaWZvcm0gd2l0aCAgbmFtZSAnbmFtZScgdG8gJ3ZhbHVlJ1xuICpcbiAqIC5zZXQoIGdsLCBvYmosIHByb3AgKVxuICpcbiAqIFx0XHRzZXRzIHVuaWZvcm0gZnJvbSBvYmplY3QgYW5kIHByb3BlcnR5IHdpdGggc2FtZSBuYW1lIHRoYW4gdW5pZm9ybVxuICpcbiAqIC5zZXRPcHRpb25hbCggZ2wsIG9iaiwgcHJvcCApXG4gKlxuICogXHRcdGxpa2UgLnNldCBmb3IgYW4gb3B0aW9uYWwgcHJvcGVydHkgb2YgdGhlIG9iamVjdFxuICpcbiAqL1xuXG5pbXBvcnQgeyBDdWJlVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0N1YmVUZXh0dXJlLmpzJztcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9UZXh0dXJlLmpzJztcblxudmFyIGVtcHR5VGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XG52YXIgZW1wdHlDdWJlVGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xuXG4vLyAtLS0gQmFzZSBmb3IgaW5uZXIgbm9kZXMgKGluY2x1ZGluZyB0aGUgcm9vdCkgLS0tXG5cbmZ1bmN0aW9uIFVuaWZvcm1Db250YWluZXIoKSB7XG5cblx0dGhpcy5zZXEgPSBbXTtcblx0dGhpcy5tYXAgPSB7fTtcblxufVxuXG4vLyAtLS0gVXRpbGl0aWVzIC0tLVxuXG4vLyBBcnJheSBDYWNoZXMgKHByb3ZpZGUgdHlwZWQgYXJyYXlzIGZvciB0ZW1wb3JhcnkgYnkgc2l6ZSlcblxudmFyIGFycmF5Q2FjaGVGMzIgPSBbXTtcbnZhciBhcnJheUNhY2hlSTMyID0gW107XG5cbi8vIEZsb2F0MzJBcnJheSBjYWNoZXMgdXNlZCBmb3IgdXBsb2FkaW5nIE1hdHJpeCB1bmlmb3Jtc1xuXG52YXIgbWF0NGFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggMTYgKTtcbnZhciBtYXQzYXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCA5ICk7XG52YXIgbWF0MmFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggNCApO1xuXG4vLyBGbGF0dGVuaW5nIGZvciBhcnJheXMgb2YgdmVjdG9ycyBhbmQgbWF0cmljZXNcblxuZnVuY3Rpb24gZmxhdHRlbiggYXJyYXksIG5CbG9ja3MsIGJsb2NrU2l6ZSApIHtcblxuXHR2YXIgZmlyc3RFbGVtID0gYXJyYXlbIDAgXTtcblxuXHRpZiAoIGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDAgKSByZXR1cm4gYXJyYXk7XG5cdC8vIHVub3B0aW1pemVkOiAhIGlzTmFOKCBmaXJzdEVsZW0gKVxuXHQvLyBzZWUgaHR0cDovL2phY2tzb25kdW5zdGFuLmNvbS9hcnRpY2xlcy85ODNcblxuXHR2YXIgbiA9IG5CbG9ja3MgKiBibG9ja1NpemUsXG5cdFx0ciA9IGFycmF5Q2FjaGVGMzJbIG4gXTtcblxuXHRpZiAoIHIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHIgPSBuZXcgRmxvYXQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUYzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0aWYgKCBuQmxvY2tzICE9PSAwICkge1xuXG5cdFx0Zmlyc3RFbGVtLnRvQXJyYXkoIHIsIDAgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMSwgb2Zmc2V0ID0gMDsgaSAhPT0gbkJsb2NrczsgKysgaSApIHtcblxuXHRcdFx0b2Zmc2V0ICs9IGJsb2NrU2l6ZTtcblx0XHRcdGFycmF5WyBpIF0udG9BcnJheSggciwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59XG5cbmZ1bmN0aW9uIGFycmF5c0VxdWFsKCBhLCBiICkge1xuXG5cdGlmICggYS5sZW5ndGggIT09IGIubGVuZ3RoICkgcmV0dXJuIGZhbHNlO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IGEubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdGlmICggYVsgaSBdICE9PSBiWyBpIF0gKSByZXR1cm4gZmFsc2U7XG5cblx0fVxuXG5cdHJldHVybiB0cnVlO1xuXG59XG5cbmZ1bmN0aW9uIGNvcHlBcnJheSggYSwgYiApIHtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBiLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRhWyBpIF0gPSBiWyBpIF07XG5cblx0fVxuXG59XG5cbi8vIFRleHR1cmUgdW5pdCBhbGxvY2F0aW9uXG5cbmZ1bmN0aW9uIGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICkge1xuXG5cdHZhciByID0gYXJyYXlDYWNoZUkzMlsgbiBdO1xuXG5cdGlmICggciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0ciA9IG5ldyBJbnQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUkzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpIClcblx0XHRyWyBpIF0gPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7XG5cblx0cmV0dXJuIHI7XG5cbn1cblxuLy8gLS0tIFNldHRlcnMgLS0tXG5cbi8vIE5vdGU6IERlZmluaW5nIHRoZXNlIG1ldGhvZHMgZXh0ZXJuYWxseSwgYmVjYXVzZSB0aGV5IGNvbWUgaW4gYSBidW5jaFxuLy8gYW5kIHRoaXMgd2F5IHRoZWlyIG5hbWVzIG1pbmlmeS5cblxuLy8gU2luZ2xlIHNjYWxhclxuXG5mdW5jdGlvbiBzZXRWYWx1ZTFmKCBnbCwgdiApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggY2FjaGVbIDAgXSA9PT0gdiApIHJldHVybjtcblxuXHRnbC51bmlmb3JtMWYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNhY2hlWyAwIF0gPSB2O1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlMWkoIGdsLCB2ICkge1xuXG5cdHZhciBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0aWYgKCBjYWNoZVsgMCBdID09PSB2ICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB2ICk7XG5cblx0Y2FjaGVbIDAgXSA9IHY7XG5cbn1cblxuLy8gU2luZ2xlIGZsb2F0IHZlY3RvciAoZnJvbSBmbGF0IGFycmF5IG9yIFRIUkVFLlZlY3Rvck4pXG5cbmZ1bmN0aW9uIHNldFZhbHVlMmZ2KCBnbCwgdiApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGNhY2hlWyAwIF0gIT09IHYueCB8fCBjYWNoZVsgMSBdICE9PSB2LnkgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2LngsIHYueSApO1xuXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRcdGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgdiApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNmdiggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiApIHtcblxuXHRcdFx0Z2wudW5pZm9ybTNmKCB0aGlzLmFkZHIsIHYueCwgdi55LCB2LnogKTtcblxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYueDtcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lnk7XG5cdFx0XHRjYWNoZVsgMiBdID0gdi56O1xuXG5cdFx0fVxuXG5cdH0gZWxzZSBpZiAoIHYuciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnIgfHwgY2FjaGVbIDEgXSAhPT0gdi5nIHx8IGNhY2hlWyAyIF0gIT09IHYuYiApIHtcblxuXHRcdFx0Z2wudW5pZm9ybTNmKCB0aGlzLmFkZHIsIHYuciwgdi5nLCB2LmIgKTtcblxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYucjtcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lmc7XG5cdFx0XHRjYWNoZVsgMiBdID0gdi5iO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdFx0Z2wudW5pZm9ybTNmdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlNGZ2KCBnbCwgdiApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGNhY2hlWyAwIF0gIT09IHYueCB8fCBjYWNoZVsgMSBdICE9PSB2LnkgfHwgY2FjaGVbIDIgXSAhPT0gdi56IHx8IGNhY2hlWyAzIF0gIT09IHYudyApIHtcblxuXHRcdFx0Z2wudW5pZm9ybTRmKCB0aGlzLmFkZHIsIHYueCwgdi55LCB2LnosIHYudyApO1xuXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcblx0XHRcdGNhY2hlWyAyIF0gPSB2Lno7XG5cdFx0XHRjYWNoZVsgMyBdID0gdi53O1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdFx0Z2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XG5cblx0fVxuXG59XG5cbi8vIFNpbmdsZSBtYXRyaXggKGZyb20gZmxhdCBhcnJheSBvciBNYXRyaXhOKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTJmbSggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblx0dmFyIGVsZW1lbnRzID0gdi5lbGVtZW50cztcblxuXHRpZiAoIGVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgZWxlbWVudHMgKSApIHJldHVybjtcblxuXHRcdG1hdDJhcnJheS5zZXQoIGVsZW1lbnRzICk7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQyYXJyYXkgKTtcblxuXHRcdGNvcHlBcnJheSggY2FjaGUsIGVsZW1lbnRzICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlM2ZtKCBnbCwgdiApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHR2YXIgZWxlbWVudHMgPSB2LmVsZW1lbnRzO1xuXG5cdGlmICggZWxlbWVudHMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XG5cblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XG5cblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCBlbGVtZW50cyApICkgcmV0dXJuO1xuXG5cdFx0bWF0M2FycmF5LnNldCggZWxlbWVudHMgKTtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIG1hdDNhcnJheSApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgZWxlbWVudHMgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0Zm0oIGdsLCB2ICkge1xuXG5cdHZhciBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdHZhciBlbGVtZW50cyA9IHYuZWxlbWVudHM7XG5cblx0aWYgKCBlbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYgKTtcblxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIGVsZW1lbnRzICkgKSByZXR1cm47XG5cblx0XHRtYXQ0YXJyYXkuc2V0KCBlbGVtZW50cyApO1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0NGFycmF5ICk7XG5cblx0XHRjb3B5QXJyYXkoIGNhY2hlLCBlbGVtZW50cyApO1xuXG5cdH1cblxufVxuXG4vLyBTaW5nbGUgdGV4dHVyZSAoMkQgLyBDdWJlKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQxKCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblx0dmFyIHVuaXQgPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7XG5cblx0aWYgKCBjYWNoZVsgMCBdICE9PSB1bml0ICkge1xuXG5cdFx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0XHRjYWNoZVsgMCBdID0gdW5pdDtcblxuXHR9XG5cblx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2IHx8IGVtcHR5VGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDYoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHR2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblxuXHRpZiAoIGNhY2hlWyAwIF0gIT09IHVuaXQgKSB7XG5cblx0XHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xuXHRcdGNhY2hlWyAwIF0gPSB1bml0O1xuXG5cdH1cblxuXHRyZW5kZXJlci5zZXRUZXh0dXJlQ3ViZSggdiB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0ICk7XG5cbn1cblxuLy8gSW50ZWdlciAvIEJvb2xlYW4gdmVjdG9ycyBvciBhcnJheXMgdGhlcmVvZiAoYWx3YXlzIGZsYXQgYXJyYXlzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTJpdiggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm0yaXYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNpdiggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm0zaXYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTRpdiggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm00aXYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxufVxuXG4vLyBIZWxwZXIgdG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciB0aGUgc2luZ3VsYXIgY2FzZVxuXG5mdW5jdGlvbiBnZXRTaW5ndWxhclNldHRlciggdHlwZSApIHtcblxuXHRzd2l0Y2ggKCB0eXBlICkge1xuXG5cdFx0Y2FzZSAweDE0MDY6IHJldHVybiBzZXRWYWx1ZTFmOyAvLyBGTE9BVFxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWUyZnY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZTNmdjsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlNGZ2OyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZTJmbTsgLy8gX01BVDJcblx0XHRjYXNlIDB4OGI1YjogcmV0dXJuIHNldFZhbHVlM2ZtOyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWU0Zm07IC8vIF9NQVQ0XG5cblx0XHRjYXNlIDB4OGI1ZTogY2FzZSAweDhkNjY6IHJldHVybiBzZXRWYWx1ZVQxOyAvLyBTQU1QTEVSXzJELCBTQU1QTEVSX0VYVEVSTkFMX09FU1xuXHRcdGNhc2UgMHg4YjYwOiByZXR1cm4gc2V0VmFsdWVUNjsgLy8gU0FNUExFUl9DVUJFXG5cblx0XHRjYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZTFpOyAvLyBJTlQsIEJPT0xcblx0XHRjYXNlIDB4OGI1MzogY2FzZSAweDhiNTc6IHJldHVybiBzZXRWYWx1ZTJpdjsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZTNpdjsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZTRpdjsgLy8gX1ZFQzRcblxuXHR9XG5cbn1cblxuLy8gQXJyYXkgb2Ygc2NhbGFyc1xuXG5mdW5jdGlvbiBzZXRWYWx1ZTFmdiggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm0xZnYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxufVxuZnVuY3Rpb24gc2V0VmFsdWUxaXYoIGdsLCB2ICkge1xuXG5cdHZhciBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdmVjdG9ycyAoZmxhdCBvciBmcm9tIFRIUkVFIGNsYXNzZXMpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjJhKCBnbCwgdiApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHR2YXIgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMiApO1xuXG5cdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCBkYXRhICkgKSByZXR1cm47XG5cblx0Z2wudW5pZm9ybTJmdiggdGhpcy5hZGRyLCBkYXRhICk7XG5cblx0dGhpcy51cGRhdGVDYWNoZSggZGF0YSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjNhKCBnbCwgdiApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHR2YXIgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMyApO1xuXG5cdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCBkYXRhICkgKSByZXR1cm47XG5cblx0Z2wudW5pZm9ybTNmdiggdGhpcy5hZGRyLCBkYXRhICk7XG5cblx0dGhpcy51cGRhdGVDYWNoZSggZGF0YSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjRhKCBnbCwgdiApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHR2YXIgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgNCApO1xuXG5cdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCBkYXRhICkgKSByZXR1cm47XG5cblx0Z2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCBkYXRhICk7XG5cblx0dGhpcy51cGRhdGVDYWNoZSggZGF0YSApO1xuXG59XG5cbi8vIEFycmF5IG9mIG1hdHJpY2VzIChmbGF0IG9yIGZyb20gVEhSRUUgY2xhc2VzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0yYSggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblx0dmFyIGRhdGEgPSBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgZGF0YSApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIGRhdGEgKTtcblxuXHR0aGlzLnVwZGF0ZUNhY2hlKCBkYXRhICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVNM2EoIGdsLCB2ICkge1xuXG5cdHZhciBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdHZhciBkYXRhID0gZmxhdHRlbiggdiwgdGhpcy5zaXplLCA5ICk7XG5cblx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIGRhdGEgKSApIHJldHVybjtcblxuXHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBkYXRhICk7XG5cblx0dGhpcy51cGRhdGVDYWNoZSggZGF0YSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlTTRhKCBnbCwgdiApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHR2YXIgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMTYgKTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgZGF0YSApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIGRhdGEgKTtcblxuXHR0aGlzLnVwZGF0ZUNhY2hlKCBkYXRhICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdGV4dHVyZXMgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMWEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHR2YXIgbiA9IHYubGVuZ3RoO1xuXG5cdHZhciB1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICk7XG5cblx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHVuaXRzICkgPT09IGZhbHNlICkge1xuXG5cdFx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xuXHRcdGNvcHlBcnJheSggY2FjaGUsIHVuaXRzICk7XG5cblx0fVxuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHJlbmRlcmVyLnNldFRleHR1cmUyRCggdlsgaSBdIHx8IGVtcHR5VGV4dHVyZSwgdW5pdHNbIGkgXSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQ2YSggZ2wsIHYsIHJlbmRlcmVyICkge1xuXG5cdHZhciBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdHZhciBuID0gdi5sZW5ndGg7XG5cblx0dmFyIHVuaXRzID0gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdW5pdHMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdW5pdHMgKTtcblxuXHR9XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0cmVuZGVyZXIuc2V0VGV4dHVyZUN1YmUoIHZbIGkgXSB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0c1sgaSBdICk7XG5cblx0fVxuXG59XG5cbi8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIGEgcHVyZSAoYm90dG9tLWxldmVsKSBhcnJheVxuXG5mdW5jdGlvbiBnZXRQdXJlQXJyYXlTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWUxZnY7IC8vIEZMT0FUXG5cdFx0Y2FzZSAweDhiNTA6IHJldHVybiBzZXRWYWx1ZVYyYTsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1MTogcmV0dXJuIHNldFZhbHVlVjNhOyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWVWNGE7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlTTJhOyAvLyBfTUFUMlxuXHRcdGNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWVNM2E7IC8vIF9NQVQzXG5cdFx0Y2FzZSAweDhiNWM6IHJldHVybiBzZXRWYWx1ZU00YTsgLy8gX01BVDRcblxuXHRcdGNhc2UgMHg4YjVlOiByZXR1cm4gc2V0VmFsdWVUMWE7IC8vIFNBTVBMRVJfMkRcblx0XHRjYXNlIDB4OGI2MDogcmV0dXJuIHNldFZhbHVlVDZhOyAvLyBTQU1QTEVSX0NVQkVcblxuXHRcdGNhc2UgMHgxNDA0OiBjYXNlIDB4OGI1NjogcmV0dXJuIHNldFZhbHVlMWl2OyAvLyBJTlQsIEJPT0xcblx0XHRjYXNlIDB4OGI1MzogY2FzZSAweDhiNTc6IHJldHVybiBzZXRWYWx1ZTJpdjsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZTNpdjsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZTRpdjsgLy8gX1ZFQzRcblxuXHR9XG5cbn1cblxuLy8gLS0tIFVuaWZvcm0gQ2xhc3NlcyAtLS1cblxuZnVuY3Rpb24gU2luZ2xlVW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXHR0aGlzLmFkZHIgPSBhZGRyO1xuXHR0aGlzLmNhY2hlID0gW107XG5cdHRoaXMuc2V0VmFsdWUgPSBnZXRTaW5ndWxhclNldHRlciggYWN0aXZlSW5mby50eXBlICk7XG5cblx0Ly8gdGhpcy5wYXRoID0gYWN0aXZlSW5mby5uYW1lOyAvLyBERUJVR1xuXG59XG5cbmZ1bmN0aW9uIFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblx0dGhpcy5hZGRyID0gYWRkcjtcblx0dGhpcy5jYWNoZSA9IFtdO1xuXHR0aGlzLnNpemUgPSBhY3RpdmVJbmZvLnNpemU7XG5cdHRoaXMuc2V0VmFsdWUgPSBnZXRQdXJlQXJyYXlTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xuXG5cdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcblxufVxuXG5QdXJlQXJyYXlVbmlmb3JtLnByb3RvdHlwZS51cGRhdGVDYWNoZSA9IGZ1bmN0aW9uICggZGF0YSApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggZGF0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSAmJiBjYWNoZS5sZW5ndGggIT09IGRhdGEubGVuZ3RoICkge1xuXG5cdFx0dGhpcy5jYWNoZSA9IG5ldyBGbG9hdDMyQXJyYXkoIGRhdGEubGVuZ3RoICk7XG5cblx0fVxuXG5cdGNvcHlBcnJheSggY2FjaGUsIGRhdGEgKTtcblxufTtcblxuZnVuY3Rpb24gU3RydWN0dXJlZFVuaWZvcm0oIGlkICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblxuXHRVbmlmb3JtQ29udGFpbmVyLmNhbGwoIHRoaXMgKTsgLy8gbWl4LWluXG5cbn1cblxuU3RydWN0dXJlZFVuaWZvcm0ucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKCBnbCwgdmFsdWUsIHJlbmRlcmVyICkge1xuXG5cdHZhciBzZXEgPSB0aGlzLnNlcTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXTtcblx0XHR1LnNldFZhbHVlKCBnbCwgdmFsdWVbIHUuaWQgXSwgcmVuZGVyZXIgKTtcblxuXHR9XG5cbn07XG5cbi8vIC0tLSBUb3AtbGV2ZWwgLS0tXG5cbi8vIFBhcnNlciAtIGJ1aWxkcyB1cCB0aGUgcHJvcGVydHkgdHJlZSBmcm9tIHRoZSBwYXRoIHN0cmluZ3NcblxudmFyIFJlUGF0aFBhcnQgPSAvKFtcXHdcXGRfXSspKFxcXSk/KFxcW3xcXC4pPy9nO1xuXG4vLyBleHRyYWN0c1xuLy8gXHQtIHRoZSBpZGVudGlmaWVyIChtZW1iZXIgbmFtZSBvciBhcnJheSBpbmRleClcbi8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHJpZ2h0IGJyYWNrZXQgKGZvdW5kIHdoZW4gYXJyYXkgaW5kZXgpXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBsZWZ0IGJyYWNrZXQgb3IgZG90ICh0eXBlIG9mIHN1YnNjcmlwdClcbi8vXG4vLyBOb3RlOiBUaGVzZSBwb3J0aW9ucyBjYW4gYmUgcmVhZCBpbiBhIG5vbi1vdmVybGFwcGluZyBmYXNoaW9uIGFuZFxuLy8gYWxsb3cgc3RyYWlnaHRmb3J3YXJkIHBhcnNpbmcgb2YgdGhlIGhpZXJhcmNoeSB0aGF0IFdlYkdMIGVuY29kZXNcbi8vIGluIHRoZSB1bmlmb3JtIG5hbWVzLlxuXG5mdW5jdGlvbiBhZGRVbmlmb3JtKCBjb250YWluZXIsIHVuaWZvcm1PYmplY3QgKSB7XG5cblx0Y29udGFpbmVyLnNlcS5wdXNoKCB1bmlmb3JtT2JqZWN0ICk7XG5cdGNvbnRhaW5lci5tYXBbIHVuaWZvcm1PYmplY3QuaWQgXSA9IHVuaWZvcm1PYmplY3Q7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VVbmlmb3JtKCBhY3RpdmVJbmZvLCBhZGRyLCBjb250YWluZXIgKSB7XG5cblx0dmFyIHBhdGggPSBhY3RpdmVJbmZvLm5hbWUsXG5cdFx0cGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG5cdC8vIHJlc2V0IFJlZ0V4cCBvYmplY3QsIGJlY2F1c2Ugb2YgdGhlIGVhcmx5IGV4aXQgb2YgYSBwcmV2aW91cyBydW5cblx0UmVQYXRoUGFydC5sYXN0SW5kZXggPSAwO1xuXG5cdHdoaWxlICggdHJ1ZSApIHtcblxuXHRcdHZhciBtYXRjaCA9IFJlUGF0aFBhcnQuZXhlYyggcGF0aCApLFxuXHRcdFx0bWF0Y2hFbmQgPSBSZVBhdGhQYXJ0Lmxhc3RJbmRleCxcblxuXHRcdFx0aWQgPSBtYXRjaFsgMSBdLFxuXHRcdFx0aWRJc0luZGV4ID0gbWF0Y2hbIDIgXSA9PT0gJ10nLFxuXHRcdFx0c3Vic2NyaXB0ID0gbWF0Y2hbIDMgXTtcblxuXHRcdGlmICggaWRJc0luZGV4ICkgaWQgPSBpZCB8IDA7IC8vIGNvbnZlcnQgdG8gaW50ZWdlclxuXG5cdFx0aWYgKCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCB8fCBzdWJzY3JpcHQgPT09ICdbJyAmJiBtYXRjaEVuZCArIDIgPT09IHBhdGhMZW5ndGggKSB7XG5cblx0XHRcdC8vIGJhcmUgbmFtZSBvciBcInB1cmVcIiBib3R0b20tbGV2ZWwgYXJyYXkgXCJbMF1cIiBzdWZmaXhcblxuXHRcdFx0YWRkVW5pZm9ybSggY29udGFpbmVyLCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdG5ldyBTaW5nbGVVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIDpcblx0XHRcdFx0bmV3IFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgKTtcblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBzdGVwIGludG8gaW5uZXIgbm9kZSAvIGNyZWF0ZSBpdCBpbiBjYXNlIGl0IGRvZXNuJ3QgZXhpc3RcblxuXHRcdFx0dmFyIG1hcCA9IGNvbnRhaW5lci5tYXAsIG5leHQgPSBtYXBbIGlkIF07XG5cblx0XHRcdGlmICggbmV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG5leHQgPSBuZXcgU3RydWN0dXJlZFVuaWZvcm0oIGlkICk7XG5cdFx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgbmV4dCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnRhaW5lciA9IG5leHQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIFJvb3QgQ29udGFpbmVyXG5cbmZ1bmN0aW9uIFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApIHtcblxuXHRVbmlmb3JtQ29udGFpbmVyLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cblx0dmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5BQ1RJVkVfVU5JRk9STVMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyArKyBpICkge1xuXG5cdFx0dmFyIGluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKCBwcm9ncmFtLCBpICksXG5cdFx0XHRhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBpbmZvLm5hbWUgKTtcblxuXHRcdHBhcnNlVW5pZm9ybSggaW5mbywgYWRkciwgdGhpcyApO1xuXG5cdH1cblxufVxuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIG5hbWUsIHZhbHVlICkge1xuXG5cdHZhciB1ID0gdGhpcy5tYXBbIG5hbWUgXTtcblxuXHRpZiAoIHUgIT09IHVuZGVmaW5lZCApIHUuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgdGhpcy5yZW5kZXJlciApO1xuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRPcHRpb25hbCA9IGZ1bmN0aW9uICggZ2wsIG9iamVjdCwgbmFtZSApIHtcblxuXHR2YXIgdiA9IG9iamVjdFsgbmFtZSBdO1xuXG5cdGlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhpcy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTtcblxufTtcblxuXG4vLyBTdGF0aWMgaW50ZXJmYWNlXG5cbldlYkdMVW5pZm9ybXMudXBsb2FkID0gZnVuY3Rpb24gKCBnbCwgc2VxLCB2YWx1ZXMsIHJlbmRlcmVyICkge1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdLFxuXHRcdFx0diA9IHZhbHVlc1sgdS5pZCBdO1xuXG5cdFx0aWYgKCB2Lm5lZWRzVXBkYXRlICE9PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gbm90ZTogYWx3YXlzIHVwZGF0aW5nIHdoZW4gLm5lZWRzVXBkYXRlIGlzIHVuZGVmaW5lZFxuXHRcdFx0dS5zZXRWYWx1ZSggZ2wsIHYudmFsdWUsIHJlbmRlcmVyICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSA9IGZ1bmN0aW9uICggc2VxLCB2YWx1ZXMgKSB7XG5cblx0dmFyIHIgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXTtcblx0XHRpZiAoIHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59O1xuXG5leHBvcnQgeyBXZWJHTFVuaWZvcm1zIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYWRkTGluZU51bWJlcnMoIHN0cmluZyApIHtcblxuXHR2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoICdcXG4nICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0bGluZXNbIGkgXSA9ICggaSArIDEgKSArICc6ICcgKyBsaW5lc1sgaSBdO1xuXG5cdH1cblxuXHRyZXR1cm4gbGluZXMuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFNoYWRlciggZ2wsIHR5cGUsIHN0cmluZyApIHtcblxuXHR2YXIgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCB0eXBlICk7XG5cblx0Z2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIHN0cmluZyApO1xuXHRnbC5jb21waWxlU2hhZGVyKCBzaGFkZXIgKTtcblxuXHRpZiAoIGdsLmdldFNoYWRlclBhcmFtZXRlciggc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyApID09PSBmYWxzZSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFNoYWRlcjogU2hhZGVyIGNvdWxkblxcJ3QgY29tcGlsZS4nICk7XG5cblx0fVxuXG5cdGlmICggZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICkgIT09ICcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkZXI6IGdsLmdldFNoYWRlckluZm9Mb2coKScsIHR5cGUgPT09IGdsLlZFUlRFWF9TSEFERVIgPyAndmVydGV4JyA6ICdmcmFnbWVudCcsIGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApLCBhZGRMaW5lTnVtYmVycyggc3RyaW5nICkgKTtcblxuXHR9XG5cblx0Ly8gLS1lbmFibGUtcHJpdmlsZWdlZC13ZWJnbC1leHRlbnNpb25cblx0Ly8gY29uc29sZS5sb2coIHR5cGUsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggc2hhZGVyICkgKTtcblxuXHRyZXR1cm4gc2hhZGVyO1xuXG59XG5cblxuZXhwb3J0IHsgV2ViR0xTaGFkZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5pbXBvcnQgeyBXZWJHTFVuaWZvcm1zIH0gZnJvbSAnLi9XZWJHTFVuaWZvcm1zLmpzJztcbmltcG9ydCB7IFdlYkdMU2hhZGVyIH0gZnJvbSAnLi9XZWJHTFNoYWRlci5qcyc7XG5pbXBvcnQgeyBTaGFkZXJDaHVuayB9IGZyb20gJy4uL3NoYWRlcnMvU2hhZGVyQ2h1bmsuanMnO1xuaW1wb3J0IHsgTm9Ub25lTWFwcGluZywgQWRkT3BlcmF0aW9uLCBNaXhPcGVyYXRpb24sIE11bHRpcGx5T3BlcmF0aW9uLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLCBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZywgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nLCBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZywgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLCBQQ0ZTb2Z0U2hhZG93TWFwLCBQQ0ZTaGFkb3dNYXAsIENpbmVvblRvbmVNYXBwaW5nLCBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcsIFJlaW5oYXJkVG9uZU1hcHBpbmcsIExpbmVhclRvbmVNYXBwaW5nLCBHYW1tYUVuY29kaW5nLCBSR0JERW5jb2RpbmcsIFJHQk0xNkVuY29kaW5nLCBSR0JNN0VuY29kaW5nLCBSR0JFRW5jb2RpbmcsIHNSR0JFbmNvZGluZywgTGluZWFyRW5jb2RpbmcgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xuXG52YXIgcHJvZ3JhbUlkQ291bnQgPSAwO1xuXG5mdW5jdGlvbiBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICkge1xuXG5cdHN3aXRjaCAoIGVuY29kaW5nICkge1xuXG5cdFx0Y2FzZSBMaW5lYXJFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdMaW5lYXInLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2Ugc1JHQkVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ3NSR0InLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCRUVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQkUnLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCTTdFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JNJywgJyggdmFsdWUsIDcuMCApJyBdO1xuXHRcdGNhc2UgUkdCTTE2RW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCTScsICcoIHZhbHVlLCAxNi4wICknIF07XG5cdFx0Y2FzZSBSR0JERW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCRCcsICcoIHZhbHVlLCAyNTYuMCApJyBdO1xuXHRcdGNhc2UgR2FtbWFFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdHYW1tYScsICcoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKScgXTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5zdXBwb3J0ZWQgZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7XG5cblx0dmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICcgKyBjb21wb25lbnRzWyAwIF0gKyAnVG9MaW5lYXInICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdHZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApO1xuXHRyZXR1cm4gJ3ZlYzQgJyArIGZ1bmN0aW9uTmFtZSArICcoIHZlYzQgdmFsdWUgKSB7IHJldHVybiBMaW5lYXJUbycgKyBjb21wb25lbnRzWyAwIF0gKyBjb21wb25lbnRzWyAxIF0gKyAnOyB9JztcblxufVxuXG5mdW5jdGlvbiBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIHRvbmVNYXBwaW5nICkge1xuXG5cdHZhciB0b25lTWFwcGluZ05hbWU7XG5cblx0c3dpdGNoICggdG9uZU1hcHBpbmcgKSB7XG5cblx0XHRjYXNlIExpbmVhclRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0xpbmVhcic7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgUmVpbmhhcmRUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdSZWluaGFyZCc7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVW5jaGFydGVkMlRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ1VuY2hhcnRlZDInO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIENpbmVvblRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ09wdGltaXplZENpbmVvbic7XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICd1bnN1cHBvcnRlZCB0b25lTWFwcGluZzogJyArIHRvbmVNYXBwaW5nICk7XG5cblx0fVxuXG5cdHJldHVybiAndmVjMyAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjMyBjb2xvciApIHsgcmV0dXJuICcgKyB0b25lTWFwcGluZ05hbWUgKyAnVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0nO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyggZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgcmVuZGVyZXJFeHRlbnNpb25zICkge1xuXG5cdGV4dGVuc2lvbnMgPSBleHRlbnNpb25zIHx8IHt9O1xuXG5cdHZhciBjaHVua3MgPSBbXG5cdFx0KCBleHRlbnNpb25zLmRlcml2YXRpdmVzIHx8IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWIHx8IHBhcmFtZXRlcnMuYnVtcE1hcCB8fCAoIHBhcmFtZXRlcnMubm9ybWFsTWFwICYmICEgcGFyYW1ldGVycy5vYmplY3RTcGFjZU5vcm1hbE1hcCApIHx8IHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgKSA/ICcjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZScgOiAnJyxcblx0XHQoIGV4dGVuc2lvbnMuZnJhZ0RlcHRoIHx8IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxlJyA6ICcnLFxuXHRcdCggZXh0ZW5zaW9ucy5kcmF3QnVmZmVycyApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kcmF3X2J1ZmZlcnMnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZScgOiAnJyxcblx0XHQoIGV4dGVuc2lvbnMuc2hhZGVyVGV4dHVyZUxPRCB8fCBwYXJhbWV0ZXJzLmVudk1hcCApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJyApID8gJyNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZScgOiAnJ1xuXHRdO1xuXG5cdHJldHVybiBjaHVua3MuZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRGVmaW5lcyggZGVmaW5lcyApIHtcblxuXHR2YXIgY2h1bmtzID0gW107XG5cblx0Zm9yICggdmFyIG5hbWUgaW4gZGVmaW5lcyApIHtcblxuXHRcdHZhciB2YWx1ZSA9IGRlZmluZXNbIG5hbWUgXTtcblxuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkgY29udGludWU7XG5cblx0XHRjaHVua3MucHVzaCggJyNkZWZpbmUgJyArIG5hbWUgKyAnICcgKyB2YWx1ZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gY2h1bmtzLmpvaW4oICdcXG4nICk7XG5cbn1cblxuZnVuY3Rpb24gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICkge1xuXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cblx0dmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5BQ1RJVkVfQVRUUklCVVRFUyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IG47IGkgKysgKSB7XG5cblx0XHR2YXIgaW5mbyA9IGdsLmdldEFjdGl2ZUF0dHJpYiggcHJvZ3JhbSwgaSApO1xuXHRcdHZhciBuYW1lID0gaW5mby5uYW1lO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFByb2dyYW06IEFDVElWRSBWRVJURVggQVRUUklCVVRFOicsIG5hbWUsIGkgKTtcblxuXHRcdGF0dHJpYnV0ZXNbIG5hbWUgXSA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCBuYW1lICk7XG5cblx0fVxuXG5cdHJldHVybiBhdHRyaWJ1dGVzO1xuXG59XG5cbmZ1bmN0aW9uIGZpbHRlckVtcHR5TGluZSggc3RyaW5nICkge1xuXG5cdHJldHVybiBzdHJpbmcgIT09ICcnO1xuXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VMaWdodE51bXMoIHN0cmluZywgcGFyYW1ldGVycyApIHtcblxuXHRyZXR1cm4gc3RyaW5nXG5cdFx0LnJlcGxhY2UoIC9OVU1fRElSX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bURpckxpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fU1BPVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1TcG90TGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9SRUNUX0FSRUFfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUmVjdEFyZWFMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1BPSU5UX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVBvaW50TGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9IRU1JX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bUhlbWlMaWdodHMgKTtcblxufVxuXG5mdW5jdGlvbiByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIHN0cmluZywgcGFyYW1ldGVycyApIHtcblxuXHRyZXR1cm4gc3RyaW5nXG5cdFx0LnJlcGxhY2UoIC9OVU1fQ0xJUFBJTkdfUExBTkVTL2csIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMgKVxuXHRcdC5yZXBsYWNlKCAvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csICggcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyAtIHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbiApICk7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VJbmNsdWRlcyggc3RyaW5nICkge1xuXG5cdHZhciBwYXR0ZXJuID0gL15bIFxcdF0qI2luY2x1ZGUgKzwoW1xcd1xcZC4vXSspPi9nbTtcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgaW5jbHVkZSApIHtcblxuXHRcdHZhciByZXBsYWNlID0gU2hhZGVyQ2h1bmtbIGluY2x1ZGUgXTtcblxuXHRcdGlmICggcmVwbGFjZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCcgKyBpbmNsdWRlICsgJz4nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyc2VJbmNsdWRlcyggcmVwbGFjZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiB1bnJvbGxMb29wcyggc3RyaW5nICkge1xuXG5cdHZhciBwYXR0ZXJuID0gLyNwcmFnbWEgdW5yb2xsX2xvb3BbXFxzXSs/Zm9yIFxcKCBpbnQgaSBcXD0gKFxcZCspXFw7IGkgPCAoXFxkKylcXDsgaSBcXCtcXCsgXFwpIFxceyhbXFxzXFxTXSs/KSg/PVxcfSlcXH0vZztcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHtcblxuXHRcdHZhciB1bnJvbGwgPSAnJztcblxuXHRcdGZvciAoIHZhciBpID0gcGFyc2VJbnQoIHN0YXJ0ICk7IGkgPCBwYXJzZUludCggZW5kICk7IGkgKysgKSB7XG5cblx0XHRcdHVucm9sbCArPSBzbmlwcGV0LnJlcGxhY2UoIC9cXFsgaSBcXF0vZywgJ1sgJyArIGkgKyAnIF0nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5yb2xsO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBleHRlbnNpb25zLCBjb2RlLCBtYXRlcmlhbCwgc2hhZGVyLCBwYXJhbWV0ZXJzLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0dmFyIGdsID0gcmVuZGVyZXIuY29udGV4dDtcblxuXHR2YXIgZGVmaW5lcyA9IG1hdGVyaWFsLmRlZmluZXM7XG5cblx0dmFyIHZlcnRleFNoYWRlciA9IHNoYWRlci52ZXJ0ZXhTaGFkZXI7XG5cdHZhciBmcmFnbWVudFNoYWRlciA9IHNoYWRlci5mcmFnbWVudFNoYWRlcjtcblxuXHR2YXIgc2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9CQVNJQyc7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFBDRlNoYWRvd01hcCApIHtcblxuXHRcdHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfUENGJztcblxuXHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFBDRlNvZnRTaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRl9TT0ZUJztcblxuXHR9XG5cblx0dmFyIGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7XG5cdHZhciBlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRkxFQ1RJT04nO1xuXHR2YXIgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJztcblxuXHRpZiAoIHBhcmFtZXRlcnMuZW52TWFwICkge1xuXG5cdFx0c3dpdGNoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgKSB7XG5cblx0XHRcdGNhc2UgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFX1VWJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0VRVUlSRUMnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9TUEhFUkUnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nICkge1xuXG5cdFx0XHRjYXNlIEN1YmVSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGUkFDVElPTic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdFx0c3dpdGNoICggbWF0ZXJpYWwuY29tYmluZSApIHtcblxuXHRcdFx0Y2FzZSBNdWx0aXBseU9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTWl4T3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTUlYJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQWRkT3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfQUREJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG5cdHZhciBnYW1tYUZhY3RvckRlZmluZSA9ICggcmVuZGVyZXIuZ2FtbWFGYWN0b3IgPiAwICkgPyByZW5kZXJlci5nYW1tYUZhY3RvciA6IDEuMDtcblxuXHQvLyBjb25zb2xlLmxvZyggJ2J1aWxkaW5nIG5ldyBwcm9ncmFtICcgKTtcblxuXHQvL1xuXG5cdHZhciBjdXN0b21FeHRlbnNpb25zID0gY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gJycgOiBnZW5lcmF0ZUV4dGVuc2lvbnMoIG1hdGVyaWFsLmV4dGVuc2lvbnMsIHBhcmFtZXRlcnMsIGV4dGVuc2lvbnMgKTtcblxuXHR2YXIgY3VzdG9tRGVmaW5lcyA9IGdlbmVyYXRlRGVmaW5lcyggZGVmaW5lcyApO1xuXG5cdC8vXG5cblx0dmFyIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG5cblx0dmFyIHByZWZpeFZlcnRleCwgcHJlZml4RnJhZ21lbnQ7XG5cblx0aWYgKCBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsICkge1xuXG5cdFx0cHJlZml4VmVydGV4ID0gW1xuXG5cdFx0XHRjdXN0b21EZWZpbmVzXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHRcdGlmICggcHJlZml4VmVydGV4Lmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHByZWZpeFZlcnRleCArPSAnXFxuJztcblxuXHRcdH1cblxuXHRcdHByZWZpeEZyYWdtZW50ID0gW1xuXG5cdFx0XHRjdXN0b21FeHRlbnNpb25zLFxuXHRcdFx0Y3VzdG9tRGVmaW5lc1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRpZiAoIHByZWZpeEZyYWdtZW50Lmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHByZWZpeEZyYWdtZW50ICs9ICdcXG4nO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRwcmVmaXhWZXJ0ZXggPSBbXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBmbG9hdDsnLFxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGludDsnLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgc2hhZGVyLm5hbWUsXG5cblx0XHRcdGN1c3RvbURlZmluZXMsXG5cblx0XHRcdHBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFZFUlRFWF9URVhUVVJFUycgOiAnJyxcblxuXHRcdFx0JyNkZWZpbmUgR0FNTUFfRkFDVE9SICcgKyBnYW1tYUZhY3RvckRlZmluZSxcblxuXHRcdFx0JyNkZWZpbmUgTUFYX0JPTkVTICcgKyBwYXJhbWV0ZXJzLm1heEJvbmVzLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAgKSA/ICcjZGVmaW5lIEZPR19FWFAyJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmxpZ2h0TWFwID8gJyNkZWZpbmUgVVNFX0xJR0hUTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5hb01hcCA/ICcjZGVmaW5lIFVTRV9BT01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW1pc3NpdmVNYXAgPyAnI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmJ1bXBNYXAgPyAnI2RlZmluZSBVU0VfQlVNUE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubm9ybWFsTWFwID8gJyNkZWZpbmUgVVNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy5ub3JtYWxNYXAgJiYgcGFyYW1ldGVycy5vYmplY3RTcGFjZU5vcm1hbE1hcCApID8gJyNkZWZpbmUgT0JKRUNUU1BBQ0VfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgJiYgcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMgPyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5za2lubmluZyA/ICcjZGVmaW5lIFVTRV9TS0lOTklORycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudXNlVmVydGV4VGV4dHVyZSA/ICcjZGVmaW5lIEJPTkVfVEVYVFVSRScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPyAnI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAnI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uID8gJyNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyIHx8IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsXG5cblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247JyxcblxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOycsXG5cdFx0XHQnYXR0cmlidXRlIHZlYzMgbm9ybWFsOycsXG5cdFx0XHQnYXR0cmlidXRlIHZlYzIgdXY7JyxcblxuXHRcdFx0JyNpZmRlZiBVU0VfQ09MT1InLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBjb2xvcjsnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0JyNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQwOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDE7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQzOycsXG5cblx0XHRcdCdcdCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTJyxcblxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDA7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwxOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7JyxcblxuXHRcdFx0J1x0I2Vsc2UnLFxuXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NDsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDU7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NzsnLFxuXG5cdFx0XHQnXHQjZW5kaWYnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0JyNpZmRlZiBVU0VfU0tJTk5JTkcnLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7JyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCdcXG4nXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHRcdHByZWZpeEZyYWdtZW50ID0gW1xuXG5cdFx0XHRjdXN0b21FeHRlbnNpb25zLFxuXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgZmxvYXQ7Jyxcblx0XHRcdCdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBpbnQ7JyxcblxuXHRcdFx0JyNkZWZpbmUgU0hBREVSX05BTUUgJyArIHNoYWRlci5uYW1lLFxuXG5cdFx0XHRjdXN0b21EZWZpbmVzLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhVGVzdCA/ICcjZGVmaW5lIEFMUEhBVEVTVCAnICsgcGFyYW1ldGVycy5hbHBoYVRlc3QgKyAoIHBhcmFtZXRlcnMuYWxwaGFUZXN0ICUgMSA/ICcnIDogJy4wJyApIDogJycsIC8vIGFkZCAnLjAnIGlmIGludGVnZXJcblxuXHRcdFx0JyNkZWZpbmUgR0FNTUFfRkFDVE9SICcgKyBnYW1tYUZhY3RvckRlZmluZSxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAgKSA/ICcjZGVmaW5lIEZPR19FWFAyJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBUeXBlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBCbGVuZGluZ0RlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMubm9ybWFsTWFwICYmIHBhcmFtZXRlcnMub2JqZWN0U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMgPyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZ3JhZGllbnRNYXAgPyAnI2RlZmluZSBVU0VfR1JBRElFTlRNQVAnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhID8gJyNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA/ICcjZGVmaW5lIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciAmJiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiB8fCBleHRlbnNpb25zLmdldCggJ0VYVF9mcmFnX2RlcHRoJyApICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCAmJiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiB8fCBleHRlbnNpb25zLmdldCggJ0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkgKSA/ICcjZGVmaW5lIFRFWFRVUkVfTE9EX0VYVCcgOiAnJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCB2aWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsXG5cblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gJyNkZWZpbmUgVE9ORV9NQVBQSU5HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBTaGFkZXJDaHVua1sgJ3RvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB0b25lTWFwcGluZygpIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3dcblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiggJ3RvbmVNYXBwaW5nJywgcGFyYW1ldGVycy50b25lTWFwcGluZyApIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZGl0aGVyaW5nID8gJyNkZWZpbmUgRElUSEVSSU5HJyA6ICcnLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgfHwgcGFyYW1ldGVycy5tYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nIHx8IHBhcmFtZXRlcnMuZW1pc3NpdmVNYXBFbmNvZGluZyApID8gU2hhZGVyQ2h1bmtbICdlbmNvZGluZ3NfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAvLyB0aGlzIGNvZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlIHZhcmlvdXMgZW5jb2RpbmcvZGVjb2RpbmcgZnVuY3Rpb24gZGVmaW5lZCBiZWxvd1xuXHRcdFx0cGFyYW1ldGVycy5tYXBFbmNvZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ21hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLm1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbnZNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyA/IGdldFRleGVsRW5jb2RpbmdGdW5jdGlvbiggJ2xpbmVhclRvT3V0cHV0VGV4ZWwnLCBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nICkgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kZXB0aFBhY2tpbmcgPyAnI2RlZmluZSBERVBUSF9QQUNLSU5HICcgKyBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgOiAnJyxcblxuXHRcdFx0J1xcbidcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdH1cblxuXHR2ZXJ0ZXhTaGFkZXIgPSBwYXJzZUluY2x1ZGVzKCB2ZXJ0ZXhTaGFkZXIgKTtcblx0dmVydGV4U2hhZGVyID0gcmVwbGFjZUxpZ2h0TnVtcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cdHZlcnRleFNoYWRlciA9IHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cblx0ZnJhZ21lbnRTaGFkZXIgPSBwYXJzZUluY2x1ZGVzKCBmcmFnbWVudFNoYWRlciApO1xuXHRmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cdGZyYWdtZW50U2hhZGVyID0gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdHZlcnRleFNoYWRlciA9IHVucm9sbExvb3BzKCB2ZXJ0ZXhTaGFkZXIgKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSB1bnJvbGxMb29wcyggZnJhZ21lbnRTaGFkZXIgKTtcblxuXHRpZiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiAmJiAhIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgKSB7XG5cblx0XHR2YXIgaXNHTFNMM1NoYWRlck1hdGVyaWFsID0gZmFsc2U7XG5cblx0XHR2YXIgdmVyc2lvblJlZ2V4ID0gL15cXHMqI3ZlcnNpb25cXHMrMzAwXFxzK2VzXFxzKlxcbi87XG5cblx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiZcblx0XHRcdHZlcnRleFNoYWRlci5tYXRjaCggdmVyc2lvblJlZ2V4ICkgIT09IG51bGwgJiZcblx0XHRcdGZyYWdtZW50U2hhZGVyLm1hdGNoKCB2ZXJzaW9uUmVnZXggKSAhPT0gbnVsbCApIHtcblxuXHRcdFx0aXNHTFNMM1NoYWRlck1hdGVyaWFsID0gdHJ1ZTtcblxuXHRcdFx0dmVydGV4U2hhZGVyID0gdmVydGV4U2hhZGVyLnJlcGxhY2UoIHZlcnNpb25SZWdleCwgJycgKTtcblx0XHRcdGZyYWdtZW50U2hhZGVyID0gZnJhZ21lbnRTaGFkZXIucmVwbGFjZSggdmVyc2lvblJlZ2V4LCAnJyApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gR0xTTCAzLjAgY29udmVyc2lvblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblx0XHRcdCcjdmVyc2lvbiAzMDAgZXNcXG4nLFxuXHRcdFx0JyNkZWZpbmUgYXR0cmlidXRlIGluJyxcblx0XHRcdCcjZGVmaW5lIHZhcnlpbmcgb3V0Jyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlJ1xuXHRcdF0uam9pbiggJ1xcbicgKSArICdcXG4nICsgcHJlZml4VmVydGV4O1xuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cdFx0XHQnI3ZlcnNpb24gMzAwIGVzXFxuJyxcblx0XHRcdCcjZGVmaW5lIHZhcnlpbmcgaW4nLFxuXHRcdFx0aXNHTFNMM1NoYWRlck1hdGVyaWFsID8gJycgOiAnb3V0IGhpZ2hwIHZlYzQgcGNfZnJhZ0NvbG9yOycsXG5cdFx0XHRpc0dMU0wzU2hhZGVyTWF0ZXJpYWwgPyAnJyA6ICcjZGVmaW5lIGdsX0ZyYWdDb2xvciBwY19mcmFnQ29sb3InLFxuXHRcdFx0JyNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aCcsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZScsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2onLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2QnLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZCcsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWQnLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCdcblx0XHRdLmpvaW4oICdcXG4nICkgKyAnXFxuJyArIHByZWZpeEZyYWdtZW50O1xuXG5cdH1cblxuXHR2YXIgdmVydGV4R2xzbCA9IHByZWZpeFZlcnRleCArIHZlcnRleFNoYWRlcjtcblx0dmFyIGZyYWdtZW50R2xzbCA9IHByZWZpeEZyYWdtZW50ICsgZnJhZ21lbnRTaGFkZXI7XG5cblx0Ly8gY29uc29sZS5sb2coICcqVkVSVEVYKicsIHZlcnRleEdsc2wgKTtcblx0Ly8gY29uc29sZS5sb2coICcqRlJBR01FTlQqJywgZnJhZ21lbnRHbHNsICk7XG5cblx0dmFyIGdsVmVydGV4U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCBnbC5WRVJURVhfU0hBREVSLCB2ZXJ0ZXhHbHNsICk7XG5cdHZhciBnbEZyYWdtZW50U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50R2xzbCApO1xuXG5cdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xWZXJ0ZXhTaGFkZXIgKTtcblx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBnbEZyYWdtZW50U2hhZGVyICk7XG5cblx0Ly8gRm9yY2UgYSBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSB0byBpbmRleCAwLlxuXG5cdGlmICggbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wuYmluZEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAwLCBtYXRlcmlhbC5pbmRleDBBdHRyaWJ1dGVOYW1lICk7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPT09IHRydWUgKSB7XG5cblx0XHQvLyBwcm9ncmFtcyB3aXRoIG1vcnBoVGFyZ2V0cyBkaXNwbGFjZSBwb3NpdGlvbiBvdXQgb2YgYXR0cmlidXRlIDBcblx0XHRnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsICdwb3NpdGlvbicgKTtcblxuXHR9XG5cblx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcblxuXHR2YXIgcHJvZ3JhbUxvZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKCBwcm9ncmFtICkudHJpbSgpO1xuXHR2YXIgdmVydGV4TG9nID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyggZ2xWZXJ0ZXhTaGFkZXIgKS50cmltKCk7XG5cdHZhciBmcmFnbWVudExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsRnJhZ21lbnRTaGFkZXIgKS50cmltKCk7XG5cblx0dmFyIHJ1bm5hYmxlID0gdHJ1ZTtcblx0dmFyIGhhdmVEaWFnbm9zdGljcyA9IHRydWU7XG5cblx0Ly8gY29uc29sZS5sb2coICcqKlZFUlRFWCoqJywgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBnbFZlcnRleFNoYWRlciApICk7XG5cdC8vIGNvbnNvbGUubG9nKCAnKipGUkFHTUVOVCoqJywgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBnbEZyYWdtZW50U2hhZGVyICkgKTtcblxuXHRpZiAoIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkxJTktfU1RBVFVTICkgPT09IGZhbHNlICkge1xuXG5cdFx0cnVubmFibGUgPSBmYWxzZTtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFByb2dyYW06IHNoYWRlciBlcnJvcjogJywgZ2wuZ2V0RXJyb3IoKSwgJ2dsLlZBTElEQVRFX1NUQVRVUycsIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLlZBTElEQVRFX1NUQVRVUyApLCAnZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cnLCBwcm9ncmFtTG9nLCB2ZXJ0ZXhMb2csIGZyYWdtZW50TG9nICk7XG5cblx0fSBlbHNlIGlmICggcHJvZ3JhbUxvZyAhPT0gJycgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCknLCBwcm9ncmFtTG9nICk7XG5cblx0fSBlbHNlIGlmICggdmVydGV4TG9nID09PSAnJyB8fCBmcmFnbWVudExvZyA9PT0gJycgKSB7XG5cblx0XHRoYXZlRGlhZ25vc3RpY3MgPSBmYWxzZTtcblxuXHR9XG5cblx0aWYgKCBoYXZlRGlhZ25vc3RpY3MgKSB7XG5cblx0XHR0aGlzLmRpYWdub3N0aWNzID0ge1xuXG5cdFx0XHRydW5uYWJsZTogcnVubmFibGUsXG5cdFx0XHRtYXRlcmlhbDogbWF0ZXJpYWwsXG5cblx0XHRcdHByb2dyYW1Mb2c6IHByb2dyYW1Mb2csXG5cblx0XHRcdHZlcnRleFNoYWRlcjoge1xuXG5cdFx0XHRcdGxvZzogdmVydGV4TG9nLFxuXHRcdFx0XHRwcmVmaXg6IHByZWZpeFZlcnRleFxuXG5cdFx0XHR9LFxuXG5cdFx0XHRmcmFnbWVudFNoYWRlcjoge1xuXG5cdFx0XHRcdGxvZzogZnJhZ21lbnRMb2csXG5cdFx0XHRcdHByZWZpeDogcHJlZml4RnJhZ21lbnRcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0Ly8gY2xlYW4gdXBcblxuXHRnbC5kZWxldGVTaGFkZXIoIGdsVmVydGV4U2hhZGVyICk7XG5cdGdsLmRlbGV0ZVNoYWRlciggZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdC8vIHNldCB1cCBjYWNoaW5nIGZvciB1bmlmb3JtIGxvY2F0aW9uc1xuXG5cdHZhciBjYWNoZWRVbmlmb3JtcztcblxuXHR0aGlzLmdldFVuaWZvcm1zID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBjYWNoZWRVbmlmb3JtcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjYWNoZWRVbmlmb3JtcyA9IG5ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZWRVbmlmb3JtcztcblxuXHR9O1xuXG5cdC8vIHNldCB1cCBjYWNoaW5nIGZvciBhdHRyaWJ1dGUgbG9jYXRpb25zXG5cblx0dmFyIGNhY2hlZEF0dHJpYnV0ZXM7XG5cblx0dGhpcy5nZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBjYWNoZWRBdHRyaWJ1dGVzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNhY2hlZEF0dHJpYnV0ZXMgPSBmZXRjaEF0dHJpYnV0ZUxvY2F0aW9ucyggZ2wsIHByb2dyYW0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZWRBdHRyaWJ1dGVzO1xuXG5cdH07XG5cblx0Ly8gZnJlZSByZXNvdXJjZVxuXG5cdHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGdsLmRlbGV0ZVByb2dyYW0oIHByb2dyYW0gKTtcblx0XHR0aGlzLnByb2dyYW0gPSB1bmRlZmluZWQ7XG5cblx0fTtcblxuXHQvLyBERVBSRUNBVEVEXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IC51bmlmb3JtcyBpcyBub3cgLmdldFVuaWZvcm1zKCkuJyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRVbmlmb3JtcygpO1xuXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGF0dHJpYnV0ZXM6IHtcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogLmF0dHJpYnV0ZXMgaXMgbm93IC5nZXRBdHRyaWJ1dGVzKCkuJyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCk7XG5cblx0XHRcdH1cblx0XHR9XG5cblx0fSApO1xuXG5cblx0Ly9cblxuXHR0aGlzLm5hbWUgPSBzaGFkZXIubmFtZTtcblx0dGhpcy5pZCA9IHByb2dyYW1JZENvdW50ICsrO1xuXHR0aGlzLmNvZGUgPSBjb2RlO1xuXHR0aGlzLnVzZWRUaW1lcyA9IDE7XG5cdHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG5cdHRoaXMudmVydGV4U2hhZGVyID0gZ2xWZXJ0ZXhTaGFkZXI7XG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBnbEZyYWdtZW50U2hhZGVyO1xuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbmV4cG9ydCB7IFdlYkdMUHJvZ3JhbSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmltcG9ydCB7IEJhY2tTaWRlLCBEb3VibGVTaWRlLCBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZywgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsIEdhbW1hRW5jb2RpbmcsIExpbmVhckVuY29kaW5nLCBPYmplY3RTcGFjZU5vcm1hbE1hcCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBXZWJHTFByb2dyYW0gfSBmcm9tICcuL1dlYkdMUHJvZ3JhbS5qcyc7XG5cbmZ1bmN0aW9uIFdlYkdMUHJvZ3JhbXMoIHJlbmRlcmVyLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0dmFyIHByb2dyYW1zID0gW107XG5cblx0dmFyIHNoYWRlcklEcyA9IHtcblx0XHRNZXNoRGVwdGhNYXRlcmlhbDogJ2RlcHRoJyxcblx0XHRNZXNoRGlzdGFuY2VNYXRlcmlhbDogJ2Rpc3RhbmNlUkdCQScsXG5cdFx0TWVzaE5vcm1hbE1hdGVyaWFsOiAnbm9ybWFsJyxcblx0XHRNZXNoQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJyxcblx0XHRNZXNoTGFtYmVydE1hdGVyaWFsOiAnbGFtYmVydCcsXG5cdFx0TWVzaFBob25nTWF0ZXJpYWw6ICdwaG9uZycsXG5cdFx0TWVzaFRvb25NYXRlcmlhbDogJ3Bob25nJyxcblx0XHRNZXNoU3RhbmRhcmRNYXRlcmlhbDogJ3BoeXNpY2FsJyxcblx0XHRNZXNoUGh5c2ljYWxNYXRlcmlhbDogJ3BoeXNpY2FsJyxcblx0XHRMaW5lQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJyxcblx0XHRMaW5lRGFzaGVkTWF0ZXJpYWw6ICdkYXNoZWQnLFxuXHRcdFBvaW50c01hdGVyaWFsOiAncG9pbnRzJyxcblx0XHRTaGFkb3dNYXRlcmlhbDogJ3NoYWRvdycsXG5cdFx0U3ByaXRlTWF0ZXJpYWw6ICdzcHJpdGUnXG5cdH07XG5cblx0dmFyIHBhcmFtZXRlck5hbWVzID0gW1xuXHRcdFwicHJlY2lzaW9uXCIsIFwic3VwcG9ydHNWZXJ0ZXhUZXh0dXJlc1wiLCBcIm1hcFwiLCBcIm1hcEVuY29kaW5nXCIsIFwiZW52TWFwXCIsIFwiZW52TWFwTW9kZVwiLCBcImVudk1hcEVuY29kaW5nXCIsXG5cdFx0XCJsaWdodE1hcFwiLCBcImFvTWFwXCIsIFwiZW1pc3NpdmVNYXBcIiwgXCJlbWlzc2l2ZU1hcEVuY29kaW5nXCIsIFwiYnVtcE1hcFwiLCBcIm5vcm1hbE1hcFwiLCBcIm9iamVjdFNwYWNlTm9ybWFsTWFwXCIsIFwiZGlzcGxhY2VtZW50TWFwXCIsIFwic3BlY3VsYXJNYXBcIixcblx0XHRcInJvdWdobmVzc01hcFwiLCBcIm1ldGFsbmVzc01hcFwiLCBcImdyYWRpZW50TWFwXCIsXG5cdFx0XCJhbHBoYU1hcFwiLCBcImNvbWJpbmVcIiwgXCJ2ZXJ0ZXhDb2xvcnNcIiwgXCJmb2dcIiwgXCJ1c2VGb2dcIiwgXCJmb2dFeHBcIixcblx0XHRcImZsYXRTaGFkaW5nXCIsIFwic2l6ZUF0dGVudWF0aW9uXCIsIFwibG9nYXJpdGhtaWNEZXB0aEJ1ZmZlclwiLCBcInNraW5uaW5nXCIsXG5cdFx0XCJtYXhCb25lc1wiLCBcInVzZVZlcnRleFRleHR1cmVcIiwgXCJtb3JwaFRhcmdldHNcIiwgXCJtb3JwaE5vcm1hbHNcIixcblx0XHRcIm1heE1vcnBoVGFyZ2V0c1wiLCBcIm1heE1vcnBoTm9ybWFsc1wiLCBcInByZW11bHRpcGxpZWRBbHBoYVwiLFxuXHRcdFwibnVtRGlyTGlnaHRzXCIsIFwibnVtUG9pbnRMaWdodHNcIiwgXCJudW1TcG90TGlnaHRzXCIsIFwibnVtSGVtaUxpZ2h0c1wiLCBcIm51bVJlY3RBcmVhTGlnaHRzXCIsXG5cdFx0XCJzaGFkb3dNYXBFbmFibGVkXCIsIFwic2hhZG93TWFwVHlwZVwiLCBcInRvbmVNYXBwaW5nXCIsICdwaHlzaWNhbGx5Q29ycmVjdExpZ2h0cycsXG5cdFx0XCJhbHBoYVRlc3RcIiwgXCJkb3VibGVTaWRlZFwiLCBcImZsaXBTaWRlZFwiLCBcIm51bUNsaXBwaW5nUGxhbmVzXCIsIFwibnVtQ2xpcEludGVyc2VjdGlvblwiLCBcImRlcHRoUGFja2luZ1wiLCBcImRpdGhlcmluZ1wiXG5cdF07XG5cblxuXHRmdW5jdGlvbiBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247XG5cdFx0dmFyIGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzICkge1xuXG5cdFx0XHRyZXR1cm4gMTAyNDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGRlZmF1bHQgZm9yIHdoZW4gb2JqZWN0IGlzIG5vdCBzcGVjaWZpZWRcblx0XHRcdC8vICggZm9yIGV4YW1wbGUgd2hlbiBwcmVidWlsZGluZyBzaGFkZXIgdG8gYmUgdXNlZCB3aXRoIG11bHRpcGxlIG9iamVjdHMgKVxuXHRcdFx0Ly9cblx0XHRcdC8vICAtIGxlYXZlIHNvbWUgZXh0cmEgc3BhY2UgZm9yIG90aGVyIHVuaWZvcm1zXG5cdFx0XHQvLyAgLSBsaW1pdCBoZXJlIGlzIEFOR0xFJ3MgMjU0IG1heCB1bmlmb3JtIHZlY3RvcnNcblx0XHRcdC8vICAgICh1cCB0byA1NCBzaG91bGQgYmUgc2FmZSlcblxuXHRcdFx0dmFyIG5WZXJ0ZXhVbmlmb3JtcyA9IGNhcGFiaWxpdGllcy5tYXhWZXJ0ZXhVbmlmb3Jtcztcblx0XHRcdHZhciBuVmVydGV4TWF0cmljZXMgPSBNYXRoLmZsb29yKCAoIG5WZXJ0ZXhVbmlmb3JtcyAtIDIwICkgLyA0ICk7XG5cblx0XHRcdHZhciBtYXhCb25lcyA9IE1hdGgubWluKCBuVmVydGV4TWF0cmljZXMsIGJvbmVzLmxlbmd0aCApO1xuXG5cdFx0XHRpZiAoIG1heEJvbmVzIDwgYm9uZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFNrZWxldG9uIGhhcyAnICsgYm9uZXMubGVuZ3RoICsgJyBib25lcy4gVGhpcyBHUFUgc3VwcG9ydHMgJyArIG1heEJvbmVzICsgJy4nICk7XG5cdFx0XHRcdHJldHVybiAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXhCb25lcztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWFwLCBnYW1tYU92ZXJyaWRlTGluZWFyICkge1xuXG5cdFx0dmFyIGVuY29kaW5nO1xuXG5cdFx0aWYgKCAhIG1hcCApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBMaW5lYXJFbmNvZGluZztcblxuXHRcdH0gZWxzZSBpZiAoIG1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGVuY29kaW5nID0gbWFwLmVuY29kaW5nO1xuXG5cdFx0fSBlbHNlIGlmICggbWFwLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuXCIgKTtcblx0XHRcdGVuY29kaW5nID0gbWFwLnRleHR1cmUuZW5jb2Rpbmc7XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIFdlYkdMUmVuZGVyZXIuZ2FtbWFJbnB1dC9nYW1tYU91dHB1dCBwYXJhbWV0ZXIsIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkIGF0IHNvbWUgcG9pbnQuXG5cdFx0aWYgKCBlbmNvZGluZyA9PT0gTGluZWFyRW5jb2RpbmcgJiYgZ2FtbWFPdmVycmlkZUxpbmVhciApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBHYW1tYUVuY29kaW5nO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVuY29kaW5nO1xuXG5cdH1cblxuXHR0aGlzLmdldFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBsaWdodHMsIHNoYWRvd3MsIGZvZywgbkNsaXBQbGFuZXMsIG5DbGlwSW50ZXJzZWN0aW9uLCBvYmplY3QgKSB7XG5cblx0XHR2YXIgc2hhZGVySUQgPSBzaGFkZXJJRHNbIG1hdGVyaWFsLnR5cGUgXTtcblxuXHRcdC8vIGhldXJpc3RpY3MgdG8gY3JlYXRlIHNoYWRlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBsaWdodHMgaW4gdGhlIHNjZW5lXG5cdFx0Ly8gKG5vdCB0byBibG93IG92ZXIgbWF4TGlnaHRzIGJ1ZGdldClcblxuXHRcdHZhciBtYXhCb25lcyA9IG9iamVjdC5pc1NraW5uZWRNZXNoID8gYWxsb2NhdGVCb25lcyggb2JqZWN0ICkgOiAwO1xuXHRcdHZhciBwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMucHJlY2lzaW9uO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5wcmVjaXNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHByZWNpc2lvbiA9IGNhcGFiaWxpdGllcy5nZXRNYXhQcmVjaXNpb24oIG1hdGVyaWFsLnByZWNpc2lvbiApO1xuXG5cdFx0XHRpZiAoIHByZWNpc2lvbiAhPT0gbWF0ZXJpYWwucHJlY2lzaW9uICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbS5nZXRQYXJhbWV0ZXJzOicsIG1hdGVyaWFsLnByZWNpc2lvbiwgJ25vdCBzdXBwb3J0ZWQsIHVzaW5nJywgcHJlY2lzaW9uLCAnaW5zdGVhZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cblx0XHR2YXIgcGFyYW1ldGVycyA9IHtcblxuXHRcdFx0c2hhZGVySUQ6IHNoYWRlcklELFxuXG5cdFx0XHRwcmVjaXNpb246IHByZWNpc2lvbixcblx0XHRcdHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6IGNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcyxcblx0XHRcdG91dHB1dEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCAoICEgY3VycmVudFJlbmRlclRhcmdldCApID8gbnVsbCA6IGN1cnJlbnRSZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyZXIuZ2FtbWFPdXRwdXQgKSxcblx0XHRcdG1hcDogISEgbWF0ZXJpYWwubWFwLFxuXHRcdFx0bWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLm1hcCwgcmVuZGVyZXIuZ2FtbWFJbnB1dCApLFxuXHRcdFx0ZW52TWFwOiAhISBtYXRlcmlhbC5lbnZNYXAsXG5cdFx0XHRlbnZNYXBNb2RlOiBtYXRlcmlhbC5lbnZNYXAgJiYgbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcsXG5cdFx0XHRlbnZNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW52TWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksXG5cdFx0XHRlbnZNYXBDdWJlVVY6ICggISEgbWF0ZXJpYWwuZW52TWFwICkgJiYgKCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyApIHx8ICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nICkgKSxcblx0XHRcdGxpZ2h0TWFwOiAhISBtYXRlcmlhbC5saWdodE1hcCxcblx0XHRcdGFvTWFwOiAhISBtYXRlcmlhbC5hb01hcCxcblx0XHRcdGVtaXNzaXZlTWFwOiAhISBtYXRlcmlhbC5lbWlzc2l2ZU1hcCxcblx0XHRcdGVtaXNzaXZlTWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksXG5cdFx0XHRidW1wTWFwOiAhISBtYXRlcmlhbC5idW1wTWFwLFxuXHRcdFx0bm9ybWFsTWFwOiAhISBtYXRlcmlhbC5ub3JtYWxNYXAsXG5cdFx0XHRvYmplY3RTcGFjZU5vcm1hbE1hcDogbWF0ZXJpYWwubm9ybWFsTWFwVHlwZSA9PT0gT2JqZWN0U3BhY2VOb3JtYWxNYXAsXG5cdFx0XHRkaXNwbGFjZW1lbnRNYXA6ICEhIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCxcblx0XHRcdHJvdWdobmVzc01hcDogISEgbWF0ZXJpYWwucm91Z2huZXNzTWFwLFxuXHRcdFx0bWV0YWxuZXNzTWFwOiAhISBtYXRlcmlhbC5tZXRhbG5lc3NNYXAsXG5cdFx0XHRzcGVjdWxhck1hcDogISEgbWF0ZXJpYWwuc3BlY3VsYXJNYXAsXG5cdFx0XHRhbHBoYU1hcDogISEgbWF0ZXJpYWwuYWxwaGFNYXAsXG5cblx0XHRcdGdyYWRpZW50TWFwOiAhISBtYXRlcmlhbC5ncmFkaWVudE1hcCxcblxuXHRcdFx0Y29tYmluZTogbWF0ZXJpYWwuY29tYmluZSxcblxuXHRcdFx0dmVydGV4Q29sb3JzOiBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMsXG5cblx0XHRcdGZvZzogISEgZm9nLFxuXHRcdFx0dXNlRm9nOiBtYXRlcmlhbC5mb2csXG5cdFx0XHRmb2dFeHA6ICggZm9nICYmIGZvZy5pc0ZvZ0V4cDIgKSxcblxuXHRcdFx0ZmxhdFNoYWRpbmc6IG1hdGVyaWFsLmZsYXRTaGFkaW5nLFxuXG5cdFx0XHRzaXplQXR0ZW51YXRpb246IG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbixcblx0XHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLFxuXG5cdFx0XHRza2lubmluZzogbWF0ZXJpYWwuc2tpbm5pbmcgJiYgbWF4Qm9uZXMgPiAwLFxuXHRcdFx0bWF4Qm9uZXM6IG1heEJvbmVzLFxuXHRcdFx0dXNlVmVydGV4VGV4dHVyZTogY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMsXG5cblx0XHRcdG1vcnBoVGFyZ2V0czogbWF0ZXJpYWwubW9ycGhUYXJnZXRzLFxuXHRcdFx0bW9ycGhOb3JtYWxzOiBtYXRlcmlhbC5tb3JwaE5vcm1hbHMsXG5cdFx0XHRtYXhNb3JwaFRhcmdldHM6IHJlbmRlcmVyLm1heE1vcnBoVGFyZ2V0cyxcblx0XHRcdG1heE1vcnBoTm9ybWFsczogcmVuZGVyZXIubWF4TW9ycGhOb3JtYWxzLFxuXG5cdFx0XHRudW1EaXJMaWdodHM6IGxpZ2h0cy5kaXJlY3Rpb25hbC5sZW5ndGgsXG5cdFx0XHRudW1Qb2ludExpZ2h0czogbGlnaHRzLnBvaW50Lmxlbmd0aCxcblx0XHRcdG51bVNwb3RMaWdodHM6IGxpZ2h0cy5zcG90Lmxlbmd0aCxcblx0XHRcdG51bVJlY3RBcmVhTGlnaHRzOiBsaWdodHMucmVjdEFyZWEubGVuZ3RoLFxuXHRcdFx0bnVtSGVtaUxpZ2h0czogbGlnaHRzLmhlbWkubGVuZ3RoLFxuXG5cdFx0XHRudW1DbGlwcGluZ1BsYW5lczogbkNsaXBQbGFuZXMsXG5cdFx0XHRudW1DbGlwSW50ZXJzZWN0aW9uOiBuQ2xpcEludGVyc2VjdGlvbixcblxuXHRcdFx0ZGl0aGVyaW5nOiBtYXRlcmlhbC5kaXRoZXJpbmcsXG5cblx0XHRcdHNoYWRvd01hcEVuYWJsZWQ6IHJlbmRlcmVyLnNoYWRvd01hcC5lbmFibGVkICYmIG9iamVjdC5yZWNlaXZlU2hhZG93ICYmIHNoYWRvd3MubGVuZ3RoID4gMCxcblx0XHRcdHNoYWRvd01hcFR5cGU6IHJlbmRlcmVyLnNoYWRvd01hcC50eXBlLFxuXG5cdFx0XHR0b25lTWFwcGluZzogcmVuZGVyZXIudG9uZU1hcHBpbmcsXG5cdFx0XHRwaHlzaWNhbGx5Q29ycmVjdExpZ2h0czogcmVuZGVyZXIucGh5c2ljYWxseUNvcnJlY3RMaWdodHMsXG5cblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYTogbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhLFxuXG5cdFx0XHRhbHBoYVRlc3Q6IG1hdGVyaWFsLmFscGhhVGVzdCxcblx0XHRcdGRvdWJsZVNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlLFxuXHRcdFx0ZmxpcFNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSxcblxuXHRcdFx0ZGVwdGhQYWNraW5nOiAoIG1hdGVyaWFsLmRlcHRoUGFja2luZyAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgOiBmYWxzZVxuXG5cdFx0fTtcblxuXHRcdHJldHVybiBwYXJhbWV0ZXJzO1xuXG5cdH07XG5cblx0dGhpcy5nZXRQcm9ncmFtQ29kZSA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHtcblxuXHRcdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5zaGFkZXJJRCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgKTtcblx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLnZlcnRleFNoYWRlciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kZWZpbmVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBuYW1lIGluIG1hdGVyaWFsLmRlZmluZXMgKSB7XG5cblx0XHRcdFx0YXJyYXkucHVzaCggbmFtZSApO1xuXHRcdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbC5kZWZpbmVzWyBuYW1lIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzWyBwYXJhbWV0ZXJOYW1lc1sgaSBdIF0gKTtcblxuXHRcdH1cblxuXHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLm9uQmVmb3JlQ29tcGlsZS50b1N0cmluZygpICk7XG5cblx0XHRhcnJheS5wdXNoKCByZW5kZXJlci5nYW1tYU91dHB1dCApO1xuXG5cdFx0cmV0dXJuIGFycmF5LmpvaW4oKTtcblxuXHR9O1xuXG5cdHRoaXMuYWNxdWlyZVByb2dyYW0gPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBzaGFkZXIsIHBhcmFtZXRlcnMsIGNvZGUgKSB7XG5cblx0XHR2YXIgcHJvZ3JhbTtcblxuXHRcdC8vIENoZWNrIGlmIGNvZGUgaGFzIGJlZW4gYWxyZWFkeSBjb21waWxlZFxuXHRcdGZvciAoIHZhciBwID0gMCwgcGwgPSBwcm9ncmFtcy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHtcblxuXHRcdFx0dmFyIHByb2dyYW1JbmZvID0gcHJvZ3JhbXNbIHAgXTtcblxuXHRcdFx0aWYgKCBwcm9ncmFtSW5mby5jb2RlID09PSBjb2RlICkge1xuXG5cdFx0XHRcdHByb2dyYW0gPSBwcm9ncmFtSW5mbztcblx0XHRcdFx0KysgcHJvZ3JhbS51c2VkVGltZXM7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwcm9ncmFtID0gbmV3IFdlYkdMUHJvZ3JhbSggcmVuZGVyZXIsIGV4dGVuc2lvbnMsIGNvZGUsIG1hdGVyaWFsLCBzaGFkZXIsIHBhcmFtZXRlcnMsIGNhcGFiaWxpdGllcyApO1xuXHRcdFx0cHJvZ3JhbXMucHVzaCggcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fTtcblxuXHR0aGlzLnJlbGVhc2VQcm9ncmFtID0gZnVuY3Rpb24gKCBwcm9ncmFtICkge1xuXG5cdFx0aWYgKCAtLSBwcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldFxuXHRcdFx0dmFyIGkgPSBwcm9ncmFtcy5pbmRleE9mKCBwcm9ncmFtICk7XG5cdFx0XHRwcm9ncmFtc1sgaSBdID0gcHJvZ3JhbXNbIHByb2dyYW1zLmxlbmd0aCAtIDEgXTtcblx0XHRcdHByb2dyYW1zLnBvcCgpO1xuXG5cdFx0XHQvLyBGcmVlIFdlYkdMIHJlc291cmNlc1xuXHRcdFx0cHJvZ3JhbS5kZXN0cm95KCk7XG5cblx0XHR9XG5cblx0fTtcblxuXHQvLyBFeHBvc2VkIGZvciByZXNvdXJjZSBtb25pdG9yaW5nICYgZXJyb3IgZmVlZGJhY2sgdmlhIHJlbmRlcmVyLmluZm86XG5cdHRoaXMucHJvZ3JhbXMgPSBwcm9ncmFtcztcblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMUHJvZ3JhbXMgfTtcbiIsIi8qKlxuICogQGF1dGhvciBmb3JkYWNpb3VzIC8gZm9yZGFjaW91cy5naXRodWIuaW9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFByb3BlcnRpZXMoKSB7XG5cblx0dmFyIHByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIGdldCggb2JqZWN0ICkge1xuXG5cdFx0dmFyIG1hcCA9IHByb3BlcnRpZXMuZ2V0KCBvYmplY3QgKTtcblxuXHRcdGlmICggbWFwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hcCA9IHt9O1xuXHRcdFx0cHJvcGVydGllcy5zZXQoIG9iamVjdCwgbWFwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW1vdmUoIG9iamVjdCApIHtcblxuXHRcdHByb3BlcnRpZXMuZGVsZXRlKCBvYmplY3QgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QsIGtleSwgdmFsdWUgKSB7XG5cblx0XHRwcm9wZXJ0aWVzLmdldCggb2JqZWN0IClbIGtleSBdID0gdmFsdWU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHRwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHR1cGRhdGU6IHVwZGF0ZSxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cdH07XG5cbn1cblxuXG5leHBvcnQgeyBXZWJHTFByb3BlcnRpZXMgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0fSBlbHNlIGlmICggYS5wcm9ncmFtICYmIGIucHJvZ3JhbSAmJiBhLnByb2dyYW0gIT09IGIucHJvZ3JhbSApIHtcblxuXHRcdHJldHVybiBhLnByb2dyYW0uaWQgLSBiLnByb2dyYW0uaWQ7XG5cblx0fSBlbHNlIGlmICggYS5tYXRlcmlhbC5pZCAhPT0gYi5tYXRlcmlhbC5pZCApIHtcblxuXHRcdHJldHVybiBhLm1hdGVyaWFsLmlkIC0gYi5tYXRlcmlhbC5pZDtcblxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdHJldHVybiBhLnogLSBiLno7XG5cblx0fSBlbHNlIHtcblxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHR9IGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRyZXR1cm4gYi56IC0gYS56O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XG5cblx0fVxuXG59XG5cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0KCkge1xuXG5cdHZhciByZW5kZXJJdGVtcyA9IFtdO1xuXHR2YXIgcmVuZGVySXRlbXNJbmRleCA9IDA7XG5cblx0dmFyIG9wYXF1ZSA9IFtdO1xuXHR2YXIgdHJhbnNwYXJlbnQgPSBbXTtcblxuXHRmdW5jdGlvbiBpbml0KCkge1xuXG5cdFx0cmVuZGVySXRlbXNJbmRleCA9IDA7XG5cblx0XHRvcGFxdWUubGVuZ3RoID0gMDtcblx0XHR0cmFuc3BhcmVudC5sZW5ndGggPSAwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgeiwgZ3JvdXAgKSB7XG5cblx0XHR2YXIgcmVuZGVySXRlbSA9IHJlbmRlckl0ZW1zWyByZW5kZXJJdGVtc0luZGV4IF07XG5cblx0XHRpZiAoIHJlbmRlckl0ZW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVySXRlbSA9IHtcblx0XHRcdFx0aWQ6IG9iamVjdC5pZCxcblx0XHRcdFx0b2JqZWN0OiBvYmplY3QsXG5cdFx0XHRcdGdlb21ldHJ5OiBnZW9tZXRyeSxcblx0XHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxuXHRcdFx0XHRwcm9ncmFtOiBtYXRlcmlhbC5wcm9ncmFtLFxuXHRcdFx0XHRyZW5kZXJPcmRlcjogb2JqZWN0LnJlbmRlck9yZGVyLFxuXHRcdFx0XHR6OiB6LFxuXHRcdFx0XHRncm91cDogZ3JvdXBcblx0XHRcdH07XG5cblx0XHRcdHJlbmRlckl0ZW1zWyByZW5kZXJJdGVtc0luZGV4IF0gPSByZW5kZXJJdGVtO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVySXRlbS5pZCA9IG9iamVjdC5pZDtcblx0XHRcdHJlbmRlckl0ZW0ub2JqZWN0ID0gb2JqZWN0O1xuXHRcdFx0cmVuZGVySXRlbS5nZW9tZXRyeSA9IGdlb21ldHJ5O1xuXHRcdFx0cmVuZGVySXRlbS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHRcdFx0cmVuZGVySXRlbS5wcm9ncmFtID0gbWF0ZXJpYWwucHJvZ3JhbTtcblx0XHRcdHJlbmRlckl0ZW0ucmVuZGVyT3JkZXIgPSBvYmplY3QucmVuZGVyT3JkZXI7XG5cdFx0XHRyZW5kZXJJdGVtLnogPSB6O1xuXHRcdFx0cmVuZGVySXRlbS5ncm91cCA9IGdyb3VwO1xuXG5cdFx0fVxuXG5cblx0XHQoIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlID8gdHJhbnNwYXJlbnQgOiBvcGFxdWUgKS5wdXNoKCByZW5kZXJJdGVtICk7XG5cblx0XHRyZW5kZXJJdGVtc0luZGV4ICsrO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzb3J0KCkge1xuXG5cdFx0aWYgKCBvcGFxdWUubGVuZ3RoID4gMSApIG9wYXF1ZS5zb3J0KCBwYWludGVyU29ydFN0YWJsZSApO1xuXHRcdGlmICggdHJhbnNwYXJlbnQubGVuZ3RoID4gMSApIHRyYW5zcGFyZW50LnNvcnQoIHJldmVyc2VQYWludGVyU29ydFN0YWJsZSApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG9wYXF1ZTogb3BhcXVlLFxuXHRcdHRyYW5zcGFyZW50OiB0cmFuc3BhcmVudCxcblxuXHRcdGluaXQ6IGluaXQsXG5cdFx0cHVzaDogcHVzaCxcblxuXHRcdHNvcnQ6IHNvcnRcblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlckxpc3RzKCkge1xuXG5cdHZhciBsaXN0cyA9IHt9O1xuXG5cdGZ1bmN0aW9uIGdldCggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdHZhciBoYXNoID0gc2NlbmUuaWQgKyAnLCcgKyBjYW1lcmEuaWQ7XG5cdFx0dmFyIGxpc3QgPSBsaXN0c1sgaGFzaCBdO1xuXG5cdFx0aWYgKCBsaXN0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJMaXN0czonLCBoYXNoICk7XG5cblx0XHRcdGxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0KCk7XG5cdFx0XHRsaXN0c1sgaGFzaCBdID0gbGlzdDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBsaXN0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0bGlzdHMgPSB7fTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cdH07XG5cbn1cblxuXG5leHBvcnQgeyBXZWJHTFJlbmRlckxpc3RzIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcblxuZnVuY3Rpb24gVW5pZm9ybXNDYWNoZSgpIHtcblxuXHR2YXIgbGlnaHRzID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdFx0aWYgKCBsaWdodHNbIGxpZ2h0LmlkIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbGlnaHRzWyBsaWdodC5pZCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB1bmlmb3JtcztcblxuXHRcdFx0c3dpdGNoICggbGlnaHQudHlwZSApIHtcblxuXHRcdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblxuXHRcdFx0XHRcdFx0c2hhZG93OiBmYWxzZSxcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGNvbmVDb3M6IDAsXG5cdFx0XHRcdFx0XHRwZW51bWJyYUNvczogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCksXG5cdFx0XHRcdFx0XHRzaGFkb3dDYW1lcmFOZWFyOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93Q2FtZXJhRmFyOiAxMDAwXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0c2t5Q29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0Z3JvdW5kQ29sb3I6IG5ldyBDb2xvcigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZldpZHRoOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZkhlaWdodDogbmV3IFZlY3RvcjMoKVxuXHRcdFx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IHNldCBSZWN0QXJlYUxpZ2h0IHNoYWRvdyB1bmlmb3Jtc1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdHJldHVybiB1bmlmb3JtcztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbnZhciBjb3VudCA9IDA7XG5cbmZ1bmN0aW9uIFdlYkdMTGlnaHRzKCkge1xuXG5cdHZhciBjYWNoZSA9IG5ldyBVbmlmb3Jtc0NhY2hlKCk7XG5cblx0dmFyIHN0YXRlID0ge1xuXG5cdFx0aWQ6IGNvdW50ICsrLFxuXG5cdFx0aGFzaDoge1xuXHRcdFx0c3RhdGVJRDogLSAxLFxuXHRcdFx0ZGlyZWN0aW9uYWxMZW5ndGg6IC0gMSxcblx0XHRcdHBvaW50TGVuZ3RoOiAtIDEsXG5cdFx0XHRzcG90TGVuZ3RoOiAtIDEsXG5cdFx0XHRyZWN0QXJlYUxlbmd0aDogLSAxLFxuXHRcdFx0aGVtaUxlbmd0aDogLSAxLFxuXHRcdFx0c2hhZG93c0xlbmd0aDogLSAxXG5cdFx0fSxcblxuXHRcdGFtYmllbnQ6IFsgMCwgMCwgMCBdLFxuXHRcdGRpcmVjdGlvbmFsOiBbXSxcblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hcDogW10sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IFtdLFxuXHRcdHNwb3Q6IFtdLFxuXHRcdHNwb3RTaGFkb3dNYXA6IFtdLFxuXHRcdHNwb3RTaGFkb3dNYXRyaXg6IFtdLFxuXHRcdHJlY3RBcmVhOiBbXSxcblx0XHRwb2ludDogW10sXG5cdFx0cG9pbnRTaGFkb3dNYXA6IFtdLFxuXHRcdHBvaW50U2hhZG93TWF0cml4OiBbXSxcblx0XHRoZW1pOiBbXVxuXG5cdH07XG5cblx0dmFyIHZlY3RvcjMgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbWF0cml4NCA9IG5ldyBNYXRyaXg0KCk7XG5cdHZhciBtYXRyaXg0MiA9IG5ldyBNYXRyaXg0KCk7XG5cblx0ZnVuY3Rpb24gc2V0dXAoIGxpZ2h0cywgc2hhZG93cywgY2FtZXJhICkge1xuXG5cdFx0dmFyIHIgPSAwLCBnID0gMCwgYiA9IDA7XG5cblx0XHR2YXIgZGlyZWN0aW9uYWxMZW5ndGggPSAwO1xuXHRcdHZhciBwb2ludExlbmd0aCA9IDA7XG5cdFx0dmFyIHNwb3RMZW5ndGggPSAwO1xuXHRcdHZhciByZWN0QXJlYUxlbmd0aCA9IDA7XG5cdFx0dmFyIGhlbWlMZW5ndGggPSAwO1xuXG5cdFx0dmFyIHZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXG5cdFx0XHR2YXIgY29sb3IgPSBsaWdodC5jb2xvcjtcblx0XHRcdHZhciBpbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTtcblxuXHRcdFx0dmFyIHNoYWRvd01hcCA9ICggbGlnaHQuc2hhZG93ICYmIGxpZ2h0LnNoYWRvdy5tYXAgKSA/IGxpZ2h0LnNoYWRvdy5tYXAudGV4dHVyZSA6IG51bGw7XG5cblx0XHRcdGlmICggbGlnaHQuaXNBbWJpZW50TGlnaHQgKSB7XG5cblx0XHRcdFx0ciArPSBjb2xvci5yICogaW50ZW5zaXR5O1xuXHRcdFx0XHRnICs9IGNvbG9yLmcgKiBpbnRlbnNpdHk7XG5cdFx0XHRcdGIgKz0gY29sb3IuYiAqIGludGVuc2l0eTtcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNEaXJlY3Rpb25hbExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBsaWdodC5pbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc3ViKCB2ZWN0b3IzICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdHZhciBzaGFkb3cgPSBsaWdodC5zaGFkb3c7XG5cblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1cztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWFwWyBkaXJlY3Rpb25hbExlbmd0aCBdID0gc2hhZG93TWFwO1xuXHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cdFx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsWyBkaXJlY3Rpb25hbExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0ZGlyZWN0aW9uYWxMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzU3BvdExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggdmVjdG9yMyApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29uZUNvcyA9IE1hdGguY29zKCBsaWdodC5hbmdsZSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wZW51bWJyYUNvcyA9IE1hdGguY29zKCBsaWdodC5hbmdsZSAqICggMSAtIGxpZ2h0LnBlbnVtYnJhICkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGVjYXkgPSAoIGxpZ2h0LmRpc3RhbmNlID09PSAwICkgPyAwLjAgOiBsaWdodC5kZWNheTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdHZhciBzaGFkb3cgPSBsaWdodC5zaGFkb3c7XG5cblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1cztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXBbIHNwb3RMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0c3RhdGUuc3BvdFNoYWRvd01hdHJpeFsgc3BvdExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDtcblx0XHRcdFx0c3RhdGUuc3BvdFsgc3BvdExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0c3BvdExlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNSZWN0QXJlYUxpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHQvLyAoYSkgaW50ZW5zaXR5IGlzIHRoZSB0b3RhbCB2aXNpYmxlIGxpZ2h0IGVtaXR0ZWRcblx0XHRcdFx0Ly91bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgLyAoIGxpZ2h0LndpZHRoICogbGlnaHQuaGVpZ2h0ICogTWF0aC5QSSApICk7XG5cblx0XHRcdFx0Ly8gKGIpIGludGVuc2l0eSBpcyB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgbGlnaHRcblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHQvLyBleHRyYWN0IGxvY2FsIHJvdGF0aW9uIG9mIGxpZ2h0IHRvIGRlcml2ZSB3aWR0aC9oZWlnaHQgaGFsZiB2ZWN0b3JzXG5cdFx0XHRcdG1hdHJpeDQyLmlkZW50aXR5KCk7XG5cdFx0XHRcdG1hdHJpeDQuY29weSggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0bWF0cml4NC5wcmVtdWx0aXBseSggdmlld01hdHJpeCApO1xuXHRcdFx0XHRtYXRyaXg0Mi5leHRyYWN0Um90YXRpb24oIG1hdHJpeDQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmV2lkdGguc2V0KCBsaWdodC53aWR0aCAqIDAuNSwgMC4wLCAwLjAgKTtcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5zZXQoIDAuMCwgbGlnaHQuaGVpZ2h0ICogMC41LCAwLjAgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KCBtYXRyaXg0MiApO1xuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTtcblxuXHRcdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogUmVjdEFyZWFMaWdodCBkaXN0YW5jZT9cblx0XHRcdFx0Ly8gdW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHRzdGF0ZS5yZWN0QXJlYVsgcmVjdEFyZWFMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHJlY3RBcmVhTGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7XG5cdFx0XHRcdHVuaWZvcm1zLmRlY2F5ID0gKCBsaWdodC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVjYXk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0NhbWVyYU5lYXIgPSBzaGFkb3cuY2FtZXJhLm5lYXI7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93Q2FtZXJhRmFyID0gc2hhZG93LmNhbWVyYS5mYXI7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLnBvaW50U2hhZG93TWFwWyBwb2ludExlbmd0aCBdID0gc2hhZG93TWFwO1xuXHRcdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hdHJpeFsgcG9pbnRMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cdFx0XHRcdHN0YXRlLnBvaW50WyBwb2ludExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0cG9pbnRMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzSGVtaXNwaGVyZUxpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5za3lDb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZ3JvdW5kQ29sb3IuY29weSggbGlnaHQuZ3JvdW5kQ29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0c3RhdGUuaGVtaVsgaGVtaUxlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0aGVtaUxlbmd0aCArKztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYW1iaWVudFsgMCBdID0gcjtcblx0XHRzdGF0ZS5hbWJpZW50WyAxIF0gPSBnO1xuXHRcdHN0YXRlLmFtYmllbnRbIDIgXSA9IGI7XG5cblx0XHRzdGF0ZS5kaXJlY3Rpb25hbC5sZW5ndGggPSBkaXJlY3Rpb25hbExlbmd0aDtcblx0XHRzdGF0ZS5zcG90Lmxlbmd0aCA9IHNwb3RMZW5ndGg7XG5cdFx0c3RhdGUucmVjdEFyZWEubGVuZ3RoID0gcmVjdEFyZWFMZW5ndGg7XG5cdFx0c3RhdGUucG9pbnQubGVuZ3RoID0gcG9pbnRMZW5ndGg7XG5cdFx0c3RhdGUuaGVtaS5sZW5ndGggPSBoZW1pTGVuZ3RoO1xuXG5cdFx0c3RhdGUuaGFzaC5zdGF0ZUlEID0gc3RhdGUuaWQ7XG5cdFx0c3RhdGUuaGFzaC5kaXJlY3Rpb25hbExlbmd0aCA9IGRpcmVjdGlvbmFsTGVuZ3RoO1xuXHRcdHN0YXRlLmhhc2gucG9pbnRMZW5ndGggPSBwb2ludExlbmd0aDtcblx0XHRzdGF0ZS5oYXNoLnNwb3RMZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdHN0YXRlLmhhc2gucmVjdEFyZWFMZW5ndGggPSByZWN0QXJlYUxlbmd0aDtcblx0XHRzdGF0ZS5oYXNoLmhlbWlMZW5ndGggPSBoZW1pTGVuZ3RoO1xuXHRcdHN0YXRlLmhhc2guc2hhZG93c0xlbmd0aCA9IHNoYWRvd3MubGVuZ3RoO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHNldHVwOiBzZXR1cCxcblx0XHRzdGF0ZTogc3RhdGVcblx0fTtcblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMTGlnaHRzIH07XG4iLCIvKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuaW1wb3J0IHsgV2ViR0xMaWdodHMgfSBmcm9tICcuL1dlYkdMTGlnaHRzLmpzJztcblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJTdGF0ZSgpIHtcblxuXHR2YXIgbGlnaHRzID0gbmV3IFdlYkdMTGlnaHRzKCk7XG5cblx0dmFyIGxpZ2h0c0FycmF5ID0gW107XG5cdHZhciBzaGFkb3dzQXJyYXkgPSBbXTtcblxuXHRmdW5jdGlvbiBpbml0KCkge1xuXG5cdFx0bGlnaHRzQXJyYXkubGVuZ3RoID0gMDtcblx0XHRzaGFkb3dzQXJyYXkubGVuZ3RoID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaExpZ2h0KCBsaWdodCApIHtcblxuXHRcdGxpZ2h0c0FycmF5LnB1c2goIGxpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hTaGFkb3coIHNoYWRvd0xpZ2h0ICkge1xuXG5cdFx0c2hhZG93c0FycmF5LnB1c2goIHNoYWRvd0xpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldHVwTGlnaHRzKCBjYW1lcmEgKSB7XG5cblx0XHRsaWdodHMuc2V0dXAoIGxpZ2h0c0FycmF5LCBzaGFkb3dzQXJyYXksIGNhbWVyYSApO1xuXG5cdH1cblxuXHR2YXIgc3RhdGUgPSB7XG5cdFx0bGlnaHRzQXJyYXk6IGxpZ2h0c0FycmF5LFxuXHRcdHNoYWRvd3NBcnJheTogc2hhZG93c0FycmF5LFxuXG5cdFx0bGlnaHRzOiBsaWdodHNcblx0fTtcblxuXHRyZXR1cm4ge1xuXHRcdGluaXQ6IGluaXQsXG5cdFx0c3RhdGU6IHN0YXRlLFxuXHRcdHNldHVwTGlnaHRzOiBzZXR1cExpZ2h0cyxcblxuXHRcdHB1c2hMaWdodDogcHVzaExpZ2h0LFxuXHRcdHB1c2hTaGFkb3c6IHB1c2hTaGFkb3dcblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlcygpIHtcblxuXHR2YXIgcmVuZGVyU3RhdGVzID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0dmFyIHJlbmRlclN0YXRlO1xuXG5cdFx0aWYgKCByZW5kZXJTdGF0ZXNbIHNjZW5lLmlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVyU3RhdGUgPSBuZXcgV2ViR0xSZW5kZXJTdGF0ZSgpO1xuXHRcdFx0cmVuZGVyU3RhdGVzWyBzY2VuZS5pZCBdID0ge307XG5cdFx0XHRyZW5kZXJTdGF0ZXNbIHNjZW5lLmlkIF1bIGNhbWVyYS5pZCBdID0gcmVuZGVyU3RhdGU7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIHJlbmRlclN0YXRlc1sgc2NlbmUuaWQgXVsgY2FtZXJhLmlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZW5kZXJTdGF0ZSA9IG5ldyBXZWJHTFJlbmRlclN0YXRlKCk7XG5cdFx0XHRcdHJlbmRlclN0YXRlc1sgc2NlbmUuaWQgXVsgY2FtZXJhLmlkIF0gPSByZW5kZXJTdGF0ZTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlc1sgc2NlbmUuaWQgXVsgY2FtZXJhLmlkIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiByZW5kZXJTdGF0ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblxuXHRcdHJlbmRlclN0YXRlcyA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGdldDogZ2V0LFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2Vcblx0fTtcblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMUmVuZGVyU3RhdGVzIH07XG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgQmFzaWNEZXB0aFBhY2tpbmcgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHBzOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKlxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoRGVwdGhNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hEZXB0aE1hdGVyaWFsJztcblxuXHR0aGlzLmRlcHRoUGFja2luZyA9IEJhc2ljRGVwdGhQYWNraW5nO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaERlcHRoTWF0ZXJpYWw7XG5cbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlcHRoUGFja2luZyA9IHNvdXJjZS5kZXB0aFBhY2tpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuZXhwb3J0IHsgTWVzaERlcHRoTWF0ZXJpYWwgfTtcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICpcbiAqICByZWZlcmVuY2VQb3NpdGlvbjogPGZsb2F0PixcbiAqICBuZWFyRGlzdGFuY2U6IDxmbG9hdD4sXG4gKiAgZmFyRGlzdGFuY2U6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+XG4gKlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hEaXN0YW5jZU1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaERpc3RhbmNlTWF0ZXJpYWwnO1xuXG5cdHRoaXMucmVmZXJlbmNlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLm5lYXJEaXN0YW5jZSA9IDE7XG5cdHRoaXMuZmFyRGlzdGFuY2UgPSAxMDAwO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGlzdGFuY2VNYXRlcmlhbDtcblxuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weSggc291cmNlLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdHRoaXMubmVhckRpc3RhbmNlID0gc291cmNlLm5lYXJEaXN0YW5jZTtcblx0dGhpcy5mYXJEaXN0YW5jZSA9IHNvdXJjZS5mYXJEaXN0YW5jZTtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5leHBvcnQgeyBNZXNoRGlzdGFuY2VNYXRlcmlhbCB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5pbXBvcnQgeyBGcm9udFNpZGUsIEJhY2tTaWRlLCBEb3VibGVTaWRlLCBSR0JBRm9ybWF0LCBOZWFyZXN0RmlsdGVyLCBQQ0ZTaGFkb3dNYXAsIFJHQkFEZXB0aFBhY2tpbmcgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi9XZWJHTFJlbmRlclRhcmdldC5qcyc7XG5pbXBvcnQgeyBNZXNoRGVwdGhNYXRlcmlhbCB9IGZyb20gJy4uLy4uL21hdGVyaWFscy9NZXNoRGVwdGhNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBNZXNoRGlzdGFuY2VNYXRlcmlhbCB9IGZyb20gJy4uLy4uL21hdGVyaWFscy9NZXNoRGlzdGFuY2VNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXg0LmpzJztcbmltcG9ydCB7IEZydXN0dW0gfSBmcm9tICcuLi8uLi9tYXRoL0ZydXN0dW0uanMnO1xuXG5mdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggX3JlbmRlcmVyLCBfb2JqZWN0cywgbWF4VGV4dHVyZVNpemUgKSB7XG5cblx0dmFyIF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSxcblx0XHRfcHJvalNjcmVlbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCksXG5cblx0XHRfc2hhZG93TWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCksXG5cdFx0X21heFNoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMiggbWF4VGV4dHVyZVNpemUsIG1heFRleHR1cmVTaXplICksXG5cblx0XHRfbG9va1RhcmdldCA9IG5ldyBWZWN0b3IzKCksXG5cdFx0X2xpZ2h0UG9zaXRpb25Xb3JsZCA9IG5ldyBWZWN0b3IzKCksXG5cblx0XHRfTW9ycGhpbmdGbGFnID0gMSxcblx0XHRfU2tpbm5pbmdGbGFnID0gMixcblxuXHRcdF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgPSAoIF9Nb3JwaGluZ0ZsYWcgfCBfU2tpbm5pbmdGbGFnICkgKyAxLFxuXG5cdFx0X2RlcHRoTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cdFx0X2Rpc3RhbmNlTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cblx0XHRfbWF0ZXJpYWxDYWNoZSA9IHt9O1xuXG5cdHZhciBzaGFkb3dTaWRlID0geyAwOiBCYWNrU2lkZSwgMTogRnJvbnRTaWRlLCAyOiBEb3VibGVTaWRlIH07XG5cblx0dmFyIGN1YmVEaXJlY3Rpb25zID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcblx0XHRuZXcgVmVjdG9yMyggMCwgMCwgLSAxICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKVxuXHRdO1xuXG5cdHZhciBjdWJlVXBzID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksXG5cdFx0bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcdG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKVxuXHRdO1xuXG5cdHZhciBjdWJlMkRWaWV3UG9ydHMgPSBbXG5cdFx0bmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSxcblx0XHRuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpXG5cdF07XG5cblx0Ly8gaW5pdFxuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gX051bWJlck9mTWF0ZXJpYWxWYXJpYW50czsgKysgaSApIHtcblxuXHRcdHZhciB1c2VNb3JwaGluZyA9ICggaSAmIF9Nb3JwaGluZ0ZsYWcgKSAhPT0gMDtcblx0XHR2YXIgdXNlU2tpbm5pbmcgPSAoIGkgJiBfU2tpbm5pbmdGbGFnICkgIT09IDA7XG5cblx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCgge1xuXG5cdFx0XHRkZXB0aFBhY2tpbmc6IFJHQkFEZXB0aFBhY2tpbmcsXG5cblx0XHRcdG1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsXG5cdFx0XHRza2lubmluZzogdXNlU2tpbm5pbmdcblxuXHRcdH0gKTtcblxuXHRcdF9kZXB0aE1hdGVyaWFsc1sgaSBdID0gZGVwdGhNYXRlcmlhbDtcblxuXHRcdC8vXG5cblx0XHR2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBNZXNoRGlzdGFuY2VNYXRlcmlhbCgge1xuXG5cdFx0XHRtb3JwaFRhcmdldHM6IHVzZU1vcnBoaW5nLFxuXHRcdFx0c2tpbm5pbmc6IHVzZVNraW5uaW5nXG5cblx0XHR9ICk7XG5cblx0XHRfZGlzdGFuY2VNYXRlcmlhbHNbIGkgXSA9IGRpc3RhbmNlTWF0ZXJpYWw7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlO1xuXHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy50eXBlID0gUENGU2hhZG93TWFwO1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBsaWdodHMsIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXHRcdGlmICggc2NvcGUuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgJiYgc2NvcGUubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0aWYgKCBsaWdodHMubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly8gVE9ETyBDbGVhbiB1cCAobmVlZGVkIGluIGNhc2Ugb2YgY29udGV4dGxvc3QpXG5cdFx0dmFyIF9nbCA9IF9yZW5kZXJlci5jb250ZXh0O1xuXHRcdHZhciBfc3RhdGUgPSBfcmVuZGVyZXIuc3RhdGU7XG5cblx0XHQvLyBTZXQgR0wgc3RhdGUgZm9yIGRlcHRoIG1hcC5cblx0XHRfc3RhdGUuZGlzYWJsZSggX2dsLkJMRU5EICk7XG5cdFx0X3N0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIDEsIDEsIDEsIDEgKTtcblx0XHRfc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XG5cdFx0X3N0YXRlLnNldFNjaXNzb3JUZXN0KCBmYWxzZSApO1xuXG5cdFx0Ly8gcmVuZGVyIGRlcHRoIG1hcFxuXG5cdFx0dmFyIGZhY2VDb3VudDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBsaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblx0XHRcdHZhciBpc1BvaW50TGlnaHQgPSBsaWdodCAmJiBsaWdodC5pc1BvaW50TGlnaHQ7XG5cblx0XHRcdGlmICggc2hhZG93ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkb3dNYXA6JywgbGlnaHQsICdoYXMgbm8gc2hhZG93LicgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHNoYWRvd0NhbWVyYSA9IHNoYWRvdy5jYW1lcmE7XG5cblx0XHRcdF9zaGFkb3dNYXBTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5taW4oIF9tYXhTaGFkb3dNYXBTaXplICk7XG5cblx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB2cFdpZHRoID0gX3NoYWRvd01hcFNpemUueDtcblx0XHRcdFx0dmFyIHZwSGVpZ2h0ID0gX3NoYWRvd01hcFNpemUueTtcblxuXHRcdFx0XHQvLyBUaGVzZSB2aWV3cG9ydHMgbWFwIGEgY3ViZS1tYXAgb250byBhIDJEIHRleHR1cmUgd2l0aCB0aGVcblx0XHRcdFx0Ly8gZm9sbG93aW5nIG9yaWVudGF0aW9uOlxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyAgeHpYWlxuXHRcdFx0XHQvLyAgIHkgWVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBYIC0gUG9zaXRpdmUgeCBkaXJlY3Rpb25cblx0XHRcdFx0Ly8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uXG5cdFx0XHRcdC8vIFkgLSBQb3NpdGl2ZSB5IGRpcmVjdGlvblxuXHRcdFx0XHQvLyB5IC0gTmVnYXRpdmUgeSBkaXJlY3Rpb25cblx0XHRcdFx0Ly8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXG5cdFx0XHRcdC8vIHogLSBOZWdhdGl2ZSB6IGRpcmVjdGlvblxuXG5cdFx0XHRcdC8vIHBvc2l0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAwIF0uc2V0KCB2cFdpZHRoICogMiwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAxIF0uc2V0KCAwLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gcG9zaXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDIgXS5zZXQoIHZwV2lkdGggKiAzLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gbmVnYXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDMgXS5zZXQoIHZwV2lkdGgsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBwb3NpdGl2ZSBZXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgNCBdLnNldCggdnBXaWR0aCAqIDMsIDAsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFlcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyA1IF0uc2V0KCB2cFdpZHRoLCAwLCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXG5cdFx0XHRcdF9zaGFkb3dNYXBTaXplLnggKj0gNC4wO1xuXHRcdFx0XHRfc2hhZG93TWFwU2l6ZS55ICo9IDIuMDtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNoYWRvdy5tYXAgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIHBhcnMgPSB7IG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlciwgbWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBmb3JtYXQ6IFJHQkFGb3JtYXQgfTtcblxuXHRcdFx0XHRzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XG5cdFx0XHRcdHNoYWRvdy5tYXAudGV4dHVyZS5uYW1lID0gbGlnaHQubmFtZSArIFwiLnNoYWRvd01hcFwiO1xuXG5cdFx0XHRcdHNoYWRvd0NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cuaXNTcG90TGlnaHRTaGFkb3cgKSB7XG5cblx0XHRcdFx0c2hhZG93LnVwZGF0ZSggbGlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc2hhZG93TWFwID0gc2hhZG93Lm1hcDtcblx0XHRcdHZhciBzaGFkb3dNYXRyaXggPSBzaGFkb3cubWF0cml4O1xuXG5cdFx0XHRfbGlnaHRQb3NpdGlvbldvcmxkLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdHNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cblx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDY7XG5cblx0XHRcdFx0Ly8gZm9yIHBvaW50IGxpZ2h0cyB3ZSBzZXQgdGhlIHNoYWRvdyBtYXRyaXggdG8gYmUgYSB0cmFuc2xhdGlvbi1vbmx5IG1hdHJpeFxuXHRcdFx0XHQvLyBlcXVhbCB0byBpbnZlcnNlIG9mIHRoZSBsaWdodCdzIHBvc2l0aW9uXG5cblx0XHRcdFx0c2hhZG93TWF0cml4Lm1ha2VUcmFuc2xhdGlvbiggLSBfbGlnaHRQb3NpdGlvbldvcmxkLngsIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC55LCAtIF9saWdodFBvc2l0aW9uV29ybGQueiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDE7XG5cblx0XHRcdFx0X2xvb2tUYXJnZXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRcdFx0Ly8gY29tcHV0ZSBzaGFkb3cgbWF0cml4XG5cblx0XHRcdFx0c2hhZG93TWF0cml4LnNldChcblx0XHRcdFx0XHQwLjUsIDAuMCwgMC4wLCAwLjUsXG5cdFx0XHRcdFx0MC4wLCAwLjUsIDAuMCwgMC41LFxuXHRcdFx0XHRcdDAuMCwgMC4wLCAwLjUsIDAuNSxcblx0XHRcdFx0XHQwLjAsIDAuMCwgMC4wLCAxLjBcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0XHRcdHNoYWRvd01hdHJpeC5tdWx0aXBseSggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvd01hcCApO1xuXHRcdFx0X3JlbmRlcmVyLmNsZWFyKCk7XG5cblx0XHRcdC8vIHJlbmRlciBzaGFkb3cgbWFwIGZvciBlYWNoIGN1YmUgZmFjZSAoaWYgb21uaS1kaXJlY3Rpb25hbCkgb3Jcblx0XHRcdC8vIHJ1biBhIHNpbmdsZSBwYXNzIGlmIG5vdFxuXG5cdFx0XHRmb3IgKCB2YXIgZmFjZSA9IDA7IGZhY2UgPCBmYWNlQ291bnQ7IGZhY2UgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0XHRfbG9va1RhcmdldC5jb3B5KCBzaGFkb3dDYW1lcmEucG9zaXRpb24gKTtcblx0XHRcdFx0XHRfbG9va1RhcmdldC5hZGQoIGN1YmVEaXJlY3Rpb25zWyBmYWNlIF0gKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXAuY29weSggY3ViZVVwc1sgZmFjZSBdICk7XG5cdFx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdFx0XHRcdHZhciB2cERpbWVuc2lvbnMgPSBjdWJlMkRWaWV3UG9ydHNbIGZhY2UgXTtcblx0XHRcdFx0XHRfc3RhdGUudmlld3BvcnQoIHZwRGltZW5zaW9ucyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtXG5cblx0XHRcdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdFx0X2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHQvLyBzZXQgb2JqZWN0IG1hdHJpY2VzICYgZnJ1c3R1bSBjdWxsaW5nXG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzY29wZS5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBsaWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYU5lYXIsIHNoYWRvd0NhbWVyYUZhciApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdHZhciByZXN1bHQgPSBudWxsO1xuXG5cdFx0dmFyIG1hdGVyaWFsVmFyaWFudHMgPSBfZGVwdGhNYXRlcmlhbHM7XG5cdFx0dmFyIGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURlcHRoTWF0ZXJpYWw7XG5cblx0XHRpZiAoIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0bWF0ZXJpYWxWYXJpYW50cyA9IF9kaXN0YW5jZU1hdGVyaWFscztcblx0XHRcdGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoICEgY3VzdG9tTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHZhciB1c2VNb3JwaGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR1c2VNb3JwaGluZyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aCA+IDA7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Jywgb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVzZVNraW5uaW5nID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmc7XG5cblx0XHRcdHZhciB2YXJpYW50SW5kZXggPSAwO1xuXG5cdFx0XHRpZiAoIHVzZU1vcnBoaW5nICkgdmFyaWFudEluZGV4IHw9IF9Nb3JwaGluZ0ZsYWc7XG5cdFx0XHRpZiAoIHVzZVNraW5uaW5nICkgdmFyaWFudEluZGV4IHw9IF9Ta2lubmluZ0ZsYWc7XG5cblx0XHRcdHJlc3VsdCA9IG1hdGVyaWFsVmFyaWFudHNbIHZhcmlhbnRJbmRleCBdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVzdWx0ID0gY3VzdG9tTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoIF9yZW5kZXJlci5sb2NhbENsaXBwaW5nRW5hYmxlZCAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwU2hhZG93cyA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdC8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIGEgdW5pcXVlIG1hdGVyaWFsIGluc3RhbmNlIHJlZmxlY3RpbmcgdGhlXG5cdFx0XHQvLyBhcHByb3ByaWF0ZSBzdGF0ZVxuXG5cdFx0XHR2YXIga2V5QSA9IHJlc3VsdC51dWlkLCBrZXlCID0gbWF0ZXJpYWwudXVpZDtcblxuXHRcdFx0dmFyIG1hdGVyaWFsc0ZvclZhcmlhbnQgPSBfbWF0ZXJpYWxDYWNoZVsga2V5QSBdO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsc0ZvclZhcmlhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50ID0ge307XG5cdFx0XHRcdF9tYXRlcmlhbENhY2hlWyBrZXlBIF0gPSBtYXRlcmlhbHNGb3JWYXJpYW50O1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBjYWNoZWRNYXRlcmlhbCA9IG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXTtcblxuXHRcdFx0aWYgKCBjYWNoZWRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNhY2hlZE1hdGVyaWFsID0gcmVzdWx0LmNsb25lKCk7XG5cdFx0XHRcdG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXSA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0cmVzdWx0LnZpc2libGUgPSBtYXRlcmlhbC52aXNpYmxlO1xuXHRcdHJlc3VsdC53aXJlZnJhbWUgPSBtYXRlcmlhbC53aXJlZnJhbWU7XG5cblx0XHRyZXN1bHQuc2lkZSA9ICggbWF0ZXJpYWwuc2hhZG93U2lkZSAhPSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogc2hhZG93U2lkZVsgbWF0ZXJpYWwuc2lkZSBdO1xuXG5cdFx0cmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XG5cdFx0cmVzdWx0LmNsaXBwaW5nUGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXM7XG5cdFx0cmVzdWx0LmNsaXBJbnRlcnNlY3Rpb24gPSBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0cmVzdWx0LndpcmVmcmFtZUxpbmV3aWR0aCA9IG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRyZXN1bHQubGluZXdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0aWYgKCBpc1BvaW50TGlnaHQgJiYgcmVzdWx0LmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlc3VsdC5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KCBsaWdodFBvc2l0aW9uV29ybGQgKTtcblx0XHRcdHJlc3VsdC5uZWFyRGlzdGFuY2UgPSBzaGFkb3dDYW1lcmFOZWFyO1xuXHRcdFx0cmVzdWx0LmZhckRpc3RhbmNlID0gc2hhZG93Q2FtZXJhRmFyO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdHZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgJiYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzICkgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgJiYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkgKSB7XG5cblx0XHRcdFx0b2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBfb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHR2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdGZvciAoIHZhciBrID0gMCwga2wgPSBncm91cHMubGVuZ3RoOyBrIDwga2w7IGsgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgayBdO1xuXHRcdFx0XHRcdFx0dmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBncm91cE1hdGVyaWFsLCBpc1BvaW50TGlnaHQsIF9saWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYS5uZWFyLCBzaGFkb3dDYW1lcmEuZmFyICk7XG5cdFx0XHRcdFx0XHRcdF9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgX2xpZ2h0UG9zaXRpb25Xb3JsZCwgc2hhZG93Q2FtZXJhLm5lYXIsIHNoYWRvd0NhbWVyYS5mYXIgKTtcblx0XHRcdFx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIG51bGwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlck9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMU2hhZG93TWFwIH07XG4iLCIvKipcclxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cclxuICovXHJcblxyXG5pbXBvcnQgeyBOb3RFcXVhbERlcHRoLCBHcmVhdGVyRGVwdGgsIEdyZWF0ZXJFcXVhbERlcHRoLCBFcXVhbERlcHRoLCBMZXNzRXF1YWxEZXB0aCwgTGVzc0RlcHRoLCBBbHdheXNEZXB0aCwgTmV2ZXJEZXB0aCwgQ3VsbEZhY2VGcm9udCwgQ3VsbEZhY2VCYWNrLCBDdWxsRmFjZU5vbmUsIEN1c3RvbUJsZW5kaW5nLCBNdWx0aXBseUJsZW5kaW5nLCBTdWJ0cmFjdGl2ZUJsZW5kaW5nLCBBZGRpdGl2ZUJsZW5kaW5nLCBOb0JsZW5kaW5nLCBOb3JtYWxCbGVuZGluZywgRG91YmxlU2lkZSwgQmFja1NpZGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuXHJcbmZ1bmN0aW9uIFdlYkdMU3RhdGUoIGdsLCBleHRlbnNpb25zLCB1dGlscywgY2FwYWJpbGl0aWVzICkge1xyXG5cclxuXHRmdW5jdGlvbiBDb2xvckJ1ZmZlcigpIHtcclxuXHJcblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XHJcblxyXG5cdFx0dmFyIGNvbG9yID0gbmV3IFZlY3RvcjQoKTtcclxuXHRcdHZhciBjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcclxuXHRcdHZhciBjdXJyZW50Q29sb3JDbGVhciA9IG5ldyBWZWN0b3I0KCAwLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHJcblx0XHRcdHNldE1hc2s6IGZ1bmN0aW9uICggY29sb3JNYXNrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvck1hc2sgIT09IGNvbG9yTWFzayAmJiAhIGxvY2tlZCApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5jb2xvck1hc2soIGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzayApO1xyXG5cdFx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IGNvbG9yTWFzaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xyXG5cclxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIHIsIGcsIGIsIGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0ciAqPSBhOyBnICo9IGE7IGIgKj0gYTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb2xvci5zZXQoIHIsIGcsIGIsIGEgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50Q29sb3JDbGVhci5lcXVhbHMoIGNvbG9yICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmNsZWFyQ29sb3IoIHIsIGcsIGIsIGEgKTtcclxuXHRcdFx0XHRcdGN1cnJlbnRDb2xvckNsZWFyLmNvcHkoIGNvbG9yICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuc2V0KCAtIDEsIDAsIDAsIDAgKTsgLy8gc2V0IHRvIGludmFsaWQgc3RhdGVcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIERlcHRoQnVmZmVyKCkge1xyXG5cclxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHR2YXIgY3VycmVudERlcHRoTWFzayA9IG51bGw7XHJcblx0XHR2YXIgY3VycmVudERlcHRoRnVuYyA9IG51bGw7XHJcblx0XHR2YXIgY3VycmVudERlcHRoQ2xlYXIgPSBudWxsO1xyXG5cclxuXHRcdHJldHVybiB7XHJcblxyXG5cdFx0XHRzZXRUZXN0OiBmdW5jdGlvbiAoIGRlcHRoVGVzdCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBkZXB0aFRlc3QgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0ZGlzYWJsZSggZ2wuREVQVEhfVEVTVCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBkZXB0aE1hc2sgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoTWFzayAhPT0gZGVwdGhNYXNrICYmICEgbG9ja2VkICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmRlcHRoTWFzayggZGVwdGhNYXNrICk7XHJcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gZGVwdGhNYXNrO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBkZXB0aEZ1bmMgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoRnVuYyAhPT0gZGVwdGhGdW5jICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggZGVwdGhGdW5jICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c3dpdGNoICggZGVwdGhGdW5jICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjYXNlIE5ldmVyRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5ORVZFUiApO1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5BTFdBWVMgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjYXNlIExlc3NEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFU1MgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjYXNlIExlc3NFcXVhbERlcHRoOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBFcXVhbERlcHRoOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuRVFVQUwgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjYXNlIEdyZWF0ZXJFcXVhbERlcHRoOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuR0VRVUFMICk7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBHcmVhdGVyRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5HUkVBVEVSICk7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBOb3RFcXVhbERlcHRoOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTk9URVFVQUwgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGN1cnJlbnREZXB0aEZ1bmMgPSBkZXB0aEZ1bmM7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcclxuXHJcblx0XHRcdFx0bG9ja2VkID0gbG9jaztcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCBkZXB0aCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhDbGVhciAhPT0gZGVwdGggKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY2xlYXJEZXB0aCggZGVwdGggKTtcclxuXHRcdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gZGVwdGg7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0Y3VycmVudERlcHRoTWFzayA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudERlcHRoQ2xlYXIgPSBudWxsO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHtcclxuXHJcblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XHJcblxyXG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsTWFzayA9IG51bGw7XHJcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDtcclxuXHRcdHZhciBjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7XHJcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7XHJcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDtcclxuXHRcdHZhciBjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDtcclxuXHRcdHZhciBjdXJyZW50U3RlbmNpbFpQYXNzID0gbnVsbDtcclxuXHRcdHZhciBjdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cclxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBzdGVuY2lsVGVzdCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBzdGVuY2lsVGVzdCApIHtcclxuXHJcblx0XHRcdFx0XHRlbmFibGUoIGdsLlNURU5DSUxfVEVTVCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGRpc2FibGUoIGdsLlNURU5DSUxfVEVTVCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBzdGVuY2lsTWFzayApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbE1hc2sgIT09IHN0ZW5jaWxNYXNrICYmICEgbG9ja2VkICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxNYXNrKCBzdGVuY2lsTWFzayApO1xyXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxNYXNrID0gc3RlbmNpbE1hc2s7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRzZXRGdW5jOiBmdW5jdGlvbiAoIHN0ZW5jaWxGdW5jLCBzdGVuY2lsUmVmLCBzdGVuY2lsTWFzayApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8XHJcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFJlZiBcdCE9PSBzdGVuY2lsUmVmIFx0fHxcclxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgIT09IHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxGdW5jKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKTtcclxuXHJcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBzdGVuY2lsRnVuYztcclxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gc3RlbmNpbFJlZjtcclxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBzdGVuY2lsTWFzaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldE9wOiBmdW5jdGlvbiAoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZhaWxcdCAhPT0gc3RlbmNpbEZhaWwgXHR8fFxyXG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxaRmFpbCAhPT0gc3RlbmNpbFpGYWlsIHx8XHJcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpQYXNzICE9PSBzdGVuY2lsWlBhc3MgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuc3RlbmNpbE9wKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKTtcclxuXHJcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZhaWwgPSBzdGVuY2lsRmFpbDtcclxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBzdGVuY2lsWkZhaWw7XHJcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gc3RlbmNpbFpQYXNzO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XHJcblxyXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggc3RlbmNpbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbENsZWFyICE9PSBzdGVuY2lsICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmNsZWFyU3RlbmNpbCggc3RlbmNpbCApO1xyXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxDbGVhciA9IHN0ZW5jaWw7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcclxuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDtcclxuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDtcclxuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0dmFyIGNvbG9yQnVmZmVyID0gbmV3IENvbG9yQnVmZmVyKCk7XHJcblx0dmFyIGRlcHRoQnVmZmVyID0gbmV3IERlcHRoQnVmZmVyKCk7XHJcblx0dmFyIHN0ZW5jaWxCdWZmZXIgPSBuZXcgU3RlbmNpbEJ1ZmZlcigpO1xyXG5cclxuXHR2YXIgbWF4VmVydGV4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7XHJcblx0dmFyIG5ld0F0dHJpYnV0ZXMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApO1xyXG5cdHZhciBlbmFibGVkQXR0cmlidXRlcyA9IG5ldyBVaW50OEFycmF5KCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzICk7XHJcblx0dmFyIGF0dHJpYnV0ZURpdmlzb3JzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcclxuXHJcblx0dmFyIGVuYWJsZWRDYXBhYmlsaXRpZXMgPSB7fTtcclxuXHJcblx0dmFyIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XHJcblxyXG5cdHZhciBjdXJyZW50UHJvZ3JhbSA9IG51bGw7XHJcblxyXG5cdHZhciBjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xyXG5cdHZhciBjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7XHJcblx0dmFyIGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XHJcblx0dmFyIGN1cnJlbnRCbGVuZERzdCA9IG51bGw7XHJcblx0dmFyIGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsO1xyXG5cdHZhciBjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XHJcblx0dmFyIGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcclxuXHR2YXIgY3VycmVudFByZW11bHRpcGxlZEFscGhhID0gZmFsc2U7XHJcblxyXG5cdHZhciBjdXJyZW50RmxpcFNpZGVkID0gbnVsbDtcclxuXHR2YXIgY3VycmVudEN1bGxGYWNlID0gbnVsbDtcclxuXHJcblx0dmFyIGN1cnJlbnRMaW5lV2lkdGggPSBudWxsO1xyXG5cclxuXHR2YXIgY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsO1xyXG5cdHZhciBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gbnVsbDtcclxuXHJcblx0dmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xyXG5cclxuXHR2YXIgbGluZVdpZHRoQXZhaWxhYmxlID0gZmFsc2U7XHJcblx0dmFyIHZlcnNpb24gPSAwO1xyXG5cdHZhciBnbFZlcnNpb24gPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLlZFUlNJT04gKTtcclxuXHJcblx0aWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ1dlYkdMJyApICE9PSAtIDEgKSB7XHJcblxyXG5cdFx0dmVyc2lvbiA9IHBhcnNlRmxvYXQoIC9eV2ViR0xcXCAoWzAtOV0pLy5leGVjKCBnbFZlcnNpb24gKVsgMSBdICk7XHJcblx0XHRsaW5lV2lkdGhBdmFpbGFibGUgPSAoIHZlcnNpb24gPj0gMS4wICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGdsVmVyc2lvbi5pbmRleE9mKCAnT3BlbkdMIEVTJyApICE9PSAtIDEgKSB7XHJcblxyXG5cdFx0dmVyc2lvbiA9IHBhcnNlRmxvYXQoIC9eT3BlbkdMXFwgRVNcXCAoWzAtOV0pLy5leGVjKCBnbFZlcnNpb24gKVsgMSBdICk7XHJcblx0XHRsaW5lV2lkdGhBdmFpbGFibGUgPSAoIHZlcnNpb24gPj0gMi4wICk7XHJcblxyXG5cdH1cclxuXHJcblx0dmFyIGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XHJcblx0dmFyIGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XHJcblxyXG5cdHZhciBjdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCk7XHJcblx0dmFyIGN1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5cdGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoIHR5cGUsIHRhcmdldCwgY291bnQgKSB7XHJcblxyXG5cdFx0dmFyIGRhdGEgPSBuZXcgVWludDhBcnJheSggNCApOyAvLyA0IGlzIHJlcXVpcmVkIHRvIG1hdGNoIGRlZmF1bHQgdW5wYWNrIGFsaWdubWVudCBvZiA0LlxyXG5cdFx0dmFyIHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XHJcblxyXG5cdFx0Z2wuYmluZFRleHR1cmUoIHR5cGUsIHRleHR1cmUgKTtcclxuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xyXG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdHlwZSwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUICk7XHJcblxyXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRnbC50ZXhJbWFnZTJEKCB0YXJnZXQgKyBpLCAwLCBnbC5SR0JBLCAxLCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBkYXRhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdHZhciBlbXB0eVRleHR1cmVzID0ge307XHJcblx0ZW1wdHlUZXh0dXJlc1sgZ2wuVEVYVFVSRV8yRCBdID0gY3JlYXRlVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV8yRCwgMSApO1xyXG5cdGVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfQ1VCRV9NQVAgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwgNiApO1xyXG5cclxuXHQvLyBpbml0XHJcblxyXG5cdGNvbG9yQnVmZmVyLnNldENsZWFyKCAwLCAwLCAwLCAxICk7XHJcblx0ZGVwdGhCdWZmZXIuc2V0Q2xlYXIoIDEgKTtcclxuXHRzdGVuY2lsQnVmZmVyLnNldENsZWFyKCAwICk7XHJcblxyXG5cdGVuYWJsZSggZ2wuREVQVEhfVEVTVCApO1xyXG5cdGRlcHRoQnVmZmVyLnNldEZ1bmMoIExlc3NFcXVhbERlcHRoICk7XHJcblxyXG5cdHNldEZsaXBTaWRlZCggZmFsc2UgKTtcclxuXHRzZXRDdWxsRmFjZSggQ3VsbEZhY2VCYWNrICk7XHJcblx0ZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcclxuXHJcblx0ZW5hYmxlKCBnbC5CTEVORCApO1xyXG5cdHNldEJsZW5kaW5nKCBOb3JtYWxCbGVuZGluZyApO1xyXG5cclxuXHQvL1xyXG5cclxuXHRmdW5jdGlvbiBpbml0QXR0cmlidXRlcygpIHtcclxuXHJcblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBuZXdBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRuZXdBdHRyaWJ1dGVzWyBpIF0gPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIDAgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0bmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xyXG5cclxuXHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkge1xyXG5cclxuXHRcdFx0Z2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoIGF0dHJpYnV0ZSApO1xyXG5cdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gbWVzaFBlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdHZhciBleHRlbnNpb24gPSBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgPyBnbCA6IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcclxuXHJcblx0XHRcdGV4dGVuc2lvblsgY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gJ3ZlcnRleEF0dHJpYkRpdmlzb3InIDogJ3ZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRScgXSggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7XHJcblx0XHRcdGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSA9IG1lc2hQZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCkge1xyXG5cclxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSAhPT0gbDsgKysgaSApIHtcclxuXHJcblx0XHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSAhPT0gbmV3QXR0cmlidXRlc1sgaSBdICkge1xyXG5cclxuXHRcdFx0XHRnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoIGkgKTtcclxuXHRcdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgaSBdID0gMDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZW5hYmxlKCBpZCApIHtcclxuXHJcblx0XHRpZiAoIGVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRnbC5lbmFibGUoIGlkICk7XHJcblx0XHRcdGVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkaXNhYmxlKCBpZCApIHtcclxuXHJcblx0XHRpZiAoIGVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gIT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Z2wuZGlzYWJsZSggaWQgKTtcclxuXHRcdFx0ZW5hYmxlZENhcGFiaWxpdGllc1sgaWQgXSA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKSB7XHJcblxyXG5cdFx0aWYgKCBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSBbXTtcclxuXHJcblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkgfHxcclxuXHRcdFx0ICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8XHJcblx0XHRcdCAgICAgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKSB8fFxyXG5cdFx0XHQgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMnICkgKSB7XHJcblxyXG5cdFx0XHRcdHZhciBmb3JtYXRzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyApO1xyXG5cclxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBmb3JtYXRzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMucHVzaCggZm9ybWF0c1sgaSBdICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cztcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1c2VQcm9ncmFtKCBwcm9ncmFtICkge1xyXG5cclxuXHRcdGlmICggY3VycmVudFByb2dyYW0gIT09IHByb2dyYW0gKSB7XHJcblxyXG5cdFx0XHRnbC51c2VQcm9ncmFtKCBwcm9ncmFtICk7XHJcblxyXG5cdFx0XHRjdXJyZW50UHJvZ3JhbSA9IHByb2dyYW07XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldEJsZW5kaW5nKCBibGVuZGluZywgYmxlbmRFcXVhdGlvbiwgYmxlbmRTcmMsIGJsZW5kRHN0LCBibGVuZEVxdWF0aW9uQWxwaGEsIGJsZW5kU3JjQWxwaGEsIGJsZW5kRHN0QWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcclxuXHJcblx0XHRpZiAoIGJsZW5kaW5nICE9PSBOb0JsZW5kaW5nICkge1xyXG5cclxuXHRcdFx0ZW5hYmxlKCBnbC5CTEVORCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkaXNhYmxlKCBnbC5CTEVORCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGJsZW5kaW5nICE9PSBDdXN0b21CbGVuZGluZyApIHtcclxuXHJcblx0XHRcdGlmICggYmxlbmRpbmcgIT09IGN1cnJlbnRCbGVuZGluZyB8fCBwcmVtdWx0aXBsaWVkQWxwaGEgIT09IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSApIHtcclxuXHJcblx0XHRcdFx0c3dpdGNoICggYmxlbmRpbmcgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBBZGRpdGl2ZUJsZW5kaW5nOlxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUsIGdsLk9ORSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlNSQ19BTFBIQSwgZ2wuT05FICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgU3VidHJhY3RpdmVCbGVuZGluZzpcclxuXHJcblx0XHRcdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5aRVJPLCBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApO1xyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIE11bHRpcGx5QmxlbmRpbmc6XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SLCBnbC5aRVJPLCBnbC5TUkNfQUxQSEEgKTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5aRVJPLCBnbC5TUkNfQ09MT1IgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHJcblx0XHRcdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xyXG5cdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xyXG5cdFx0XHRjdXJyZW50QmxlbmREc3QgPSBudWxsO1xyXG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcclxuXHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xyXG5cdFx0XHRjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGJsZW5kRXF1YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYSB8fCBibGVuZEVxdWF0aW9uO1xyXG5cdFx0XHRibGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYSB8fCBibGVuZFNyYztcclxuXHRcdFx0YmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGEgfHwgYmxlbmREc3Q7XHJcblxyXG5cdFx0XHRpZiAoIGJsZW5kRXF1YXRpb24gIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5kRXF1YXRpb25BbHBoYSAhPT0gY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSApIHtcclxuXHJcblx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCB1dGlscy5jb252ZXJ0KCBibGVuZEVxdWF0aW9uICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kRXF1YXRpb25BbHBoYSApICk7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gYmxlbmRFcXVhdGlvbjtcclxuXHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBibGVuZFNyYyAhPT0gY3VycmVudEJsZW5kU3JjIHx8IGJsZW5kRHN0ICE9PSBjdXJyZW50QmxlbmREc3QgfHwgYmxlbmRTcmNBbHBoYSAhPT0gY3VycmVudEJsZW5kU3JjQWxwaGEgfHwgYmxlbmREc3RBbHBoYSAhPT0gY3VycmVudEJsZW5kRHN0QWxwaGEgKSB7XHJcblxyXG5cdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCB1dGlscy5jb252ZXJ0KCBibGVuZFNyYyApLCB1dGlscy5jb252ZXJ0KCBibGVuZERzdCApLCB1dGlscy5jb252ZXJ0KCBibGVuZFNyY0FscGhhICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kRHN0QWxwaGEgKSApO1xyXG5cclxuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBibGVuZFNyYztcclxuXHRcdFx0XHRjdXJyZW50QmxlbmREc3QgPSBibGVuZERzdDtcclxuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGE7XHJcblx0XHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjdXJyZW50QmxlbmRpbmcgPSBibGVuZGluZztcclxuXHRcdGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IHByZW11bHRpcGxpZWRBbHBoYTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICkge1xyXG5cclxuXHRcdG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGVcclxuXHRcdFx0PyBkaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKVxyXG5cdFx0XHQ6IGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XHJcblxyXG5cdFx0dmFyIGZsaXBTaWRlZCA9ICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKTtcclxuXHRcdGlmICggZnJvbnRGYWNlQ1cgKSBmbGlwU2lkZWQgPSAhIGZsaXBTaWRlZDtcclxuXHJcblx0XHRzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApO1xyXG5cclxuXHRcdCggbWF0ZXJpYWwuYmxlbmRpbmcgPT09IE5vcm1hbEJsZW5kaW5nICYmIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSBmYWxzZSApXHJcblx0XHRcdD8gc2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKVxyXG5cdFx0XHQ6IHNldEJsZW5kaW5nKCBtYXRlcmlhbC5ibGVuZGluZywgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiwgbWF0ZXJpYWwuYmxlbmRTcmMsIG1hdGVyaWFsLmJsZW5kRHN0LCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uQWxwaGEsIG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEsIG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEsIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSApO1xyXG5cclxuXHRcdGRlcHRoQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLmRlcHRoRnVuYyApO1xyXG5cdFx0ZGVwdGhCdWZmZXIuc2V0VGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7XHJcblx0XHRkZXB0aEJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7XHJcblx0XHRjb2xvckJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5jb2xvcldyaXRlICk7XHJcblxyXG5cdFx0c2V0UG9seWdvbk9mZnNldCggbWF0ZXJpYWwucG9seWdvbk9mZnNldCwgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciwgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0ZnVuY3Rpb24gc2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50RmxpcFNpZGVkICE9PSBmbGlwU2lkZWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGZsaXBTaWRlZCApIHtcclxuXHJcblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DVyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DQ1cgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGN1cnJlbnRGbGlwU2lkZWQgPSBmbGlwU2lkZWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldEN1bGxGYWNlKCBjdWxsRmFjZSApIHtcclxuXHJcblx0XHRpZiAoIGN1bGxGYWNlICE9PSBDdWxsRmFjZU5vbmUgKSB7XHJcblxyXG5cdFx0XHRlbmFibGUoIGdsLkNVTExfRkFDRSApO1xyXG5cclxuXHRcdFx0aWYgKCBjdWxsRmFjZSAhPT0gY3VycmVudEN1bGxGYWNlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUJhY2sgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkJBQ0sgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlRnJvbnQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkZST05UICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkZST05UX0FORF9CQUNLICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGN1cnJlbnRDdWxsRmFjZSA9IGN1bGxGYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldExpbmVXaWR0aCggd2lkdGggKSB7XHJcblxyXG5cdFx0aWYgKCB3aWR0aCAhPT0gY3VycmVudExpbmVXaWR0aCApIHtcclxuXHJcblx0XHRcdGlmICggbGluZVdpZHRoQXZhaWxhYmxlICkgZ2wubGluZVdpZHRoKCB3aWR0aCApO1xyXG5cclxuXHRcdFx0Y3VycmVudExpbmVXaWR0aCA9IHdpZHRoO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRQb2x5Z29uT2Zmc2V0KCBwb2x5Z29uT2Zmc2V0LCBmYWN0b3IsIHVuaXRzICkge1xyXG5cclxuXHRcdGlmICggcG9seWdvbk9mZnNldCApIHtcclxuXHJcblx0XHRcdGVuYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xyXG5cclxuXHRcdFx0aWYgKCBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciAhPT0gZmFjdG9yIHx8IGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgIT09IHVuaXRzICkge1xyXG5cclxuXHRcdFx0XHRnbC5wb2x5Z29uT2Zmc2V0KCBmYWN0b3IsIHVuaXRzICk7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yO1xyXG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSB1bml0cztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGlzYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRTY2lzc29yVGVzdCggc2Npc3NvclRlc3QgKSB7XHJcblxyXG5cdFx0aWYgKCBzY2lzc29yVGVzdCApIHtcclxuXHJcblx0XHRcdGVuYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvLyB0ZXh0dXJlXHJcblxyXG5cdGZ1bmN0aW9uIGFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApIHtcclxuXHJcblx0XHRpZiAoIHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkgd2ViZ2xTbG90ID0gZ2wuVEVYVFVSRTAgKyBtYXhUZXh0dXJlcyAtIDE7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdlYmdsU2xvdCApIHtcclxuXHJcblx0XHRcdGdsLmFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApO1xyXG5cdFx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSB3ZWJnbFNsb3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSApIHtcclxuXHJcblx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGFjdGl2ZVRleHR1cmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGJvdW5kVGV4dHVyZSA9IGN1cnJlbnRCb3VuZFRleHR1cmVzWyBjdXJyZW50VGV4dHVyZVNsb3QgXTtcclxuXHJcblx0XHRpZiAoIGJvdW5kVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Ym91bmRUZXh0dXJlID0geyB0eXBlOiB1bmRlZmluZWQsIHRleHR1cmU6IHVuZGVmaW5lZCB9O1xyXG5cdFx0XHRjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF0gPSBib3VuZFRleHR1cmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYm91bmRUZXh0dXJlLnR5cGUgIT09IHdlYmdsVHlwZSB8fCBib3VuZFRleHR1cmUudGV4dHVyZSAhPT0gd2ViZ2xUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Z2wuYmluZFRleHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlIHx8IGVtcHR5VGV4dHVyZXNbIHdlYmdsVHlwZSBdICk7XHJcblxyXG5cdFx0XHRib3VuZFRleHR1cmUudHlwZSA9IHdlYmdsVHlwZTtcclxuXHRcdFx0Ym91bmRUZXh0dXJlLnRleHR1cmUgPSB3ZWJnbFRleHR1cmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNvbXByZXNzZWRUZXhJbWFnZTJEKCkge1xyXG5cclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRnbC5jb21wcmVzc2VkVGV4SW1hZ2UyRC5hcHBseSggZ2wsIGFyZ3VtZW50cyApO1xyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHRleEltYWdlMkQoKSB7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGdsLnRleEltYWdlMkQuYXBwbHkoIGdsLCBhcmd1bWVudHMgKTtcclxuXHJcblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvL1xyXG5cclxuXHRmdW5jdGlvbiBzY2lzc29yKCBzY2lzc29yICkge1xyXG5cclxuXHRcdGlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Z2wuc2Npc3Nvciggc2Npc3Nvci54LCBzY2lzc29yLnksIHNjaXNzb3Iueiwgc2Npc3Nvci53ICk7XHJcblx0XHRcdGN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdmlld3BvcnQoIHZpZXdwb3J0ICkge1xyXG5cclxuXHRcdGlmICggY3VycmVudFZpZXdwb3J0LmVxdWFscyggdmlld3BvcnQgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRnbC52aWV3cG9ydCggdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQueiwgdmlld3BvcnQudyApO1xyXG5cdFx0XHRjdXJyZW50Vmlld3BvcnQuY29weSggdmlld3BvcnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0ZnVuY3Rpb24gcmVzZXQoKSB7XHJcblxyXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdID09PSAxICkge1xyXG5cclxuXHRcdFx0XHRnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoIGkgKTtcclxuXHRcdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgaSBdID0gMDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZW5hYmxlZENhcGFiaWxpdGllcyA9IHt9O1xyXG5cclxuXHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XHJcblxyXG5cdFx0Y3VycmVudFRleHR1cmVTbG90ID0gbnVsbDtcclxuXHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XHJcblxyXG5cdFx0Y3VycmVudFByb2dyYW0gPSBudWxsO1xyXG5cclxuXHRcdGN1cnJlbnRCbGVuZGluZyA9IG51bGw7XHJcblxyXG5cdFx0Y3VycmVudEZsaXBTaWRlZCA9IG51bGw7XHJcblx0XHRjdXJyZW50Q3VsbEZhY2UgPSBudWxsO1xyXG5cclxuXHRcdGNvbG9yQnVmZmVyLnJlc2V0KCk7XHJcblx0XHRkZXB0aEJ1ZmZlci5yZXNldCgpO1xyXG5cdFx0c3RlbmNpbEJ1ZmZlci5yZXNldCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblxyXG5cdFx0YnVmZmVyczoge1xyXG5cdFx0XHRjb2xvcjogY29sb3JCdWZmZXIsXHJcblx0XHRcdGRlcHRoOiBkZXB0aEJ1ZmZlcixcclxuXHRcdFx0c3RlbmNpbDogc3RlbmNpbEJ1ZmZlclxyXG5cdFx0fSxcclxuXHJcblx0XHRpbml0QXR0cmlidXRlczogaW5pdEF0dHJpYnV0ZXMsXHJcblx0XHRlbmFibGVBdHRyaWJ1dGU6IGVuYWJsZUF0dHJpYnV0ZSxcclxuXHRcdGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3I6IGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IsXHJcblx0XHRkaXNhYmxlVW51c2VkQXR0cmlidXRlczogZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMsXHJcblx0XHRlbmFibGU6IGVuYWJsZSxcclxuXHRcdGRpc2FibGU6IGRpc2FibGUsXHJcblx0XHRnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHM6IGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyxcclxuXHJcblx0XHR1c2VQcm9ncmFtOiB1c2VQcm9ncmFtLFxyXG5cclxuXHRcdHNldEJsZW5kaW5nOiBzZXRCbGVuZGluZyxcclxuXHRcdHNldE1hdGVyaWFsOiBzZXRNYXRlcmlhbCxcclxuXHJcblx0XHRzZXRGbGlwU2lkZWQ6IHNldEZsaXBTaWRlZCxcclxuXHRcdHNldEN1bGxGYWNlOiBzZXRDdWxsRmFjZSxcclxuXHJcblx0XHRzZXRMaW5lV2lkdGg6IHNldExpbmVXaWR0aCxcclxuXHRcdHNldFBvbHlnb25PZmZzZXQ6IHNldFBvbHlnb25PZmZzZXQsXHJcblxyXG5cdFx0c2V0U2Npc3NvclRlc3Q6IHNldFNjaXNzb3JUZXN0LFxyXG5cclxuXHRcdGFjdGl2ZVRleHR1cmU6IGFjdGl2ZVRleHR1cmUsXHJcblx0XHRiaW5kVGV4dHVyZTogYmluZFRleHR1cmUsXHJcblx0XHRjb21wcmVzc2VkVGV4SW1hZ2UyRDogY29tcHJlc3NlZFRleEltYWdlMkQsXHJcblx0XHR0ZXhJbWFnZTJEOiB0ZXhJbWFnZTJELFxyXG5cclxuXHRcdHNjaXNzb3I6IHNjaXNzb3IsXHJcblx0XHR2aWV3cG9ydDogdmlld3BvcnQsXHJcblxyXG5cdFx0cmVzZXQ6IHJlc2V0XHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xTdGF0ZSB9O1xyXG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgTGluZWFyRmlsdGVyLCBOZWFyZXN0RmlsdGVyLCBSR0JGb3JtYXQsIFJHQkFGb3JtYXQsIERlcHRoRm9ybWF0LCBEZXB0aFN0ZW5jaWxGb3JtYXQsIFVuc2lnbmVkU2hvcnRUeXBlLCBVbnNpZ25lZEludFR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgRmxvYXRUeXBlLCBIYWxmRmxvYXRUeXBlLCBDbGFtcFRvRWRnZVdyYXBwaW5nLCBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyLCBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBfTWF0aCB9IGZyb20gJy4uLy4uL21hdGgvTWF0aC5qcyc7XG5cbmZ1bmN0aW9uIFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgdXRpbHMsIGluZm8gKSB7XG5cblx0dmFyIF92aWRlb1RleHR1cmVzID0ge307XG5cdHZhciBfY2FudmFzO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gY2xhbXBUb01heFNpemUoIGltYWdlLCBtYXhTaXplICkge1xuXG5cdFx0aWYgKCBpbWFnZS53aWR0aCA+IG1heFNpemUgfHwgaW1hZ2UuaGVpZ2h0ID4gbWF4U2l6ZSApIHtcblxuXHRcdFx0aWYgKCAnZGF0YScgaW4gaW1hZ2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gV2FybmluZzogU2NhbGluZyB0aHJvdWdoIHRoZSBjYW52YXMgd2lsbCBvbmx5IHdvcmsgd2l0aCBpbWFnZXMgdGhhdCB1c2Vcblx0XHRcdC8vIHByZW11bHRpcGxpZWQgYWxwaGEuXG5cblx0XHRcdHZhciBzY2FsZSA9IG1heFNpemUgLyBNYXRoLm1heCggaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdFx0XHRjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKCBpbWFnZS53aWR0aCAqIHNjYWxlICk7XG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vciggaW1hZ2UuaGVpZ2h0ICogc2NhbGUgKTtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQgKTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaXMgdG9vIGJpZyAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuIFJlc2l6ZWQgdG8gJyArIGNhbnZhcy53aWR0aCArICd4JyArIGNhbnZhcy5oZWlnaHQgKTtcblxuXHRcdFx0cmV0dXJuIGNhbnZhcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaXNQb3dlck9mVHdvKCBpbWFnZSApIHtcblxuXHRcdHJldHVybiBfTWF0aC5pc1Bvd2VyT2ZUd28oIGltYWdlLndpZHRoICkgJiYgX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS5oZWlnaHQgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gbWFrZVBvd2VyT2ZUd28oIGltYWdlICkge1xuXG5cdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwICkge1xuXG5cdFx0XHRpZiAoIF9jYW52YXMgPT09IHVuZGVmaW5lZCApIF9jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblxuXHRcdFx0X2NhbnZhcy53aWR0aCA9IF9NYXRoLmZsb29yUG93ZXJPZlR3byggaW1hZ2Uud2lkdGggKTtcblx0XHRcdF9jYW52YXMuaGVpZ2h0ID0gX01hdGguZmxvb3JQb3dlck9mVHdvKCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBfY2FudmFzLmdldENvbnRleHQoICcyZCcgKTtcblx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgX2NhbnZhcy53aWR0aCwgX2NhbnZhcy5oZWlnaHQgKTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaXMgbm90IHBvd2VyIG9mIHR3byAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuIFJlc2l6ZWQgdG8gJyArIF9jYW52YXMud2lkdGggKyAneCcgKyBfY2FudmFzLmhlaWdodCApO1xuXG5cdFx0XHRyZXR1cm4gX2NhbnZhcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdGV4dHVyZU5lZWRzUG93ZXJPZlR3byggdGV4dHVyZSApIHtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgfHxcblx0XHRcdCggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzUG93ZXJPZlR3byApIHtcblxuXHRcdHJldHVybiB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBpc1Bvd2VyT2ZUd28gJiZcblx0XHRcdHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXI7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlTWlwbWFwKCB0YXJnZXQsIHRleHR1cmUsIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApO1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdC8vIE5vdGU6IE1hdGgubG9nKCB4ICkgKiBNYXRoLkxPRzJFIHVzZWQgaW5zdGVhZCBvZiBNYXRoLmxvZzIoIHggKSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFMTFcblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gTWF0aC5sb2coIE1hdGgubWF4KCB3aWR0aCwgaGVpZ2h0ICkgKSAqIE1hdGguTE9HMkU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldEludGVybmFsRm9ybWF0KCBnbEZvcm1hdCwgZ2xUeXBlICkge1xuXG5cdFx0aWYgKCAhIGNhcGFiaWxpdGllcy5pc1dlYkdMMiApIHJldHVybiBnbEZvcm1hdDtcblxuXHRcdGlmICggZ2xGb3JtYXQgPT09IF9nbC5SR0IgKSB7XG5cblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuRkxPQVQgKSByZXR1cm4gX2dsLlJHQjMyRjtcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuSEFMRl9GTE9BVCApIHJldHVybiBfZ2wuUkdCMTZGO1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9CWVRFICkgcmV0dXJuIF9nbC5SR0I4O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gX2dsLlJHQkEgKSB7XG5cblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuRkxPQVQgKSByZXR1cm4gX2dsLlJHQkEzMkY7XG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLkhBTEZfRkxPQVQgKSByZXR1cm4gX2dsLlJHQkExNkY7XG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0JZVEUgKSByZXR1cm4gX2dsLlJHQkE4O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdsRm9ybWF0O1xuXG5cdH1cblxuXHQvLyBGYWxsYmFjayBmaWx0ZXJzIGZvciBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuXG5cdGZ1bmN0aW9uIGZpbHRlckZhbGxiYWNrKCBmICkge1xuXG5cdFx0aWYgKCBmID09PSBOZWFyZXN0RmlsdGVyIHx8IGYgPT09IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyIHx8IGYgPT09IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgKSB7XG5cblx0XHRcdHJldHVybiBfZ2wuTkVBUkVTVDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBfZ2wuTElORUFSO1xuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBldmVudC50YXJnZXQ7XG5cblx0XHR0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHtcblxuXHRcdFx0ZGVsZXRlIF92aWRlb1RleHR1cmVzWyB0ZXh0dXJlLmlkIF07XG5cblx0XHR9XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25SZW5kZXJUYXJnZXREaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXQgPSBldmVudC50YXJnZXQ7XG5cblx0XHRyZW5kZXJUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTtcblxuXHRcdGRlYWxsb2NhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0aW5mby5tZW1vcnkudGV4dHVyZXMgLS07XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKSB7XG5cblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmltYWdlICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKSB7XG5cblx0XHRcdC8vIGN1YmUgdGV4dHVyZVxuXG5cdFx0XHRfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gMkQgdGV4dHVyZVxuXG5cdFx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIGFsbCB3ZWJnbCBwcm9wZXJ0aWVzXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cblx0XHRpZiAoICEgcmVuZGVyVGFyZ2V0ICkgcmV0dXJuO1xuXG5cdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5kaXNwb3NlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICk7XG5cblx0XHR9XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggcmVuZGVyVGFyZ2V0ICk7XG5cblx0fVxuXG5cdC8vXG5cblxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB1cGRhdGVWaWRlb1RleHR1cmUoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcblxuXHRcdFx0dmFyIGltYWdlID0gdGV4dHVyZS5pbWFnZTtcblxuXHRcdFx0aWYgKCBpbWFnZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCcgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW1hZ2UuY29tcGxldGUgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIGluY29tcGxldGUnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UubGVuZ3RoID09PSA2ICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24gKSB7XG5cblx0XHRcdFx0aWYgKCAhIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRcdFx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyArKztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKTtcblxuXHRcdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZICk7XG5cblx0XHRcdFx0dmFyIGlzQ29tcHJlc3NlZCA9ICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgKTtcblx0XHRcdFx0dmFyIGlzRGF0YVRleHR1cmUgPSAoIHRleHR1cmUuaW1hZ2VbIDAgXSAmJiB0ZXh0dXJlLmltYWdlWyAwIF0uaXNEYXRhVGV4dHVyZSApO1xuXG5cdFx0XHRcdHZhciBjdWJlSW1hZ2UgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCAmJiAhIGlzRGF0YVRleHR1cmUgKSB7XG5cblx0XHRcdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gY2xhbXBUb01heFNpemUoIHRleHR1cmUuaW1hZ2VbIGkgXSwgY2FwYWJpbGl0aWVzLm1heEN1YmVtYXBTaXplICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjdWJlSW1hZ2VbIGkgXSA9IGlzRGF0YVRleHR1cmUgPyB0ZXh0dXJlLmltYWdlWyBpIF0uaW1hZ2UgOiB0ZXh0dXJlLmltYWdlWyBpIF07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBpbWFnZSA9IGN1YmVJbWFnZVsgMCBdLFxuXHRcdFx0XHRcdGlzUG93ZXJPZlR3b0ltYWdlID0gaXNQb3dlck9mVHdvKCBpbWFnZSApLFxuXHRcdFx0XHRcdGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQgKSxcblx0XHRcdFx0XHRnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKSxcblx0XHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIGdsRm9ybWF0LCBnbFR5cGUgKTtcblxuXHRcdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICggISBpc0NvbXByZXNzZWQgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbIGkgXSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR2YXIgbWlwbWFwLCBtaXBtYXBzID0gY3ViZUltYWdlWyBpIF0ubWlwbWFwcztcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IG1pcG1hcHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaiBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3JtYXQgIT09IFJHQkZvcm1hdCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggc3RhdGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZiggZ2xGb3JtYXQgKSA+IC0gMSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKScgKTtcblxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGosIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKSApIHtcblxuXHRcdFx0XHRcdC8vIFdlIGFzc3VtZSBpbWFnZXMgZm9yIGN1YmUgbWFwIGhhdmUgdGhlIHNhbWUgc2l6ZS5cblx0XHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRleHR1cmVUeXBlLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgdXRpbHMuY29udmVydCggdGV4dHVyZS53cmFwUyApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfVCwgdXRpbHMuY29udmVydCggdGV4dHVyZS53cmFwVCApICk7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgdXRpbHMuY29udmVydCggdGV4dHVyZS5tYWdGaWx0ZXIgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgX2dsLkNMQU1QX1RPX0VER0UgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9ULCBfZ2wuQ0xBTVBfVE9fRURHRSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUud3JhcFMgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1hZ0ZpbHRlciApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01JTl9GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHRcdGlmICggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUubWluRmlsdGVyIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuTmVhcmVzdEZpbHRlciBvciBUSFJFRS5MaW5lYXJGaWx0ZXIuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApID09PSBudWxsICkgcmV0dXJuO1xuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgfHwgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKSApID09PSBudWxsICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUuYW5pc290cm9weSA+IDEgfHwgcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX2N1cnJlbnRBbmlzb3Ryb3B5ICkge1xuXG5cdFx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJmKCB0ZXh0dXJlVHlwZSwgZXh0ZW5zaW9uLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCBNYXRoLm1pbiggdGV4dHVyZS5hbmlzb3Ryb3B5LCBjYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpICkgKTtcblx0XHRcdFx0cHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX2N1cnJlbnRBbmlzb3Ryb3B5ID0gdGV4dHVyZS5hbmlzb3Ryb3B5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9IHRydWU7XG5cblx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdFx0aW5mby5tZW1vcnkudGV4dHVyZXMgKys7XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgdGV4dHVyZS5mbGlwWSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0FMSUdOTUVOVCwgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcblxuXHRcdHZhciBpbWFnZSA9IGNsYW1wVG9NYXhTaXplKCB0ZXh0dXJlLmltYWdlLCBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUgKTtcblxuXHRcdGlmICggdGV4dHVyZU5lZWRzUG93ZXJPZlR3byggdGV4dHVyZSApICYmIGlzUG93ZXJPZlR3byggaW1hZ2UgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGltYWdlID0gbWFrZVBvd2VyT2ZUd28oIGltYWdlICk7XG5cblx0XHR9XG5cblx0XHR2YXIgaXNQb3dlck9mVHdvSW1hZ2UgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICksXG5cdFx0XHRnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUuZm9ybWF0ICksXG5cdFx0XHRnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKSxcblx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCggZ2xGb3JtYXQsIGdsVHlwZSApO1xuXG5cdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApO1xuXG5cdFx0dmFyIG1pcG1hcCwgbWlwbWFwcyA9IHRleHR1cmUubWlwbWFwcztcblxuXHRcdGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gcG9wdWxhdGUgZGVwdGggdGV4dHVyZSB3aXRoIGR1bW15IGRhdGFcblxuXHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQ7XG5cblx0XHRcdGlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgKSB7XG5cblx0XHRcdFx0aWYgKCAhIGNhcGFiaWxpdGllcy5pc1dlYkdMMiApIHRocm93IG5ldyBFcnJvciggJ0Zsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAnICk7XG5cdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMzJGO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSB7XG5cblx0XHRcdFx0Ly8gV2ViR0wgMi4wIHJlcXVpcmVzIHNpZ25lZCBpbnRlcm5hbGZvcm1hdCBmb3IgZ2xUZXhJbWFnZTJEXG5cdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMTY7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgJiYgZ2xJbnRlcm5hbEZvcm1hdCA9PT0gX2dsLkRFUFRIX0NPTVBPTkVOVCApIHtcblxuXHRcdFx0XHQvLyBUaGUgZXJyb3IgSU5WQUxJRF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5IHRleEltYWdlMkQgaWYgZm9ybWF0IGFuZCBpbnRlcm5hbGZvcm1hdCBhcmVcblx0XHRcdFx0Ly8gREVQVEhfQ09NUE9ORU5UIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9TSE9SVCBvciBVTlNJR05FRF9JTlRcblx0XHRcdFx0Ly8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pXG5cdFx0XHRcdGlmICggdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZFNob3J0VHlwZSAmJiB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50VHlwZSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4nICk7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSBVbnNpZ25lZFNob3J0VHlwZTtcblx0XHRcdFx0XHRnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVwdGggc3RlbmNpbCB0ZXh0dXJlcyBuZWVkIHRoZSBERVBUSF9TVEVOQ0lMIGludGVybmFsIGZvcm1hdFxuXHRcdFx0Ly8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pXG5cdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7XG5cblx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9TVEVOQ0lMO1xuXG5cdFx0XHRcdC8vIFRoZSBlcnJvciBJTlZBTElEX09QRVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFsZm9ybWF0IGFyZVxuXHRcdFx0XHQvLyBERVBUSF9TVEVOQ0lMIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9JTlRfMjRfOF9XRUJHTC5cblx0XHRcdFx0Ly8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pXG5cdFx0XHRcdGlmICggdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludDI0OFR5cGUgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRJbnQyNDhUeXBlIGZvciBEZXB0aFN0ZW5jaWxGb3JtYXQgRGVwdGhUZXh0dXJlLicgKTtcblxuXHRcdFx0XHRcdHRleHR1cmUudHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTtcblx0XHRcdFx0XHRnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xuXHRcdFx0Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBtaXBtYXAgbGV2ZWxzXG5cblx0XHRcdGlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aCAtIDE7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3JtYXQgIT09IFJHQkZvcm1hdCApIHtcblxuXHRcdFx0XHRcdGlmICggc3RhdGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZiggZ2xGb3JtYXQgKSA+IC0gMSApIHtcblxuXHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpJyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gcmVndWxhciBUZXh0dXJlIChpbWFnZSwgdmlkZW8sIGNhbnZhcylcblxuXHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xuXHRcdFx0Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBtaXBtYXAgbGV2ZWxzXG5cblx0XHRcdGlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApICkge1xuXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0Ly8gUmVuZGVyIHRhcmdldHNcblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ICk7XG5cdFx0dmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTtcblx0XHR2YXIgZ2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KCBnbEZvcm1hdCwgZ2xUeXBlICk7XG5cdFx0c3RhdGUudGV4SW1hZ2UyRCggdGV4dHVyZVRhcmdldCwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7XG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSwgMCApO1xuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciBpbnRlcm5hbCBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMgYW5kIGJpbmQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgJiYgISByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIF9nbC5ERVBUSF9DT01QT05FTlQxNiwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICkge1xuXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUwsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRklYTUU6IFdlIGRvbid0IHN1cHBvcnQgIWRlcHRoICFzdGVuY2lsXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLlJHQkE0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0ZW5zaW9uKVxuXHRmdW5jdGlvbiBzZXR1cERlcHRoVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKTtcblx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ0RlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQnICk7XG5cblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICYmIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAncmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZScgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwbG9hZCBhbiBlbXB0eSBkZXB0aCB0ZXh0dXJlIHdpdGggZnJhbWVidWZmZXIgc2l6ZVxuXHRcdGlmICggISBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlIHx8XG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fFxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LmhlaWdodDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0c2V0VGV4dHVyZTJEKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR2YXIgd2ViZ2xEZXB0aFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB7XG5cblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQnICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIFNldHVwIEdMIHJlc291cmNlcyBmb3IgYSBub24tdGV4dHVyZSBkZXB0aCBidWZmZXJcblx0ZnVuY3Rpb24gc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPT09IHRydWUgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoICd0YXJnZXQuZGVwdGhUZXh0dXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ3ViZSByZW5kZXIgdGFyZ2V0cycgKTtcblxuXHRcdFx0c2V0dXBEZXB0aFRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG5cdFx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXQgdXAgR0wgcmVzb3VyY2VzIGZvciB0aGUgcmVuZGVyIHRhcmdldFxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTtcblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0dmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID09PSB0cnVlICk7XG5cdFx0dmFyIGlzVGFyZ2V0UG93ZXJPZlR3byA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHQvLyBTZXR1cCBmcmFtZWJ1ZmZlclxuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgY29sb3IgYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0sIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCBudWxsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKTtcblx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJEICk7XG5cblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFXzJELCByZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCBudWxsICk7XG5cblx0XHR9XG5cblx0XHQvLyBTZXR1cCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0c2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblx0XHR2YXIgaXNUYXJnZXRQb3dlck9mVHdvID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKSApIHtcblxuXHRcdFx0dmFyIHRhcmdldCA9IHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA/IF9nbC5URVhUVVJFX0NVQkVfTUFQIDogX2dsLlRFWFRVUkVfMkQ7XG5cdFx0XHR2YXIgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggdGFyZ2V0LCB0ZXh0dXJlLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXQsIG51bGwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlVmlkZW9UZXh0dXJlKCB0ZXh0dXJlICkge1xuXG5cdFx0dmFyIGlkID0gdGV4dHVyZS5pZDtcblx0XHR2YXIgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcblxuXHRcdC8vIENoZWNrIHRoZSBsYXN0IGZyYW1lIHdlIHVwZGF0ZWQgdGhlIFZpZGVvVGV4dHVyZVxuXG5cdFx0aWYgKCBfdmlkZW9UZXh0dXJlc1sgaWQgXSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdF92aWRlb1RleHR1cmVzWyBpZCBdID0gZnJhbWU7XG5cdFx0XHR0ZXh0dXJlLnVwZGF0ZSgpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDtcblx0dGhpcy5zZXRUZXh0dXJlQ3ViZSA9IHNldFRleHR1cmVDdWJlO1xuXHR0aGlzLnNldFRleHR1cmVDdWJlRHluYW1pYyA9IHNldFRleHR1cmVDdWJlRHluYW1pYztcblx0dGhpcy5zZXR1cFJlbmRlclRhcmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0O1xuXHR0aGlzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCA9IHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcDtcblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMVGV4dHVyZXMgfTtcbiIsIi8qKlxuICogQGF1dGhvciB0aGVzcGl0ZSAvIGh0dHA6Ly93d3cudHdpdHRlci5jb20vdGhlc3BpdGVcbiAqL1xuXG5pbXBvcnQgeyBNYXhFcXVhdGlvbiwgTWluRXF1YXRpb24sIFJHQkFfQVNUQ180eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg0X0Zvcm1hdCwgUkdCQV9BU1RDXzV4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDVfRm9ybWF0LCBSR0JBX0FTVENfNng2X0Zvcm1hdCwgUkdCQV9BU1RDXzh4NV9Gb3JtYXQsIFJHQkFfQVNUQ184eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg4X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDVfRm9ybWF0LCBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCwgUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCwgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCwgUkdCX0VUQzFfRm9ybWF0LCBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQsIFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCwgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQsIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDFfRm9ybWF0LCBSR0JfUzNUQ19EWFQxX0Zvcm1hdCwgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciwgT25lTWludXNEc3RDb2xvckZhY3RvciwgRHN0Q29sb3JGYWN0b3IsIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IsIERzdEFscGhhRmFjdG9yLCBPbmVNaW51c1NyY0FscGhhRmFjdG9yLCBTcmNBbHBoYUZhY3RvciwgT25lTWludXNTcmNDb2xvckZhY3RvciwgU3JjQ29sb3JGYWN0b3IsIE9uZUZhY3RvciwgWmVyb0ZhY3RvciwgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24sIFN1YnRyYWN0RXF1YXRpb24sIEFkZEVxdWF0aW9uLCBEZXB0aEZvcm1hdCwgRGVwdGhTdGVuY2lsRm9ybWF0LCBMdW1pbmFuY2VBbHBoYUZvcm1hdCwgTHVtaW5hbmNlRm9ybWF0LCBSR0JBRm9ybWF0LCBSR0JGb3JtYXQsIEFscGhhRm9ybWF0LCBIYWxmRmxvYXRUeXBlLCBGbG9hdFR5cGUsIFVuc2lnbmVkSW50VHlwZSwgSW50VHlwZSwgVW5zaWduZWRTaG9ydFR5cGUsIFNob3J0VHlwZSwgQnl0ZVR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgVW5zaWduZWRTaG9ydDU2NVR5cGUsIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSwgVW5zaWduZWRTaG9ydDQ0NDRUeXBlLCBVbnNpZ25lZEJ5dGVUeXBlLCBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIsIExpbmVhckZpbHRlciwgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciwgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RGaWx0ZXIsIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsIENsYW1wVG9FZGdlV3JhcHBpbmcsIFJlcGVhdFdyYXBwaW5nIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcblxuZnVuY3Rpb24gV2ViR0xVdGlscyggZ2wsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApIHtcblxuXHRmdW5jdGlvbiBjb252ZXJ0KCBwICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdGlmICggcCA9PT0gUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gZ2wuUkVQRUFUO1xuXHRcdGlmICggcCA9PT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHJldHVybiBnbC5DTEFNUF9UT19FREdFO1xuXHRcdGlmICggcCA9PT0gTWlycm9yZWRSZXBlYXRXcmFwcGluZyApIHJldHVybiBnbC5NSVJST1JFRF9SRVBFQVQ7XG5cblx0XHRpZiAoIHAgPT09IE5lYXJlc3RGaWx0ZXIgKSByZXR1cm4gZ2wuTkVBUkVTVDtcblx0XHRpZiAoIHAgPT09IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIGdsLk5FQVJFU1RfTUlQTUFQX05FQVJFU1Q7XG5cdFx0aWYgKCBwID09PSBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyICkgcmV0dXJuIGdsLk5FQVJFU1RfTUlQTUFQX0xJTkVBUjtcblxuXHRcdGlmICggcCA9PT0gTGluZWFyRmlsdGVyICkgcmV0dXJuIGdsLkxJTkVBUjtcblx0XHRpZiAoIHAgPT09IExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIgKSByZXR1cm4gZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUO1xuXHRcdGlmICggcCA9PT0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyICkgcmV0dXJuIGdsLkxJTkVBUl9NSVBNQVBfTElORUFSO1xuXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEJ5dGVUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX0JZVEU7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0NDQ0NFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlRfNF80XzRfNDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9TSE9SVF81XzVfNV8xO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDU2NVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlRfNV82XzU7XG5cblx0XHRpZiAoIHAgPT09IEJ5dGVUeXBlICkgcmV0dXJuIGdsLkJZVEU7XG5cdFx0aWYgKCBwID09PSBTaG9ydFR5cGUgKSByZXR1cm4gZ2wuU0hPUlQ7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0VHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9TSE9SVDtcblx0XHRpZiAoIHAgPT09IEludFR5cGUgKSByZXR1cm4gZ2wuSU5UO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRJbnRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX0lOVDtcblx0XHRpZiAoIHAgPT09IEZsb2F0VHlwZSApIHJldHVybiBnbC5GTE9BVDtcblxuXHRcdGlmICggcCA9PT0gSGFsZkZsb2F0VHlwZSApIHtcblxuXHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSByZXR1cm4gZ2wuSEFMRl9GTE9BVDtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uSEFMRl9GTE9BVF9PRVM7XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IEFscGhhRm9ybWF0ICkgcmV0dXJuIGdsLkFMUEhBO1xuXHRcdGlmICggcCA9PT0gUkdCRm9ybWF0ICkgcmV0dXJuIGdsLlJHQjtcblx0XHRpZiAoIHAgPT09IFJHQkFGb3JtYXQgKSByZXR1cm4gZ2wuUkdCQTtcblx0XHRpZiAoIHAgPT09IEx1bWluYW5jZUZvcm1hdCApIHJldHVybiBnbC5MVU1JTkFOQ0U7XG5cdFx0aWYgKCBwID09PSBMdW1pbmFuY2VBbHBoYUZvcm1hdCApIHJldHVybiBnbC5MVU1JTkFOQ0VfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBEZXB0aEZvcm1hdCApIHJldHVybiBnbC5ERVBUSF9DT01QT05FTlQ7XG5cdFx0aWYgKCBwID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSByZXR1cm4gZ2wuREVQVEhfU1RFTkNJTDtcblxuXHRcdGlmICggcCA9PT0gQWRkRXF1YXRpb24gKSByZXR1cm4gZ2wuRlVOQ19BREQ7XG5cdFx0aWYgKCBwID09PSBTdWJ0cmFjdEVxdWF0aW9uICkgcmV0dXJuIGdsLkZVTkNfU1VCVFJBQ1Q7XG5cdFx0aWYgKCBwID09PSBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBnbC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1Q7XG5cblx0XHRpZiAoIHAgPT09IFplcm9GYWN0b3IgKSByZXR1cm4gZ2wuWkVSTztcblx0XHRpZiAoIHAgPT09IE9uZUZhY3RvciApIHJldHVybiBnbC5PTkU7XG5cdFx0aWYgKCBwID09PSBTcmNDb2xvckZhY3RvciApIHJldHVybiBnbC5TUkNfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c1NyY0NvbG9yRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19TUkNfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBTcmNBbHBoYUZhY3RvciApIHJldHVybiBnbC5TUkNfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c1NyY0FscGhhRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBEc3RBbHBoYUZhY3RvciApIHJldHVybiBnbC5EU1RfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c0RzdEFscGhhRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19EU1RfQUxQSEE7XG5cblx0XHRpZiAoIHAgPT09IERzdENvbG9yRmFjdG9yICkgcmV0dXJuIGdsLkRTVF9DT0xPUjtcblx0XHRpZiAoIHAgPT09IE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IgKSByZXR1cm4gZ2wuT05FX01JTlVTX0RTVF9DT0xPUjtcblx0XHRpZiAoIHAgPT09IFNyY0FscGhhU2F0dXJhdGVGYWN0b3IgKSByZXR1cm4gZ2wuU1JDX0FMUEhBX1NBVFVSQVRFO1xuXG5cdFx0aWYgKCBwID09PSBSR0JfUzNUQ19EWFQxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUc7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBSR0JfRVRDMV9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBSR0JBX0FTVENfNHg0X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfNXg0X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfNXg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ184eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDhfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzEweDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4MTBfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHJldHVybiBwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IE1pbkVxdWF0aW9uIHx8IHAgPT09IE1heEVxdWF0aW9uICkge1xuXG5cdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IE1pbkVxdWF0aW9uICkgcmV0dXJuIGdsLk1JTjtcblx0XHRcdFx0aWYgKCBwID09PSBNYXhFcXVhdGlvbiApIHJldHVybiBnbC5NQVg7XG5cblx0XHRcdH1cblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IE1pbkVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NSU5fRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IE1heEVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NQVhfRVhUO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSByZXR1cm4gZ2wuVU5TSUdORURfSU5UXzI0Xzg7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIDA7XG5cblx0fVxuXG5cdHJldHVybiB7IGNvbnZlcnQ6IGNvbnZlcnQgfTtcblxufVxuXG5cbmV4cG9ydCB7IFdlYkdMVXRpbHMgfTtcbiIsImltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBHcm91cCgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0dyb3VwJztcblxufVxuXG5Hcm91cC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBHcm91cCxcblxuXHRpc0dyb3VwOiB0cnVlXG5cbn0gKTtcblxuXG5leHBvcnQgeyBHcm91cCB9O1xuIiwiaW1wb3J0IHsgQ2FtZXJhIH0gZnJvbSAnLi9DYW1lcmEuanMnO1xuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcbmltcG9ydCB7IF9NYXRoIH0gZnJvbSAnLi4vbWF0aC9NYXRoLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBncmVnZ21hbiAvIGh0dHA6Ly9nYW1lcy5ncmVnZ21hbi5jb20vXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKSB7XG5cblx0Q2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGVyc3BlY3RpdmVDYW1lcmEnO1xuXG5cdHRoaXMuZm92ID0gZm92ICE9PSB1bmRlZmluZWQgPyBmb3YgOiA1MDtcblx0dGhpcy56b29tID0gMTtcblxuXHR0aGlzLm5lYXIgPSBuZWFyICE9PSB1bmRlZmluZWQgPyBuZWFyIDogMC4xO1xuXHR0aGlzLmZhciA9IGZhciAhPT0gdW5kZWZpbmVkID8gZmFyIDogMjAwMDtcblx0dGhpcy5mb2N1cyA9IDEwO1xuXG5cdHRoaXMuYXNwZWN0ID0gYXNwZWN0ICE9PSB1bmRlZmluZWQgPyBhc3BlY3QgOiAxO1xuXHR0aGlzLnZpZXcgPSBudWxsO1xuXG5cdHRoaXMuZmlsbUdhdWdlID0gMzU7XHQvLyB3aWR0aCBvZiB0aGUgZmlsbSAoZGVmYXVsdCBpbiBtaWxsaW1ldGVycylcblx0dGhpcy5maWxtT2Zmc2V0ID0gMDtcdC8vIGhvcml6b250YWwgZmlsbSBvZmZzZXQgKHNhbWUgdW5pdCBhcyBnYXVnZSlcblxuXHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxufVxuXG5QZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDYW1lcmEucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUGVyc3BlY3RpdmVDYW1lcmEsXG5cblx0aXNQZXJzcGVjdGl2ZUNhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0Q2FtZXJhLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7XG5cblx0XHR0aGlzLmZvdiA9IHNvdXJjZS5mb3Y7XG5cdFx0dGhpcy56b29tID0gc291cmNlLnpvb207XG5cblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XG5cdFx0dGhpcy5mb2N1cyA9IHNvdXJjZS5mb2N1cztcblxuXHRcdHRoaXMuYXNwZWN0ID0gc291cmNlLmFzcGVjdDtcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcblxuXHRcdHRoaXMuZmlsbUdhdWdlID0gc291cmNlLmZpbG1HYXVnZTtcblx0XHR0aGlzLmZpbG1PZmZzZXQgPSBzb3VyY2UuZmlsbU9mZnNldDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIEZPViBieSBmb2NhbCBsZW5ndGggaW4gcmVzcGVjdCB0byB0aGUgY3VycmVudCAuZmlsbUdhdWdlLlxuXHQgKlxuXHQgKiBUaGUgZGVmYXVsdCBmaWxtIGdhdWdlIGlzIDM1LCBzbyB0aGF0IHRoZSBmb2NhbCBsZW5ndGggY2FuIGJlIHNwZWNpZmllZCBmb3Jcblx0ICogYSAzNW1tIChmdWxsIGZyYW1lKSBjYW1lcmEuXG5cdCAqXG5cdCAqIFZhbHVlcyBmb3IgZm9jYWwgbGVuZ3RoIGFuZCBmaWxtIGdhdWdlIG11c3QgaGF2ZSB0aGUgc2FtZSB1bml0LlxuXHQgKi9cblx0c2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICggZm9jYWxMZW5ndGggKSB7XG5cblx0XHQvLyBzZWUgaHR0cDovL3d3dy5ib2JhdGtpbnMuY29tL3Bob3RvZ3JhcGh5L3RlY2huaWNhbC9maWVsZF9vZl92aWV3Lmh0bWxcblx0XHR2YXIgdkV4dGVudFNsb3BlID0gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyBmb2NhbExlbmd0aDtcblxuXHRcdHRoaXMuZm92ID0gX01hdGguUkFEMkRFRyAqIDIgKiBNYXRoLmF0YW4oIHZFeHRlbnRTbG9wZSApO1xuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGZvY2FsIGxlbmd0aCBmcm9tIHRoZSBjdXJyZW50IC5mb3YgYW5kIC5maWxtR2F1Z2UuXG5cdCAqL1xuXHRnZXRGb2NhbExlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZFeHRlbnRTbG9wZSA9IE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKTtcblxuXHRcdHJldHVybiAwLjUgKiB0aGlzLmdldEZpbG1IZWlnaHQoKSAvIHZFeHRlbnRTbG9wZTtcblxuXHR9LFxuXG5cdGdldEVmZmVjdGl2ZUZPVjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9NYXRoLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKFxuXHRcdFx0TWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tICk7XG5cblx0fSxcblxuXHRnZXRGaWxtV2lkdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGZpbG0gbm90IGNvbXBsZXRlbHkgY292ZXJlZCBpbiBwb3J0cmFpdCBmb3JtYXQgKGFzcGVjdCA8IDEpXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlICogTWF0aC5taW4oIHRoaXMuYXNwZWN0LCAxICk7XG5cblx0fSxcblxuXHRnZXRGaWxtSGVpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gbGFuZHNjYXBlIGZvcm1hdCAoYXNwZWN0ID4gMSlcblx0XHRyZXR1cm4gdGhpcy5maWxtR2F1Z2UgLyBNYXRoLm1heCggdGhpcy5hc3BlY3QsIDEgKTtcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIGFuIG9mZnNldCBpbiBhIGxhcmdlciBmcnVzdHVtLiBUaGlzIGlzIHVzZWZ1bCBmb3IgbXVsdGktd2luZG93IG9yXG5cdCAqIG11bHRpLW1vbml0b3IvbXVsdGktbWFjaGluZSBzZXR1cHMuXG5cdCAqXG5cdCAqIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSAzeDIgbW9uaXRvcnMgYW5kIGVhY2ggbW9uaXRvciBpcyAxOTIweDEwODAgYW5kXG5cdCAqIHRoZSBtb25pdG9ycyBhcmUgaW4gZ3JpZCBsaWtlIHRoaXNcblx0ICpcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqICAgfCBBIHwgQiB8IEMgfFxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICogICB8IEQgfCBFIHwgRiB8XG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKlxuXHQgKiB0aGVuIGZvciBlYWNoIG1vbml0b3IgeW91IHdvdWxkIGNhbGwgaXQgbGlrZSB0aGlzXG5cdCAqXG5cdCAqICAgdmFyIHcgPSAxOTIwO1xuXHQgKiAgIHZhciBoID0gMTA4MDtcblx0ICogICB2YXIgZnVsbFdpZHRoID0gdyAqIDM7XG5cdCAqICAgdmFyIGZ1bGxIZWlnaHQgPSBoICogMjtcblx0ICpcblx0ICogICAtLUEtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1CLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tQy0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUQtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAxLCB3LCBoICk7XG5cdCAqICAgLS1FLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMSwgdywgaCApO1xuXHQgKiAgIC0tRi0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDEsIHcsIGggKTtcblx0ICpcblx0ICogICBOb3RlIHRoZXJlIGlzIG5vIHJlYXNvbiBtb25pdG9ycyBoYXZlIHRvIGJlIHRoZSBzYW1lIHNpemUgb3IgaW4gYSBncmlkLlxuXHQgKi9cblx0c2V0Vmlld09mZnNldDogZnVuY3Rpb24gKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHR0aGlzLmFzcGVjdCA9IGZ1bGxXaWR0aCAvIGZ1bGxIZWlnaHQ7XG5cblx0XHRpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3ID0ge1xuXHRcdFx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdFx0XHRmdWxsV2lkdGg6IDEsXG5cdFx0XHRcdGZ1bGxIZWlnaHQ6IDEsXG5cdFx0XHRcdG9mZnNldFg6IDAsXG5cdFx0XHRcdG9mZnNldFk6IDAsXG5cdFx0XHRcdHdpZHRoOiAxLFxuXHRcdFx0XHRoZWlnaHQ6IDFcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XG5cdFx0dGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDtcblx0XHR0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7XG5cdFx0dGhpcy52aWV3Lm9mZnNldFggPSB4O1xuXHRcdHRoaXMudmlldy5vZmZzZXRZID0geTtcblx0XHR0aGlzLnZpZXcud2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHRjbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHR1cGRhdGVQcm9qZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbmVhciA9IHRoaXMubmVhcixcblx0XHRcdHRvcCA9IG5lYXIgKiBNYXRoLnRhbihcblx0XHRcdFx0X01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICkgLyB0aGlzLnpvb20sXG5cdFx0XHRoZWlnaHQgPSAyICogdG9wLFxuXHRcdFx0d2lkdGggPSB0aGlzLmFzcGVjdCAqIGhlaWdodCxcblx0XHRcdGxlZnQgPSAtIDAuNSAqIHdpZHRoLFxuXHRcdFx0dmlldyA9IHRoaXMudmlldztcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkge1xuXG5cdFx0XHR2YXIgZnVsbFdpZHRoID0gdmlldy5mdWxsV2lkdGgsXG5cdFx0XHRcdGZ1bGxIZWlnaHQgPSB2aWV3LmZ1bGxIZWlnaHQ7XG5cblx0XHRcdGxlZnQgKz0gdmlldy5vZmZzZXRYICogd2lkdGggLyBmdWxsV2lkdGg7XG5cdFx0XHR0b3AgLT0gdmlldy5vZmZzZXRZICogaGVpZ2h0IC8gZnVsbEhlaWdodDtcblx0XHRcdHdpZHRoICo9IHZpZXcud2lkdGggLyBmdWxsV2lkdGg7XG5cdFx0XHRoZWlnaHQgKj0gdmlldy5oZWlnaHQgLyBmdWxsSGVpZ2h0O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNrZXcgPSB0aGlzLmZpbG1PZmZzZXQ7XG5cdFx0aWYgKCBza2V3ICE9PSAwICkgbGVmdCArPSBuZWFyICogc2tldyAvIHRoaXMuZ2V0RmlsbVdpZHRoKCk7XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCBsZWZ0ICsgd2lkdGgsIHRvcCwgdG9wIC0gaGVpZ2h0LCBuZWFyLCB0aGlzLmZhciApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QuZm92ID0gdGhpcy5mb3Y7XG5cdFx0ZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTtcblxuXHRcdGRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7XG5cdFx0ZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7XG5cdFx0ZGF0YS5vYmplY3QuZm9jdXMgPSB0aGlzLmZvY3VzO1xuXG5cdFx0ZGF0YS5vYmplY3QuYXNwZWN0ID0gdGhpcy5hc3BlY3Q7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy52aWV3ICk7XG5cblx0XHRkYXRhLm9iamVjdC5maWxtR2F1Z2UgPSB0aGlzLmZpbG1HYXVnZTtcblx0XHRkYXRhLm9iamVjdC5maWxtT2Zmc2V0ID0gdGhpcy5maWxtT2Zmc2V0O1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4vUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xuXG5mdW5jdGlvbiBBcnJheUNhbWVyYSggYXJyYXkgKSB7XG5cblx0UGVyc3BlY3RpdmVDYW1lcmEuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuY2FtZXJhcyA9IGFycmF5IHx8IFtdO1xuXG59XG5cbkFycmF5Q2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIFBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEFycmF5Q2FtZXJhLFxuXG5cdGlzQXJyYXlDYW1lcmE6IHRydWVcblxufSApO1xuXG5cbmV4cG9ydCB7IEFycmF5Q2FtZXJhIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICcuLi8uLi9vYmplY3RzL0dyb3VwLmpzJztcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuLi8uLi9tYXRoL1F1YXRlcm5pb24uanMnO1xuaW1wb3J0IHsgQXJyYXlDYW1lcmEgfSBmcm9tICcuLi8uLi9jYW1lcmFzL0FycmF5Q2FtZXJhLmpzJztcbmltcG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi4vLi4vY2FtZXJhcy9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XG5pbXBvcnQgeyBXZWJHTEFuaW1hdGlvbiB9IGZyb20gJy4uL3dlYmdsL1dlYkdMQW5pbWF0aW9uLmpzJztcblxuZnVuY3Rpb24gV2ViVlJNYW5hZ2VyKCByZW5kZXJlciApIHtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHZhciBkZXZpY2UgPSBudWxsO1xuXHR2YXIgZnJhbWVEYXRhID0gbnVsbDtcblxuXHR2YXIgcG9zZVRhcmdldCA9IG51bGw7XG5cblx0dmFyIGNvbnRyb2xsZXJzID0gW107XG5cdHZhciBzdGFuZGluZ01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHZhciBzdGFuZGluZ01hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdGlmICggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ1ZSRnJhbWVEYXRhJyBpbiB3aW5kb3cgKSB7XG5cblx0XHRmcmFtZURhdGEgPSBuZXcgd2luZG93LlZSRnJhbWVEYXRhKCk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlLCBmYWxzZSApO1xuXG5cdH1cblxuXHR2YXIgbWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblx0dmFyIHRlbXBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHRlbXBQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhTC5ib3VuZHMgPSBuZXcgVmVjdG9yNCggMC4wLCAwLjAsIDAuNSwgMS4wICk7XG5cdGNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xuXG5cdHZhciBjYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdGNhbWVyYVIuYm91bmRzID0gbmV3IFZlY3RvcjQoIDAuNSwgMC4wLCAwLjUsIDEuMCApO1xuXHRjYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTtcblxuXHR2YXIgY2FtZXJhVlIgPSBuZXcgQXJyYXlDYW1lcmEoIFsgY2FtZXJhTCwgY2FtZXJhUiBdICk7XG5cdGNhbWVyYVZSLmxheWVycy5lbmFibGUoIDEgKTtcblx0Y2FtZXJhVlIubGF5ZXJzLmVuYWJsZSggMiApO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gaXNQcmVzZW50aW5nKCkge1xuXG5cdFx0cmV0dXJuIGRldmljZSAhPT0gbnVsbCAmJiBkZXZpY2UuaXNQcmVzZW50aW5nID09PSB0cnVlO1xuXG5cdH1cblxuXHR2YXIgY3VycmVudFNpemUsIGN1cnJlbnRQaXhlbFJhdGlvO1xuXG5cdGZ1bmN0aW9uIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSgpIHtcblxuXHRcdGlmICggaXNQcmVzZW50aW5nKCkgKSB7XG5cblx0XHRcdHZhciBleWVQYXJhbWV0ZXJzID0gZGV2aWNlLmdldEV5ZVBhcmFtZXRlcnMoICdsZWZ0JyApO1xuXHRcdFx0dmFyIHJlbmRlcldpZHRoID0gZXllUGFyYW1ldGVycy5yZW5kZXJXaWR0aDtcblx0XHRcdHZhciByZW5kZXJIZWlnaHQgPSBleWVQYXJhbWV0ZXJzLnJlbmRlckhlaWdodDtcblxuXHRcdFx0Y3VycmVudFBpeGVsUmF0aW8gPSByZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7XG5cdFx0XHRjdXJyZW50U2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTtcblxuXHRcdFx0cmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIHJlbmRlcldpZHRoICogMiwgcmVuZGVySGVpZ2h0LCAxICk7XG5cblx0XHRcdGFuaW1hdGlvbi5zdGFydCgpO1xuXG5cdFx0fSBlbHNlIGlmICggc2NvcGUuZW5hYmxlZCApIHtcblxuXHRcdFx0cmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIGN1cnJlbnRTaXplLndpZHRoLCBjdXJyZW50U2l6ZS5oZWlnaHQsIGN1cnJlbnRQaXhlbFJhdGlvICk7XG5cblx0XHRcdGFuaW1hdGlvbi5zdG9wKCk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIHRyaWdnZXJzID0gW107XG5cblx0ZnVuY3Rpb24gZmluZEdhbWVwYWQoIGlkICkge1xuXG5cdFx0dmFyIGdhbWVwYWRzID0gbmF2aWdhdG9yLmdldEdhbWVwYWRzICYmIG5hdmlnYXRvci5nZXRHYW1lcGFkcygpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gMCwgbCA9IGdhbWVwYWRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBnYW1lcGFkID0gZ2FtZXBhZHNbIGkgXTtcblxuXHRcdFx0aWYgKCBnYW1lcGFkICYmICggZ2FtZXBhZC5pZCA9PT0gJ0RheWRyZWFtIENvbnRyb2xsZXInIHx8XG5cdFx0XHRcdGdhbWVwYWQuaWQgPT09ICdHZWFyIFZSIENvbnRyb2xsZXInIHx8IGdhbWVwYWQuaWQgPT09ICdPY3VsdXMgR28gQ29udHJvbGxlcicgfHxcblx0XHRcdFx0Z2FtZXBhZC5pZCA9PT0gJ09wZW5WUiBHYW1lcGFkJyB8fCBnYW1lcGFkLmlkLnN0YXJ0c1dpdGgoICdPY3VsdXMgVG91Y2gnICkgfHxcblx0XHRcdFx0Z2FtZXBhZC5pZC5zdGFydHNXaXRoKCAnU3BhdGlhbCBDb250cm9sbGVyJyApICkgKSB7XG5cblx0XHRcdFx0aWYgKCBqID09PSBpZCApIHJldHVybiBnYW1lcGFkO1xuXG5cdFx0XHRcdGogKys7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlQ29udHJvbGxlcnMoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb250cm9sbGVycy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjb250cm9sbGVyID0gY29udHJvbGxlcnNbIGkgXTtcblxuXHRcdFx0dmFyIGdhbWVwYWQgPSBmaW5kR2FtZXBhZCggaSApO1xuXG5cdFx0XHRpZiAoIGdhbWVwYWQgIT09IHVuZGVmaW5lZCAmJiBnYW1lcGFkLnBvc2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGdhbWVwYWQucG9zZSA9PT0gbnVsbCApIHJldHVybjtcblxuXHRcdFx0XHQvLyAgUG9zZVxuXG5cdFx0XHRcdHZhciBwb3NlID0gZ2FtZXBhZC5wb3NlO1xuXG5cdFx0XHRcdGlmICggcG9zZS5oYXNQb3NpdGlvbiA9PT0gZmFsc2UgKSBjb250cm9sbGVyLnBvc2l0aW9uLnNldCggMC4yLCAtIDAuNiwgLSAwLjA1ICk7XG5cblx0XHRcdFx0aWYgKCBwb3NlLnBvc2l0aW9uICE9PSBudWxsICkgY29udHJvbGxlci5wb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2UucG9zaXRpb24gKTtcblx0XHRcdFx0aWYgKCBwb3NlLm9yaWVudGF0aW9uICE9PSBudWxsICkgY29udHJvbGxlci5xdWF0ZXJuaW9uLmZyb21BcnJheSggcG9zZS5vcmllbnRhdGlvbiApO1xuXHRcdFx0XHRjb250cm9sbGVyLm1hdHJpeC5jb21wb3NlKCBjb250cm9sbGVyLnBvc2l0aW9uLCBjb250cm9sbGVyLnF1YXRlcm5pb24sIGNvbnRyb2xsZXIuc2NhbGUgKTtcblx0XHRcdFx0Y29udHJvbGxlci5tYXRyaXgucHJlbXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4ICk7XG5cdFx0XHRcdGNvbnRyb2xsZXIubWF0cml4LmRlY29tcG9zZSggY29udHJvbGxlci5wb3NpdGlvbiwgY29udHJvbGxlci5xdWF0ZXJuaW9uLCBjb250cm9sbGVyLnNjYWxlICk7XG5cdFx0XHRcdGNvbnRyb2xsZXIubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cdFx0XHRcdGNvbnRyb2xsZXIudmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdFx0Ly8gIFRyaWdnZXJcblxuXHRcdFx0XHR2YXIgYnV0dG9uSWQgPSBnYW1lcGFkLmlkID09PSAnRGF5ZHJlYW0gQ29udHJvbGxlcicgPyAwIDogMTtcblxuXHRcdFx0XHRpZiAoIHRyaWdnZXJzWyBpIF0gIT09IGdhbWVwYWQuYnV0dG9uc1sgYnV0dG9uSWQgXS5wcmVzc2VkICkge1xuXG5cdFx0XHRcdFx0dHJpZ2dlcnNbIGkgXSA9IGdhbWVwYWQuYnV0dG9uc1sgYnV0dG9uSWQgXS5wcmVzc2VkO1xuXG5cdFx0XHRcdFx0aWYgKCB0cmlnZ2Vyc1sgaSBdID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ3NlbGVjdHN0YXJ0JyB9ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ3NlbGVjdGVuZCcgfSApO1xuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdzZWxlY3QnIH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29udHJvbGxlci52aXNpYmxlID0gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblx0dGhpcy51c2VySGVpZ2h0ID0gMS42O1xuXG5cdHRoaXMuZ2V0Q29udHJvbGxlciA9IGZ1bmN0aW9uICggaWQgKSB7XG5cblx0XHR2YXIgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpZCBdO1xuXG5cdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnRyb2xsZXIgPSBuZXcgR3JvdXAoKTtcblx0XHRcdGNvbnRyb2xsZXIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Y29udHJvbGxlci52aXNpYmxlID0gZmFsc2U7XG5cblx0XHRcdGNvbnRyb2xsZXJzWyBpZCBdID0gY29udHJvbGxlcjtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjb250cm9sbGVyO1xuXG5cdH07XG5cblx0dGhpcy5nZXREZXZpY2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gZGV2aWNlO1xuXG5cdH07XG5cblx0dGhpcy5zZXREZXZpY2UgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgZGV2aWNlID0gdmFsdWU7XG5cblx0XHRhbmltYXRpb24uc2V0Q29udGV4dCggdmFsdWUgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0UG9zZVRhcmdldCA9IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHBvc2VUYXJnZXQgPSBvYmplY3Q7XG5cblx0fTtcblxuXHR0aGlzLmdldENhbWVyYSA9IGZ1bmN0aW9uICggY2FtZXJhICkge1xuXG5cdFx0aWYgKCBkZXZpY2UgPT09IG51bGwgKSB7XG5cblx0XHRcdGNhbWVyYS5wb3NpdGlvbi5zZXQoIDAsIHNjb3BlLnVzZXJIZWlnaHQsIDAgKTtcblx0XHRcdHJldHVybiBjYW1lcmE7XG5cblx0XHR9XG5cblx0XHRkZXZpY2UuZGVwdGhOZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0ZGV2aWNlLmRlcHRoRmFyID0gY2FtZXJhLmZhcjtcblxuXHRcdGRldmljZS5nZXRGcmFtZURhdGEoIGZyYW1lRGF0YSApO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBzdGFnZVBhcmFtZXRlcnMgPSBkZXZpY2Uuc3RhZ2VQYXJhbWV0ZXJzO1xuXG5cdFx0aWYgKCBzdGFnZVBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdHN0YW5kaW5nTWF0cml4LmZyb21BcnJheSggc3RhZ2VQYXJhbWV0ZXJzLnNpdHRpbmdUb1N0YW5kaW5nVHJhbnNmb3JtICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzdGFuZGluZ01hdHJpeC5tYWtlVHJhbnNsYXRpb24oIDAsIHNjb3BlLnVzZXJIZWlnaHQsIDAgKTtcblxuXHRcdH1cblxuXG5cdFx0dmFyIHBvc2UgPSBmcmFtZURhdGEucG9zZTtcblx0XHR2YXIgcG9zZU9iamVjdCA9IHBvc2VUYXJnZXQgIT09IG51bGwgPyBwb3NlVGFyZ2V0IDogY2FtZXJhO1xuXG5cdFx0Ly8gV2Ugd2FudCB0byBtYW5pcHVsYXRlIHBvc2VPYmplY3QgYnkgaXRzIHBvc2l0aW9uIGFuZCBxdWF0ZXJuaW9uIGNvbXBvbmVudHMgc2luY2UgdXNlcnMgbWF5IHJlbHkgb24gdGhlbS5cblx0XHRwb3NlT2JqZWN0Lm1hdHJpeC5jb3B5KCBzdGFuZGluZ01hdHJpeCApO1xuXHRcdHBvc2VPYmplY3QubWF0cml4LmRlY29tcG9zZSggcG9zZU9iamVjdC5wb3NpdGlvbiwgcG9zZU9iamVjdC5xdWF0ZXJuaW9uLCBwb3NlT2JqZWN0LnNjYWxlICk7XG5cblx0XHRpZiAoIHBvc2Uub3JpZW50YXRpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHRlbXBRdWF0ZXJuaW9uLmZyb21BcnJheSggcG9zZS5vcmllbnRhdGlvbiApO1xuXHRcdFx0cG9zZU9iamVjdC5xdWF0ZXJuaW9uLm11bHRpcGx5KCB0ZW1wUXVhdGVybmlvbiApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwb3NlLnBvc2l0aW9uICE9PSBudWxsICkge1xuXG5cdFx0XHR0ZW1wUXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIHN0YW5kaW5nTWF0cml4ICk7XG5cdFx0XHR0ZW1wUG9zaXRpb24uZnJvbUFycmF5KCBwb3NlLnBvc2l0aW9uICk7XG5cdFx0XHR0ZW1wUG9zaXRpb24uYXBwbHlRdWF0ZXJuaW9uKCB0ZW1wUXVhdGVybmlvbiApO1xuXHRcdFx0cG9zZU9iamVjdC5wb3NpdGlvbi5hZGQoIHRlbXBQb3NpdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cG9zZU9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0aWYgKCBkZXZpY2UuaXNQcmVzZW50aW5nID09PSBmYWxzZSApIHJldHVybiBjYW1lcmE7XG5cblx0XHQvL1xuXG5cdFx0Y2FtZXJhTC5uZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0Y2FtZXJhUi5uZWFyID0gY2FtZXJhLm5lYXI7XG5cblx0XHRjYW1lcmFMLmZhciA9IGNhbWVyYS5mYXI7XG5cdFx0Y2FtZXJhUi5mYXIgPSBjYW1lcmEuZmFyO1xuXG5cdFx0Y2FtZXJhVlIubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0Y2FtZXJhVlIubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheSggZnJhbWVEYXRhLmxlZnRWaWV3TWF0cml4ICk7XG5cdFx0Y2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KCBmcmFtZURhdGEucmlnaHRWaWV3TWF0cml4ICk7XG5cblx0XHQvLyBUT0RPIChtcmRvb2IpIERvdWJsZSBjaGVjayB0aGlzIGNvZGVcblxuXHRcdHN0YW5kaW5nTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBzdGFuZGluZ01hdHJpeCApO1xuXG5cdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4SW52ZXJzZSApO1xuXHRcdGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBzdGFuZGluZ01hdHJpeEludmVyc2UgKTtcblxuXHRcdHZhciBwYXJlbnQgPSBwb3NlT2JqZWN0LnBhcmVudDtcblxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRtYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggcGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdH1cblxuXHRcdC8vIGVudk1hcCBhbmQgTWlycm9yIG5lZWRzIGNhbWVyYS5tYXRyaXhXb3JsZFxuXG5cdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCBjYW1lcmFMLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdGNhbWVyYVIubWF0cml4V29ybGQuZ2V0SW52ZXJzZSggY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5sZWZ0UHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdGNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5yaWdodFByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdC8vIEhBQ0sgKG1yZG9vYilcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vdzNjL3dlYnZyL2lzc3Vlcy8yMDNcblxuXHRcdGNhbWVyYVZSLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGxheWVycyA9IGRldmljZS5nZXRMYXllcnMoKTtcblxuXHRcdGlmICggbGF5ZXJzLmxlbmd0aCApIHtcblxuXHRcdFx0dmFyIGxheWVyID0gbGF5ZXJzWyAwIF07XG5cblx0XHRcdGlmICggbGF5ZXIubGVmdEJvdW5kcyAhPT0gbnVsbCAmJiBsYXllci5sZWZ0Qm91bmRzLmxlbmd0aCA9PT0gNCApIHtcblxuXHRcdFx0XHRjYW1lcmFMLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLmxlZnRCb3VuZHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGxheWVyLnJpZ2h0Qm91bmRzICE9PSBudWxsICYmIGxheWVyLnJpZ2h0Qm91bmRzLmxlbmd0aCA9PT0gNCApIHtcblxuXHRcdFx0XHRjYW1lcmFSLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLnJpZ2h0Qm91bmRzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHVwZGF0ZUNvbnRyb2xsZXJzKCk7XG5cblx0XHRyZXR1cm4gY2FtZXJhVlI7XG5cblx0fTtcblxuXHR0aGlzLmdldFN0YW5kaW5nTWF0cml4ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHN0YW5kaW5nTWF0cml4O1xuXG5cdH07XG5cblx0dGhpcy5pc1ByZXNlbnRpbmcgPSBpc1ByZXNlbnRpbmc7XG5cblx0Ly8gQW5pbWF0aW9uIExvb3BcblxuXHR2YXIgYW5pbWF0aW9uID0gbmV3IFdlYkdMQW5pbWF0aW9uKCk7XG5cblx0dGhpcy5zZXRBbmltYXRpb25Mb29wID0gZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGFuaW1hdGlvbi5zZXRBbmltYXRpb25Mb29wKCBjYWxsYmFjayApO1xuXG5cdH07XG5cblx0dGhpcy5zdWJtaXRGcmFtZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggaXNQcmVzZW50aW5nKCkgKSBkZXZpY2Uuc3VibWl0RnJhbWUoKTtcblxuXHR9O1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAndnJkaXNwbGF5cHJlc2VudGNoYW5nZScsIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSApO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxuZXhwb3J0IHsgV2ViVlJNYW5hZ2VyIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICcuLi8uLi9vYmplY3RzL0dyb3VwLmpzJztcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQuanMnO1xuaW1wb3J0IHsgQXJyYXlDYW1lcmEgfSBmcm9tICcuLi8uLi9jYW1lcmFzL0FycmF5Q2FtZXJhLmpzJztcbmltcG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi4vLi4vY2FtZXJhcy9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XG5pbXBvcnQgeyBXZWJHTEFuaW1hdGlvbiB9IGZyb20gJy4uL3dlYmdsL1dlYkdMQW5pbWF0aW9uLmpzJztcblxuZnVuY3Rpb24gV2ViWFJNYW5hZ2VyKCByZW5kZXJlciApIHtcblxuXHR2YXIgZ2wgPSByZW5kZXJlci5jb250ZXh0O1xuXG5cdHZhciBkZXZpY2UgPSBudWxsO1xuXHR2YXIgc2Vzc2lvbiA9IG51bGw7XG5cblx0dmFyIGZyYW1lT2ZSZWYgPSBudWxsO1xuXG5cdHZhciBwb3NlID0gbnVsbDtcblxuXHR2YXIgY29udHJvbGxlcnMgPSBbXTtcblx0dmFyIGlucHV0U291cmNlcyA9IFtdO1xuXG5cdGZ1bmN0aW9uIGlzUHJlc2VudGluZygpIHtcblxuXHRcdHJldHVybiBzZXNzaW9uICE9PSBudWxsICYmIGZyYW1lT2ZSZWYgIT09IG51bGw7XG5cblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHRjYW1lcmFMLmxheWVycy5lbmFibGUoIDEgKTtcblx0Y2FtZXJhTC52aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCk7XG5cblx0dmFyIGNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhUi5sYXllcnMuZW5hYmxlKCAyICk7XG5cdGNhbWVyYVIudmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdHZhciBjYW1lcmFWUiA9IG5ldyBBcnJheUNhbWVyYSggWyBjYW1lcmFMLCBjYW1lcmFSIF0gKTtcblx0Y2FtZXJhVlIubGF5ZXJzLmVuYWJsZSggMSApO1xuXHRjYW1lcmFWUi5sYXllcnMuZW5hYmxlKCAyICk7XG5cblx0Ly9cblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHR0aGlzLmdldENvbnRyb2xsZXIgPSBmdW5jdGlvbiAoIGlkICkge1xuXG5cdFx0dmFyIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1sgaWQgXTtcblxuXHRcdGlmICggY29udHJvbGxlciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb250cm9sbGVyID0gbmV3IEdyb3VwKCk7XG5cdFx0XHRjb250cm9sbGVyLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0XHRcdGNvbnRyb2xsZXIudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0XHRjb250cm9sbGVyc1sgaWQgXSA9IGNvbnRyb2xsZXI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udHJvbGxlcjtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0RGV2aWNlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGRldmljZTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0RGV2aWNlID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIGRldmljZSA9IHZhbHVlO1xuXHRcdGlmICggdmFsdWUgaW5zdGFuY2VvZiBYUkRldmljZSApIGdsLnNldENvbXBhdGlibGVYUkRldmljZSggdmFsdWUgKTtcblxuXHR9O1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gb25TZXNzaW9uRXZlbnQoIGV2ZW50ICkge1xuXG5cdFx0dmFyIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1sgaW5wdXRTb3VyY2VzLmluZGV4T2YoIGV2ZW50LmlucHV0U291cmNlICkgXTtcblx0XHRpZiAoIGNvbnRyb2xsZXIgKSBjb250cm9sbGVyLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogZXZlbnQudHlwZSB9ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uU2Vzc2lvbkVuZCgpIHtcblxuXHRcdHJlbmRlcmVyLnNldEZyYW1lYnVmZmVyKCBudWxsICk7XG5cdFx0YW5pbWF0aW9uLnN0b3AoKTtcblxuXHR9XG5cblx0dGhpcy5zZXRTZXNzaW9uID0gZnVuY3Rpb24gKCB2YWx1ZSwgb3B0aW9ucyApIHtcblxuXHRcdHNlc3Npb24gPSB2YWx1ZTtcblxuXHRcdGlmICggc2Vzc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnc2VsZWN0Jywgb25TZXNzaW9uRXZlbnQgKTtcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NlbGVjdHN0YXJ0Jywgb25TZXNzaW9uRXZlbnQgKTtcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NlbGVjdGVuZCcsIG9uU2Vzc2lvbkV2ZW50ICk7XG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdlbmQnLCBvblNlc3Npb25FbmQgKTtcblxuXHRcdFx0c2Vzc2lvbi5iYXNlTGF5ZXIgPSBuZXcgWFJXZWJHTExheWVyKCBzZXNzaW9uLCBnbCApO1xuXHRcdFx0c2Vzc2lvbi5yZXF1ZXN0RnJhbWVPZlJlZmVyZW5jZSggb3B0aW9ucy5mcmFtZU9mUmVmZXJlbmNlVHlwZSApLnRoZW4oIGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdFx0ZnJhbWVPZlJlZiA9IHZhbHVlO1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldEZyYW1lYnVmZmVyKCBzZXNzaW9uLmJhc2VMYXllci5mcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHRcdGFuaW1hdGlvbi5zZXRDb250ZXh0KCBzZXNzaW9uICk7XG5cdFx0XHRcdGFuaW1hdGlvbi5zdGFydCgpO1xuXG5cdFx0XHR9ICk7XG5cblx0XHRcdC8vXG5cblx0XHRcdGlucHV0U291cmNlcyA9IHNlc3Npb24uZ2V0SW5wdXRTb3VyY2VzKCk7XG5cblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ2lucHV0c291cmNlc2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpbnB1dFNvdXJjZXMgPSBzZXNzaW9uLmdldElucHV0U291cmNlcygpO1xuXHRcdFx0XHRjb25zb2xlLmxvZyggaW5wdXRTb3VyY2VzICk7XG5cblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZUNhbWVyYSggY2FtZXJhLCBwYXJlbnQgKSB7XG5cblx0XHRpZiAoIHBhcmVudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXggKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNhbWVyYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCBwYXJlbnQubWF0cml4V29ybGQsIGNhbWVyYS5tYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0fVxuXG5cdHRoaXMuZ2V0Q2FtZXJhID0gZnVuY3Rpb24gKCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIGlzUHJlc2VudGluZygpICkge1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gY2FtZXJhLnBhcmVudDtcblx0XHRcdHZhciBjYW1lcmFzID0gY2FtZXJhVlIuY2FtZXJhcztcblxuXHRcdFx0Ly8gYXBwbHkgY2FtZXJhLnBhcmVudCB0byBjYW1lcmFWUlxuXG5cdFx0XHR1cGRhdGVDYW1lcmEoIGNhbWVyYVZSLCBwYXJlbnQgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2FtZXJhcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dXBkYXRlQ2FtZXJhKCBjYW1lcmFzWyBpIF0sIHBhcmVudCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHVwZGF0ZSBjYW1lcmEgYW5kIGl0cyBjaGlsZHJlblxuXG5cdFx0XHRjYW1lcmEubWF0cml4V29ybGQuY29weSggY2FtZXJhVlIubWF0cml4V29ybGQgKTtcblxuXHRcdFx0dmFyIGNoaWxkcmVuID0gY2FtZXJhLmNoaWxkcmVuO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGNoaWxkcmVuWyBpIF0udXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gY2FtZXJhVlI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FtZXJhO1xuXG5cdH07XG5cblx0dGhpcy5pc1ByZXNlbnRpbmcgPSBpc1ByZXNlbnRpbmc7XG5cblx0Ly8gQW5pbWF0aW9uIExvb3BcblxuXHR2YXIgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gbnVsbDtcblxuXHRmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHtcblxuXHRcdHBvc2UgPSBmcmFtZS5nZXREZXZpY2VQb3NlKCBmcmFtZU9mUmVmICk7XG5cblx0XHRpZiAoIHBvc2UgIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBsYXllciA9IHNlc3Npb24uYmFzZUxheWVyO1xuXHRcdFx0dmFyIHZpZXdzID0gZnJhbWUudmlld3M7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZpZXdzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgdmlldyA9IHZpZXdzWyBpIF07XG5cdFx0XHRcdHZhciB2aWV3cG9ydCA9IGxheWVyLmdldFZpZXdwb3J0KCB2aWV3ICk7XG5cdFx0XHRcdHZhciB2aWV3TWF0cml4ID0gcG9zZS5nZXRWaWV3TWF0cml4KCB2aWV3ICk7XG5cblx0XHRcdFx0dmFyIGNhbWVyYSA9IGNhbWVyYVZSLmNhbWVyYXNbIGkgXTtcblx0XHRcdFx0Y2FtZXJhLm1hdHJpeC5mcm9tQXJyYXkoIHZpZXdNYXRyaXggKS5nZXRJbnZlcnNlKCBjYW1lcmEubWF0cml4ICk7XG5cdFx0XHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheSggdmlldy5wcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0XHRcdGNhbWVyYS52aWV3cG9ydC5zZXQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQgKTtcblxuXHRcdFx0XHRpZiAoIGkgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRjYW1lcmFWUi5tYXRyaXguY29weSggY2FtZXJhLm1hdHJpeCApO1xuXG5cdFx0XHRcdFx0Ly8gSEFDSyAobXJkb29iKVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2Mvd2VidnIvaXNzdWVzLzIwM1xuXG5cdFx0XHRcdFx0Y2FtZXJhVlIucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1sgaSBdO1xuXG5cdFx0XHR2YXIgaW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBpbnB1dFNvdXJjZSApIHtcblxuXHRcdFx0XHR2YXIgaW5wdXRQb3NlID0gZnJhbWUuZ2V0SW5wdXRQb3NlKCBpbnB1dFNvdXJjZSwgZnJhbWVPZlJlZiApO1xuXG5cdFx0XHRcdGlmICggaW5wdXRQb3NlICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0Y29udHJvbGxlci5tYXRyaXguZWxlbWVudHMgPSBpbnB1dFBvc2UucG9pbnRlck1hdHJpeDtcblx0XHRcdFx0XHRjb250cm9sbGVyLm1hdHJpeC5kZWNvbXBvc2UoIGNvbnRyb2xsZXIucG9zaXRpb24sIGNvbnRyb2xsZXIucm90YXRpb24sIGNvbnRyb2xsZXIuc2NhbGUgKTtcblx0XHRcdFx0XHRjb250cm9sbGVyLnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnRyb2xsZXIudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgKSBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2soIHRpbWUgKTtcblxuXHR9XG5cblx0dmFyIGFuaW1hdGlvbiA9IG5ldyBXZWJHTEFuaW1hdGlvbigpO1xuXHRhbmltYXRpb24uc2V0QW5pbWF0aW9uTG9vcCggb25BbmltYXRpb25GcmFtZSApO1xuXG5cdHRoaXMuc2V0QW5pbWF0aW9uTG9vcCA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHR9O1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG5cdC8vIERFUFJFQ0FURURcblxuXHR0aGlzLmdldFN0YW5kaW5nTWF0cml4ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViWFJNYW5hZ2VyOiBnZXRTdGFuZGluZ01hdHJpeCgpIGlzIG5vIGxvbmdlciBuZWVkZWQuJyApO1xuXHRcdHJldHVybiBuZXcgVEhSRUUuTWF0cml4NCgpO1xuXG5cdH07XG5cblx0dGhpcy5zdWJtaXRGcmFtZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG59XG5cbmV4cG9ydCB7IFdlYlhSTWFuYWdlciB9O1xuIiwiaW1wb3J0IHtcblx0UkVWSVNJT04sXG5cdFJHQkFGb3JtYXQsXG5cdEhhbGZGbG9hdFR5cGUsXG5cdEZsb2F0VHlwZSxcblx0VW5zaWduZWRCeXRlVHlwZSxcblx0VHJpYW5nbGVGYW5EcmF3TW9kZSxcblx0VHJpYW5nbGVTdHJpcERyYXdNb2RlLFxuXHRUcmlhbmdsZXNEcmF3TW9kZSxcblx0TGluZWFyVG9uZU1hcHBpbmcsXG5cdEJhY2tTaWRlXG59IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBfTWF0aCB9IGZyb20gJy4uL21hdGgvTWF0aC5qcyc7XG5pbXBvcnQgeyBEYXRhVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0RhdGFUZXh0dXJlLmpzJztcbmltcG9ydCB7IEZydXN0dW0gfSBmcm9tICcuLi9tYXRoL0ZydXN0dW0uanMnO1xuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XG5pbXBvcnQgeyBTaGFkZXJMaWIgfSBmcm9tICcuL3NoYWRlcnMvU2hhZGVyTGliLmpzJztcbmltcG9ydCB7IFVuaWZvcm1zTGliIH0gZnJvbSAnLi9zaGFkZXJzL1VuaWZvcm1zTGliLmpzJztcbmltcG9ydCB7IFVuaWZvcm1zVXRpbHMgfSBmcm9tICcuL3NoYWRlcnMvVW5pZm9ybXNVdGlscy5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjQuanMnO1xuaW1wb3J0IHsgV2ViR0xBbmltYXRpb24gfSBmcm9tICcuL3dlYmdsL1dlYkdMQW5pbWF0aW9uLmpzJztcbmltcG9ydCB7IFdlYkdMQXR0cmlidXRlcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xBdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IFdlYkdMQmFja2dyb3VuZCB9IGZyb20gJy4vd2ViZ2wvV2ViR0xCYWNrZ3JvdW5kLmpzJztcbmltcG9ydCB7IFdlYkdMQnVmZmVyUmVuZGVyZXIgfSBmcm9tICcuL3dlYmdsL1dlYkdMQnVmZmVyUmVuZGVyZXIuanMnO1xuaW1wb3J0IHsgV2ViR0xDYXBhYmlsaXRpZXMgfSBmcm9tICcuL3dlYmdsL1dlYkdMQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IFdlYkdMQ2xpcHBpbmcgfSBmcm9tICcuL3dlYmdsL1dlYkdMQ2xpcHBpbmcuanMnO1xuaW1wb3J0IHsgV2ViR0xFeHRlbnNpb25zIH0gZnJvbSAnLi93ZWJnbC9XZWJHTEV4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgV2ViR0xHZW9tZXRyaWVzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTEdlb21ldHJpZXMuanMnO1xuaW1wb3J0IHsgV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIgfSBmcm9tICcuL3dlYmdsL1dlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyLmpzJztcbmltcG9ydCB7IFdlYkdMSW5mbyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xJbmZvLmpzJztcbmltcG9ydCB7IFdlYkdMTW9ycGh0YXJnZXRzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTE1vcnBodGFyZ2V0cy5qcyc7XG5pbXBvcnQgeyBXZWJHTE9iamVjdHMgfSBmcm9tICcuL3dlYmdsL1dlYkdMT2JqZWN0cy5qcyc7XG5pbXBvcnQgeyBXZWJHTFByb2dyYW1zIH0gZnJvbSAnLi93ZWJnbC9XZWJHTFByb2dyYW1zLmpzJztcbmltcG9ydCB7IFdlYkdMUHJvcGVydGllcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xQcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7IFdlYkdMUmVuZGVyTGlzdHMgfSBmcm9tICcuL3dlYmdsL1dlYkdMUmVuZGVyTGlzdHMuanMnO1xuaW1wb3J0IHsgV2ViR0xSZW5kZXJTdGF0ZXMgfSBmcm9tICcuL3dlYmdsL1dlYkdMUmVuZGVyU3RhdGVzLmpzJztcbmltcG9ydCB7IFdlYkdMU2hhZG93TWFwIH0gZnJvbSAnLi93ZWJnbC9XZWJHTFNoYWRvd01hcC5qcyc7XG5pbXBvcnQgeyBXZWJHTFN0YXRlIH0gZnJvbSAnLi93ZWJnbC9XZWJHTFN0YXRlLmpzJztcbmltcG9ydCB7IFdlYkdMVGV4dHVyZXMgfSBmcm9tICcuL3dlYmdsL1dlYkdMVGV4dHVyZXMuanMnO1xuaW1wb3J0IHsgV2ViR0xVbmlmb3JtcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xVbmlmb3Jtcy5qcyc7XG5pbXBvcnQgeyBXZWJHTFV0aWxzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTFV0aWxzLmpzJztcbmltcG9ydCB7IFdlYlZSTWFuYWdlciB9IGZyb20gJy4vd2VidnIvV2ViVlJNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFdlYlhSTWFuYWdlciB9IGZyb20gJy4vd2VidnIvV2ViWFJNYW5hZ2VyLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJlciggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXInLCBSRVZJU0lPTiApO1xuXG5cdHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdHZhciBfY2FudmFzID0gcGFyYW1ldGVycy5jYW52YXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuY2FudmFzIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICksXG5cdFx0X2NvbnRleHQgPSBwYXJhbWV0ZXJzLmNvbnRleHQgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuY29udGV4dCA6IG51bGwsXG5cblx0XHRfYWxwaGEgPSBwYXJhbWV0ZXJzLmFscGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmFscGhhIDogZmFsc2UsXG5cdFx0X2RlcHRoID0gcGFyYW1ldGVycy5kZXB0aCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5kZXB0aCA6IHRydWUsXG5cdFx0X3N0ZW5jaWwgPSBwYXJhbWV0ZXJzLnN0ZW5jaWwgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuc3RlbmNpbCA6IHRydWUsXG5cdFx0X2FudGlhbGlhcyA9IHBhcmFtZXRlcnMuYW50aWFsaWFzICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmFudGlhbGlhcyA6IGZhbHNlLFxuXHRcdF9wcmVtdWx0aXBsaWVkQWxwaGEgPSBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgOiB0cnVlLFxuXHRcdF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgPSBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgOiBmYWxzZSxcblx0XHRfcG93ZXJQcmVmZXJlbmNlID0gcGFyYW1ldGVycy5wb3dlclByZWZlcmVuY2UgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucG93ZXJQcmVmZXJlbmNlIDogJ2RlZmF1bHQnO1xuXG5cdHZhciBjdXJyZW50UmVuZGVyTGlzdCA9IG51bGw7XG5cdHZhciBjdXJyZW50UmVuZGVyU3RhdGUgPSBudWxsO1xuXG5cdC8vIHB1YmxpYyBwcm9wZXJ0aWVzXG5cblx0dGhpcy5kb21FbGVtZW50ID0gX2NhbnZhcztcblx0dGhpcy5jb250ZXh0ID0gbnVsbDtcblxuXHQvLyBjbGVhcmluZ1xuXG5cdHRoaXMuYXV0b0NsZWFyID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJDb2xvciA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyRGVwdGggPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhclN0ZW5jaWwgPSB0cnVlO1xuXG5cdC8vIHNjZW5lIGdyYXBoXG5cblx0dGhpcy5zb3J0T2JqZWN0cyA9IHRydWU7XG5cblx0Ly8gdXNlci1kZWZpbmVkIGNsaXBwaW5nXG5cblx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IFtdO1xuXHR0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2U7XG5cblx0Ly8gcGh5c2ljYWxseSBiYXNlZCBzaGFkaW5nXG5cblx0dGhpcy5nYW1tYUZhY3RvciA9IDIuMDtcdC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHR0aGlzLmdhbW1hSW5wdXQgPSBmYWxzZTtcblx0dGhpcy5nYW1tYU91dHB1dCA9IGZhbHNlO1xuXG5cdC8vIHBoeXNpY2FsIGxpZ2h0c1xuXG5cdHRoaXMucGh5c2ljYWxseUNvcnJlY3RMaWdodHMgPSBmYWxzZTtcblxuXHQvLyB0b25lIG1hcHBpbmdcblxuXHR0aGlzLnRvbmVNYXBwaW5nID0gTGluZWFyVG9uZU1hcHBpbmc7XG5cdHRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZSA9IDEuMDtcblx0dGhpcy50b25lTWFwcGluZ1doaXRlUG9pbnQgPSAxLjA7XG5cblx0Ly8gbW9ycGhzXG5cblx0dGhpcy5tYXhNb3JwaFRhcmdldHMgPSA4O1xuXHR0aGlzLm1heE1vcnBoTm9ybWFscyA9IDQ7XG5cblx0Ly8gaW50ZXJuYWwgcHJvcGVydGllc1xuXG5cdHZhciBfdGhpcyA9IHRoaXMsXG5cblx0XHRfaXNDb250ZXh0TG9zdCA9IGZhbHNlLFxuXG5cdFx0Ly8gaW50ZXJuYWwgc3RhdGUgY2FjaGVcblxuXHRcdF9mcmFtZWJ1ZmZlciA9IG51bGwsXG5cblx0XHRfY3VycmVudFJlbmRlclRhcmdldCA9IG51bGwsXG5cdFx0X2N1cnJlbnRGcmFtZWJ1ZmZlciA9IG51bGwsXG5cdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gLSAxLFxuXG5cdFx0Ly8gZ2VvbWV0cnkgYW5kIHByb2dyYW0gY2FjaGluZ1xuXG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSB7XG5cdFx0XHRnZW9tZXRyeTogbnVsbCxcblx0XHRcdHByb2dyYW06IG51bGwsXG5cdFx0XHR3aXJlZnJhbWU6IGZhbHNlXG5cdFx0fSxcblxuXHRcdF9jdXJyZW50Q2FtZXJhID0gbnVsbCxcblx0XHRfY3VycmVudEFycmF5Q2FtZXJhID0gbnVsbCxcblxuXHRcdF9jdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpLFxuXHRcdF9jdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCksXG5cdFx0X2N1cnJlbnRTY2lzc29yVGVzdCA9IG51bGwsXG5cblx0XHQvL1xuXG5cdFx0X3VzZWRUZXh0dXJlVW5pdHMgPSAwLFxuXG5cdFx0Ly9cblxuXHRcdF93aWR0aCA9IF9jYW52YXMud2lkdGgsXG5cdFx0X2hlaWdodCA9IF9jYW52YXMuaGVpZ2h0LFxuXG5cdFx0X3BpeGVsUmF0aW8gPSAxLFxuXG5cdFx0X3ZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApLFxuXHRcdF9zY2lzc29yID0gbmV3IFZlY3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApLFxuXHRcdF9zY2lzc29yVGVzdCA9IGZhbHNlLFxuXG5cdFx0Ly8gZnJ1c3R1bVxuXG5cdFx0X2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpLFxuXG5cdFx0Ly8gY2xpcHBpbmdcblxuXHRcdF9jbGlwcGluZyA9IG5ldyBXZWJHTENsaXBwaW5nKCksXG5cdFx0X2NsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXHRcdF9sb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXG5cdFx0Ly8gY2FtZXJhIG1hdHJpY2VzIGNhY2hlXG5cblx0XHRfcHJvalNjcmVlbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCksXG5cblx0XHRfdmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0ZnVuY3Rpb24gZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpIHtcblxuXHRcdHJldHVybiBfY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCA/IF9waXhlbFJhdGlvIDogMTtcblxuXHR9XG5cblx0Ly8gaW5pdGlhbGl6ZVxuXG5cdHZhciBfZ2w7XG5cblx0dHJ5IHtcblxuXHRcdHZhciBjb250ZXh0QXR0cmlidXRlcyA9IHtcblx0XHRcdGFscGhhOiBfYWxwaGEsXG5cdFx0XHRkZXB0aDogX2RlcHRoLFxuXHRcdFx0c3RlbmNpbDogX3N0ZW5jaWwsXG5cdFx0XHRhbnRpYWxpYXM6IF9hbnRpYWxpYXMsXG5cdFx0XHRwcmVtdWx0aXBsaWVkQWxwaGE6IF9wcmVtdWx0aXBsaWVkQWxwaGEsXG5cdFx0XHRwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsXG5cdFx0XHRwb3dlclByZWZlcmVuY2U6IF9wb3dlclByZWZlcmVuY2Vcblx0XHR9O1xuXG5cdFx0Ly8gZXZlbnQgbGlzdGVuZXJzIG11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgV2ViR0wgY29udGV4dCBpcyBjcmVhdGVkLCBzZWUgIzEyNzUzXG5cblx0XHRfY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0Jywgb25Db250ZXh0TG9zdCwgZmFsc2UgKTtcblx0XHRfY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIG9uQ29udGV4dFJlc3RvcmUsIGZhbHNlICk7XG5cblx0XHRfZ2wgPSBfY29udGV4dCB8fCBfY2FudmFzLmdldENvbnRleHQoICd3ZWJnbCcsIGNvbnRleHRBdHRyaWJ1dGVzICkgfHwgX2NhbnZhcy5nZXRDb250ZXh0KCAnZXhwZXJpbWVudGFsLXdlYmdsJywgY29udGV4dEF0dHJpYnV0ZXMgKTtcblxuXHRcdGlmICggX2dsID09PSBudWxsICkge1xuXG5cdFx0XHRpZiAoIF9jYW52YXMuZ2V0Q29udGV4dCggJ3dlYmdsJyApICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuJyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBTb21lIGV4cGVyaW1lbnRhbC13ZWJnbCBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IGhhdmUgZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0XG5cblx0XHRpZiAoIF9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0X2dsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRyZXR1cm4geyAncmFuZ2VNaW4nOiAxLCAncmFuZ2VNYXgnOiAxLCAncHJlY2lzaW9uJzogMSB9O1xuXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAnICsgZXJyb3IubWVzc2FnZSApO1xuXG5cdH1cblxuXHR2YXIgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzLCBzdGF0ZSwgaW5mbztcblx0dmFyIHByb3BlcnRpZXMsIHRleHR1cmVzLCBhdHRyaWJ1dGVzLCBnZW9tZXRyaWVzLCBvYmplY3RzO1xuXHR2YXIgcHJvZ3JhbUNhY2hlLCByZW5kZXJMaXN0cywgcmVuZGVyU3RhdGVzO1xuXG5cdHZhciBiYWNrZ3JvdW5kLCBtb3JwaHRhcmdldHMsIGJ1ZmZlclJlbmRlcmVyLCBpbmRleGVkQnVmZmVyUmVuZGVyZXI7XG5cblx0dmFyIHV0aWxzO1xuXG5cdGZ1bmN0aW9uIGluaXRHTENvbnRleHQoKSB7XG5cblx0XHRleHRlbnNpb25zID0gbmV3IFdlYkdMRXh0ZW5zaW9ucyggX2dsICk7XG5cblx0XHRjYXBhYmlsaXRpZXMgPSBuZXcgV2ViR0xDYXBhYmlsaXRpZXMoIF9nbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycyApO1xuXG5cdFx0aWYgKCAhIGNhcGFiaWxpdGllcy5pc1dlYkdMMiApIHtcblxuXHRcdFx0ZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXHRcdFx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTtcblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInICk7XG5cdFx0XHRleHRlbnNpb25zLmdldCggJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcycgKTtcblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX2VsZW1lbnRfaW5kZXhfdWludCcgKTtcblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApO1xuXG5cdFx0dXRpbHMgPSBuZXcgV2ViR0xVdGlscyggX2dsLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKTtcblxuXHRcdHN0YXRlID0gbmV3IFdlYkdMU3RhdGUoIF9nbCwgZXh0ZW5zaW9ucywgdXRpbHMsIGNhcGFiaWxpdGllcyApO1xuXHRcdHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7XG5cdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblxuXHRcdGluZm8gPSBuZXcgV2ViR0xJbmZvKCBfZ2wgKTtcblx0XHRwcm9wZXJ0aWVzID0gbmV3IFdlYkdMUHJvcGVydGllcygpO1xuXHRcdHRleHR1cmVzID0gbmV3IFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgdXRpbHMsIGluZm8gKTtcblx0XHRhdHRyaWJ1dGVzID0gbmV3IFdlYkdMQXR0cmlidXRlcyggX2dsICk7XG5cdFx0Z2VvbWV0cmllcyA9IG5ldyBXZWJHTEdlb21ldHJpZXMoIF9nbCwgYXR0cmlidXRlcywgaW5mbyApO1xuXHRcdG9iamVjdHMgPSBuZXcgV2ViR0xPYmplY3RzKCBnZW9tZXRyaWVzLCBpbmZvICk7XG5cdFx0bW9ycGh0YXJnZXRzID0gbmV3IFdlYkdMTW9ycGh0YXJnZXRzKCBfZ2wgKTtcblx0XHRwcm9ncmFtQ2FjaGUgPSBuZXcgV2ViR0xQcm9ncmFtcyggX3RoaXMsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApO1xuXHRcdHJlbmRlckxpc3RzID0gbmV3IFdlYkdMUmVuZGVyTGlzdHMoKTtcblx0XHRyZW5kZXJTdGF0ZXMgPSBuZXcgV2ViR0xSZW5kZXJTdGF0ZXMoKTtcblxuXHRcdGJhY2tncm91bmQgPSBuZXcgV2ViR0xCYWNrZ3JvdW5kKCBfdGhpcywgc3RhdGUsIG9iamVjdHMsIF9wcmVtdWx0aXBsaWVkQWxwaGEgKTtcblxuXHRcdGJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMQnVmZmVyUmVuZGVyZXIoIF9nbCwgZXh0ZW5zaW9ucywgaW5mbywgY2FwYWJpbGl0aWVzICk7XG5cdFx0aW5kZXhlZEJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIGluZm8sIGNhcGFiaWxpdGllcyApO1xuXG5cdFx0aW5mby5wcm9ncmFtcyA9IHByb2dyYW1DYWNoZS5wcm9ncmFtcztcblxuXHRcdF90aGlzLmNvbnRleHQgPSBfZ2w7XG5cdFx0X3RoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzO1xuXHRcdF90aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zO1xuXHRcdF90aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuXHRcdF90aGlzLnJlbmRlckxpc3RzID0gcmVuZGVyTGlzdHM7XG5cdFx0X3RoaXMuc3RhdGUgPSBzdGF0ZTtcblx0XHRfdGhpcy5pbmZvID0gaW5mbztcblxuXHR9XG5cblx0aW5pdEdMQ29udGV4dCgpO1xuXG5cdC8vIHZyXG5cblx0dmFyIHZyID0gKCAneHInIGluIG5hdmlnYXRvciApID8gbmV3IFdlYlhSTWFuYWdlciggX3RoaXMgKSA6IG5ldyBXZWJWUk1hbmFnZXIoIF90aGlzICk7XG5cblx0dGhpcy52ciA9IHZyO1xuXG5cdC8vIHNoYWRvdyBtYXBcblxuXHR2YXIgc2hhZG93TWFwID0gbmV3IFdlYkdMU2hhZG93TWFwKCBfdGhpcywgb2JqZWN0cywgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7XG5cblx0dGhpcy5zaGFkb3dNYXAgPSBzaGFkb3dNYXA7XG5cblx0Ly8gQVBJXG5cblx0dGhpcy5nZXRDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9nbDtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2dsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XG5cblx0fTtcblxuXHR0aGlzLmZvcmNlQ29udGV4dExvc3MgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XG5cdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ubG9zZUNvbnRleHQoKTtcblxuXHR9O1xuXG5cdHRoaXMuZm9yY2VDb250ZXh0UmVzdG9yZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2xvc2VfY29udGV4dCcgKTtcblx0XHRpZiAoIGV4dGVuc2lvbiApIGV4dGVuc2lvbi5yZXN0b3JlQ29udGV4dCgpO1xuXG5cdH07XG5cblx0dGhpcy5nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9waXhlbFJhdGlvO1xuXG5cdH07XG5cblx0dGhpcy5zZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdF9waXhlbFJhdGlvID0gdmFsdWU7XG5cblx0XHR0aGlzLnNldFNpemUoIF93aWR0aCwgX2hlaWdodCwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U2l6ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR3aWR0aDogX3dpZHRoLFxuXHRcdFx0aGVpZ2h0OiBfaGVpZ2h0XG5cdFx0fTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2l6ZSA9IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCwgdXBkYXRlU3R5bGUgKSB7XG5cblx0XHRpZiAoIHZyLmlzUHJlc2VudGluZygpICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBDYW5cXCd0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdF93aWR0aCA9IHdpZHRoO1xuXHRcdF9oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRfY2FudmFzLndpZHRoID0gd2lkdGggKiBfcGl4ZWxSYXRpbztcblx0XHRfY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIF9waXhlbFJhdGlvO1xuXG5cdFx0aWYgKCB1cGRhdGVTdHlsZSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdF9jYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG5cdFx0XHRfY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fTtcblxuXHR0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHdpZHRoOiBfd2lkdGggKiBfcGl4ZWxSYXRpbyxcblx0XHRcdGhlaWdodDogX2hlaWdodCAqIF9waXhlbFJhdGlvXG5cdFx0fTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0RHJhd2luZ0J1ZmZlclNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHBpeGVsUmF0aW8gKSB7XG5cblx0XHRfd2lkdGggPSB3aWR0aDtcblx0XHRfaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0X3BpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xuXG5cdFx0X2NhbnZhcy53aWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcblx0XHRfY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XG5cblx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fTtcblxuXHR0aGlzLmdldEN1cnJlbnRWaWV3cG9ydCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfY3VycmVudFZpZXdwb3J0O1xuXG5cdH07XG5cblx0dGhpcy5zZXRWaWV3cG9ydCA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdF92aWV3cG9ydC5zZXQoIHgsIF9oZWlnaHQgLSB5IC0gaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0ICk7XG5cdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Npc3NvciA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdF9zY2lzc29yLnNldCggeCwgX2hlaWdodCAtIHkgLSBoZWlnaHQsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHRzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcblxuXHRcdHN0YXRlLnNldFNjaXNzb3JUZXN0KCBfc2Npc3NvclRlc3QgPSBib29sZWFuICk7XG5cblx0fTtcblxuXHQvLyBDbGVhcmluZ1xuXG5cdHRoaXMuZ2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBiYWNrZ3JvdW5kLmdldENsZWFyQ29sb3IoKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGJhY2tncm91bmQuc2V0Q2xlYXJDb2xvci5hcHBseSggYmFja2dyb3VuZCwgYXJndW1lbnRzICk7XG5cblx0fTtcblxuXHR0aGlzLmdldENsZWFyQWxwaGEgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gYmFja2dyb3VuZC5nZXRDbGVhckFscGhhKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldENsZWFyQWxwaGEgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRiYWNrZ3JvdW5kLnNldENsZWFyQWxwaGEuYXBwbHkoIGJhY2tncm91bmQsIGFyZ3VtZW50cyApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhciA9IGZ1bmN0aW9uICggY29sb3IsIGRlcHRoLCBzdGVuY2lsICkge1xuXG5cdFx0dmFyIGJpdHMgPSAwO1xuXG5cdFx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkIHx8IGNvbG9yICkgYml0cyB8PSBfZ2wuQ09MT1JfQlVGRkVSX0JJVDtcblx0XHRpZiAoIGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggKSBiaXRzIHw9IF9nbC5ERVBUSF9CVUZGRVJfQklUO1xuXHRcdGlmICggc3RlbmNpbCA9PT0gdW5kZWZpbmVkIHx8IHN0ZW5jaWwgKSBiaXRzIHw9IF9nbC5TVEVOQ0lMX0JVRkZFUl9CSVQ7XG5cblx0XHRfZ2wuY2xlYXIoIGJpdHMgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0Q2xlYXJDb2xvcjIgPSBmdW5jdGlvbiAocixnLGIsYWxwaGEpIHtcblxuXHRcdF9nbC5jbGVhckNvbG9yKCByLGcsYixhbHBoYSApO1xuXHRcdF9nbC5jbGVhcihfZ2wuQ09MT1JfQlVGRkVSX0JJVCB8IF9nbC5ERVBUSF9CVUZGRVJfQklUIHwgX2dsLlNURU5DSUxfQlVGRkVSX0JJVCk7XG5cdFx0X2dsLmVuYWJsZShfZ2wuREVQVEhfVEVTVCk7XG5cdFx0Ly9fZ2wuY2xlYXIoX2dsLkNPTE9SX0JVRkZFUl9CSVQgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY2xlYXIoIHRydWUsIGZhbHNlLCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhckRlcHRoID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggZmFsc2UsIHRydWUsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyU3RlbmNpbCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY2xlYXIoIGZhbHNlLCBmYWxzZSwgdHJ1ZSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhclRhcmdldCA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7XG5cblx0XHR0aGlzLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dGhpcy5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7XG5cblx0fTtcblxuXHQvL1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdF9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXHRcdF9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcblxuXHRcdHJlbmRlckxpc3RzLmRpc3Bvc2UoKTtcblx0XHRyZW5kZXJTdGF0ZXMuZGlzcG9zZSgpO1xuXHRcdHByb3BlcnRpZXMuZGlzcG9zZSgpO1xuXHRcdG9iamVjdHMuZGlzcG9zZSgpO1xuXG5cdFx0dnIuZGlzcG9zZSgpO1xuXG5cdFx0YW5pbWF0aW9uLnN0b3AoKTtcblxuXHR9O1xuXG5cdC8vIEV2ZW50c1xuXG5cdGZ1bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkge1xuXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LicgKTtcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gdHJ1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25Db250ZXh0UmVzdG9yZSggLyogZXZlbnQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuJyApO1xuXG5cdFx0X2lzQ29udGV4dExvc3QgPSBmYWxzZTtcblxuXHRcdGluaXRHTENvbnRleHQoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIG1hdGVyaWFsID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0bWF0ZXJpYWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXHQvLyBCdWZmZXIgZGVhbGxvY2F0aW9uXG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApIHtcblxuXHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggbWF0ZXJpYWwgKTtcblxuXHR9XG5cblxuXHRmdW5jdGlvbiByZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApIHtcblxuXHRcdHZhciBwcm9ncmFtSW5mbyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLnByb2dyYW07XG5cblx0XHRtYXRlcmlhbC5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCBwcm9ncmFtSW5mbyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwcm9ncmFtQ2FjaGUucmVsZWFzZVByb2dyYW0oIHByb2dyYW1JbmZvICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEJ1ZmZlciByZW5kZXJpbmdcblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSApIHtcblxuXHRcdG9iamVjdC5yZW5kZXIoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRfdGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSApO1xuXG5cdFx0fSApO1xuXG5cdH1cblxuXHR0aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZSA9IGZ1bmN0aW9uICggb2JqZWN0LCBwcm9ncmFtICkge1xuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblxuXHRcdHZhciBidWZmZXJzID0gcHJvcGVydGllcy5nZXQoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICYmICEgYnVmZmVycy5wb3NpdGlvbiApIGJ1ZmZlcnMucG9zaXRpb24gPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyAmJiAhIGJ1ZmZlcnMubm9ybWFsICkgYnVmZmVycy5ub3JtYWwgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmICEgYnVmZmVycy51diApIGJ1ZmZlcnMudXYgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmICEgYnVmZmVycy5jb2xvciApIGJ1ZmZlcnMuY29sb3IgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdGlmICggb2JqZWN0Lmhhc1Bvc2l0aW9ucyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMucG9zaXRpb24gKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QucG9zaXRpb25BcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uICk7XG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMucG9zaXRpb24sIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc05vcm1hbHMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLm5vcm1hbCApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC5ub3JtYWxBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCApO1xuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy51diApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC51dkFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7XG5cblx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMudXYgKTtcblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy51diwgMiwgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy5jb2xvciApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC5jb2xvckFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7XG5cblx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IgKTtcblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5jb2xvciwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHRcdF9nbC5kcmF3QXJyYXlzKCBfZ2wuVFJJQU5HTEVTLCAwLCBvYmplY3QuY291bnQgKTtcblxuXHRcdG9iamVjdC5jb3VudCA9IDA7XG5cblx0fTtcblxuXHR0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCA9IGZ1bmN0aW9uICggY2FtZXJhLCBmb2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApIHtcblxuXHRcdHZhciBmcm9udEZhY2VDVyA9ICggb2JqZWN0LmlzTWVzaCAmJiBvYmplY3Qubm9ybWFsTWF0cml4LmRldGVybWluYW50KCkgPCAwICk7XG5cblx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICk7XG5cblx0XHR2YXIgdXBkYXRlQnVmZmVycyA9IGZhbHNlO1xuXG5cdFx0aWYgKCBfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS5nZW9tZXRyeSAhPT0gZ2VvbWV0cnkuaWQgfHxcblx0XHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtLnByb2dyYW0gIT09IHByb2dyYW0uaWQgfHxcblx0XHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtLndpcmVmcmFtZSAhPT0gKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSApIHtcblxuXHRcdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0uZ2VvbWV0cnkgPSBnZW9tZXRyeS5pZDtcblx0XHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtLnByb2dyYW0gPSBwcm9ncmFtLmlkO1xuXHRcdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0ud2lyZWZyYW1lID0gbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlO1xuXHRcdFx0dXBkYXRlQnVmZmVycyA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXMgKSB7XG5cblx0XHRcdG1vcnBodGFyZ2V0cy51cGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBwcm9ncmFtICk7XG5cblx0XHRcdHVwZGF0ZUJ1ZmZlcnMgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0dmFyIHJhbmdlRmFjdG9yID0gMTtcblxuXHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkge1xuXG5cdFx0XHRpbmRleCA9IGdlb21ldHJpZXMuZ2V0V2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApO1xuXHRcdFx0cmFuZ2VGYWN0b3IgPSAyO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGF0dHJpYnV0ZTtcblx0XHR2YXIgcmVuZGVyZXIgPSBidWZmZXJSZW5kZXJlcjtcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBpbmRleCApO1xuXG5cdFx0XHRyZW5kZXJlciA9IGluZGV4ZWRCdWZmZXJSZW5kZXJlcjtcblx0XHRcdHJlbmRlcmVyLnNldEluZGV4KCBhdHRyaWJ1dGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdXBkYXRlQnVmZmVycyApIHtcblxuXHRcdFx0c2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnkgKTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBhdHRyaWJ1dGUuYnVmZmVyICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgZGF0YUNvdW50ID0gSW5maW5pdHk7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRkYXRhQ291bnQgPSBpbmRleC5jb3VudDtcblxuXHRcdH0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGRhdGFDb3VudCA9IHBvc2l0aW9uLmNvdW50O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHJhbmdlU3RhcnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2Uuc3RhcnQgKiByYW5nZUZhY3Rvcjtcblx0XHR2YXIgcmFuZ2VDb3VudCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5jb3VudCAqIHJhbmdlRmFjdG9yO1xuXG5cdFx0dmFyIGdyb3VwU3RhcnQgPSBncm91cCAhPT0gbnVsbCA/IGdyb3VwLnN0YXJ0ICogcmFuZ2VGYWN0b3IgOiAwO1xuXHRcdHZhciBncm91cENvdW50ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5jb3VudCAqIHJhbmdlRmFjdG9yIDogSW5maW5pdHk7XG5cblx0XHR2YXIgZHJhd1N0YXJ0ID0gTWF0aC5tYXgoIHJhbmdlU3RhcnQsIGdyb3VwU3RhcnQgKTtcblx0XHR2YXIgZHJhd0VuZCA9IE1hdGgubWluKCBkYXRhQ291bnQsIHJhbmdlU3RhcnQgKyByYW5nZUNvdW50LCBncm91cFN0YXJ0ICsgZ3JvdXBDb3VudCApIC0gMTtcblxuXHRcdHZhciBkcmF3Q291bnQgPSBNYXRoLm1heCggMCwgZHJhd0VuZCAtIGRyYXdTdGFydCArIDEgKTtcblxuXHRcdGlmICggZHJhd0NvdW50ID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggb2JqZWN0LmlzTWVzaCApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c3dpdGNoICggb2JqZWN0LmRyYXdNb2RlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSBUcmlhbmdsZXNEcmF3TW9kZTpcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRVMgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBUcmlhbmdsZVN0cmlwRHJhd01vZGU6XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVfU1RSSVAgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBUcmlhbmdsZUZhbkRyYXdNb2RlOlxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFX0ZBTiApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmUgKSB7XG5cblx0XHRcdHZhciBsaW5lV2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGg7XG5cblx0XHRcdGlmICggbGluZVdpZHRoID09PSB1bmRlZmluZWQgKSBsaW5lV2lkdGggPSAxOyAvLyBOb3QgdXNpbmcgTGluZSpNYXRlcmlhbFxuXG5cdFx0XHRzdGF0ZS5zZXRMaW5lV2lkdGgoIGxpbmVXaWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSApO1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpbmVTZWdtZW50cyApIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORVMgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVfTE9PUCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FX1NUUklQICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1BvaW50cyApIHtcblxuXHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlBPSU5UUyApO1xuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzU3ByaXRlICkge1xuXG5cdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVTICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPiAwICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIGRyYXdTdGFydCwgZHJhd0NvdW50ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlcmVyLnJlbmRlciggZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdGZ1bmN0aW9uIHNldHVwVmVydGV4QXR0cmlidXRlcyggbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICkge1xuXG5cdFx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICYgISBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cblx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0dmFyIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IG1hdGVyaWFsLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGUgPj0gMCApIHtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBnZW9tZXRyeUF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgbm9ybWFsaXplZCA9IGdlb21ldHJ5QXR0cmlidXRlLm5vcm1hbGl6ZWQ7XG5cdFx0XHRcdFx0dmFyIHNpemUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnlBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdC8vIFRPRE8gQXR0cmlidXRlIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGNvbnRleHQgcmVzdG9yZVxuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0dmFyIGJ1ZmZlciA9IGF0dHJpYnV0ZS5idWZmZXI7XG5cdFx0XHRcdFx0dmFyIHR5cGUgPSBhdHRyaWJ1dGUudHlwZTtcblx0XHRcdFx0XHR2YXIgYnl0ZXNQZXJFbGVtZW50ID0gYXR0cmlidXRlLmJ5dGVzUGVyRWxlbWVudDtcblxuXHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBnZW9tZXRyeUF0dHJpYnV0ZS5kYXRhO1xuXHRcdFx0XHRcdFx0dmFyIHN0cmlkZSA9IGRhdGEuc3RyaWRlO1xuXHRcdFx0XHRcdFx0dmFyIG9mZnNldCA9IGdlb21ldHJ5QXR0cmlidXRlLm9mZnNldDtcblxuXHRcdFx0XHRcdFx0aWYgKCBkYXRhICYmIGRhdGEuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9IGRhdGEubWVzaFBlckF0dHJpYnV0ZSAqIGRhdGEuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUgKiBieXRlc1BlckVsZW1lbnQsIG9mZnNldCAqIGJ5dGVzUGVyRWxlbWVudCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICogZ2VvbWV0cnlBdHRyaWJ1dGUuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCAwLCAwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmFsdWUgPSBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0c3dpdGNoICggdmFsdWUubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliMmZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliM2Z2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgNDpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjFmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHR9XG5cblx0Ly8gQ29tcGlsZVxuXG5cdHRoaXMuY29tcGlsZSA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuaW5pdCgpO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICkge1xuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoIGNhbWVyYSApO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5tYXRlcmlhbCApIHtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdC5tYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0Lm1hdGVyaWFsLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWxbIGkgXSwgc2NlbmUuZm9nLCBvYmplY3QgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWwsIHNjZW5lLmZvZywgb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0fTtcblxuXHQvLyBBbmltYXRpb24gTG9vcFxuXG5cdHZhciBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBudWxsO1xuXG5cdGZ1bmN0aW9uIG9uQW5pbWF0aW9uRnJhbWUoIHRpbWUgKSB7XG5cblx0XHRpZiAoIHZyLmlzUHJlc2VudGluZygpICkgcmV0dXJuO1xuXHRcdGlmICggb25BbmltYXRpb25GcmFtZUNhbGxiYWNrICkgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrKCB0aW1lICk7XG5cblx0fVxuXG5cdHZhciBhbmltYXRpb24gPSBuZXcgV2ViR0xBbmltYXRpb24oKTtcblx0YW5pbWF0aW9uLnNldEFuaW1hdGlvbkxvb3AoIG9uQW5pbWF0aW9uRnJhbWUgKTtcblxuXHRpZiAoIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICkgYW5pbWF0aW9uLnNldENvbnRleHQoIHdpbmRvdyApO1xuXG5cdHRoaXMuc2V0QW5pbWF0aW9uTG9vcCA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBjYWxsYmFjaztcblx0XHR2ci5zZXRBbmltYXRpb25Mb29wKCBjYWxsYmFjayApO1xuXG5cdFx0YW5pbWF0aW9uLnN0YXJ0KCk7XG5cblx0fTtcblxuXHQvLyBSZW5kZXJpbmdcblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0LCBmb3JjZUNsZWFyICkge1xuXG5cdFx0aWYgKCAhICggY2FtZXJhICYmIGNhbWVyYS5pc0NhbWVyYSApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggX2lzQ29udGV4dExvc3QgKSByZXR1cm47XG5cblx0XHQvLyByZXNldCBjYWNoaW5nIGZvciB0aGlzIGZyYW1lXG5cblx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS5nZW9tZXRyeSA9IG51bGw7XG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0ucHJvZ3JhbSA9IG51bGw7XG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0ud2lyZWZyYW1lID0gZmFsc2U7XG5cdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gLSAxO1xuXHRcdF9jdXJyZW50Q2FtZXJhID0gbnVsbDtcblxuXHRcdC8vIHVwZGF0ZSBzY2VuZSBncmFwaFxuXG5cdFx0aWYgKCBzY2VuZS5hdXRvVXBkYXRlID09PSB0cnVlICkgc2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdC8vIHVwZGF0ZSBjYW1lcmEgbWF0cmljZXMgYW5kIGZydXN0dW1cblxuXHRcdGlmICggY2FtZXJhLnBhcmVudCA9PT0gbnVsbCApIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0aWYgKCB2ci5lbmFibGVkICkge1xuXG5cdFx0XHRjYW1lcmEgPSB2ci5nZXRDYW1lcmEoIGNhbWVyYSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuaW5pdCgpO1xuXG5cdFx0c2NlbmUub25CZWZvcmVSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0X2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdF9sb2NhbENsaXBwaW5nRW5hYmxlZCA9IHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQ7XG5cdFx0X2NsaXBwaW5nRW5hYmxlZCA9IF9jbGlwcGluZy5pbml0KCB0aGlzLmNsaXBwaW5nUGxhbmVzLCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQsIGNhbWVyYSApO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QgPSByZW5kZXJMaXN0cy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRjdXJyZW50UmVuZGVyTGlzdC5pbml0KCk7XG5cblx0XHRwcm9qZWN0T2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBfdGhpcy5zb3J0T2JqZWN0cyApO1xuXG5cdFx0aWYgKCBfdGhpcy5zb3J0T2JqZWN0cyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y3VycmVudFJlbmRlckxpc3Quc29ydCgpO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCApIF9jbGlwcGluZy5iZWdpblNoYWRvd3MoKTtcblxuXHRcdHZhciBzaGFkb3dzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc2hhZG93c0FycmF5O1xuXG5cdFx0c2hhZG93TWFwLnJlbmRlciggc2hhZG93c0FycmF5LCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoIGNhbWVyYSApO1xuXG5cdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmVuZFNoYWRvd3MoKTtcblxuXHRcdC8vXG5cblx0XHRpZiAoIHRoaXMuaW5mby5hdXRvUmVzZXQgKSB0aGlzLmluZm8ucmVzZXQoKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldCA9IG51bGw7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHQvL1xuXG5cdFx0YmFja2dyb3VuZC5yZW5kZXIoIGN1cnJlbnRSZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBmb3JjZUNsZWFyICk7XG5cblx0XHQvLyByZW5kZXIgc2NlbmVcblxuXHRcdHZhciBvcGFxdWVPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3Qub3BhcXVlO1xuXHRcdHZhciB0cmFuc3BhcmVudE9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC50cmFuc3BhcmVudDtcblxuXHRcdGlmICggc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCApIHtcblxuXHRcdFx0dmFyIG92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsO1xuXG5cdFx0XHRpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApO1xuXHRcdFx0aWYgKCB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBvcGFxdWUgcGFzcyAoZnJvbnQtdG8tYmFjayBvcmRlcilcblxuXHRcdFx0aWYgKCBvcGFxdWVPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdFx0Ly8gdHJhbnNwYXJlbnQgcGFzcyAoYmFjay10by1mcm9udCBvcmRlcilcblxuXHRcdFx0aWYgKCB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHQvLyBHZW5lcmF0ZSBtaXBtYXAgaWYgd2UncmUgdXNpbmcgYW55IGtpbmQgb2YgbWlwbWFwIGZpbHRlcmluZ1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdHRleHR1cmVzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgZGVwdGggYnVmZmVyIHdyaXRpbmcgaXMgZW5hYmxlZCBzbyBpdCBjYW4gYmUgY2xlYXJlZCBvbiBuZXh0IHJlbmRlclxuXG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCB0cnVlICk7XG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKCB0cnVlICk7XG5cblx0XHRzdGF0ZS5zZXRQb2x5Z29uT2Zmc2V0KCBmYWxzZSApO1xuXG5cdFx0c2NlbmUub25BZnRlclJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdGlmICggdnIuZW5hYmxlZCApIHtcblxuXHRcdFx0dnIuc3VibWl0RnJhbWUoKTtcblxuXHRcdH1cblxuXHRcdC8vIF9nbC5maW5pc2goKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSBudWxsO1xuXG5cdH07XG5cblx0Lypcblx0Ly8gVE9ETyBEdXBsaWNhdGVkIGNvZGUgKEZydXN0dW0pXG5cblx0dmFyIF9zcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0ZnVuY3Rpb24gaXNPYmplY3RWaWV3YWJsZSggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApXG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdF9zcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKS5cblx0XHRhcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIGlzU3BoZXJlVmlld2FibGUoIF9zcGhlcmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaXNTcHJpdGVWaWV3YWJsZSggc3ByaXRlICkge1xuXG5cdFx0X3NwaGVyZS5jZW50ZXIuc2V0KCAwLCAwLCAwICk7XG5cdFx0X3NwaGVyZS5yYWRpdXMgPSAwLjcwNzEwNjc4MTE4NjU0NzY7XG5cdFx0X3NwaGVyZS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIGlzU3BoZXJlVmlld2FibGUoIF9zcGhlcmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaXNTcGhlcmVWaWV3YWJsZSggc3BoZXJlICkge1xuXG5cdFx0aWYgKCAhIF9mcnVzdHVtLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dmFyIG51bVBsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7XG5cblx0XHRpZiAoIG51bVBsYW5lcyA9PT0gMCApIHJldHVybiB0cnVlO1xuXG5cdFx0dmFyIHBsYW5lcyA9IF90aGlzLmNsaXBwaW5nUGxhbmVzLFxuXG5cdFx0XHRjZW50ZXIgPSBzcGhlcmUuY2VudGVyLFxuXHRcdFx0bmVnUmFkID0gLSBzcGhlcmUucmFkaXVzLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRkbyB7XG5cblx0XHRcdC8vIG91dCB3aGVuIGRlZXBlciB0aGFuIHJhZGl1cyBpbiB0aGUgbmVnYXRpdmUgaGFsZnNwYWNlXG5cdFx0XHRpZiAoIHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggY2VudGVyICkgPCBuZWdSYWQgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR9IHdoaWxlICggKysgaSAhPT0gbnVtUGxhbmVzICk7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9XG5cdCovXG5cblx0ZnVuY3Rpb24gcHJvamVjdE9iamVjdCggb2JqZWN0LCBjYW1lcmEsIHNvcnRPYmplY3RzICkge1xuXG5cdFx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHR2YXIgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApO1xuXG5cdFx0aWYgKCB2aXNpYmxlICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICkge1xuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNTcHJpdGUgKSB7XG5cblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNTcHJpdGUoIG9iamVjdCApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHRcdHZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgKSB7XG5cblx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkIClcblx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgbnVsbCwgb2JqZWN0Lm1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSB7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi51cGRhdGUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHRcdHZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHRcdFx0XHRcdHZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgZ3JvdXBNYXRlcmlhbCwgX3ZlY3RvcjMueiwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRwcm9qZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCBjYW1lcmEsIHNvcnRPYmplY3RzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSByZW5kZXJMaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciByZW5kZXJJdGVtID0gcmVuZGVyTGlzdFsgaSBdO1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gcmVuZGVySXRlbS5vYmplY3Q7XG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbCA9PT0gdW5kZWZpbmVkID8gcmVuZGVySXRlbS5tYXRlcmlhbCA6IG92ZXJyaWRlTWF0ZXJpYWw7XG5cdFx0XHR2YXIgZ3JvdXAgPSByZW5kZXJJdGVtLmdyb3VwO1xuXG5cdFx0XHRpZiAoIGNhbWVyYS5pc0FycmF5Q2FtZXJhICkge1xuXG5cdFx0XHRcdF9jdXJyZW50QXJyYXlDYW1lcmEgPSBjYW1lcmE7XG5cblx0XHRcdFx0dmFyIGNhbWVyYXMgPSBjYW1lcmEuY2FtZXJhcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gY2FtZXJhcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjYW1lcmEyID0gY2FtZXJhc1sgaiBdO1xuXG5cdFx0XHRcdFx0aWYgKCBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYTIubGF5ZXJzICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggJ3ZpZXdwb3J0JyBpbiBjYW1lcmEyICkgeyAvLyBYUlxuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIGNhbWVyYTIudmlld3BvcnQgKSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBib3VuZHMgPSBjYW1lcmEyLmJvdW5kcztcblxuXHRcdFx0XHRcdFx0XHR2YXIgeCA9IGJvdW5kcy54ICogX3dpZHRoO1xuXHRcdFx0XHRcdFx0XHR2YXIgeSA9IGJvdW5kcy55ICogX2hlaWdodDtcblx0XHRcdFx0XHRcdFx0dmFyIHdpZHRoID0gYm91bmRzLnogKiBfd2lkdGg7XG5cdFx0XHRcdFx0XHRcdHZhciBoZWlnaHQgPSBib3VuZHMudyAqIF9oZWlnaHQ7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYTIsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2N1cnJlbnRBcnJheUNhbWVyYSA9IG51bGw7XG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApIHtcblxuXHRcdG9iamVjdC5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKTtcblxuXHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cdFx0b2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblxuXHRcdGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkge1xuXG5cdFx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwgKTtcblxuXHRcdFx0dmFyIHByb2dyYW0gPSBzZXRQcm9ncmFtKCBjYW1lcmEsIHNjZW5lLmZvZywgbWF0ZXJpYWwsIG9iamVjdCApO1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS5nZW9tZXRyeSA9IG51bGw7XG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS5wcm9ncmFtID0gbnVsbDtcblx0XHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtLndpcmVmcmFtZSA9IGZhbHNlO1xuXG5cdFx0XHRyZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIHNjZW5lLmZvZywgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICk7XG5cblx0XHR9XG5cblx0XHRvYmplY3Qub25BZnRlclJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaW5pdE1hdGVyaWFsKCBtYXRlcmlhbCwgZm9nLCBvYmplY3QgKSB7XG5cblx0XHR2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cblx0XHR2YXIgbGlnaHRzID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLmxpZ2h0cztcblx0XHR2YXIgc2hhZG93c0FycmF5ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnNoYWRvd3NBcnJheTtcblxuXHRcdHZhciBsaWdodHNIYXNoID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c0hhc2g7XG5cdFx0dmFyIGxpZ2h0c1N0YXRlSGFzaCA9IGxpZ2h0cy5zdGF0ZS5oYXNoO1xuXG5cdFx0dmFyIHBhcmFtZXRlcnMgPSBwcm9ncmFtQ2FjaGUuZ2V0UGFyYW1ldGVycyhcblx0XHRcdG1hdGVyaWFsLCBsaWdodHMuc3RhdGUsIHNoYWRvd3NBcnJheSwgZm9nLCBfY2xpcHBpbmcubnVtUGxhbmVzLCBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uLCBvYmplY3QgKTtcblxuXHRcdHZhciBjb2RlID0gcHJvZ3JhbUNhY2hlLmdldFByb2dyYW1Db2RlKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApO1xuXG5cdFx0dmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbTtcblx0XHR2YXIgcHJvZ3JhbUNoYW5nZSA9IHRydWU7XG5cblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbmV3IG1hdGVyaWFsXG5cdFx0XHRtYXRlcmlhbC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XG5cblx0XHR9IGVsc2UgaWYgKCBwcm9ncmFtLmNvZGUgIT09IGNvZGUgKSB7XG5cblx0XHRcdC8vIGNoYW5nZWQgZ2xzbCBvciBwYXJhbWV0ZXJzXG5cdFx0XHRyZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIGlmICggbGlnaHRzSGFzaC5zdGF0ZUlEICE9PSBsaWdodHNTdGF0ZUhhc2guc3RhdGVJRCB8fFxuXHRcdFx0bGlnaHRzSGFzaC5kaXJlY3Rpb25hbExlbmd0aCAhPT0gbGlnaHRzU3RhdGVIYXNoLmRpcmVjdGlvbmFsTGVuZ3RoIHx8XG5cdFx0XHRsaWdodHNIYXNoLnBvaW50TGVuZ3RoICE9PSBsaWdodHNTdGF0ZUhhc2gucG9pbnRMZW5ndGggfHxcblx0XHRcdGxpZ2h0c0hhc2guc3BvdExlbmd0aCAhPT0gbGlnaHRzU3RhdGVIYXNoLnNwb3RMZW5ndGggfHxcblx0XHRcdGxpZ2h0c0hhc2gucmVjdEFyZWFMZW5ndGggIT09IGxpZ2h0c1N0YXRlSGFzaC5yZWN0QXJlYUxlbmd0aCB8fFxuXHRcdFx0bGlnaHRzSGFzaC5oZW1pTGVuZ3RoICE9PSBsaWdodHNTdGF0ZUhhc2guaGVtaUxlbmd0aCB8fFxuXHRcdFx0bGlnaHRzSGFzaC5zaGFkb3dzTGVuZ3RoICE9PSBsaWdodHNTdGF0ZUhhc2guc2hhZG93c0xlbmd0aCApIHtcblxuXHRcdFx0bGlnaHRzSGFzaC5zdGF0ZUlEID0gbGlnaHRzU3RhdGVIYXNoLnN0YXRlSUQ7XG5cdFx0XHRsaWdodHNIYXNoLmRpcmVjdGlvbmFsTGVuZ3RoID0gbGlnaHRzU3RhdGVIYXNoLmRpcmVjdGlvbmFsTGVuZ3RoO1xuXHRcdFx0bGlnaHRzSGFzaC5wb2ludExlbmd0aCA9IGxpZ2h0c1N0YXRlSGFzaC5wb2ludExlbmd0aDtcblx0XHRcdGxpZ2h0c0hhc2guc3BvdExlbmd0aCA9IGxpZ2h0c1N0YXRlSGFzaC5zcG90TGVuZ3RoO1xuXHRcdFx0bGlnaHRzSGFzaC5yZWN0QXJlYUxlbmd0aCA9IGxpZ2h0c1N0YXRlSGFzaC5yZWN0QXJlYUxlbmd0aDtcblx0XHRcdGxpZ2h0c0hhc2guaGVtaUxlbmd0aCA9IGxpZ2h0c1N0YXRlSGFzaC5oZW1pTGVuZ3RoO1xuXHRcdFx0bGlnaHRzSGFzaC5zaGFkb3dzTGVuZ3RoID0gbGlnaHRzU3RhdGVIYXNoLnNoYWRvd3NMZW5ndGg7XG5cblx0XHRcdHByb2dyYW1DaGFuZ2UgPSBmYWxzZTtcblxuXHRcdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gc2FtZSBnbHNsIGFuZCB1bmlmb3JtIGxpc3Rcblx0XHRcdHJldHVybjtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG9ubHkgcmVidWlsZCB1bmlmb3JtIGxpc3Rcblx0XHRcdHByb2dyYW1DaGFuZ2UgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggcHJvZ3JhbUNoYW5nZSApIHtcblxuXHRcdFx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICkge1xuXG5cdFx0XHRcdHZhciBzaGFkZXIgPSBTaGFkZXJMaWJbIHBhcmFtZXRlcnMuc2hhZGVySUQgXTtcblxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyID0ge1xuXHRcdFx0XHRcdG5hbWU6IG1hdGVyaWFsLnR5cGUsXG5cdFx0XHRcdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMuY2xvbmUoIHNoYWRlci51bmlmb3JtcyApLFxuXHRcdFx0XHRcdHZlcnRleFNoYWRlcjogc2hhZGVyLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogc2hhZGVyLmZyYWdtZW50U2hhZGVyXG5cdFx0XHRcdH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciA9IHtcblx0XHRcdFx0XHRuYW1lOiBtYXRlcmlhbC50eXBlLFxuXHRcdFx0XHRcdHVuaWZvcm1zOiBtYXRlcmlhbC51bmlmb3Jtcyxcblx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IG1hdGVyaWFsLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXJcblx0XHRcdFx0fTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbC5vbkJlZm9yZUNvbXBpbGUoIG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIsIF90aGlzICk7XG5cblx0XHRcdC8vIENvbXB1dGluZyBjb2RlIGFnYWluIGFzIG9uQmVmb3JlQ29tcGlsZSBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBzaGFkZXJzXG5cdFx0XHRjb2RlID0gcHJvZ3JhbUNhY2hlLmdldFByb2dyYW1Db2RlKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApO1xuXG5cdFx0XHRwcm9ncmFtID0gcHJvZ3JhbUNhY2hlLmFjcXVpcmVQcm9ncmFtKCBtYXRlcmlhbCwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciwgcGFyYW1ldGVycywgY29kZSApO1xuXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9IHByb2dyYW07XG5cdFx0XHRtYXRlcmlhbC5wcm9ncmFtID0gcHJvZ3JhbTtcblxuXHRcdH1cblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoVGFyZ2V0czsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhUYXJnZXQnICsgaSBdID49IDAgKSB7XG5cblx0XHRcdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoTm9ybWFscyApIHtcblxuXHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgX3RoaXMubWF4TW9ycGhOb3JtYWxzOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggcHJvZ3JhbUF0dHJpYnV0ZXNbICdtb3JwaE5vcm1hbCcgKyBpIF0gPj0gMCApIHtcblxuXHRcdFx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyArKztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciB1bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIudW5pZm9ybXM7XG5cblx0XHRpZiAoICEgbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCAmJlxuXHRcdFx0ISBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRtYXRlcmlhbC5jbGlwcGluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzID0gX2NsaXBwaW5nLm51bVBsYW5lcztcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1JbnRlcnNlY3Rpb24gPSBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uO1xuXHRcdFx0dW5pZm9ybXMuY2xpcHBpbmdQbGFuZXMgPSBfY2xpcHBpbmcudW5pZm9ybTtcblxuXHRcdH1cblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5mb2cgPSBmb2c7XG5cblx0XHQvLyBzdG9yZSB0aGUgbGlnaHQgc2V0dXAgaXQgd2FzIGNyZWF0ZWQgZm9yXG5cdFx0aWYgKCBsaWdodHNIYXNoID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5saWdodHNIYXNoID0gbGlnaHRzSGFzaCA9IHt9O1xuXG5cdFx0fVxuXG5cdFx0bGlnaHRzSGFzaC5zdGF0ZUlEID0gbGlnaHRzU3RhdGVIYXNoLnN0YXRlSUQ7XG5cdFx0bGlnaHRzSGFzaC5kaXJlY3Rpb25hbExlbmd0aCA9IGxpZ2h0c1N0YXRlSGFzaC5kaXJlY3Rpb25hbExlbmd0aDtcblx0XHRsaWdodHNIYXNoLnBvaW50TGVuZ3RoID0gbGlnaHRzU3RhdGVIYXNoLnBvaW50TGVuZ3RoO1xuXHRcdGxpZ2h0c0hhc2guc3BvdExlbmd0aCA9IGxpZ2h0c1N0YXRlSGFzaC5zcG90TGVuZ3RoO1xuXHRcdGxpZ2h0c0hhc2gucmVjdEFyZWFMZW5ndGggPSBsaWdodHNTdGF0ZUhhc2gucmVjdEFyZWFMZW5ndGg7XG5cdFx0bGlnaHRzSGFzaC5oZW1pTGVuZ3RoID0gbGlnaHRzU3RhdGVIYXNoLmhlbWlMZW5ndGg7XG5cdFx0bGlnaHRzSGFzaC5zaGFkb3dzTGVuZ3RoID0gbGlnaHRzU3RhdGVIYXNoLnNoYWRvd3NMZW5ndGg7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0cyApIHtcblxuXHRcdFx0Ly8gd2lyZSB1cCB0aGUgbWF0ZXJpYWwgdG8gdGhpcyByZW5kZXJlcidzIGxpZ2h0aW5nIHN0YXRlXG5cblx0XHRcdHVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLnZhbHVlID0gbGlnaHRzLnN0YXRlLmFtYmllbnQ7XG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbDtcblx0XHRcdHVuaWZvcm1zLnNwb3RMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdDtcblx0XHRcdHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnJlY3RBcmVhO1xuXHRcdFx0dW5pZm9ybXMucG9pbnRMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnQ7XG5cdFx0XHR1bmlmb3Jtcy5oZW1pc3BoZXJlTGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLmhlbWk7XG5cblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg7XG5cdFx0XHR1bmlmb3Jtcy5zcG90U2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3RTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5zcG90U2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3RTaGFkb3dNYXRyaXg7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLnBvaW50U2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93TWF0cml4O1xuXHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IGFkZCBhcmVhIGxpZ2h0cyBzaGFkb3cgaW5mbyB0byB1bmlmb3Jtc1xuXG5cdFx0fVxuXG5cdFx0dmFyIHByb2dVbmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtLmdldFVuaWZvcm1zKCksXG5cdFx0XHR1bmlmb3Jtc0xpc3QgPVxuXHRcdFx0XHRXZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSggcHJvZ1VuaWZvcm1zLnNlcSwgdW5pZm9ybXMgKTtcblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QgPSB1bmlmb3Jtc0xpc3Q7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFByb2dyYW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICkge1xuXG5cdFx0X3VzZWRUZXh0dXJlVW5pdHMgPSAwO1xuXG5cdFx0dmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXHRcdHZhciBsaWdodHMgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUubGlnaHRzO1xuXG5cdFx0dmFyIGxpZ2h0c0hhc2ggPSBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaDtcblx0XHR2YXIgbGlnaHRzU3RhdGVIYXNoID0gbGlnaHRzLnN0YXRlLmhhc2g7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSB7XG5cblx0XHRcdGlmICggX2xvY2FsQ2xpcHBpbmdFbmFibGVkIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdFx0dmFyIHVzZUNhY2hlID1cblx0XHRcdFx0XHRjYW1lcmEgPT09IF9jdXJyZW50Q2FtZXJhICYmXG5cdFx0XHRcdFx0bWF0ZXJpYWwuaWQgPT09IF9jdXJyZW50TWF0ZXJpYWxJZDtcblxuXHRcdFx0XHQvLyB3ZSBtaWdodCB3YW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHNvbWUgQ2xpcHBpbmdHcm91cFxuXHRcdFx0XHQvLyBvYmplY3QgaW5zdGVhZCBvZiB0aGUgbWF0ZXJpYWwsIG9uY2UgaXQgYmVjb21lcyBmZWFzaWJsZVxuXHRcdFx0XHQvLyAoIzg0NjUsICM4Mzc5KVxuXHRcdFx0XHRfY2xpcHBpbmcuc2V0U3RhdGUoXG5cdFx0XHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMsIG1hdGVyaWFsLmNsaXBJbnRlcnNlY3Rpb24sIG1hdGVyaWFsLmNsaXBTaGFkb3dzLFxuXHRcdFx0XHRcdGNhbWVyYSwgbWF0ZXJpYWxQcm9wZXJ0aWVzLCB1c2VDYWNoZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlID09PSBmYWxzZSApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZm9nICYmIG1hdGVyaWFsUHJvcGVydGllcy5mb2cgIT09IGZvZyApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmxpZ2h0cyAmJiAoIGxpZ2h0c0hhc2guc3RhdGVJRCAhPT0gbGlnaHRzU3RhdGVIYXNoLnN0YXRlSUQgfHxcblx0XHRcdFx0bGlnaHRzSGFzaC5kaXJlY3Rpb25hbExlbmd0aCAhPT0gbGlnaHRzU3RhdGVIYXNoLmRpcmVjdGlvbmFsTGVuZ3RoIHx8XG5cdFx0XHRcdGxpZ2h0c0hhc2gucG9pbnRMZW5ndGggIT09IGxpZ2h0c1N0YXRlSGFzaC5wb2ludExlbmd0aCB8fFxuXHRcdFx0XHRsaWdodHNIYXNoLnNwb3RMZW5ndGggIT09IGxpZ2h0c1N0YXRlSGFzaC5zcG90TGVuZ3RoIHx8XG5cdFx0XHRcdGxpZ2h0c0hhc2gucmVjdEFyZWFMZW5ndGggIT09IGxpZ2h0c1N0YXRlSGFzaC5yZWN0QXJlYUxlbmd0aCB8fFxuXHRcdFx0XHRsaWdodHNIYXNoLmhlbWlMZW5ndGggIT09IGxpZ2h0c1N0YXRlSGFzaC5oZW1pTGVuZ3RoIHx8XG5cdFx0XHRcdGxpZ2h0c0hhc2guc2hhZG93c0xlbmd0aCAhPT0gbGlnaHRzU3RhdGVIYXNoLnNoYWRvd3NMZW5ndGggKSApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdCggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzICE9PSBfY2xpcHBpbmcubnVtUGxhbmVzIHx8XG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1JbnRlcnNlY3Rpb24gIT09IF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb24gKSApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubmVlZHNVcGRhdGUgKSB7XG5cblx0XHRcdGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZvZywgb2JqZWN0ICk7XG5cdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHJlZnJlc2hQcm9ncmFtID0gZmFsc2U7XG5cdFx0dmFyIHJlZnJlc2hNYXRlcmlhbCA9IGZhbHNlO1xuXHRcdHZhciByZWZyZXNoTGlnaHRzID0gZmFsc2U7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtLFxuXHRcdFx0cF91bmlmb3JtcyA9IHByb2dyYW0uZ2V0VW5pZm9ybXMoKSxcblx0XHRcdG1fdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLnVuaWZvcm1zO1xuXG5cdFx0aWYgKCBzdGF0ZS51c2VQcm9ncmFtKCBwcm9ncmFtLnByb2dyYW0gKSApIHtcblxuXHRcdFx0cmVmcmVzaFByb2dyYW0gPSB0cnVlO1xuXHRcdFx0cmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTtcblx0XHRcdHJlZnJlc2hMaWdodHMgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5pZCAhPT0gX2N1cnJlbnRNYXRlcmlhbElkICkge1xuXG5cdFx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSBtYXRlcmlhbC5pZDtcblxuXHRcdFx0cmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVmcmVzaFByb2dyYW0gfHwgY2FtZXJhICE9PSBfY3VycmVudENhbWVyYSApIHtcblxuXHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAncHJvamVjdGlvbk1hdHJpeCcsIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdGlmICggY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSB7XG5cblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbG9nRGVwdGhCdWZGQycsXG5cdFx0XHRcdFx0Mi4wIC8gKCBNYXRoLmxvZyggY2FtZXJhLmZhciArIDEuMCApIC8gTWF0aC5MTjIgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIEF2b2lkIHVubmVlZGVkIHVuaWZvcm0gdXBkYXRlcyBwZXIgQXJyYXlDYW1lcmEncyBzdWItY2FtZXJhXG5cblx0XHRcdGlmICggX2N1cnJlbnRDYW1lcmEgIT09ICggX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKSApIHtcblxuXHRcdFx0XHRfY3VycmVudENhbWVyYSA9ICggX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKTtcblxuXHRcdFx0XHQvLyBsaWdodGluZyB1bmlmb3JtcyBkZXBlbmQgb24gdGhlIGNhbWVyYSBzbyBlbmZvcmNlIGFuIHVwZGF0ZVxuXHRcdFx0XHQvLyBub3csIGluIGNhc2UgdGhpcyBtYXRlcmlhbCBzdXBwb3J0cyBsaWdodHMgLSBvciBsYXRlciwgd2hlblxuXHRcdFx0XHQvLyB0aGUgbmV4dCBtYXRlcmlhbCB0aGF0IGRvZXMgZ2V0cyBhY3RpdmF0ZWQ6XG5cblx0XHRcdFx0cmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTtcdFx0Ly8gc2V0IHRvIHRydWUgb24gbWF0ZXJpYWwgY2hhbmdlXG5cdFx0XHRcdHJlZnJlc2hMaWdodHMgPSB0cnVlO1x0XHQvLyByZW1haW5zIHNldCB1bnRpbCB1cGRhdGUgZG9uZVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGxvYWQgbWF0ZXJpYWwgc3BlY2lmaWMgdW5pZm9ybXNcblx0XHRcdC8vIChzaGFkZXIgbWF0ZXJpYWwgYWxzbyBnZXRzIHRoZW0gZm9yIHRoZSBzYWtlIG9mIGdlbmVyaWNpdHkpXG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuZW52TWFwICkge1xuXG5cdFx0XHRcdHZhciB1Q2FtUG9zID0gcF91bmlmb3Jtcy5tYXAuY2FtZXJhUG9zaXRpb247XG5cblx0XHRcdFx0aWYgKCB1Q2FtUG9zICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR1Q2FtUG9zLnNldFZhbHVlKCBfZ2wsXG5cdFx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoQmFzaWNNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndmlld01hdHJpeCcsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbm5pbmcgdW5pZm9ybXMgbXVzdCBiZSBzZXQgZXZlbiBpZiBtYXRlcmlhbCBkaWRuJ3QgY2hhbmdlXG5cdFx0Ly8gYXV0by1zZXR0aW5nIG9mIHRleHR1cmUgdW5pdCBmb3IgYm9uZSB0ZXh0dXJlIG11c3QgZ28gYmVmb3JlIG90aGVyIHRleHR1cmVzXG5cdFx0Ly8gbm90IHN1cmUgd2h5LCBidXQgb3RoZXJ3aXNlIHdlaXJkIHRoaW5ncyBoYXBwZW5cblxuXHRcdGlmICggbWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeCcgKTtcblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeEludmVyc2UnICk7XG5cblx0XHRcdHZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblxuXHRcdFx0aWYgKCBza2VsZXRvbiApIHtcblxuXHRcdFx0XHR2YXIgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcblxuXHRcdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzICkge1xuXG5cdFx0XHRcdFx0aWYgKCBza2VsZXRvbi5ib25lVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHQvLyBsYXlvdXQgKDEgbWF0cml4ID0gNCBwaXhlbHMpXG5cdFx0XHRcdFx0XHQvLyAgICAgIFJHQkEgUkdCQSBSR0JBIFJHQkEgKD0+IGNvbHVtbjEsIGNvbHVtbjIsIGNvbHVtbjMsIGNvbHVtbjQpXG5cdFx0XHRcdFx0XHQvLyAgd2l0aCAgOHg4ICBwaXhlbCB0ZXh0dXJlIG1heCAgIDE2IGJvbmVzICogNCBwaXhlbHMgPSAgKDggKiA4KVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgMTZ4MTYgcGl4ZWwgdGV4dHVyZSBtYXggICA2NCBib25lcyAqIDQgcGl4ZWxzID0gKDE2ICogMTYpXG5cdFx0XHRcdFx0XHQvLyAgICAgICAzMngzMiBwaXhlbCB0ZXh0dXJlIG1heCAgMjU2IGJvbmVzICogNCBwaXhlbHMgPSAoMzIgKiAzMilcblx0XHRcdFx0XHRcdC8vICAgICAgIDY0eDY0IHBpeGVsIHRleHR1cmUgbWF4IDEwMjQgYm9uZXMgKiA0IHBpeGVscyA9ICg2NCAqIDY0KVxuXG5cblx0XHRcdFx0XHRcdHZhciBzaXplID0gTWF0aC5zcXJ0KCBib25lcy5sZW5ndGggKiA0ICk7IC8vIDQgcGl4ZWxzIG5lZWRlZCBmb3IgMSBtYXRyaXhcblx0XHRcdFx0XHRcdHNpemUgPSBfTWF0aC5jZWlsUG93ZXJPZlR3byggc2l6ZSApO1xuXHRcdFx0XHRcdFx0c2l6ZSA9IE1hdGgubWF4KCBzaXplLCA0ICk7XG5cblx0XHRcdFx0XHRcdHZhciBib25lTWF0cmljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBzaXplICogc2l6ZSAqIDQgKTsgLy8gNCBmbG9hdHMgcGVyIFJHQkEgcGl4ZWxcblx0XHRcdFx0XHRcdGJvbmVNYXRyaWNlcy5zZXQoIHNrZWxldG9uLmJvbmVNYXRyaWNlcyApOyAvLyBjb3B5IGN1cnJlbnQgdmFsdWVzXG5cblx0XHRcdFx0XHRcdHZhciBib25lVGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSggYm9uZU1hdHJpY2VzLCBzaXplLCBzaXplLCBSR0JBRm9ybWF0LCBGbG9hdFR5cGUgKTtcblx0XHRcdFx0XHRcdGJvbmVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0c2tlbGV0b24uYm9uZU1hdHJpY2VzID0gYm9uZU1hdHJpY2VzO1xuXHRcdFx0XHRcdFx0c2tlbGV0b24uYm9uZVRleHR1cmUgPSBib25lVGV4dHVyZTtcblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVUZXh0dXJlU2l6ZSA9IHNpemU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdib25lVGV4dHVyZScsIHNrZWxldG9uLmJvbmVUZXh0dXJlICk7XG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmVTaXplJywgc2tlbGV0b24uYm9uZVRleHR1cmVTaXplICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgc2tlbGV0b24sICdib25lTWF0cmljZXMnICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlZnJlc2hNYXRlcmlhbCApIHtcblxuXHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndG9uZU1hcHBpbmdFeHBvc3VyZScsIF90aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgKTtcblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nV2hpdGVQb2ludCcsIF90aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludCApO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0cyApIHtcblxuXHRcdFx0XHQvLyB0aGUgY3VycmVudCBtYXRlcmlhbCByZXF1aXJlcyBsaWdodGluZyBpbmZvXG5cblx0XHRcdFx0Ly8gbm90ZTogYWxsIGxpZ2h0aW5nIHVuaWZvcm1zIGFyZSBhbHdheXMgc2V0IGNvcnJlY3RseVxuXHRcdFx0XHQvLyB0aGV5IHNpbXBseSByZWZlcmVuY2UgdGhlIHJlbmRlcmVyJ3Mgc3RhdGUgZm9yIHRoZWlyXG5cdFx0XHRcdC8vIHZhbHVlc1xuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyB1c2UgdGhlIGN1cnJlbnQgbWF0ZXJpYWwncyAubmVlZHNVcGRhdGUgZmxhZ3MgdG8gc2V0XG5cdFx0XHRcdC8vIHRoZSBHTCBzdGF0ZSB3aGVuIHJlcXVpcmVkXG5cblx0XHRcdFx0bWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUoIG1fdW5pZm9ybXMsIHJlZnJlc2hMaWdodHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyByZWZyZXNoIHVuaWZvcm1zIGNvbW1vbiB0byBzZXZlcmFsIG1hdGVyaWFsc1xuXG5cdFx0XHRpZiAoIGZvZyAmJiBtYXRlcmlhbC5mb2cgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zRm9nKCBtX3VuaWZvcm1zLCBmb2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNMYW1iZXJ0KCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1Rvb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1Bob25nKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hQaHlzaWNhbE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoRGVwdGhNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0RlcHRoKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zRGlzdGFuY2UoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaE5vcm1hbE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTm9ybWFsKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc0xpbmVCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0xpbmUoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5pc0xpbmVEYXNoZWRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0Rhc2goIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1BvaW50c01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNTcHJpdGVNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNTcHJpdGVzKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1NoYWRvd01hdGVyaWFsICkge1xuXG5cdFx0XHRcdG1fdW5pZm9ybXMuY29sb3IudmFsdWUgPSBtYXRlcmlhbC5jb2xvcjtcblx0XHRcdFx0bV91bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZWN0QXJlYUxpZ2h0IFRleHR1cmVcblx0XHRcdC8vIFRPRE8gKG1yZG9vYik6IEZpbmQgYSBuaWNlciBpbXBsZW1lbnRhdGlvblxuXG5cdFx0XHRpZiAoIG1fdW5pZm9ybXMubHRjXzEgIT09IHVuZGVmaW5lZCApIG1fdW5pZm9ybXMubHRjXzEudmFsdWUgPSBVbmlmb3Jtc0xpYi5MVENfMTtcblx0XHRcdGlmICggbV91bmlmb3Jtcy5sdGNfMiAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNfMi52YWx1ZSA9IFVuaWZvcm1zTGliLkxUQ18yO1xuXG5cdFx0XHRXZWJHTFVuaWZvcm1zLnVwbG9hZCggX2dsLCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCBfdGhpcyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmIG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0V2ViR0xVbmlmb3Jtcy51cGxvYWQoIF9nbCwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCwgbV91bmlmb3JtcywgX3RoaXMgKTtcblx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5pc1Nwcml0ZU1hdGVyaWFsICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdjZW50ZXInLCBvYmplY3QuY2VudGVyICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb21tb24gbWF0cmljZXNcblxuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdub3JtYWxNYXRyaXgnLCBvYmplY3Qubm9ybWFsTWF0cml4ICk7XG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxNYXRyaXgnLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHQvLyBVbmlmb3JtcyAocmVmcmVzaCB1bmlmb3JtcyBvYmplY3RzKVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmNvbG9yICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5lbWlzc2l2ZSApLm11bHRpcGx5U2NhbGFyKCBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbnZNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDtcblxuXHRcdFx0Ly8gZG9uJ3QgZmxpcCBDdWJlVGV4dHVyZSBlbnZNYXBzLCBmbGlwIGV2ZXJ5dGhpbmcgZWxzZTpcblx0XHRcdC8vICBXZWJHTFJlbmRlclRhcmdldEN1YmUgd2lsbCBiZSBmbGlwcGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0Ly8gIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJlIHdpbGwgYmUgZmxpcHBlZCBiZWNhdXNlIGl0J3MgYSBUZXh0dXJlIGFuZCBOT1QgYSBDdWJlVGV4dHVyZVxuXHRcdFx0Ly8gdGhpcyBjaGVjayBtdXN0IGJlIGhhbmRsZWQgZGlmZmVyZW50bHksIG9yIHJlbW92ZWQgZW50aXJlbHksIGlmIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSB1c2VzIGEgQ3ViZVRleHR1cmUgaW4gdGhlIGZ1dHVyZVxuXHRcdFx0dW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZSA9ICggISAoIG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAuaXNDdWJlVGV4dHVyZSApICkgPyAxIDogLSAxO1xuXG5cdFx0XHR1bmlmb3Jtcy5yZWZsZWN0aXZpdHkudmFsdWUgPSBtYXRlcmlhbC5yZWZsZWN0aXZpdHk7XG5cdFx0XHR1bmlmb3Jtcy5yZWZyYWN0aW9uUmF0aW8udmFsdWUgPSBtYXRlcmlhbC5yZWZyYWN0aW9uUmF0aW87XG5cblx0XHRcdHVuaWZvcm1zLm1heE1pcExldmVsLnZhbHVlID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsLmVudk1hcCApLl9fbWF4TWlwTGV2ZWw7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcC52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwO1xuXHRcdFx0dW5pZm9ybXMubGlnaHRNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYW9NYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFvTWFwLnZhbHVlID0gbWF0ZXJpYWwuYW9NYXA7XG5cdFx0XHR1bmlmb3Jtcy5hb01hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXYgcmVwZWF0IGFuZCBvZmZzZXQgc2V0dGluZyBwcmlvcml0aWVzXG5cdFx0Ly8gMS4gY29sb3IgbWFwXG5cdFx0Ly8gMi4gc3BlY3VsYXIgbWFwXG5cdFx0Ly8gMy4gbm9ybWFsIG1hcFxuXHRcdC8vIDQuIGJ1bXAgbWFwXG5cdFx0Ly8gNS4gYWxwaGEgbWFwXG5cdFx0Ly8gNi4gZW1pc3NpdmUgbWFwXG5cblx0XHR2YXIgdXZTY2FsZU1hcDtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5idW1wTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2U2NhbGVNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdGlmICggdXZTY2FsZU1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdHV2U2NhbGVNYXAgPSB1dlNjYWxlTWFwLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dlNjYWxlTWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dXZTY2FsZU1hcC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCB1dlNjYWxlTWFwLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rhc2goIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRhc2hTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemU7XG5cdFx0dW5pZm9ybXMudG90YWxTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemUgKyBtYXRlcmlhbC5nYXBTaXplO1xuXHRcdHVuaWZvcm1zLnNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuc2NhbGU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXHRcdHVuaWZvcm1zLnNpemUudmFsdWUgPSBtYXRlcmlhbC5zaXplICogX3BpeGVsUmF0aW87XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBfaGVpZ2h0ICogMC41O1xuXG5cdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubWFwLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm1hcC5tYXRyaXggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zU3ByaXRlcyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXHRcdHVuaWZvcm1zLnJvdGF0aW9uLnZhbHVlID0gbWF0ZXJpYWwucm90YXRpb247XG5cdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubWFwLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm1hcC5tYXRyaXggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRm9nKCB1bmlmb3JtcywgZm9nICkge1xuXG5cdFx0dW5pZm9ybXMuZm9nQ29sb3IudmFsdWUgPSBmb2cuY29sb3I7XG5cblx0XHRpZiAoIGZvZy5pc0ZvZyApIHtcblxuXHRcdFx0dW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyO1xuXHRcdFx0dW5pZm9ybXMuZm9nRmFyLnZhbHVlID0gZm9nLmZhcjtcblxuXHRcdH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmZvZ0RlbnNpdHkudmFsdWUgPSBmb2cuZGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGFtYmVydCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLnNwZWN1bGFyLnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXI7XG5cdFx0dW5pZm9ybXMuc2hpbmluZXNzLnZhbHVlID0gTWF0aC5tYXgoIG1hdGVyaWFsLnNoaW5pbmVzcywgMWUtNCApOyAvLyB0byBwcmV2ZW50IHBvdyggMC4wLCAwLjAgKVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlICo9IC0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zVG9vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0cmVmcmVzaFVuaWZvcm1zUGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5ncmFkaWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZ3JhZGllbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5ncmFkaWVudE1hcDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLnJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLnJvdWdobmVzcztcblx0XHR1bmlmb3Jtcy5tZXRhbG5lc3MudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3M7XG5cblx0XHRpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMucm91Z2huZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1ldGFsbmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLm1ldGFsbmVzc01hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSAqPSAtIDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVudk1hcCApIHtcblxuXHRcdFx0Ly91bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXA7IC8vIHBhcnQgb2YgdW5pZm9ybXMgY29tbW9uXG5cdFx0XHR1bmlmb3Jtcy5lbnZNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHR1bmlmb3Jtcy5yZWZsZWN0aXZpdHkudmFsdWUgPSBtYXRlcmlhbC5yZWZsZWN0aXZpdHk7IC8vIGFsc28gcGFydCBvZiB1bmlmb3JtcyBjb21tb25cblxuXHRcdHVuaWZvcm1zLmNsZWFyQ29hdC52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyQ29hdDtcblx0XHR1bmlmb3Jtcy5jbGVhckNvYXRSb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0RlcHRoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoIG1hdGVyaWFsLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdFx0dW5pZm9ybXMubmVhckRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwubmVhckRpc3RhbmNlO1xuXHRcdHVuaWZvcm1zLmZhckRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwuZmFyRGlzdGFuY2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgKj0gLSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBJZiB1bmlmb3JtcyBhcmUgbWFya2VkIGFzIGNsZWFuLCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgbG9hZGVkIHRvIHRoZSBHUFUuXG5cblx0ZnVuY3Rpb24gbWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUoIHVuaWZvcm1zLCB2YWx1ZSApIHtcblxuXHRcdHVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cblx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdH1cblxuXHQvLyBUZXh0dXJlc1xuXG5cdGZ1bmN0aW9uIGFsbG9jVGV4dHVyZVVuaXQoKSB7XG5cblx0XHR2YXIgdGV4dHVyZVVuaXQgPSBfdXNlZFRleHR1cmVVbml0cztcblxuXHRcdGlmICggdGV4dHVyZVVuaXQgPj0gY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUcnlpbmcgdG8gdXNlICcgKyB0ZXh0dXJlVW5pdCArICcgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICcgKyBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKTtcblxuXHRcdH1cblxuXHRcdF91c2VkVGV4dHVyZVVuaXRzICs9IDE7XG5cblx0XHRyZXR1cm4gdGV4dHVyZVVuaXQ7XG5cblx0fVxuXG5cdHRoaXMuYWxsb2NUZXh0dXJlVW5pdCA9IGFsbG9jVGV4dHVyZVVuaXQ7XG5cblx0Ly8gdGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRUZXh0dXJlMkQ7XG5cdHRoaXMuc2V0VGV4dHVyZTJEID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgd2FybmVkID0gZmFsc2U7XG5cblx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogcGVlbCB0ZXh0dXJlLnRleHR1cmVcblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdGlmICggISB3YXJuZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlci5zZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuXCIgKTtcblx0XHRcdFx0XHR3YXJuZWQgPSB0cnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlID0gdGV4dHVyZS50ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0fTtcblxuXHR9KCkgKTtcblxuXHR0aGlzLnNldFRleHR1cmUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3YXJuZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRUZXh0dXJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZSBpcyBkZXByZWNhdGVkLCB1c2Ugc2V0VGV4dHVyZTJEIGluc3RlYWQuXCIgKTtcblx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdH07XG5cblx0fSgpICk7XG5cblx0dGhpcy5zZXRUZXh0dXJlQ3ViZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdhcm5lZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogcGVlbCB0ZXh0dXJlLnRleHR1cmVcblx0XHRcdGlmICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkge1xuXG5cdFx0XHRcdGlmICggISB3YXJuZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlci5zZXRUZXh0dXJlQ3ViZTogZG9uJ3QgdXNlIGN1YmUgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjdXJyZW50bHkgcmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJlIGlzIGEgVGV4dHVyZSBhbmQgTk9UIGEgQ3ViZVRleHR1cmVcblx0XHRcdC8vIFRPRE86IHVuaWZ5IHRoZXNlIGNvZGUgcGF0aHNcblx0XHRcdGlmICggKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNDdWJlVGV4dHVyZSApIHx8XG5cdFx0XHRcdCggQXJyYXkuaXNBcnJheSggdGV4dHVyZS5pbWFnZSApICYmIHRleHR1cmUuaW1hZ2UubGVuZ3RoID09PSA2ICkgKSB7XG5cblx0XHRcdFx0Ly8gQ29tcHJlc3NlZFRleHR1cmUgY2FuIGhhdmUgQXJyYXkgaW4gaW1hZ2UgOi9cblxuXHRcdFx0XHQvLyB0aGlzIGZ1bmN0aW9uIGFsb25lIHNob3VsZCB0YWtlIGNhcmUgb2YgY3ViZSB0ZXh0dXJlc1xuXHRcdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGFzc3VtZWQ6IHRleHR1cmUgcHJvcGVydHkgb2YgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlXG5cblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICk7XG5cblx0Ly9cblxuXHR0aGlzLnNldEZyYW1lYnVmZmVyID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdF9mcmFtZWJ1ZmZlciA9IHZhbHVlO1xuXG5cdH07XG5cblx0dGhpcy5nZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRSZW5kZXJUYXJnZXQ7XG5cblx0fTtcblxuXHR0aGlzLnNldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCAmJiBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRleHR1cmVzLnNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdHZhciBmcmFtZWJ1ZmZlciA9IF9mcmFtZWJ1ZmZlcjtcblx0XHR2YXIgaXNDdWJlID0gZmFsc2U7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0dmFyIF9fd2ViZ2xGcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkge1xuXG5cdFx0XHRcdGZyYW1lYnVmZmVyID0gX193ZWJnbEZyYW1lYnVmZmVyWyByZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgXTtcblx0XHRcdFx0aXNDdWJlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IF9fd2ViZ2xGcmFtZWJ1ZmZlcjtcblxuXHRcdFx0fVxuXG5cdFx0XHRfY3VycmVudFZpZXdwb3J0LmNvcHkoIHJlbmRlclRhcmdldC52aWV3cG9ydCApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yLmNvcHkoIHJlbmRlclRhcmdldC5zY2lzc29yICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gcmVuZGVyVGFyZ2V0LnNjaXNzb3JUZXN0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKTtcblx0XHRcdF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yVGVzdCA9IF9zY2lzc29yVGVzdDtcblxuXHRcdH1cblxuXHRcdGlmICggX2N1cnJlbnRGcmFtZWJ1ZmZlciAhPT0gZnJhbWVidWZmZXIgKSB7XG5cblx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblx0XHRcdF9jdXJyZW50RnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjtcblxuXHRcdH1cblxuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0ICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yICk7XG5cdFx0c3RhdGUuc2V0U2Npc3NvclRlc3QoIF9jdXJyZW50U2Npc3NvclRlc3QgKTtcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyByZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCByZW5kZXJUYXJnZXQuYWN0aXZlTWlwTWFwTGV2ZWwgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscyA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBidWZmZXIgKSB7XG5cblx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXQgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgZnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0aWYgKCBmcmFtZWJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIHJlc3RvcmUgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBmcmFtZWJ1ZmZlciAhPT0gX2N1cnJlbnRGcmFtZWJ1ZmZlciApIHtcblxuXHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRcdFx0cmVzdG9yZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHR2YXIgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXHRcdFx0XHR2YXIgdGV4dHVyZUZvcm1hdCA9IHRleHR1cmUuZm9ybWF0O1xuXHRcdFx0XHR2YXIgdGV4dHVyZVR5cGUgPSB0ZXh0dXJlLnR5cGU7XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlRm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSAhPT0gX2dsLmdldFBhcmFtZXRlciggX2dsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUICkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFJHQkEgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBmb3JtYXQuJyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlVHlwZSAhPT0gVW5zaWduZWRCeXRlVHlwZSAmJiB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlVHlwZSApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFICkgJiYgLy8gSUUxMSwgRWRnZSBhbmQgQ2hyb21lIE1hYyA8IDUyICgjOTUxMylcblx0XHRcdFx0XHQhICggdGV4dHVyZVR5cGUgPT09IEZsb2F0VHlwZSAmJiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiB8fCBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgKSAmJiAvLyBDaHJvbWUgTWFjID49IDUyIGFuZCBGaXJlZm94XG5cdFx0XHRcdFx0ISAoIHRleHR1cmVUeXBlID09PSBIYWxmRmxvYXRUeXBlICYmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gZXh0ZW5zaW9ucy5nZXQoICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JyApIDogZXh0ZW5zaW9ucy5nZXQoICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnICkgKSApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIF9nbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKCBfZ2wuRlJBTUVCVUZGRVIgKSA9PT0gX2dsLkZSQU1FQlVGRkVSX0NPTVBMRVRFICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZW5zdXJlcyB2YWxpZCByZWFkIHJlcXVlc3RzIChubyBvdXQtb2YtYm91bmRzIHBpeGVscywgc2VlICM4NjA0KVxuXG5cdFx0XHRcdFx0aWYgKCAoIHggPj0gMCAmJiB4IDw9ICggcmVuZGVyVGFyZ2V0LndpZHRoIC0gd2lkdGggKSApICYmICggeSA+PSAwICYmIHkgPD0gKCByZW5kZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0ICkgKSApIHtcblxuXHRcdFx0XHRcdFx0X2dsLnJlYWRQaXhlbHMoIHgsIHksIHdpZHRoLCBoZWlnaHQsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSwgdXRpbHMuY29udmVydCggdGV4dHVyZVR5cGUgKSwgYnVmZmVyICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlYWRQaXhlbHMgZnJvbSByZW5kZXJUYXJnZXQgZmFpbGVkLiBGcmFtZWJ1ZmZlciBub3QgY29tcGxldGUuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBmaW5hbGx5IHtcblxuXHRcdFx0XHRpZiAoIHJlc3RvcmUgKSB7XG5cblx0XHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9jdXJyZW50RnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBwb3NpdGlvbiwgdGV4dHVyZSwgbGV2ZWwgKSB7XG5cblx0XHR2YXIgd2lkdGggPSB0ZXh0dXJlLmltYWdlLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSB0ZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXG5cdFx0dGhpcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIDAgKTtcblxuXHRcdF9nbC5jb3B5VGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGxldmVsIHx8IDAsIGdsRm9ybWF0LCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgaGVpZ2h0LCAwICk7XG5cblx0fTtcblxuXHR0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBwb3NpdGlvbiwgc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgbGV2ZWwgKSB7XG5cblx0XHR2YXIgd2lkdGggPSBzcmNUZXh0dXJlLmltYWdlLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSBzcmNUZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLmZvcm1hdCApO1xuXHRcdHZhciBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLnR5cGUgKTtcblxuXHRcdHRoaXMuc2V0VGV4dHVyZTJEKCBkc3RUZXh0dXJlLCAwICk7XG5cblx0XHRpZiAoIHNyY1RleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0X2dsLnRleFN1YkltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBsZXZlbCB8fCAwLCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBzcmNUZXh0dXJlLmltYWdlLmRhdGEgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9nbC50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgbGV2ZWwgfHwgMCwgcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgZ2xGb3JtYXQsIGdsVHlwZSwgc3JjVGV4dHVyZS5pbWFnZSApO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxuXG5leHBvcnQgeyBXZWJHTFJlbmRlcmVyIH07XG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvZ0V4cDIoIGNvbG9yLCBkZW5zaXR5ICkge1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cdHRoaXMuZGVuc2l0eSA9ICggZGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgPyBkZW5zaXR5IDogMC4wMDAyNTtcblxufVxuXG5Gb2dFeHAyLnByb3RvdHlwZS5pc0ZvZ0V4cDIgPSB0cnVlO1xuXG5Gb2dFeHAyLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRyZXR1cm4gbmV3IEZvZ0V4cDIoIHRoaXMuY29sb3IsIHRoaXMuZGVuc2l0eSApO1xuXG59O1xuXG5Gb2dFeHAyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIC8qIG1ldGEgKi8gKSB7XG5cblx0cmV0dXJuIHtcblx0XHR0eXBlOiAnRm9nRXhwMicsXG5cdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXG5cdFx0ZGVuc2l0eTogdGhpcy5kZW5zaXR5XG5cdH07XG5cbn07XG5cbmV4cG9ydCB7IEZvZ0V4cDIgfTtcbiIsImltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9nKCBjb2xvciwgbmVhciwgZmFyICkge1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cblx0dGhpcy5uZWFyID0gKCBuZWFyICE9PSB1bmRlZmluZWQgKSA/IG5lYXIgOiAxO1xuXHR0aGlzLmZhciA9ICggZmFyICE9PSB1bmRlZmluZWQgKSA/IGZhciA6IDEwMDA7XG5cbn1cblxuRm9nLnByb3RvdHlwZS5pc0ZvZyA9IHRydWU7XG5cbkZvZy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBGb2coIHRoaXMuY29sb3IsIHRoaXMubmVhciwgdGhpcy5mYXIgKTtcblxufTtcblxuRm9nLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIC8qIG1ldGEgKi8gKSB7XG5cblx0cmV0dXJuIHtcblx0XHR0eXBlOiAnRm9nJyxcblx0XHRjb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSxcblx0XHRuZWFyOiB0aGlzLm5lYXIsXG5cdFx0ZmFyOiB0aGlzLmZhclxuXHR9O1xuXG59O1xuXG5leHBvcnQgeyBGb2cgfTtcbiIsImltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTY2VuZSgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NjZW5lJztcblxuXHR0aGlzLmJhY2tncm91bmQgPSBudWxsO1xuXHR0aGlzLmZvZyA9IG51bGw7XG5cdHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGw7XG5cblx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsgLy8gY2hlY2tlZCBieSB0aGUgcmVuZGVyZXJcblxufVxuXG5TY2VuZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTY2VuZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdGlmICggc291cmNlLmJhY2tncm91bmQgIT09IG51bGwgKSB0aGlzLmJhY2tncm91bmQgPSBzb3VyY2UuYmFja2dyb3VuZC5jbG9uZSgpO1xuXHRcdGlmICggc291cmNlLmZvZyAhPT0gbnVsbCApIHRoaXMuZm9nID0gc291cmNlLmZvZy5jbG9uZSgpO1xuXHRcdGlmICggc291cmNlLm92ZXJyaWRlTWF0ZXJpYWwgIT09IG51bGwgKSB0aGlzLm92ZXJyaWRlTWF0ZXJpYWwgPSBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gc291cmNlLmF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGlmICggdGhpcy5iYWNrZ3JvdW5kICE9PSBudWxsICkgZGF0YS5vYmplY3QuYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZC50b0pTT04oIG1ldGEgKTtcblx0XHRpZiAoIHRoaXMuZm9nICE9PSBudWxsICkgZGF0YS5vYmplY3QuZm9nID0gdGhpcy5mb2cudG9KU09OKCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuXG5cbmV4cG9ydCB7IFNjZW5lIH07XG4iLCJcbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUgKSB7XG5cblx0dGhpcy5hcnJheSA9IGFycmF5O1xuXHR0aGlzLnN0cmlkZSA9IHN0cmlkZTtcblx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyBzdHJpZGUgOiAwO1xuXG5cdHRoaXMuZHluYW1pYyA9IGZhbHNlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLCB7XG5cblx0aXNJbnRlcmxlYXZlZEJ1ZmZlcjogdHJ1ZSxcblxuXHRvblVwbG9hZENhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRzZXRBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLnN0cmlkZSA6IDA7XG5cdFx0dGhpcy5hcnJheSA9IGFycmF5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXREeW5hbWljOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5keW5hbWljID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApO1xuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XG5cdFx0dGhpcy5zdHJpZGUgPSBzb3VyY2Uuc3RyaWRlO1xuXHRcdHRoaXMuZHluYW1pYyA9IHNvdXJjZS5keW5hbWljO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5QXQ6IGZ1bmN0aW9uICggaW5kZXgxLCBhdHRyaWJ1dGUsIGluZGV4MiApIHtcblxuXHRcdGluZGV4MSAqPSB0aGlzLnN0cmlkZTtcblx0XHRpbmRleDIgKj0gYXR0cmlidXRlLnN0cmlkZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuc3RyaWRlOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5hcnJheVsgaW5kZXgxICsgaSBdID0gYXR0cmlidXRlLmFycmF5WyBpbmRleDIgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0b25VcGxvYWQ6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IEludGVybGVhdmVkQnVmZmVyIH07XG4iLCJcbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBpdGVtU2l6ZSwgb2Zmc2V0LCBub3JtYWxpemVkICkge1xuXG5cdHRoaXMuZGF0YSA9IGludGVybGVhdmVkQnVmZmVyO1xuXHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cdHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuXG5cdHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGNvdW50OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZGF0YS5jb3VudDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGFycmF5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIGluZGV4LCB4ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCBdID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIGluZGV4LCB6ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFc6IGZ1bmN0aW9uICggaW5kZXgsIHcgKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF07XG5cblx0fSxcblxuXHRnZXRZOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAxIF07XG5cblx0fSxcblxuXHRnZXRaOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyIF07XG5cblx0fSxcblxuXHRnZXRXOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF07XG5cblx0fSxcblxuXHRzZXRYWTogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSApIHtcblxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVpXOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgfTtcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICpcdHV2T2Zmc2V0OiBuZXcgVEhSRUUuVmVjdG9yMigpLFxuICpcdHV2U2NhbGU6IG5ldyBUSFJFRS5WZWN0b3IyKClcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTcHJpdGVNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZU1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwcml0ZU1hdGVyaWFsO1xuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmlzU3ByaXRlTWF0ZXJpYWwgPSB0cnVlO1xuXG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbmV4cG9ydCB7IFNwcml0ZU1hdGVyaWFsIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXIgfSBmcm9tICcuLi9jb3JlL0ludGVybGVhdmVkQnVmZmVyLmpzJztcbmltcG9ydCB7IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBTcHJpdGVNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9TcHJpdGVNYXRlcmlhbC5qcyc7XG5cbnZhciBnZW9tZXRyeTtcblxuZnVuY3Rpb24gU3ByaXRlKCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZSc7XG5cblx0aWYgKCBnZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdHZhciBmbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBbXG5cdFx0XHQtIDAuNSwgLSAwLjUsIDAsIDAsIDAsXG5cdFx0XHQwLjUsIC0gMC41LCAwLCAxLCAwLFxuXHRcdFx0MC41LCAwLjUsIDAsIDEsIDEsXG5cdFx0XHQtIDAuNSwgMC41LCAwLCAwLCAxXG5cdFx0XSApO1xuXG5cdFx0dmFyIGludGVybGVhdmVkQnVmZmVyID0gbmV3IEludGVybGVhdmVkQnVmZmVyKCBmbG9hdDMyQXJyYXksIDUgKTtcblxuXHRcdGdlb21ldHJ5LnNldEluZGV4KCBbIDAsIDEsIDIsXHQwLCAyLCAzIF0gKTtcblx0XHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIDMsIDAsIGZhbHNlICkgKTtcblx0XHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIDIsIDMsIGZhbHNlICkgKTtcblxuXHR9XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5O1xuXHR0aGlzLm1hdGVyaWFsID0gKCBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbCA6IG5ldyBTcHJpdGVNYXRlcmlhbCgpO1xuXG5cdHRoaXMuY2VudGVyID0gbmV3IFZlY3RvcjIoIDAuNSwgMC41ICk7XG5cbn1cblxuU3ByaXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwcml0ZSxcblxuXHRpc1Nwcml0ZTogdHJ1ZSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnRlcnNlY3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHdvcmxkU2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtdlBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBhbGlnbmVkUG9zaXRpb24gPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciByb3RhdGVkUG9zaXRpb24gPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB2aWV3V29ybGRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0dmFyIHZBID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdkIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2QyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmdW5jdGlvbiB0cmFuc2Zvcm1WZXJ0ZXgoIHZlcnRleFBvc2l0aW9uLCBtdlBvc2l0aW9uLCBjZW50ZXIsIHNjYWxlLCBzaW4sIGNvcyApIHtcblxuXHRcdFx0Ly8gY29tcHV0ZSBwb3NpdGlvbiBpbiBjYW1lcmEgc3BhY2Vcblx0XHRcdGFsaWduZWRQb3NpdGlvbi5zdWJWZWN0b3JzKCB2ZXJ0ZXhQb3NpdGlvbiwgY2VudGVyICkuYWRkU2NhbGFyKCAwLjUgKS5tdWx0aXBseSggc2NhbGUgKTtcblxuXHRcdFx0Ly8gdG8gY2hlY2sgaWYgcm90YXRpb24gaXMgbm90IHplcm9cblx0XHRcdGlmICggc2luICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cm90YXRlZFBvc2l0aW9uLnggPSAoIGNvcyAqIGFsaWduZWRQb3NpdGlvbi54ICkgLSAoIHNpbiAqIGFsaWduZWRQb3NpdGlvbi55ICk7XG5cdFx0XHRcdHJvdGF0ZWRQb3NpdGlvbi55ID0gKCBzaW4gKiBhbGlnbmVkUG9zaXRpb24ueCApICsgKCBjb3MgKiBhbGlnbmVkUG9zaXRpb24ueSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJvdGF0ZWRQb3NpdGlvbi5jb3B5KCBhbGlnbmVkUG9zaXRpb24gKTtcblxuXHRcdFx0fVxuXG5cblx0XHRcdHZlcnRleFBvc2l0aW9uLmNvcHkoIG12UG9zaXRpb24gKTtcblx0XHRcdHZlcnRleFBvc2l0aW9uLnggKz0gcm90YXRlZFBvc2l0aW9uLng7XG5cdFx0XHR2ZXJ0ZXhQb3NpdGlvbi55ICs9IHJvdGF0ZWRQb3NpdGlvbi55O1xuXG5cdFx0XHQvLyB0cmFuc2Zvcm0gdG8gd29ybGQgc3BhY2Vcblx0XHRcdHZlcnRleFBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld1dvcmxkTWF0cml4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR3b3JsZFNjYWxlLnNldEZyb21NYXRyaXhTY2FsZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dmlld1dvcmxkTWF0cml4LmdldEludmVyc2UoIHRoaXMubW9kZWxWaWV3TWF0cml4ICkucHJlbXVsdGlwbHkoIHRoaXMubWF0cml4V29ybGQgKTtcblx0XHRcdG12UG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1vZGVsVmlld01hdHJpeCApO1xuXG5cdFx0XHR2YXIgcm90YXRpb24gPSB0aGlzLm1hdGVyaWFsLnJvdGF0aW9uO1xuXHRcdFx0dmFyIHNpbiwgY29zO1xuXHRcdFx0aWYgKCByb3RhdGlvbiAhPT0gMCApIHtcblxuXHRcdFx0XHRjb3MgPSBNYXRoLmNvcyggcm90YXRpb24gKTtcblx0XHRcdFx0c2luID0gTWF0aC5zaW4oIHJvdGF0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuY2VudGVyO1xuXG5cdFx0XHR0cmFuc2Zvcm1WZXJ0ZXgoIHZBLnNldCggLSAwLjUsIC0gMC41LCAwICksIG12UG9zaXRpb24sIGNlbnRlciwgd29ybGRTY2FsZSwgc2luLCBjb3MgKTtcblx0XHRcdHRyYW5zZm9ybVZlcnRleCggdkIuc2V0KCAwLjUsIC0gMC41LCAwICksIG12UG9zaXRpb24sIGNlbnRlciwgd29ybGRTY2FsZSwgc2luLCBjb3MgKTtcblx0XHRcdHRyYW5zZm9ybVZlcnRleCggdkMuc2V0KCAwLjUsIDAuNSwgMCApLCBtdlBvc2l0aW9uLCBjZW50ZXIsIHdvcmxkU2NhbGUsIHNpbiwgY29zICk7XG5cblx0XHRcdC8vIGNoZWNrIGZpcnN0IHRyaWFuZ2xlXG5cdFx0XHR2YXIgaW50ZXJzZWN0ID0gcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RUcmlhbmdsZSggdkEsIHZCLCB2QywgZmFsc2UsIGludGVyc2VjdFBvaW50ICk7XG5cblx0XHRcdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkge1xuXG5cdFx0XHRcdC8vIGNoZWNrIHNlY29uZCB0cmlhbmdsZVxuXHRcdFx0XHR0cmFuc2Zvcm1WZXJ0ZXgoIHZCLnNldCggLSAwLjUsIDAuNSwgMCApLCBtdlBvc2l0aW9uLCBjZW50ZXIsIHdvcmxkU2NhbGUsIHNpbiwgY29zICk7XG5cdFx0XHRcdGludGVyc2VjdCA9IHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHZBLCB2QywgdkIsIGZhbHNlLCBpbnRlcnNlY3RQb2ludCApO1xuXHRcdFx0XHRpZiAoIGludGVyc2VjdCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjtcblxuXHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRwb2ludDogaW50ZXJzZWN0UG9pbnQuY2xvbmUoKSxcblx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdH0gKTtcblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHRpZiAoIHNvdXJjZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXG59ICk7XG5cbmV4cG9ydCB7IFNwcml0ZSB9O1xuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMT0QoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMT0QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0bGV2ZWxzOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IFtdXG5cdFx0fVxuXHR9ICk7XG5cbn1cblxuTE9ELnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExPRCxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgZmFsc2UgKTtcblxuXHRcdHZhciBsZXZlbHMgPSBzb3VyY2UubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmFkZExldmVsKCBsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkTGV2ZWw6IGZ1bmN0aW9uICggb2JqZWN0LCBkaXN0YW5jZSApIHtcblxuXHRcdGlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3RhbmNlID0gMDtcblxuXHRcdGRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBsIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGxldmVscy5zcGxpY2UoIGwsIDAsIHsgZGlzdGFuY2U6IGRpc3RhbmNlLCBvYmplY3Q6IG9iamVjdCB9ICk7XG5cblx0XHR0aGlzLmFkZCggb2JqZWN0ICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RGb3JEaXN0YW5jZTogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBsZXZlbHNbIGkgLSAxIF0ub2JqZWN0O1xuXG5cdH0sXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4UG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0bWF0cml4UG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIG1hdHJpeFBvc2l0aW9uICk7XG5cblx0XHRcdHRoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UoIGRpc3RhbmNlICkucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkge1xuXG5cdFx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRcdGlmICggbGV2ZWxzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0dmFyIGRpc3RhbmNlID0gdjEuZGlzdGFuY2VUbyggdjIgKTtcblxuXHRcdFx0XHRsZXZlbHNbIDAgXS5vYmplY3QudmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlID49IGxldmVsc1sgaSBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdFx0XHRsZXZlbHNbIGkgLSAxIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmxldmVscyA9IFtdO1xuXG5cdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHRkYXRhLm9iamVjdC5sZXZlbHMucHVzaCgge1xuXHRcdFx0XHRvYmplY3Q6IGxldmVsLm9iamVjdC51dWlkLFxuXHRcdFx0XHRkaXN0YW5jZTogbGV2ZWwuZGlzdGFuY2Vcblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IExPRCB9O1xuIiwiaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pY2hhZWwgZ3VlcnJlcm8gLyBodHRwOi8vcmVhbGl0eW1lbHRkb3duLmNvbVxuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gU2tlbGV0b24oIGJvbmVzLCBib25lSW52ZXJzZXMgKSB7XG5cblx0Ly8gY29weSB0aGUgYm9uZSBhcnJheVxuXG5cdGJvbmVzID0gYm9uZXMgfHwgW107XG5cblx0dGhpcy5ib25lcyA9IGJvbmVzLnNsaWNlKCAwICk7XG5cdHRoaXMuYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggdGhpcy5ib25lcy5sZW5ndGggKiAxNiApO1xuXG5cdC8vIHVzZSB0aGUgc3VwcGxpZWQgYm9uZSBpbnZlcnNlcyBvciBjYWxjdWxhdGUgdGhlIGludmVyc2VzXG5cblx0aWYgKCBib25lSW52ZXJzZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRoaXMuY2FsY3VsYXRlSW52ZXJzZXMoKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCB0aGlzLmJvbmVzLmxlbmd0aCA9PT0gYm9uZUludmVyc2VzLmxlbmd0aCApIHtcblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBib25lSW52ZXJzZXMuc2xpY2UoIDAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uIGJvbmVJbnZlcnNlcyBpcyB0aGUgd3JvbmcgbGVuZ3RoLicgKTtcblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggbmV3IE1hdHJpeDQoKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNrZWxldG9uLnByb3RvdHlwZSwge1xuXG5cdGNhbGN1bGF0ZUludmVyc2VzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmJvbmVJbnZlcnNlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdFx0aWYgKCB0aGlzLmJvbmVzWyBpIF0gKSB7XG5cblx0XHRcdFx0aW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLmJvbmVzWyBpIF0ubWF0cml4V29ybGQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKCBpbnZlcnNlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm9uZSwgaSwgaWw7XG5cblx0XHQvLyByZWNvdmVyIHRoZSBiaW5kLXRpbWUgd29ybGQgbWF0cmljZXNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZSApIHtcblxuXHRcdFx0XHRib25lLm1hdHJpeFdvcmxkLmdldEludmVyc2UoIHRoaXMuYm9uZUludmVyc2VzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29tcHV0ZSB0aGUgbG9jYWwgbWF0cmljZXMsIHBvc2l0aW9ucywgcm90YXRpb25zIGFuZCBzY2FsZXNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZSApIHtcblxuXHRcdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmdldEludmVyc2UoIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdFx0Ym9uZS5tYXRyaXgubXVsdGlwbHkoIGJvbmUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ym9uZS5tYXRyaXguY29weSggYm9uZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRib25lLm1hdHJpeC5kZWNvbXBvc2UoIGJvbmUucG9zaXRpb24sIGJvbmUucXVhdGVybmlvbiwgYm9uZS5zY2FsZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9mZnNldE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIGlkZW50aXR5TWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHRcdHZhciBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0XHR2YXIgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7XG5cdFx0XHR2YXIgYm9uZU1hdHJpY2VzID0gdGhpcy5ib25lTWF0cmljZXM7XG5cdFx0XHR2YXIgYm9uZVRleHR1cmUgPSB0aGlzLmJvbmVUZXh0dXJlO1xuXG5cdFx0XHQvLyBmbGF0dGVuIGJvbmUgbWF0cmljZXMgdG8gYXJyYXlcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdC8vIGNvbXB1dGUgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBjdXJyZW50IGFuZCB0aGUgb3JpZ2luYWwgdHJhbnNmb3JtXG5cblx0XHRcdFx0dmFyIG1hdHJpeCA9IGJvbmVzWyBpIF0gPyBib25lc1sgaSBdLm1hdHJpeFdvcmxkIDogaWRlbnRpdHlNYXRyaXg7XG5cblx0XHRcdFx0b2Zmc2V0TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeCwgYm9uZUludmVyc2VzWyBpIF0gKTtcblx0XHRcdFx0b2Zmc2V0TWF0cml4LnRvQXJyYXkoIGJvbmVNYXRyaWNlcywgaSAqIDE2ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBib25lVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJvbmVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyBTa2VsZXRvbiggdGhpcy5ib25lcywgdGhpcy5ib25lSW52ZXJzZXMgKTtcblxuXHR9LFxuXG5cdGdldEJvbmVCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgYm9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBib25lLm5hbWUgPT09IG5hbWUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGJvbmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgU2tlbGV0b24gfTtcbiIsImltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb21cbiAqL1xuXG5mdW5jdGlvbiBCb25lKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQm9uZSc7XG5cbn1cblxuQm9uZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBCb25lLFxuXG5cdGlzQm9uZTogdHJ1ZVxuXG59ICk7XG5cblxuZXhwb3J0IHsgQm9uZSB9O1xuIiwiaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4vTWVzaC5qcyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0LmpzJztcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSAnLi9Ta2VsZXRvbi5qcyc7XG5pbXBvcnQgeyBCb25lIH0gZnJvbSAnLi9Cb25lLmpzJztcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdTa2lubmVkTWVzaCc7XG5cblx0dGhpcy5iaW5kTW9kZSA9ICdhdHRhY2hlZCc7XG5cdHRoaXMuYmluZE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMuYmluZE1hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHZhciBib25lcyA9IHRoaXMuaW5pdEJvbmVzKCk7XG5cdHZhciBza2VsZXRvbiA9IG5ldyBTa2VsZXRvbiggYm9uZXMgKTtcblxuXHR0aGlzLmJpbmQoIHNrZWxldG9uLCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0dGhpcy5ub3JtYWxpemVTa2luV2VpZ2h0cygpO1xuXG59XG5cblNraW5uZWRNZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU2tpbm5lZE1lc2gsXG5cblx0aXNTa2lubmVkTWVzaDogdHJ1ZSxcblxuXHRpbml0Qm9uZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib25lcyA9IFtdLCBib25lLCBnYm9uZTtcblx0XHR2YXIgaSwgaWw7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5ib25lcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBmaXJzdCwgY3JlYXRlIGFycmF5IG9mICdCb25lJyBvYmplY3RzIGZyb20gZ2VvbWV0cnkgZGF0YVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdO1xuXG5cdFx0XHRcdC8vIGNyZWF0ZSBuZXcgJ0JvbmUnIG9iamVjdFxuXG5cdFx0XHRcdGJvbmUgPSBuZXcgQm9uZSgpO1xuXHRcdFx0XHRib25lcy5wdXNoKCBib25lICk7XG5cblx0XHRcdFx0Ly8gYXBwbHkgdmFsdWVzXG5cblx0XHRcdFx0Ym9uZS5uYW1lID0gZ2JvbmUubmFtZTtcblx0XHRcdFx0Ym9uZS5wb3NpdGlvbi5mcm9tQXJyYXkoIGdib25lLnBvcyApO1xuXHRcdFx0XHRib25lLnF1YXRlcm5pb24uZnJvbUFycmF5KCBnYm9uZS5yb3RxICk7XG5cdFx0XHRcdGlmICggZ2JvbmUuc2NsICE9PSB1bmRlZmluZWQgKSBib25lLnNjYWxlLmZyb21BcnJheSggZ2JvbmUuc2NsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc2Vjb25kLCBjcmVhdGUgYm9uZSBoaWVyYXJjaHlcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5nZW9tZXRyeS5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRnYm9uZSA9IHRoaXMuZ2VvbWV0cnkuYm9uZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICggZ2JvbmUucGFyZW50ICE9PSAtIDEgKSAmJiAoIGdib25lLnBhcmVudCAhPT0gbnVsbCApICYmICggYm9uZXNbIGdib25lLnBhcmVudCBdICE9PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgYm9uZXMgaW4gdGhlIGhpZXJhcmNoeVxuXG5cdFx0XHRcdFx0Ym9uZXNbIGdib25lLnBhcmVudCBdLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB0b3Btb3N0IGJvbmUsIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgc2tpbm5lZCBtZXNoXG5cblx0XHRcdFx0XHR0aGlzLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gbm93IHRoZSBib25lcyBhcmUgcGFydCBvZiB0aGUgc2NlbmUgZ3JhcGggYW5kIGNoaWxkcmVuIG9mIHRoZSBza2lubmVkIG1lc2guXG5cdFx0Ly8gbGV0J3MgdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpY2VzXG5cblx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRyZXR1cm4gYm9uZXM7XG5cblx0fSxcblxuXHRiaW5kOiBmdW5jdGlvbiAoIHNrZWxldG9uLCBiaW5kTWF0cml4ICkge1xuXG5cdFx0dGhpcy5za2VsZXRvbiA9IHNrZWxldG9uO1xuXG5cdFx0aWYgKCBiaW5kTWF0cml4ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0dGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpO1xuXG5cdFx0XHRiaW5kTWF0cml4ID0gdGhpcy5tYXRyaXhXb3JsZDtcblxuXHRcdH1cblxuXHRcdHRoaXMuYmluZE1hdHJpeC5jb3B5KCBiaW5kTWF0cml4ICk7XG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBiaW5kTWF0cml4ICk7XG5cblx0fSxcblxuXHRwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNrZWxldG9uLnBvc2UoKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZVNraW5XZWlnaHRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc2NhbGUsIGk7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBzdyA9IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHNbIGkgXTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHN3Lm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdFx0XHRcdGlmICggc2NhbGUgIT09IEluZmluaXR5ICkge1xuXG5cdFx0XHRcdFx0c3cubXVsdGlwbHlTY2FsYXIoIHNjYWxlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHN3LnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciB2ZWMgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR2YXIgc2tpbldlaWdodCA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHNraW5XZWlnaHQuY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVjLnggPSBza2luV2VpZ2h0LmdldFgoIGkgKTtcblx0XHRcdFx0dmVjLnkgPSBza2luV2VpZ2h0LmdldFkoIGkgKTtcblx0XHRcdFx0dmVjLnogPSBza2luV2VpZ2h0LmdldFooIGkgKTtcblx0XHRcdFx0dmVjLncgPSBza2luV2VpZ2h0LmdldFcoIGkgKTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHZlYy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHRcdFx0XHRpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHtcblxuXHRcdFx0XHRcdHZlYy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dmVjLnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRza2luV2VpZ2h0LnNldFhZWlcoIGksIHZlYy54LCB2ZWMueSwgdmVjLnosIHZlYy53ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdFx0TWVzaC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdGlmICggdGhpcy5iaW5kTW9kZSA9PT0gJ2F0dGFjaGVkJyApIHtcblxuXHRcdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLmJpbmRNb2RlID09PSAnZGV0YWNoZWQnICkge1xuXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMuYmluZE1hdHJpeCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogJyArIHRoaXMuYmluZE1vZGUgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgU2tpbm5lZE1lc2ggfTtcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIGxpbmV3aWR0aDogPGZsb2F0PixcbiAqICBsaW5lY2FwOiBcInJvdW5kXCIsXG4gKiAgbGluZWpvaW46IFwicm91bmRcIlxuICogfVxuICovXG5cbmZ1bmN0aW9uIExpbmVCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUJhc2ljTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cblx0dGhpcy5saW5ld2lkdGggPSAxO1xuXHR0aGlzLmxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLmxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQmFzaWNNYXRlcmlhbDtcblxuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWwgPSB0cnVlO1xuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5saW5ld2lkdGggPSBzb3VyY2UubGluZXdpZHRoO1xuXHR0aGlzLmxpbmVjYXAgPSBzb3VyY2UubGluZWNhcDtcblx0dGhpcy5saW5lam9pbiA9IHNvdXJjZS5saW5lam9pbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5leHBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9O1xuIiwiaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUuanMnO1xuaW1wb3J0IHsgUmF5IH0gZnJvbSAnLi4vbWF0aC9SYXkuanMnO1xuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCwgbW9kZSApIHtcblxuXHRpZiAoIG1vZGUgPT09IDEgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTGluZTogcGFyYW1ldGVyIFRIUkVFLkxpbmVQaWVjZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIFRIUkVFLkxpbmVTZWdtZW50cyBpbnN0ZWFkLicgKTtcblxuXHR9XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7XG5cbn1cblxuTGluZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lLFxuXG5cdGlzTGluZTogdHJ1ZSxcblxuXHRjb21wdXRlTGluZURpc3RhbmNlczogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3RhcnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlbmQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVMaW5lRGlzdGFuY2VzKCkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0Ly8gd2UgYXNzdW1lIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHZhciBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBbIDAgXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0c3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgLSAxICk7XG5cdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTtcblxuXHRcdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdID0gbGluZURpc3RhbmNlc1sgaSAtIDEgXTtcblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSArPSBzdGFydC5kaXN0YW5jZVRvKCBlbmQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBsaW5lRGlzdGFuY2VzLCAxICkgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRcdGxpbmVEaXN0YW5jZXNbIDAgXSA9IDA7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdICs9IHZlcnRpY2VzWyBpIC0gMSBdLmRpc3RhbmNlVG8oIHZlcnRpY2VzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciByYXkgPSBuZXcgUmF5KCk7XG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHZhciBwcmVjaXNpb24gPSByYXljYXN0ZXIubGluZVByZWNpc2lvbjtcblx0XHRcdHZhciBwcmVjaXNpb25TcSA9IHByZWNpc2lvbiAqIHByZWNpc2lvbjtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0Ly9cblxuXHRcdFx0aW52ZXJzZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTtcblxuXHRcdFx0dmFyIHZTdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgdkVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgaW50ZXJTZWdtZW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBpbnRlclJheSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgc3RlcCA9ICggdGhpcyAmJiB0aGlzLmlzTGluZVNlZ21lbnRzICkgPyAyIDogMTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0XHR2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblx0XHRcdFx0XHRcdHZhciBiID0gaW5kaWNlc1sgaSArIDEgXTtcblxuXHRcdFx0XHRcdFx0dlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXHRcdFx0XHRcdFx0dkVuZC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYiAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2U3RhcnQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIDMgKiBpICk7XG5cdFx0XHRcdFx0XHR2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSArIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0XHRcdHZhciBuYlZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG5iVmVydGljZXMgLSAxOyBpICs9IHN0ZXAgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzWyBpICsgMSBdLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RTcSA+IHByZWNpc2lvblNxICkgY29udGludWU7XG5cblx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBMaW5lIH07XG4iLCJpbXBvcnQgeyBMaW5lIH0gZnJvbSAnLi9MaW5lLmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVTZWdtZW50cyc7XG5cbn1cblxuTGluZVNlZ21lbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZVNlZ21lbnRzLFxuXG5cdGlzTGluZVNlZ21lbnRzOiB0cnVlLFxuXG5cdGNvbXB1dGVMaW5lRGlzdGFuY2VzOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHQvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRcdFx0XHR2YXIgbGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdFx0XHRcdHN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XG5cdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAxICk7XG5cblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpICsgMSBdID0gbGluZURpc3RhbmNlc1sgaSBdICsgc3RhcnQuZGlzdGFuY2VUbyggZW5kICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbGluZURpc3RhbmNlcywgMSApICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMiApIHtcblxuXHRcdFx0XHRcdHN0YXJ0LmNvcHkoIHZlcnRpY2VzWyBpIF0gKTtcblx0XHRcdFx0XHRlbmQuY29weSggdmVydGljZXNbIGkgKyAxIF0gKTtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSArIDEgXSA9IGxpbmVEaXN0YW5jZXNbIGkgXSArIHN0YXJ0LmRpc3RhbmNlVG8oIGVuZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpIClcblxufSApO1xuXG5cbmV4cG9ydCB7IExpbmVTZWdtZW50cyB9O1xuIiwiaW1wb3J0IHsgTGluZSB9IGZyb20gJy4vTGluZS5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtZ3JldGVyIC8gaHR0cDovL2dpdGh1Yi5jb20vbWdyZXRlclxuICovXG5cbmZ1bmN0aW9uIExpbmVMb29wKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0TGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUxvb3AnO1xuXG59XG5cbkxpbmVMb29wLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZUxvb3AsXG5cblx0aXNMaW5lTG9vcDogdHJ1ZSxcblxufSApO1xuXG5cbmV4cG9ydCB7IExpbmVMb29wIH07XG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc2l6ZTogPGZsb2F0PixcbiAqICBzaXplQXR0ZW51YXRpb246IDxib29sPlxuICpcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuc2l6ZSA9IDE7XG5cdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gdHJ1ZTtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvaW50c01hdGVyaWFsO1xuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbCA9IHRydWU7XG5cblBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5zaXplID0gc291cmNlLnNpemU7XG5cdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRlbnVhdGlvbjtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuZXhwb3J0IHsgUG9pbnRzTWF0ZXJpYWwgfTtcbiIsImltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlLmpzJztcbmltcG9ydCB7IFJheSB9IGZyb20gJy4uL21hdGgvUmF5LmpzJztcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgUG9pbnRzTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvUG9pbnRzTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRzJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7XG5cbn1cblxuUG9pbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvaW50cyxcblxuXHRpc1BvaW50czogdHJ1ZSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgcmF5ID0gbmV3IFJheSgpO1xuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gdGhpcztcblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0XHR2YXIgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xuXHRcdFx0dmFyIHRocmVzaG9sZCA9IHJheWNhc3Rlci5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZDtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0c3BoZXJlLnJhZGl1cyArPSB0aHJlc2hvbGQ7XG5cblx0XHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRcdC8vXG5cblx0XHRcdGludmVyc2VNYXRyaXguZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTtcblx0XHRcdHJheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBpbnZlcnNlTWF0cml4ICk7XG5cblx0XHRcdHZhciBsb2NhbFRocmVzaG9sZCA9IHRocmVzaG9sZCAvICggKCB0aGlzLnNjYWxlLnggKyB0aGlzLnNjYWxlLnkgKyB0aGlzLnNjYWxlLnogKSAvIDMgKTtcblx0XHRcdHZhciBsb2NhbFRocmVzaG9sZFNxID0gbG9jYWxUaHJlc2hvbGQgKiBsb2NhbFRocmVzaG9sZDtcblx0XHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgaW50ZXJzZWN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRmdW5jdGlvbiB0ZXN0UG9pbnQoIHBvaW50LCBpbmRleCApIHtcblxuXHRcdFx0XHR2YXIgcmF5UG9pbnREaXN0YW5jZVNxID0gcmF5LmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApO1xuXG5cdFx0XHRcdGlmICggcmF5UG9pbnREaXN0YW5jZVNxIDwgbG9jYWxUaHJlc2hvbGRTcSApIHtcblxuXHRcdFx0XHRcdHJheS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCwgaW50ZXJzZWN0UG9pbnQgKTtcblx0XHRcdFx0XHRpbnRlcnNlY3RQb2ludC5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjtcblxuXHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdFx0XHRkaXN0YW5jZVRvUmF5OiBNYXRoLnNxcnQoIHJheVBvaW50RGlzdGFuY2VTcSApLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IGludGVyc2VjdFBvaW50LmNsb25lKCksXG5cdFx0XHRcdFx0XHRpbmRleDogaW5kZXgsXG5cdFx0XHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRcdFx0b2JqZWN0OiBvYmplY3RcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0XHR2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhID0gaW5kaWNlc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRwb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYSAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dGVzdFBvaW50KCBwb3NpdGlvbiwgYSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb3NpdGlvbnMubGVuZ3RoIC8gMzsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHBvc2l0aW9uLmZyb21BcnJheSggcG9zaXRpb25zLCBpICogMyApO1xuXG5cdFx0XHRcdFx0XHR0ZXN0UG9pbnQoIHBvc2l0aW9uLCBpICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR0ZXN0UG9pbnQoIHZlcnRpY2VzWyBpIF0sIGkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBQb2ludHMgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi9UZXh0dXJlLmpzJztcblxuZnVuY3Rpb24gVmlkZW9UZXh0dXJlKCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cbn1cblxuVmlkZW9UZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogVmlkZW9UZXh0dXJlLFxuXG5cdGlzVmlkZW9UZXh0dXJlOiB0cnVlLFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZpZGVvID0gdGhpcy5pbWFnZTtcblxuXHRcdGlmICggdmlkZW8ucmVhZHlTdGF0ZSA+PSB2aWRlby5IQVZFX0NVUlJFTlRfREFUQSApIHtcblxuXHRcdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgVmlkZW9UZXh0dXJlIH07XG4iLCIvKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XG5cbmZ1bmN0aW9uIENvbXByZXNzZWRUZXh0dXJlKCBtaXBtYXBzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblx0dGhpcy5taXBtYXBzID0gbWlwbWFwcztcblxuXHQvLyBubyBmbGlwcGluZyBmb3IgY3ViZSB0ZXh0dXJlc1xuXHQvLyAoYWxzbyBmbGlwcGluZyBkb2Vzbid0IHdvcmsgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXMgKVxuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblxuXHQvLyBjYW4ndCBnZW5lcmF0ZSBtaXBtYXBzIGZvciBjb21wcmVzc2VkIHRleHR1cmVzXG5cdC8vIG1pcHMgbXVzdCBiZSBlbWJlZGRlZCBpbiBERFMgZmlsZXNcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG59XG5cbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5Db21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb21wcmVzc2VkVGV4dHVyZTtcblxuQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlLmlzQ29tcHJlc3NlZFRleHR1cmUgPSB0cnVlO1xuXG5cbmV4cG9ydCB7IENvbXByZXNzZWRUZXh0dXJlIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XG5cbmZ1bmN0aW9uIENhbnZhc1RleHR1cmUoIGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxufVxuXG5DYW52YXNUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5DYW52YXNUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhbnZhc1RleHR1cmU7XG5DYW52YXNUZXh0dXJlLnByb3RvdHlwZS5pc0NhbnZhc1RleHR1cmUgPSB0cnVlO1xuXG5leHBvcnQgeyBDYW52YXNUZXh0dXJlIH07XG4iLCIvKipcbiAqIEBhdXRob3IgTWF0dCBEZXNMYXVyaWVycyAvIEBtYXR0ZGVzbFxuICogQGF1dGhvciBhdGl4IC8gYXJ0aHVyc2lsYmVyLmRlXG4gKi9cblxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XG5pbXBvcnQgeyBOZWFyZXN0RmlsdGVyLCBVbnNpZ25lZFNob3J0VHlwZSwgVW5zaWduZWRJbnQyNDhUeXBlLCBEZXB0aEZvcm1hdCwgRGVwdGhTdGVuY2lsRm9ybWF0IH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcblxuZnVuY3Rpb24gRGVwdGhUZXh0dXJlKCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBmb3JtYXQgKSB7XG5cblx0Zm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBEZXB0aEZvcm1hdDtcblxuXHRpZiAoIGZvcm1hdCAhPT0gRGVwdGhGb3JtYXQgJiYgZm9ybWF0ICE9PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCcgKTtcblxuXHR9XG5cblx0aWYgKCB0eXBlID09PSB1bmRlZmluZWQgJiYgZm9ybWF0ID09PSBEZXB0aEZvcm1hdCApIHR5cGUgPSBVbnNpZ25lZFNob3J0VHlwZTtcblx0aWYgKCB0eXBlID09PSB1bmRlZmluZWQgJiYgZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XG5cblx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXG5cdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblxuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzXHQ9IGZhbHNlO1xuXG59XG5cbkRlcHRoVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERlcHRoVGV4dHVyZTtcbkRlcHRoVGV4dHVyZS5wcm90b3R5cGUuaXNEZXB0aFRleHR1cmUgPSB0cnVlO1xuXG5leHBvcnQgeyBEZXB0aFRleHR1cmUgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcblxuZnVuY3Rpb24gV2lyZWZyYW1lR2VvbWV0cnkoIGdlb21ldHJ5ICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnV2lyZWZyYW1lR2VvbWV0cnknO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgaiwgbCwgbywgb2w7XG5cdHZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGUsIGVkZ2UxLCBlZGdlMjtcblx0dmFyIGtleSwga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xuXHR2YXIgdmVydGV4O1xuXG5cdC8vIGRpZmZlcmVudCBsb2dpYyBmb3IgR2VvbWV0cnkgYW5kIEJ1ZmZlckdlb21ldHJ5XG5cblx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWRnZXMgd2l0aG91dCBkdXBsaWNhdGVzXG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0ZWRnZTEgPSBmYWNlWyBrZXlzWyBqIF0gXTtcblx0XHRcdFx0ZWRnZTIgPSBmYWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTtcblx0XHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1cGxpY2F0ZXNcblx0XHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0gfTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRmb3IgKCBrZXkgaW4gZWRnZXMgKSB7XG5cblx0XHRcdGUgPSBlZGdlc1sga2V5IF07XG5cblx0XHRcdHZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR2ZXJ0ZXggPSBnZW9tZXRyeS52ZXJ0aWNlc1sgZS5pbmRleDIgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9IGVsc2UgaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9uLCBpbmRpY2VzLCBncm91cHM7XG5cdFx0dmFyIGdyb3VwLCBzdGFydCwgY291bnQ7XG5cdFx0dmFyIGluZGV4MSwgaW5kZXgyO1xuXG5cdFx0dmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdC8vIGluZGV4ZWQgQnVmZmVyR2VvbWV0cnlcblxuXHRcdFx0cG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0aW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0Z3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0Z3JvdXBzID0gWyB7IHN0YXJ0OiAwLCBjb3VudDogaW5kaWNlcy5jb3VudCwgbWF0ZXJpYWxJbmRleDogMCB9IF07XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcblxuXHRcdFx0Zm9yICggbyA9IDAsIG9sID0gZ3JvdXBzLmxlbmd0aDsgbyA8IG9sOyArKyBvICkge1xuXG5cdFx0XHRcdGdyb3VwID0gZ3JvdXBzWyBvIF07XG5cblx0XHRcdFx0c3RhcnQgPSBncm91cC5zdGFydDtcblx0XHRcdFx0Y291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0XHRmb3IgKCBpID0gc3RhcnQsIGwgPSAoIHN0YXJ0ICsgY291bnQgKTsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZTEgPSBpbmRpY2VzLmdldFgoIGkgKyBqICk7XG5cdFx0XHRcdFx0XHRlZGdlMiA9IGluZGljZXMuZ2V0WCggaSArICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9O1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRcdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdFx0XHRlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDEgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDIgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gKCBwb3NpdGlvbi5jb3VudCAvIDMgKTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhyZWUgZWRnZXMgcGVyIHRyaWFuZ2xlLCBhbiBlZGdlIGlzIHJlcHJlc2VudGVkIGFzIChpbmRleDEsIGluZGV4Milcblx0XHRcdFx0XHQvLyBlLmcuIHRoZSBmaXJzdCB0cmlhbmdsZSBoYXMgdGhlIGZvbGxvd2luZyBlZGdlczogKDAsMSksKDEsMiksKDIsMClcblxuXHRcdFx0XHRcdGluZGV4MSA9IDMgKiBpICsgajtcblx0XHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MSApO1xuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHRcdGluZGV4MiA9IDMgKiBpICsgKCAoIGogKyAxICkgJSAzICk7XG5cdFx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDIgKTtcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cbn1cblxuV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5XaXJlZnJhbWVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBXaXJlZnJhbWVHZW9tZXRyeTtcblxuXG5leHBvcnQgeyBXaXJlZnJhbWVHZW9tZXRyeSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBQYXJhbWV0cmljIFN1cmZhY2VzIEdlb21ldHJ5XG4gKiBiYXNlZCBvbiB0aGUgYnJpbGxpYW50IGFydGljbGUgYnkgQHByaWRlb3V0IGh0dHA6Ly9wcmlkZW91dC5uZXQvYmxvZy8/cD00NFxuICovXG5cbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9HZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuXG4vLyBQYXJhbWV0cmljR2VvbWV0cnlcblxuZnVuY3Rpb24gUGFyYW1ldHJpY0dlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BhcmFtZXRyaWNHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGZ1bmM6IGZ1bmMsXG5cdFx0c2xpY2VzOiBzbGljZXMsXG5cdFx0c3RhY2tzOiBzdGFja3Ncblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSggZnVuYywgc2xpY2VzLCBzdGFja3MgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5QYXJhbWV0cmljR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5QYXJhbWV0cmljR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyYW1ldHJpY0dlb21ldHJ5O1xuXG4vLyBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGZ1bmM6IGZ1bmMsXG5cdFx0c2xpY2VzOiBzbGljZXMsXG5cdFx0c3RhY2tzOiBzdGFja3Ncblx0fTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHR2YXIgRVBTID0gMC4wMDAwMTtcblxuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgcDAgPSBuZXcgVmVjdG9yMygpLCBwMSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBwdSA9IG5ldyBWZWN0b3IzKCksIHB2ID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgaSwgajtcblxuXHRpZiAoIGZ1bmMubGVuZ3RoIDwgMyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5QYXJhbWV0cmljR2VvbWV0cnk6IEZ1bmN0aW9uIG11c3Qgbm93IG1vZGlmeSBhIFZlY3RvcjMgYXMgdGhpcmQgcGFyYW1ldGVyLicgKTtcblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdHZhciBzbGljZUNvdW50ID0gc2xpY2VzICsgMTtcblxuXHRmb3IgKCBpID0gMDsgaSA8PSBzdGFja3M7IGkgKysgKSB7XG5cblx0XHR2YXIgdiA9IGkgLyBzdGFja3M7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSBzbGljZXM7IGogKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaiAvIHNsaWNlcztcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdGZ1bmMoIHUsIHYsIHAwICk7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCBwMC54LCBwMC55LCBwMC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHQvLyBhcHByb3hpbWF0ZSB0YW5nZW50IHZlY3RvcnMgdmlhIGZpbml0ZSBkaWZmZXJlbmNlc1xuXG5cdFx0XHRpZiAoIHUgLSBFUFMgPj0gMCApIHtcblxuXHRcdFx0XHRmdW5jKCB1IC0gRVBTLCB2LCBwMSApO1xuXHRcdFx0XHRwdS5zdWJWZWN0b3JzKCBwMCwgcDEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmdW5jKCB1ICsgRVBTLCB2LCBwMSApO1xuXHRcdFx0XHRwdS5zdWJWZWN0b3JzKCBwMSwgcDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHYgLSBFUFMgPj0gMCApIHtcblxuXHRcdFx0XHRmdW5jKCB1LCB2IC0gRVBTLCBwMSApO1xuXHRcdFx0XHRwdi5zdWJWZWN0b3JzKCBwMCwgcDEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmdW5jKCB1LCB2ICsgRVBTLCBwMSApO1xuXHRcdFx0XHRwdi5zdWJWZWN0b3JzKCBwMSwgcDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjcm9zcyBwcm9kdWN0IG9mIHRhbmdlbnQgdmVjdG9ycyByZXR1cm5zIHN1cmZhY2Ugbm9ybWFsXG5cblx0XHRcdG5vcm1hbC5jcm9zc1ZlY3RvcnMoIHB1LCBwdiApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCB1LCB2ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBpID0gMDsgaSA8IHN0YWNrczsgaSArKyApIHtcblxuXHRcdGZvciAoIGogPSAwOyBqIDwgc2xpY2VzOyBqICsrICkge1xuXG5cdFx0XHR2YXIgYSA9IGkgKiBzbGljZUNvdW50ICsgajtcblx0XHRcdHZhciBiID0gaSAqIHNsaWNlQ291bnQgKyBqICsgMTtcblx0XHRcdHZhciBjID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGogKyAxO1xuXHRcdFx0dmFyIGQgPSAoIGkgKyAxICkgKiBzbGljZUNvdW50ICsgajtcblxuXHRcdFx0Ly8gZmFjZXMgb25lIGFuZCB0d29cblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk7XG5cblxuZXhwb3J0IHsgUGFyYW1ldHJpY0dlb21ldHJ5LCBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkgfTtcbiIsIi8qKlxuICogQGF1dGhvciBjbG9ja3dvcmtnZWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL2Nsb2Nrd29ya2dlZWtcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xuXG4vLyBQb2x5aGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gUG9seWhlZHJvbkdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2x5aGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR2ZXJ0aWNlczogdmVydGljZXMsXG5cdFx0aW5kaWNlczogaW5kaWNlcyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Qb2x5aGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Qb2x5aGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9seWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR2ZXJ0aWNlczogdmVydGljZXMsXG5cdFx0aW5kaWNlczogaW5kaWNlcyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHRkZXRhaWwgPSBkZXRhaWwgfHwgMDtcblxuXHQvLyBkZWZhdWx0IGJ1ZmZlciBkYXRhXG5cblx0dmFyIHZlcnRleEJ1ZmZlciA9IFtdO1xuXHR2YXIgdXZCdWZmZXIgPSBbXTtcblxuXHQvLyB0aGUgc3ViZGl2aXNpb24gY3JlYXRlcyB0aGUgdmVydGV4IGJ1ZmZlciBkYXRhXG5cblx0c3ViZGl2aWRlKCBkZXRhaWwgKTtcblxuXHQvLyBhbGwgdmVydGljZXMgc2hvdWxkIGxpZSBvbiBhIGNvbmNlcHR1YWwgc3BoZXJlIHdpdGggYSBnaXZlbiByYWRpdXNcblxuXHRhcHBwbHlSYWRpdXMoIHJhZGl1cyApO1xuXG5cdC8vIGZpbmFsbHksIGNyZWF0ZSB0aGUgdXYgZGF0YVxuXG5cdGdlbmVyYXRlVVZzKCk7XG5cblx0Ly8gYnVpbGQgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcblxuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlciwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlci5zbGljZSgpLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dkJ1ZmZlciwgMiApICk7XG5cblx0aWYgKCBkZXRhaWwgPT09IDAgKSB7XG5cblx0XHR0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7IC8vIGZsYXQgbm9ybWFsc1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTsgLy8gc21vb3RoIG5vcm1hbHNcblxuXHR9XG5cblx0Ly8gaGVscGVyIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIHN1YmRpdmlkZSggZGV0YWlsICkge1xuXG5cdFx0dmFyIGEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBiID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBpdGVyYXRlIG92ZXIgYWxsIGZhY2VzIGFuZCBhcHBseSBhIHN1YmRpdmlzb24gd2l0aCB0aGUgZ2l2ZW4gZGV0YWlsIHZhbHVlXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHQvLyBnZXQgdGhlIHZlcnRpY2VzIG9mIHRoZSBmYWNlXG5cblx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAwIF0sIGEgKTtcblx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAxIF0sIGIgKTtcblx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAyIF0sIGMgKTtcblxuXHRcdFx0Ly8gcGVyZm9ybSBzdWJkaXZpc2lvblxuXG5cdFx0XHRzdWJkaXZpZGVGYWNlKCBhLCBiLCBjLCBkZXRhaWwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICkge1xuXG5cdFx0dmFyIGNvbHMgPSBNYXRoLnBvdyggMiwgZGV0YWlsICk7XG5cblx0XHQvLyB3ZSB1c2UgdGhpcyBtdWx0aWRpbWVuc2lvbmFsIGFycmF5IGFzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIGNyZWF0aW5nIHRoZSBzdWJkaXZpc2lvblxuXG5cdFx0dmFyIHYgPSBbXTtcblxuXHRcdHZhciBpLCBqO1xuXG5cdFx0Ly8gY29uc3RydWN0IGFsbCBvZiB0aGUgdmVydGljZXMgZm9yIHRoaXMgc3ViZGl2aXNpb25cblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IGNvbHM7IGkgKysgKSB7XG5cblx0XHRcdHZbIGkgXSA9IFtdO1xuXG5cdFx0XHR2YXIgYWogPSBhLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTtcblx0XHRcdHZhciBiaiA9IGIuY2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApO1xuXG5cdFx0XHR2YXIgcm93cyA9IGNvbHMgLSBpO1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8PSByb3dzOyBqICsrICkge1xuXG5cdFx0XHRcdGlmICggaiA9PT0gMCAmJiBpID09PSBjb2xzICkge1xuXG5cdFx0XHRcdFx0dlsgaSBdWyBqIF0gPSBhajtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dlsgaSBdWyBqIF0gPSBhai5jbG9uZSgpLmxlcnAoIGJqLCBqIC8gcm93cyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29uc3RydWN0IGFsbCBvZiB0aGUgZmFjZXNcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgY29sczsgaSArKyApIHtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPCAyICogKCBjb2xzIC0gaSApIC0gMTsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgayA9IE1hdGguZmxvb3IoIGogLyAyICk7XG5cblx0XHRcdFx0aWYgKCBqICUgMiA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApO1xuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApO1xuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApO1xuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gYXBwcGx5UmFkaXVzKCByYWRpdXMgKSB7XG5cblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGJ1ZmZlciBhbmQgYXBwbHkgdGhlIHJhZGl1cyB0byBlYWNoIHZlcnRleFxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHR2ZXJ0ZXgueCA9IHZlcnRleEJ1ZmZlclsgaSArIDAgXTtcblx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xuXHRcdFx0dmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF07XG5cblx0XHRcdHZlcnRleC5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggcmFkaXVzICk7XG5cblx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDAgXSA9IHZlcnRleC54O1xuXHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMSBdID0gdmVydGV4Lnk7XG5cdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gPSB2ZXJ0ZXguejtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7XG5cblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTtcblx0XHRcdHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdO1xuXG5cdFx0XHR2YXIgdSA9IGF6aW11dGgoIHZlcnRleCApIC8gMiAvIE1hdGguUEkgKyAwLjU7XG5cdFx0XHR2YXIgdiA9IGluY2xpbmF0aW9uKCB2ZXJ0ZXggKSAvIE1hdGguUEkgKyAwLjU7XG5cdFx0XHR1dkJ1ZmZlci5wdXNoKCB1LCAxIC0gdiApO1xuXG5cdFx0fVxuXG5cdFx0Y29ycmVjdFVWcygpO1xuXG5cdFx0Y29ycmVjdFNlYW0oKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gY29ycmVjdFNlYW0oKSB7XG5cblx0XHQvLyBoYW5kbGUgY2FzZSB3aGVuIGZhY2Ugc3RyYWRkbGVzIHRoZSBzZWFtLCBzZWUgIzMyNjlcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHV2QnVmZmVyLmxlbmd0aDsgaSArPSA2ICkge1xuXG5cdFx0XHQvLyB1diBkYXRhIG9mIGEgc2luZ2xlIGZhY2VcblxuXHRcdFx0dmFyIHgwID0gdXZCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2YXIgeDEgPSB1dkJ1ZmZlclsgaSArIDIgXTtcblx0XHRcdHZhciB4MiA9IHV2QnVmZmVyWyBpICsgNCBdO1xuXG5cdFx0XHR2YXIgbWF4ID0gTWF0aC5tYXgoIHgwLCB4MSwgeDIgKTtcblx0XHRcdHZhciBtaW4gPSBNYXRoLm1pbiggeDAsIHgxLCB4MiApO1xuXG5cdFx0XHQvLyAwLjkgaXMgc29tZXdoYXQgYXJiaXRyYXJ5XG5cblx0XHRcdGlmICggbWF4ID4gMC45ICYmIG1pbiA8IDAuMSApIHtcblxuXHRcdFx0XHRpZiAoIHgwIDwgMC4yICkgdXZCdWZmZXJbIGkgKyAwIF0gKz0gMTtcblx0XHRcdFx0aWYgKCB4MSA8IDAuMiApIHV2QnVmZmVyWyBpICsgMiBdICs9IDE7XG5cdFx0XHRcdGlmICggeDIgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDQgXSArPSAxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hWZXJ0ZXgoIHZlcnRleCApIHtcblxuXHRcdHZlcnRleEJ1ZmZlci5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFZlcnRleEJ5SW5kZXgoIGluZGV4LCB2ZXJ0ZXggKSB7XG5cblx0XHR2YXIgc3RyaWRlID0gaW5kZXggKiAzO1xuXG5cdFx0dmVydGV4LnggPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMCBdO1xuXHRcdHZlcnRleC55ID0gdmVydGljZXNbIHN0cmlkZSArIDEgXTtcblx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBzdHJpZGUgKyAyIF07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RVVnMoKSB7XG5cblx0XHR2YXIgYSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBjID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBjZW50cm9pZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdXZBID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZCID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZDID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDksIGogKz0gNiApIHtcblxuXHRcdFx0YS5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDAgXSwgdmVydGV4QnVmZmVyWyBpICsgMSBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gKTtcblx0XHRcdGIuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAzIF0sIHZlcnRleEJ1ZmZlclsgaSArIDQgXSwgdmVydGV4QnVmZmVyWyBpICsgNSBdICk7XG5cdFx0XHRjLnNldCggdmVydGV4QnVmZmVyWyBpICsgNiBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA3IF0sIHZlcnRleEJ1ZmZlclsgaSArIDggXSApO1xuXG5cdFx0XHR1dkEuc2V0KCB1dkJ1ZmZlclsgaiArIDAgXSwgdXZCdWZmZXJbIGogKyAxIF0gKTtcblx0XHRcdHV2Qi5zZXQoIHV2QnVmZmVyWyBqICsgMiBdLCB1dkJ1ZmZlclsgaiArIDMgXSApO1xuXHRcdFx0dXZDLnNldCggdXZCdWZmZXJbIGogKyA0IF0sIHV2QnVmZmVyWyBqICsgNSBdICk7XG5cblx0XHRcdGNlbnRyb2lkLmNvcHkoIGEgKS5hZGQoIGIgKS5hZGQoIGMgKS5kaXZpZGVTY2FsYXIoIDMgKTtcblxuXHRcdFx0dmFyIGF6aSA9IGF6aW11dGgoIGNlbnRyb2lkICk7XG5cblx0XHRcdGNvcnJlY3RVViggdXZBLCBqICsgMCwgYSwgYXppICk7XG5cdFx0XHRjb3JyZWN0VVYoIHV2QiwgaiArIDIsIGIsIGF6aSApO1xuXHRcdFx0Y29ycmVjdFVWKCB1dkMsIGogKyA0LCBjLCBhemkgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gY29ycmVjdFVWKCB1diwgc3RyaWRlLCB2ZWN0b3IsIGF6aW11dGggKSB7XG5cblx0XHRpZiAoICggYXppbXV0aCA8IDAgKSAmJiAoIHV2LnggPT09IDEgKSApIHtcblxuXHRcdFx0dXZCdWZmZXJbIHN0cmlkZSBdID0gdXYueCAtIDE7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdmVjdG9yLnggPT09IDAgKSAmJiAoIHZlY3Rvci56ID09PSAwICkgKSB7XG5cblx0XHRcdHV2QnVmZmVyWyBzdHJpZGUgXSA9IGF6aW11dGggLyAyIC8gTWF0aC5QSSArIDAuNTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQW5nbGUgYXJvdW5kIHRoZSBZIGF4aXMsIGNvdW50ZXItY2xvY2t3aXNlIHdoZW4gbG9va2luZyBmcm9tIGFib3ZlLlxuXG5cdGZ1bmN0aW9uIGF6aW11dGgoIHZlY3RvciApIHtcblxuXHRcdHJldHVybiBNYXRoLmF0YW4yKCB2ZWN0b3IueiwgLSB2ZWN0b3IueCApO1xuXG5cdH1cblxuXG5cdC8vIEFuZ2xlIGFib3ZlIHRoZSBYWiBwbGFuZS5cblxuXHRmdW5jdGlvbiBpbmNsaW5hdGlvbiggdmVjdG9yICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYXRhbjIoIC0gdmVjdG9yLnksIE1hdGguc3FydCggKCB2ZWN0b3IueCAqIHZlY3Rvci54ICkgKyAoIHZlY3Rvci56ICogdmVjdG9yLnogKSApICk7XG5cblx0fVxuXG59XG5cblBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cblxuZXhwb3J0IHsgUG9seWhlZHJvbkdlb21ldHJ5LCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkgfTtcbiIsIi8qKlxuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi9Qb2x5aGVkcm9uR2VvbWV0cnkuanMnO1xuXG4vLyBUZXRyYWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRldHJhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblRldHJhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXRyYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDEsIDEsIDEsIFx0LSAxLCAtIDEsIDEsIFx0LSAxLCAxLCAtIDEsIFx0MSwgLSAxLCAtIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQyLCAxLCAwLCBcdDAsIDMsIDIsXHQxLCAzLCAwLFx0MiwgMywgMVxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cblxuZXhwb3J0IHsgVGV0cmFoZWRyb25HZW9tZXRyeSwgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9HZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuL1BvbHloZWRyb25HZW9tZXRyeS5qcyc7XG5cbi8vIE9jdGFoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBPY3RhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnT2N0YWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5PY3RhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5PY3RhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2N0YWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cdFx0MSwgMCwgMCwgXHQtIDEsIDAsIDAsXHQwLCAxLCAwLFxuXHRcdDAsIC0gMSwgMCwgXHQwLCAwLCAxLFx0MCwgMCwgLSAxXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0MCwgMiwgNCxcdDAsIDQsIDMsXHQwLCAzLCA1LFxuXHRcdDAsIDUsIDIsXHQxLCAyLCA1LFx0MSwgNSwgMyxcblx0XHQxLCAzLCA0LFx0MSwgNCwgMlxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5PY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuXG5leHBvcnQgeyBPY3RhaGVkcm9uR2VvbWV0cnksIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9HZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuL1BvbHloZWRyb25HZW9tZXRyeS5qcyc7XG5cbi8vIEljb3NhaGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gSWNvc2FoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuSWNvc2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkljb3NhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25HZW9tZXRyeTtcblxuLy8gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHR2YXIgdCA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQtIDEsIHQsIDAsIFx0MSwgdCwgMCwgXHQtIDEsIC0gdCwgMCwgXHQxLCAtIHQsIDAsXG5cdFx0IDAsIC0gMSwgdCwgXHQwLCAxLCB0LFx0MCwgLSAxLCAtIHQsIFx0MCwgMSwgLSB0LFxuXHRcdCB0LCAwLCAtIDEsIFx0dCwgMCwgMSwgXHQtIHQsIDAsIC0gMSwgXHQtIHQsIDAsIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQgMCwgMTEsIDUsIFx0MCwgNSwgMSwgXHQwLCAxLCA3LCBcdDAsIDcsIDEwLCBcdDAsIDEwLCAxMSxcblx0XHQgMSwgNSwgOSwgXHQ1LCAxMSwgNCxcdDExLCAxMCwgMixcdDEwLCA3LCA2LFx0NywgMSwgOCxcblx0XHQgMywgOSwgNCwgXHQzLCA0LCAyLFx0MywgMiwgNixcdDMsIDYsIDgsXHQzLCA4LCA5LFxuXHRcdCA0LCA5LCA1LCBcdDIsIDQsIDExLFx0NiwgMiwgMTAsXHQ4LCA2LCA3LFx0OSwgOCwgMVxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cblxuZXhwb3J0IHsgSWNvc2FoZWRyb25HZW9tZXRyeSwgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIEFiZSBQYXpvcyAvIGh0dHBzOi8vaGFtb2lkLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi9Qb2x5aGVkcm9uR2VvbWV0cnkuanMnO1xuXG4vLyBEb2RlY2FoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Eb2RlY2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkRvZGVjYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjtcblx0dmFyIHIgPSAxIC8gdDtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cblx0XHQvLyAowrExLCDCsTEsIMKxMSlcblx0XHQtIDEsIC0gMSwgLSAxLFx0LSAxLCAtIDEsIDEsXG5cdFx0LSAxLCAxLCAtIDEsIC0gMSwgMSwgMSxcblx0XHQxLCAtIDEsIC0gMSwgMSwgLSAxLCAxLFxuXHRcdDEsIDEsIC0gMSwgMSwgMSwgMSxcblxuXHRcdC8vICgwLCDCsTEvz4YsIMKxz4YpXG5cdFx0IDAsIC0gciwgLSB0LCAwLCAtIHIsIHQsXG5cdFx0IDAsIHIsIC0gdCwgMCwgciwgdCxcblxuXHRcdC8vICjCsTEvz4YsIMKxz4YsIDApXG5cdFx0LSByLCAtIHQsIDAsIC0gciwgdCwgMCxcblx0XHQgciwgLSB0LCAwLCByLCB0LCAwLFxuXG5cdFx0Ly8gKMKxz4YsIDAsIMKxMS/Philcblx0XHQtIHQsIDAsIC0gciwgdCwgMCwgLSByLFxuXHRcdC0gdCwgMCwgciwgdCwgMCwgclxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdDMsIDExLCA3LCBcdDMsIDcsIDE1LCBcdDMsIDE1LCAxMyxcblx0XHQ3LCAxOSwgMTcsIFx0NywgMTcsIDYsIFx0NywgNiwgMTUsXG5cdFx0MTcsIDQsIDgsIFx0MTcsIDgsIDEwLCBcdDE3LCAxMCwgNixcblx0XHQ4LCAwLCAxNiwgXHQ4LCAxNiwgMiwgXHQ4LCAyLCAxMCxcblx0XHQwLCAxMiwgMSwgXHQwLCAxLCAxOCwgXHQwLCAxOCwgMTYsXG5cdFx0NiwgMTAsIDIsIFx0NiwgMiwgMTMsIFx0NiwgMTMsIDE1LFxuXHRcdDIsIDE2LCAxOCwgXHQyLCAxOCwgMywgXHQyLCAzLCAxMyxcblx0XHQxOCwgMSwgOSwgXHQxOCwgOSwgMTEsIFx0MTgsIDExLCAzLFxuXHRcdDQsIDE0LCAxMiwgXHQ0LCAxMiwgMCwgXHQ0LCAwLCA4LFxuXHRcdDExLCA5LCA1LCBcdDExLCA1LCAxOSwgXHQxMSwgMTksIDcsXG5cdFx0MTksIDUsIDE0LCBcdDE5LCAxNCwgNCwgXHQxOSwgNCwgMTcsXG5cdFx0MSwgMTIsIDE0LCBcdDEsIDE0LCA1LCBcdDEsIDUsIDlcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuXG5leHBvcnQgeyBEb2RlY2FoZWRyb25HZW9tZXRyeSwgRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkgfTtcbiIsIi8qKlxuICogQGF1dGhvciBvb3Ntb3hpZWNvZGUgLyBodHRwczovL2dpdGh1Yi5jb20vb29zbW94aWVjb2RlXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBtaW5pbmdvbGQgLyBodHRwczovL2dpdGh1Yi5jb20vbWluaW5nb2xkXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwczovL2dpdGh1Yi5jb20vam9ub2JyMVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKi9cblxuaW1wb3J0IHsgR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0dlb21ldHJ5LmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcblxuLy8gVHViZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFR1YmVHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQsIHRhcGVyICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVHViZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cGF0aDogcGF0aCxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0Y2xvc2VkOiBjbG9zZWRcblx0fTtcblxuXHRpZiAoIHRhcGVyICE9PSB1bmRlZmluZWQgKSBjb25zb2xlLndhcm4oICdUSFJFRS5UdWJlR2VvbWV0cnk6IHRhcGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdHZhciBidWZmZXJHZW9tZXRyeSA9IG5ldyBUdWJlQnVmZmVyR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkICk7XG5cblx0Ly8gZXhwb3NlIGludGVybmFsc1xuXG5cdHRoaXMudGFuZ2VudHMgPSBidWZmZXJHZW9tZXRyeS50YW5nZW50cztcblx0dGhpcy5ub3JtYWxzID0gYnVmZmVyR2VvbWV0cnkubm9ybWFscztcblx0dGhpcy5iaW5vcm1hbHMgPSBidWZmZXJHZW9tZXRyeS5iaW5vcm1hbHM7XG5cblx0Ly8gY3JlYXRlIGdlb21ldHJ5XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIGJ1ZmZlckdlb21ldHJ5ICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblR1YmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblR1YmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlR2VvbWV0cnk7XG5cbi8vIFR1YmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUdWJlQnVmZmVyR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVHViZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cGF0aDogcGF0aCxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0Y2xvc2VkOiBjbG9zZWRcblx0fTtcblxuXHR0dWJ1bGFyU2VnbWVudHMgPSB0dWJ1bGFyU2VnbWVudHMgfHwgNjQ7XG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHRyYWRpYWxTZWdtZW50cyA9IHJhZGlhbFNlZ21lbnRzIHx8IDg7XG5cdGNsb3NlZCA9IGNsb3NlZCB8fCBmYWxzZTtcblxuXHR2YXIgZnJhbWVzID0gcGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCB0dWJ1bGFyU2VnbWVudHMsIGNsb3NlZCApO1xuXG5cdC8vIGV4cG9zZSBpbnRlcm5hbHNcblxuXHR0aGlzLnRhbmdlbnRzID0gZnJhbWVzLnRhbmdlbnRzO1xuXHR0aGlzLm5vcm1hbHMgPSBmcmFtZXMubm9ybWFscztcblx0dGhpcy5iaW5vcm1hbHMgPSBmcmFtZXMuYmlub3JtYWxzO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdHZhciBQID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgaSwgajtcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXG5cdC8vIGNyZWF0ZSBidWZmZXIgZGF0YVxuXG5cdGdlbmVyYXRlQnVmZmVyRGF0YSgpO1xuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHQvLyBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBnZW5lcmF0ZUJ1ZmZlckRhdGEoKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Z2VuZXJhdGVTZWdtZW50KCBpICk7XG5cblx0XHR9XG5cblx0XHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgbm90IGNsb3NlZCwgZ2VuZXJhdGUgdGhlIGxhc3Qgcm93IG9mIHZlcnRpY2VzIGFuZCBub3JtYWxzXG5cdFx0Ly8gYXQgdGhlIHJlZ3VsYXIgcG9zaXRpb24gb24gdGhlIGdpdmVuIHBhdGhcblx0XHQvL1xuXHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBjbG9zZWQsIGR1cGxpY2F0ZSB0aGUgZmlyc3Qgcm93IG9mIHZlcnRpY2VzIGFuZCBub3JtYWxzICh1dnMgd2lsbCBkaWZmZXIpXG5cblx0XHRnZW5lcmF0ZVNlZ21lbnQoICggY2xvc2VkID09PSBmYWxzZSApID8gdHVidWxhclNlZ21lbnRzIDogMCApO1xuXG5cdFx0Ly8gdXZzIGFyZSBnZW5lcmF0ZWQgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbi5cblx0XHQvLyB0aGlzIG1ha2VzIGl0IGVhc3kgY29tcHV0ZSBjb3JyZWN0IHZhbHVlcyBmb3IgY2xvc2VkIGdlb21ldHJpZXNcblxuXHRcdGdlbmVyYXRlVVZzKCk7XG5cblx0XHQvLyBmaW5hbGx5IGNyZWF0ZSBmYWNlc1xuXG5cdFx0Z2VuZXJhdGVJbmRpY2VzKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlU2VnbWVudCggaSApIHtcblxuXHRcdC8vIHdlIHVzZSBnZXRQb2ludEF0IHRvIHNhbXBsZSBldmVubHkgZGlzdHJpYnV0ZWQgcG9pbnRzIGZyb20gdGhlIGdpdmVuIHBhdGhcblxuXHRcdFAgPSBwYXRoLmdldFBvaW50QXQoIGkgLyB0dWJ1bGFyU2VnbWVudHMsIFAgKTtcblxuXHRcdC8vIHJldHJpZXZlIGNvcnJlc3BvbmRpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbFxuXG5cdFx0dmFyIE4gPSBmcmFtZXMubm9ybWFsc1sgaSBdO1xuXHRcdHZhciBCID0gZnJhbWVzLmJpbm9ybWFsc1sgaSBdO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgbm9ybWFscyBhbmQgdmVydGljZXMgZm9yIHRoZSBjdXJyZW50IHNlZ21lbnRcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHR2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xuXG5cdFx0XHR2YXIgc2luID0gTWF0aC5zaW4oIHYgKTtcblx0XHRcdHZhciBjb3MgPSAtIE1hdGguY29zKCB2ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWwueCA9ICggY29zICogTi54ICsgc2luICogQi54ICk7XG5cdFx0XHRub3JtYWwueSA9ICggY29zICogTi55ICsgc2luICogQi55ICk7XG5cdFx0XHRub3JtYWwueiA9ICggY29zICogTi56ICsgc2luICogQi56ICk7XG5cdFx0XHRub3JtYWwubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSBQLnggKyByYWRpdXMgKiBub3JtYWwueDtcblx0XHRcdHZlcnRleC55ID0gUC55ICsgcmFkaXVzICogbm9ybWFsLnk7XG5cdFx0XHR2ZXJ0ZXgueiA9IFAueiArIHJhZGl1cyAqIG5vcm1hbC56O1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlSW5kaWNlcygpIHtcblxuXHRcdGZvciAoIGogPSAxOyBqIDw9IHR1YnVsYXJTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0Zm9yICggaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0XHR2YXIgYiA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgKCBpIC0gMSApO1xuXHRcdFx0XHR2YXIgYyA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgaTtcblx0XHRcdFx0dmFyIGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVVWcygpIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdFx0dXYueCA9IGkgLyB0dWJ1bGFyU2VnbWVudHM7XG5cdFx0XHRcdHV2LnkgPSBqIC8gcmFkaWFsU2VnbWVudHM7XG5cblx0XHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5UdWJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5UdWJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHViZUJ1ZmZlckdlb21ldHJ5O1xuXG5cbmV4cG9ydCB7IFR1YmVHZW9tZXRyeSwgVHViZUJ1ZmZlckdlb21ldHJ5IH07XG4iLCIvKipcbiAqIEBhdXRob3Igb29zbW94aWVjb2RlXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqIGJhc2VkIG9uIGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wcXRvcnVzL1xuICovXG5cbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9HZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuXG4vLyBUb3J1c0tub3RHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0tub3RHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxLCBoZWlnaHRTY2FsZSApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0cDogcCxcblx0XHRxOiBxXG5cdH07XG5cblx0aWYgKCBoZWlnaHRTY2FsZSAhPT0gdW5kZWZpbmVkICkgY29uc29sZS53YXJuKCAnVEhSRUUuVG9ydXNLbm90R2VvbWV0cnk6IGhlaWdodFNjYWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2NhbGUoIHgsIHksIHogKSBpbnN0ZWFkLicgKTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1YnVsYXJTZWdtZW50cywgcmFkaWFsU2VnbWVudHMsIHAsIHEgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Ub3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzS25vdEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzS25vdEdlb21ldHJ5O1xuXG4vLyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNLbm90QnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRwOiBwLFxuXHRcdHE6IHFcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0dHViZSA9IHR1YmUgfHwgMC40O1xuXHR0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKSB8fCA2NDtcblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdHAgPSBwIHx8IDI7XG5cdHEgPSBxIHx8IDM7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpLCBqO1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgUDEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgUDIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBCID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIFQgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgTiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgKysgaSApIHtcblxuXHRcdC8vIHRoZSByYWRpYW4gXCJ1XCIgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZSBvZiB0aGUgY3VycmVudCB0dWJ1bGFyIHNlZ2VtZW50XG5cblx0XHR2YXIgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBwICogTWF0aC5QSSAqIDI7XG5cblx0XHQvLyBub3cgd2UgY2FsY3VsYXRlIHR3byBwb2ludHMuIFAxIGlzIG91ciBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZSwgUDIgaXMgYSBsaXR0bGUgZmFydGhlciBhaGVhZC5cblx0XHQvLyB0aGVzZSBwb2ludHMgYXJlIHVzZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBcImNvb3JkaW5hdGUgc3BhY2VcIiwgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2ZXJ0ZXggcG9zaXRpb25zXG5cblx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgUDEgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUgKyAwLjAxLCBwLCBxLCByYWRpdXMsIFAyICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgb3J0aG9ub3JtYWwgYmFzaXNcblxuXHRcdFQuc3ViVmVjdG9ycyggUDIsIFAxICk7XG5cdFx0Ti5hZGRWZWN0b3JzKCBQMiwgUDEgKTtcblx0XHRCLmNyb3NzVmVjdG9ycyggVCwgTiApO1xuXHRcdE4uY3Jvc3NWZWN0b3JzKCBCLCBUICk7XG5cblx0XHQvLyBub3JtYWxpemUgQiwgTi4gVCBjYW4gYmUgaWdub3JlZCwgd2UgZG9uJ3QgdXNlIGl0XG5cblx0XHRCLm5vcm1hbGl6ZSgpO1xuXHRcdE4ubm9ybWFsaXplKCk7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgKysgaiApIHtcblxuXHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgdmVydGljZXMuIHRoZXkgYXJlIG5vdGhpbmcgbW9yZSB0aGFuIGFuIGV4dHJ1c2lvbiBvZiB0aGUgdG9ydXMgY3VydmUuXG5cdFx0XHQvLyBiZWNhdXNlIHdlIGV4dHJ1ZGUgYSBzaGFwZSBpbiB0aGUgeHktcGxhbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsY3VsYXRlIGEgei12YWx1ZS5cblxuXHRcdFx0dmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblx0XHRcdHZhciBjeCA9IC0gdHViZSAqIE1hdGguY29zKCB2ICk7XG5cdFx0XHR2YXIgY3kgPSB0dWJlICogTWF0aC5zaW4oIHYgKTtcblxuXHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgZmluYWwgdmVydGV4IHBvc2l0aW9uLlxuXHRcdFx0Ly8gZmlyc3Qgd2Ugb3JpZW50IHRoZSBleHRydXNpb24gd2l0aCBvdXIgYmFzaXMgdmVjdG9zLCB0aGVuIHdlIGFkZCBpdCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmVcblxuXHRcdFx0dmVydGV4LnggPSBQMS54ICsgKCBjeCAqIE4ueCArIGN5ICogQi54ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IFAxLnkgKyAoIGN4ICogTi55ICsgY3kgKiBCLnkgKTtcblx0XHRcdHZlcnRleC56ID0gUDEueiArICggY3ggKiBOLnogKyBjeSAqIEIueiApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbCAoUDEgaXMgYWx3YXlzIHRoZSBjZW50ZXIvb3JpZ2luIG9mIHRoZSBleHRydXNpb24sIHRodXMgd2UgY2FuIHVzZSBpdCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbClcblxuXHRcdFx0bm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgUDEgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7XG5cdFx0XHR1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBqID0gMTsgaiA8PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHR2YXIgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7XG5cdFx0XHR2YXIgYiA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgKCBpIC0gMSApO1xuXHRcdFx0dmFyIGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7XG5cdFx0XHR2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gdGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZVxuXG5cdGZ1bmN0aW9uIGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSwgcCwgcSwgcmFkaXVzLCBwb3NpdGlvbiApIHtcblxuXHRcdHZhciBjdSA9IE1hdGguY29zKCB1ICk7XG5cdFx0dmFyIHN1ID0gTWF0aC5zaW4oIHUgKTtcblx0XHR2YXIgcXVPdmVyUCA9IHEgLyBwICogdTtcblx0XHR2YXIgY3MgPSBNYXRoLmNvcyggcXVPdmVyUCApO1xuXG5cdFx0cG9zaXRpb24ueCA9IHJhZGl1cyAqICggMiArIGNzICkgKiAwLjUgKiBjdTtcblx0XHRwb3NpdGlvbi55ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIHN1ICogMC41O1xuXHRcdHBvc2l0aW9uLnogPSByYWRpdXMgKiBNYXRoLnNpbiggcXVPdmVyUCApICogMC41O1xuXG5cdH1cblxufVxuXG5Ub3J1c0tub3RCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5O1xuXG5cbmV4cG9ydCB7IFRvcnVzS25vdEdlb21ldHJ5LCBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZVxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuaW1wb3J0IHsgR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0dlb21ldHJ5LmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XG5cbi8vIFRvcnVzR2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0YXJjOiBhcmNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRvcnVzQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNHZW9tZXRyeTtcblxuLy8gVG9ydXNCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0J1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRhcmM6IGFyY1xuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHR0dWJlID0gdHViZSB8fCAwLjQ7XG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHR0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKSB8fCA2O1xuXHRhcmMgPSBhcmMgfHwgTWF0aC5QSSAqIDI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGosIGk7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBhcmM7XG5cdFx0XHR2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSAoIHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRoLmNvcyggdSApO1xuXHRcdFx0dmVydGV4LnkgPSAoIHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRoLnNpbiggdSApO1xuXHRcdFx0dmVydGV4LnogPSB0dWJlICogTWF0aC5zaW4oIHYgKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0Y2VudGVyLnggPSByYWRpdXMgKiBNYXRoLmNvcyggdSApO1xuXHRcdFx0Y2VudGVyLnkgPSByYWRpdXMgKiBNYXRoLnNpbiggdSApO1xuXHRcdFx0bm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgY2VudGVyICkubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApO1xuXHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaiA9IDE7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIGluZGljZXNcblxuXHRcdFx0dmFyIGEgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpIC0gMTtcblx0XHRcdHZhciBiID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpIC0gMTtcblx0XHRcdHZhciBjID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXHRcdFx0dmFyIGQgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuVG9ydXNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNCdWZmZXJHZW9tZXRyeTtcblxuXG5leHBvcnQgeyBUb3J1c0dlb21ldHJ5LCBUb3J1c0J1ZmZlckdlb21ldHJ5IH07XG4iLCIvKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBQb3J0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9lYXJjdXQgKHYyLjEuMilcbiAqL1xuXG52YXIgRWFyY3V0ID0ge1xuXG5cdHRyaWFuZ3VsYXRlOiBmdW5jdGlvbiAoIGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gKSB7XG5cblx0XHRkaW0gPSBkaW0gfHwgMjtcblxuXHRcdHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aCxcblx0XHRcdG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1sgMCBdICogZGltIDogZGF0YS5sZW5ndGgsXG5cdFx0XHRvdXRlck5vZGUgPSBsaW5rZWRMaXN0KCBkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlICksXG5cdFx0XHR0cmlhbmdsZXMgPSBbXTtcblxuXHRcdGlmICggISBvdXRlck5vZGUgKSByZXR1cm4gdHJpYW5nbGVzO1xuXG5cdFx0dmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIGludlNpemU7XG5cblx0XHRpZiAoIGhhc0hvbGVzICkgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApO1xuXG5cdFx0Ly8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG5cblx0XHRpZiAoIGRhdGEubGVuZ3RoID4gODAgKiBkaW0gKSB7XG5cblx0XHRcdG1pblggPSBtYXhYID0gZGF0YVsgMCBdO1xuXHRcdFx0bWluWSA9IG1heFkgPSBkYXRhWyAxIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltICkge1xuXG5cdFx0XHRcdHggPSBkYXRhWyBpIF07XG5cdFx0XHRcdHkgPSBkYXRhWyBpICsgMSBdO1xuXHRcdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0XHRpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cblxuXHRcdFx0aW52U2l6ZSA9IE1hdGgubWF4KCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkgKTtcblx0XHRcdGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuXG5cdFx0fVxuXG5cdFx0ZWFyY3V0TGlua2VkKCBvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXG5cdH1cblxufTtcblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5cbmZ1bmN0aW9uIGxpbmtlZExpc3QoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlICkge1xuXG5cdHZhciBpLCBsYXN0O1xuXG5cdGlmICggY2xvY2t3aXNlID09PSAoIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApID4gMCApICkge1xuXG5cdFx0Zm9yICggaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSApIGxhc3QgPSBpbnNlcnROb2RlKCBpLCBkYXRhWyBpIF0sIGRhdGFbIGkgKyAxIF0sIGxhc3QgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Zm9yICggaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0gKSBsYXN0ID0gaW5zZXJ0Tm9kZSggaSwgZGF0YVsgaSBdLCBkYXRhWyBpICsgMSBdLCBsYXN0ICk7XG5cblx0fVxuXG5cdGlmICggbGFzdCAmJiBlcXVhbHMoIGxhc3QsIGxhc3QubmV4dCApICkge1xuXG5cdFx0cmVtb3ZlTm9kZSggbGFzdCApO1xuXHRcdGxhc3QgPSBsYXN0Lm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiBsYXN0O1xuXG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5cbmZ1bmN0aW9uIGZpbHRlclBvaW50cyggc3RhcnQsIGVuZCApIHtcblxuXHRpZiAoICEgc3RhcnQgKSByZXR1cm4gc3RhcnQ7XG5cdGlmICggISBlbmQgKSBlbmQgPSBzdGFydDtcblxuXHR2YXIgcCA9IHN0YXJ0LCBhZ2FpbjtcblxuXHRkbyB7XG5cblx0XHRhZ2FpbiA9IGZhbHNlO1xuXG5cdFx0aWYgKCAhIHAuc3RlaW5lciAmJiAoIGVxdWFscyggcCwgcC5uZXh0ICkgfHwgYXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA9PT0gMCApICkge1xuXG5cdFx0XHRyZW1vdmVOb2RlKCBwICk7XG5cdFx0XHRwID0gZW5kID0gcC5wcmV2O1xuXHRcdFx0aWYgKCBwID09PSBwLm5leHQgKSBicmVhaztcblx0XHRcdGFnYWluID0gdHJ1ZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHAgPSBwLm5leHQ7XG5cblx0XHR9XG5cblx0fSB3aGlsZSAoIGFnYWluIHx8IHAgIT09IGVuZCApO1xuXG5cdHJldHVybiBlbmQ7XG5cbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5cbmZ1bmN0aW9uIGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcyApIHtcblxuXHRpZiAoICEgZWFyICkgcmV0dXJuO1xuXG5cdC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblxuXHRpZiAoICEgcGFzcyAmJiBpbnZTaXplICkgaW5kZXhDdXJ2ZSggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0dmFyIHN0b3AgPSBlYXIsIHByZXYsIG5leHQ7XG5cblx0Ly8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG5cblx0d2hpbGUgKCBlYXIucHJldiAhPT0gZWFyLm5leHQgKSB7XG5cblx0XHRwcmV2ID0gZWFyLnByZXY7XG5cdFx0bmV4dCA9IGVhci5uZXh0O1xuXG5cdFx0aWYgKCBpbnZTaXplID8gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIDogaXNFYXIoIGVhciApICkge1xuXG5cdFx0XHQvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuXHRcdFx0dHJpYW5nbGVzLnB1c2goIHByZXYuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGVhci5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggbmV4dC5pIC8gZGltICk7XG5cblx0XHRcdHJlbW92ZU5vZGUoIGVhciApO1xuXG5cdFx0XHQvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0aWNlIGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuXHRcdFx0ZWFyID0gbmV4dC5uZXh0O1xuXHRcdFx0c3RvcCA9IG5leHQubmV4dDtcblxuXHRcdFx0Y29udGludWU7XG5cblx0XHR9XG5cblx0XHRlYXIgPSBuZXh0O1xuXG5cdFx0Ly8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcblxuXHRcdGlmICggZWFyID09PSBzdG9wICkge1xuXG5cdFx0XHQvLyB0cnkgZmlsdGVyaW5nIHBvaW50cyBhbmQgc2xpY2luZyBhZ2FpblxuXG5cdFx0XHRpZiAoICEgcGFzcyApIHtcblxuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGZpbHRlclBvaW50cyggZWFyICksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxICk7XG5cblx0XHRcdFx0Ly8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcblxuXHRcdFx0fSBlbHNlIGlmICggcGFzcyA9PT0gMSApIHtcblxuXHRcdFx0XHRlYXIgPSBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKCBlYXIsIHRyaWFuZ2xlcywgZGltICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMiApO1xuXG5cdFx0XHQvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBwYXNzID09PSAyICkge1xuXG5cdFx0XHRcdHNwbGl0RWFyY3V0KCBlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRcdH1cblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuXG5mdW5jdGlvbiBpc0VhciggZWFyICkge1xuXG5cdHZhciBhID0gZWFyLnByZXYsXG5cdFx0YiA9IGVhcixcblx0XHRjID0gZWFyLm5leHQ7XG5cblx0aWYgKCBhcmVhKCBhLCBiLCBjICkgPj0gMCApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuXHQvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxuXHR2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cblx0d2hpbGUgKCBwICE9PSBlYXIucHJldiApIHtcblxuXHRcdGlmICggcG9pbnRJblRyaWFuZ2xlKCBhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSApICYmIGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG5cbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHR2YXIgYSA9IGVhci5wcmV2LFxuXHRcdGIgPSBlYXIsXG5cdFx0YyA9IGVhci5uZXh0O1xuXG5cdGlmICggYXJlYSggYSwgYiwgYyApID49IDAgKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cblx0Ly8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcblxuXHR2YXIgbWluVFggPSBhLnggPCBiLnggPyAoIGEueCA8IGMueCA/IGEueCA6IGMueCApIDogKCBiLnggPCBjLnggPyBiLnggOiBjLnggKSxcblx0XHRtaW5UWSA9IGEueSA8IGIueSA/ICggYS55IDwgYy55ID8gYS55IDogYy55ICkgOiAoIGIueSA8IGMueSA/IGIueSA6IGMueSApLFxuXHRcdG1heFRYID0gYS54ID4gYi54ID8gKCBhLnggPiBjLnggPyBhLnggOiBjLnggKSA6ICggYi54ID4gYy54ID8gYi54IDogYy54ICksXG5cdFx0bWF4VFkgPSBhLnkgPiBiLnkgPyAoIGEueSA+IGMueSA/IGEueSA6IGMueSApIDogKCBiLnkgPiBjLnkgPyBiLnkgOiBjLnkgKTtcblxuXHQvLyB6LW9yZGVyIHJhbmdlIGZvciB0aGUgY3VycmVudCB0cmlhbmdsZSBiYm94O1xuXG5cdHZhciBtaW5aID0gek9yZGVyKCBtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUgKSxcblx0XHRtYXhaID0gek9yZGVyKCBtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHQvLyBmaXJzdCBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBpbmNyZWFzaW5nIHotb3JkZXJcblxuXHR2YXIgcCA9IGVhci5uZXh0WjtcblxuXHR3aGlsZSAoIHAgJiYgcC56IDw9IG1heFogKSB7XG5cblx0XHRpZiAoIHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG5cdFx0XHRcdHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkgKSAmJlxuXHRcdFx0XHRhcmVhKCBwLnByZXYsIHAsIHAubmV4dCApID49IDAgKSByZXR1cm4gZmFsc2U7XG5cdFx0cCA9IHAubmV4dFo7XG5cblx0fVxuXG5cdC8vIHRoZW4gbG9vayBmb3IgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuXG5cdHAgPSBlYXIucHJldlo7XG5cblx0d2hpbGUgKCBwICYmIHAueiA+PSBtaW5aICkge1xuXG5cdFx0aWYgKCBwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuXHRcdFx0XHRwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdFx0YXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0cCA9IHAucHJldlo7XG5cblx0fVxuXG5cdHJldHVybiB0cnVlO1xuXG59XG5cbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXG5cbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoIHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSApIHtcblxuXHR2YXIgcCA9IHN0YXJ0O1xuXG5cdGRvIHtcblxuXHRcdHZhciBhID0gcC5wcmV2LCBiID0gcC5uZXh0Lm5leHQ7XG5cblx0XHRpZiAoICEgZXF1YWxzKCBhLCBiICkgJiYgaW50ZXJzZWN0cyggYSwgcCwgcC5uZXh0LCBiICkgJiYgbG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSApIHtcblxuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGEuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIHAuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGIuaSAvIGRpbSApO1xuXG5cdFx0XHQvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG5cblx0XHRcdHJlbW92ZU5vZGUoIHAgKTtcblx0XHRcdHJlbW92ZU5vZGUoIHAubmV4dCApO1xuXG5cdFx0XHRwID0gc3RhcnQgPSBiO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gcDtcblxufVxuXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxuXG5mdW5jdGlvbiBzcGxpdEVhcmN1dCggc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG5cblx0dmFyIGEgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHR2YXIgYiA9IGEubmV4dC5uZXh0O1xuXG5cdFx0d2hpbGUgKCBiICE9PSBhLnByZXYgKSB7XG5cblx0XHRcdGlmICggYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKCBhLCBiICkgKSB7XG5cblx0XHRcdFx0Ly8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuXG5cdFx0XHRcdHZhciBjID0gc3BsaXRQb2x5Z29uKCBhLCBiICk7XG5cblx0XHRcdFx0Ly8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcblxuXHRcdFx0XHRhID0gZmlsdGVyUG9pbnRzKCBhLCBhLm5leHQgKTtcblx0XHRcdFx0YyA9IGZpbHRlclBvaW50cyggYywgYy5uZXh0ICk7XG5cblx0XHRcdFx0Ly8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcblxuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGEsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdGIgPSBiLm5leHQ7XG5cblx0XHR9XG5cblx0XHRhID0gYS5uZXh0O1xuXG5cdH0gd2hpbGUgKCBhICE9PSBzdGFydCApO1xuXG59XG5cbi8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXNcblxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApIHtcblxuXHR2YXIgcXVldWUgPSBbXSwgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG5cdGZvciAoIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkgKysgKSB7XG5cblx0XHRzdGFydCA9IGhvbGVJbmRpY2VzWyBpIF0gKiBkaW07XG5cdFx0ZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1sgaSArIDEgXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXHRcdGxpc3QgPSBsaW5rZWRMaXN0KCBkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlICk7XG5cdFx0aWYgKCBsaXN0ID09PSBsaXN0Lm5leHQgKSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuXHRcdHF1ZXVlLnB1c2goIGdldExlZnRtb3N0KCBsaXN0ICkgKTtcblxuXHR9XG5cblx0cXVldWUuc29ydCggY29tcGFyZVggKTtcblxuXHQvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuXG5cdGZvciAoIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0ZWxpbWluYXRlSG9sZSggcXVldWVbIGkgXSwgb3V0ZXJOb2RlICk7XG5cdFx0b3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKCBvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0ICk7XG5cblx0fVxuXG5cdHJldHVybiBvdXRlck5vZGU7XG5cbn1cblxuZnVuY3Rpb24gY29tcGFyZVgoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGEueCAtIGIueDtcblxufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcblxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZSggaG9sZSwgb3V0ZXJOb2RlICkge1xuXG5cdG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKCBob2xlLCBvdXRlck5vZGUgKTtcblxuXHRpZiAoIG91dGVyTm9kZSApIHtcblxuXHRcdHZhciBiID0gc3BsaXRQb2x5Z29uKCBvdXRlck5vZGUsIGhvbGUgKTtcblxuXHRcdGZpbHRlclBvaW50cyggYiwgYi5uZXh0ICk7XG5cblx0fVxuXG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApIHtcblxuXHR2YXIgcCA9IG91dGVyTm9kZSxcblx0XHRoeCA9IGhvbGUueCxcblx0XHRoeSA9IGhvbGUueSxcblx0XHRxeCA9IC0gSW5maW5pdHksXG5cdFx0bTtcblxuXHQvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XG5cdC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcblxuXHRkbyB7XG5cblx0XHRpZiAoIGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55ICkge1xuXG5cdFx0XHR2YXIgeCA9IHAueCArICggaHkgLSBwLnkgKSAqICggcC5uZXh0LnggLSBwLnggKSAvICggcC5uZXh0LnkgLSBwLnkgKTtcblxuXHRcdFx0aWYgKCB4IDw9IGh4ICYmIHggPiBxeCApIHtcblxuXHRcdFx0XHRxeCA9IHg7XG5cblx0XHRcdFx0aWYgKCB4ID09PSBoeCApIHtcblxuXHRcdFx0XHRcdGlmICggaHkgPT09IHAueSApIHJldHVybiBwO1xuXHRcdFx0XHRcdGlmICggaHkgPT09IHAubmV4dC55ICkgcmV0dXJuIHAubmV4dDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gb3V0ZXJOb2RlICk7XG5cblx0aWYgKCAhIG0gKSByZXR1cm4gbnVsbDtcblxuXHRpZiAoIGh4ID09PSBxeCApIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cblx0Ly8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuXHQvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcblx0Ly8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuXHR2YXIgc3RvcCA9IG0sXG5cdFx0bXggPSBtLngsXG5cdFx0bXkgPSBtLnksXG5cdFx0dGFuTWluID0gSW5maW5pdHksXG5cdFx0dGFuO1xuXG5cdHAgPSBtLm5leHQ7XG5cblx0d2hpbGUgKCBwICE9PSBzdG9wICkge1xuXG5cdFx0aWYgKCBoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcblx0XHRcdFx0XHRcdHBvaW50SW5UcmlhbmdsZSggaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkgKSApIHtcblxuXHRcdFx0dGFuID0gTWF0aC5hYnMoIGh5IC0gcC55ICkgLyAoIGh4IC0gcC54ICk7IC8vIHRhbmdlbnRpYWxcblxuXHRcdFx0aWYgKCAoIHRhbiA8IHRhbk1pbiB8fCAoIHRhbiA9PT0gdGFuTWluICYmIHAueCA+IG0ueCApICkgJiYgbG9jYWxseUluc2lkZSggcCwgaG9sZSApICkge1xuXG5cdFx0XHRcdG0gPSBwO1xuXHRcdFx0XHR0YW5NaW4gPSB0YW47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiBtO1xuXG59XG5cbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblxuZnVuY3Rpb24gaW5kZXhDdXJ2ZSggc3RhcnQsIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0dmFyIHAgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAueiA9PT0gbnVsbCApIHAueiA9IHpPcmRlciggcC54LCBwLnksIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRwLnByZXZaID0gcC5wcmV2O1xuXHRcdHAubmV4dFogPSBwLm5leHQ7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRwLnByZXZaLm5leHRaID0gbnVsbDtcblx0cC5wcmV2WiA9IG51bGw7XG5cblx0c29ydExpbmtlZCggcCApO1xuXG59XG5cbi8vIFNpbW9uIFRhdGhhbSdzIGxpbmtlZCBsaXN0IG1lcmdlIHNvcnQgYWxnb3JpdGhtXG4vLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbFxuXG5mdW5jdGlvbiBzb3J0TGlua2VkKCBsaXN0ICkge1xuXG5cdHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSwgaW5TaXplID0gMTtcblxuXHRkbyB7XG5cblx0XHRwID0gbGlzdDtcblx0XHRsaXN0ID0gbnVsbDtcblx0XHR0YWlsID0gbnVsbDtcblx0XHRudW1NZXJnZXMgPSAwO1xuXG5cdFx0d2hpbGUgKCBwICkge1xuXG5cdFx0XHRudW1NZXJnZXMgKys7XG5cdFx0XHRxID0gcDtcblx0XHRcdHBTaXplID0gMDtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBpblNpemU7IGkgKysgKSB7XG5cblx0XHRcdFx0cFNpemUgKys7XG5cdFx0XHRcdHEgPSBxLm5leHRaO1xuXHRcdFx0XHRpZiAoICEgcSApIGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHFTaXplID0gaW5TaXplO1xuXG5cdFx0XHR3aGlsZSAoIHBTaXplID4gMCB8fCAoIHFTaXplID4gMCAmJiBxICkgKSB7XG5cblx0XHRcdFx0aWYgKCBwU2l6ZSAhPT0gMCAmJiAoIHFTaXplID09PSAwIHx8ICEgcSB8fCBwLnogPD0gcS56ICkgKSB7XG5cblx0XHRcdFx0XHRlID0gcDtcblx0XHRcdFx0XHRwID0gcC5uZXh0Wjtcblx0XHRcdFx0XHRwU2l6ZSAtLTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZSA9IHE7XG5cdFx0XHRcdFx0cSA9IHEubmV4dFo7XG5cdFx0XHRcdFx0cVNpemUgLS07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGFpbCApIHRhaWwubmV4dFogPSBlO1xuXHRcdFx0XHRlbHNlIGxpc3QgPSBlO1xuXG5cdFx0XHRcdGUucHJldlogPSB0YWlsO1xuXHRcdFx0XHR0YWlsID0gZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRwID0gcTtcblxuXHRcdH1cblxuXHRcdHRhaWwubmV4dFogPSBudWxsO1xuXHRcdGluU2l6ZSAqPSAyO1xuXG5cdH0gd2hpbGUgKCBudW1NZXJnZXMgPiAxICk7XG5cblx0cmV0dXJuIGxpc3Q7XG5cbn1cblxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgaW52ZXJzZSBvZiB0aGUgbG9uZ2VyIHNpZGUgb2YgZGF0YSBiYm94XG5cbmZ1bmN0aW9uIHpPcmRlciggeCwgeSwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHQvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG5cblx0eCA9IDMyNzY3ICogKCB4IC0gbWluWCApICogaW52U2l6ZTtcblx0eSA9IDMyNzY3ICogKCB5IC0gbWluWSApICogaW52U2l6ZTtcblxuXHR4ID0gKCB4IHwgKCB4IDw8IDggKSApICYgMHgwMEZGMDBGRjtcblx0eCA9ICggeCB8ICggeCA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7XG5cdHggPSAoIHggfCAoIHggPDwgMiApICkgJiAweDMzMzMzMzMzO1xuXHR4ID0gKCB4IHwgKCB4IDw8IDEgKSApICYgMHg1NTU1NTU1NTtcblxuXHR5ID0gKCB5IHwgKCB5IDw8IDggKSApICYgMHgwMEZGMDBGRjtcblx0eSA9ICggeSB8ICggeSA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7XG5cdHkgPSAoIHkgfCAoIHkgPDwgMiApICkgJiAweDMzMzMzMzMzO1xuXHR5ID0gKCB5IHwgKCB5IDw8IDEgKSApICYgMHg1NTU1NTU1NTtcblxuXHRyZXR1cm4geCB8ICggeSA8PCAxICk7XG5cbn1cblxuLy8gZmluZCB0aGUgbGVmdG1vc3Qgbm9kZSBvZiBhIHBvbHlnb24gcmluZ1xuXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdCggc3RhcnQgKSB7XG5cblx0dmFyIHAgPSBzdGFydCwgbGVmdG1vc3QgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAueCA8IGxlZnRtb3N0LnggKSBsZWZ0bW9zdCA9IHA7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gbGVmdG1vc3Q7XG5cbn1cblxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxuXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoIGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSApIHtcblxuXHRyZXR1cm4gKCBjeCAtIHB4ICkgKiAoIGF5IC0gcHkgKSAtICggYXggLSBweCApICogKCBjeSAtIHB5ICkgPj0gMCAmJlxuXHQgKCBheCAtIHB4ICkgKiAoIGJ5IC0gcHkgKSAtICggYnggLSBweCApICogKCBheSAtIHB5ICkgPj0gMCAmJlxuXHQgKCBieCAtIHB4ICkgKiAoIGN5IC0gcHkgKSAtICggY3ggLSBweCApICogKCBieSAtIHB5ICkgPj0gMDtcblxufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcblxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKCBhLCBiICkge1xuXG5cdHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgISBpbnRlcnNlY3RzUG9seWdvbiggYSwgYiApICYmXG5cdFx0bG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSAmJiBtaWRkbGVJbnNpZGUoIGEsIGIgKTtcblxufVxuXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXG5cbmZ1bmN0aW9uIGFyZWEoIHAsIHEsIHIgKSB7XG5cblx0cmV0dXJuICggcS55IC0gcC55ICkgKiAoIHIueCAtIHEueCApIC0gKCBxLnggLSBwLnggKSAqICggci55IC0gcS55ICk7XG5cbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcblxuZnVuY3Rpb24gZXF1YWxzKCBwMSwgcDIgKSB7XG5cblx0cmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcblxufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5cbmZ1bmN0aW9uIGludGVyc2VjdHMoIHAxLCBxMSwgcDIsIHEyICkge1xuXG5cdGlmICggKCBlcXVhbHMoIHAxLCBxMSApICYmIGVxdWFscyggcDIsIHEyICkgKSB8fFxuXHRcdFx0KCBlcXVhbHMoIHAxLCBxMiApICYmIGVxdWFscyggcDIsIHExICkgKSApIHJldHVybiB0cnVlO1xuXG5cdHJldHVybiBhcmVhKCBwMSwgcTEsIHAyICkgPiAwICE9PSBhcmVhKCBwMSwgcTEsIHEyICkgPiAwICYmXG5cdFx0XHRcdCBhcmVhKCBwMiwgcTIsIHAxICkgPiAwICE9PSBhcmVhKCBwMiwgcTIsIHExICkgPiAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5cbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKCBhLCBiICkge1xuXG5cdHZhciBwID0gYTtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cyggcCwgcC5uZXh0LCBhLCBiICkgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBmYWxzZTtcblxufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cblxuZnVuY3Rpb24gbG9jYWxseUluc2lkZSggYSwgYiApIHtcblxuXHRyZXR1cm4gYXJlYSggYS5wcmV2LCBhLCBhLm5leHQgKSA8IDAgP1xuXHRcdGFyZWEoIGEsIGIsIGEubmV4dCApID49IDAgJiYgYXJlYSggYSwgYS5wcmV2LCBiICkgPj0gMCA6XG5cdFx0YXJlYSggYSwgYiwgYS5wcmV2ICkgPCAwIHx8IGFyZWEoIGEsIGEubmV4dCwgYiApIDwgMDtcblxufVxuXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKCBhLCBiICkge1xuXG5cdHZhciBwID0gYSxcblx0XHRpbnNpZGUgPSBmYWxzZSxcblx0XHRweCA9ICggYS54ICsgYi54ICkgLyAyLFxuXHRcdHB5ID0gKCBhLnkgKyBiLnkgKSAvIDI7XG5cblx0ZG8ge1xuXG5cdFx0aWYgKCAoICggcC55ID4gcHkgKSAhPT0gKCBwLm5leHQueSA+IHB5ICkgKSAmJiBwLm5leHQueSAhPT0gcC55ICYmXG5cdFx0XHRcdFx0XHQoIHB4IDwgKCBwLm5leHQueCAtIHAueCApICogKCBweSAtIHAueSApIC8gKCBwLm5leHQueSAtIHAueSApICsgcC54ICkgKSB7XG5cblx0XHRcdGluc2lkZSA9ICEgaW5zaWRlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBpbnNpZGU7XG5cbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5cbmZ1bmN0aW9uIHNwbGl0UG9seWdvbiggYSwgYiApIHtcblxuXHR2YXIgYTIgPSBuZXcgTm9kZSggYS5pLCBhLngsIGEueSApLFxuXHRcdGIyID0gbmV3IE5vZGUoIGIuaSwgYi54LCBiLnkgKSxcblx0XHRhbiA9IGEubmV4dCxcblx0XHRicCA9IGIucHJldjtcblxuXHRhLm5leHQgPSBiO1xuXHRiLnByZXYgPSBhO1xuXG5cdGEyLm5leHQgPSBhbjtcblx0YW4ucHJldiA9IGEyO1xuXG5cdGIyLm5leHQgPSBhMjtcblx0YTIucHJldiA9IGIyO1xuXG5cdGJwLm5leHQgPSBiMjtcblx0YjIucHJldiA9IGJwO1xuXG5cdHJldHVybiBiMjtcblxufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuXG5mdW5jdGlvbiBpbnNlcnROb2RlKCBpLCB4LCB5LCBsYXN0ICkge1xuXG5cdHZhciBwID0gbmV3IE5vZGUoIGksIHgsIHkgKTtcblxuXHRpZiAoICEgbGFzdCApIHtcblxuXHRcdHAucHJldiA9IHA7XG5cdFx0cC5uZXh0ID0gcDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cC5uZXh0ID0gbGFzdC5uZXh0O1xuXHRcdHAucHJldiA9IGxhc3Q7XG5cdFx0bGFzdC5uZXh0LnByZXYgPSBwO1xuXHRcdGxhc3QubmV4dCA9IHA7XG5cblx0fVxuXG5cdHJldHVybiBwO1xuXG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUoIHAgKSB7XG5cblx0cC5uZXh0LnByZXYgPSBwLnByZXY7XG5cdHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG5cdGlmICggcC5wcmV2WiApIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuXHRpZiAoIHAubmV4dFogKSBwLm5leHRaLnByZXZaID0gcC5wcmV2WjtcblxufVxuXG5mdW5jdGlvbiBOb2RlKCBpLCB4LCB5ICkge1xuXG5cdC8vIHZlcnRpY2UgaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcblx0dGhpcy5pID0gaTtcblxuXHQvLyB2ZXJ0ZXggY29vcmRpbmF0ZXNcblx0dGhpcy54ID0geDtcblx0dGhpcy55ID0geTtcblxuXHQvLyBwcmV2aW91cyBhbmQgbmV4dCB2ZXJ0aWNlIG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG5cdHRoaXMucHJldiA9IG51bGw7XG5cdHRoaXMubmV4dCA9IG51bGw7XG5cblx0Ly8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuXHR0aGlzLnogPSBudWxsO1xuXG5cdC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcblx0dGhpcy5wcmV2WiA9IG51bGw7XG5cdHRoaXMubmV4dFogPSBudWxsO1xuXG5cdC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG5cdHRoaXMuc3RlaW5lciA9IGZhbHNlO1xuXG59XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApIHtcblxuXHR2YXIgc3VtID0gMDtcblxuXHRmb3IgKCB2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSApIHtcblxuXHRcdHN1bSArPSAoIGRhdGFbIGogXSAtIGRhdGFbIGkgXSApICogKCBkYXRhWyBpICsgMSBdICsgZGF0YVsgaiArIDEgXSApO1xuXHRcdGogPSBpO1xuXG5cdH1cblxuXHRyZXR1cm4gc3VtO1xuXG59XG5cbmV4cG9ydCB7IEVhcmN1dCB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKi9cblxuaW1wb3J0IHsgRWFyY3V0IH0gZnJvbSAnLi9FYXJjdXQuanMnO1xuXG52YXIgU2hhcGVVdGlscyA9IHtcblxuXHQvLyBjYWxjdWxhdGUgYXJlYSBvZiB0aGUgY29udG91ciBwb2x5Z29uXG5cblx0YXJlYTogZnVuY3Rpb24gKCBjb250b3VyICkge1xuXG5cdFx0dmFyIG4gPSBjb250b3VyLmxlbmd0aDtcblx0XHR2YXIgYSA9IDAuMDtcblxuXHRcdGZvciAoIHZhciBwID0gbiAtIDEsIHEgPSAwOyBxIDwgbjsgcCA9IHEgKysgKSB7XG5cblx0XHRcdGEgKz0gY29udG91clsgcCBdLnggKiBjb250b3VyWyBxIF0ueSAtIGNvbnRvdXJbIHEgXS54ICogY29udG91clsgcCBdLnk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYSAqIDAuNTtcblxuXHR9LFxuXG5cdGlzQ2xvY2tXaXNlOiBmdW5jdGlvbiAoIHB0cyApIHtcblxuXHRcdHJldHVybiBTaGFwZVV0aWxzLmFyZWEoIHB0cyApIDwgMDtcblxuXHR9LFxuXG5cdHRyaWFuZ3VsYXRlU2hhcGU6IGZ1bmN0aW9uICggY29udG91ciwgaG9sZXMgKSB7XG5cblx0XHR2YXIgdmVydGljZXMgPSBbXTsgLy8gZmxhdCBhcnJheSBvZiB2ZXJ0aWNlcyBsaWtlIFsgeDAseTAsIHgxLHkxLCB4Mix5MiwgLi4uIF1cblx0XHR2YXIgaG9sZUluZGljZXMgPSBbXTsgLy8gYXJyYXkgb2YgaG9sZSBpbmRpY2VzXG5cdFx0dmFyIGZhY2VzID0gW107IC8vIGZpbmFsIGFycmF5IG9mIHZlcnRleCBpbmRpY2VzIGxpa2UgWyBbIGEsYixkIF0sIFsgYixjLGQgXSBdXG5cblx0XHRyZW1vdmVEdXBFbmRQdHMoIGNvbnRvdXIgKTtcblx0XHRhZGRDb250b3VyKCB2ZXJ0aWNlcywgY29udG91ciApO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBob2xlSW5kZXggPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdGhvbGVzLmZvckVhY2goIHJlbW92ZUR1cEVuZFB0cyApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaG9sZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRob2xlSW5kaWNlcy5wdXNoKCBob2xlSW5kZXggKTtcblx0XHRcdGhvbGVJbmRleCArPSBob2xlc1sgaSBdLmxlbmd0aDtcblx0XHRcdGFkZENvbnRvdXIoIHZlcnRpY2VzLCBob2xlc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIHRyaWFuZ2xlcyA9IEVhcmN1dC50cmlhbmd1bGF0ZSggdmVydGljZXMsIGhvbGVJbmRpY2VzICk7XG5cblx0XHQvL1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHRmYWNlcy5wdXNoKCB0cmlhbmdsZXMuc2xpY2UoIGksIGkgKyAzICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmYWNlcztcblxuXHR9XG5cbn07XG5cbmZ1bmN0aW9uIHJlbW92ZUR1cEVuZFB0cyggcG9pbnRzICkge1xuXG5cdHZhciBsID0gcG9pbnRzLmxlbmd0aDtcblxuXHRpZiAoIGwgPiAyICYmIHBvaW50c1sgbCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRwb2ludHMucG9wKCk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICkge1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGNvbnRvdXIubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggY29udG91clsgaSBdLnggKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCBjb250b3VyWyBpIF0ueSApO1xuXG5cdH1cblxufVxuXG5leHBvcnQgeyBTaGFwZVV0aWxzIH07XG4iLCIvKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiBDcmVhdGVzIGV4dHJ1ZGVkIGdlb21ldHJ5IGZyb20gYSBwYXRoIHNoYXBlLlxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKlxuICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXNcbiAqICBzdGVwczogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgZm9yIHotc2lkZSBleHRydXNpb25zIC8gdXNlZCBmb3Igc3ViZGl2aWRpbmcgc2VnbWVudHMgb2YgZXh0cnVkZSBzcGxpbmUgdG9vXG4gKiAgZGVwdGg6IDxmbG9hdD4sIC8vIERlcHRoIHRvIGV4dHJ1ZGUgdGhlIHNoYXBlXG4gKlxuICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsXG4gKiAgYmV2ZWxUaGlja25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGhlIG9yaWdpbmFsIHNoYXBlIGJldmVsIGdvZXNcbiAqICBiZXZlbFNpemU6IDxmbG9hdD4sIC8vIGhvdyBmYXIgZnJvbSBzaGFwZSBvdXRsaW5lIGlzIGJldmVsXG4gKiAgYmV2ZWxTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBiZXZlbCBsYXllcnNcbiAqXG4gKiAgZXh0cnVkZVBhdGg6IDxUSFJFRS5DdXJ2ZT4gLy8gY3VydmUgdG8gZXh0cnVkZSBzaGFwZSBhbG9uZ1xuICpcbiAqICBVVkdlbmVyYXRvcjogPE9iamVjdD4gLy8gb2JqZWN0IHRoYXQgcHJvdmlkZXMgVVYgZ2VuZXJhdG9yIGZ1bmN0aW9uc1xuICpcbiAqIH1cbiAqL1xuXG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgU2hhcGVVdGlscyB9IGZyb20gJy4uL2V4dHJhcy9TaGFwZVV0aWxzLmpzJztcblxuLy8gRXh0cnVkZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIEV4dHJ1ZGVHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRXh0cnVkZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0b3B0aW9uczogb3B0aW9uc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXh0cnVkZUdlb21ldHJ5O1xuXG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdHZhciBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzO1xuXHR2YXIgb3B0aW9ucyA9IHRoaXMucGFyYW1ldGVycy5vcHRpb25zO1xuXG5cdHJldHVybiB0b0pTT04oIHNoYXBlcywgb3B0aW9ucywgZGF0YSApO1xuXG59O1xuXG4vLyBFeHRydWRlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFeHRydWRlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRvcHRpb25zOiBvcHRpb25zXG5cdH07XG5cblx0c2hhcGVzID0gQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPyBzaGFwZXMgOiBbIHNoYXBlcyBdO1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIHZlcnRpY2VzQXJyYXkgPSBbXTtcblx0dmFyIHV2QXJyYXkgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXHRcdGFkZFNoYXBlKCBzaGFwZSApO1xuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXNBcnJheSwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZBcnJheSwgMiApICk7XG5cblx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdC8vIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdHZhciBwbGFjZWhvbGRlciA9IFtdO1xuXG5cdFx0Ly8gb3B0aW9uc1xuXG5cdFx0dmFyIGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyO1xuXHRcdHZhciBzdGVwcyA9IG9wdGlvbnMuc3RlcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlcHMgOiAxO1xuXHRcdHZhciBkZXB0aCA9IG9wdGlvbnMuZGVwdGggIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGggOiAxMDA7XG5cblx0XHR2YXIgYmV2ZWxFbmFibGVkID0gb3B0aW9ucy5iZXZlbEVuYWJsZWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxFbmFibGVkIDogdHJ1ZTtcblx0XHR2YXIgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogNjtcblx0XHR2YXIgYmV2ZWxTaXplID0gb3B0aW9ucy5iZXZlbFNpemUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxTaXplIDogYmV2ZWxUaGlja25lc3MgLSAyO1xuXHRcdHZhciBiZXZlbFNlZ21lbnRzID0gb3B0aW9ucy5iZXZlbFNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2VnbWVudHMgOiAzO1xuXG5cdFx0dmFyIGV4dHJ1ZGVQYXRoID0gb3B0aW9ucy5leHRydWRlUGF0aDtcblxuXHRcdHZhciB1dmdlbiA9IG9wdGlvbnMuVVZHZW5lcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuVVZHZW5lcmF0b3IgOiBXb3JsZFVWR2VuZXJhdG9yO1xuXG5cdFx0Ly8gZGVwcmVjYXRlZCBvcHRpb25zXG5cblx0XHRpZiAoIG9wdGlvbnMuYW1vdW50ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogYW1vdW50IGhhcyBiZWVuIHJlbmFtZWQgdG8gZGVwdGguJyApO1xuXHRcdFx0ZGVwdGggPSBvcHRpb25zLmFtb3VudDtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgZXh0cnVkZVB0cywgZXh0cnVkZUJ5UGF0aCA9IGZhbHNlO1xuXHRcdHZhciBzcGxpbmVUdWJlLCBiaW5vcm1hbCwgbm9ybWFsLCBwb3NpdGlvbjI7XG5cblx0XHRpZiAoIGV4dHJ1ZGVQYXRoICkge1xuXG5cdFx0XHRleHRydWRlUHRzID0gZXh0cnVkZVBhdGguZ2V0U3BhY2VkUG9pbnRzKCBzdGVwcyApO1xuXG5cdFx0XHRleHRydWRlQnlQYXRoID0gdHJ1ZTtcblx0XHRcdGJldmVsRW5hYmxlZCA9IGZhbHNlOyAvLyBiZXZlbHMgbm90IHN1cHBvcnRlZCBmb3IgcGF0aCBleHRydXNpb25cblxuXHRcdFx0Ly8gU0VUVVAgVE5CIHZhcmlhYmxlc1xuXG5cdFx0XHQvLyBUT0RPMSAtIGhhdmUgYSAuaXNDbG9zZWQgaW4gc3BsaW5lP1xuXG5cdFx0XHRzcGxpbmVUdWJlID0gZXh0cnVkZVBhdGguY29tcHV0ZUZyZW5ldEZyYW1lcyggc3RlcHMsIGZhbHNlICk7XG5cblx0XHRcdC8vIGNvbnNvbGUubG9nKHNwbGluZVR1YmUsICdzcGxpbmVUdWJlJywgc3BsaW5lVHViZS5ub3JtYWxzLmxlbmd0aCwgJ3N0ZXBzJywgc3RlcHMsICdleHRydWRlUHRzJywgZXh0cnVkZVB0cy5sZW5ndGgpO1xuXG5cdFx0XHRiaW5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0cG9zaXRpb24yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdC8vIFNhZmVndWFyZHMgaWYgYmV2ZWxzIGFyZSBub3QgZW5hYmxlZFxuXG5cdFx0aWYgKCAhIGJldmVsRW5hYmxlZCApIHtcblxuXHRcdFx0YmV2ZWxTZWdtZW50cyA9IDA7XG5cdFx0XHRiZXZlbFRoaWNrbmVzcyA9IDA7XG5cdFx0XHRiZXZlbFNpemUgPSAwO1xuXG5cdFx0fVxuXG5cdFx0Ly8gVmFyaWFibGVzIGluaXRpYWxpemF0aW9uXG5cblx0XHR2YXIgYWhvbGUsIGgsIGhsOyAvLyBsb29waW5nIG9mIGhvbGVzXG5cblx0XHR2YXIgc2hhcGVQb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRzKCBjdXJ2ZVNlZ21lbnRzICk7XG5cblx0XHR2YXIgdmVydGljZXMgPSBzaGFwZVBvaW50cy5zaGFwZTtcblx0XHR2YXIgaG9sZXMgPSBzaGFwZVBvaW50cy5ob2xlcztcblxuXHRcdHZhciByZXZlcnNlID0gISBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCB2ZXJ0aWNlcyApO1xuXG5cdFx0aWYgKCByZXZlcnNlICkge1xuXG5cdFx0XHR2ZXJ0aWNlcyA9IHZlcnRpY2VzLnJldmVyc2UoKTtcblxuXHRcdFx0Ly8gTWF5YmUgd2Ugc2hvdWxkIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24sIGp1c3QgdG8gYmUgc2FmZSAuLi5cblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXG5cdFx0XHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggYWhvbGUgKSApIHtcblxuXHRcdFx0XHRcdGhvbGVzWyBoIF0gPSBhaG9sZS5yZXZlcnNlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdHZhciBmYWNlcyA9IFNoYXBlVXRpbHMudHJpYW5ndWxhdGVTaGFwZSggdmVydGljZXMsIGhvbGVzICk7XG5cblx0XHQvKiBWZXJ0aWNlcyAqL1xuXG5cdFx0dmFyIGNvbnRvdXIgPSB2ZXJ0aWNlczsgLy8gdmVydGljZXMgaGFzIGFsbCBwb2ludHMgYnV0IGNvbnRvdXIgaGFzIG9ubHkgcG9pbnRzIG9mIGNpcmN1bWZlcmVuY2VcblxuXHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdHZlcnRpY2VzID0gdmVydGljZXMuY29uY2F0KCBhaG9sZSApO1xuXG5cdFx0fVxuXG5cblx0XHRmdW5jdGlvbiBzY2FsZVB0MiggcHQsIHZlYywgc2l6ZSApIHtcblxuXHRcdFx0aWYgKCAhIHZlYyApIGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3RcIiApO1xuXG5cdFx0XHRyZXR1cm4gdmVjLmNsb25lKCkubXVsdGlwbHlTY2FsYXIoIHNpemUgKS5hZGQoIHB0ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgYiwgYnMsIHQsIHosXG5cdFx0XHR2ZXJ0LCB2bGVuID0gdmVydGljZXMubGVuZ3RoLFxuXHRcdFx0ZmFjZSwgZmxlbiA9IGZhY2VzLmxlbmd0aDtcblxuXG5cdFx0Ly8gRmluZCBkaXJlY3Rpb25zIGZvciBwb2ludCBtb3ZlbWVudFxuXG5cblx0XHRmdW5jdGlvbiBnZXRCZXZlbFZlYyggaW5QdCwgaW5QcmV2LCBpbk5leHQgKSB7XG5cblx0XHRcdC8vIGNvbXB1dGVzIGZvciBpblB0IHRoZSBjb3JyZXNwb25kaW5nIHBvaW50IGluUHQnIG9uIGEgbmV3IGNvbnRvdXJcblx0XHRcdC8vICAgc2hpZnRlZCBieSAxIHVuaXQgKGxlbmd0aCBvZiBub3JtYWxpemVkIHZlY3RvcikgdG8gdGhlIGxlZnRcblx0XHRcdC8vIGlmIHdlIHdhbGsgYWxvbmcgY29udG91ciBjbG9ja3dpc2UsIHRoaXMgbmV3IGNvbnRvdXIgaXMgb3V0c2lkZSB0aGUgb2xkIG9uZVxuXHRcdFx0Ly9cblx0XHRcdC8vIGluUHQnIGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaW5lcyBwYXJhbGxlbCB0byB0aGUgdHdvXG5cdFx0XHQvLyAgYWRqYWNlbnQgZWRnZXMgb2YgaW5QdCBhdCBhIGRpc3RhbmNlIG9mIDEgdW5pdCBvbiB0aGUgbGVmdCBzaWRlLlxuXG5cdFx0XHR2YXIgdl90cmFuc194LCB2X3RyYW5zX3ksIHNocmlua19ieTsgLy8gcmVzdWx0aW5nIHRyYW5zbGF0aW9uIHZlY3RvciBmb3IgaW5QdFxuXG5cdFx0XHQvLyBnb29kIHJlYWRpbmcgZm9yIGdlb21ldHJ5IGFsZ29yaXRobXMgKGhlcmU6IGxpbmUtbGluZSBpbnRlcnNlY3Rpb24pXG5cdFx0XHQvLyBodHRwOi8vZ2VvbWFsZ29yaXRobXMuY29tL2EwNS1faW50ZXJzZWN0LTEuaHRtbFxuXG5cdFx0XHR2YXIgdl9wcmV2X3ggPSBpblB0LnggLSBpblByZXYueCxcblx0XHRcdFx0dl9wcmV2X3kgPSBpblB0LnkgLSBpblByZXYueTtcblx0XHRcdHZhciB2X25leHRfeCA9IGluTmV4dC54IC0gaW5QdC54LFxuXHRcdFx0XHR2X25leHRfeSA9IGluTmV4dC55IC0gaW5QdC55O1xuXG5cdFx0XHR2YXIgdl9wcmV2X2xlbnNxID0gKCB2X3ByZXZfeCAqIHZfcHJldl94ICsgdl9wcmV2X3kgKiB2X3ByZXZfeSApO1xuXG5cdFx0XHQvLyBjaGVjayBmb3IgY29sbGluZWFyIGVkZ2VzXG5cdFx0XHR2YXIgY29sbGluZWFyMCA9ICggdl9wcmV2X3ggKiB2X25leHRfeSAtIHZfcHJldl95ICogdl9uZXh0X3ggKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggY29sbGluZWFyMCApID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0Ly8gbm90IGNvbGxpbmVhclxuXG5cdFx0XHRcdC8vIGxlbmd0aCBvZiB2ZWN0b3JzIGZvciBub3JtYWxpemluZ1xuXG5cdFx0XHRcdHZhciB2X3ByZXZfbGVuID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTtcblx0XHRcdFx0dmFyIHZfbmV4dF9sZW4gPSBNYXRoLnNxcnQoIHZfbmV4dF94ICogdl9uZXh0X3ggKyB2X25leHRfeSAqIHZfbmV4dF95ICk7XG5cblx0XHRcdFx0Ly8gc2hpZnQgYWRqYWNlbnQgcG9pbnRzIGJ5IHVuaXQgdmVjdG9ycyB0byB0aGUgbGVmdFxuXG5cdFx0XHRcdHZhciBwdFByZXZTaGlmdF94ID0gKCBpblByZXYueCAtIHZfcHJldl95IC8gdl9wcmV2X2xlbiApO1xuXHRcdFx0XHR2YXIgcHRQcmV2U2hpZnRfeSA9ICggaW5QcmV2LnkgKyB2X3ByZXZfeCAvIHZfcHJldl9sZW4gKTtcblxuXHRcdFx0XHR2YXIgcHROZXh0U2hpZnRfeCA9ICggaW5OZXh0LnggLSB2X25leHRfeSAvIHZfbmV4dF9sZW4gKTtcblx0XHRcdFx0dmFyIHB0TmV4dFNoaWZ0X3kgPSAoIGluTmV4dC55ICsgdl9uZXh0X3ggLyB2X25leHRfbGVuICk7XG5cblx0XHRcdFx0Ly8gc2NhbGluZyBmYWN0b3IgZm9yIHZfcHJldiB0byBpbnRlcnNlY3Rpb24gcG9pbnRcblxuXHRcdFx0XHR2YXIgc2YgPSAoICggcHROZXh0U2hpZnRfeCAtIHB0UHJldlNoaWZ0X3ggKSAqIHZfbmV4dF95IC1cblx0XHRcdFx0XHRcdCggcHROZXh0U2hpZnRfeSAtIHB0UHJldlNoaWZ0X3kgKSAqIHZfbmV4dF94ICkgL1xuXHRcdFx0XHRcdCggdl9wcmV2X3ggKiB2X25leHRfeSAtIHZfcHJldl95ICogdl9uZXh0X3ggKTtcblxuXHRcdFx0XHQvLyB2ZWN0b3IgZnJvbSBpblB0IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHRcdHZfdHJhbnNfeCA9ICggcHRQcmV2U2hpZnRfeCArIHZfcHJldl94ICogc2YgLSBpblB0LnggKTtcblx0XHRcdFx0dl90cmFuc195ID0gKCBwdFByZXZTaGlmdF95ICsgdl9wcmV2X3kgKiBzZiAtIGluUHQueSApO1xuXG5cdFx0XHRcdC8vIERvbid0IG5vcm1hbGl6ZSEsIG90aGVyd2lzZSBzaGFycCBjb3JuZXJzIGJlY29tZSB1Z2x5XG5cdFx0XHRcdC8vICBidXQgcHJldmVudCBjcmF6eSBzcGlrZXNcblx0XHRcdFx0dmFyIHZfdHJhbnNfbGVuc3EgPSAoIHZfdHJhbnNfeCAqIHZfdHJhbnNfeCArIHZfdHJhbnNfeSAqIHZfdHJhbnNfeSApO1xuXHRcdFx0XHRpZiAoIHZfdHJhbnNfbGVuc3EgPD0gMiApIHtcblxuXHRcdFx0XHRcdHJldHVybiBuZXcgVmVjdG9yMiggdl90cmFuc194LCB2X3RyYW5zX3kgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3RyYW5zX2xlbnNxIC8gMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGNvbGxpbmVhciBlZGdlc1xuXG5cdFx0XHRcdHZhciBkaXJlY3Rpb25fZXEgPSBmYWxzZTsgLy8gYXNzdW1lczogb3Bwb3NpdGVcblx0XHRcdFx0aWYgKCB2X3ByZXZfeCA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0aWYgKCB2X25leHRfeCA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIHZfcHJldl94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB2X25leHRfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBNYXRoLnNpZ24oIHZfcHJldl95ICkgPT09IE1hdGguc2lnbiggdl9uZXh0X3kgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGlyZWN0aW9uX2VxICkge1xuXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzZXF1ZW5jZVwiKTtcblx0XHRcdFx0XHR2X3RyYW5zX3ggPSAtIHZfcHJldl95O1xuXHRcdFx0XHRcdHZfdHJhbnNfeSA9IHZfcHJldl94O1xuXHRcdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc3Bpa2VcIik7XG5cdFx0XHRcdFx0dl90cmFuc194ID0gdl9wcmV2X3g7XG5cdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3k7XG5cdFx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgLyAyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMiggdl90cmFuc194IC8gc2hyaW5rX2J5LCB2X3RyYW5zX3kgLyBzaHJpbmtfYnkgKTtcblxuXHRcdH1cblxuXG5cdFx0dmFyIGNvbnRvdXJNb3ZlbWVudHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7XG5cblx0XHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcblx0XHRcdGlmICggayA9PT0gaWwgKSBrID0gMDtcblxuXHRcdFx0Ly8gIChqKS0tLShpKS0tLShrKVxuXHRcdFx0Ly8gY29uc29sZS5sb2coJ2ksaixrJywgaSwgaiAsIGspXG5cblx0XHRcdGNvbnRvdXJNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBjb250b3VyWyBpIF0sIGNvbnRvdXJbIGogXSwgY29udG91clsgayBdICk7XG5cblx0XHR9XG5cblx0XHR2YXIgaG9sZXNNb3ZlbWVudHMgPSBbXSxcblx0XHRcdG9uZUhvbGVNb3ZlbWVudHMsIHZlcnRpY2VzTW92ZW1lbnRzID0gY29udG91ck1vdmVtZW50cy5jb25jYXQoKTtcblxuXHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBbXTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHtcblxuXHRcdFx0XHRpZiAoIGogPT09IGlsICkgaiA9IDA7XG5cdFx0XHRcdGlmICggayA9PT0gaWwgKSBrID0gMDtcblxuXHRcdFx0XHQvLyAgKGopLS0tKGkpLS0tKGspXG5cdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBhaG9sZVsgaSBdLCBhaG9sZVsgaiBdLCBhaG9sZVsgayBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aG9sZXNNb3ZlbWVudHMucHVzaCggb25lSG9sZU1vdmVtZW50cyApO1xuXHRcdFx0dmVydGljZXNNb3ZlbWVudHMgPSB2ZXJ0aWNlc01vdmVtZW50cy5jb25jYXQoIG9uZUhvbGVNb3ZlbWVudHMgKTtcblxuXHRcdH1cblxuXG5cdFx0Ly8gTG9vcCBiZXZlbFNlZ21lbnRzLCAxIGZvciB0aGUgZnJvbnQsIDEgZm9yIHRoZSBiYWNrXG5cblx0XHRmb3IgKCBiID0gMDsgYiA8IGJldmVsU2VnbWVudHM7IGIgKysgKSB7XG5cblx0XHRcdC8vZm9yICggYiA9IGJldmVsU2VnbWVudHM7IGIgPiAwOyBiIC0tICkge1xuXG5cdFx0XHR0ID0gYiAvIGJldmVsU2VnbWVudHM7XG5cdFx0XHR6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7XG5cdFx0XHRicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKTtcblxuXHRcdFx0Ly8gY29udHJhY3Qgc2hhcGVcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHR2ZXJ0ID0gc2NhbGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAtIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0YnMgPSBiZXZlbFNpemU7XG5cblx0XHQvLyBCYWNrIGZhY2luZyB2ZXJ0aWNlc1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCB2bGVuOyBpICsrICkge1xuXG5cdFx0XHR2ZXJ0ID0gYmV2ZWxFbmFibGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJzICkgOiB2ZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgMCBdLnksIGV4dHJ1ZGVQdHNbIDAgXS54ICk7XG5cblx0XHRcdFx0bm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgMCBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApO1xuXHRcdFx0XHRiaW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLmJpbm9ybWFsc1sgMCBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSApO1xuXG5cdFx0XHRcdHBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyAwIF0gKS5hZGQoIG5vcm1hbCApLmFkZCggYmlub3JtYWwgKTtcblxuXHRcdFx0XHR2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIEFkZCBzdGVwcGVkIHZlcnRpY2VzLi4uXG5cdFx0Ly8gSW5jbHVkaW5nIGZyb250IGZhY2luZyB2ZXJ0aWNlc1xuXG5cdFx0dmFyIHM7XG5cblx0XHRmb3IgKCBzID0gMTsgcyA8PSBzdGVwczsgcyArKyApIHtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCB2bGVuOyBpICsrICkge1xuXG5cdFx0XHRcdHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07XG5cblx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgZGVwdGggLyBzdGVwcyAqIHMgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueCApO1xuXG5cdFx0XHRcdFx0bm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApO1xuXHRcdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgcyBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XG5cblx0XHRcdFx0XHR2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdC8vIEFkZCBiZXZlbCBzZWdtZW50cyBwbGFuZXNcblxuXHRcdC8vZm9yICggYiA9IDE7IGIgPD0gYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblx0XHRmb3IgKCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHtcblxuXHRcdFx0dCA9IGIgLyBiZXZlbFNlZ21lbnRzO1xuXHRcdFx0eiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xuXHRcdFx0YnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICk7XG5cblx0XHRcdC8vIGNvbnRyYWN0IHNoYXBlXG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGRlcHRoICsgeiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGV4cGFuZCBob2xlc1xuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGRlcHRoICsgeiApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS55LCBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS54ICsgeiApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0LyogRmFjZXMgKi9cblxuXHRcdC8vIFRvcCBhbmQgYm90dG9tIGZhY2VzXG5cblx0XHRidWlsZExpZEZhY2VzKCk7XG5cblx0XHQvLyBTaWRlcyBmYWNlc1xuXG5cdFx0YnVpbGRTaWRlRmFjZXMoKTtcblxuXG5cdFx0Ly8vLy8gIEludGVybmFsIGZ1bmN0aW9uc1xuXG5cdFx0ZnVuY3Rpb24gYnVpbGRMaWRGYWNlcygpIHtcblxuXHRcdFx0dmFyIHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXG5cdFx0XHRpZiAoIGJldmVsRW5hYmxlZCApIHtcblxuXHRcdFx0XHR2YXIgbGF5ZXIgPSAwOyAvLyBzdGVwcyArIDFcblx0XHRcdFx0dmFyIG9mZnNldCA9IHZsZW4gKiBsYXllcjtcblxuXHRcdFx0XHQvLyBCb3R0b20gZmFjZXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0XHRmMyggZmFjZVsgMiBdICsgb2Zmc2V0LCBmYWNlWyAxIF0gKyBvZmZzZXQsIGZhY2VbIDAgXSArIG9mZnNldCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsYXllciA9IHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDI7XG5cdFx0XHRcdG9mZnNldCA9IHZsZW4gKiBsYXllcjtcblxuXHRcdFx0XHQvLyBUb3AgZmFjZXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0XHRmMyggZmFjZVsgMCBdICsgb2Zmc2V0LCBmYWNlWyAxIF0gKyBvZmZzZXQsIGZhY2VbIDIgXSArIG9mZnNldCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBCb3R0b20gZmFjZXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0XHRmMyggZmFjZVsgMiBdLCBmYWNlWyAxIF0sIGZhY2VbIDAgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUb3AgZmFjZXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0XHRmMyggZmFjZVsgMCBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAxIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDIgXSArIHZsZW4gKiBzdGVwcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMyAtIHN0YXJ0LCAwICk7XG5cblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgZmFjZXMgZm9yIHRoZSB6LXNpZGVzIG9mIHRoZSBzaGFwZVxuXG5cdFx0ZnVuY3Rpb24gYnVpbGRTaWRlRmFjZXMoKSB7XG5cblx0XHRcdHZhciBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblx0XHRcdHZhciBsYXllcm9mZnNldCA9IDA7XG5cdFx0XHRzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICk7XG5cdFx0XHRsYXllcm9mZnNldCArPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0XHRzaWRld2FsbHMoIGFob2xlLCBsYXllcm9mZnNldCApO1xuXG5cdFx0XHRcdC8vLCB0cnVlXG5cdFx0XHRcdGxheWVyb2Zmc2V0ICs9IGFob2xlLmxlbmd0aDtcblxuXHRcdFx0fVxuXG5cblx0XHRcdHNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIDEgKTtcblxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gc2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApIHtcblxuXHRcdFx0dmFyIGosIGs7XG5cdFx0XHRpID0gY29udG91ci5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggLS0gaSA+PSAwICkge1xuXG5cdFx0XHRcdGogPSBpO1xuXHRcdFx0XHRrID0gaSAtIDE7XG5cdFx0XHRcdGlmICggayA8IDAgKSBrID0gY29udG91ci5sZW5ndGggLSAxO1xuXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ2InLCBpLGosIGktMSwgayx2ZXJ0aWNlcy5sZW5ndGgpO1xuXG5cdFx0XHRcdHZhciBzID0gMCxcblx0XHRcdFx0XHRzbCA9IHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDI7XG5cblx0XHRcdFx0Zm9yICggcyA9IDA7IHMgPCBzbDsgcyArKyApIHtcblxuXHRcdFx0XHRcdHZhciBzbGVuMSA9IHZsZW4gKiBzO1xuXHRcdFx0XHRcdHZhciBzbGVuMiA9IHZsZW4gKiAoIHMgKyAxICk7XG5cblx0XHRcdFx0XHR2YXIgYSA9IGxheWVyb2Zmc2V0ICsgaiArIHNsZW4xLFxuXHRcdFx0XHRcdFx0YiA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4xLFxuXHRcdFx0XHRcdFx0YyA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4yLFxuXHRcdFx0XHRcdFx0ZCA9IGxheWVyb2Zmc2V0ICsgaiArIHNsZW4yO1xuXG5cdFx0XHRcdFx0ZjQoIGEsIGIsIGMsIGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHYoIHgsIHksIHogKSB7XG5cblx0XHRcdHBsYWNlaG9sZGVyLnB1c2goIHggKTtcblx0XHRcdHBsYWNlaG9sZGVyLnB1c2goIHkgKTtcblx0XHRcdHBsYWNlaG9sZGVyLnB1c2goIHogKTtcblxuXHRcdH1cblxuXG5cdFx0ZnVuY3Rpb24gZjMoIGEsIGIsIGMgKSB7XG5cblx0XHRcdGFkZFZlcnRleCggYSApO1xuXHRcdFx0YWRkVmVydGV4KCBiICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGMgKTtcblxuXHRcdFx0dmFyIG5leHRJbmRleCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblx0XHRcdHZhciB1dnMgPSB1dmdlbi5nZW5lcmF0ZVRvcFVWKCBzY29wZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4IC0gMiwgbmV4dEluZGV4IC0gMSApO1xuXG5cdFx0XHRhZGRVViggdXZzWyAwIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMiBdICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmNCggYSwgYiwgYywgZCApIHtcblxuXHRcdFx0YWRkVmVydGV4KCBhICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGIgKTtcblx0XHRcdGFkZFZlcnRleCggZCApO1xuXG5cdFx0XHRhZGRWZXJ0ZXgoIGIgKTtcblx0XHRcdGFkZFZlcnRleCggYyApO1xuXHRcdFx0YWRkVmVydGV4KCBkICk7XG5cblxuXHRcdFx0dmFyIG5leHRJbmRleCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblx0XHRcdHZhciB1dnMgPSB1dmdlbi5nZW5lcmF0ZVNpZGVXYWxsVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSA2LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XG5cblx0XHRcdGFkZFVWKCB1dnNbIDAgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAzIF0gKTtcblxuXHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDMgXSApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYWRkVmVydGV4KCBpbmRleCApIHtcblxuXHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMCBdICk7XG5cdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAxIF0gKTtcblx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDIgXSApO1xuXG5cdFx0fVxuXG5cblx0XHRmdW5jdGlvbiBhZGRVViggdmVjdG9yMiApIHtcblxuXHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnggKTtcblx0XHRcdHV2QXJyYXkucHVzaCggdmVjdG9yMi55ICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFeHRydWRlQnVmZmVyR2VvbWV0cnk7XG5cbkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0dmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XG5cdHZhciBvcHRpb25zID0gdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7XG5cblx0cmV0dXJuIHRvSlNPTiggc2hhcGVzLCBvcHRpb25zLCBkYXRhICk7XG5cbn07XG5cbi8vXG5cbnZhciBXb3JsZFVWR2VuZXJhdG9yID0ge1xuXG5cdGdlbmVyYXRlVG9wVVY6IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDICkge1xuXG5cdFx0dmFyIGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07XG5cdFx0dmFyIGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xuXHRcdHZhciBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdO1xuXHRcdHZhciBiX3kgPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDEgXTtcblx0XHR2YXIgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTtcblx0XHR2YXIgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgYV95ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggYl94LCBiX3kgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIGNfeSApXG5cdFx0XTtcblxuXHR9LFxuXG5cdGdlbmVyYXRlU2lkZVdhbGxVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMsIGluZGV4RCApIHtcblxuXHRcdHZhciBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdO1xuXHRcdHZhciBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTtcblx0XHR2YXIgYV96ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAyIF07XG5cdFx0dmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XG5cdFx0dmFyIGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xuXHRcdHZhciBiX3ogPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDIgXTtcblx0XHR2YXIgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTtcblx0XHR2YXIgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07XG5cdFx0dmFyIGNfeiA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMiBdO1xuXHRcdHZhciBkX3ggPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyBdO1xuXHRcdHZhciBkX3kgPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDEgXTtcblx0XHR2YXIgZF96ID0gdmVydGljZXNbIGluZGV4RCAqIDMgKyAyIF07XG5cblx0XHRpZiAoIE1hdGguYWJzKCBhX3kgLSBiX3kgKSA8IDAuMDEgKSB7XG5cblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBhX3gsIDEgLSBhX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGJfeCwgMSAtIGJfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggY194LCAxIC0gY196ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBkX3gsIDEgLSBkX3ogKVxuXHRcdFx0XTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBhX3ksIDEgLSBhX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGJfeSwgMSAtIGJfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggY195LCAxIC0gY196ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBkX3ksIDEgLSBkX3ogKVxuXHRcdFx0XTtcblxuXHRcdH1cblxuXHR9XG59O1xuXG5mdW5jdGlvbiB0b0pTT04oIHNoYXBlcywgb3B0aW9ucywgZGF0YSApIHtcblxuXHQvL1xuXG5cdGRhdGEuc2hhcGVzID0gW107XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblxuXHRcdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGUudXVpZCApO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZXMudXVpZCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdGlmICggb3B0aW9ucy5leHRydWRlUGF0aCAhPT0gdW5kZWZpbmVkICkgZGF0YS5vcHRpb25zLmV4dHJ1ZGVQYXRoID0gb3B0aW9ucy5leHRydWRlUGF0aC50b0pTT04oKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufVxuXG5cbmV4cG9ydCB7IEV4dHJ1ZGVHZW9tZXRyeSwgRXh0cnVkZUJ1ZmZlckdlb21ldHJ5IH07XG4iLCIvKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogVGV4dCA9IDNEIFRleHRcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGZvbnQ6IDxUSFJFRS5Gb250PiwgLy8gZm9udFxuICpcbiAqICBzaXplOiA8ZmxvYXQ+LCAvLyBzaXplIG9mIHRoZSB0ZXh0XG4gKiAgaGVpZ2h0OiA8ZmxvYXQ+LCAvLyB0aGlja25lc3MgdG8gZXh0cnVkZSB0ZXh0XG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICpcbiAqICBiZXZlbEVuYWJsZWQ6IDxib29sPiwgLy8gdHVybiBvbiBiZXZlbFxuICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRleHQgYmV2ZWwgZ29lc1xuICogIGJldmVsU2l6ZTogPGZsb2F0PiAvLyBob3cgZmFyIGZyb20gdGV4dCBvdXRsaW5lIGlzIGJldmVsXG4gKiB9XG4gKi9cblxuaW1wb3J0IHsgR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0dlb21ldHJ5LmpzJztcbmltcG9ydCB7IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4vRXh0cnVkZUdlb21ldHJ5LmpzJztcblxuLy8gVGV4dEdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRleHRHZW9tZXRyeSggdGV4dCwgcGFyYW1ldGVycyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RleHRHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHRleHQ6IHRleHQsXG5cdFx0cGFyYW1ldGVyczogcGFyYW1ldGVyc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVGV4dEdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV4dEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRleHRHZW9tZXRyeTtcblxuLy8gVGV4dEJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRleHRCdWZmZXJHZW9tZXRyeSggdGV4dCwgcGFyYW1ldGVycyApIHtcblxuXHRwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTtcblxuXHR2YXIgZm9udCA9IHBhcmFtZXRlcnMuZm9udDtcblxuXHRpZiAoICEgKCBmb250ICYmIGZvbnQuaXNGb250ICkgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVGV4dEdlb21ldHJ5OiBmb250IHBhcmFtZXRlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRm9udC4nICk7XG5cdFx0cmV0dXJuIG5ldyBHZW9tZXRyeSgpO1xuXG5cdH1cblxuXHR2YXIgc2hhcGVzID0gZm9udC5nZW5lcmF0ZVNoYXBlcyggdGV4dCwgcGFyYW1ldGVycy5zaXplICk7XG5cblx0Ly8gdHJhbnNsYXRlIHBhcmFtZXRlcnMgdG8gRXh0cnVkZUdlb21ldHJ5IEFQSVxuXG5cdHBhcmFtZXRlcnMuZGVwdGggPSBwYXJhbWV0ZXJzLmhlaWdodCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5oZWlnaHQgOiA1MDtcblxuXHQvLyBkZWZhdWx0c1xuXG5cdGlmICggcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9IDEwO1xuXHRpZiAoIHBhcmFtZXRlcnMuYmV2ZWxTaXplID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsU2l6ZSA9IDg7XG5cdGlmICggcGFyYW1ldGVycy5iZXZlbEVuYWJsZWQgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxFbmFibGVkID0gZmFsc2U7XG5cblx0RXh0cnVkZUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHNoYXBlcywgcGFyYW1ldGVycyApO1xuXG5cdHRoaXMudHlwZSA9ICdUZXh0QnVmZmVyR2VvbWV0cnknO1xuXG59XG5cblRleHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXh0QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEJ1ZmZlckdlb21ldHJ5O1xuXG5cbmV4cG9ydCB7IFRleHRHZW9tZXRyeSwgVGV4dEJ1ZmZlckdlb21ldHJ5IH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuaW1wb3J0IHsgR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0dlb21ldHJ5LmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XG5cbi8vIFNwaGVyZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNwaGVyZUdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NwaGVyZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBTcGhlcmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5TcGhlcmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNwaGVyZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwaGVyZUdlb21ldHJ5O1xuXG4vLyBTcGhlcmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBTcGhlcmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcGhlcmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXG5cdHdpZHRoU2VnbWVudHMgPSBNYXRoLm1heCggMywgTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDggKTtcblx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLm1heCggMiwgTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCA2ICk7XG5cblx0cGhpU3RhcnQgPSBwaGlTdGFydCAhPT0gdW5kZWZpbmVkID8gcGhpU3RhcnQgOiAwO1xuXHRwaGlMZW5ndGggPSBwaGlMZW5ndGggIT09IHVuZGVmaW5lZCA/IHBoaUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJO1xuXG5cdHZhciB0aGV0YUVuZCA9IHRoZXRhU3RhcnQgKyB0aGV0YUxlbmd0aDtcblxuXHR2YXIgaXgsIGl5O1xuXG5cdHZhciBpbmRleCA9IDA7XG5cdHZhciBncmlkID0gW107XG5cblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDw9IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHtcblxuXHRcdHZhciB2ZXJ0aWNlc1JvdyA9IFtdO1xuXG5cdFx0dmFyIHYgPSBpeSAvIGhlaWdodFNlZ21lbnRzO1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8PSB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIHUgPSBpeCAvIHdpZHRoU2VnbWVudHM7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IC0gcmFkaXVzICogTWF0aC5jb3MoIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcblx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5jb3MoIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcblx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogTWF0aC5zaW4oIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFsLnNldCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCB1LCAxIC0gdiApO1xuXG5cdFx0XHR2ZXJ0aWNlc1Jvdy5wdXNoKCBpbmRleCArKyApO1xuXG5cdFx0fVxuXG5cdFx0Z3JpZC5wdXNoKCB2ZXJ0aWNlc1JvdyApO1xuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHtcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPCB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBncmlkWyBpeSBdWyBpeCArIDEgXTtcblx0XHRcdHZhciBiID0gZ3JpZFsgaXkgXVsgaXggXTtcblx0XHRcdHZhciBjID0gZ3JpZFsgaXkgKyAxIF1bIGl4IF07XG5cdFx0XHR2YXIgZCA9IGdyaWRbIGl5ICsgMSBdWyBpeCArIDEgXTtcblxuXHRcdFx0aWYgKCBpeSAhPT0gMCB8fCB0aGV0YVN0YXJ0ID4gMCApIGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aWYgKCBpeSAhPT0gaGVpZ2h0U2VnbWVudHMgLSAxIHx8IHRoZXRhRW5kIDwgTWF0aC5QSSApIGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5TcGhlcmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVCdWZmZXJHZW9tZXRyeTtcblxuXG5leHBvcnQgeyBTcGhlcmVHZW9tZXRyeSwgU3BoZXJlQnVmZmVyR2VvbWV0cnkgfTtcbiIsIi8qKlxuICogQGF1dGhvciBLYWxlYiBNdXJwaHlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuaW1wb3J0IHsgR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0dlb21ldHJ5LmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcblxuLy8gUmluZ0dlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBSaW5nQnVmZmVyR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUmluZ0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUmluZ0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJpbmdHZW9tZXRyeTtcblxuLy8gUmluZ0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0aW5uZXJSYWRpdXMgPSBpbm5lclJhZGl1cyB8fCAwLjU7XG5cdG91dGVyUmFkaXVzID0gb3V0ZXJSYWRpdXMgfHwgMTtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0dGhldGFTZWdtZW50cyA9IHRoZXRhU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCB0aGV0YVNlZ21lbnRzICkgOiA4O1xuXHRwaGlTZWdtZW50cyA9IHBoaVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMSwgcGhpU2VnbWVudHMgKSA6IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gc29tZSBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHNlZ21lbnQ7XG5cdHZhciByYWRpdXMgPSBpbm5lclJhZGl1cztcblx0dmFyIHJhZGl1c1N0ZXAgPSAoICggb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cyApIC8gcGhpU2VnbWVudHMgKTtcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdHZhciBqLCBpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBqID0gMDsgaiA8PSBwaGlTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIHZhbHVlcyBhcmUgZ2VuZXJhdGUgZnJvbSB0aGUgaW5zaWRlIG9mIHRoZSByaW5nIHRvIHRoZSBvdXRzaWRlXG5cblx0XHRcdHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcblx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSAoIHZlcnRleC54IC8gb3V0ZXJSYWRpdXMgKyAxICkgLyAyO1xuXHRcdFx0dXYueSA9ICggdmVydGV4LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHR9XG5cblx0XHQvLyBpbmNyZWFzZSB0aGUgcmFkaXVzIGZvciBuZXh0IHJvdyBvZiB2ZXJ0aWNlc1xuXG5cdFx0cmFkaXVzICs9IHJhZGl1c1N0ZXA7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBqID0gMDsgaiA8IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0dmFyIHRoZXRhU2VnbWVudExldmVsID0gaiAqICggdGhldGFTZWdtZW50cyArIDEgKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdGhldGFTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0c2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDtcblxuXHRcdFx0dmFyIGEgPSBzZWdtZW50O1xuXHRcdFx0dmFyIGIgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDE7XG5cdFx0XHR2YXIgYyA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMjtcblx0XHRcdHZhciBkID0gc2VnbWVudCArIDE7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0J1ZmZlckdlb21ldHJ5O1xuXG5cbmV4cG9ydCB7IFJpbmdHZW9tZXRyeSwgUmluZ0J1ZmZlckdlb21ldHJ5IH07XG4iLCIvKipcbiAqIEBhdXRob3IgYXN0cm9kdWQgLyBodHRwOi8vYXN0cm9kdWQuaXNncmVhdC5vcmcvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xuaW1wb3J0IHsgX01hdGggfSBmcm9tICcuLi9tYXRoL01hdGguanMnO1xuXG4vLyBMYXRoZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIExhdGhlR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMYXRoZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cG9pbnRzOiBwb2ludHMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkxhdGhlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5MYXRoZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhdGhlR2VvbWV0cnk7XG5cbi8vIExhdGhlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xhdGhlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwb2ludHM6IHBvaW50cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoXG5cdH07XG5cblx0c2VnbWVudHMgPSBNYXRoLmZsb29yKCBzZWdtZW50cyApIHx8IDEyO1xuXHRwaGlTdGFydCA9IHBoaVN0YXJ0IHx8IDA7XG5cdHBoaUxlbmd0aCA9IHBoaUxlbmd0aCB8fCBNYXRoLlBJICogMjtcblxuXHQvLyBjbGFtcCBwaGlMZW5ndGggc28gaXQncyBpbiByYW5nZSBvZiBbIDAsIDJQSSBdXG5cblx0cGhpTGVuZ3RoID0gX01hdGguY2xhbXAoIHBoaUxlbmd0aCwgMCwgTWF0aC5QSSAqIDIgKTtcblxuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgYmFzZTtcblx0dmFyIGludmVyc2VTZWdtZW50cyA9IDEuMCAvIHNlZ21lbnRzO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIGksIGo7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMgYW5kIHV2c1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0dmFyIHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50cyAqIHBoaUxlbmd0aDtcblxuXHRcdHZhciBzaW4gPSBNYXRoLnNpbiggcGhpICk7XG5cdFx0dmFyIGNvcyA9IE1hdGguY29zKCBwaGkgKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcG9pbnRzWyBqIF0ueCAqIHNpbjtcblx0XHRcdHZlcnRleC55ID0gcG9pbnRzWyBqIF0ueTtcblx0XHRcdHZlcnRleC56ID0gcG9pbnRzWyBqIF0ueCAqIGNvcztcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1di54ID0gaSAvIHNlZ21lbnRzO1xuXHRcdFx0dXYueSA9IGogLyAoIHBvaW50cy5sZW5ndGggLSAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDwgc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0YmFzZSA9IGogKyBpICogcG9pbnRzLmxlbmd0aDtcblxuXHRcdFx0dmFyIGEgPSBiYXNlO1xuXHRcdFx0dmFyIGIgPSBiYXNlICsgcG9pbnRzLmxlbmd0aDtcblx0XHRcdHZhciBjID0gYmFzZSArIHBvaW50cy5sZW5ndGggKyAxO1xuXHRcdFx0dmFyIGQgPSBiYXNlICsgMTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gZ2VuZXJhdGUgbm9ybWFsc1xuXG5cdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCB3ZSBuZWVkIHRvIGF2ZXJhZ2UgdGhlIG5vcm1hbHMgYWxvbmcgdGhlIHNlYW0uXG5cdC8vIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGljZXMgYXJlIGlkZW50aWNhbCAoYnV0IHN0aWxsIGhhdmUgZGlmZmVyZW50IFVWcykuXG5cblx0aWYgKCBwaGlMZW5ndGggPT09IE1hdGguUEkgKiAyICkge1xuXG5cdFx0dmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXHRcdHZhciBuMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG4yID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyB0aGlzIGlzIHRoZSBidWZmZXIgb2Zmc2V0IGZvciB0aGUgbGFzdCBsaW5lIG9mIHZlcnRpY2VzXG5cblx0XHRiYXNlID0gc2VnbWVudHMgKiBwb2ludHMubGVuZ3RoICogMztcblxuXHRcdGZvciAoIGkgPSAwLCBqID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKyssIGogKz0gMyApIHtcblxuXHRcdFx0Ly8gc2VsZWN0IHRoZSBub3JtYWwgb2YgdGhlIHZlcnRleCBpbiB0aGUgZmlyc3QgbGluZVxuXG5cdFx0XHRuMS54ID0gbm9ybWFsc1sgaiArIDAgXTtcblx0XHRcdG4xLnkgPSBub3JtYWxzWyBqICsgMSBdO1xuXHRcdFx0bjEueiA9IG5vcm1hbHNbIGogKyAyIF07XG5cblx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGxhc3QgbGluZVxuXG5cdFx0XHRuMi54ID0gbm9ybWFsc1sgYmFzZSArIGogKyAwIF07XG5cdFx0XHRuMi55ID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF07XG5cdFx0XHRuMi56ID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF07XG5cblx0XHRcdC8vIGF2ZXJhZ2Ugbm9ybWFsc1xuXG5cdFx0XHRuLmFkZFZlY3RvcnMoIG4xLCBuMiApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHQvLyBhc3NpZ24gdGhlIG5ldyB2YWx1ZXMgdG8gYm90aCBub3JtYWxzXG5cblx0XHRcdG5vcm1hbHNbIGogKyAwIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXSA9IG4ueDtcblx0XHRcdG5vcm1hbHNbIGogKyAxIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXSA9IG4ueTtcblx0XHRcdG5vcm1hbHNbIGogKyAyIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXSA9IG4uejtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkxhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVCdWZmZXJHZW9tZXRyeTtcblxuXG5leHBvcnQgeyBMYXRoZUdlb21ldHJ5LCBMYXRoZUJ1ZmZlckdlb21ldHJ5IH07XG4iLCIvKipcbiAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25vYnIxLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBTaGFwZVV0aWxzIH0gZnJvbSAnLi4vZXh0cmFzL1NoYXBlVXRpbHMuanMnO1xuXG4vLyBTaGFwZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNoYXBlR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlR2VvbWV0cnknO1xuXG5cdGlmICggdHlwZW9mIGN1cnZlU2VnbWVudHMgPT09ICdvYmplY3QnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGVHZW9tZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHRjdXJ2ZVNlZ21lbnRzID0gY3VydmVTZWdtZW50cy5jdXJ2ZVNlZ21lbnRzO1xuXG5cdH1cblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0Y3VydmVTZWdtZW50czogY3VydmVTZWdtZW50c1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU2hhcGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNoYXBlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVHZW9tZXRyeTtcblxuU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0dmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XG5cblx0cmV0dXJuIHRvSlNPTiggc2hhcGVzLCBkYXRhICk7XG5cbn07XG5cbi8vIFNoYXBlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gU2hhcGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhcGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdGN1cnZlU2VnbWVudHM6IGN1cnZlU2VnbWVudHNcblx0fTtcblxuXHRjdXJ2ZVNlZ21lbnRzID0gY3VydmVTZWdtZW50cyB8fCAxMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0Ly8gYWxsb3cgc2luZ2xlIGFuZCBhcnJheSB2YWx1ZXMgZm9yIFwic2hhcGVzXCIgcGFyYW1ldGVyXG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRhZGRTaGFwZSggc2hhcGVzICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHNoYXBlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGFkZFNoYXBlKCBzaGFwZXNbIGkgXSApO1xuXG5cdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCBpICk7IC8vIGVuYWJsZXMgTXVsdGlNYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblx0XHRcdGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblxuXHQvLyBoZWxwZXIgZnVuY3Rpb25zXG5cblx0ZnVuY3Rpb24gYWRkU2hhcGUoIHNoYXBlICkge1xuXG5cdFx0dmFyIGksIGwsIHNoYXBlSG9sZTtcblxuXHRcdHZhciBpbmRleE9mZnNldCA9IHZlcnRpY2VzLmxlbmd0aCAvIDM7XG5cdFx0dmFyIHBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcblxuXHRcdHZhciBzaGFwZVZlcnRpY2VzID0gcG9pbnRzLnNoYXBlO1xuXHRcdHZhciBzaGFwZUhvbGVzID0gcG9pbnRzLmhvbGVzO1xuXG5cdFx0Ly8gY2hlY2sgZGlyZWN0aW9uIG9mIHZlcnRpY2VzXG5cblx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlVmVydGljZXMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLnJldmVyc2UoKTtcblxuXHRcdFx0Ly8gYWxzbyBjaGVjayBpZiBob2xlcyBhcmUgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvblxuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZUhvbGUgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHNoYXBlSG9sZXNbIGkgXSA9IHNoYXBlSG9sZS5yZXZlcnNlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIHNoYXBlVmVydGljZXMsIHNoYXBlSG9sZXMgKTtcblxuXHRcdC8vIGpvaW4gdmVydGljZXMgb2YgaW5uZXIgYW5kIG91dGVyIHBhdGhzIHRvIGEgc2luZ2xlIGFycmF5XG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0c2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdO1xuXHRcdFx0c2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMuY29uY2F0KCBzaGFwZUhvbGUgKTtcblxuXHRcdH1cblxuXHRcdC8vIHZlcnRpY2VzLCBub3JtYWxzLCB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gc2hhcGVWZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gc2hhcGVWZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIDAgKTtcblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXHRcdFx0dXZzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSApOyAvLyB3b3JsZCB1dnNcblxuXHRcdH1cblxuXHRcdC8vIGluY2lkZXNcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgYSA9IGZhY2VbIDAgXSArIGluZGV4T2Zmc2V0O1xuXHRcdFx0dmFyIGIgPSBmYWNlWyAxIF0gKyBpbmRleE9mZnNldDtcblx0XHRcdHZhciBjID0gZmFjZVsgMiBdICsgaW5kZXhPZmZzZXQ7XG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYyApO1xuXHRcdFx0Z3JvdXBDb3VudCArPSAzO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5TaGFwZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFwZUJ1ZmZlckdlb21ldHJ5O1xuXG5TaGFwZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHR2YXIgc2hhcGVzID0gdGhpcy5wYXJhbWV0ZXJzLnNoYXBlcztcblxuXHRyZXR1cm4gdG9KU09OKCBzaGFwZXMsIGRhdGEgKTtcblxufTtcblxuLy9cblxuZnVuY3Rpb24gdG9KU09OKCBzaGFwZXMsIGRhdGEgKSB7XG5cblx0ZGF0YS5zaGFwZXMgPSBbXTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXG5cdFx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZS51dWlkICk7XG5cblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdGRhdGEuc2hhcGVzLnB1c2goIHNoYXBlcy51dWlkICk7XG5cblx0fVxuXG5cdHJldHVybiBkYXRhO1xuXG59XG5cblxuZXhwb3J0IHsgU2hhcGVHZW9tZXRyeSwgU2hhcGVCdWZmZXJHZW9tZXRyeSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgX01hdGggfSBmcm9tICcuLi9tYXRoL01hdGguanMnO1xuXG5mdW5jdGlvbiBFZGdlc0dlb21ldHJ5KCBnZW9tZXRyeSwgdGhyZXNob2xkQW5nbGUgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFZGdlc0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGhyZXNob2xkQW5nbGU6IHRocmVzaG9sZEFuZ2xlXG5cdH07XG5cblx0dGhyZXNob2xkQW5nbGUgPSAoIHRocmVzaG9sZEFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IHRocmVzaG9sZEFuZ2xlIDogMTtcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHRocmVzaG9sZERvdCA9IE1hdGguY29zKCBfTWF0aC5ERUcyUkFEICogdGhyZXNob2xkQW5nbGUgKTtcblx0dmFyIGVkZ2UgPSBbIDAsIDAgXSwgZWRnZXMgPSB7fSwgZWRnZTEsIGVkZ2UyO1xuXHR2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cblx0Ly8gcHJlcGFyZSBzb3VyY2UgZ2VvbWV0cnlcblxuXHR2YXIgZ2VvbWV0cnkyO1xuXG5cdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdGdlb21ldHJ5MiA9IG5ldyBHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5Mi5mcm9tQnVmZmVyR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGdlb21ldHJ5MiA9IGdlb21ldHJ5LmNsb25lKCk7XG5cblx0fVxuXG5cdGdlb21ldHJ5Mi5tZXJnZVZlcnRpY2VzKCk7XG5cdGdlb21ldHJ5Mi5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHR2YXIgc291cmNlVmVydGljZXMgPSBnZW9tZXRyeTIudmVydGljZXM7XG5cdHZhciBmYWNlcyA9IGdlb21ldHJ5Mi5mYWNlcztcblxuXHQvLyBub3cgY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgd2hlcmUgZWFjaCBlbnRyeSByZXByZXNlbnRzIGFuIGVkZ2Ugd2l0aCBpdHMgYWRqb2luaW5nIGZhY2VzXG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdGZvciAoIHZhciBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdGVkZ2UxID0gZmFjZVsga2V5c1sgaiBdIF07XG5cdFx0XHRlZGdlMiA9IGZhY2VbIGtleXNbICggaiArIDEgKSAlIDMgXSBdO1xuXHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApO1xuXHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07XG5cblx0XHRcdGlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0sIGZhY2UxOiBpLCBmYWNlMjogdW5kZWZpbmVkIH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdLmZhY2UyID0gaTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlc1xuXG5cdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdHZhciBlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0Ly8gYW4gZWRnZSBpcyBvbmx5IHJlbmRlcmVkIGlmIHRoZSBhbmdsZSAoaW4gZGVncmVlcykgYmV0d2VlbiB0aGUgZmFjZSBub3JtYWxzIG9mIHRoZSBhZGpvaW5pbmcgZmFjZXMgZXhjZWVkcyB0aGlzIHZhbHVlLiBkZWZhdWx0ID0gMSBkZWdyZWUuXG5cblx0XHRpZiAoIGUuZmFjZTIgPT09IHVuZGVmaW5lZCB8fCBmYWNlc1sgZS5mYWNlMSBdLm5vcm1hbC5kb3QoIGZhY2VzWyBlLmZhY2UyIF0ubm9ybWFsICkgPD0gdGhyZXNob2xkRG90ICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gc291cmNlVmVydGljZXNbIGUuaW5kZXgxIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdHZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MiBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXG59XG5cbkVkZ2VzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5FZGdlc0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVkZ2VzR2VvbWV0cnk7XG5cblxuZXhwb3J0IHsgRWRnZXNHZW9tZXRyeSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xuXG4vLyBDeWxpbmRlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEN5bGluZGVyR2VvbWV0cnkoIHJhZGl1c1RvcCwgcmFkaXVzQm90dG9tLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N5bGluZGVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXNUb3A6IHJhZGl1c1RvcCxcblx0XHRyYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5DeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDeWxpbmRlckdlb21ldHJ5O1xuXG4vLyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIHJhZGl1c1RvcCwgcmFkaXVzQm90dG9tLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXNUb3A6IHJhZGl1c1RvcCxcblx0XHRyYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRyYWRpdXNUb3AgPSByYWRpdXNUb3AgIT09IHVuZGVmaW5lZCA/IHJhZGl1c1RvcCA6IDE7XG5cdHJhZGl1c0JvdHRvbSA9IHJhZGl1c0JvdHRvbSAhPT0gdW5kZWZpbmVkID8gcmFkaXVzQm90dG9tIDogMTtcblx0aGVpZ2h0ID0gaGVpZ2h0IHx8IDE7XG5cblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXG5cdG9wZW5FbmRlZCA9IG9wZW5FbmRlZCAhPT0gdW5kZWZpbmVkID8gb3BlbkVuZGVkIDogZmFsc2U7XG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMC4wO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaW5kZXggPSAwO1xuXHR2YXIgaW5kZXhBcnJheSA9IFtdO1xuXHR2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG5cdHZhciBncm91cFN0YXJ0ID0gMDtcblxuXHQvLyBnZW5lcmF0ZSBnZW9tZXRyeVxuXG5cdGdlbmVyYXRlVG9yc28oKTtcblxuXHRpZiAoIG9wZW5FbmRlZCA9PT0gZmFsc2UgKSB7XG5cblx0XHRpZiAoIHJhZGl1c1RvcCA+IDAgKSBnZW5lcmF0ZUNhcCggdHJ1ZSApO1xuXHRcdGlmICggcmFkaXVzQm90dG9tID4gMCApIGdlbmVyYXRlQ2FwKCBmYWxzZSApO1xuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVUb3JzbygpIHtcblxuXHRcdHZhciB4LCB5O1xuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0Ly8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWxcblx0XHR2YXIgc2xvcGUgPSAoIHJhZGl1c0JvdHRvbSAtIHJhZGl1c1RvcCApIC8gaGVpZ2h0O1xuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggeSA9IDA7IHkgPD0gaGVpZ2h0U2VnbWVudHM7IHkgKysgKSB7XG5cblx0XHRcdHZhciBpbmRleFJvdyA9IFtdO1xuXG5cdFx0XHR2YXIgdiA9IHkgLyBoZWlnaHRTZWdtZW50cztcblxuXHRcdFx0Ly8gY2FsY3VsYXRlIHRoZSByYWRpdXMgb2YgdGhlIGN1cnJlbnQgcm93XG5cblx0XHRcdHZhciByYWRpdXMgPSB2ICogKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSArIHJhZGl1c1RvcDtcblxuXHRcdFx0Zm9yICggeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdFx0dmFyIHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XG5cblx0XHRcdFx0dmFyIHRoZXRhID0gdSAqIHRoZXRhTGVuZ3RoICsgdGhldGFTdGFydDtcblxuXHRcdFx0XHR2YXIgc2luVGhldGEgPSBNYXRoLnNpbiggdGhldGEgKTtcblx0XHRcdFx0dmFyIGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cblx0XHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcblx0XHRcdFx0dmVydGV4LnkgPSAtIHYgKiBoZWlnaHQgKyBoYWxmSGVpZ2h0O1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhO1xuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdFx0bm9ybWFsLnNldCggc2luVGhldGEsIHNsb3BlLCBjb3NUaGV0YSApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0XHQvLyB1dlxuXG5cdFx0XHRcdHV2cy5wdXNoKCB1LCAxIC0gdiApO1xuXG5cdFx0XHRcdC8vIHNhdmUgaW5kZXggb2YgdmVydGV4IGluIHJlc3BlY3RpdmUgcm93XG5cblx0XHRcdFx0aW5kZXhSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBub3cgc2F2ZSB2ZXJ0aWNlcyBvZiB0aGUgcm93IGluIG91ciBpbmRleCBhcnJheVxuXG5cdFx0XHRpbmRleEFycmF5LnB1c2goIGluZGV4Um93ICk7XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRmb3IgKCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRmb3IgKCB5ID0gMDsgeSA8IGhlaWdodFNlZ21lbnRzOyB5ICsrICkge1xuXG5cdFx0XHRcdC8vIHdlIHVzZSB0aGUgaW5kZXggYXJyYXkgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IGluZGljZXNcblxuXHRcdFx0XHR2YXIgYSA9IGluZGV4QXJyYXlbIHkgXVsgeCBdO1xuXHRcdFx0XHR2YXIgYiA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHggXTtcblx0XHRcdFx0dmFyIGMgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4ICsgMSBdO1xuXHRcdFx0XHR2YXIgZCA9IGluZGV4QXJyYXlbIHkgXVsgeCArIDEgXTtcblxuXHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0XHQvLyB1cGRhdGUgZ3JvdXAgY291bnRlclxuXG5cdFx0XHRcdGdyb3VwQ291bnQgKz0gNjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdHNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCAwICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVDYXAoIHRvcCApIHtcblxuXHRcdHZhciB4LCBjZW50ZXJJbmRleFN0YXJ0LCBjZW50ZXJJbmRleEVuZDtcblxuXHRcdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0XHR2YXIgcmFkaXVzID0gKCB0b3AgPT09IHRydWUgKSA/IHJhZGl1c1RvcCA6IHJhZGl1c0JvdHRvbTtcblx0XHR2YXIgc2lnbiA9ICggdG9wID09PSB0cnVlICkgPyAxIDogLSAxO1xuXG5cdFx0Ly8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNlbnRlciB2ZXJ0ZXhcblx0XHRjZW50ZXJJbmRleFN0YXJ0ID0gaW5kZXg7XG5cblx0XHQvLyBmaXJzdCB3ZSBnZW5lcmF0ZSB0aGUgY2VudGVyIHZlcnRleCBkYXRhIG9mIHRoZSBjYXAuXG5cdFx0Ly8gYmVjYXVzZSB0aGUgZ2VvbWV0cnkgbmVlZHMgb25lIHNldCBvZiB1dnMgcGVyIGZhY2UsXG5cdFx0Ly8gd2UgbXVzdCBnZW5lcmF0ZSBhIGNlbnRlciB2ZXJ0ZXggcGVyIGZhY2Uvc2VnbWVudFxuXG5cdFx0Zm9yICggeCA9IDE7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCBoYWxmSGVpZ2h0ICogc2lnbiwgMCApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCAwLjUsIDAuNSApO1xuXG5cdFx0XHQvLyBpbmNyZWFzZSBpbmRleFxuXG5cdFx0XHRpbmRleCArKztcblxuXHRcdH1cblxuXHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNlbnRlciB2ZXJ0ZXhcblxuXHRcdGNlbnRlckluZGV4RW5kID0gaW5kZXg7XG5cblx0XHQvLyBub3cgd2UgZ2VuZXJhdGUgdGhlIHN1cnJvdW5kaW5nIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIHggPSAwOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IHggLyByYWRpYWxTZWdtZW50cztcblx0XHRcdHZhciB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XG5cblx0XHRcdHZhciBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApO1xuXHRcdFx0dmFyIHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIHNpblRoZXRhO1xuXHRcdFx0dmVydGV4LnkgPSBoYWxmSGVpZ2h0ICogc2lnbjtcblx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIHNpZ24sIDAgKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXYueCA9ICggY29zVGhldGEgKiAwLjUgKSArIDAuNTtcblx0XHRcdHV2LnkgPSAoIHNpblRoZXRhICogMC41ICogc2lnbiApICsgMC41O1xuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcblxuXHRcdFx0aW5kZXggKys7XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRmb3IgKCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHR2YXIgYyA9IGNlbnRlckluZGV4U3RhcnQgKyB4O1xuXHRcdFx0dmFyIGkgPSBjZW50ZXJJbmRleEVuZCArIHg7XG5cblx0XHRcdGlmICggdG9wID09PSB0cnVlICkge1xuXG5cdFx0XHRcdC8vIGZhY2UgdG9wXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgYyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGZhY2UgYm90dG9tXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBpICsgMSwgaSwgYyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdyb3VwQ291bnQgKz0gMztcblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgdG9wID09PSB0cnVlID8gMSA6IDIgKTtcblxuXHRcdC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3Vwc1xuXG5cdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdH1cblxufVxuXG5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5O1xuXG5cbmV4cG9ydCB7IEN5bGluZGVyR2VvbWV0cnksIEN5bGluZGVyQnVmZmVyR2VvbWV0cnkgfTtcbiIsIi8qKlxuICogQGF1dGhvciBhYmVsbmF0aW9uIC8gaHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvblxuICovXG5cbmltcG9ydCB7IEN5bGluZGVyR2VvbWV0cnkgfSBmcm9tICcuL0N5bGluZGVyR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4vQ3lsaW5kZXJHZW9tZXRyeS5qcyc7XG5cbi8vIENvbmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBDb25lR2VvbWV0cnkoIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0Q3lsaW5kZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7XG5cblx0dGhpcy50eXBlID0gJ0NvbmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxufVxuXG5Db25lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNvbmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25lR2VvbWV0cnk7XG5cbi8vIENvbmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDb25lQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0Q3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7XG5cblx0dGhpcy50eXBlID0gJ0NvbmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxufVxuXG5Db25lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNvbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25lQnVmZmVyR2VvbWV0cnk7XG5cblxuZXhwb3J0IHsgQ29uZUdlb21ldHJ5LCBDb25lQnVmZmVyR2VvbWV0cnkgfTtcbiIsIi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBodWdoZXNcbiAqL1xuXG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xuXG4vLyBDaXJjbGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBDaXJjbGVHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDaXJjbGVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQ2lyY2xlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQ2lyY2xlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5DaXJjbGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDaXJjbGVHZW9tZXRyeTtcblxuLy8gQ2lyY2xlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ2lyY2xlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2lyY2xlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0c2VnbWVudHMgPSBzZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDMsIHNlZ21lbnRzICkgOiA4O1xuXG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGksIHM7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXG5cdC8vIGNlbnRlciBwb2ludFxuXG5cdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cdHV2cy5wdXNoKCAwLjUsIDAuNSApO1xuXG5cdGZvciAoIHMgPSAwLCBpID0gMzsgcyA8PSBzZWdtZW50czsgcyArKywgaSArPSAzICkge1xuXG5cdFx0dmFyIHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgcyAvIHNlZ21lbnRzICogdGhldGFMZW5ndGg7XG5cblx0XHQvLyB2ZXJ0ZXhcblxuXHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcblx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHQvLyBub3JtYWxcblxuXHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXG5cdFx0Ly8gdXZzXG5cblx0XHR1di54ID0gKCB2ZXJ0aWNlc1sgaSBdIC8gcmFkaXVzICsgMSApIC8gMjtcblx0XHR1di55ID0gKCB2ZXJ0aWNlc1sgaSArIDEgXSAvIHJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRpbmRpY2VzLnB1c2goIGksIGkgKyAxLCAwICk7XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5DaXJjbGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNpcmNsZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZUJ1ZmZlckdlb21ldHJ5O1xuXG5cbmV4cG9ydCB7IENpcmNsZUdlb21ldHJ5LCBDaXJjbGVCdWZmZXJHZW9tZXRyeSB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxUSFJFRS5Db2xvcj5cbiAqIH1cbiAqL1xuXG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcblxuZnVuY3Rpb24gU2hhZG93TWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFkb3dNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblNoYWRvd01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYWRvd01hdGVyaWFsO1xuXG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuaXNTaGFkb3dNYXRlcmlhbCA9IHRydWU7XG5cblNoYWRvd01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5leHBvcnQgeyBTaGFkb3dNYXRlcmlhbCB9O1xuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuL1NoYWRlck1hdGVyaWFsLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFJhd1NoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdFNoYWRlck1hdGVyaWFsLmNhbGwoIHRoaXMsIHBhcmFtZXRlcnMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmF3U2hhZGVyTWF0ZXJpYWwnO1xuXG59XG5cblJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSApO1xuUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmF3U2hhZGVyTWF0ZXJpYWw7XG5cblJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5pc1Jhd1NoYWRlck1hdGVyaWFsID0gdHJ1ZTtcblxuXG5leHBvcnQgeyBSYXdTaGFkZXJNYXRlcmlhbCB9O1xuIiwiaW1wb3J0IHsgVGFuZ2VudFNwYWNlTm9ybWFsTWFwIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgcm91Z2huZXNzOiA8ZmxvYXQ+LFxuICogIG1ldGFsbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbE1hcFR5cGU6IFRIUkVFLlRhbmdlbnRTcGFjZU5vcm1hbE1hcCxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgcm91Z2huZXNzTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBtZXRhbG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgZW52TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFN0YW5kYXJkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFN0YW5kYXJkTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2Vcblx0dGhpcy5yb3VnaG5lc3MgPSAwLjU7XG5cdHRoaXMubWV0YWxuZXNzID0gMC41O1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcblxuXHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xuXHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBudWxsO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFN0YW5kYXJkTWF0ZXJpYWw7XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5yb3VnaG5lc3MgPSBzb3VyY2Uucm91Z2huZXNzO1xuXHR0aGlzLm1ldGFsbmVzcyA9IHNvdXJjZS5tZXRhbG5lc3M7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcblx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMucm91Z2huZXNzTWFwID0gc291cmNlLnJvdWdobmVzc01hcDtcblxuXHR0aGlzLm1ldGFsbmVzc01hcCA9IHNvdXJjZS5tZXRhbG5lc3NNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gc291cmNlLmVudk1hcEludGVuc2l0eTtcblxuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbmV4cG9ydCB7IE1lc2hTdGFuZGFyZE1hdGVyaWFsIH07XG4iLCJpbXBvcnQgeyBNZXNoU3RhbmRhcmRNYXRlcmlhbCB9IGZyb20gJy4vTWVzaFN0YW5kYXJkTWF0ZXJpYWwuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFBoeXNpY2FsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWVzaFN0YW5kYXJkTWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1BIWVNJQ0FMJzogJycgfTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFBoeXNpY2FsTWF0ZXJpYWwnO1xuXG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMC41OyAvLyBtYXBzIHRvIEYwID0gMC4wNFxuXG5cdHRoaXMuY2xlYXJDb2F0ID0gMC4wO1xuXHR0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyA9IDAuMDtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFBoeXNpY2FsTWF0ZXJpYWw7XG5cbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hQaHlzaWNhbE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdQSFlTSUNBTCc6ICcnIH07XG5cblx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xuXG5cdHRoaXMuY2xlYXJDb2F0ID0gc291cmNlLmNsZWFyQ29hdDtcblx0dGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgPSBzb3VyY2UuY2xlYXJDb2F0Um91Z2huZXNzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbmV4cG9ydCB7IE1lc2hQaHlzaWNhbE1hdGVyaWFsIH07XG4iLCJpbXBvcnQgeyBNdWx0aXBseU9wZXJhdGlvbiwgVGFuZ2VudFNwYWNlTm9ybWFsTWFwIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgc3BlY3VsYXI6IDxoZXg+LFxuICogIHNoaW5pbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbE1hcFR5cGU6IFRIUkVFLlRhbmdlbnRTcGFjZU5vcm1hbE1hcCxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFBob25nTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoUGhvbmdNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXHR0aGlzLnNwZWN1bGFyID0gbmV3IENvbG9yKCAweDExMTExMSApO1xuXHR0aGlzLnNoaW5pbmVzcyA9IDMwO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcblxuXHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xuXHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hQaG9uZ01hdGVyaWFsO1xuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGhvbmdNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5zcGVjdWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTtcblx0dGhpcy5zaGluaW5lc3MgPSBzb3VyY2Uuc2hpbmluZXNzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxNYXBUeXBlID0gc291cmNlLm5vcm1hbE1hcFR5cGU7XG5cdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbmV4cG9ydCB7IE1lc2hQaG9uZ01hdGVyaWFsIH07XG4iLCJpbXBvcnQgeyBNZXNoUGhvbmdNYXRlcmlhbCB9IGZyb20gJy4vTWVzaFBob25nTWF0ZXJpYWwuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgdGFrYWhpcm94IC8gaHR0cDovL2dpdGh1Yi5jb20vdGFrYWhpcm94XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBncmFkaWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKVxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hUb29uTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWVzaFBob25nTWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1RPT04nOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoVG9vbk1hdGVyaWFsJztcblxuXHR0aGlzLmdyYWRpZW50TWFwID0gbnVsbDtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hUb29uTWF0ZXJpYWw7XG5cbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFRvb25NYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmdyYWRpZW50TWFwID0gc291cmNlLmdyYWRpZW50TWFwO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbmV4cG9ydCB7IE1lc2hUb29uTWF0ZXJpYWwgfTtcbiIsImltcG9ydCB7IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxNYXBUeXBlOiBUSFJFRS5UYW5nZW50U3BhY2VOb3JtYWxNYXAsXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PlxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaE5vcm1hbE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaE5vcm1hbE1hdGVyaWFsJztcblxuXHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xuXHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hOb3JtYWxNYXRlcmlhbDtcblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hOb3JtYWxNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcblx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbmV4cG9ydCB7IE1lc2hOb3JtYWxNYXRlcmlhbCB9O1xuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcbmltcG9ydCB7IE11bHRpcGx5T3BlcmF0aW9uIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaExhbWJlcnRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTGFtYmVydE1hdGVyaWFsO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5leHBvcnQgeyBNZXNoTGFtYmVydE1hdGVyaWFsIH07XG4iLCIvKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBzY2FsZTogPGZsb2F0PixcbiAqICBkYXNoU2l6ZTogPGZsb2F0PixcbiAqICBnYXBTaXplOiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcblxuZnVuY3Rpb24gTGluZURhc2hlZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdExpbmVCYXNpY01hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZURhc2hlZE1hdGVyaWFsJztcblxuXHR0aGlzLnNjYWxlID0gMTtcblx0dGhpcy5kYXNoU2l6ZSA9IDM7XG5cdHRoaXMuZ2FwU2l6ZSA9IDE7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5MaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlICk7XG5MaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZURhc2hlZE1hdGVyaWFsO1xuXG5MaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZURhc2hlZE1hdGVyaWFsID0gdHJ1ZTtcblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5zY2FsZSA9IHNvdXJjZS5zY2FsZTtcblx0dGhpcy5kYXNoU2l6ZSA9IHNvdXJjZS5kYXNoU2l6ZTtcblx0dGhpcy5nYXBTaXplID0gc291cmNlLmdhcFNpemU7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuZXhwb3J0IHsgTGluZURhc2hlZE1hdGVyaWFsIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIENhY2hlID0ge1xuXG5cdGVuYWJsZWQ6IGZhbHNlLFxuXG5cdGZpbGVzOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICgga2V5LCBmaWxlICkge1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdBZGRpbmcga2V5OicsIGtleSApO1xuXG5cdFx0dGhpcy5maWxlc1sga2V5IF0gPSBmaWxlO1xuXG5cdH0sXG5cblx0Z2V0OiBmdW5jdGlvbiAoIGtleSApIHtcblxuXHRcdGlmICggdGhpcy5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQ2FjaGUnLCAnQ2hlY2tpbmcga2V5OicsIGtleSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsZXNbIGtleSBdO1xuXG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiAoIGtleSApIHtcblxuXHRcdGRlbGV0ZSB0aGlzLmZpbGVzWyBrZXkgXTtcblxuXHR9LFxuXG5cdGNsZWFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmZpbGVzID0ge307XG5cblx0fVxuXG59O1xuXG5cbmV4cG9ydCB7IENhY2hlIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTG9hZGluZ01hbmFnZXIoIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHZhciBpc0xvYWRpbmcgPSBmYWxzZTtcblx0dmFyIGl0ZW1zTG9hZGVkID0gMDtcblx0dmFyIGl0ZW1zVG90YWwgPSAwO1xuXHR2YXIgdXJsTW9kaWZpZXIgPSB1bmRlZmluZWQ7XG5cblx0dGhpcy5vblN0YXJ0ID0gdW5kZWZpbmVkO1xuXHR0aGlzLm9uTG9hZCA9IG9uTG9hZDtcblx0dGhpcy5vblByb2dyZXNzID0gb25Qcm9ncmVzcztcblx0dGhpcy5vbkVycm9yID0gb25FcnJvcjtcblxuXHR0aGlzLml0ZW1TdGFydCA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aXRlbXNUb3RhbCArKztcblxuXHRcdGlmICggaXNMb2FkaW5nID09PSBmYWxzZSApIHtcblxuXHRcdFx0aWYgKCBzY29wZS5vblN0YXJ0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUub25TdGFydCggdXJsLCBpdGVtc0xvYWRlZCwgaXRlbXNUb3RhbCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpc0xvYWRpbmcgPSB0cnVlO1xuXG5cdH07XG5cblx0dGhpcy5pdGVtRW5kID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpdGVtc0xvYWRlZCArKztcblxuXHRcdGlmICggc2NvcGUub25Qcm9ncmVzcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5vblByb2dyZXNzKCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGl0ZW1zTG9hZGVkID09PSBpdGVtc1RvdGFsICkge1xuXG5cdFx0XHRpc0xvYWRpbmcgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBzY29wZS5vbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5vbkxvYWQoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5pdGVtRXJyb3IgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGlmICggc2NvcGUub25FcnJvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5vbkVycm9yKCB1cmwgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMucmVzb2x2ZVVSTCA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aWYgKCB1cmxNb2RpZmllciApIHtcblxuXHRcdFx0cmV0dXJuIHVybE1vZGlmaWVyKCB1cmwgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB1cmw7XG5cblx0fTtcblxuXHR0aGlzLnNldFVSTE1vZGlmaWVyID0gZnVuY3Rpb24gKCB0cmFuc2Zvcm0gKSB7XG5cblx0XHR1cmxNb2RpZmllciA9IHRyYW5zZm9ybTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9O1xuXG59XG5cbnZhciBEZWZhdWx0TG9hZGluZ01hbmFnZXIgPSBuZXcgTG9hZGluZ01hbmFnZXIoKTtcblxuXG5leHBvcnQgeyBEZWZhdWx0TG9hZGluZ01hbmFnZXIsIExvYWRpbmdNYW5hZ2VyIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgQ2FjaGUgfSBmcm9tICcuL0NhY2hlLmpzJztcbmltcG9ydCB7IERlZmF1bHRMb2FkaW5nTWFuYWdlciB9IGZyb20gJy4vTG9hZGluZ01hbmFnZXIuanMnO1xuXG52YXIgbG9hZGluZyA9IHt9O1xuXG5mdW5jdGlvbiBGaWxlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZpbGVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgaWYgcmVxdWVzdCBpcyBkdXBsaWNhdGVcblxuXHRcdGlmICggbG9hZGluZ1sgdXJsIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bG9hZGluZ1sgdXJsIF0ucHVzaCgge1xuXG5cdFx0XHRcdG9uTG9hZDogb25Mb2FkLFxuXHRcdFx0XHRvblByb2dyZXNzOiBvblByb2dyZXNzLFxuXHRcdFx0XHRvbkVycm9yOiBvbkVycm9yXG5cblx0XHRcdH0gKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIGRhdGE6IFVSSVxuXHRcdHZhciBkYXRhVXJpUmVnZXggPSAvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLztcblx0XHR2YXIgZGF0YVVyaVJlZ2V4UmVzdWx0ID0gdXJsLm1hdGNoKCBkYXRhVXJpUmVnZXggKTtcblxuXHRcdC8vIFNhZmFyaSBjYW4gbm90IGhhbmRsZSBEYXRhIFVSSXMgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdCBzbyBwcm9jZXNzIG1hbnVhbGx5XG5cdFx0aWYgKCBkYXRhVXJpUmVnZXhSZXN1bHQgKSB7XG5cblx0XHRcdHZhciBtaW1lVHlwZSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMSBdO1xuXHRcdFx0dmFyIGlzQmFzZTY0ID0gISEgZGF0YVVyaVJlZ2V4UmVzdWx0WyAyIF07XG5cdFx0XHR2YXIgZGF0YSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMyBdO1xuXG5cdFx0XHRkYXRhID0gd2luZG93LmRlY29kZVVSSUNvbXBvbmVudCggZGF0YSApO1xuXG5cdFx0XHRpZiAoIGlzQmFzZTY0ICkgZGF0YSA9IHdpbmRvdy5hdG9iKCBkYXRhICk7XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0dmFyIHJlc3BvbnNlO1xuXHRcdFx0XHR2YXIgcmVzcG9uc2VUeXBlID0gKCB0aGlzLnJlc3BvbnNlVHlwZSB8fCAnJyApLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0c3dpdGNoICggcmVzcG9uc2VUeXBlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnYXJyYXlidWZmZXInOlxuXHRcdFx0XHRcdGNhc2UgJ2Jsb2InOlxuXG5cdFx0XHRcdFx0XHR2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KCBkYXRhLmxlbmd0aCApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2aWV3WyBpIF0gPSBkYXRhLmNoYXJDb2RlQXQoIGkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoIHJlc3BvbnNlVHlwZSA9PT0gJ2Jsb2InICkge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gbmV3IEJsb2IoIFsgdmlldy5idWZmZXIgXSwgeyB0eXBlOiBtaW1lVHlwZSB9ICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSB2aWV3LmJ1ZmZlcjtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2RvY3VtZW50JzpcblxuXHRcdFx0XHRcdFx0dmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgbWltZVR5cGUgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdqc29uJzpcblxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBKU09OLnBhcnNlKCBkYXRhICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDogLy8gJ3RleHQnIG9yIG90aGVyXG5cblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gZGF0YTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdhaXQgZm9yIG5leHQgYnJvd3NlciB0aWNrIGxpa2Ugc3RhbmRhcmQgWE1MSHR0cFJlcXVlc3QgZXZlbnQgZGlzcGF0Y2hpbmcgZG9lc1xuXHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0sIDAgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRcdC8vIFdhaXQgZm9yIG5leHQgYnJvd3NlciB0aWNrIGxpa2Ugc3RhbmRhcmQgWE1MSHR0cFJlcXVlc3QgZXZlbnQgZGlzcGF0Y2hpbmcgZG9lc1xuXHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXJyb3IgKTtcblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHRcdH0sIDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSW5pdGlhbGlzZSBhcnJheSBmb3IgZHVwbGljYXRlIHJlcXVlc3RzXG5cblx0XHRcdGxvYWRpbmdbIHVybCBdID0gW107XG5cblx0XHRcdGxvYWRpbmdbIHVybCBdLnB1c2goIHtcblxuXHRcdFx0XHRvbkxvYWQ6IG9uTG9hZCxcblx0XHRcdFx0b25Qcm9ncmVzczogb25Qcm9ncmVzcyxcblx0XHRcdFx0b25FcnJvcjogb25FcnJvclxuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cblx0XHRcdHJlcXVlc3Qub3BlbiggJ0dFVCcsIHVybCwgdHJ1ZSApO1xuXG5cdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHR2YXIgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlO1xuXG5cdFx0XHRcdENhY2hlLmFkZCggdXJsLCByZXNwb25zZSApO1xuXG5cdFx0XHRcdHZhciBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRkZWxldGUgbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0aWYgKCB0aGlzLnN0YXR1cyA9PT0gMjAwIHx8IHRoaXMuc3RhdHVzID09PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8gU29tZSBicm93c2VycyByZXR1cm4gSFRUUCBTdGF0dXMgMCB3aGVuIHVzaW5nIG5vbi1odHRwIHByb3RvY29sXG5cdFx0XHRcdFx0Ly8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy5cblxuXHRcdFx0XHRcdGlmICggdGhpcy5zdGF0dXMgPT09IDAgKSBjb25zb2xlLndhcm4oICdUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLicgKTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkxvYWQgKSBjYWxsYmFjay5vbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25FcnJvciApIGNhbGxiYWNrLm9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ3Byb2dyZXNzJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25Qcm9ncmVzcyApIGNhbGxiYWNrLm9uUHJvZ3Jlc3MoIGV2ZW50ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0dmFyIGNhbGxiYWNrcyA9IGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGRlbGV0ZSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkVycm9yICkgY2FsbGJhY2sub25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHRpZiAoIHRoaXMucmVzcG9uc2VUeXBlICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IHRoaXMucmVzcG9uc2VUeXBlO1xuXHRcdFx0aWYgKCB0aGlzLndpdGhDcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkICkgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLndpdGhDcmVkZW50aWFscztcblxuXHRcdFx0aWYgKCByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUgKSByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUoIHRoaXMubWltZVR5cGUgIT09IHVuZGVmaW5lZCA/IHRoaXMubWltZVR5cGUgOiAndGV4dC9wbGFpbicgKTtcblxuXHRcdFx0Zm9yICggdmFyIGhlYWRlciBpbiB0aGlzLnJlcXVlc3RIZWFkZXIgKSB7XG5cblx0XHRcdFx0cmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCBoZWFkZXIsIHRoaXMucmVxdWVzdEhlYWRlclsgaGVhZGVyIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0LnNlbmQoIG51bGwgKTtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdHJldHVybiByZXF1ZXN0O1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UmVzcG9uc2VUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5yZXNwb25zZVR5cGUgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFdpdGhDcmVkZW50aWFsczogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMud2l0aENyZWRlbnRpYWxzID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRNaW1lVHlwZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMubWltZVR5cGUgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnJlcXVlc3RIZWFkZXIgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBGaWxlTG9hZGVyIH07XG4iLCJpbXBvcnQgeyBMaW5lYXJGaWx0ZXIgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vRmlsZUxvYWRlci5qcyc7XG5pbXBvcnQgeyBDb21wcmVzc2VkVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0NvbXByZXNzZWRUZXh0dXJlLmpzJztcbmltcG9ydCB7IERlZmF1bHRMb2FkaW5nTWFuYWdlciB9IGZyb20gJy4vTG9hZGluZ01hbmFnZXIuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBibG9jayBiYXNlZCB0ZXh0dXJlcyBsb2FkZXIgKGRkcywgcHZyLCAuLi4pXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cblx0Ly8gb3ZlcnJpZGUgaW4gc3ViIGNsYXNzZXNcblx0dGhpcy5fcGFyc2VyID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBpbWFnZXMgPSBbXTtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7XG5cdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsWyBpIF0sIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGltYWdlc1sgaSBdID0ge1xuXHRcdFx0XHRcdHdpZHRoOiB0ZXhEYXRhcy53aWR0aCxcblx0XHRcdFx0XHRoZWlnaHQ6IHRleERhdGFzLmhlaWdodCxcblx0XHRcdFx0XHRmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCxcblx0XHRcdFx0XHRtaXBtYXBzOiB0ZXhEYXRhcy5taXBtYXBzXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0bG9hZGVkICs9IDE7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxIClcblx0XHRcdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcblxuXHRcdFx0dmFyIGxvYWRlZCA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB1cmwubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVkIGluIGEgc2luZ2xlIEREUyBmaWxlXG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMuaXNDdWJlbWFwICkge1xuXG5cdFx0XHRcdFx0dmFyIGZhY2VzID0gdGV4RGF0YXMubWlwbWFwcy5sZW5ndGggLyB0ZXhEYXRhcy5taXBtYXBDb3VudDtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBmID0gMDsgZiA8IGZhY2VzOyBmICsrICkge1xuXG5cdFx0XHRcdFx0XHRpbWFnZXNbIGYgXSA9IHsgbWlwbWFwczogW10gfTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGV4RGF0YXMubWlwbWFwQ291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0ubWlwbWFwcy5wdXNoKCB0ZXhEYXRhcy5taXBtYXBzWyBmICogdGV4RGF0YXMubWlwbWFwQ291bnQgKyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0uZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xuXHRcdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IENvbXByZXNzZWRUZXh0dXJlTG9hZGVyIH07XG4iLCJpbXBvcnQgeyBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcE1hcExpbmVhckZpbHRlciwgQ2xhbXBUb0VkZ2VXcmFwcGluZyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9GaWxlTG9hZGVyLmpzJztcbmltcG9ydCB7IERhdGFUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvRGF0YVRleHR1cmUuanMnO1xuaW1wb3J0IHsgRGVmYXVsdExvYWRpbmdNYW5hZ2VyIH0gZnJvbSAnLi9Mb2FkaW5nTWFuYWdlci5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBOaWtvcyBNLiAvIGh0dHBzOi8vZ2l0aHViLmNvbS9mb28xMjMvXG4gKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBsb2FkIGdlbmVyaWMgYmluYXJ5IHRleHR1cmVzIGZvcm1hdHMgKHJnYmUsIGhkciwgLi4uKVxuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG5cdC8vIG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzXG5cdHRoaXMuX3BhcnNlciA9IG51bGw7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRGF0YVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgdGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSgpO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XG5cblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIHRleERhdGEgPSBzY29wZS5fcGFyc2VyKCBidWZmZXIgKTtcblxuXHRcdFx0aWYgKCAhIHRleERhdGEgKSByZXR1cm47XG5cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmltYWdlICkge1xuXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UgPSB0ZXhEYXRhLmltYWdlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEuZGF0YSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YS53aWR0aDtcblx0XHRcdFx0dGV4dHVyZS5pbWFnZS5oZWlnaHQgPSB0ZXhEYXRhLmhlaWdodDtcblx0XHRcdFx0dGV4dHVyZS5pbWFnZS5kYXRhID0gdGV4RGF0YS5kYXRhO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmUud3JhcFMgPSB1bmRlZmluZWQgIT09IHRleERhdGEud3JhcFMgPyB0ZXhEYXRhLndyYXBTIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblx0XHRcdHRleHR1cmUud3JhcFQgPSB1bmRlZmluZWQgIT09IHRleERhdGEud3JhcFQgPyB0ZXhEYXRhLndyYXBUIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblxuXHRcdFx0dGV4dHVyZS5tYWdGaWx0ZXIgPSB1bmRlZmluZWQgIT09IHRleERhdGEubWFnRmlsdGVyID8gdGV4RGF0YS5tYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5taW5GaWx0ZXIgPyB0ZXhEYXRhLm1pbkZpbHRlciA6IExpbmVhck1pcE1hcExpbmVhckZpbHRlcjtcblxuXHRcdFx0dGV4dHVyZS5hbmlzb3Ryb3B5ID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmFuaXNvdHJvcHkgPyB0ZXhEYXRhLmFuaXNvdHJvcHkgOiAxO1xuXG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5mb3JtYXQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhLmZvcm1hdDtcblxuXHRcdFx0fVxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEudHlwZSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSB0ZXhEYXRhLnR5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEubWlwbWFwcyApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLm1pcG1hcHMgPSB0ZXhEYXRhLm1pcG1hcHM7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCAxID09PSB0ZXhEYXRhLm1pcG1hcENvdW50ICkge1xuXG5cdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSwgdGV4RGF0YSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBEYXRhVGV4dHVyZUxvYWRlciB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmltcG9ydCB7IENhY2hlIH0gZnJvbSAnLi9DYWNoZS5qcyc7XG5pbXBvcnQgeyBEZWZhdWx0TG9hZGluZ01hbmFnZXIgfSBmcm9tICcuL0xvYWRpbmdNYW5hZ2VyLmpzJztcblxuXG5mdW5jdGlvbiBJbWFnZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBJbWFnZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRjcm9zc09yaWdpbjogJ2Fub255bW91cycsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdpbWcnICk7XG5cblx0XHRmdW5jdGlvbiBvbkltYWdlTG9hZCgpIHtcblxuXHRcdFx0aW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBvbkltYWdlTG9hZCwgZmFsc2UgKTtcblx0XHRcdGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlcnJvcicsIG9uSW1hZ2VFcnJvciwgZmFsc2UgKTtcblxuXHRcdFx0Q2FjaGUuYWRkKCB1cmwsIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIG9uSW1hZ2VFcnJvciggZXZlbnQgKSB7XG5cblx0XHRcdGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdsb2FkJywgb25JbWFnZUxvYWQsIGZhbHNlICk7XG5cdFx0XHRpbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZXJyb3InLCBvbkltYWdlRXJyb3IsIGZhbHNlICk7XG5cblx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHR9XG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIG9uSW1hZ2VMb2FkLCBmYWxzZSApO1xuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIG9uSW1hZ2VFcnJvciwgZmFsc2UgKTtcblxuXHRcdGlmICggdXJsLnN1YnN0ciggMCwgNSApICE9PSAnZGF0YTonICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuY3Jvc3NPcmlnaW4gIT09IHVuZGVmaW5lZCApIGltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdGltYWdlLnNyYyA9IHVybDtcblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IEltYWdlTG9hZGVyIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgSW1hZ2VMb2FkZXIgfSBmcm9tICcuL0ltYWdlTG9hZGVyLmpzJztcbmltcG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMnO1xuaW1wb3J0IHsgRGVmYXVsdExvYWRpbmdNYW5hZ2VyIH0gZnJvbSAnLi9Mb2FkaW5nTWFuYWdlci5qcyc7XG5cblxuZnVuY3Rpb24gQ3ViZVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3ViZVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0Y3Jvc3NPcmlnaW46ICdhbm9ueW1vdXMnLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJscywgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblxuXHRcdHZhciBsb2FkZWQgPSAwO1xuXG5cdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7XG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmxzWyBpIF0sIGZ1bmN0aW9uICggaW1hZ2UgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZXNbIGkgXSA9IGltYWdlO1xuXG5cdFx0XHRcdGxvYWRlZCArKztcblxuXHRcdFx0XHRpZiAoIGxvYWRlZCA9PT0gNiApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGxvYWRUZXh0dXJlKCBpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IEN1YmVUZXh0dXJlTG9hZGVyIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgUkdCQUZvcm1hdCwgUkdCRm9ybWF0IH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IEltYWdlTG9hZGVyIH0gZnJvbSAnLi9JbWFnZUxvYWRlci5qcyc7XG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvVGV4dHVyZS5qcyc7XG5pbXBvcnQgeyBEZWZhdWx0TG9hZGluZ01hbmFnZXIgfSBmcm9tICcuL0xvYWRpbmdNYW5hZ2VyLmpzJztcblxuXG5mdW5jdGlvbiBUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0Y3Jvc3NPcmlnaW46ICdhbm9ueW1vdXMnLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGltYWdlICkge1xuXG5cdFx0XHR0ZXh0dXJlLmltYWdlID0gaW1hZ2U7XG5cblx0XHRcdC8vIEpQRUdzIGNhbid0IGhhdmUgYW4gYWxwaGEgY2hhbm5lbCwgc28gbWVtb3J5IGNhbiBiZSBzYXZlZCBieSBzdG9yaW5nIHRoZW0gYXMgUkdCLlxuXHRcdFx0dmFyIGlzSlBFRyA9IHVybC5zZWFyY2goIC9cXC4oanBnfGpwZWcpJC8gKSA+IDAgfHwgdXJsLnNlYXJjaCggL15kYXRhXFw6aW1hZ2VcXC9qcGVnLyApID09PSAwO1xuXG5cdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IGlzSlBFRyA/IFJHQkZvcm1hdCA6IFJHQkFGb3JtYXQ7XG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBUZXh0dXJlTG9hZGVyIH07XG4iLCJpbXBvcnQgeyBfTWF0aCB9IGZyb20gJy4uLy4uL21hdGgvTWF0aC5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEV4dGVuc2libGUgY3VydmUgb2JqZWN0XG4gKlxuICogU29tZSBjb21tb24gb2YgY3VydmUgbWV0aG9kczpcbiAqIC5nZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgKSwgLmdldFRhbmdlbnQoIHQgKVxuICogLmdldFBvaW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICksIC5nZXRUYW5nZW50QXQoIHUgKVxuICogLmdldFBvaW50cygpLCAuZ2V0U3BhY2VkUG9pbnRzKClcbiAqIC5nZXRMZW5ndGgoKVxuICogLnVwZGF0ZUFyY0xlbmd0aHMoKVxuICpcbiAqIFRoaXMgZm9sbG93aW5nIGN1cnZlcyBpbmhlcml0IGZyb20gVEhSRUUuQ3VydmU6XG4gKlxuICogLS0gMkQgY3VydmVzIC0tXG4gKiBUSFJFRS5BcmNDdXJ2ZVxuICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZVxuICogVEhSRUUuRWxsaXBzZUN1cnZlXG4gKiBUSFJFRS5MaW5lQ3VydmVcbiAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlXG4gKiBUSFJFRS5TcGxpbmVDdXJ2ZVxuICpcbiAqIC0tIDNEIGN1cnZlcyAtLVxuICogVEhSRUUuQ2F0bXVsbFJvbUN1cnZlM1xuICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZTNcbiAqIFRIUkVFLkxpbmVDdXJ2ZTNcbiAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlM1xuICpcbiAqIEEgc2VyaWVzIG9mIGN1cnZlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBUSFJFRS5DdXJ2ZVBhdGguXG4gKlxuICoqL1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXHRBYnN0cmFjdCBDdXJ2ZSBiYXNlIGNsYXNzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmZ1bmN0aW9uIEN1cnZlKCkge1xuXG5cdHRoaXMudHlwZSA9ICdDdXJ2ZSc7XG5cblx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSAyMDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3VydmUucHJvdG90eXBlLCB7XG5cblx0Ly8gVmlydHVhbCBiYXNlIGNsYXNzIG1ldGhvZCB0byBvdmVyd3JpdGUgYW5kIGltcGxlbWVudCBpbiBzdWJjbGFzc2VzXG5cdC8vXHQtIHQgWzAgLi4gMV1cblxuXHRnZXRQb2ludDogZnVuY3Rpb24gKCAvKiB0LCBvcHRpb25hbFRhcmdldCAqLyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuJyApO1xuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHBvaW50IGF0IHJlbGF0aXZlIHBvc2l0aW9uIGluIGN1cnZlIGFjY29yZGluZyB0byBhcmMgbGVuZ3RoXG5cdC8vIC0gdSBbMCAuLiAxXVxuXG5cdGdldFBvaW50QXQ6IGZ1bmN0aW9uICggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnQoIHQgKVxuXG5cdGdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNTtcblxuXHRcdHZhciBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBkIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwb2ludHM7XG5cblx0fSxcblxuXHQvLyBHZXQgc2VxdWVuY2Ugb2YgcG9pbnRzIHVzaW5nIGdldFBvaW50QXQoIHUgKVxuXG5cdGdldFNwYWNlZFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNTtcblxuXHRcdHZhciBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50QXQoIGQgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdC8vIEdldCB0b3RhbCBjdXJ2ZSBhcmMgbGVuZ3RoXG5cblx0Z2V0TGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpO1xuXHRcdHJldHVybiBsZW5ndGhzWyBsZW5ndGhzLmxlbmd0aCAtIDEgXTtcblxuXHR9LFxuXG5cdC8vIEdldCBsaXN0IG9mIGN1bXVsYXRpdmUgc2VnbWVudCBsZW5ndGhzXG5cblx0Z2V0TGVuZ3RoczogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0XHRpZiAoIHRoaXMuY2FjaGVBcmNMZW5ndGhzICYmXG5cdFx0XHQoIHRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aCA9PT0gZGl2aXNpb25zICsgMSApICYmXG5cdFx0XHQhIHRoaXMubmVlZHNVcGRhdGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3RocztcblxuXHRcdH1cblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdHZhciBjYWNoZSA9IFtdO1xuXHRcdHZhciBjdXJyZW50LCBsYXN0ID0gdGhpcy5nZXRQb2ludCggMCApO1xuXHRcdHZhciBwLCBzdW0gPSAwO1xuXG5cdFx0Y2FjaGUucHVzaCggMCApO1xuXG5cdFx0Zm9yICggcCA9IDE7IHAgPD0gZGl2aXNpb25zOyBwICsrICkge1xuXG5cdFx0XHRjdXJyZW50ID0gdGhpcy5nZXRQb2ludCggcCAvIGRpdmlzaW9ucyApO1xuXHRcdFx0c3VtICs9IGN1cnJlbnQuZGlzdGFuY2VUbyggbGFzdCApO1xuXHRcdFx0Y2FjaGUucHVzaCggc3VtICk7XG5cdFx0XHRsYXN0ID0gY3VycmVudDtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2FjaGVBcmNMZW5ndGhzID0gY2FjaGU7XG5cblx0XHRyZXR1cm4gY2FjaGU7IC8vIHsgc3VtczogY2FjaGUsIHN1bTogc3VtIH07IFN1bSBpcyBpbiB0aGUgbGFzdCBlbGVtZW50LlxuXG5cdH0sXG5cblx0dXBkYXRlQXJjTGVuZ3RoczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cdFx0dGhpcy5nZXRMZW5ndGhzKCk7XG5cblx0fSxcblxuXHQvLyBHaXZlbiB1ICggMCAuLiAxICksIGdldCBhIHQgdG8gZmluZCBwLiBUaGlzIGdpdmVzIHlvdSBwb2ludHMgd2hpY2ggYXJlIGVxdWlkaXN0YW50XG5cblx0Z2V0VXRvVG1hcHBpbmc6IGZ1bmN0aW9uICggdSwgZGlzdGFuY2UgKSB7XG5cblx0XHR2YXIgYXJjTGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpO1xuXG5cdFx0dmFyIGkgPSAwLCBpbCA9IGFyY0xlbmd0aHMubGVuZ3RoO1xuXG5cdFx0dmFyIHRhcmdldEFyY0xlbmd0aDsgLy8gVGhlIHRhcmdldGVkIHUgZGlzdGFuY2UgdmFsdWUgdG8gZ2V0XG5cblx0XHRpZiAoIGRpc3RhbmNlICkge1xuXG5cdFx0XHR0YXJnZXRBcmNMZW5ndGggPSBkaXN0YW5jZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IHUgKiBhcmNMZW5ndGhzWyBpbCAtIDEgXTtcblxuXHRcdH1cblxuXHRcdC8vIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBpbmRleCB3aXRoIGxhcmdlc3QgdmFsdWUgc21hbGxlciB0aGFuIHRhcmdldCB1IGRpc3RhbmNlXG5cblx0XHR2YXIgbG93ID0gMCwgaGlnaCA9IGlsIC0gMSwgY29tcGFyaXNvbjtcblxuXHRcdHdoaWxlICggbG93IDw9IGhpZ2ggKSB7XG5cblx0XHRcdGkgPSBNYXRoLmZsb29yKCBsb3cgKyAoIGhpZ2ggLSBsb3cgKSAvIDIgKTsgLy8gbGVzcyBsaWtlbHkgdG8gb3ZlcmZsb3csIHRob3VnaCBwcm9iYWJseSBub3QgaXNzdWUgaGVyZSwgSlMgZG9lc24ndCByZWFsbHkgaGF2ZSBpbnRlZ2VycywgYWxsIG51bWJlcnMgYXJlIGZsb2F0c1xuXG5cdFx0XHRjb21wYXJpc29uID0gYXJjTGVuZ3Roc1sgaSBdIC0gdGFyZ2V0QXJjTGVuZ3RoO1xuXG5cdFx0XHRpZiAoIGNvbXBhcmlzb24gPCAwICkge1xuXG5cdFx0XHRcdGxvdyA9IGkgKyAxO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21wYXJpc29uID4gMCApIHtcblxuXHRcdFx0XHRoaWdoID0gaSAtIDE7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aGlnaCA9IGk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdC8vIERPTkVcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aSA9IGhpZ2g7XG5cblx0XHRpZiAoIGFyY0xlbmd0aHNbIGkgXSA9PT0gdGFyZ2V0QXJjTGVuZ3RoICkge1xuXG5cdFx0XHRyZXR1cm4gaSAvICggaWwgLSAxICk7XG5cblx0XHR9XG5cblx0XHQvLyB3ZSBjb3VsZCBnZXQgZmluZXIgZ3JhaW4gYXQgbGVuZ3Rocywgb3IgdXNlIHNpbXBsZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHBvaW50c1xuXG5cdFx0dmFyIGxlbmd0aEJlZm9yZSA9IGFyY0xlbmd0aHNbIGkgXTtcblx0XHR2YXIgbGVuZ3RoQWZ0ZXIgPSBhcmNMZW5ndGhzWyBpICsgMSBdO1xuXG5cdFx0dmFyIHNlZ21lbnRMZW5ndGggPSBsZW5ndGhBZnRlciAtIGxlbmd0aEJlZm9yZTtcblxuXHRcdC8vIGRldGVybWluZSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiB0aGUgJ2JlZm9yZScgYW5kICdhZnRlcicgcG9pbnRzXG5cblx0XHR2YXIgc2VnbWVudEZyYWN0aW9uID0gKCB0YXJnZXRBcmNMZW5ndGggLSBsZW5ndGhCZWZvcmUgKSAvIHNlZ21lbnRMZW5ndGg7XG5cblx0XHQvLyBhZGQgdGhhdCBmcmFjdGlvbmFsIGFtb3VudCB0byB0XG5cblx0XHR2YXIgdCA9ICggaSArIHNlZ21lbnRGcmFjdGlvbiApIC8gKCBpbCAtIDEgKTtcblxuXHRcdHJldHVybiB0O1xuXG5cdH0sXG5cblx0Ly8gUmV0dXJucyBhIHVuaXQgdmVjdG9yIHRhbmdlbnQgYXQgdFxuXHQvLyBJbiBjYXNlIGFueSBzdWIgY3VydmUgZG9lcyBub3QgaW1wbGVtZW50IGl0cyB0YW5nZW50IGRlcml2YXRpb24sXG5cdC8vIDIgcG9pbnRzIGEgc21hbGwgZGVsdGEgYXBhcnQgd2lsbCBiZSB1c2VkIHRvIGZpbmQgaXRzIGdyYWRpZW50XG5cdC8vIHdoaWNoIHNlZW1zIHRvIGdpdmUgYSByZWFzb25hYmxlIGFwcHJveGltYXRpb25cblxuXHRnZXRUYW5nZW50OiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgZGVsdGEgPSAwLjAwMDE7XG5cdFx0dmFyIHQxID0gdCAtIGRlbHRhO1xuXHRcdHZhciB0MiA9IHQgKyBkZWx0YTtcblxuXHRcdC8vIENhcHBpbmcgaW4gY2FzZSBvZiBkYW5nZXJcblxuXHRcdGlmICggdDEgPCAwICkgdDEgPSAwO1xuXHRcdGlmICggdDIgPiAxICkgdDIgPSAxO1xuXG5cdFx0dmFyIHB0MSA9IHRoaXMuZ2V0UG9pbnQoIHQxICk7XG5cdFx0dmFyIHB0MiA9IHRoaXMuZ2V0UG9pbnQoIHQyICk7XG5cblx0XHR2YXIgdmVjID0gcHQyLmNsb25lKCkuc3ViKCBwdDEgKTtcblx0XHRyZXR1cm4gdmVjLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0Z2V0VGFuZ2VudEF0OiBmdW5jdGlvbiAoIHUgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRUYW5nZW50KCB0ICk7XG5cblx0fSxcblxuXHRjb21wdXRlRnJlbmV0RnJhbWVzOiBmdW5jdGlvbiAoIHNlZ21lbnRzLCBjbG9zZWQgKSB7XG5cblx0XHQvLyBzZWUgaHR0cDovL3d3dy5jcy5pbmRpYW5hLmVkdS9wdWIvdGVjaHJlcG9ydHMvVFI0MjUucGRmXG5cblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0YW5nZW50cyA9IFtdO1xuXHRcdHZhciBub3JtYWxzID0gW107XG5cdFx0dmFyIGJpbm9ybWFscyA9IFtdO1xuXG5cdFx0dmFyIHZlYyA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG1hdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHR2YXIgaSwgdSwgdGhldGE7XG5cblx0XHQvLyBjb21wdXRlIHRoZSB0YW5nZW50IHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmVcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHR1ID0gaSAvIHNlZ21lbnRzO1xuXG5cdFx0XHR0YW5nZW50c1sgaSBdID0gdGhpcy5nZXRUYW5nZW50QXQoIHUgKTtcblx0XHRcdHRhbmdlbnRzWyBpIF0ubm9ybWFsaXplKCk7XG5cblx0XHR9XG5cblx0XHQvLyBzZWxlY3QgYW4gaW5pdGlhbCBub3JtYWwgdmVjdG9yIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGZpcnN0IHRhbmdlbnQgdmVjdG9yLFxuXHRcdC8vIGFuZCBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtaW5pbXVtIHRhbmdlbnQgeHl6IGNvbXBvbmVudFxuXG5cdFx0bm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTtcblx0XHRiaW5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG5cdFx0dmFyIHR4ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueCApO1xuXHRcdHZhciB0eSA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnkgKTtcblx0XHR2YXIgdHogPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS56ICk7XG5cblx0XHRpZiAoIHR4IDw9IG1pbiApIHtcblxuXHRcdFx0bWluID0gdHg7XG5cdFx0XHRub3JtYWwuc2V0KCAxLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHR5IDw9IG1pbiApIHtcblxuXHRcdFx0bWluID0gdHk7XG5cdFx0XHRub3JtYWwuc2V0KCAwLCAxLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHR6IDw9IG1pbiApIHtcblxuXHRcdFx0bm9ybWFsLnNldCggMCwgMCwgMSApO1xuXG5cdFx0fVxuXG5cdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsICkubm9ybWFsaXplKCk7XG5cblx0XHRub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCB2ZWMgKTtcblx0XHRiaW5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIG5vcm1hbHNbIDAgXSApO1xuXG5cblx0XHQvLyBjb21wdXRlIHRoZSBzbG93bHktdmFyeWluZyBub3JtYWwgYW5kIGJpbm9ybWFsIHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmVcblxuXHRcdGZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRub3JtYWxzWyBpIF0gPSBub3JtYWxzWyBpIC0gMSBdLmNsb25lKCk7XG5cblx0XHRcdGJpbm9ybWFsc1sgaSBdID0gYmlub3JtYWxzWyBpIC0gMSBdLmNsb25lKCk7XG5cblx0XHRcdHZlYy5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIC0gMSBdLCB0YW5nZW50c1sgaSBdICk7XG5cblx0XHRcdGlmICggdmVjLmxlbmd0aCgpID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0dmVjLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdHRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGFuZ2VudHNbIGkgLSAxIF0uZG90KCB0YW5nZW50c1sgaSBdICksIC0gMSwgMSApICk7IC8vIGNsYW1wIGZvciBmbG9hdGluZyBwdCBlcnJvcnNcblxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdmVjLCB0aGV0YSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vIGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQsIHBvc3Rwcm9jZXNzIHRoZSB2ZWN0b3JzIHNvIHRoZSBmaXJzdCBhbmQgbGFzdCBub3JtYWwgdmVjdG9ycyBhcmUgdGhlIHNhbWVcblxuXHRcdGlmICggY2xvc2VkID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGV0YSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIG5vcm1hbHNbIDAgXS5kb3QoIG5vcm1hbHNbIHNlZ21lbnRzIF0gKSwgLSAxLCAxICkgKTtcblx0XHRcdHRoZXRhIC89IHNlZ21lbnRzO1xuXG5cdFx0XHRpZiAoIHRhbmdlbnRzWyAwIF0uZG90KCB2ZWMuY3Jvc3NWZWN0b3JzKCBub3JtYWxzWyAwIF0sIG5vcm1hbHNbIHNlZ21lbnRzIF0gKSApID4gMCApIHtcblxuXHRcdFx0XHR0aGV0YSA9IC0gdGhldGE7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Ly8gdHdpc3QgYSBsaXR0bGUuLi5cblx0XHRcdFx0bm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1ha2VSb3RhdGlvbkF4aXMoIHRhbmdlbnRzWyBpIF0sIHRoZXRhICogaSApICk7XG5cdFx0XHRcdGJpbm9ybWFsc1sgaSBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgXSwgbm9ybWFsc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YW5nZW50czogdGFuZ2VudHMsXG5cdFx0XHRub3JtYWxzOiBub3JtYWxzLFxuXHRcdFx0Ymlub3JtYWxzOiBiaW5vcm1hbHNcblx0XHR9O1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSBzb3VyY2UuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnQ3VydmUnLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdDdXJ2ZS50b0pTT04nXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGRhdGEuYXJjTGVuZ3RoRGl2aXNpb25zID0gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRmcm9tSlNPTjogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSBqc29uLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IEN1cnZlIH07XG4iLCJpbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL2NvcmUvQ3VydmUuanMnO1xuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XG5cblxuZnVuY3Rpb24gRWxsaXBzZUN1cnZlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0VsbGlwc2VDdXJ2ZSc7XG5cblx0dGhpcy5hWCA9IGFYIHx8IDA7XG5cdHRoaXMuYVkgPSBhWSB8fCAwO1xuXG5cdHRoaXMueFJhZGl1cyA9IHhSYWRpdXMgfHwgMTtcblx0dGhpcy55UmFkaXVzID0geVJhZGl1cyB8fCAxO1xuXG5cdHRoaXMuYVN0YXJ0QW5nbGUgPSBhU3RhcnRBbmdsZSB8fCAwO1xuXHR0aGlzLmFFbmRBbmdsZSA9IGFFbmRBbmdsZSB8fCAyICogTWF0aC5QSTtcblxuXHR0aGlzLmFDbG9ja3dpc2UgPSBhQ2xvY2t3aXNlIHx8IGZhbHNlO1xuXG5cdHRoaXMuYVJvdGF0aW9uID0gYVJvdGF0aW9uIHx8IDA7XG5cbn1cblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVsbGlwc2VDdXJ2ZTtcblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5pc0VsbGlwc2VDdXJ2ZSA9IHRydWU7XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cblx0dmFyIHR3b1BpID0gTWF0aC5QSSAqIDI7XG5cdHZhciBkZWx0YUFuZ2xlID0gdGhpcy5hRW5kQW5nbGUgLSB0aGlzLmFTdGFydEFuZ2xlO1xuXHR2YXIgc2FtZVBvaW50cyA9IE1hdGguYWJzKCBkZWx0YUFuZ2xlICkgPCBOdW1iZXIuRVBTSUxPTjtcblxuXHQvLyBlbnN1cmVzIHRoYXQgZGVsdGFBbmdsZSBpcyAwIC4uIDIgUElcblx0d2hpbGUgKCBkZWx0YUFuZ2xlIDwgMCApIGRlbHRhQW5nbGUgKz0gdHdvUGk7XG5cdHdoaWxlICggZGVsdGFBbmdsZSA+IHR3b1BpICkgZGVsdGFBbmdsZSAtPSB0d29QaTtcblxuXHRpZiAoIGRlbHRhQW5nbGUgPCBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdGlmICggc2FtZVBvaW50cyApIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gdHdvUGk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGlmICggdGhpcy5hQ2xvY2t3aXNlID09PSB0cnVlICYmICEgc2FtZVBvaW50cyApIHtcblxuXHRcdGlmICggZGVsdGFBbmdsZSA9PT0gdHdvUGkgKSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSAtIHR3b1BpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IGRlbHRhQW5nbGUgLSB0d29QaTtcblxuXHRcdH1cblxuXHR9XG5cblx0dmFyIGFuZ2xlID0gdGhpcy5hU3RhcnRBbmdsZSArIHQgKiBkZWx0YUFuZ2xlO1xuXHR2YXIgeCA9IHRoaXMuYVggKyB0aGlzLnhSYWRpdXMgKiBNYXRoLmNvcyggYW5nbGUgKTtcblx0dmFyIHkgPSB0aGlzLmFZICsgdGhpcy55UmFkaXVzICogTWF0aC5zaW4oIGFuZ2xlICk7XG5cblx0aWYgKCB0aGlzLmFSb3RhdGlvbiAhPT0gMCApIHtcblxuXHRcdHZhciBjb3MgPSBNYXRoLmNvcyggdGhpcy5hUm90YXRpb24gKTtcblx0XHR2YXIgc2luID0gTWF0aC5zaW4oIHRoaXMuYVJvdGF0aW9uICk7XG5cblx0XHR2YXIgdHggPSB4IC0gdGhpcy5hWDtcblx0XHR2YXIgdHkgPSB5IC0gdGhpcy5hWTtcblxuXHRcdC8vIFJvdGF0ZSB0aGUgcG9pbnQgYWJvdXQgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cblx0XHR4ID0gdHggKiBjb3MgLSB0eSAqIHNpbiArIHRoaXMuYVg7XG5cdFx0eSA9IHR4ICogc2luICsgdHkgKiBjb3MgKyB0aGlzLmFZO1xuXG5cdH1cblxuXHRyZXR1cm4gcG9pbnQuc2V0KCB4LCB5ICk7XG5cbn07XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuYVggPSBzb3VyY2UuYVg7XG5cdHRoaXMuYVkgPSBzb3VyY2UuYVk7XG5cblx0dGhpcy54UmFkaXVzID0gc291cmNlLnhSYWRpdXM7XG5cdHRoaXMueVJhZGl1cyA9IHNvdXJjZS55UmFkaXVzO1xuXG5cdHRoaXMuYVN0YXJ0QW5nbGUgPSBzb3VyY2UuYVN0YXJ0QW5nbGU7XG5cdHRoaXMuYUVuZEFuZ2xlID0gc291cmNlLmFFbmRBbmdsZTtcblxuXHR0aGlzLmFDbG9ja3dpc2UgPSBzb3VyY2UuYUNsb2Nrd2lzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IHNvdXJjZS5hUm90YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLmFYID0gdGhpcy5hWDtcblx0ZGF0YS5hWSA9IHRoaXMuYVk7XG5cblx0ZGF0YS54UmFkaXVzID0gdGhpcy54UmFkaXVzO1xuXHRkYXRhLnlSYWRpdXMgPSB0aGlzLnlSYWRpdXM7XG5cblx0ZGF0YS5hU3RhcnRBbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGU7XG5cdGRhdGEuYUVuZEFuZ2xlID0gdGhpcy5hRW5kQW5nbGU7XG5cblx0ZGF0YS5hQ2xvY2t3aXNlID0gdGhpcy5hQ2xvY2t3aXNlO1xuXG5cdGRhdGEuYVJvdGF0aW9uID0gdGhpcy5hUm90YXRpb247XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLmFYID0ganNvbi5hWDtcblx0dGhpcy5hWSA9IGpzb24uYVk7XG5cblx0dGhpcy54UmFkaXVzID0ganNvbi54UmFkaXVzO1xuXHR0aGlzLnlSYWRpdXMgPSBqc29uLnlSYWRpdXM7XG5cblx0dGhpcy5hU3RhcnRBbmdsZSA9IGpzb24uYVN0YXJ0QW5nbGU7XG5cdHRoaXMuYUVuZEFuZ2xlID0ganNvbi5hRW5kQW5nbGU7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0ganNvbi5hQ2xvY2t3aXNlO1xuXG5cdHRoaXMuYVJvdGF0aW9uID0ganNvbi5hUm90YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuZXhwb3J0IHsgRWxsaXBzZUN1cnZlIH07XG4iLCJpbXBvcnQgeyBFbGxpcHNlQ3VydmUgfSBmcm9tICcuL0VsbGlwc2VDdXJ2ZS5qcyc7XG5cblxuZnVuY3Rpb24gQXJjQ3VydmUoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRFbGxpcHNlQ3VydmUuY2FsbCggdGhpcywgYVgsIGFZLCBhUmFkaXVzLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0dGhpcy50eXBlID0gJ0FyY0N1cnZlJztcblxufVxuXG5BcmNDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFbGxpcHNlQ3VydmUucHJvdG90eXBlICk7XG5BcmNDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcmNDdXJ2ZTtcblxuQXJjQ3VydmUucHJvdG90eXBlLmlzQXJjQ3VydmUgPSB0cnVlO1xuXG5cbmV4cG9ydCB7IEFyY0N1cnZlIH07XG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKlxuICogQ2VudHJpcGV0YWwgQ2F0bXVsbFJvbSBDdXJ2ZSAtIHdoaWNoIGlzIHVzZWZ1bCBmb3IgYXZvaWRpbmdcbiAqIGN1c3BzIGFuZCBzZWxmLWludGVyc2VjdGlvbnMgaW4gbm9uLXVuaWZvcm0gY2F0bXVsbCByb20gY3VydmVzLlxuICogaHR0cDovL3d3dy5jZW15dWtzZWwuY29tL3Jlc2VhcmNoL2NhdG11bGxyb21fcGFyYW0vY2F0bXVsbHJvbS5wZGZcbiAqXG4gKiBjdXJ2ZS50eXBlIGFjY2VwdHMgY2VudHJpcGV0YWwoZGVmYXVsdCksIGNob3JkYWwgYW5kIGNhdG11bGxyb21cbiAqIGN1cnZlLnRlbnNpb24gaXMgdXNlZCBmb3IgY2F0bXVsbHJvbSB3aGljaCBkZWZhdWx0cyB0byAwLjVcbiAqL1xuXG5cbi8qXG5CYXNlZCBvbiBhbiBvcHRpbWl6ZWQgYysrIHNvbHV0aW9uIGluXG4gLSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzk0ODk3MzYvY2F0bXVsbC1yb20tY3VydmUtd2l0aC1uby1jdXNwcy1hbmQtbm8tc2VsZi1pbnRlcnNlY3Rpb25zL1xuIC0gaHR0cDovL2lkZW9uZS5jb20vTm9FYlZNXG5cblRoaXMgQ3ViaWNQb2x5IGNsYXNzIGNvdWxkIGJlIHVzZWQgZm9yIHJldXNpbmcgc29tZSB2YXJpYWJsZXMgYW5kIGNhbGN1bGF0aW9ucyxcbmJ1dCBmb3IgdGhyZWUuanMgY3VydmUgdXNlLCBpdCBjb3VsZCBiZSBwb3NzaWJsZSBpbmxpbmVkIGFuZCBmbGF0dGVuIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gY2FsbFxud2hpY2ggY2FuIGJlIHBsYWNlZCBpbiBDdXJ2ZVV0aWxzLlxuKi9cblxuZnVuY3Rpb24gQ3ViaWNQb2x5KCkge1xuXG5cdHZhciBjMCA9IDAsIGMxID0gMCwgYzIgPSAwLCBjMyA9IDA7XG5cblx0Lypcblx0ICogQ29tcHV0ZSBjb2VmZmljaWVudHMgZm9yIGEgY3ViaWMgcG9seW5vbWlhbFxuXHQgKiAgIHAocykgPSBjMCArIGMxKnMgKyBjMipzXjIgKyBjMypzXjNcblx0ICogc3VjaCB0aGF0XG5cdCAqICAgcCgwKSA9IHgwLCBwKDEpID0geDFcblx0ICogIGFuZFxuXHQgKiAgIHAnKDApID0gdDAsIHAnKDEpID0gdDEuXG5cdCAqL1xuXHRmdW5jdGlvbiBpbml0KCB4MCwgeDEsIHQwLCB0MSApIHtcblxuXHRcdGMwID0geDA7XG5cdFx0YzEgPSB0MDtcblx0XHRjMiA9IC0gMyAqIHgwICsgMyAqIHgxIC0gMiAqIHQwIC0gdDE7XG5cdFx0YzMgPSAyICogeDAgLSAyICogeDEgKyB0MCArIHQxO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0aW5pdENhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIHRlbnNpb24gKSB7XG5cblx0XHRcdGluaXQoIHgxLCB4MiwgdGVuc2lvbiAqICggeDIgLSB4MCApLCB0ZW5zaW9uICogKCB4MyAtIHgxICkgKTtcblxuXHRcdH0sXG5cblx0XHRpbml0Tm9udW5pZm9ybUNhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIGR0MCwgZHQxLCBkdDIgKSB7XG5cblx0XHRcdC8vIGNvbXB1dGUgdGFuZ2VudHMgd2hlbiBwYXJhbWV0ZXJpemVkIGluIFt0MSx0Ml1cblx0XHRcdHZhciB0MSA9ICggeDEgLSB4MCApIC8gZHQwIC0gKCB4MiAtIHgwICkgLyAoIGR0MCArIGR0MSApICsgKCB4MiAtIHgxICkgLyBkdDE7XG5cdFx0XHR2YXIgdDIgPSAoIHgyIC0geDEgKSAvIGR0MSAtICggeDMgLSB4MSApIC8gKCBkdDEgKyBkdDIgKSArICggeDMgLSB4MiApIC8gZHQyO1xuXG5cdFx0XHQvLyByZXNjYWxlIHRhbmdlbnRzIGZvciBwYXJhbWV0cml6YXRpb24gaW4gWzAsMV1cblx0XHRcdHQxICo9IGR0MTtcblx0XHRcdHQyICo9IGR0MTtcblxuXHRcdFx0aW5pdCggeDEsIHgyLCB0MSwgdDIgKTtcblxuXHRcdH0sXG5cblx0XHRjYWxjOiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHRcdHZhciB0MiA9IHQgKiB0O1xuXHRcdFx0dmFyIHQzID0gdDIgKiB0O1xuXHRcdFx0cmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0MiArIGMzICogdDM7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vL1xuXG52YXIgdG1wID0gbmV3IFZlY3RvcjMoKTtcbnZhciBweCA9IG5ldyBDdWJpY1BvbHkoKSwgcHkgPSBuZXcgQ3ViaWNQb2x5KCksIHB6ID0gbmV3IEN1YmljUG9seSgpO1xuXG5mdW5jdGlvbiBDYXRtdWxsUm9tQ3VydmUzKCBwb2ludHMsIGNsb3NlZCwgY3VydmVUeXBlLCB0ZW5zaW9uICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2F0bXVsbFJvbUN1cnZlMyc7XG5cblx0dGhpcy5wb2ludHMgPSBwb2ludHMgfHwgW107XG5cdHRoaXMuY2xvc2VkID0gY2xvc2VkIHx8IGZhbHNlO1xuXHR0aGlzLmN1cnZlVHlwZSA9IGN1cnZlVHlwZSB8fCAnY2VudHJpcGV0YWwnO1xuXHR0aGlzLnRlbnNpb24gPSB0ZW5zaW9uIHx8IDAuNTtcblxufVxuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYXRtdWxsUm9tQ3VydmUzO1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5pc0NhdG11bGxSb21DdXJ2ZTMgPSB0cnVlO1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG5cdHZhciBsID0gcG9pbnRzLmxlbmd0aDtcblxuXHR2YXIgcCA9ICggbCAtICggdGhpcy5jbG9zZWQgPyAwIDogMSApICkgKiB0O1xuXHR2YXIgaW50UG9pbnQgPSBNYXRoLmZsb29yKCBwICk7XG5cdHZhciB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7XG5cblx0aWYgKCB0aGlzLmNsb3NlZCApIHtcblxuXHRcdGludFBvaW50ICs9IGludFBvaW50ID4gMCA/IDAgOiAoIE1hdGguZmxvb3IoIE1hdGguYWJzKCBpbnRQb2ludCApIC8gbCApICsgMSApICogbDtcblxuXHR9IGVsc2UgaWYgKCB3ZWlnaHQgPT09IDAgJiYgaW50UG9pbnQgPT09IGwgLSAxICkge1xuXG5cdFx0aW50UG9pbnQgPSBsIC0gMjtcblx0XHR3ZWlnaHQgPSAxO1xuXG5cdH1cblxuXHR2YXIgcDAsIHAxLCBwMiwgcDM7IC8vIDQgcG9pbnRzXG5cblx0aWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCA+IDAgKSB7XG5cblx0XHRwMCA9IHBvaW50c1sgKCBpbnRQb2ludCAtIDEgKSAlIGwgXTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gZXh0cmFwb2xhdGUgZmlyc3QgcG9pbnRcblx0XHR0bXAuc3ViVmVjdG9ycyggcG9pbnRzWyAwIF0sIHBvaW50c1sgMSBdICkuYWRkKCBwb2ludHNbIDAgXSApO1xuXHRcdHAwID0gdG1wO1xuXG5cdH1cblxuXHRwMSA9IHBvaW50c1sgaW50UG9pbnQgJSBsIF07XG5cdHAyID0gcG9pbnRzWyAoIGludFBvaW50ICsgMSApICUgbCBdO1xuXG5cdGlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgKyAyIDwgbCApIHtcblxuXHRcdHAzID0gcG9pbnRzWyAoIGludFBvaW50ICsgMiApICUgbCBdO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBleHRyYXBvbGF0ZSBsYXN0IHBvaW50XG5cdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgbCAtIDEgXSwgcG9pbnRzWyBsIC0gMiBdICkuYWRkKCBwb2ludHNbIGwgLSAxIF0gKTtcblx0XHRwMyA9IHRtcDtcblxuXHR9XG5cblx0aWYgKCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2NlbnRyaXBldGFsJyB8fCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2Nob3JkYWwnICkge1xuXG5cdFx0Ly8gaW5pdCBDZW50cmlwZXRhbCAvIENob3JkYWwgQ2F0bXVsbC1Sb21cblx0XHR2YXIgcG93ID0gdGhpcy5jdXJ2ZVR5cGUgPT09ICdjaG9yZGFsJyA/IDAuNSA6IDAuMjU7XG5cdFx0dmFyIGR0MCA9IE1hdGgucG93KCBwMC5kaXN0YW5jZVRvU3F1YXJlZCggcDEgKSwgcG93ICk7XG5cdFx0dmFyIGR0MSA9IE1hdGgucG93KCBwMS5kaXN0YW5jZVRvU3F1YXJlZCggcDIgKSwgcG93ICk7XG5cdFx0dmFyIGR0MiA9IE1hdGgucG93KCBwMi5kaXN0YW5jZVRvU3F1YXJlZCggcDMgKSwgcG93ICk7XG5cblx0XHQvLyBzYWZldHkgY2hlY2sgZm9yIHJlcGVhdGVkIHBvaW50c1xuXHRcdGlmICggZHQxIDwgMWUtNCApIGR0MSA9IDEuMDtcblx0XHRpZiAoIGR0MCA8IDFlLTQgKSBkdDAgPSBkdDE7XG5cdFx0aWYgKCBkdDIgPCAxZS00ICkgZHQyID0gZHQxO1xuXG5cdFx0cHguaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC54LCBwMS54LCBwMi54LCBwMy54LCBkdDAsIGR0MSwgZHQyICk7XG5cdFx0cHkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCBkdDAsIGR0MSwgZHQyICk7XG5cdFx0cHouaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCBkdDAsIGR0MSwgZHQyICk7XG5cblx0fSBlbHNlIGlmICggdGhpcy5jdXJ2ZVR5cGUgPT09ICdjYXRtdWxscm9tJyApIHtcblxuXHRcdHB4LmluaXRDYXRtdWxsUm9tKCBwMC54LCBwMS54LCBwMi54LCBwMy54LCB0aGlzLnRlbnNpb24gKTtcblx0XHRweS5pbml0Q2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgdGhpcy50ZW5zaW9uICk7XG5cdFx0cHouaW5pdENhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnosIHAzLnosIHRoaXMudGVuc2lvbiApO1xuXG5cdH1cblxuXHRwb2ludC5zZXQoXG5cdFx0cHguY2FsYyggd2VpZ2h0ICksXG5cdFx0cHkuY2FsYyggd2VpZ2h0ICksXG5cdFx0cHouY2FsYyggd2VpZ2h0IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IHNvdXJjZS5wb2ludHNbIGkgXTtcblxuXHRcdHRoaXMucG9pbnRzLnB1c2goIHBvaW50LmNsb25lKCkgKTtcblxuXHR9XG5cblx0dGhpcy5jbG9zZWQgPSBzb3VyY2UuY2xvc2VkO1xuXHR0aGlzLmN1cnZlVHlwZSA9IHNvdXJjZS5jdXJ2ZVR5cGU7XG5cdHRoaXMudGVuc2lvbiA9IHNvdXJjZS50ZW5zaW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSB0aGlzLnBvaW50c1sgaSBdO1xuXHRcdGRhdGEucG9pbnRzLnB1c2goIHBvaW50LnRvQXJyYXkoKSApO1xuXG5cdH1cblxuXHRkYXRhLmNsb3NlZCA9IHRoaXMuY2xvc2VkO1xuXHRkYXRhLmN1cnZlVHlwZSA9IHRoaXMuY3VydmVUeXBlO1xuXHRkYXRhLnRlbnNpb24gPSB0aGlzLnRlbnNpb247XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0ganNvbi5wb2ludHNbIGkgXTtcblx0XHR0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMygpLmZyb21BcnJheSggcG9pbnQgKSApO1xuXG5cdH1cblxuXHR0aGlzLmNsb3NlZCA9IGpzb24uY2xvc2VkO1xuXHR0aGlzLmN1cnZlVHlwZSA9IGpzb24uY3VydmVUeXBlO1xuXHR0aGlzLnRlbnNpb24gPSBqc29uLnRlbnNpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuZXhwb3J0IHsgQ2F0bXVsbFJvbUN1cnZlMyB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKlxuICogQmV6aWVyIEN1cnZlcyBmb3JtdWxhcyBvYnRhaW5lZCBmcm9tXG4gKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0LDqXppZXJfY3VydmVcbiAqL1xuXG5mdW5jdGlvbiBDYXRtdWxsUm9tKCB0LCBwMCwgcDEsIHAyLCBwMyApIHtcblxuXHR2YXIgdjAgPSAoIHAyIC0gcDAgKSAqIDAuNTtcblx0dmFyIHYxID0gKCBwMyAtIHAxICkgKiAwLjU7XG5cdHZhciB0MiA9IHQgKiB0O1xuXHR2YXIgdDMgPSB0ICogdDI7XG5cdHJldHVybiAoIDIgKiBwMSAtIDIgKiBwMiArIHYwICsgdjEgKSAqIHQzICsgKCAtIDMgKiBwMSArIDMgKiBwMiAtIDIgKiB2MCAtIHYxICkgKiB0MiArIHYwICogdCArIHAxO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAwKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiBrICogayAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAgKSB7XG5cblx0cmV0dXJuIDIgKiAoIDEgLSB0ICkgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMiggdCwgcCApIHtcblxuXHRyZXR1cm4gdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllciggdCwgcDAsIHAxLCBwMiApIHtcblxuXHRyZXR1cm4gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAwICkgKyBRdWFkcmF0aWNCZXppZXJQMSggdCwgcDEgKSArXG5cdFx0UXVhZHJhdGljQmV6aWVyUDIoIHQsIHAyICk7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMCggdCwgcCApIHtcblxuXHR2YXIgayA9IDEgLSB0O1xuXHRyZXR1cm4gayAqIGsgKiBrICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAxKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiAzICogayAqIGsgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiAzICogKCAxIC0gdCApICogdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDMoIHQsIHAgKSB7XG5cblx0cmV0dXJuIHQgKiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXIoIHQsIHAwLCBwMSwgcDIsIHAzICkge1xuXG5cdHJldHVybiBDdWJpY0JlemllclAwKCB0LCBwMCApICsgQ3ViaWNCZXppZXJQMSggdCwgcDEgKSArIEN1YmljQmV6aWVyUDIoIHQsIHAyICkgK1xuXHRcdEN1YmljQmV6aWVyUDMoIHQsIHAzICk7XG5cbn1cblxuZXhwb3J0IHsgQ2F0bXVsbFJvbSwgUXVhZHJhdGljQmV6aWVyLCBDdWJpY0JlemllciB9O1xuIiwiaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcbmltcG9ydCB7IEN1YmljQmV6aWVyIH0gZnJvbSAnLi4vY29yZS9JbnRlcnBvbGF0aW9ucy5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcblxuXG5mdW5jdGlvbiBDdWJpY0JlemllckN1cnZlKCB2MCwgdjEsIHYyLCB2MyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUnO1xuXG5cdHRoaXMudjAgPSB2MCB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjMgPSB2MyB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmljQmV6aWVyQ3VydmU7XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZSA9IHRydWU7XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0cG9pbnQuc2V0KFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cdHRoaXMudjMuY29weSggc291cmNlLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXHR0aGlzLnYzLmZyb21BcnJheSgganNvbi52MyApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbmV4cG9ydCB7IEN1YmljQmV6aWVyQ3VydmUgfTtcbiIsImltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XG5pbXBvcnQgeyBDdWJpY0JlemllciB9IGZyb20gJy4uL2NvcmUvSW50ZXJwb2xhdGlvbnMuanMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XG5cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZTMoIHYwLCB2MSwgdjIsIHYzICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3ViaWNCZXppZXJDdXJ2ZTMnO1xuXG5cdHRoaXMudjAgPSB2MCB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjMgPSB2MyB8fCBuZXcgVmVjdG9yMygpO1xuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViaWNCZXppZXJDdXJ2ZTM7XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUzID0gdHJ1ZTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0cG9pbnQuc2V0KFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKSxcblx0XHRDdWJpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiwgdjMueiApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cdHRoaXMudjMuY29weSggc291cmNlLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXHRkYXRhLnYzID0gdGhpcy52My50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XG5cdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cdHRoaXMudjMuZnJvbUFycmF5KCBqc29uLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuZXhwb3J0IHsgQ3ViaWNCZXppZXJDdXJ2ZTMgfTtcbiIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xuaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcblxuXG5mdW5jdGlvbiBMaW5lQ3VydmUoIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVDdXJ2ZSc7XG5cblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkxpbmVDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQ3VydmU7XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuaXNMaW5lQ3VydmUgPSB0cnVlO1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdGlmICggdCA9PT0gMSApIHtcblxuXHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cG9pbnQuY29weSggdGhpcy52MiApLnN1YiggdGhpcy52MSApO1xuXHRcdHBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7XG5cblx0fVxuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuLy8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnRBdCA9IGZ1bmN0aW9uICggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0VGFuZ2VudCA9IGZ1bmN0aW9uICggLyogdCAqLyApIHtcblxuXHR2YXIgdGFuZ2VudCA9IHRoaXMudjIuY2xvbmUoKS5zdWIoIHRoaXMudjEgKTtcblxuXHRyZXR1cm4gdGFuZ2VudC5ub3JtYWxpemUoKTtcblxufTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuZXhwb3J0IHsgTGluZUN1cnZlIH07XG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XG5cblxuZnVuY3Rpb24gTGluZUN1cnZlMyggdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUN1cnZlMyc7XG5cblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMygpO1xuXG59XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5MaW5lQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVDdXJ2ZTM7XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmlzTGluZUN1cnZlMyA9IHRydWU7XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdGlmICggdCA9PT0gMSApIHtcblxuXHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cG9pbnQuY29weSggdGhpcy52MiApLnN1YiggdGhpcy52MSApO1xuXHRcdHBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7XG5cblx0fVxuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuLy8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50QXQgPSBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHJldHVybiB0aGlzLmdldFBvaW50KCB1LCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5leHBvcnQgeyBMaW5lQ3VydmUzIH07XG4iLCJpbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL2NvcmUvQ3VydmUuanMnO1xuaW1wb3J0IHsgUXVhZHJhdGljQmV6aWVyIH0gZnJvbSAnLi4vY29yZS9JbnRlcnBvbGF0aW9ucy5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcblxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1F1YWRyYXRpY0JlemllckN1cnZlJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUXVhZHJhdGljQmV6aWVyQ3VydmU7XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5pc1F1YWRyYXRpY0JlemllckN1cnZlID0gdHJ1ZTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHBvaW50LnNldChcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5leHBvcnQgeyBRdWFkcmF0aWNCZXppZXJDdXJ2ZSB9O1xuIiwiaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcbmltcG9ydCB7IFF1YWRyYXRpY0JlemllciB9IGZyb20gJy4uL2NvcmUvSW50ZXJwb2xhdGlvbnMuanMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XG5cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyQ3VydmUzKCB2MCwgdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUXVhZHJhdGljQmV6aWVyQ3VydmUzJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMygpO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTM7XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgPSB0cnVlO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHBvaW50LnNldChcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnogKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5leHBvcnQgeyBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgfTtcbiIsImltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XG5pbXBvcnQgeyBDYXRtdWxsUm9tIH0gZnJvbSAnLi4vY29yZS9JbnRlcnBvbGF0aW9ucy5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcblxuXG5mdW5jdGlvbiBTcGxpbmVDdXJ2ZSggcG9pbnRzIC8qIGFycmF5IG9mIFZlY3RvcjIgKi8gKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcGxpbmVDdXJ2ZSc7XG5cblx0dGhpcy5wb2ludHMgPSBwb2ludHMgfHwgW107XG5cbn1cblxuU3BsaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGxpbmVDdXJ2ZTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmlzU3BsaW5lQ3VydmUgPSB0cnVlO1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cblx0dmFyIHBvaW50cyA9IHRoaXMucG9pbnRzO1xuXHR2YXIgcCA9ICggcG9pbnRzLmxlbmd0aCAtIDEgKSAqIHQ7XG5cblx0dmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xuXHR2YXIgd2VpZ2h0ID0gcCAtIGludFBvaW50O1xuXG5cdHZhciBwMCA9IHBvaW50c1sgaW50UG9pbnQgPT09IDAgPyBpbnRQb2ludCA6IGludFBvaW50IC0gMSBdO1xuXHR2YXIgcDEgPSBwb2ludHNbIGludFBvaW50IF07XG5cdHZhciBwMiA9IHBvaW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMiA/IHBvaW50cy5sZW5ndGggLSAxIDogaW50UG9pbnQgKyAxIF07XG5cdHZhciBwMyA9IHBvaW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMyA/IHBvaW50cy5sZW5ndGggLSAxIDogaW50UG9pbnQgKyAyIF07XG5cblx0cG9pbnQuc2V0KFxuXHRcdENhdG11bGxSb20oIHdlaWdodCwgcDAueCwgcDEueCwgcDIueCwgcDMueCApLFxuXHRcdENhdG11bGxSb20oIHdlaWdodCwgcDAueSwgcDEueSwgcDIueSwgcDMueSApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0gc291cmNlLnBvaW50c1sgaSBdO1xuXG5cdFx0dGhpcy5wb2ludHMucHVzaCggcG9pbnQuY2xvbmUoKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IHRoaXMucG9pbnRzWyBpIF07XG5cdFx0ZGF0YS5wb2ludHMucHVzaCggcG9pbnQudG9BcnJheSgpICk7XG5cblx0fVxuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSBqc29uLnBvaW50c1sgaSBdO1xuXHRcdHRoaXMucG9pbnRzLnB1c2goIG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBwb2ludCApICk7XG5cblx0fVxuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbmV4cG9ydCB7IFNwbGluZUN1cnZlIH07XG4iLCJpbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4vQ3VydmUuanMnO1xuaW1wb3J0ICogYXMgQ3VydmVzIGZyb20gJy4uL2N1cnZlcy9DdXJ2ZXMuanMnO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiovXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcdEN1cnZlZCBQYXRoIC0gYSBjdXJ2ZSBwYXRoIGlzIHNpbXBseSBhIGFycmF5IG9mIGNvbm5lY3RlZFxuICogIGN1cnZlcywgYnV0IHJldGFpbnMgdGhlIGFwaSBvZiBhIGN1cnZlXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmZ1bmN0aW9uIEN1cnZlUGF0aCgpIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N1cnZlUGF0aCc7XG5cblx0dGhpcy5jdXJ2ZXMgPSBbXTtcblx0dGhpcy5hdXRvQ2xvc2UgPSBmYWxzZTsgLy8gQXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHBhdGhcblxufVxuXG5DdXJ2ZVBhdGgucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ3VydmVQYXRoLFxuXG5cdGFkZDogZnVuY3Rpb24gKCBjdXJ2ZSApIHtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0fSxcblxuXHRjbG9zZVBhdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIEFkZCBhIGxpbmUgY3VydmUgaWYgc3RhcnQgYW5kIGVuZCBvZiBsaW5lcyBhcmUgbm90IGNvbm5lY3RlZFxuXHRcdHZhciBzdGFydFBvaW50ID0gdGhpcy5jdXJ2ZXNbIDAgXS5nZXRQb2ludCggMCApO1xuXHRcdHZhciBlbmRQb2ludCA9IHRoaXMuY3VydmVzWyB0aGlzLmN1cnZlcy5sZW5ndGggLSAxIF0uZ2V0UG9pbnQoIDEgKTtcblxuXHRcdGlmICggISBzdGFydFBvaW50LmVxdWFscyggZW5kUG9pbnQgKSApIHtcblxuXHRcdFx0dGhpcy5jdXJ2ZXMucHVzaCggbmV3IEN1cnZlc1sgJ0xpbmVDdXJ2ZScgXSggZW5kUG9pbnQsIHN0YXJ0UG9pbnQgKSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gVG8gZ2V0IGFjY3VyYXRlIHBvaW50IHdpdGggcmVmZXJlbmNlIHRvXG5cdC8vIGVudGlyZSBwYXRoIGRpc3RhbmNlIGF0IHRpbWUgdCxcblx0Ly8gZm9sbG93aW5nIGhhcyB0byBiZSBkb25lOlxuXG5cdC8vIDEuIExlbmd0aCBvZiBlYWNoIHN1YiBwYXRoIGhhdmUgdG8gYmUga25vd25cblx0Ly8gMi4gTG9jYXRlIGFuZCBpZGVudGlmeSB0eXBlIG9mIGN1cnZlXG5cdC8vIDMuIEdldCB0IGZvciB0aGUgY3VydmVcblx0Ly8gNC4gUmV0dXJuIGN1cnZlLmdldFBvaW50QXQodCcpXG5cblx0Z2V0UG9pbnQ6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdHZhciBkID0gdCAqIHRoaXMuZ2V0TGVuZ3RoKCk7XG5cdFx0dmFyIGN1cnZlTGVuZ3RocyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XG5cdFx0dmFyIGkgPSAwO1xuXG5cdFx0Ly8gVG8gdGhpbmsgYWJvdXQgYm91bmRhcmllcyBwb2ludHMuXG5cblx0XHR3aGlsZSAoIGkgPCBjdXJ2ZUxlbmd0aHMubGVuZ3RoICkge1xuXG5cdFx0XHRpZiAoIGN1cnZlTGVuZ3Roc1sgaSBdID49IGQgKSB7XG5cblx0XHRcdFx0dmFyIGRpZmYgPSBjdXJ2ZUxlbmd0aHNbIGkgXSAtIGQ7XG5cdFx0XHRcdHZhciBjdXJ2ZSA9IHRoaXMuY3VydmVzWyBpIF07XG5cblx0XHRcdFx0dmFyIHNlZ21lbnRMZW5ndGggPSBjdXJ2ZS5nZXRMZW5ndGgoKTtcblx0XHRcdFx0dmFyIHUgPSBzZWdtZW50TGVuZ3RoID09PSAwID8gMCA6IDEgLSBkaWZmIC8gc2VnbWVudExlbmd0aDtcblxuXHRcdFx0XHRyZXR1cm4gY3VydmUuZ2V0UG9pbnRBdCggdSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGkgKys7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdC8vIGxvb3Agd2hlcmUgc3VtICE9IDAsIHN1bSA+IGQgLCBzdW0rMSA8ZFxuXG5cdH0sXG5cblx0Ly8gV2UgY2Fubm90IHVzZSB0aGUgZGVmYXVsdCBUSFJFRS5DdXJ2ZSBnZXRQb2ludCgpIHdpdGggZ2V0TGVuZ3RoKCkgYmVjYXVzZSBpblxuXHQvLyBUSFJFRS5DdXJ2ZSwgZ2V0TGVuZ3RoKCkgZGVwZW5kcyBvbiBnZXRQb2ludCgpIGJ1dCBpbiBUSFJFRS5DdXJ2ZVBhdGhcblx0Ly8gZ2V0UG9pbnQoKSBkZXBlbmRzIG9uIGdldExlbmd0aFxuXG5cdGdldExlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGxlbnMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXHRcdHJldHVybiBsZW5zWyBsZW5zLmxlbmd0aCAtIDEgXTtcblxuXHR9LFxuXG5cdC8vIGNhY2hlTGVuZ3RocyBtdXN0IGJlIHJlY2FsY3VsYXRlZC5cblx0dXBkYXRlQXJjTGVuZ3RoczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cdFx0dGhpcy5jYWNoZUxlbmd0aHMgPSBudWxsO1xuXHRcdHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XG5cblx0fSxcblxuXHQvLyBDb21wdXRlIGxlbmd0aHMgYW5kIGNhY2hlIHRoZW1cblx0Ly8gV2UgY2Fubm90IG92ZXJ3cml0ZSBnZXRMZW5ndGhzKCkgYmVjYXVzZSBVdG9UIG1hcHBpbmcgdXNlcyBpdC5cblxuXHRnZXRDdXJ2ZUxlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFdlIHVzZSBjYWNoZSB2YWx1ZXMgaWYgY3VydmVzIGFuZCBjYWNoZSBhcnJheSBhcmUgc2FtZSBsZW5ndGhcblxuXHRcdGlmICggdGhpcy5jYWNoZUxlbmd0aHMgJiYgdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoID09PSB0aGlzLmN1cnZlcy5sZW5ndGggKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmNhY2hlTGVuZ3RocztcblxuXHRcdH1cblxuXHRcdC8vIEdldCBsZW5ndGggb2Ygc3ViLWN1cnZlXG5cdFx0Ly8gUHVzaCBzdW1zIGludG8gY2FjaGVkIGFycmF5XG5cblx0XHR2YXIgbGVuZ3RocyA9IFtdLCBzdW1zID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHN1bXMgKz0gdGhpcy5jdXJ2ZXNbIGkgXS5nZXRMZW5ndGgoKTtcblx0XHRcdGxlbmd0aHMucHVzaCggc3VtcyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYWNoZUxlbmd0aHMgPSBsZW5ndGhzO1xuXG5cdFx0cmV0dXJuIGxlbmd0aHM7XG5cblx0fSxcblxuXHRnZXRTcGFjZWRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDQwO1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDw9IGRpdmlzaW9uczsgaSArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGkgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmF1dG9DbG9zZSApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Z2V0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCAxMjtcblxuXHRcdHZhciBwb2ludHMgPSBbXSwgbGFzdDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgY3VydmVzID0gdGhpcy5jdXJ2ZXM7IGkgPCBjdXJ2ZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VydmUgPSBjdXJ2ZXNbIGkgXTtcblx0XHRcdHZhciByZXNvbHV0aW9uID0gKCBjdXJ2ZSAmJiBjdXJ2ZS5pc0VsbGlwc2VDdXJ2ZSApID8gZGl2aXNpb25zICogMlxuXHRcdFx0XHQ6ICggY3VydmUgJiYgKCBjdXJ2ZS5pc0xpbmVDdXJ2ZSB8fCBjdXJ2ZS5pc0xpbmVDdXJ2ZTMgKSApID8gMVxuXHRcdFx0XHRcdDogKCBjdXJ2ZSAmJiBjdXJ2ZS5pc1NwbGluZUN1cnZlICkgPyBkaXZpc2lvbnMgKiBjdXJ2ZS5wb2ludHMubGVuZ3RoXG5cdFx0XHRcdFx0XHQ6IGRpdmlzaW9ucztcblxuXHRcdFx0dmFyIHB0cyA9IGN1cnZlLmdldFBvaW50cyggcmVzb2x1dGlvbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBwdHMubGVuZ3RoOyBqICsrICkge1xuXG5cdFx0XHRcdHZhciBwb2ludCA9IHB0c1sgaiBdO1xuXG5cdFx0XHRcdGlmICggbGFzdCAmJiBsYXN0LmVxdWFscyggcG9pbnQgKSApIGNvbnRpbnVlOyAvLyBlbnN1cmVzIG5vIGNvbnNlY3V0aXZlIHBvaW50cyBhcmUgZHVwbGljYXRlc1xuXG5cdFx0XHRcdHBvaW50cy5wdXNoKCBwb2ludCApO1xuXHRcdFx0XHRsYXN0ID0gcG9pbnQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgJiYgcG9pbnRzLmxlbmd0aCA+IDEgJiYgISBwb2ludHNbIHBvaW50cy5sZW5ndGggLSAxIF0uZXF1YWxzKCBwb2ludHNbIDAgXSApICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggcG9pbnRzWyAwIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwb2ludHM7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5jdXJ2ZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gc291cmNlLmN1cnZlc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmF1dG9DbG9zZSA9IHNvdXJjZS5hdXRvQ2xvc2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRcdGRhdGEuYXV0b0Nsb3NlID0gdGhpcy5hdXRvQ2xvc2U7XG5cdFx0ZGF0YS5jdXJ2ZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjdXJ2ZSA9IHRoaXMuY3VydmVzWyBpIF07XG5cdFx0XHRkYXRhLmN1cnZlcy5wdXNoKCBjdXJ2ZS50b0pTT04oKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRmcm9tSlNPTjogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHRcdHRoaXMuYXV0b0Nsb3NlID0ganNvbi5hdXRvQ2xvc2U7XG5cdFx0dGhpcy5jdXJ2ZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjdXJ2ZSA9IGpzb24uY3VydmVzWyBpIF07XG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBuZXcgQ3VydmVzWyBjdXJ2ZS50eXBlIF0oKS5mcm9tSlNPTiggY3VydmUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgQ3VydmVQYXRoIH07XG4iLCJpbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcbmltcG9ydCB7IEN1cnZlUGF0aCB9IGZyb20gJy4vQ3VydmVQYXRoLmpzJztcbmltcG9ydCB7IEVsbGlwc2VDdXJ2ZSB9IGZyb20gJy4uL2N1cnZlcy9FbGxpcHNlQ3VydmUuanMnO1xuaW1wb3J0IHsgU3BsaW5lQ3VydmUgfSBmcm9tICcuLi9jdXJ2ZXMvU3BsaW5lQ3VydmUuanMnO1xuaW1wb3J0IHsgQ3ViaWNCZXppZXJDdXJ2ZSB9IGZyb20gJy4uL2N1cnZlcy9DdWJpY0JlemllckN1cnZlLmpzJztcbmltcG9ydCB7IFF1YWRyYXRpY0JlemllckN1cnZlIH0gZnJvbSAnLi4vY3VydmVzL1F1YWRyYXRpY0JlemllckN1cnZlLmpzJztcbmltcG9ydCB7IExpbmVDdXJ2ZSB9IGZyb20gJy4uL2N1cnZlcy9MaW5lQ3VydmUuanMnO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIENyZWF0ZXMgZnJlZSBmb3JtIDJkIHBhdGggdXNpbmcgc2VyaWVzIG9mIHBvaW50cywgbGluZXMgb3IgY3VydmVzLlxuICoqL1xuXG5mdW5jdGlvbiBQYXRoKCBwb2ludHMgKSB7XG5cblx0Q3VydmVQYXRoLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGF0aCc7XG5cblx0dGhpcy5jdXJyZW50UG9pbnQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdGlmICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcblxuXHR9XG5cbn1cblxuUGF0aC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDdXJ2ZVBhdGgucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUGF0aCxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMubW92ZVRvKCBwb2ludHNbIDAgXS54LCBwb2ludHNbIDAgXS55ICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5saW5lVG8oIHBvaW50c1sgaSBdLngsIHBvaW50c1sgaSBdLnkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG1vdmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7IC8vIFRPRE8gY29uc2lkZXIgcmVmZXJlbmNpbmcgdmVjdG9ycyBpbnN0ZWFkIG9mIGNvcHlpbmc/XG5cblx0fSxcblxuXHRsaW5lVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBMaW5lQ3VydmUoIHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksIG5ldyBWZWN0b3IyKCB4LCB5ICkgKTtcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7XG5cblx0fSxcblxuXHRxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBRdWFkcmF0aWNCZXppZXJDdXJ2ZShcblx0XHRcdHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksXG5cdFx0XHRuZXcgVmVjdG9yMiggYUNQeCwgYUNQeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFYLCBhWSApXG5cdFx0KTtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0YmV6aWVyQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IEN1YmljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDF4LCBhQ1AxeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDJ4LCBhQ1AyeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFYLCBhWSApXG5cdFx0KTtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0c3BsaW5lVGhydTogZnVuY3Rpb24gKCBwdHMgLypBcnJheSBvZiBWZWN0b3IqLyApIHtcblxuXHRcdHZhciBucHRzID0gWyB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpIF0uY29uY2F0KCBwdHMgKTtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBTcGxpbmVDdXJ2ZSggbnB0cyApO1xuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBwdHNbIHB0cy5sZW5ndGggLSAxIF0gKTtcblxuXHR9LFxuXG5cdGFyYzogZnVuY3Rpb24gKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XG5cblx0XHR2YXIgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54O1xuXHRcdHZhciB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XG5cblx0XHR0aGlzLmFic2FyYyggYVggKyB4MCwgYVkgKyB5MCwgYVJhZGl1cyxcblx0XHRcdGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR9LFxuXG5cdGFic2FyYzogZnVuY3Rpb24gKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XG5cblx0XHR0aGlzLmFic2VsbGlwc2UoIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xuXG5cdH0sXG5cblx0ZWxsaXBzZTogZnVuY3Rpb24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRcdHZhciB4MCA9IHRoaXMuY3VycmVudFBvaW50Lng7XG5cdFx0dmFyIHkwID0gdGhpcy5jdXJyZW50UG9pbnQueTtcblxuXHRcdHRoaXMuYWJzZWxsaXBzZSggYVggKyB4MCwgYVkgKyB5MCwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7XG5cblx0fSxcblxuXHRhYnNlbGxpcHNlOiBmdW5jdGlvbiAoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcblxuXHRcdGlmICggdGhpcy5jdXJ2ZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Ly8gaWYgYSBwcmV2aW91cyBjdXJ2ZSBpcyBwcmVzZW50LCBhdHRlbXB0IHRvIGpvaW5cblx0XHRcdHZhciBmaXJzdFBvaW50ID0gY3VydmUuZ2V0UG9pbnQoIDAgKTtcblxuXHRcdFx0aWYgKCAhIGZpcnN0UG9pbnQuZXF1YWxzKCB0aGlzLmN1cnJlbnRQb2ludCApICkge1xuXG5cdFx0XHRcdHRoaXMubGluZVRvKCBmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dmFyIGxhc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAxICk7XG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggbGFzdFBvaW50ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEN1cnZlUGF0aC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIHNvdXJjZS5jdXJyZW50UG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IEN1cnZlUGF0aC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRcdGRhdGEuY3VycmVudFBvaW50ID0gdGhpcy5jdXJyZW50UG9pbnQudG9BcnJheSgpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRmcm9tSlNPTjogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0Q3VydmVQYXRoLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkoIGpzb24uY3VycmVudFBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBQYXRoIH07XG4iLCJpbXBvcnQgeyBQYXRoIH0gZnJvbSAnLi9QYXRoLmpzJztcbmltcG9ydCB7IF9NYXRoIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRoLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBEZWZpbmVzIGEgMmQgc2hhcGUgcGxhbmUgdXNpbmcgcGF0aHMuXG4gKiovXG5cbi8vIFNURVAgMSBDcmVhdGUgYSBwYXRoLlxuLy8gU1RFUCAyIFR1cm4gcGF0aCBpbnRvIHNoYXBlLlxuLy8gU1RFUCAzIEV4dHJ1ZGVHZW9tZXRyeSB0YWtlcyBpbiBTaGFwZS9TaGFwZXNcbi8vIFNURVAgM2EgLSBFeHRyYWN0IHBvaW50cyBmcm9tIGVhY2ggc2hhcGUsIHR1cm4gdG8gdmVydGljZXNcbi8vIFNURVAgM2IgLSBUcmlhbmd1bGF0ZSBlYWNoIHNoYXBlLCBhZGQgZmFjZXMuXG5cbmZ1bmN0aW9uIFNoYXBlKCBwb2ludHMgKSB7XG5cblx0UGF0aC5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhcGUnO1xuXG5cdHRoaXMuaG9sZXMgPSBbXTtcblxufVxuXG5TaGFwZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBQYXRoLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNoYXBlLFxuXG5cdGdldFBvaW50c0hvbGVzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdHZhciBob2xlc1B0cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRob2xlc1B0c1sgaSBdID0gdGhpcy5ob2xlc1sgaSBdLmdldFBvaW50cyggZGl2aXNpb25zICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaG9sZXNQdHM7XG5cblx0fSxcblxuXHQvLyBnZXQgcG9pbnRzIG9mIHNoYXBlIGFuZCBob2xlcyAoa2V5cG9pbnRzIGJhc2VkIG9uIHNlZ21lbnRzIHBhcmFtZXRlcilcblxuXHRleHRyYWN0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdHJldHVybiB7XG5cblx0XHRcdHNoYXBlOiB0aGlzLmdldFBvaW50cyggZGl2aXNpb25zICksXG5cdFx0XHRob2xlczogdGhpcy5nZXRQb2ludHNIb2xlcyggZGl2aXNpb25zIClcblxuXHRcdH07XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdFBhdGgucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmhvbGVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGhvbGUgPSBzb3VyY2UuaG9sZXNbIGkgXTtcblxuXHRcdFx0dGhpcy5ob2xlcy5wdXNoKCBob2xlLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IFBhdGgucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS5ob2xlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaG9sZSA9IHRoaXMuaG9sZXNbIGkgXTtcblx0XHRcdGRhdGEuaG9sZXMucHVzaCggaG9sZS50b0pTT04oKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRmcm9tSlNPTjogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0UGF0aC5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdFx0dGhpcy51dWlkID0ganNvbi51dWlkO1xuXHRcdHRoaXMuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGhvbGUgPSBqc29uLmhvbGVzWyBpIF07XG5cdFx0XHR0aGlzLmhvbGVzLnB1c2goIG5ldyBQYXRoKCkuZnJvbUpTT04oIGhvbGUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgU2hhcGUgfTtcbiIsImltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGlnaHQnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cdHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgPyBpbnRlbnNpdHkgOiAxO1xuXG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHVuZGVmaW5lZDtcblxufVxuXG5MaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaWdodCxcblxuXHRpc0xpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpO1xuXHRcdGRhdGEub2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xuXG5cdFx0aWYgKCB0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMuZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTtcblx0XHRpZiAoIHRoaXMuYW5nbGUgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmFuZ2xlID0gdGhpcy5hbmdsZTtcblx0XHRpZiAoIHRoaXMuZGVjYXkgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRlY2F5ID0gdGhpcy5kZWNheTtcblx0XHRpZiAoIHRoaXMucGVudW1icmEgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhpcy5wZW51bWJyYTtcblxuXHRcdGlmICggdGhpcy5zaGFkb3cgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnNoYWRvdyA9IHRoaXMuc2hhZG93LnRvSlNPTigpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgTGlnaHQgfTtcbiIsImltcG9ydCB7IExpZ2h0IH0gZnJvbSAnLi9MaWdodC5qcyc7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEhlbWlzcGhlcmVMaWdodCggc2t5Q29sb3IsIGdyb3VuZENvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgc2t5Q29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdIZW1pc3BoZXJlTGlnaHQnO1xuXG5cdHRoaXMuY2FzdFNoYWRvdyA9IHVuZGVmaW5lZDtcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMuZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IoIGdyb3VuZENvbG9yICk7XG5cbn1cblxuSGVtaXNwaGVyZUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEhlbWlzcGhlcmVMaWdodCxcblxuXHRpc0hlbWlzcGhlcmVMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5ncm91bmRDb2xvci5jb3B5KCBzb3VyY2UuZ3JvdW5kQ29sb3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IEhlbWlzcGhlcmVMaWdodCB9O1xuIiwiaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0U2hhZG93KCBjYW1lcmEgKSB7XG5cblx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cblx0dGhpcy5iaWFzID0gMDtcblx0dGhpcy5yYWRpdXMgPSAxO1xuXG5cdHRoaXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCA1MTIsIDUxMiApO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExpZ2h0U2hhZG93LnByb3RvdHlwZSwge1xuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5jYW1lcmEgPSBzb3VyY2UuY2FtZXJhLmNsb25lKCk7XG5cblx0XHR0aGlzLmJpYXMgPSBzb3VyY2UuYmlhcztcblx0XHR0aGlzLnJhZGl1cyA9IHNvdXJjZS5yYWRpdXM7XG5cblx0XHR0aGlzLm1hcFNpemUuY29weSggc291cmNlLm1hcFNpemUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdCA9IHt9O1xuXG5cdFx0aWYgKCB0aGlzLmJpYXMgIT09IDAgKSBvYmplY3QuYmlhcyA9IHRoaXMuYmlhcztcblx0XHRpZiAoIHRoaXMucmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzO1xuXHRcdGlmICggdGhpcy5tYXBTaXplLnggIT09IDUxMiB8fCB0aGlzLm1hcFNpemUueSAhPT0gNTEyICkgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpO1xuXG5cdFx0b2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7XG5cdFx0ZGVsZXRlIG9iamVjdC5jYW1lcmEubWF0cml4O1xuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBMaWdodFNoYWRvdyB9O1xuIiwiaW1wb3J0IHsgTGlnaHRTaGFkb3cgfSBmcm9tICcuL0xpZ2h0U2hhZG93LmpzJztcbmltcG9ydCB7IF9NYXRoIH0gZnJvbSAnLi4vbWF0aC9NYXRoLmpzJztcbmltcG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi4vY2FtZXJhcy9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHRTaGFkb3coKSB7XG5cblx0TGlnaHRTaGFkb3cuY2FsbCggdGhpcywgbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCA1MCwgMSwgMC41LCA1MDAgKSApO1xuXG59XG5cblNwb3RMaWdodFNoYWRvdy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFNoYWRvdy5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcG90TGlnaHRTaGFkb3csXG5cblx0aXNTcG90TGlnaHRTaGFkb3c6IHRydWUsXG5cblx0dXBkYXRlOiBmdW5jdGlvbiAoIGxpZ2h0ICkge1xuXG5cdFx0dmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xuXG5cdFx0dmFyIGZvdiA9IF9NYXRoLlJBRDJERUcgKiAyICogbGlnaHQuYW5nbGU7XG5cdFx0dmFyIGFzcGVjdCA9IHRoaXMubWFwU2l6ZS53aWR0aCAvIHRoaXMubWFwU2l6ZS5oZWlnaHQ7XG5cdFx0dmFyIGZhciA9IGxpZ2h0LmRpc3RhbmNlIHx8IGNhbWVyYS5mYXI7XG5cblx0XHRpZiAoIGZvdiAhPT0gY2FtZXJhLmZvdiB8fCBhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgfHwgZmFyICE9PSBjYW1lcmEuZmFyICkge1xuXG5cdFx0XHRjYW1lcmEuZm92ID0gZm92O1xuXHRcdFx0Y2FtZXJhLmFzcGVjdCA9IGFzcGVjdDtcblx0XHRcdGNhbWVyYS5mYXIgPSBmYXI7XG5cdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IFNwb3RMaWdodFNoYWRvdyB9O1xuIiwiaW1wb3J0IHsgTGlnaHQgfSBmcm9tICcuL0xpZ2h0LmpzJztcbmltcG9ydCB7IFNwb3RMaWdodFNoYWRvdyB9IGZyb20gJy4vU3BvdExpZ2h0U2hhZG93LmpzJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBhbmdsZSwgcGVudW1icmEsIGRlY2F5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BvdExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncG93ZXInLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE3KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIE1hdGguUEk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCBwb3dlciApIHtcblxuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTcpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxuXHRcdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7XG5cblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLmRpc3RhbmNlID0gKCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7XG5cdHRoaXMuYW5nbGUgPSAoIGFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IGFuZ2xlIDogTWF0aC5QSSAvIDM7XG5cdHRoaXMucGVudW1icmEgPSAoIHBlbnVtYnJhICE9PSB1bmRlZmluZWQgKSA/IHBlbnVtYnJhIDogMDtcblx0dGhpcy5kZWNheSA9ICggZGVjYXkgIT09IHVuZGVmaW5lZCApID8gZGVjYXkgOiAxO1x0Ly8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdHRoaXMuc2hhZG93ID0gbmV3IFNwb3RMaWdodFNoYWRvdygpO1xuXG59XG5cblNwb3RMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcG90TGlnaHQsXG5cblx0aXNTcG90TGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XG5cdFx0dGhpcy5hbmdsZSA9IHNvdXJjZS5hbmdsZTtcblx0XHR0aGlzLnBlbnVtYnJhID0gc291cmNlLnBlbnVtYnJhO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgU3BvdExpZ2h0IH07XG4iLCJpbXBvcnQgeyBMaWdodCB9IGZyb20gJy4vTGlnaHQuanMnO1xuaW1wb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhLmpzJztcbmltcG9ydCB7IExpZ2h0U2hhZG93IH0gZnJvbSAnLi9MaWdodFNoYWRvdy5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5cbmZ1bmN0aW9uIFBvaW50TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBkZWNheSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHQnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ3Bvd2VyJywge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiA0ICogTWF0aC5QSTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHBvd2VyICkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCA0ICogTWF0aC5QSSApO1xuXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5kaXN0YW5jZSA9ICggZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApID8gZGlzdGFuY2UgOiAwO1xuXHR0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5kZWZpbmVkICkgPyBkZWNheSA6IDE7XHQvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuXG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgTGlnaHRTaGFkb3coIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwgNTAwICkgKTtcblxufVxuXG5Qb2ludExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvaW50TGlnaHQsXG5cblx0aXNQb2ludExpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IFBvaW50TGlnaHQgfTtcbiIsImltcG9ydCB7IExpZ2h0U2hhZG93IH0gZnJvbSAnLi9MaWdodFNoYWRvdy5qcyc7XG5pbXBvcnQgeyBPcnRob2dyYXBoaWNDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL09ydGhvZ3JhcGhpY0NhbWVyYS5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0U2hhZG93KCApIHtcblxuXHRMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCAtIDUsIDUsIDUsIC0gNSwgMC41LCA1MDAgKSApO1xuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHRTaGFkb3cucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHRTaGFkb3cucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodFNoYWRvd1xuXG59ICk7XG5cblxuZXhwb3J0IHsgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB9O1xuIiwiaW1wb3J0IHsgTGlnaHQgfSBmcm9tICcuL0xpZ2h0LmpzJztcbmltcG9ydCB7IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgfSBmcm9tICcuL0RpcmVjdGlvbmFsTGlnaHRTaGFkb3cuanMnO1xuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnRGlyZWN0aW9uYWxMaWdodCc7XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLnRhcmdldCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdHRoaXMuc2hhZG93ID0gbmV3IERpcmVjdGlvbmFsTGlnaHRTaGFkb3coKTtcblxufVxuXG5EaXJlY3Rpb25hbExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERpcmVjdGlvbmFsTGlnaHQsXG5cblx0aXNEaXJlY3Rpb25hbExpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgRGlyZWN0aW9uYWxMaWdodCB9O1xuIiwiaW1wb3J0IHsgTGlnaHQgfSBmcm9tICcuL0xpZ2h0LmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEFtYmllbnRMaWdodCggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ0FtYmllbnRMaWdodCc7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkO1xuXG59XG5cbkFtYmllbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBbWJpZW50TGlnaHQsXG5cblx0aXNBbWJpZW50TGlnaHQ6IHRydWVcblxufSApO1xuXG5cbmV4cG9ydCB7IEFtYmllbnRMaWdodCB9O1xuIiwiaW1wb3J0IHsgTGlnaHQgfSBmcm9tICcuL0xpZ2h0LmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gUmVjdEFyZWFMaWdodCggY29sb3IsIGludGVuc2l0eSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ1JlY3RBcmVhTGlnaHQnO1xuXG5cdHRoaXMud2lkdGggPSAoIHdpZHRoICE9PSB1bmRlZmluZWQgKSA/IHdpZHRoIDogMTA7XG5cdHRoaXMuaGVpZ2h0ID0gKCBoZWlnaHQgIT09IHVuZGVmaW5lZCApID8gaGVpZ2h0IDogMTA7XG5cbn1cblxuUmVjdEFyZWFMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBSZWN0QXJlYUxpZ2h0LFxuXG5cdGlzUmVjdEFyZWFMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBMaWdodC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LndpZHRoID0gdGhpcy53aWR0aDtcblx0XHRkYXRhLm9iamVjdC5oZWlnaHQgPSB0aGlzLmhlaWdodDtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG5leHBvcnQgeyBSZWN0QXJlYUxpZ2h0IH07XG4iLCIvKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqL1xuXG52YXIgQW5pbWF0aW9uVXRpbHMgPSB7XG5cblx0Ly8gc2FtZSBhcyBBcnJheS5wcm90b3R5cGUuc2xpY2UsIGJ1dCBhbHNvIHdvcmtzIG9uIHR5cGVkIGFycmF5c1xuXHRhcnJheVNsaWNlOiBmdW5jdGlvbiAoIGFycmF5LCBmcm9tLCB0byApIHtcblxuXHRcdGlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHQvLyBpbiBpb3M5IGFycmF5LnN1YmFycmF5KGZyb20sIHVuZGVmaW5lZCkgd2lsbCByZXR1cm4gZW1wdHkgYXJyYXlcblx0XHRcdC8vIGJ1dCBhcnJheS5zdWJhcnJheShmcm9tKSBvciBhcnJheS5zdWJhcnJheShmcm9tLCBsZW4pIGlzIGNvcnJlY3Rcblx0XHRcdHJldHVybiBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGFycmF5LnN1YmFycmF5KCBmcm9tLCB0byAhPT0gdW5kZWZpbmVkID8gdG8gOiBhcnJheS5sZW5ndGggKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFycmF5LnNsaWNlKCBmcm9tLCB0byApO1xuXG5cdH0sXG5cblx0Ly8gY29udmVydHMgYW4gYXJyYXkgdG8gYSBzcGVjaWZpYyB0eXBlXG5cdGNvbnZlcnRBcnJheTogZnVuY3Rpb24gKCBhcnJheSwgdHlwZSwgZm9yY2VDbG9uZSApIHtcblxuXHRcdGlmICggISBhcnJheSB8fCAvLyBsZXQgJ3VuZGVmaW5lZCcgYW5kICdudWxsJyBwYXNzXG5cdFx0XHRcdCEgZm9yY2VDbG9uZSAmJiBhcnJheS5jb25zdHJ1Y3RvciA9PT0gdHlwZSApIHJldHVybiBhcnJheTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUuQllURVNfUEVSX0VMRU1FTlQgPT09ICdudW1iZXInICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IHR5cGUoIGFycmF5ICk7IC8vIGNyZWF0ZSB0eXBlZCBhcnJheVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOyAvLyBjcmVhdGUgQXJyYXlcblxuXHR9LFxuXG5cdGlzVHlwZWRBcnJheTogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KCBvYmplY3QgKSAmJlxuXHRcdFx0XHQhICggb2JqZWN0IGluc3RhbmNlb2YgRGF0YVZpZXcgKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybnMgYW4gYXJyYXkgYnkgd2hpY2ggdGltZXMgYW5kIHZhbHVlcyBjYW4gYmUgc29ydGVkXG5cdGdldEtleWZyYW1lT3JkZXI6IGZ1bmN0aW9uICggdGltZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBjb21wYXJlVGltZSggaSwgaiApIHtcblxuXHRcdFx0cmV0dXJuIHRpbWVzWyBpIF0gLSB0aW1lc1sgaiBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG4gPSB0aW1lcy5sZW5ndGg7XG5cdFx0dmFyIHJlc3VsdCA9IG5ldyBBcnJheSggbiApO1xuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHJlc3VsdFsgaSBdID0gaTtcblxuXHRcdHJlc3VsdC5zb3J0KCBjb21wYXJlVGltZSApO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9LFxuXG5cdC8vIHVzZXMgdGhlIGFycmF5IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgJ2dldEtleWZyYW1lT3JkZXInIHRvIHNvcnQgZGF0YVxuXHRzb3J0ZWRBcnJheTogZnVuY3Rpb24gKCB2YWx1ZXMsIHN0cmlkZSwgb3JkZXIgKSB7XG5cblx0XHR2YXIgblZhbHVlcyA9IHZhbHVlcy5sZW5ndGg7XG5cdFx0dmFyIHJlc3VsdCA9IG5ldyB2YWx1ZXMuY29uc3RydWN0b3IoIG5WYWx1ZXMgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgZHN0T2Zmc2V0ID0gMDsgZHN0T2Zmc2V0ICE9PSBuVmFsdWVzOyArKyBpICkge1xuXG5cdFx0XHR2YXIgc3JjT2Zmc2V0ID0gb3JkZXJbIGkgXSAqIHN0cmlkZTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XG5cblx0XHRcdFx0cmVzdWx0WyBkc3RPZmZzZXQgKysgXSA9IHZhbHVlc1sgc3JjT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gZnVuY3Rpb24gZm9yIHBhcnNpbmcgQU9TIGtleWZyYW1lIGZvcm1hdHNcblx0ZmxhdHRlbkpTT046IGZ1bmN0aW9uICgganNvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHZhbHVlUHJvcGVydHlOYW1lICkge1xuXG5cdFx0dmFyIGkgPSAxLCBrZXkgPSBqc29uS2V5c1sgMCBdO1xuXG5cdFx0d2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdH1cblxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG5vIGRhdGFcblxuXHRcdHZhciB2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG5vIGRhdGFcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblxuXHRcdFx0ZG8ge1xuXG5cdFx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XG5cdFx0XHRcdFx0dmFsdWVzLnB1c2guYXBwbHkoIHZhbHVlcywgdmFsdWUgKTsgLy8gcHVzaCBhbGwgZWxlbWVudHNcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XG5cblx0XHR9IGVsc2UgaWYgKCB2YWx1ZS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIC4uLmFzc3VtZSBUSFJFRS5NYXRoLWlzaFxuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZS50b0FycmF5KCB2YWx1ZXMsIHZhbHVlcy5sZW5ndGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBvdGhlcndpc2UgcHVzaCBhcy1pc1xuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5cbmV4cG9ydCB7IEFuaW1hdGlvblV0aWxzIH07XG4iLCIvKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgaW50ZXJwb2xhbnRzIG92ZXIgcGFyYW1ldHJpYyBzYW1wbGVzLlxuICpcbiAqIFRoZSBwYXJhbWV0ZXIgZG9tYWluIGlzIG9uZSBkaW1lbnNpb25hbCwgdHlwaWNhbGx5IHRoZSB0aW1lIG9yIGEgcGF0aFxuICogYWxvbmcgYSBjdXJ2ZSBkZWZpbmVkIGJ5IHRoZSBkYXRhLlxuICpcbiAqIFRoZSBzYW1wbGUgdmFsdWVzIGNhbiBoYXZlIGFueSBkaW1lbnNpb25hbGl0eSBhbmQgZGVyaXZlZCBjbGFzc2VzIG1heVxuICogYXBwbHkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbnMgdG8gdGhlIGRhdGEuXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgaW50ZXJ2YWwgc2VlayBpbiBhIFRlbXBsYXRlIE1ldGhvZCwgZGVmZXJyaW5nXG4gKiB0aGUgYWN0dWFsIGludGVycG9sYXRpb24gdG8gZGVyaXZlZCBjbGFzc2VzLlxuICpcbiAqIFRpbWUgY29tcGxleGl0eSBpcyBPKDEpIGZvciBsaW5lYXIgYWNjZXNzIGNyb3NzaW5nIGF0IG1vc3QgdHdvIHBvaW50c1xuICogYW5kIE8obG9nIE4pIGZvciByYW5kb20gYWNjZXNzLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25zLlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKlxuICogXHRcdGh0dHA6Ly93d3cub29kZXNpZ24uY29tL3RlbXBsYXRlLW1ldGhvZC1wYXR0ZXJuLmh0bWxcbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMgPSBwYXJhbWV0ZXJQb3NpdGlvbnM7XG5cdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblxuXHR0aGlzLnJlc3VsdEJ1ZmZlciA9IHJlc3VsdEJ1ZmZlciAhPT0gdW5kZWZpbmVkID9cblx0XHRyZXN1bHRCdWZmZXIgOiBuZXcgc2FtcGxlVmFsdWVzLmNvbnN0cnVjdG9yKCBzYW1wbGVTaXplICk7XG5cdHRoaXMuc2FtcGxlVmFsdWVzID0gc2FtcGxlVmFsdWVzO1xuXHR0aGlzLnZhbHVlU2l6ZSA9IHNhbXBsZVNpemU7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7XG5cblx0ZXZhbHVhdGU6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdHZhciBwcCA9IHRoaXMucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0aTEgPSB0aGlzLl9jYWNoZWRJbmRleCxcblxuXHRcdFx0dDEgPSBwcFsgaTEgXSxcblx0XHRcdHQwID0gcHBbIGkxIC0gMSBdO1xuXG5cdFx0dmFsaWRhdGVfaW50ZXJ2YWw6IHtcblxuXHRcdFx0c2Vlazoge1xuXG5cdFx0XHRcdHZhciByaWdodDtcblxuXHRcdFx0XHRsaW5lYXJfc2Nhbjoge1xuXG5cdFx0XHRcdFx0Ly8tIFNlZSBodHRwOi8vanNwZXJmLmNvbS9jb21wYXJpc29uLXRvLXVuZGVmaW5lZC8zXG5cdFx0XHRcdFx0Ly8tIHNsb3dlciBjb2RlOlxuXHRcdFx0XHRcdC8vLVxuXHRcdFx0XHRcdC8vLSBcdFx0XHRcdGlmICggdCA+PSB0MSB8fCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGZvcndhcmRfc2NhbjogaWYgKCAhICggdCA8IHQxICkgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBnaXZlVXBBdCA9IGkxICsgMjsgOyApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQxID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIHQgPCB0MCApIGJyZWFrIGZvcndhcmRfc2NhbjtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIGFmdGVyIGVuZFxuXG5cdFx0XHRcdFx0XHRcdFx0aTEgPSBwcC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdCwgdDAgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpMSA9PT0gZ2l2ZVVwQXQgKSBicmVhazsgLy8gdGhpcyBsb29wXG5cblx0XHRcdFx0XHRcdFx0dDAgPSB0MTtcblx0XHRcdFx0XHRcdFx0dDEgPSBwcFsgKysgaTEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPCB0MSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIGhhdmUgYXJyaXZlZCBhdCB0aGUgc291Z2h0IGludGVydmFsXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWsgc2VlaztcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbmRleFxuXHRcdFx0XHRcdFx0cmlnaHQgPSBwcC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRicmVhayBsaW5lYXJfc2NhbjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vLSBzbG93ZXIgY29kZTpcblx0XHRcdFx0XHQvLy1cdFx0XHRcdFx0aWYgKCB0IDwgdDAgfHwgdDAgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRpZiAoICEgKCB0ID49IHQwICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGxvb3Bpbmc/XG5cblx0XHRcdFx0XHRcdHZhciB0MWdsb2JhbCA9IHBwWyAxIF07XG5cblx0XHRcdFx0XHRcdGlmICggdCA8IHQxZ2xvYmFsICkge1xuXG5cdFx0XHRcdFx0XHRcdGkxID0gMjsgLy8gKyAxLCB1c2luZyB0aGUgc2NhbiBmb3IgdGhlIGRldGFpbHNcblx0XHRcdFx0XHRcdFx0dDAgPSB0MWdsb2JhbDtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBsaW5lYXIgcmV2ZXJzZSBzY2FuXG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBnaXZlVXBBdCA9IGkxIC0gMjsgOyApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBiZWZvcmUgc3RhcnRcblxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5iZWZvcmVTdGFydF8oIDAsIHQsIHQxICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcFxuXG5cdFx0XHRcdFx0XHRcdHQxID0gdDA7XG5cdFx0XHRcdFx0XHRcdHQwID0gcHBbIC0tIGkxIC0gMSBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdCA+PSB0MCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIGhhdmUgYXJyaXZlZCBhdCB0aGUgc291Z2h0IGludGVydmFsXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWsgc2VlaztcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGluZGV4XG5cdFx0XHRcdFx0XHRyaWdodCA9IGkxO1xuXHRcdFx0XHRcdFx0aTEgPSAwO1xuXHRcdFx0XHRcdFx0YnJlYWsgbGluZWFyX3NjYW47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0aGUgaW50ZXJ2YWwgaXMgdmFsaWRcblxuXHRcdFx0XHRcdGJyZWFrIHZhbGlkYXRlX2ludGVydmFsO1xuXG5cdFx0XHRcdH0gLy8gbGluZWFyIHNjYW5cblxuXHRcdFx0XHQvLyBiaW5hcnkgc2VhcmNoXG5cblx0XHRcdFx0d2hpbGUgKCBpMSA8IHJpZ2h0ICkge1xuXG5cdFx0XHRcdFx0dmFyIG1pZCA9ICggaTEgKyByaWdodCApID4+PiAxO1xuXG5cdFx0XHRcdFx0aWYgKCB0IDwgcHBbIG1pZCBdICkge1xuXG5cdFx0XHRcdFx0XHRyaWdodCA9IG1pZDtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGkxID0gbWlkICsgMTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dDEgPSBwcFsgaTEgXTtcblx0XHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XG5cblx0XHRcdFx0Ly8gY2hlY2sgYm91bmRhcnkgY2FzZXMsIGFnYWluXG5cblx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmJlZm9yZVN0YXJ0XyggMCwgdCwgdDEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aTEgPSBwcC5sZW5ndGg7XG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdDAsIHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gLy8gc2Vla1xuXG5cdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXG5cdFx0XHR0aGlzLmludGVydmFsQ2hhbmdlZF8oIGkxLCB0MCwgdDEgKTtcblxuXHRcdH0gLy8gdmFsaWRhdGVfaW50ZXJ2YWxcblxuXHRcdHJldHVybiB0aGlzLmludGVycG9sYXRlXyggaTEsIHQwLCB0LCB0MSApO1xuXG5cdH0sXG5cblx0c2V0dGluZ3M6IG51bGwsIC8vIG9wdGlvbmFsLCBzdWJjbGFzcy1zcGVjaWZpYyBzZXR0aW5ncyBzdHJ1Y3R1cmVcblx0Ly8gTm90ZTogVGhlIGluZGlyZWN0aW9uIGFsbG93cyBjZW50cmFsIGNvbnRyb2wgb2YgbWFueSBpbnRlcnBvbGFudHMuXG5cblx0Ly8gLS0tIFByb3RlY3RlZCBpbnRlcmZhY2VcblxuXHREZWZhdWx0U2V0dGluZ3NfOiB7fSxcblxuXHRnZXRTZXR0aW5nc186IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnNldHRpbmdzIHx8IHRoaXMuRGVmYXVsdFNldHRpbmdzXztcblxuXHR9LFxuXG5cdGNvcHlTYW1wbGVWYWx1ZV86IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHQvLyBjb3BpZXMgYSBzYW1wbGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBidWZmZXJcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRvZmZzZXQgPSBpbmRleCAqIHN0cmlkZTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9IHZhbHVlc1sgb2Zmc2V0ICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9LFxuXG5cdC8vIFRlbXBsYXRlIG1ldGhvZHMgZm9yIGRlcml2ZWQgY2xhc3NlczpcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggLyogaTEsIHQwLCB0LCB0MSAqLyApIHtcblxuXHRcdHRocm93IG5ldyBFcnJvciggJ2NhbGwgdG8gYWJzdHJhY3QgbWV0aG9kJyApO1xuXHRcdC8vIGltcGxlbWVudGF0aW9ucyBzaGFsbCByZXR1cm4gdGhpcy5yZXN1bHRCdWZmZXJcblxuXHR9LFxuXG5cdGludGVydmFsQ2hhbmdlZF86IGZ1bmN0aW9uICggLyogaTEsIHQwLCB0MSAqLyApIHtcblxuXHRcdC8vIGVtcHR5XG5cblx0fVxuXG59ICk7XG5cbi8vIVxcIERFQ0xBUkUgQUxJQVMgQUZURVIgYXNzaWduIHByb3RvdHlwZSAhXG5PYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHtcblxuXHQvLyggMCwgdCwgdDAgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRiZWZvcmVTdGFydF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG5cdC8vKCBOLTEsIHROLTEsIHQgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRhZnRlckVuZF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG59ICk7XG5cblxuZXhwb3J0IHsgSW50ZXJwb2xhbnQgfTtcbiIsImltcG9ydCB7IFplcm9DdXJ2YXR1cmVFbmRpbmcgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgSW50ZXJwb2xhbnQgfSBmcm9tICcuLi9JbnRlcnBvbGFudC5qcyc7XG5pbXBvcnQgeyBXcmFwQXJvdW5kRW5kaW5nLCBaZXJvU2xvcGVFbmRpbmcgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xuXG4vKipcbiAqIEZhc3QgYW5kIHNpbXBsZSBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhbnQuXG4gKlxuICogSXQgd2FzIGRlcml2ZWQgZnJvbSBhIEhlcm1pdGlhbiBjb25zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgZmlyc3QgZGVyaXZhdGl2ZVxuICogYXQgZWFjaCBzYW1wbGUgcG9zaXRpb24gdG8gdGhlIGxpbmVhciBzbG9wZSBiZXR3ZWVuIG5laWdoYm9yaW5nIHBvc2l0aW9uc1xuICogb3ZlciB0aGVpciBwYXJhbWV0ZXIgaW50ZXJ2YWwuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEN1YmljSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG5cdHRoaXMuX3dlaWdodFByZXYgPSAtIDA7XG5cdHRoaXMuX29mZnNldFByZXYgPSAtIDA7XG5cdHRoaXMuX3dlaWdodE5leHQgPSAtIDA7XG5cdHRoaXMuX29mZnNldE5leHQgPSAtIDA7XG5cbn1cblxuQ3ViaWNJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDdWJpY0ludGVycG9sYW50LFxuXG5cdERlZmF1bHRTZXR0aW5nc186IHtcblxuXHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdH0sXG5cblx0aW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQxICkge1xuXG5cdFx0dmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHRpUHJldiA9IGkxIC0gMixcblx0XHRcdGlOZXh0ID0gaTEgKyAxLFxuXG5cdFx0XHR0UHJldiA9IHBwWyBpUHJldiBdLFxuXHRcdFx0dE5leHQgPSBwcFsgaU5leHQgXTtcblxuXHRcdGlmICggdFByZXYgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdTdGFydCApIHtcblxuXHRcdFx0XHRjYXNlIFplcm9TbG9wZUVuZGluZzpcblxuXHRcdFx0XHRcdC8vIGYnKHQwKSA9IDBcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xuXHRcdFx0XHRcdHRQcmV2ID0gMiAqIHQwIC0gdDE7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFdyYXBBcm91bmRFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyB1c2UgdGhlIG90aGVyIGVuZCBvZiB0aGUgY3VydmVcblx0XHRcdFx0XHRpUHJldiA9IHBwLmxlbmd0aCAtIDI7XG5cdFx0XHRcdFx0dFByZXYgPSB0MCArIHBwWyBpUHJldiBdIC0gcHBbIGlQcmV2ICsgMSBdO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDogLy8gWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdFx0XHRcdFx0Ly8gZicnKHQwKSA9IDAgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aVByZXYgPSBpMTtcblx0XHRcdFx0XHR0UHJldiA9IHQxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHROZXh0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kICkge1xuXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gZicodE4pID0gMFxuXHRcdFx0XHRcdGlOZXh0ID0gaTE7XG5cdFx0XHRcdFx0dE5leHQgPSAyICogdDEgLSB0MDtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcblxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxuXHRcdFx0XHRcdGlOZXh0ID0gMTtcblx0XHRcdFx0XHR0TmV4dCA9IHQxICsgcHBbIDEgXSAtIHBwWyAwIF07XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0XHRcdFx0XHQvLyBmJycodE4pID0gMCwgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aU5leHQgPSBpMSAtIDE7XG5cdFx0XHRcdFx0dE5leHQgPSB0MDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGhhbGZEdCA9ICggdDEgLSB0MCApICogMC41LFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemU7XG5cblx0XHR0aGlzLl93ZWlnaHRQcmV2ID0gaGFsZkR0IC8gKCB0MCAtIHRQcmV2ICk7XG5cdFx0dGhpcy5fd2VpZ2h0TmV4dCA9IGhhbGZEdCAvICggdE5leHQgLSB0MSApO1xuXHRcdHRoaXMuX29mZnNldFByZXYgPSBpUHJldiAqIHN0cmlkZTtcblx0XHR0aGlzLl9vZmZzZXROZXh0ID0gaU5leHQgKiBzdHJpZGU7XG5cblx0fSxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG8xID0gaTEgKiBzdHJpZGUsXHRcdG8wID0gbzEgLSBzdHJpZGUsXG5cdFx0XHRvUCA9IHRoaXMuX29mZnNldFByZXYsIFx0b04gPSB0aGlzLl9vZmZzZXROZXh0LFxuXHRcdFx0d1AgPSB0aGlzLl93ZWlnaHRQcmV2LFx0d04gPSB0aGlzLl93ZWlnaHROZXh0LFxuXG5cdFx0XHRwID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0cHAgPSBwICogcCxcblx0XHRcdHBwcCA9IHBwICogcDtcblxuXHRcdC8vIGV2YWx1YXRlIHBvbHlub21pYWxzXG5cblx0XHR2YXIgc1AgPSAtIHdQICogcHBwICsgMiAqIHdQICogcHAgLSB3UCAqIHA7XG5cdFx0dmFyIHMwID0gKCAxICsgd1AgKSAqIHBwcCArICggLSAxLjUgLSAyICogd1AgKSAqIHBwICsgKCAtIDAuNSArIHdQICkgKiBwICsgMTtcblx0XHR2YXIgczEgPSAoIC0gMSAtIHdOICkgKiBwcHAgKyAoIDEuNSArIHdOICkgKiBwcCArIDAuNSAqIHA7XG5cdFx0dmFyIHNOID0gd04gKiBwcHAgLSB3TiAqIHBwO1xuXG5cdFx0Ly8gY29tYmluZSBkYXRhIGxpbmVhcmx5XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPVxuXHRcdFx0XHRcdHNQICogdmFsdWVzWyBvUCArIGkgXSArXG5cdFx0XHRcdFx0czAgKiB2YWx1ZXNbIG8wICsgaSBdICtcblx0XHRcdFx0XHRzMSAqIHZhbHVlc1sgbzEgKyBpIF0gK1xuXHRcdFx0XHRcdHNOICogdmFsdWVzWyBvTiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgQ3ViaWNJbnRlcnBvbGFudCB9O1xuIiwiaW1wb3J0IHsgSW50ZXJwb2xhbnQgfSBmcm9tICcuLi9JbnRlcnBvbGFudC5qcyc7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIExpbmVhckludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxufVxuXG5MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lYXJJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9mZnNldDEgPSBpMSAqIHN0cmlkZSxcblx0XHRcdG9mZnNldDAgPSBvZmZzZXQxIC0gc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQxID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0d2VpZ2h0MCA9IDEgLSB3ZWlnaHQxO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID1cblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDAgKyBpIF0gKiB3ZWlnaHQwICtcblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDEgKyBpIF0gKiB3ZWlnaHQxO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBMaW5lYXJJbnRlcnBvbGFudCB9O1xuIiwiaW1wb3J0IHsgSW50ZXJwb2xhbnQgfSBmcm9tICcuLi9JbnRlcnBvbGFudC5qcyc7XG5cbi8qKlxuICpcbiAqIEludGVycG9sYW50IHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBzYW1wbGUgdmFsdWUgYXQgdGhlIHBvc2l0aW9uIHByZWNlZWRpbmdcbiAqIHRoZSBwYXJhbWV0ZXIuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIERpc2NyZXRlSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cbkRpc2NyZXRlSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlzY3JldGVJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEgLyosIHQwLCB0LCB0MSAqLyApIHtcblxuXHRcdHJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oIGkxIC0gMSApO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IERpc2NyZXRlSW50ZXJwb2xhbnQgfTtcbiIsImltcG9ydCB7XG5cdEludGVycG9sYXRlTGluZWFyLFxuXHRJbnRlcnBvbGF0ZVNtb290aCxcblx0SW50ZXJwb2xhdGVEaXNjcmV0ZVxufSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgQ3ViaWNJbnRlcnBvbGFudCB9IGZyb20gJy4uL21hdGgvaW50ZXJwb2xhbnRzL0N1YmljSW50ZXJwb2xhbnQuanMnO1xuaW1wb3J0IHsgTGluZWFySW50ZXJwb2xhbnQgfSBmcm9tICcuLi9tYXRoL2ludGVycG9sYW50cy9MaW5lYXJJbnRlcnBvbGFudC5qcyc7XG5pbXBvcnQgeyBEaXNjcmV0ZUludGVycG9sYW50IH0gZnJvbSAnLi4vbWF0aC9pbnRlcnBvbGFudHMvRGlzY3JldGVJbnRlcnBvbGFudC5qcyc7XG5pbXBvcnQgeyBBbmltYXRpb25VdGlscyB9IGZyb20gJy4vQW5pbWF0aW9uVXRpbHMuanMnO1xuXG4vKipcbiAqXG4gKiBBIHRpbWVkIHNlcXVlbmNlIG9mIGtleWZyYW1lcyBmb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eS5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEtleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSB0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayBuYW1lIGlzIHVuZGVmaW5lZCcgKTtcblx0aWYgKCB0aW1lcyA9PT0gdW5kZWZpbmVkIHx8IHRpbWVzLmxlbmd0aCA9PT0gMCApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IG5vIGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCAnICsgbmFtZSApO1xuXG5cdHRoaXMubmFtZSA9IG5hbWU7XG5cblx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdGltZXMsIHRoaXMuVGltZUJ1ZmZlclR5cGUgKTtcblx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHZhbHVlcywgdGhpcy5WYWx1ZUJ1ZmZlclR5cGUgKTtcblxuXHR0aGlzLnNldEludGVycG9sYXRpb24oIGludGVycG9sYXRpb24gfHwgdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApO1xuXG59XG5cbi8vIFN0YXRpYyBtZXRob2RzXG5cbk9iamVjdC5hc3NpZ24oIEtleWZyYW1lVHJhY2ssIHtcblxuXHQvLyBTZXJpYWxpemF0aW9uIChpbiBzdGF0aWMgY29udGV4dCwgYmVjYXVzZSBvZiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uXG5cdC8vIGFuZCBhdXRvbWF0aWMgaW52b2NhdGlvbiBvZiAudG9KU09OKTpcblxuXHR0b0pTT046IGZ1bmN0aW9uICggdHJhY2sgKSB7XG5cblx0XHR2YXIgdHJhY2tUeXBlID0gdHJhY2suY29uc3RydWN0b3I7XG5cblx0XHR2YXIganNvbjtcblxuXHRcdC8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHRvSlNPTiBtZXRob2Rcblx0XHRpZiAoIHRyYWNrVHlwZS50b0pTT04gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0anNvbiA9IHRyYWNrVHlwZS50b0pTT04oIHRyYWNrICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBieSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhlIGRhdGEgY2FuIGJlIHNlcmlhbGl6ZWQgYXMtaXNcblx0XHRcdGpzb24gPSB7XG5cblx0XHRcdFx0J25hbWUnOiB0cmFjay5uYW1lLFxuXHRcdFx0XHQndGltZXMnOiBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRyYWNrLnRpbWVzLCBBcnJheSApLFxuXHRcdFx0XHQndmFsdWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay52YWx1ZXMsIEFycmF5IClcblxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGludGVycG9sYXRpb24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdHJhY2suRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0anNvbi5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0anNvbi50eXBlID0gdHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUsIHtcblxuXHRjb25zdHJ1Y3RvcjogS2V5ZnJhbWVUcmFjayxcblxuXHRUaW1lQnVmZmVyVHlwZTogRmxvYXQzMkFycmF5LFxuXG5cdFZhbHVlQnVmZmVyVHlwZTogRmxvYXQzMkFycmF5LFxuXG5cdERlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZUxpbmVhcixcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IERpc2NyZXRlSW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IExpbmVhckludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IGZ1bmN0aW9uICggcmVzdWx0ICkge1xuXG5cdFx0cmV0dXJuIG5ldyBDdWJpY0ludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRzZXRJbnRlcnBvbGF0aW9uOiBmdW5jdGlvbiAoIGludGVycG9sYXRpb24gKSB7XG5cblx0XHR2YXIgZmFjdG9yeU1ldGhvZDtcblxuXHRcdHN3aXRjaCAoIGludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVEaXNjcmV0ZTpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZUxpbmVhcjpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVTbW9vdGg6XG5cblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBmYWN0b3J5TWV0aG9kID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBtZXNzYWdlID0gXCJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciBcIiArXG5cdFx0XHRcdHRoaXMuVmFsdWVUeXBlTmFtZSArIFwiIGtleWZyYW1lIHRyYWNrIG5hbWVkIFwiICsgdGhpcy5uYW1lO1xuXG5cdFx0XHRpZiAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBmYWxsIGJhY2sgdG8gZGVmYXVsdCwgdW5sZXNzIHRoZSBkZWZhdWx0IGl0c2VsZiBpcyBtZXNzZWQgdXBcblx0XHRcdFx0aWYgKCBpbnRlcnBvbGF0aW9uICE9PSB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggbWVzc2FnZSApOyAvLyBmYXRhbCwgaW4gdGhpcyBjYXNlXG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLktleWZyYW1lVHJhY2s6JywgbWVzc2FnZSApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNyZWF0ZUludGVycG9sYW50ID0gZmFjdG9yeU1ldGhvZDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0c3dpdGNoICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCApIHtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZURpc2NyZXRlO1xuXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZUxpbmVhcjtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVTbW9vdGg7XG5cblx0XHR9XG5cblx0fSxcblxuXHRnZXRWYWx1ZVNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggLyB0aGlzLnRpbWVzLmxlbmd0aDtcblxuXHR9LFxuXG5cdC8vIG1vdmUgYWxsIGtleWZyYW1lcyBlaXRoZXIgZm9yd2FyZHMgb3IgYmFja3dhcmRzIGluIHRpbWVcblx0c2hpZnQ6IGZ1bmN0aW9uICggdGltZU9mZnNldCApIHtcblxuXHRcdGlmICggdGltZU9mZnNldCAhPT0gMC4wICkge1xuXG5cdFx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB0aW1lcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dGltZXNbIGkgXSArPSB0aW1lT2Zmc2V0O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHNjYWxlIGFsbCBrZXlmcmFtZSB0aW1lcyBieSBhIGZhY3RvciAodXNlZnVsIGZvciBmcmFtZSA8LT4gc2Vjb25kcyBjb252ZXJzaW9ucylcblx0c2NhbGU6IGZ1bmN0aW9uICggdGltZVNjYWxlICkge1xuXG5cdFx0aWYgKCB0aW1lU2NhbGUgIT09IDEuMCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHRpbWVzWyBpIF0gKj0gdGltZVNjYWxlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHJlbW92ZXMga2V5ZnJhbWVzIGJlZm9yZSBhbmQgYWZ0ZXIgYW5pbWF0aW9uIHdpdGhvdXQgY2hhbmdpbmcgYW55IHZhbHVlcyB3aXRoaW4gdGhlIHJhbmdlIFtzdGFydFRpbWUsIGVuZFRpbWVdLlxuXHQvLyBJTVBPUlRBTlQ6IFdlIGRvIG5vdCBzaGlmdCBhcm91bmQga2V5cyB0byB0aGUgc3RhcnQgb2YgdGhlIHRyYWNrIHRpbWUsIGJlY2F1c2UgZm9yIGludGVycG9sYXRlZCBrZXlzIHRoaXMgd2lsbCBjaGFuZ2UgdGhlaXIgdmFsdWVzXG5cdHRyaW06IGZ1bmN0aW9uICggc3RhcnRUaW1lLCBlbmRUaW1lICkge1xuXG5cdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdG5LZXlzID0gdGltZXMubGVuZ3RoLFxuXHRcdFx0ZnJvbSA9IDAsXG5cdFx0XHR0byA9IG5LZXlzIC0gMTtcblxuXHRcdHdoaWxlICggZnJvbSAhPT0gbktleXMgJiYgdGltZXNbIGZyb20gXSA8IHN0YXJ0VGltZSApIHtcblxuXHRcdFx0KysgZnJvbTtcblxuXHRcdH1cblxuXHRcdHdoaWxlICggdG8gIT09IC0gMSAmJiB0aW1lc1sgdG8gXSA+IGVuZFRpbWUgKSB7XG5cblx0XHRcdC0tIHRvO1xuXG5cdFx0fVxuXG5cdFx0KysgdG87IC8vIGluY2x1c2l2ZSAtPiBleGNsdXNpdmUgYm91bmRcblxuXHRcdGlmICggZnJvbSAhPT0gMCB8fCB0byAhPT0gbktleXMgKSB7XG5cblx0XHRcdC8vIGVtcHR5IHRyYWNrcyBhcmUgZm9yYmlkZGVuLCBzbyBrZWVwIGF0IGxlYXN0IG9uZSBrZXlmcmFtZVxuXHRcdFx0aWYgKCBmcm9tID49IHRvICkgdG8gPSBNYXRoLm1heCggdG8sIDEgKSwgZnJvbSA9IHRvIC0gMTtcblxuXHRcdFx0dmFyIHN0cmlkZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7XG5cdFx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIGZyb20sIHRvICk7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudmFsdWVzLCBmcm9tICogc3RyaWRlLCB0byAqIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBlbnN1cmUgd2UgZG8gbm90IGdldCBhIEdhcmJhZ2VJbkdhcmJhZ2VPdXQgc2l0dWF0aW9uLCBtYWtlIHN1cmUgdHJhY2tzIGFyZSBhdCBsZWFzdCBtaW5pbWFsbHkgdmlhYmxlXG5cdHZhbGlkYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmFsaWQgPSB0cnVlO1xuXG5cdFx0dmFyIHZhbHVlU2l6ZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7XG5cdFx0aWYgKCB2YWx1ZVNpemUgLSBNYXRoLmZsb29yKCB2YWx1ZVNpemUgKSAhPT0gMCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4nLCB0aGlzICk7XG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdHZhbHVlcyA9IHRoaXMudmFsdWVzLFxuXG5cdFx0XHRuS2V5cyA9IHRpbWVzLmxlbmd0aDtcblxuXHRcdGlmICggbktleXMgPT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4nLCB0aGlzICk7XG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHByZXZUaW1lID0gbnVsbDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbktleXM7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjdXJyVGltZSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdGlmICggdHlwZW9mIGN1cnJUaW1lID09PSAnbnVtYmVyJyAmJiBpc05hTiggY3VyclRpbWUgKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuJywgdGhpcywgaSwgY3VyclRpbWUgKTtcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBwcmV2VGltZSAhPT0gbnVsbCAmJiBwcmV2VGltZSA+IGN1cnJUaW1lICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4nLCB0aGlzLCBpLCBjdXJyVGltZSwgcHJldlRpbWUgKTtcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0cHJldlRpbWUgPSBjdXJyVGltZTtcblxuXHRcdH1cblxuXHRcdGlmICggdmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCB2YWx1ZXMgKSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB2YWx1ZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0dmFyIHZhbHVlID0gdmFsdWVzWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIGlzTmFOKCB2YWx1ZSApICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLicsIHRoaXMsIGksIHZhbHVlICk7XG5cdFx0XHRcdFx0XHR2YWxpZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsaWQ7XG5cblx0fSxcblxuXHQvLyByZW1vdmVzIGVxdWl2YWxlbnQgc2VxdWVudGlhbCBrZXlzIGFzIGNvbW1vbiBpbiBtb3JwaCB0YXJnZXQgc2VxdWVuY2VzXG5cdC8vICgwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDApIC0tPiAoMCwwLDEsMSwwLDApXG5cdG9wdGltaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzLFxuXHRcdFx0dmFsdWVzID0gdGhpcy52YWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpLFxuXG5cdFx0XHRzbW9vdGhJbnRlcnBvbGF0aW9uID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IEludGVycG9sYXRlU21vb3RoLFxuXG5cdFx0XHR3cml0ZUluZGV4ID0gMSxcblx0XHRcdGxhc3RJbmRleCA9IHRpbWVzLmxlbmd0aCAtIDE7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDE7IGkgPCBsYXN0SW5kZXg7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBrZWVwID0gZmFsc2U7XG5cblx0XHRcdHZhciB0aW1lID0gdGltZXNbIGkgXTtcblx0XHRcdHZhciB0aW1lTmV4dCA9IHRpbWVzWyBpICsgMSBdO1xuXG5cdFx0XHQvLyByZW1vdmUgYWRqYWNlbnQga2V5ZnJhbWVzIHNjaGVkdWxlZCBhdCB0aGUgc2FtZSB0aW1lXG5cblx0XHRcdGlmICggdGltZSAhPT0gdGltZU5leHQgJiYgKCBpICE9PSAxIHx8IHRpbWUgIT09IHRpbWVbIDAgXSApICkge1xuXG5cdFx0XHRcdGlmICggISBzbW9vdGhJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdFx0Ly8gcmVtb3ZlIHVubmVjZXNzYXJ5IGtleWZyYW1lcyBzYW1lIGFzIHRoZWlyIG5laWdoYm9yc1xuXG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IGkgKiBzdHJpZGUsXG5cdFx0XHRcdFx0XHRvZmZzZXRQID0gb2Zmc2V0IC0gc3RyaWRlLFxuXHRcdFx0XHRcdFx0b2Zmc2V0TiA9IG9mZnNldCArIHN0cmlkZTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSB2YWx1ZXNbIG9mZnNldCArIGogXTtcblxuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXRQICsgaiBdIHx8XG5cdFx0XHRcdFx0XHRcdHZhbHVlICE9PSB2YWx1ZXNbIG9mZnNldE4gKyBqIF0gKSB7XG5cblx0XHRcdFx0XHRcdFx0a2VlcCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBpbi1wbGFjZSBjb21wYWN0aW9uXG5cblx0XHRcdGlmICgga2VlcCApIHtcblxuXHRcdFx0XHRpZiAoIGkgIT09IHdyaXRlSW5kZXggKSB7XG5cblx0XHRcdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGkgXTtcblxuXHRcdFx0XHRcdHZhciByZWFkT2Zmc2V0ID0gaSAqIHN0cmlkZSxcblx0XHRcdFx0XHRcdHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQrKyB3cml0ZUluZGV4O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBmbHVzaCBsYXN0IGtleWZyYW1lIChjb21wYWN0aW9uIGxvb2tzIGFoZWFkKVxuXG5cdFx0aWYgKCBsYXN0SW5kZXggPiAwICkge1xuXG5cdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgcmVhZE9mZnNldCA9IGxhc3RJbmRleCAqIHN0cmlkZSwgd3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlLCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdHZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Kysgd3JpdGVJbmRleDtcblxuXHRcdH1cblxuXHRcdGlmICggd3JpdGVJbmRleCAhPT0gdGltZXMubGVuZ3RoICkge1xuXG5cdFx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIDAsIHdyaXRlSW5kZXggKTtcblx0XHRcdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdmFsdWVzLCAwLCB3cml0ZUluZGV4ICogc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuZXhwb3J0IHsgS2V5ZnJhbWVUcmFjayB9O1xuIiwiaW1wb3J0IHsgSW50ZXJwb2xhdGVEaXNjcmV0ZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi4vS2V5ZnJhbWVUcmFjay5qcyc7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgQm9vbGVhbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBCb29sZWFuS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcyApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKTtcblxufVxuXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJvb2xlYW5LZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdib29sJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWRcblxuXHQvLyBOb3RlOiBBY3R1YWxseSB0aGlzIHRyYWNrIGNvdWxkIGhhdmUgYSBvcHRpbWl6ZWQgLyBjb21wcmVzc2VkXG5cdC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGFuZCBhIGN1c3RvbSBpbnRlcnBvbGFudCB0aGF0XG5cdC8vIGNvbXB1dGVzIFwiZmlyc3RWYWx1ZSBeIGlzT2RkKCBpbmRleCApXCIuXG5cbn0gKTtcblxuZXhwb3J0IHsgQm9vbGVhbktleWZyYW1lVHJhY2sgfTtcbiIsImltcG9ydCB7IEtleWZyYW1lVHJhY2sgfSBmcm9tICcuLi9LZXlmcmFtZVRyYWNrLmpzJztcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBrZXlmcmFtZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgY29sb3IuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBDb2xvcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuQ29sb3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ29sb3JLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdjb2xvcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cblx0Ly8gTm90ZTogVmVyeSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBhbmQgbm90aGluZyBzcGVjaWFsIHlldC5cblx0Ly8gSG93ZXZlciwgdGhpcyBpcyB0aGUgcGxhY2UgZm9yIGNvbG9yIHNwYWNlIHBhcmFtZXRlcml6YXRpb24uXG5cbn0gKTtcblxuZXhwb3J0IHsgQ29sb3JLZXlmcmFtZVRyYWNrIH07XG4iLCJpbXBvcnQgeyBLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi4vS2V5ZnJhbWVUcmFjay5qcyc7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgbnVtZXJpYyBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIE51bWJlcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuTnVtYmVyS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE51bWJlcktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ251bWJlcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cbn0gKTtcblxuZXhwb3J0IHsgTnVtYmVyS2V5ZnJhbWVUcmFjayB9O1xuIiwiaW1wb3J0IHsgSW50ZXJwb2xhbnQgfSBmcm9tICcuLi9JbnRlcnBvbGFudC5qcyc7XG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vUXVhdGVybmlvbi5qcyc7XG5cbi8qKlxuICogU3BoZXJpY2FsIGxpbmVhciB1bml0IHF1YXRlcm5pb24gaW50ZXJwb2xhbnQuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9mZnNldCA9IGkxICogc3RyaWRlLFxuXG5cdFx0XHRhbHBoYSA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKTtcblxuXHRcdGZvciAoIHZhciBlbmQgPSBvZmZzZXQgKyBzdHJpZGU7IG9mZnNldCAhPT0gZW5kOyBvZmZzZXQgKz0gNCApIHtcblxuXHRcdFx0UXVhdGVybmlvbi5zbGVycEZsYXQoIHJlc3VsdCwgMCwgdmFsdWVzLCBvZmZzZXQgLSBzdHJpZGUsIHZhbHVlcywgb2Zmc2V0LCBhbHBoYSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQgfTtcbiIsImltcG9ydCB7IEludGVycG9sYXRlTGluZWFyIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IEtleWZyYW1lVHJhY2sgfSBmcm9tICcuLi9LZXlmcmFtZVRyYWNrLmpzJztcbmltcG9ydCB7IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCB9IGZyb20gJy4uLy4uL21hdGgvaW50ZXJwb2xhbnRzL1F1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5qcyc7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgcXVhdGVybmlvbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUXVhdGVybmlvbktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3F1YXRlcm5pb24nLFxuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZCAvLyBub3QgeWV0IGltcGxlbWVudGVkXG5cbn0gKTtcblxuZXhwb3J0IHsgUXVhdGVybmlvbktleWZyYW1lVHJhY2sgfTtcbiIsImltcG9ydCB7IEludGVycG9sYXRlRGlzY3JldGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4uL0tleWZyYW1lVHJhY2suanMnO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIHRoYXQgaW50ZXJwb2xhdGVzIFN0cmluZ3NcbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFN0cmluZ0tleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFN0cmluZ0tleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3N0cmluZycsXG5cdFZhbHVlQnVmZmVyVHlwZTogQXJyYXksXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlRGlzY3JldGUsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiB1bmRlZmluZWQsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWRcblxufSApO1xuXG5leHBvcnQgeyBTdHJpbmdLZXlmcmFtZVRyYWNrIH07XG4iLCJpbXBvcnQgeyBLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi4vS2V5ZnJhbWVUcmFjay5qcyc7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgdmVjdG9yZWQga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5WZWN0b3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogVmVjdG9yS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAndmVjdG9yJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG5leHBvcnQgeyBWZWN0b3JLZXlmcmFtZVRyYWNrIH07XG4iLCJpbXBvcnQgeyBBbmltYXRpb25VdGlscyB9IGZyb20gJy4vQW5pbWF0aW9uVXRpbHMuanMnO1xuaW1wb3J0IHsgS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vS2V5ZnJhbWVUcmFjay5qcyc7XG5pbXBvcnQgeyBCb29sZWFuS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vdHJhY2tzL0Jvb2xlYW5LZXlmcmFtZVRyYWNrLmpzJztcbmltcG9ydCB7IENvbG9yS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vdHJhY2tzL0NvbG9yS2V5ZnJhbWVUcmFjay5qcyc7XG5pbXBvcnQgeyBOdW1iZXJLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi90cmFja3MvTnVtYmVyS2V5ZnJhbWVUcmFjay5qcyc7XG5pbXBvcnQgeyBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vdHJhY2tzL1F1YXRlcm5pb25LZXlmcmFtZVRyYWNrLmpzJztcbmltcG9ydCB7IFN0cmluZ0tleWZyYW1lVHJhY2sgfSBmcm9tICcuL3RyYWNrcy9TdHJpbmdLZXlmcmFtZVRyYWNrLmpzJztcbmltcG9ydCB7IFZlY3RvcktleWZyYW1lVHJhY2sgfSBmcm9tICcuL3RyYWNrcy9WZWN0b3JLZXlmcmFtZVRyYWNrLmpzJztcbmltcG9ydCB7IF9NYXRoIH0gZnJvbSAnLi4vbWF0aC9NYXRoLmpzJztcblxuLyoqXG4gKlxuICogUmV1c2FibGUgc2V0IG9mIFRyYWNrcyB0aGF0IHJlcHJlc2VudCBhbiBhbmltYXRpb24uXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbkNsaXAoIG5hbWUsIGR1cmF0aW9uLCB0cmFja3MgKSB7XG5cblx0dGhpcy5uYW1lID0gbmFtZTtcblx0dGhpcy50cmFja3MgPSB0cmFja3M7XG5cdHRoaXMuZHVyYXRpb24gPSAoIGR1cmF0aW9uICE9PSB1bmRlZmluZWQgKSA/IGR1cmF0aW9uIDogLSAxO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdC8vIHRoaXMgbWVhbnMgaXQgc2hvdWxkIGZpZ3VyZSBvdXQgaXRzIGR1cmF0aW9uIGJ5IHNjYW5uaW5nIHRoZSB0cmFja3Ncblx0aWYgKCB0aGlzLmR1cmF0aW9uIDwgMCApIHtcblxuXHRcdHRoaXMucmVzZXREdXJhdGlvbigpO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBnZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lKCB0eXBlTmFtZSApIHtcblxuXHRzd2l0Y2ggKCB0eXBlTmFtZS50b0xvd2VyQ2FzZSgpICkge1xuXG5cdFx0Y2FzZSAnc2NhbGFyJzpcblx0XHRjYXNlICdkb3VibGUnOlxuXHRcdGNhc2UgJ2Zsb2F0Jzpcblx0XHRjYXNlICdudW1iZXInOlxuXHRcdGNhc2UgJ2ludGVnZXInOlxuXG5cdFx0XHRyZXR1cm4gTnVtYmVyS2V5ZnJhbWVUcmFjaztcblxuXHRcdGNhc2UgJ3ZlY3Rvcic6XG5cdFx0Y2FzZSAndmVjdG9yMic6XG5cdFx0Y2FzZSAndmVjdG9yMyc6XG5cdFx0Y2FzZSAndmVjdG9yNCc6XG5cblx0XHRcdHJldHVybiBWZWN0b3JLZXlmcmFtZVRyYWNrO1xuXG5cdFx0Y2FzZSAnY29sb3InOlxuXG5cdFx0XHRyZXR1cm4gQ29sb3JLZXlmcmFtZVRyYWNrO1xuXG5cdFx0Y2FzZSAncXVhdGVybmlvbic6XG5cblx0XHRcdHJldHVybiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaztcblxuXHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdGNhc2UgJ2Jvb2xlYW4nOlxuXG5cdFx0XHRyZXR1cm4gQm9vbGVhbktleWZyYW1lVHJhY2s7XG5cblx0XHRjYXNlICdzdHJpbmcnOlxuXG5cdFx0XHRyZXR1cm4gU3RyaW5nS2V5ZnJhbWVUcmFjaztcblxuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVW5zdXBwb3J0ZWQgdHlwZU5hbWU6ICcgKyB0eXBlTmFtZSApO1xuXG59XG5cbmZ1bmN0aW9uIHBhcnNlS2V5ZnJhbWVUcmFjaygganNvbiApIHtcblxuXHRpZiAoIGpzb24udHlwZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UnICk7XG5cblx0fVxuXG5cdHZhciB0cmFja1R5cGUgPSBnZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lKCBqc29uLnR5cGUgKTtcblxuXHRpZiAoIGpzb24udGltZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHZhciB0aW1lcyA9IFtdLCB2YWx1ZXMgPSBbXTtcblxuXHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBqc29uLmtleXMsIHRpbWVzLCB2YWx1ZXMsICd2YWx1ZScgKTtcblxuXHRcdGpzb24udGltZXMgPSB0aW1lcztcblx0XHRqc29uLnZhbHVlcyA9IHZhbHVlcztcblxuXHR9XG5cblx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgcGFyc2UgbWV0aG9kXG5cdGlmICggdHJhY2tUeXBlLnBhcnNlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRyZXR1cm4gdHJhY2tUeXBlLnBhcnNlKCBqc29uICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSBhIGNvbnN0cnVjdG9yIGNvbXBhdGlibGUgd2l0aCB0aGUgYmFzZVxuXHRcdHJldHVybiBuZXcgdHJhY2tUeXBlKCBqc29uLm5hbWUsIGpzb24udGltZXMsIGpzb24udmFsdWVzLCBqc29uLmludGVycG9sYXRpb24gKTtcblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQ2xpcCwge1xuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gW10sXG5cdFx0XHRqc29uVHJhY2tzID0ganNvbi50cmFja3MsXG5cdFx0XHRmcmFtZVRpbWUgPSAxLjAgLyAoIGpzb24uZnBzIHx8IDEuMCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0ganNvblRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHRyYWNrcy5wdXNoKCBwYXJzZUtleWZyYW1lVHJhY2soIGpzb25UcmFja3NbIGkgXSApLnNjYWxlKCBmcmFtZVRpbWUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBqc29uLm5hbWUsIGpzb24uZHVyYXRpb24sIHRyYWNrcyApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIGNsaXAgKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gW10sXG5cdFx0XHRjbGlwVHJhY2tzID0gY2xpcC50cmFja3M7XG5cblx0XHR2YXIganNvbiA9IHtcblxuXHRcdFx0J25hbWUnOiBjbGlwLm5hbWUsXG5cdFx0XHQnZHVyYXRpb24nOiBjbGlwLmR1cmF0aW9uLFxuXHRcdFx0J3RyYWNrcyc6IHRyYWNrcyxcblx0XHRcdCd1dWlkJzogY2xpcC51dWlkXG5cblx0XHR9O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gY2xpcFRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHRyYWNrcy5wdXNoKCBLZXlmcmFtZVRyYWNrLnRvSlNPTiggY2xpcFRyYWNrc1sgaSBdICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBqc29uO1xuXG5cdH0sXG5cblx0Q3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2U6IGZ1bmN0aW9uICggbmFtZSwgbW9ycGhUYXJnZXRTZXF1ZW5jZSwgZnBzLCBub0xvb3AgKSB7XG5cblx0XHR2YXIgbnVtTW9ycGhUYXJnZXRzID0gbW9ycGhUYXJnZXRTZXF1ZW5jZS5sZW5ndGg7XG5cdFx0dmFyIHRyYWNrcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbnVtTW9ycGhUYXJnZXRzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdGltZXMgPSBbXTtcblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0dGltZXMucHVzaChcblx0XHRcdFx0KCBpICsgbnVtTW9ycGhUYXJnZXRzIC0gMSApICUgbnVtTW9ycGhUYXJnZXRzLFxuXHRcdFx0XHRpLFxuXHRcdFx0XHQoIGkgKyAxICkgJSBudW1Nb3JwaFRhcmdldHMgKTtcblxuXHRcdFx0dmFsdWVzLnB1c2goIDAsIDEsIDAgKTtcblxuXHRcdFx0dmFyIG9yZGVyID0gQW5pbWF0aW9uVXRpbHMuZ2V0S2V5ZnJhbWVPcmRlciggdGltZXMgKTtcblx0XHRcdHRpbWVzID0gQW5pbWF0aW9uVXRpbHMuc29ydGVkQXJyYXkoIHRpbWVzLCAxLCBvcmRlciApO1xuXHRcdFx0dmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuc29ydGVkQXJyYXkoIHZhbHVlcywgMSwgb3JkZXIgKTtcblxuXHRcdFx0Ly8gaWYgdGhlcmUgaXMgYSBrZXkgYXQgdGhlIGZpcnN0IGZyYW1lLCBkdXBsaWNhdGUgaXQgYXMgdGhlXG5cdFx0XHQvLyBsYXN0IGZyYW1lIGFzIHdlbGwgZm9yIHBlcmZlY3QgbG9vcC5cblx0XHRcdGlmICggISBub0xvb3AgJiYgdGltZXNbIDAgXSA9PT0gMCApIHtcblxuXHRcdFx0XHR0aW1lcy5wdXNoKCBudW1Nb3JwaFRhcmdldHMgKTtcblx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlc1sgMCBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dHJhY2tzLnB1c2goXG5cdFx0XHRcdG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKFxuXHRcdFx0XHRcdCcubW9ycGhUYXJnZXRJbmZsdWVuY2VzWycgKyBtb3JwaFRhcmdldFNlcXVlbmNlWyBpIF0ubmFtZSArICddJyxcblx0XHRcdFx0XHR0aW1lcywgdmFsdWVzXG5cdFx0XHRcdCkuc2NhbGUoIDEuMCAvIGZwcyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIG5hbWUsIC0gMSwgdHJhY2tzICk7XG5cblx0fSxcblxuXHRmaW5kQnlOYW1lOiBmdW5jdGlvbiAoIG9iamVjdE9yQ2xpcEFycmF5LCBuYW1lICkge1xuXG5cdFx0dmFyIGNsaXBBcnJheSA9IG9iamVjdE9yQ2xpcEFycmF5O1xuXG5cdFx0aWYgKCAhIEFycmF5LmlzQXJyYXkoIG9iamVjdE9yQ2xpcEFycmF5ICkgKSB7XG5cblx0XHRcdHZhciBvID0gb2JqZWN0T3JDbGlwQXJyYXk7XG5cdFx0XHRjbGlwQXJyYXkgPSBvLmdlb21ldHJ5ICYmIG8uZ2VvbWV0cnkuYW5pbWF0aW9ucyB8fCBvLmFuaW1hdGlvbnM7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjbGlwQXJyYXkubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGNsaXBBcnJheVsgaSBdLm5hbWUgPT09IG5hbWUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGNsaXBBcnJheVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9LFxuXG5cdENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzOiBmdW5jdGlvbiAoIG1vcnBoVGFyZ2V0cywgZnBzLCBub0xvb3AgKSB7XG5cblx0XHR2YXIgYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgPSB7fTtcblxuXHRcdC8vIHRlc3RlZCB3aXRoIGh0dHBzOi8vcmVnZXgxMDEuY29tLyBvbiB0cmljayBzZXF1ZW5jZXNcblx0XHQvLyBzdWNoIGZsYW1pbmdvX2ZseUFfMDAzLCBmbGFtaW5nb19ydW4xXzAwMywgY3JkZWF0aDAwNTlcblx0XHR2YXIgcGF0dGVybiA9IC9eKFtcXHctXSo/KShbXFxkXSspJC87XG5cblx0XHQvLyBzb3J0IG1vcnBoIHRhcmdldCBuYW1lcyBpbnRvIGFuaW1hdGlvbiBncm91cHMgYmFzZWRcblx0XHQvLyBwYXR0ZXJucyBsaWtlIFdhbGtfMDAxLCBXYWxrXzAwMiwgUnVuXzAwMSwgUnVuXzAwMlxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXHRcdFx0dmFyIHBhcnRzID0gbW9ycGhUYXJnZXQubmFtZS5tYXRjaCggcGF0dGVybiApO1xuXG5cdFx0XHRpZiAoIHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdFx0dmFyIG5hbWUgPSBwYXJ0c1sgMSBdO1xuXG5cdFx0XHRcdHZhciBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdO1xuXHRcdFx0XHRpZiAoICEgYW5pbWF0aW9uTW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0YW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXSA9IGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IFtdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhbmltYXRpb25Nb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGNsaXBzID0gW107XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0Y2xpcHMucHVzaCggQW5pbWF0aW9uQ2xpcC5DcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSggbmFtZSwgYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXSwgZnBzLCBub0xvb3AgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsaXBzO1xuXG5cdH0sXG5cblx0Ly8gcGFyc2UgdGhlIGFuaW1hdGlvbi5oaWVyYXJjaHkgZm9ybWF0XG5cdHBhcnNlQW5pbWF0aW9uOiBmdW5jdGlvbiAoIGFuaW1hdGlvbiwgYm9uZXMgKSB7XG5cblx0XHRpZiAoICEgYW5pbWF0aW9uICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4nICk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHZhciBhZGROb25lbXB0eVRyYWNrID0gZnVuY3Rpb24gKCB0cmFja1R5cGUsIHRyYWNrTmFtZSwgYW5pbWF0aW9uS2V5cywgcHJvcGVydHlOYW1lLCBkZXN0VHJhY2tzICkge1xuXG5cdFx0XHQvLyBvbmx5IHJldHVybiB0cmFjayBpZiB0aGVyZSBhcmUgYWN0dWFsbHkga2V5cy5cblx0XHRcdGlmICggYW5pbWF0aW9uS2V5cy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0XHRBbmltYXRpb25VdGlscy5mbGF0dGVuSlNPTiggYW5pbWF0aW9uS2V5cywgdGltZXMsIHZhbHVlcywgcHJvcGVydHlOYW1lICk7XG5cblx0XHRcdFx0Ly8gZW1wdHkga2V5cyBhcmUgZmlsdGVyZWQgb3V0LCBzbyBjaGVjayBhZ2FpblxuXHRcdFx0XHRpZiAoIHRpbWVzLmxlbmd0aCAhPT0gMCApIHtcblxuXHRcdFx0XHRcdGRlc3RUcmFja3MucHVzaCggbmV3IHRyYWNrVHlwZSggdHJhY2tOYW1lLCB0aW1lcywgdmFsdWVzICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0XHR2YXIgdHJhY2tzID0gW107XG5cblx0XHR2YXIgY2xpcE5hbWUgPSBhbmltYXRpb24ubmFtZSB8fCAnZGVmYXVsdCc7XG5cdFx0Ly8gYXV0b21hdGljIGxlbmd0aCBkZXRlcm1pbmF0aW9uIGluIEFuaW1hdGlvbkNsaXAuXG5cdFx0dmFyIGR1cmF0aW9uID0gYW5pbWF0aW9uLmxlbmd0aCB8fCAtIDE7XG5cdFx0dmFyIGZwcyA9IGFuaW1hdGlvbi5mcHMgfHwgMzA7XG5cblx0XHR2YXIgaGllcmFyY2h5VHJhY2tzID0gYW5pbWF0aW9uLmhpZXJhcmNoeSB8fCBbXTtcblxuXHRcdGZvciAoIHZhciBoID0gMDsgaCA8IGhpZXJhcmNoeVRyYWNrcy5sZW5ndGg7IGggKysgKSB7XG5cblx0XHRcdHZhciBhbmltYXRpb25LZXlzID0gaGllcmFyY2h5VHJhY2tzWyBoIF0ua2V5cztcblxuXHRcdFx0Ly8gc2tpcCBlbXB0eSB0cmFja3Ncblx0XHRcdGlmICggISBhbmltYXRpb25LZXlzIHx8IGFuaW1hdGlvbktleXMubGVuZ3RoID09PSAwICkgY29udGludWU7XG5cblx0XHRcdC8vIHByb2Nlc3MgbW9ycGggdGFyZ2V0c1xuXHRcdFx0aWYgKCBhbmltYXRpb25LZXlzWyAwIF0ubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdC8vIGZpZ3VyZSBvdXQgYWxsIG1vcnBoIHRhcmdldHMgdXNlZCBpbiB0aGlzIHRyYWNrXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldE5hbWVzID0ge307XG5cblx0XHRcdFx0Zm9yICggdmFyIGsgPSAwOyBrIDwgYW5pbWF0aW9uS2V5cy5sZW5ndGg7IGsgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBtID0gMDsgbSA8IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyBtICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG1vcnBoVGFyZ2V0TmFtZXNbIGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHNbIG0gXSBdID0gLSAxO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGNyZWF0ZSBhIHRyYWNrIGZvciBlYWNoIG1vcnBoIHRhcmdldCB3aXRoIGFsbCB6ZXJvXG5cdFx0XHRcdC8vIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBleGNlcHQgZm9yIHRoZSBrZXlzIGluIHdoaWNoXG5cdFx0XHRcdC8vIHRoZSBtb3JwaFRhcmdldCBpcyBuYW1lZC5cblx0XHRcdFx0Zm9yICggdmFyIG1vcnBoVGFyZ2V0TmFtZSBpbiBtb3JwaFRhcmdldE5hbWVzICkge1xuXG5cdFx0XHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIG0gPSAwOyBtICE9PSBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgKysgbSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGFuaW1hdGlvbktleSA9IGFuaW1hdGlvbktleXNbIGsgXTtcblxuXHRcdFx0XHRcdFx0dGltZXMucHVzaCggYW5pbWF0aW9uS2V5LnRpbWUgKTtcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCAoIGFuaW1hdGlvbktleS5tb3JwaFRhcmdldCA9PT0gbW9ycGhUYXJnZXROYW1lICkgPyAxIDogMCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dHJhY2tzLnB1c2goIG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKCAnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWycgKyBtb3JwaFRhcmdldE5hbWUgKyAnXScsIHRpbWVzLCB2YWx1ZXMgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkdXJhdGlvbiA9IG1vcnBoVGFyZ2V0TmFtZXMubGVuZ3RoICogKCBmcHMgfHwgMS4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gLi4uYXNzdW1lIHNrZWxldGFsIGFuaW1hdGlvblxuXG5cdFx0XHRcdHZhciBib25lTmFtZSA9ICcuYm9uZXNbJyArIGJvbmVzWyBoIF0ubmFtZSArICddJztcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5wb3NpdGlvbicsXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3BvcycsIHRyYWNrcyApO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0UXVhdGVybmlvbktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5xdWF0ZXJuaW9uJyxcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAncm90JywgdHJhY2tzICk7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcuc2NhbGUnLFxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdzY2wnLCB0cmFja3MgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0cmFja3MubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHZhciBjbGlwID0gbmV3IEFuaW1hdGlvbkNsaXAoIGNsaXBOYW1lLCBkdXJhdGlvbiwgdHJhY2tzICk7XG5cblx0XHRyZXR1cm4gY2xpcDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQ2xpcC5wcm90b3R5cGUsIHtcblxuXHRyZXNldER1cmF0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gdGhpcy50cmFja3MsIGR1cmF0aW9uID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciB0cmFjayA9IHRoaXMudHJhY2tzWyBpIF07XG5cblx0XHRcdGR1cmF0aW9uID0gTWF0aC5tYXgoIGR1cmF0aW9uLCB0cmFjay50aW1lc1sgdHJhY2sudGltZXMubGVuZ3RoIC0gMSBdICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyaW06IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy50cmFja3NbIGkgXS50cmltKCAwLCB0aGlzLmR1cmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHZhbGlkYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmFsaWQgPSB0cnVlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YWxpZCA9IHZhbGlkICYmIHRoaXMudHJhY2tzWyBpIF0udmFsaWRhdGUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB2YWxpZDtcblxuXHR9LFxuXG5cdG9wdGltaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudHJhY2tzWyBpIF0ub3B0aW1pemUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IEFuaW1hdGlvbkNsaXAgfTtcbiIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vRmlsZUxvYWRlci5qcyc7XG5pbXBvcnQgeyBEZWZhdWx0TG9hZGluZ01hbmFnZXIgfSBmcm9tICcuL0xvYWRpbmdNYW5hZ2VyLmpzJztcbmltcG9ydCAqIGFzIE1hdGVyaWFscyBmcm9tICcuLi9tYXRlcmlhbHMvTWF0ZXJpYWxzLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIE1hdGVyaWFsTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXHR0aGlzLnRleHR1cmVzID0ge307XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0ZXJpYWxMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdG9uTG9hZCggc2NvcGUucGFyc2UoIEpTT04ucGFyc2UoIHRleHQgKSApICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRzZXRUZXh0dXJlczogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMudGV4dHVyZXMgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB0aGlzLnRleHR1cmVzO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VGV4dHVyZSggbmFtZSApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlJywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0ZXh0dXJlc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsc1sganNvbi50eXBlIF0oKTtcblxuXHRcdGlmICgganNvbi51dWlkICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51dWlkID0ganNvbi51dWlkO1xuXHRcdGlmICgganNvbi5uYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5uYW1lID0ganNvbi5uYW1lO1xuXHRcdGlmICgganNvbi5jb2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3Iuc2V0SGV4KCBqc29uLmNvbG9yICk7XG5cdFx0aWYgKCBqc29uLnJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm91Z2huZXNzID0ganNvbi5yb3VnaG5lc3M7XG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzID0ganNvbi5tZXRhbG5lc3M7XG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZS5zZXRIZXgoIGpzb24uZW1pc3NpdmUgKTtcblx0XHRpZiAoIGpzb24uc3BlY3VsYXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyLnNldEhleCgganNvbi5zcGVjdWxhciApO1xuXHRcdGlmICgganNvbi5zaGluaW5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoaW5pbmVzcyA9IGpzb24uc2hpbmluZXNzO1xuXHRcdGlmICgganNvbi5jbGVhckNvYXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyQ29hdCA9IGpzb24uY2xlYXJDb2F0O1xuXHRcdGlmICgganNvbi5jbGVhckNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyA9IGpzb24uY2xlYXJDb2F0Um91Z2huZXNzO1xuXHRcdGlmICgganNvbi51bmlmb3JtcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudW5pZm9ybXMgPSBqc29uLnVuaWZvcm1zO1xuXHRcdGlmICgganNvbi52ZXJ0ZXhTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZlcnRleFNoYWRlciA9IGpzb24udmVydGV4U2hhZGVyO1xuXHRcdGlmICgganNvbi5mcmFnbWVudFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgPSBqc29uLmZyYWdtZW50U2hhZGVyO1xuXHRcdGlmICgganNvbi52ZXJ0ZXhDb2xvcnMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZlcnRleENvbG9ycyA9IGpzb24udmVydGV4Q29sb3JzO1xuXHRcdGlmICgganNvbi5mb2cgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZvZyA9IGpzb24uZm9nO1xuXHRcdGlmICgganNvbi5mbGF0U2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBqc29uLmZsYXRTaGFkaW5nO1xuXHRcdGlmICgganNvbi5ibGVuZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRpbmcgPSBqc29uLmJsZW5kaW5nO1xuXHRcdGlmICgganNvbi5zaWRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaWRlID0ganNvbi5zaWRlO1xuXHRcdGlmICgganNvbi5vcGFjaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5vcGFjaXR5ID0ganNvbi5vcGFjaXR5O1xuXHRcdGlmICgganNvbi50cmFuc3BhcmVudCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudHJhbnNwYXJlbnQgPSBqc29uLnRyYW5zcGFyZW50O1xuXHRcdGlmICgganNvbi5hbHBoYVRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhVGVzdCA9IGpzb24uYWxwaGFUZXN0O1xuXHRcdGlmICgganNvbi5kZXB0aFRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlcHRoVGVzdCA9IGpzb24uZGVwdGhUZXN0O1xuXHRcdGlmICgganNvbi5kZXB0aFdyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFdyaXRlID0ganNvbi5kZXB0aFdyaXRlO1xuXHRcdGlmICgganNvbi5jb2xvcldyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvcldyaXRlID0ganNvbi5jb2xvcldyaXRlO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZSA9IGpzb24ud2lyZWZyYW1lO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5ld2lkdGggIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aCA9IGpzb24ud2lyZWZyYW1lTGluZXdpZHRoO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5lY2FwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lY2FwID0ganNvbi53aXJlZnJhbWVMaW5lY2FwO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5lam9pbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWpvaW4gPSBqc29uLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdFx0aWYgKCBqc29uLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3RhdGlvbiA9IGpzb24ucm90YXRpb247XG5cblx0XHRpZiAoIGpzb24ubGluZXdpZHRoICE9PSAxICkgbWF0ZXJpYWwubGluZXdpZHRoID0ganNvbi5saW5ld2lkdGg7XG5cdFx0aWYgKCBqc29uLmRhc2hTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kYXNoU2l6ZSA9IGpzb24uZGFzaFNpemU7XG5cdFx0aWYgKCBqc29uLmdhcFNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdhcFNpemUgPSBqc29uLmdhcFNpemU7XG5cdFx0aWYgKCBqc29uLnNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zY2FsZSA9IGpzb24uc2NhbGU7XG5cblx0XHRpZiAoIGpzb24ucG9seWdvbk9mZnNldCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldCA9IGpzb24ucG9seWdvbk9mZnNldDtcblx0XHRpZiAoIGpzb24ucG9seWdvbk9mZnNldEZhY3RvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciA9IGpzb24ucG9seWdvbk9mZnNldEZhY3Rvcjtcblx0XHRpZiAoIGpzb24ucG9seWdvbk9mZnNldFVuaXRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBqc29uLnBvbHlnb25PZmZzZXRVbml0cztcblxuXHRcdGlmICgganNvbi5za2lubmluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2tpbm5pbmcgPSBqc29uLnNraW5uaW5nO1xuXHRcdGlmICgganNvbi5tb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9IGpzb24ubW9ycGhUYXJnZXRzO1xuXHRcdGlmICgganNvbi5kaXRoZXJpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpdGhlcmluZyA9IGpzb24uZGl0aGVyaW5nO1xuXG5cdFx0aWYgKCBqc29uLnZpc2libGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZpc2libGUgPSBqc29uLnZpc2libGU7XG5cdFx0aWYgKCBqc29uLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51c2VyRGF0YSA9IGpzb24udXNlckRhdGE7XG5cblx0XHQvLyBEZXByZWNhdGVkXG5cblx0XHRpZiAoIGpzb24uc2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBqc29uLnNoYWRpbmcgPT09IDE7IC8vIFRIUkVFLkZsYXRTaGFkaW5nXG5cblx0XHQvLyBmb3IgUG9pbnRzTWF0ZXJpYWxcblxuXHRcdGlmICgganNvbi5zaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplID0ganNvbi5zaXplO1xuXHRcdGlmICgganNvbi5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9IGpzb24uc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0Ly8gbWFwc1xuXG5cdFx0aWYgKCBqc29uLm1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWFwID0gZ2V0VGV4dHVyZSgganNvbi5tYXAgKTtcblxuXHRcdGlmICgganNvbi5hbHBoYU1hcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXRlcmlhbC5hbHBoYU1hcCA9IGdldFRleHR1cmUoIGpzb24uYWxwaGFNYXAgKTtcblx0XHRcdG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5idW1wTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wTWFwID0gZ2V0VGV4dHVyZSgganNvbi5idW1wTWFwICk7XG5cdFx0aWYgKCBqc29uLmJ1bXBTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcFNjYWxlID0ganNvbi5idW1wU2NhbGU7XG5cblx0XHRpZiAoIGpzb24ubm9ybWFsTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXAgPSBnZXRUZXh0dXJlKCBqc29uLm5vcm1hbE1hcCApO1xuXHRcdGlmICgganNvbi5ub3JtYWxNYXBUeXBlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlID0ganNvbi5ub3JtYWxNYXBUeXBlO1xuXHRcdGlmICgganNvbi5ub3JtYWxTY2FsZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsU2NhbGUgPSBqc29uLm5vcm1hbFNjYWxlO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5vcm1hbFNjYWxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIEJsZW5kZXIgZXhwb3J0ZXIgdXNlZCB0byBleHBvcnQgYSBzY2FsYXIuIFNlZSAjNzQ1OVxuXG5cdFx0XHRcdG5vcm1hbFNjYWxlID0gWyBub3JtYWxTY2FsZSwgbm9ybWFsU2NhbGUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbC5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5kaXNwbGFjZW1lbnRNYXAgKTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50U2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlID0ganNvbi5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50QmlhcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcyA9IGpzb24uZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdGlmICgganNvbi5yb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ucm91Z2huZXNzTWFwICk7XG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5tZXRhbG5lc3NNYXAgKTtcblxuXHRcdGlmICgganNvbi5lbWlzc2l2ZU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVtaXNzaXZlTWFwICk7XG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSA9IGpzb24uZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uc3BlY3VsYXJNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyTWFwID0gZ2V0VGV4dHVyZSgganNvbi5zcGVjdWxhck1hcCApO1xuXG5cdFx0aWYgKCBqc29uLmVudk1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW52TWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbnZNYXAgKTtcblxuXHRcdGlmICgganNvbi5yZWZsZWN0aXZpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZmxlY3Rpdml0eSA9IGpzb24ucmVmbGVjdGl2aXR5O1xuXG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcCA9IGdldFRleHR1cmUoIGpzb24ubGlnaHRNYXAgKTtcblx0XHRpZiAoIGpzb24ubGlnaHRNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5ID0ganNvbi5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5hb01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFvTWFwICk7XG5cdFx0aWYgKCBqc29uLmFvTWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hb01hcEludGVuc2l0eSA9IGpzb24uYW9NYXBJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uZ3JhZGllbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdyYWRpZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5ncmFkaWVudE1hcCApO1xuXG5cdFx0cmV0dXJuIG1hdGVyaWFsO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IE1hdGVyaWFsTG9hZGVyIH07XG4iLCJpbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZS5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9GaWxlTG9hZGVyLmpzJztcbmltcG9ydCB7IERlZmF1bHRMb2FkaW5nTWFuYWdlciB9IGZyb20gJy4vTG9hZGluZ01hbmFnZXIuanMnO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnlMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyR2VvbWV0cnlMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdG9uTG9hZCggc2NvcGUucGFyc2UoIEpTT04ucGFyc2UoIHRleHQgKSApICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0XHR2YXIgaW5kZXggPSBqc29uLmRhdGEuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciB0eXBlZEFycmF5ID0gbmV3IFRZUEVEX0FSUkFZU1sgaW5kZXgudHlwZSBdKCBpbmRleC5hcnJheSApO1xuXHRcdFx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHR5cGVkQXJyYXksIDEgKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc29uLmRhdGEuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXHRcdFx0dmFyIHR5cGVkQXJyYXkgPSBuZXcgVFlQRURfQVJSQVlTWyBhdHRyaWJ1dGUudHlwZSBdKCBhdHRyaWJ1dGUuYXJyYXkgKTtcblxuXHRcdFx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCBrZXksIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHR5cGVkQXJyYXksIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlLm5vcm1hbGl6ZWQgKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IGpzb24uZGF0YS5ncm91cHMgfHwganNvbi5kYXRhLmRyYXdjYWxscyB8fCBqc29uLmRhdGEub2Zmc2V0cztcblxuXHRcdGlmICggZ3JvdXBzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGdyb3Vwcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cblx0XHRcdFx0Z2VvbWV0cnkuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSBqc29uLmRhdGEuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNlbnRlci5mcm9tQXJyYXkoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSggY2VudGVyLCBib3VuZGluZ1NwaGVyZS5yYWRpdXMgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBnZW9tZXRyeTtcblxuXHR9XG5cbn0gKTtcblxudmFyIFRZUEVEX0FSUkFZUyA9IHtcblx0SW50OEFycmF5OiBJbnQ4QXJyYXksXG5cdFVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXksXG5cdC8vIFdvcmthcm91bmQgZm9yIElFMTEgcHJlIEtCMjkyOTQzNy4gU2VlICMxMTQ0MFxuXHRVaW50OENsYW1wZWRBcnJheTogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4Q2xhbXBlZEFycmF5IDogVWludDhBcnJheSxcblx0SW50MTZBcnJheTogSW50MTZBcnJheSxcblx0VWludDE2QXJyYXk6IFVpbnQxNkFycmF5LFxuXHRJbnQzMkFycmF5OiBJbnQzMkFycmF5LFxuXHRVaW50MzJBcnJheTogVWludDMyQXJyYXksXG5cdEZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5LFxuXHRGbG9hdDY0QXJyYXk6IEZsb2F0NjRBcnJheVxufTtcblxuZXhwb3J0IHsgQnVmZmVyR2VvbWV0cnlMb2FkZXIgfTtcbiIsImltcG9ydCB7XG5cdE5vQmxlbmRpbmcsXG5cdE5vcm1hbEJsZW5kaW5nLFxuXHRBZGRpdGl2ZUJsZW5kaW5nLFxuXHRTdWJ0cmFjdGl2ZUJsZW5kaW5nLFxuXHRNdWx0aXBseUJsZW5kaW5nLFxuXHRDdXN0b21CbGVuZGluZyxcblxuXHRGYWNlQ29sb3JzLFxuXHRWZXJ0ZXhDb2xvcnMsXG5cblx0RG91YmxlU2lkZSxcblx0QmFja1NpZGUsXG5cblx0TWlycm9yZWRSZXBlYXRXcmFwcGluZyxcblx0UmVwZWF0V3JhcHBpbmdcbn0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IF9NYXRoIH0gZnJvbSAnLi4vbWF0aC9NYXRoLmpzJztcbmltcG9ydCB7IE1hdGVyaWFsTG9hZGVyIH0gZnJvbSAnLi9NYXRlcmlhbExvYWRlci5qcyc7XG5pbXBvcnQgeyBUZXh0dXJlTG9hZGVyIH0gZnJvbSAnLi9UZXh0dXJlTG9hZGVyLmpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkZXIoKSB7fVxuXG5Mb2FkZXIuSGFuZGxlcnMgPSB7XG5cblx0aGFuZGxlcnM6IFtdLFxuXG5cdGFkZDogZnVuY3Rpb24gKCByZWdleCwgbG9hZGVyICkge1xuXG5cdFx0dGhpcy5oYW5kbGVycy5wdXNoKCByZWdleCwgbG9hZGVyICk7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICggZmlsZSApIHtcblxuXHRcdHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdHZhciByZWdleCA9IGhhbmRsZXJzWyBpIF07XG5cdFx0XHR2YXIgbG9hZGVyID0gaGFuZGxlcnNbIGkgKyAxIF07XG5cblx0XHRcdGlmICggcmVnZXgudGVzdCggZmlsZSApICkge1xuXG5cdFx0XHRcdHJldHVybiBsb2FkZXI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH1cblxufTtcblxuT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiAnYW5vbnltb3VzJyxcblxuXHRvbkxvYWRTdGFydDogZnVuY3Rpb24gKCkge30sXG5cblx0b25Mb2FkUHJvZ3Jlc3M6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdG9uTG9hZENvbXBsZXRlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRpbml0TWF0ZXJpYWxzOiBmdW5jdGlvbiAoIG1hdGVyaWFscywgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICkge1xuXG5cdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtYXRlcmlhbHMubGVuZ3RoOyArKyBpICkge1xuXG5cdFx0XHRhcnJheVsgaSBdID0gdGhpcy5jcmVhdGVNYXRlcmlhbCggbWF0ZXJpYWxzWyBpIF0sIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0Y3JlYXRlTWF0ZXJpYWw6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIEJsZW5kaW5nTW9kZSA9IHtcblx0XHRcdE5vQmxlbmRpbmc6IE5vQmxlbmRpbmcsXG5cdFx0XHROb3JtYWxCbGVuZGluZzogTm9ybWFsQmxlbmRpbmcsXG5cdFx0XHRBZGRpdGl2ZUJsZW5kaW5nOiBBZGRpdGl2ZUJsZW5kaW5nLFxuXHRcdFx0U3VidHJhY3RpdmVCbGVuZGluZzogU3VidHJhY3RpdmVCbGVuZGluZyxcblx0XHRcdE11bHRpcGx5QmxlbmRpbmc6IE11bHRpcGx5QmxlbmRpbmcsXG5cdFx0XHRDdXN0b21CbGVuZGluZzogQ3VzdG9tQmxlbmRpbmdcblx0XHR9O1xuXG5cdFx0dmFyIGNvbG9yID0gbmV3IENvbG9yKCk7XG5cdFx0dmFyIHRleHR1cmVMb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuXHRcdHZhciBtYXRlcmlhbExvYWRlciA9IG5ldyBNYXRlcmlhbExvYWRlcigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU1hdGVyaWFsKCBtLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKSB7XG5cblx0XHRcdC8vIGNvbnZlcnQgZnJvbSBvbGQgbWF0ZXJpYWwgZm9ybWF0XG5cblx0XHRcdHZhciB0ZXh0dXJlcyA9IHt9O1xuXG5cdFx0XHRmdW5jdGlvbiBsb2FkVGV4dHVyZSggcGF0aCwgcmVwZWF0LCBvZmZzZXQsIHdyYXAsIGFuaXNvdHJvcHkgKSB7XG5cblx0XHRcdFx0dmFyIGZ1bGxQYXRoID0gdGV4dHVyZVBhdGggKyBwYXRoO1xuXHRcdFx0XHR2YXIgbG9hZGVyID0gTG9hZGVyLkhhbmRsZXJzLmdldCggZnVsbFBhdGggKTtcblxuXHRcdFx0XHR2YXIgdGV4dHVyZTtcblxuXHRcdFx0XHRpZiAoIGxvYWRlciAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUgPSBsb2FkZXIubG9hZCggZnVsbFBhdGggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZUxvYWRlci5zZXRDcm9zc09yaWdpbiggY3Jvc3NPcmlnaW4gKTtcblx0XHRcdFx0XHR0ZXh0dXJlID0gdGV4dHVyZUxvYWRlci5sb2FkKCBmdWxsUGF0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHJlcGVhdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5yZXBlYXQuZnJvbUFycmF5KCByZXBlYXQgKTtcblxuXHRcdFx0XHRcdGlmICggcmVwZWF0WyAwIF0gIT09IDEgKSB0ZXh0dXJlLndyYXBTID0gUmVwZWF0V3JhcHBpbmc7XG5cdFx0XHRcdFx0aWYgKCByZXBlYXRbIDEgXSAhPT0gMSApIHRleHR1cmUud3JhcFQgPSBSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUub2Zmc2V0LmZyb21BcnJheSggb2Zmc2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggd3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCB3cmFwWyAwIF0gPT09ICdyZXBlYXQnICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nO1xuXHRcdFx0XHRcdGlmICggd3JhcFsgMCBdID09PSAnbWlycm9yJyApIHRleHR1cmUud3JhcFMgPSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nO1xuXG5cdFx0XHRcdFx0aWYgKCB3cmFwWyAxIF0gPT09ICdyZXBlYXQnICkgdGV4dHVyZS53cmFwVCA9IFJlcGVhdFdyYXBwaW5nO1xuXHRcdFx0XHRcdGlmICggd3JhcFsgMSBdID09PSAnbWlycm9yJyApIHRleHR1cmUud3JhcFQgPSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IGFuaXNvdHJvcHk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB1dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHRcdFx0dGV4dHVyZXNbIHV1aWQgXSA9IHRleHR1cmU7XG5cblx0XHRcdFx0cmV0dXJuIHV1aWQ7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly9cblxuXHRcdFx0dmFyIGpzb24gPSB7XG5cdFx0XHRcdHV1aWQ6IF9NYXRoLmdlbmVyYXRlVVVJRCgpLFxuXHRcdFx0XHR0eXBlOiAnTWVzaExhbWJlcnRNYXRlcmlhbCdcblx0XHRcdH07XG5cblx0XHRcdGZvciAoIHZhciBuYW1lIGluIG0gKSB7XG5cblx0XHRcdFx0dmFyIHZhbHVlID0gbVsgbmFtZSBdO1xuXG5cdFx0XHRcdHN3aXRjaCAoIG5hbWUgKSB7XG5cblx0XHRcdFx0XHRjYXNlICdEYmdDb2xvcic6XG5cdFx0XHRcdFx0Y2FzZSAnRGJnSW5kZXgnOlxuXHRcdFx0XHRcdGNhc2UgJ29wdGljYWxEZW5zaXR5Jzpcblx0XHRcdFx0XHRjYXNlICdpbGx1bWluYXRpb24nOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnRGJnTmFtZSc6XG5cdFx0XHRcdFx0XHRqc29uLm5hbWUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2JsZW5kaW5nJzpcblx0XHRcdFx0XHRcdGpzb24uYmxlbmRpbmcgPSBCbGVuZGluZ01vZGVbIHZhbHVlIF07XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvckFtYmllbnQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFtYmllbnQnOlxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOicsIG5hbWUsICdpcyBubyBsb25nZXIgc3VwcG9ydGVkLicgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yRGlmZnVzZSc6XG5cdFx0XHRcdFx0XHRqc29uLmNvbG9yID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhleCgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JTcGVjdWxhcic6XG5cdFx0XHRcdFx0XHRqc29uLnNwZWN1bGFyID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhleCgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JFbWlzc2l2ZSc6XG5cdFx0XHRcdFx0XHRqc29uLmVtaXNzaXZlID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhleCgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc3BlY3VsYXJDb2VmJzpcblx0XHRcdFx0XHRcdGpzb24uc2hpbmluZXNzID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdzaGFkaW5nJzpcblx0XHRcdFx0XHRcdGlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ2Jhc2ljJyApIGpzb24udHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdwaG9uZycgKSBqc29uLnR5cGUgPSAnTWVzaFBob25nTWF0ZXJpYWwnO1xuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAnc3RhbmRhcmQnICkganNvbi50eXBlID0gJ01lc2hTdGFuZGFyZE1hdGVyaWFsJztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2UnOlxuXHRcdFx0XHRcdFx0anNvbi5tYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwRGlmZnVzZVJlcGVhdCwgbS5tYXBEaWZmdXNlT2Zmc2V0LCBtLm1hcERpZmZ1c2VXcmFwLCBtLm1hcERpZmZ1c2VBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZUFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmUnOlxuXHRcdFx0XHRcdFx0anNvbi5lbWlzc2l2ZU1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBFbWlzc2l2ZVJlcGVhdCwgbS5tYXBFbWlzc2l2ZU9mZnNldCwgbS5tYXBFbWlzc2l2ZVdyYXAsIG0ubWFwRW1pc3NpdmVBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZVJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0Jzpcblx0XHRcdFx0XHRcdGpzb24ubGlnaHRNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTGlnaHRSZXBlYXQsIG0ubWFwTGlnaHRPZmZzZXQsIG0ubWFwTGlnaHRXcmFwLCBtLm1hcExpZ2h0QW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0T2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodFdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0QW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBTyc6XG5cdFx0XHRcdFx0XHRqc29uLmFvTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEFPUmVwZWF0LCBtLm1hcEFPT2Zmc2V0LCBtLm1hcEFPV3JhcCwgbS5tYXBBT0FuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFPUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBT09mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9XcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBBT0FuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcCc6XG5cdFx0XHRcdFx0XHRqc29uLmJ1bXBNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwQnVtcFJlcGVhdCwgbS5tYXBCdW1wT2Zmc2V0LCBtLm1hcEJ1bXBXcmFwLCBtLm1hcEJ1bXBBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wU2NhbGUnOlxuXHRcdFx0XHRcdFx0anNvbi5idW1wU2NhbGUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWwnOlxuXHRcdFx0XHRcdFx0anNvbi5ub3JtYWxNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTm9ybWFsUmVwZWF0LCBtLm1hcE5vcm1hbE9mZnNldCwgbS5tYXBOb3JtYWxXcmFwLCBtLm1hcE5vcm1hbEFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbEZhY3Rvcic6XG5cdFx0XHRcdFx0XHRqc29uLm5vcm1hbFNjYWxlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbE9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhcic6XG5cdFx0XHRcdFx0XHRqc29uLnNwZWN1bGFyTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFNwZWN1bGFyUmVwZWF0LCBtLm1hcFNwZWN1bGFyT2Zmc2V0LCBtLm1hcFNwZWN1bGFyV3JhcCwgbS5tYXBTcGVjdWxhckFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhck9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhckFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzJzpcblx0XHRcdFx0XHRcdGpzb24ubWV0YWxuZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE1ldGFsbmVzc1JlcGVhdCwgbS5tYXBNZXRhbG5lc3NPZmZzZXQsIG0ubWFwTWV0YWxuZXNzV3JhcCwgbS5tYXBNZXRhbG5lc3NBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc09mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3MnOlxuXHRcdFx0XHRcdFx0anNvbi5yb3VnaG5lc3NNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwUm91Z2huZXNzUmVwZWF0LCBtLm1hcFJvdWdobmVzc09mZnNldCwgbS5tYXBSb3VnaG5lc3NXcmFwLCBtLm1hcFJvdWdobmVzc0FuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc1JlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhJzpcblx0XHRcdFx0XHRcdGpzb24uYWxwaGFNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwQWxwaGFSZXBlYXQsIG0ubWFwQWxwaGFPZmZzZXQsIG0ubWFwQWxwaGFXcmFwLCBtLm1hcEFscGhhQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdmbGlwU2lkZWQnOlxuXHRcdFx0XHRcdFx0anNvbi5zaWRlID0gQmFja1NpZGU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdkb3VibGVTaWRlZCc6XG5cdFx0XHRcdFx0XHRqc29uLnNpZGUgPSBEb3VibGVTaWRlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndHJhbnNwYXJlbmN5Jzpcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDogdHJhbnNwYXJlbmN5IGhhcyBiZWVuIHJlbmFtZWQgdG8gb3BhY2l0eScgKTtcblx0XHRcdFx0XHRcdGpzb24ub3BhY2l0eSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGVwdGhUZXN0Jzpcblx0XHRcdFx0XHRjYXNlICdkZXB0aFdyaXRlJzpcblx0XHRcdFx0XHRjYXNlICdjb2xvcldyaXRlJzpcblx0XHRcdFx0XHRjYXNlICdvcGFjaXR5Jzpcblx0XHRcdFx0XHRjYXNlICdyZWZsZWN0aXZpdHknOlxuXHRcdFx0XHRcdGNhc2UgJ3RyYW5zcGFyZW50Jzpcblx0XHRcdFx0XHRjYXNlICd2aXNpYmxlJzpcblx0XHRcdFx0XHRjYXNlICd3aXJlZnJhbWUnOlxuXHRcdFx0XHRcdFx0anNvblsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICd2ZXJ0ZXhDb2xvcnMnOlxuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIGpzb24udmVydGV4Q29sb3JzID0gVmVydGV4Q29sb3JzO1xuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gJ2ZhY2UnICkganNvbi52ZXJ0ZXhDb2xvcnMgPSBGYWNlQ29sb3JzO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6IFVuc3VwcG9ydGVkJywgbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24udHlwZSA9PT0gJ01lc2hCYXNpY01hdGVyaWFsJyApIGRlbGV0ZSBqc29uLmVtaXNzaXZlO1xuXHRcdFx0aWYgKCBqc29uLnR5cGUgIT09ICdNZXNoUGhvbmdNYXRlcmlhbCcgKSBkZWxldGUganNvbi5zcGVjdWxhcjtcblxuXHRcdFx0aWYgKCBqc29uLm9wYWNpdHkgPCAxICkganNvbi50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0XHRcdG1hdGVyaWFsTG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApO1xuXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxMb2FkZXIucGFyc2UoIGpzb24gKTtcblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG5leHBvcnQgeyBMb2FkZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBEb24gTWNDdXJkeSAvIGh0dHBzOi8vd3d3LmRvbm1jY3VyZHkuY29tXG4gKi9cblxudmFyIExvYWRlclV0aWxzID0ge1xuXG5cdGRlY29kZVRleHQ6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoIGFycmF5ICk7XG5cblx0XHR9XG5cblx0XHQvLyBBdm9pZCB0aGUgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheSkgc2hvcnRjdXQsIHdoaWNoXG5cdFx0Ly8gdGhyb3dzIGEgXCJtYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiIGVycm9yIGZvciBsYXJnZSBhcnJheXMuXG5cblx0XHR2YXIgcyA9ICcnO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHQvLyBJbXBsaWNpdGx5IGFzc3VtZXMgbGl0dGxlLWVuZGlhbi5cblx0XHRcdHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggYXJyYXlbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gTWVyZ2VzIG11bHRpLWJ5dGUgdXRmLTggY2hhcmFjdGVycy5cblx0XHRyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KCBlc2NhcGUoIHMgKSApO1xuXG5cdH0sXG5cblx0ZXh0cmFjdFVybEJhc2U6IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0dmFyIGluZGV4ID0gdXJsLmxhc3RJbmRleE9mKCAnLycgKTtcblxuXHRcdGlmICggaW5kZXggPT09IC0gMSApIHJldHVybiAnLi8nO1xuXG5cdFx0cmV0dXJuIHVybC5zdWJzdHIoIDAsIGluZGV4ICsgMSApO1xuXG5cdH1cblxufTtcblxuZXhwb3J0IHsgTG9hZGVyVXRpbHMgfTtcbiIsImltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcbmltcG9ydCB7IExvYWRlclV0aWxzIH0gZnJvbSAnLi9Mb2FkZXJVdGlscy5qcyc7XG5pbXBvcnQgeyBBbmltYXRpb25DbGlwIH0gZnJvbSAnLi4vYW5pbWF0aW9uL0FuaW1hdGlvbkNsaXAuanMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0LmpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcbmltcG9ydCB7IEZhY2UzIH0gZnJvbSAnLi4vY29yZS9GYWNlMy5qcyc7XG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vRmlsZUxvYWRlci5qcyc7XG5pbXBvcnQgeyBEZWZhdWx0TG9hZGluZ01hbmFnZXIgfSBmcm9tICcuL0xvYWRpbmdNYW5hZ2VyLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBKU09OTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGlmICggdHlwZW9mIG1hbmFnZXIgPT09ICdib29sZWFuJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkpTT05Mb2FkZXI6IHNob3dTdGF0dXMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBjb25zdHJ1Y3Rvci4nICk7XG5cdFx0bWFuYWdlciA9IHVuZGVmaW5lZDtcblxuXHR9XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cblx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBKU09OTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiAnYW5vbnltb3VzJyxcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciB0ZXh0dXJlUGF0aCA9IHRoaXMudGV4dHVyZVBhdGggJiYgKCB0eXBlb2YgdGhpcy50ZXh0dXJlUGF0aCA9PT0gJ3N0cmluZycgKSA/IHRoaXMudGV4dHVyZVBhdGggOiBMb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSggdXJsICk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHRoaXMud2l0aENyZWRlbnRpYWxzICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHR2YXIganNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblx0XHRcdHZhciBtZXRhZGF0YSA9IGpzb24ubWV0YWRhdGE7XG5cblx0XHRcdGlmICggbWV0YWRhdGEgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR2YXIgdHlwZSA9IG1ldGFkYXRhLnR5cGU7XG5cblx0XHRcdFx0aWYgKCB0eXBlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ29iamVjdCcgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5KU09OTG9hZGVyOiAnICsgdXJsICsgJyBzaG91bGQgYmUgbG9hZGVkIHdpdGggVEhSRUUuT2JqZWN0TG9hZGVyIGluc3RlYWQuJyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgb2JqZWN0ID0gc2NvcGUucGFyc2UoIGpzb24sIHRleHR1cmVQYXRoICk7XG5cdFx0XHRvbkxvYWQoIG9iamVjdC5nZW9tZXRyeSwgb2JqZWN0Lm1hdGVyaWFscyApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRUZXh0dXJlUGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMudGV4dHVyZVBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHBhcnNlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIHBhcnNlTW9kZWwoIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHRmdW5jdGlvbiBpc0JpdFNldCggdmFsdWUsIHBvc2l0aW9uICkge1xuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSAmICggMSA8PCBwb3NpdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpLCBqLCBmaSxcblxuXHRcdFx0XHRvZmZzZXQsIHpMZW5ndGgsXG5cblx0XHRcdFx0Y29sb3JJbmRleCwgbm9ybWFsSW5kZXgsIHV2SW5kZXgsIG1hdGVyaWFsSW5kZXgsXG5cblx0XHRcdFx0dHlwZSxcblx0XHRcdFx0aXNRdWFkLFxuXHRcdFx0XHRoYXNNYXRlcmlhbCxcblx0XHRcdFx0aGFzRmFjZVZlcnRleFV2LFxuXHRcdFx0XHRoYXNGYWNlTm9ybWFsLCBoYXNGYWNlVmVydGV4Tm9ybWFsLFxuXHRcdFx0XHRoYXNGYWNlQ29sb3IsIGhhc0ZhY2VWZXJ0ZXhDb2xvcixcblxuXHRcdFx0XHR2ZXJ0ZXgsIGZhY2UsIGZhY2VBLCBmYWNlQiwgaGV4LCBub3JtYWwsXG5cblx0XHRcdFx0dXZMYXllciwgdXYsIHUsIHYsXG5cblx0XHRcdFx0ZmFjZXMgPSBqc29uLmZhY2VzLFxuXHRcdFx0XHR2ZXJ0aWNlcyA9IGpzb24udmVydGljZXMsXG5cdFx0XHRcdG5vcm1hbHMgPSBqc29uLm5vcm1hbHMsXG5cdFx0XHRcdGNvbG9ycyA9IGpzb24uY29sb3JzLFxuXG5cdFx0XHRcdHNjYWxlID0ganNvbi5zY2FsZSxcblxuXHRcdFx0XHRuVXZMYXllcnMgPSAwO1xuXG5cblx0XHRcdGlmICgganNvbi51dnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBkaXNyZWdhcmQgZW1wdHkgYXJyYXlzXG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBqc29uLnV2cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGpzb24udXZzWyBpIF0ubGVuZ3RoICkgblV2TGF5ZXJzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IG5VdkxheWVyczsgaSArKyApIHtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXSA9IFtdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRvZmZzZXQgPSAwO1xuXHRcdFx0ekxlbmd0aCA9IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBvZmZzZXQgPCB6TGVuZ3RoICkge1xuXG5cdFx0XHRcdHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdFx0dmVydGV4LnggPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTtcblx0XHRcdFx0dmVydGV4LnkgPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTtcblx0XHRcdFx0dmVydGV4LnogPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTtcblxuXHRcdFx0XHRnZW9tZXRyeS52ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvZmZzZXQgPSAwO1xuXHRcdFx0ekxlbmd0aCA9IGZhY2VzLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBvZmZzZXQgPCB6TGVuZ3RoICkge1xuXG5cdFx0XHRcdHR5cGUgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0aXNRdWFkID0gaXNCaXRTZXQoIHR5cGUsIDAgKTtcblx0XHRcdFx0aGFzTWF0ZXJpYWwgPSBpc0JpdFNldCggdHlwZSwgMSApO1xuXHRcdFx0XHRoYXNGYWNlVmVydGV4VXYgPSBpc0JpdFNldCggdHlwZSwgMyApO1xuXHRcdFx0XHRoYXNGYWNlTm9ybWFsID0gaXNCaXRTZXQoIHR5cGUsIDQgKTtcblx0XHRcdFx0aGFzRmFjZVZlcnRleE5vcm1hbCA9IGlzQml0U2V0KCB0eXBlLCA1ICk7XG5cdFx0XHRcdGhhc0ZhY2VDb2xvciA9IGlzQml0U2V0KCB0eXBlLCA2ICk7XG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhDb2xvciA9IGlzQml0U2V0KCB0eXBlLCA3ICk7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJ0eXBlXCIsIHR5cGUsIFwiYml0c1wiLCBpc1F1YWQsIGhhc01hdGVyaWFsLCBoYXNGYWNlVmVydGV4VXYsIGhhc0ZhY2VOb3JtYWwsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwsIGhhc0ZhY2VDb2xvciwgaGFzRmFjZVZlcnRleENvbG9yKTtcblxuXHRcdFx0XHRpZiAoIGlzUXVhZCApIHtcblxuXHRcdFx0XHRcdGZhY2VBID0gbmV3IEZhY2UzKCk7XG5cdFx0XHRcdFx0ZmFjZUEuYSA9IGZhY2VzWyBvZmZzZXQgXTtcblx0XHRcdFx0XHRmYWNlQS5iID0gZmFjZXNbIG9mZnNldCArIDEgXTtcblx0XHRcdFx0XHRmYWNlQS5jID0gZmFjZXNbIG9mZnNldCArIDMgXTtcblxuXHRcdFx0XHRcdGZhY2VCID0gbmV3IEZhY2UzKCk7XG5cdFx0XHRcdFx0ZmFjZUIuYSA9IGZhY2VzWyBvZmZzZXQgKyAxIF07XG5cdFx0XHRcdFx0ZmFjZUIuYiA9IGZhY2VzWyBvZmZzZXQgKyAyIF07XG5cdFx0XHRcdFx0ZmFjZUIuYyA9IGZhY2VzWyBvZmZzZXQgKyAzIF07XG5cblx0XHRcdFx0XHRvZmZzZXQgKz0gNDtcblxuXHRcdFx0XHRcdGlmICggaGFzTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRcdG1hdGVyaWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRmYWNlQS5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDtcblx0XHRcdFx0XHRcdGZhY2VCLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdG8gZ2V0IGZhY2UgPD0+IHV2IGluZGV4IGNvcnJlc3BvbmRlbmNlXG5cblx0XHRcdFx0XHRmaSA9IGdlb21ldHJ5LmZhY2VzLmxlbmd0aDtcblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IG5VdkxheWVyczsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR1dkxheWVyID0ganNvbi51dnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0gPSBbXTtcblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSArIDEgXSA9IFtdO1xuXG5cdFx0XHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgNDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRcdHV2SW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1ID0gdXZMYXllclsgdXZJbmRleCAqIDIgXTtcblx0XHRcdFx0XHRcdFx0XHR2ID0gdXZMYXllclsgdXZJbmRleCAqIDIgKyAxIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1diA9IG5ldyBWZWN0b3IyKCB1LCB2ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIGogIT09IDIgKSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0ucHVzaCggdXYgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGogIT09IDAgKSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdLnB1c2goIHV2ICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0ZmFjZUEubm9ybWFsLnNldChcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0ZmFjZUIubm9ybWFsLmNvcHkoIGZhY2VBLm5vcm1hbCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Tm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHRcdCk7XG5cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkgIT09IDIgKSBmYWNlQS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGkgIT09IDAgKSBmYWNlQi52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZUNvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0aGV4ID0gY29sb3JzWyBjb2xvckluZGV4IF07XG5cblx0XHRcdFx0XHRcdGZhY2VBLmNvbG9yLnNldEhleCggaGV4ICk7XG5cdFx0XHRcdFx0XHRmYWNlQi5jb2xvci5zZXRIZXgoIGhleCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCA0OyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRcdGhleCA9IGNvbG9yc1sgY29sb3JJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMiApIGZhY2VBLnZlcnRleENvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGhleCApICk7XG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMCApIGZhY2VCLnZlcnRleENvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGhleCApICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VzLnB1c2goIGZhY2VBICk7XG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZUIgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZmFjZSA9IG5ldyBGYWNlMygpO1xuXHRcdFx0XHRcdGZhY2UuYSA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRmYWNlLmIgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0ZmFjZS5jID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2UubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0byBnZXQgZmFjZSA8PT4gdXYgaW5kZXggY29ycmVzcG9uZGVuY2VcblxuXHRcdFx0XHRcdGZpID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHV2TGF5ZXIgPSBqc29uLnV2c1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXSA9IFtdO1xuXG5cdFx0XHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRcdHV2SW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1ID0gdXZMYXllclsgdXZJbmRleCAqIDIgXTtcblx0XHRcdFx0XHRcdFx0XHR2ID0gdXZMYXllclsgdXZJbmRleCAqIDIgKyAxIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1diA9IG5ldyBWZWN0b3IyKCB1LCB2ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0ucHVzaCggdXYgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRmYWNlLm5vcm1hbC5zZXQoXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgMzsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRmYWNlLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRmYWNlLmNvbG9yLnNldEhleCggY29sb3JzWyBjb2xvckluZGV4IF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Q29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgMzsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0XHRmYWNlLnZlcnRleENvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGNvbG9yc1sgY29sb3JJbmRleCBdICkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcGFyc2VTa2luKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPSAoIGpzb24uaW5mbHVlbmNlc1BlclZlcnRleCAhPT0gdW5kZWZpbmVkICkgPyBqc29uLmluZmx1ZW5jZXNQZXJWZXJ0ZXggOiAyO1xuXG5cdFx0XHRpZiAoIGpzb24uc2tpbldlaWdodHMgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5za2luV2VpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICs9IGluZmx1ZW5jZXNQZXJWZXJ0ZXggKSB7XG5cblx0XHRcdFx0XHR2YXIgeCA9IGpzb24uc2tpbldlaWdodHNbIGkgXTtcblx0XHRcdFx0XHR2YXIgeSA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDEgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAxIF0gOiAwO1xuXHRcdFx0XHRcdHZhciB6ID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMiApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDIgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIHcgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBqc29uLnNraW5XZWlnaHRzWyBpICsgMyBdIDogMDtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LnNraW5XZWlnaHRzLnB1c2goIG5ldyBWZWN0b3I0KCB4LCB5LCB6LCB3ICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnNraW5JbmRpY2VzICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uc2tpbkluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArPSBpbmZsdWVuY2VzUGVyVmVydGV4ICkge1xuXG5cdFx0XHRcdFx0dmFyIGEgPSBqc29uLnNraW5JbmRpY2VzWyBpIF07XG5cdFx0XHRcdFx0dmFyIGIgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAxICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMSBdIDogMDtcblx0XHRcdFx0XHR2YXIgYyA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDIgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAyIF0gOiAwO1xuXHRcdFx0XHRcdHZhciBkID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMyApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDMgXSA6IDA7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5za2luSW5kaWNlcy5wdXNoKCBuZXcgVmVjdG9yNCggYSwgYiwgYywgZCApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmJvbmVzID0ganNvbi5ib25lcztcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib25lcyAmJiBnZW9tZXRyeS5ib25lcy5sZW5ndGggPiAwICYmICggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICE9PSBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggfHwgZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICE9PSBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdXaGVuIHNraW5uaW5nLCBudW1iZXIgb2YgdmVydGljZXMgKCcgKyBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKyAnKSwgc2tpbkluZGljZXMgKCcgK1xuXHRcdFx0XHRcdGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCArICcpLCBhbmQgc2tpbldlaWdodHMgKCcgKyBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKyAnKSBzaG91bGQgbWF0Y2guJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBwYXJzZU1vcnBoaW5nKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIHNjYWxlID0ganNvbi5zY2FsZTtcblxuXHRcdFx0aWYgKCBqc29uLm1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXSA9IHt9O1xuXHRcdFx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWUgPSBqc29uLm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMgPSBbXTtcblxuXHRcdFx0XHRcdHZhciBkc3RWZXJ0aWNlcyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzO1xuXHRcdFx0XHRcdHZhciBzcmNWZXJ0aWNlcyA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgdiA9IDAsIHZsID0gc3JjVmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRcdFx0XHR2ZXJ0ZXgueCA9IHNyY1ZlcnRpY2VzWyB2IF0gKiBzY2FsZTtcblx0XHRcdFx0XHRcdHZlcnRleC55ID0gc3JjVmVydGljZXNbIHYgKyAxIF0gKiBzY2FsZTtcblx0XHRcdFx0XHRcdHZlcnRleC56ID0gc3JjVmVydGljZXNbIHYgKyAyIF0gKiBzY2FsZTtcblxuXHRcdFx0XHRcdFx0ZHN0VmVydGljZXMucHVzaCggdmVydGV4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi5tb3JwaENvbG9ycyAhPT0gdW5kZWZpbmVkICYmIGpzb24ubW9ycGhDb2xvcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5KU09OTG9hZGVyOiBcIm1vcnBoQ29sb3JzXCIgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNpbmcgdGhlbSBhcyBmYWNlIGNvbG9ycy4nICk7XG5cblx0XHRcdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cdFx0XHRcdHZhciBtb3JwaENvbG9ycyA9IGpzb24ubW9ycGhDb2xvcnNbIDAgXS5jb2xvcnM7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2VzWyBpIF0uY29sb3IuZnJvbUFycmF5KCBtb3JwaENvbG9ycywgaSAqIDMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHBhcnNlQW5pbWF0aW9ucygganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBvdXRwdXRBbmltYXRpb25zID0gW107XG5cblx0XHRcdC8vIHBhcnNlIG9sZCBzdHlsZSBCb25lL0hpZXJhcmNoeSBhbmltYXRpb25zXG5cdFx0XHR2YXIgYW5pbWF0aW9ucyA9IFtdO1xuXG5cdFx0XHRpZiAoIGpzb24uYW5pbWF0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBqc29uLmFuaW1hdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi5hbmltYXRpb25zICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aWYgKCBqc29uLmFuaW1hdGlvbnMubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0YW5pbWF0aW9ucyA9IGFuaW1hdGlvbnMuY29uY2F0KCBqc29uLmFuaW1hdGlvbnMgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBqc29uLmFuaW1hdGlvbnMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYW5pbWF0aW9ucy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlQW5pbWF0aW9uKCBhbmltYXRpb25zWyBpIF0sIGdlb21ldHJ5LmJvbmVzICk7XG5cdFx0XHRcdGlmICggY2xpcCApIG91dHB1dEFuaW1hdGlvbnMucHVzaCggY2xpcCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHBhcnNlIGltcGxpY2l0IG1vcnBoIGFuaW1hdGlvbnNcblx0XHRcdGlmICggZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hhdCBhbiBhcHByb3ByYWl0ZSBGUFMgaXMgZm9yIG1vcnBoIHRhcmdldCBhbmltYXRpb25zIC0tIGRlZmF1bHRpbmcgdG8gMTAsIGJ1dCByZWFsbHkgaXQgaXMgY29tcGxldGVseSBhcmJpdHJhcnkuXG5cdFx0XHRcdHZhciBtb3JwaEFuaW1hdGlvbkNsaXBzID0gQW5pbWF0aW9uQ2xpcC5DcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlcyggZ2VvbWV0cnkubW9ycGhUYXJnZXRzLCAxMCApO1xuXHRcdFx0XHRvdXRwdXRBbmltYXRpb25zID0gb3V0cHV0QW5pbWF0aW9ucy5jb25jYXQoIG1vcnBoQW5pbWF0aW9uQ2xpcHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG91dHB1dEFuaW1hdGlvbnMubGVuZ3RoID4gMCApIGdlb21ldHJ5LmFuaW1hdGlvbnMgPSBvdXRwdXRBbmltYXRpb25zO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHBhcnNlKCBqc29uLCB0ZXh0dXJlUGF0aCApIHtcblxuXHRcdFx0aWYgKCBqc29uLmRhdGEgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBHZW9tZXRyeSA0LjAgc3BlY1xuXHRcdFx0XHRqc29uID0ganNvbi5kYXRhO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi5zY2FsZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGpzb24uc2NhbGUgPSAxLjAgLyBqc29uLnNjYWxlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGpzb24uc2NhbGUgPSAxLjA7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KCk7XG5cblx0XHRcdHBhcnNlTW9kZWwoIGpzb24sIGdlb21ldHJ5ICk7XG5cdFx0XHRwYXJzZVNraW4oIGpzb24sIGdlb21ldHJ5ICk7XG5cdFx0XHRwYXJzZU1vcnBoaW5nKCBqc29uLCBnZW9tZXRyeSApO1xuXHRcdFx0cGFyc2VBbmltYXRpb25zKCBqc29uLCBnZW9tZXRyeSApO1xuXG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0XHRpZiAoIGpzb24ubWF0ZXJpYWxzID09PSB1bmRlZmluZWQgfHwganNvbi5tYXRlcmlhbHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB7IGdlb21ldHJ5OiBnZW9tZXRyeSB9O1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBtYXRlcmlhbHMgPSBMb2FkZXIucHJvdG90eXBlLmluaXRNYXRlcmlhbHMoIGpzb24ubWF0ZXJpYWxzLCB0ZXh0dXJlUGF0aCwgdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0XHRcdHJldHVybiB7IGdlb21ldHJ5OiBnZW9tZXRyeSwgbWF0ZXJpYWxzOiBtYXRlcmlhbHMgfTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG59ICk7XG5cblxuZXhwb3J0IHsgSlNPTkxvYWRlciB9O1xuIiwiaW1wb3J0IHtcblx0VVZNYXBwaW5nLFxuXHRDdWJlUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVSZWZyYWN0aW9uTWFwcGluZyxcblx0RXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nLFxuXHRTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nLFxuXG5cdFJlcGVhdFdyYXBwaW5nLFxuXHRDbGFtcFRvRWRnZVdyYXBwaW5nLFxuXHRNaXJyb3JlZFJlcGVhdFdyYXBwaW5nLFxuXG5cdE5lYXJlc3RGaWx0ZXIsXG5cdE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyLFxuXHROZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyLFxuXHRMaW5lYXJGaWx0ZXIsXG5cdExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIsXG5cdExpbmVhck1pcE1hcExpbmVhckZpbHRlclxufSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5pbXBvcnQgeyBHcm91cCB9IGZyb20gJy4uL29iamVjdHMvR3JvdXAuanMnO1xuaW1wb3J0IHsgU3ByaXRlIH0gZnJvbSAnLi4vb2JqZWN0cy9TcHJpdGUuanMnO1xuaW1wb3J0IHsgUG9pbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9Qb2ludHMuanMnO1xuaW1wb3J0IHsgTGluZSB9IGZyb20gJy4uL29iamVjdHMvTGluZS5qcyc7XG5pbXBvcnQgeyBMaW5lTG9vcCB9IGZyb20gJy4uL29iamVjdHMvTGluZUxvb3AuanMnO1xuaW1wb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xuaW1wb3J0IHsgTE9EIH0gZnJvbSAnLi4vb2JqZWN0cy9MT0QuanMnO1xuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL29iamVjdHMvTWVzaC5qcyc7XG5pbXBvcnQgeyBTa2lubmVkTWVzaCB9IGZyb20gJy4uL29iamVjdHMvU2tpbm5lZE1lc2guanMnO1xuaW1wb3J0IHsgU2hhcGUgfSBmcm9tICcuLi9leHRyYXMvY29yZS9TaGFwZS5qcyc7XG5pbXBvcnQgeyBGb2cgfSBmcm9tICcuLi9zY2VuZXMvRm9nLmpzJztcbmltcG9ydCB7IEZvZ0V4cDIgfSBmcm9tICcuLi9zY2VuZXMvRm9nRXhwMi5qcyc7XG5pbXBvcnQgeyBIZW1pc3BoZXJlTGlnaHQgfSBmcm9tICcuLi9saWdodHMvSGVtaXNwaGVyZUxpZ2h0LmpzJztcbmltcG9ydCB7IFNwb3RMaWdodCB9IGZyb20gJy4uL2xpZ2h0cy9TcG90TGlnaHQuanMnO1xuaW1wb3J0IHsgUG9pbnRMaWdodCB9IGZyb20gJy4uL2xpZ2h0cy9Qb2ludExpZ2h0LmpzJztcbmltcG9ydCB7IERpcmVjdGlvbmFsTGlnaHQgfSBmcm9tICcuLi9saWdodHMvRGlyZWN0aW9uYWxMaWdodC5qcyc7XG5pbXBvcnQgeyBBbWJpZW50TGlnaHQgfSBmcm9tICcuLi9saWdodHMvQW1iaWVudExpZ2h0LmpzJztcbmltcG9ydCB7IFJlY3RBcmVhTGlnaHQgfSBmcm9tICcuLi9saWdodHMvUmVjdEFyZWFMaWdodC5qcyc7XG5pbXBvcnQgeyBPcnRob2dyYXBoaWNDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL09ydGhvZ3JhcGhpY0NhbWVyYS5qcyc7XG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4uL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xuaW1wb3J0IHsgU2NlbmUgfSBmcm9tICcuLi9zY2VuZXMvU2NlbmUuanMnO1xuaW1wb3J0IHsgQ3ViZVRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9DdWJlVGV4dHVyZS5qcyc7XG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvVGV4dHVyZS5qcyc7XG5pbXBvcnQgeyBJbWFnZUxvYWRlciB9IGZyb20gJy4vSW1hZ2VMb2FkZXIuanMnO1xuaW1wb3J0IHsgTG9hZGluZ01hbmFnZXIsIERlZmF1bHRMb2FkaW5nTWFuYWdlciB9IGZyb20gJy4vTG9hZGluZ01hbmFnZXIuanMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uQ2xpcCB9IGZyb20gJy4uL2FuaW1hdGlvbi9BbmltYXRpb25DbGlwLmpzJztcbmltcG9ydCB7IE1hdGVyaWFsTG9hZGVyIH0gZnJvbSAnLi9NYXRlcmlhbExvYWRlci5qcyc7XG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeUxvYWRlciB9IGZyb20gJy4vQnVmZmVyR2VvbWV0cnlMb2FkZXIuanMnO1xuaW1wb3J0IHsgSlNPTkxvYWRlciB9IGZyb20gJy4vSlNPTkxvYWRlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9GaWxlTG9hZGVyLmpzJztcbmltcG9ydCAqIGFzIEdlb21ldHJpZXMgZnJvbSAnLi4vZ2VvbWV0cmllcy9HZW9tZXRyaWVzLmpzJztcbmltcG9ydCAqIGFzIEN1cnZlcyBmcm9tICcuLi9leHRyYXMvY3VydmVzL0N1cnZlcy5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBPYmplY3RMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cdHRoaXMudGV4dHVyZVBhdGggPSAnJztcblxufVxuXG5PYmplY3QuYXNzaWduKCBPYmplY3RMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0Y3Jvc3NPcmlnaW46ICdhbm9ueW1vdXMnLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHRoaXMudGV4dHVyZVBhdGggPT09ICcnICkge1xuXG5cdFx0XHR0aGlzLnRleHR1cmVQYXRoID0gdXJsLnN1YnN0cmluZyggMCwgdXJsLmxhc3RJbmRleE9mKCAnLycgKSArIDEgKTtcblxuXHRcdH1cblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdHZhciBqc29uID0gbnVsbDtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRqc29uID0gSlNPTi5wYXJzZSggdGV4dCApO1xuXG5cdFx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdFx0aWYgKCBvbkVycm9yICE9PSB1bmRlZmluZWQgKSBvbkVycm9yKCBlcnJvciApO1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRTpPYmplY3RMb2FkZXI6IENhblxcJ3QgcGFyc2UgJyArIHVybCArICcuJywgZXJyb3IubWVzc2FnZSApO1xuXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhO1xuXG5cdFx0XHRpZiAoIG1ldGFkYXRhID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlwZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2dlb21ldHJ5JyApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW5cXCd0IGxvYWQgJyArIHVybCArICcuIFVzZSBUSFJFRS5KU09OTG9hZGVyIGluc3RlYWQuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0c2NvcGUucGFyc2UoIGpzb24sIG9uTG9hZCApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0c2V0VGV4dHVyZVBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVQYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9hZCApIHtcblxuXHRcdHZhciBzaGFwZXMgPSB0aGlzLnBhcnNlU2hhcGUoIGpzb24uc2hhcGVzICk7XG5cdFx0dmFyIGdlb21ldHJpZXMgPSB0aGlzLnBhcnNlR2VvbWV0cmllcygganNvbi5nZW9tZXRyaWVzLCBzaGFwZXMgKTtcblxuXHRcdHZhciBpbWFnZXMgPSB0aGlzLnBhcnNlSW1hZ2VzKCBqc29uLmltYWdlcywgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcblxuXHRcdH0gKTtcblxuXHRcdHZhciB0ZXh0dXJlcyA9IHRoaXMucGFyc2VUZXh0dXJlcygganNvbi50ZXh0dXJlcywgaW1hZ2VzICk7XG5cdFx0dmFyIG1hdGVyaWFscyA9IHRoaXMucGFyc2VNYXRlcmlhbHMoIGpzb24ubWF0ZXJpYWxzLCB0ZXh0dXJlcyApO1xuXG5cdFx0dmFyIG9iamVjdCA9IHRoaXMucGFyc2VPYmplY3QoIGpzb24ub2JqZWN0LCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKTtcblxuXHRcdGlmICgganNvbi5hbmltYXRpb25zICkge1xuXG5cdFx0XHRvYmplY3QuYW5pbWF0aW9ucyA9IHRoaXMucGFyc2VBbmltYXRpb25zKCBqc29uLmFuaW1hdGlvbnMgKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5pbWFnZXMgPT09IHVuZGVmaW5lZCB8fCBqc29uLmltYWdlcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSBvbkxvYWQoIG9iamVjdCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9LFxuXG5cdHBhcnNlU2hhcGU6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciBzaGFwZXMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHNoYXBlID0gbmV3IFNoYXBlKCkuZnJvbUpTT04oIGpzb25bIGkgXSApO1xuXG5cdFx0XHRcdHNoYXBlc1sgc2hhcGUudXVpZCBdID0gc2hhcGU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBzaGFwZXM7XG5cblx0fSxcblxuXHRwYXJzZUdlb21ldHJpZXM6IGZ1bmN0aW9uICgganNvbiwgc2hhcGVzICkge1xuXG5cdFx0dmFyIGdlb21ldHJpZXMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnlMb2FkZXIgPSBuZXcgSlNPTkxvYWRlcigpO1xuXHRcdFx0dmFyIGJ1ZmZlckdlb21ldHJ5TG9hZGVyID0gbmV3IEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnk7XG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdHN3aXRjaCAoIGRhdGEudHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ1BsYW5lR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1BsYW5lQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50c1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdCb3hHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQm94QnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0N1YmVHZW9tZXRyeSc6IC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlXG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXB0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRlcHRoU2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ2lyY2xlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0NpcmNsZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1c1RvcCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXNCb3R0b20sXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wZW5FbmRlZCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0NvbmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ29uZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcGVuRW5kZWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdTcGhlcmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlMZW5ndGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdEb2RlY2FoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0ljb3NhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0ljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ09jdGFoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUZXRyYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRldGFpbFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdSaW5nR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1JpbmdCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLmlubmVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm91dGVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0dlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUb3J1c0J1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YmUsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmFyY1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0tub3RHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNLbm90QnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHViZSxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJ1bGFyU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5xXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0xhdGhlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0xhdGhlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5wb2ludHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuc2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1BvbHloZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEudmVydGljZXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaW5kaWNlcyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuZGV0YWlsc1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdTaGFwZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdTaGFwZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0dmFyIGdlb21ldHJ5U2hhcGVzID0gW107XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBkYXRhLnNoYXBlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGRhdGEuc2hhcGVzWyBqIF0gXTtcblxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcy5wdXNoKCBzaGFwZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5jdXJ2ZVNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXG5cdFx0XHRcdFx0Y2FzZSAnRXh0cnVkZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdFeHRydWRlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHR2YXIgZ2VvbWV0cnlTaGFwZXMgPSBbXTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGRhdGEuc2hhcGVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgZGF0YS5zaGFwZXNbIGogXSBdO1xuXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5U2hhcGVzLnB1c2goIHNoYXBlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dmFyIGV4dHJ1ZGVQYXRoID0gZGF0YS5vcHRpb25zLmV4dHJ1ZGVQYXRoO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGV4dHJ1ZGVQYXRoICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0ZGF0YS5vcHRpb25zLmV4dHJ1ZGVQYXRoID0gbmV3IEN1cnZlc1sgZXh0cnVkZVBhdGgudHlwZSBdKCkuZnJvbUpTT04oIGV4dHJ1ZGVQYXRoICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5U2hhcGVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wdGlvbnNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IGJ1ZmZlckdlb21ldHJ5TG9hZGVyLnBhcnNlKCBkYXRhICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IGdlb21ldHJ5TG9hZGVyLnBhcnNlKCBkYXRhLCB0aGlzLnRleHR1cmVQYXRoICkuZ2VvbWV0cnk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlIFwiJyArIGRhdGEudHlwZSArICdcIicgKTtcblxuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdlb21ldHJ5LnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIGdlb21ldHJ5Lm5hbWUgPSBkYXRhLm5hbWU7XG5cdFx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSA9PT0gdHJ1ZSAmJiBkYXRhLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBnZW9tZXRyeS51c2VyRGF0YSA9IGRhdGEudXNlckRhdGE7XG5cblx0XHRcdFx0Z2VvbWV0cmllc1sgZGF0YS51dWlkIF0gPSBnZW9tZXRyeTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJpZXM7XG5cblx0fSxcblxuXHRwYXJzZU1hdGVyaWFsczogZnVuY3Rpb24gKCBqc29uLCB0ZXh0dXJlcyApIHtcblxuXHRcdHZhciBtYXRlcmlhbHMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbG9hZGVyID0gbmV3IE1hdGVyaWFsTG9hZGVyKCk7XG5cdFx0XHRsb2FkZXIuc2V0VGV4dHVyZXMoIHRleHR1cmVzICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEudHlwZSA9PT0gJ011bHRpTWF0ZXJpYWwnICkge1xuXG5cdFx0XHRcdFx0Ly8gRGVwcmVjYXRlZFxuXG5cdFx0XHRcdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBkYXRhLm1hdGVyaWFscy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdGFycmF5LnB1c2goIGxvYWRlci5wYXJzZSggZGF0YS5tYXRlcmlhbHNbIGogXSApICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRtYXRlcmlhbHNbIGRhdGEudXVpZCBdID0gYXJyYXk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBsb2FkZXIucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRlcmlhbHM7XG5cblx0fSxcblxuXHRwYXJzZUFuaW1hdGlvbnM6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciBhbmltYXRpb25zID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBqc29uLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGRhdGEgPSBqc29uWyBpIF07XG5cblx0XHRcdHZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRpZiAoIGRhdGEudXVpZCAhPT0gdW5kZWZpbmVkICkgY2xpcC51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRhbmltYXRpb25zLnB1c2goIGNsaXAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhbmltYXRpb25zO1xuXG5cdH0sXG5cblx0cGFyc2VJbWFnZXM6IGZ1bmN0aW9uICgganNvbiwgb25Mb2FkICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblx0XHR2YXIgaW1hZ2VzID0ge307XG5cblx0XHRmdW5jdGlvbiBsb2FkSW1hZ2UoIHVybCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRyZXR1cm4gbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgJiYganNvbi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlciggb25Mb2FkICk7XG5cblx0XHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKTtcblx0XHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0ganNvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgaW1hZ2UgPSBqc29uWyBpIF07XG5cdFx0XHRcdHZhciB1cmwgPSBpbWFnZS51cmw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcblxuXHRcdFx0XHRcdC8vIGxvYWQgYXJyYXkgb2YgaW1hZ2VzIGUuZyBDdWJlVGV4dHVyZVxuXG5cdFx0XHRcdFx0aW1hZ2VzWyBpbWFnZS51dWlkIF0gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSB1cmwubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjdXJyZW50VXJsID0gdXJsWyBqIF07XG5cblx0XHRcdFx0XHRcdHZhciBwYXRoID0gL14oXFwvXFwvKXwoW2Etel0rOihcXC9cXC8pPykvaS50ZXN0KCBjdXJyZW50VXJsICkgPyBjdXJyZW50VXJsIDogc2NvcGUudGV4dHVyZVBhdGggKyBjdXJyZW50VXJsO1xuXG5cdFx0XHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXS5wdXNoKCBsb2FkSW1hZ2UoIHBhdGggKSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBsb2FkIHNpbmdsZSBpbWFnZVxuXG5cdFx0XHRcdFx0dmFyIHBhdGggPSAvXihcXC9cXC8pfChbYS16XSs6KFxcL1xcLyk/KS9pLnRlc3QoIGltYWdlLnVybCApID8gaW1hZ2UudXJsIDogc2NvcGUudGV4dHVyZVBhdGggKyBpbWFnZS51cmw7XG5cblx0XHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXSA9IGxvYWRJbWFnZSggcGF0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlcztcblxuXHR9LFxuXG5cdHBhcnNlVGV4dHVyZXM6IGZ1bmN0aW9uICgganNvbiwgaW1hZ2VzICkge1xuXG5cdFx0ZnVuY3Rpb24gcGFyc2VDb25zdGFudCggdmFsdWUsIHR5cGUgKSB7XG5cblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyApIHJldHVybiB2YWx1ZTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlVGV4dHVyZTogQ29uc3RhbnQgc2hvdWxkIGJlIGluIG51bWVyaWMgZm9ybS4nLCB2YWx1ZSApO1xuXG5cdFx0XHRyZXR1cm4gdHlwZVsgdmFsdWUgXTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZXh0dXJlcyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gXCJpbWFnZVwiIHNwZWNpZmllZCBmb3InLCBkYXRhLnV1aWQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UnLCBkYXRhLmltYWdlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB0ZXh0dXJlO1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggaW1hZ2VzWyBkYXRhLmltYWdlIF0gKSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoIGltYWdlc1sgZGF0YS5pbWFnZSBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgVGV4dHVyZSggaW1hZ2VzWyBkYXRhLmltYWdlIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0dGV4dHVyZS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5HICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm9mZnNldCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBkYXRhLm9mZnNldCApO1xuXHRcdFx0XHRpZiAoIGRhdGEucmVwZWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7XG5cdFx0XHRcdGlmICggZGF0YS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY2VudGVyLmZyb21BcnJheSggZGF0YS5jZW50ZXIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJvdGF0aW9uID0gZGF0YS5yb3RhdGlvbjtcblxuXHRcdFx0XHRpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwUyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMCBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZm9ybWF0ID0gZGF0YS5mb3JtYXQ7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1pbkZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYWdGaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hZ0ZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZmxpcFkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZmxpcFkgPSBkYXRhLmZsaXBZO1xuXG5cdFx0XHRcdHRleHR1cmVzWyBkYXRhLnV1aWQgXSA9IHRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlcztcblxuXHR9LFxuXG5cdHBhcnNlT2JqZWN0OiBmdW5jdGlvbiAoIGRhdGEsIGdlb21ldHJpZXMsIG1hdGVyaWFscyApIHtcblxuXHRcdHZhciBvYmplY3Q7XG5cblx0XHRmdW5jdGlvbiBnZXRHZW9tZXRyeSggbmFtZSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyaWVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBnZW9tZXRyeScsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZ2VvbWV0cmllc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0TWF0ZXJpYWwoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cblx0XHRcdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHV1aWQgPSBuYW1lWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgdXVpZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWxzWyB1dWlkIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGFycmF5O1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWxzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XG5cblx0XHRcdGNhc2UgJ1NjZW5lJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU2NlbmUoKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuYmFja2dyb3VuZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBOdW1iZXIuaXNJbnRlZ2VyKCBkYXRhLmJhY2tncm91bmQgKSApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmJhY2tncm91bmQgPSBuZXcgQ29sb3IoIGRhdGEuYmFja2dyb3VuZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGRhdGEuZm9nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2cnICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZyggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLm5lYXIsIGRhdGEuZm9nLmZhciApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZ0V4cDInICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZ0V4cDIoIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5kZW5zaXR5ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQZXJzcGVjdGl2ZUNhbWVyYSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBkYXRhLmZvdiwgZGF0YS5hc3BlY3QsIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZm9jdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mb2N1cyA9IGRhdGEuZm9jdXM7XG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcblx0XHRcdFx0aWYgKCBkYXRhLmZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1HYXVnZSA9IGRhdGEuZmlsbUdhdWdlO1xuXHRcdFx0XHRpZiAoIGRhdGEuZmlsbU9mZnNldCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1PZmZzZXQgPSBkYXRhLmZpbG1PZmZzZXQ7XG5cdFx0XHRcdGlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnT3J0aG9ncmFwaGljQ2FtZXJhJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCBkYXRhLmxlZnQsIGRhdGEucmlnaHQsIGRhdGEudG9wLCBkYXRhLmJvdHRvbSwgZGF0YS5uZWFyLCBkYXRhLmZhciApO1xuXG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcblx0XHRcdFx0aWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdBbWJpZW50TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBBbWJpZW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQb2ludExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUG9pbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuZGVjYXkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUmVjdEFyZWFMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFJlY3RBcmVhTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodCApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcG90TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmFuZ2xlLCBkYXRhLnBlbnVtYnJhLCBkYXRhLmRlY2F5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEhlbWlzcGhlcmVMaWdodCggZGF0YS5jb2xvciwgZGF0YS5ncm91bmRDb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU2tpbm5lZE1lc2gnOlxuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZU9iamVjdCgpIGRvZXMgbm90IHN1cHBvcnQgU2tpbm5lZE1lc2ggeWV0LicgKTtcblxuXHRcdFx0Y2FzZSAnTWVzaCc6XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcblx0XHRcdFx0dmFyIG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMT0QnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMT0QoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICksIGRhdGEubW9kZSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMaW5lTG9vcCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVMb29wKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0xpbmVTZWdtZW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVTZWdtZW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQb2ludENsb3VkJzpcblx0XHRcdGNhc2UgJ1BvaW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTcHJpdGUnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcHJpdGUoIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnR3JvdXAnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBHcm91cCgpO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0LnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRpZiAoIGRhdGEubWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC5tYXRyaXguZnJvbUFycmF5KCBkYXRhLm1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGRhdGEubWF0cml4QXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBkYXRhLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0XHRpZiAoIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlICkgb2JqZWN0Lm1hdHJpeC5kZWNvbXBvc2UoIG9iamVjdC5wb3NpdGlvbiwgb2JqZWN0LnF1YXRlcm5pb24sIG9iamVjdC5zY2FsZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucG9zaXRpb24uZnJvbUFycmF5KCBkYXRhLnBvc2l0aW9uICk7XG5cdFx0XHRpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5yb3RhdGlvbi5mcm9tQXJyYXkoIGRhdGEucm90YXRpb24gKTtcblx0XHRcdGlmICggZGF0YS5xdWF0ZXJuaW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucXVhdGVybmlvbi5mcm9tQXJyYXkoIGRhdGEucXVhdGVybmlvbiApO1xuXHRcdFx0aWYgKCBkYXRhLnNjYWxlICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2NhbGUuZnJvbUFycmF5KCBkYXRhLnNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEuY2FzdFNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmNhc3RTaGFkb3cgPSBkYXRhLmNhc3RTaGFkb3c7XG5cdFx0aWYgKCBkYXRhLnJlY2VpdmVTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gZGF0YS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0aWYgKCBkYXRhLnNoYWRvdyApIHtcblxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5iaWFzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmJpYXMgPSBkYXRhLnNoYWRvdy5iaWFzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5yYWRpdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cucmFkaXVzID0gZGF0YS5zaGFkb3cucmFkaXVzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5tYXBTaXplICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KCBkYXRhLnNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LmNhbWVyYSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KCBkYXRhLnNoYWRvdy5jYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZGF0YS52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlzaWJsZSA9IGRhdGEudmlzaWJsZTtcblx0XHRpZiAoIGRhdGEuZnJ1c3R1bUN1bGxlZCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBkYXRhLmZydXN0dW1DdWxsZWQ7XG5cdFx0aWYgKCBkYXRhLnJlbmRlck9yZGVyICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVuZGVyT3JkZXIgPSBkYXRhLnJlbmRlck9yZGVyO1xuXHRcdGlmICggZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcblx0XHRpZiAoIGRhdGEubGF5ZXJzICE9PSB1bmRlZmluZWQgKSBvYmplY3QubGF5ZXJzLm1hc2sgPSBkYXRhLmxheWVycztcblxuXHRcdGlmICggZGF0YS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCggY2hpbGRyZW5bIGkgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdMT0QnICkge1xuXG5cdFx0XHR2YXIgbGV2ZWxzID0gZGF0YS5sZXZlbHM7XG5cblx0XHRcdGZvciAoIHZhciBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwgKysgKSB7XG5cblx0XHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBsIF07XG5cdFx0XHRcdHZhciBjaGlsZCA9IG9iamVjdC5nZXRPYmplY3RCeVByb3BlcnR5KCAndXVpZCcsIGxldmVsLm9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggY2hpbGQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5hZGRMZXZlbCggY2hpbGQsIGxldmVsLmRpc3RhbmNlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdH1cblxufSApO1xuXG52YXIgVEVYVFVSRV9NQVBQSU5HID0ge1xuXHRVVk1hcHBpbmc6IFVWTWFwcGluZyxcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLFxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyxcblx0U3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6IFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nLFxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfV1JBUFBJTkcgPSB7XG5cdFJlcGVhdFdyYXBwaW5nOiBSZXBlYXRXcmFwcGluZyxcblx0Q2xhbXBUb0VkZ2VXcmFwcGluZzogQ2xhbXBUb0VkZ2VXcmFwcGluZyxcblx0TWlycm9yZWRSZXBlYXRXcmFwcGluZzogTWlycm9yZWRSZXBlYXRXcmFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfRklMVEVSID0ge1xuXHROZWFyZXN0RmlsdGVyOiBOZWFyZXN0RmlsdGVyLFxuXHROZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcjogTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIsXG5cdE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI6IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIsXG5cdExpbmVhckZpbHRlcjogTGluZWFyRmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOiBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI6IExpbmVhck1pcE1hcExpbmVhckZpbHRlclxufTtcblxuXG5leHBvcnQgeyBPYmplY3RMb2FkZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciB0aGVzcGl0ZSAvIGh0dHA6Ly9jbGlja3RvcmVsZWFzZS5jb20vXG4gKi9cblxuaW1wb3J0IHsgQ2FjaGUgfSBmcm9tICcuL0NhY2hlLmpzJztcbmltcG9ydCB7IERlZmF1bHRMb2FkaW5nTWFuYWdlciB9IGZyb20gJy4vTG9hZGluZ01hbmFnZXIuanMnO1xuXG5cbmZ1bmN0aW9uIEltYWdlQml0bWFwTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGlmICggdHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwID09PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBjcmVhdGVJbWFnZUJpdG1hcCgpIG5vdCBzdXBwb3J0ZWQuJyApO1xuXG5cdH1cblxuXHRpZiAoIHR5cGVvZiBmZXRjaCA9PT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogZmV0Y2goKSBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHR9XG5cblx0dGhpcy5tYW5hZ2VyID0gbWFuYWdlciAhPT0gdW5kZWZpbmVkID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblx0dGhpcy5vcHRpb25zID0gdW5kZWZpbmVkO1xuXG59XG5cbkltYWdlQml0bWFwTG9hZGVyLnByb3RvdHlwZSA9IHtcblxuXHRjb25zdHJ1Y3RvcjogSW1hZ2VCaXRtYXBMb2FkZXIsXG5cblx0c2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyggb3B0aW9ucyApIHtcblxuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xuXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xuXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIDAgKTtcblxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcblxuXHRcdH1cblxuXHRcdGZldGNoKCB1cmwgKS50aGVuKCBmdW5jdGlvbiAoIHJlcyApIHtcblxuXHRcdFx0cmV0dXJuIHJlcy5ibG9iKCk7XG5cblx0XHR9ICkudGhlbiggZnVuY3Rpb24gKCBibG9iICkge1xuXG5cdFx0XHRyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoIGJsb2IsIHNjb3BlLm9wdGlvbnMgKTtcblxuXHRcdH0gKS50aGVuKCBmdW5jdGlvbiAoIGltYWdlQml0bWFwICkge1xuXG5cdFx0XHRDYWNoZS5hZGQoIHVybCwgaW1hZ2VCaXRtYXAgKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGltYWdlQml0bWFwICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHR9ICkuY2F0Y2goIGZ1bmN0aW9uICggZSApIHtcblxuXHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZSApO1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0fSApO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggLyogdmFsdWUgKi8gKSB7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn07XG5cbmV4cG9ydCB7IEltYWdlQml0bWFwTG9hZGVyIH07XG4iLCIvKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIG1pbmltYWwgY2xhc3MgZm9yIHByb3hpbmcgZnVuY3Rpb25zIHRvIFBhdGguIFJlcGxhY2VzIG9sZCBcImV4dHJhY3RTdWJwYXRocygpXCJcbiAqKi9cblxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcbmltcG9ydCB7IFBhdGggfSBmcm9tICcuL1BhdGguanMnO1xuaW1wb3J0IHsgU2hhcGUgfSBmcm9tICcuL1NoYXBlLmpzJztcbmltcG9ydCB7IFNoYXBlVXRpbHMgfSBmcm9tICcuLi9TaGFwZVV0aWxzLmpzJztcblxuZnVuY3Rpb24gU2hhcGVQYXRoKCkge1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZVBhdGgnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoKTtcblxuXHR0aGlzLnN1YlBhdGhzID0gW107XG5cdHRoaXMuY3VycmVudFBhdGggPSBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNoYXBlUGF0aC5wcm90b3R5cGUsIHtcblxuXHRtb3ZlVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGggPSBuZXcgUGF0aCgpO1xuXHRcdHRoaXMuc3ViUGF0aHMucHVzaCggdGhpcy5jdXJyZW50UGF0aCApO1xuXHRcdHRoaXMuY3VycmVudFBhdGgubW92ZVRvKCB4LCB5ICk7XG5cblx0fSxcblxuXHRsaW5lVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGgubGluZVRvKCB4LCB5ICk7XG5cblx0fSxcblxuXHRxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyggYUNQeCwgYUNQeSwgYVgsIGFZICk7XG5cblx0fSxcblxuXHRiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLmJlemllckN1cnZlVG8oIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdHNwbGluZVRocnU6IGZ1bmN0aW9uICggcHRzICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5zcGxpbmVUaHJ1KCBwdHMgKTtcblxuXHR9LFxuXG5cdHRvU2hhcGVzOiBmdW5jdGlvbiAoIGlzQ0NXLCBub0hvbGVzICkge1xuXG5cdFx0ZnVuY3Rpb24gdG9TaGFwZXNOb0hvbGVzKCBpblN1YnBhdGhzICkge1xuXG5cdFx0XHR2YXIgc2hhcGVzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluU3VicGF0aHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgdG1wUGF0aCA9IGluU3VicGF0aHNbIGkgXTtcblxuXHRcdFx0XHR2YXIgdG1wU2hhcGUgPSBuZXcgU2hhcGUoKTtcblx0XHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cblx0XHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNoYXBlcztcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGlzUG9pbnRJbnNpZGVQb2x5Z29uKCBpblB0LCBpblBvbHlnb24gKSB7XG5cblx0XHRcdHZhciBwb2x5TGVuID0gaW5Qb2x5Z29uLmxlbmd0aDtcblxuXHRcdFx0Ly8gaW5QdCBvbiBwb2x5Z29uIGNvbnRvdXIgPT4gaW1tZWRpYXRlIHN1Y2Nlc3MgICAgb3Jcblx0XHRcdC8vIHRvZ2dsaW5nIG9mIGluc2lkZS9vdXRzaWRlIGF0IGV2ZXJ5IHNpbmdsZSEgaW50ZXJzZWN0aW9uIHBvaW50IG9mIGFuIGVkZ2Vcblx0XHRcdC8vICB3aXRoIHRoZSBob3Jpem9udGFsIGxpbmUgdGhyb3VnaCBpblB0LCBsZWZ0IG9mIGluUHRcblx0XHRcdC8vICBub3QgY291bnRpbmcgbG93ZXJZIGVuZHBvaW50cyBvZiBlZGdlcyBhbmQgd2hvbGUgZWRnZXMgb24gdGhhdCBsaW5lXG5cdFx0XHR2YXIgaW5zaWRlID0gZmFsc2U7XG5cdFx0XHRmb3IgKCB2YXIgcCA9IHBvbHlMZW4gLSAxLCBxID0gMDsgcSA8IHBvbHlMZW47IHAgPSBxICsrICkge1xuXG5cdFx0XHRcdHZhciBlZGdlTG93UHQgPSBpblBvbHlnb25bIHAgXTtcblx0XHRcdFx0dmFyIGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHEgXTtcblxuXHRcdFx0XHR2YXIgZWRnZUR4ID0gZWRnZUhpZ2hQdC54IC0gZWRnZUxvd1B0Lng7XG5cdFx0XHRcdHZhciBlZGdlRHkgPSBlZGdlSGlnaFB0LnkgLSBlZGdlTG93UHQueTtcblxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBlZGdlRHkgKSA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0Ly8gbm90IHBhcmFsbGVsXG5cdFx0XHRcdFx0aWYgKCBlZGdlRHkgPCAwICkge1xuXG5cdFx0XHRcdFx0XHRlZGdlTG93UHQgPSBpblBvbHlnb25bIHEgXTsgZWRnZUR4ID0gLSBlZGdlRHg7XG5cdFx0XHRcdFx0XHRlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBwIF07IGVkZ2VEeSA9IC0gZWRnZUR5O1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggKCBpblB0LnkgPCBlZGdlTG93UHQueSApIHx8ICggaW5QdC55ID4gZWRnZUhpZ2hQdC55ICkgKSBcdFx0Y29udGludWU7XG5cblx0XHRcdFx0XHRpZiAoIGluUHQueSA9PT0gZWRnZUxvd1B0LnkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggaW5QdC54ID09PSBlZGdlTG93UHQueCApXHRcdHJldHVyblx0dHJ1ZTtcdFx0Ly8gaW5QdCBpcyBvbiBjb250b3VyID9cblx0XHRcdFx0XHRcdC8vIGNvbnRpbnVlO1x0XHRcdFx0Ly8gbm8gaW50ZXJzZWN0aW9uIG9yIGVkZ2VMb3dQdCA9PiBkb2Vzbid0IGNvdW50ICEhIVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dmFyIHBlcnBFZGdlID0gZWRnZUR5ICogKCBpblB0LnggLSBlZGdlTG93UHQueCApIC0gZWRnZUR4ICogKCBpblB0LnkgLSBlZGdlTG93UHQueSApO1xuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA9PT0gMCApXHRcdFx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHRpZiAoIHBlcnBFZGdlIDwgMCApIFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRpbnNpZGUgPSAhIGluc2lkZTtcdFx0Ly8gdHJ1ZSBpbnRlcnNlY3Rpb24gbGVmdCBvZiBpblB0XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHBhcmFsbGVsIG9yIGNvbGxpbmVhclxuXHRcdFx0XHRcdGlmICggaW5QdC55ICE9PSBlZGdlTG93UHQueSApIFx0XHRjb250aW51ZTtcdFx0XHQvLyBwYXJhbGxlbFxuXHRcdFx0XHRcdC8vIGVkZ2UgbGllcyBvbiB0aGUgc2FtZSBob3Jpem9udGFsIGxpbmUgYXMgaW5QdFxuXHRcdFx0XHRcdGlmICggKCAoIGVkZ2VIaWdoUHQueCA8PSBpblB0LnggKSAmJiAoIGluUHQueCA8PSBlZGdlTG93UHQueCApICkgfHxcblx0XHRcdFx0XHRcdCAoICggZWRnZUxvd1B0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUhpZ2hQdC54ICkgKSApXHRcdHJldHVyblx0dHJ1ZTtcdC8vIGluUHQ6IFBvaW50IG9uIGNvbnRvdXIgIVxuXHRcdFx0XHRcdC8vIGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm5cdGluc2lkZTtcblxuXHRcdH1cblxuXHRcdHZhciBpc0Nsb2NrV2lzZSA9IFNoYXBlVXRpbHMuaXNDbG9ja1dpc2U7XG5cblx0XHR2YXIgc3ViUGF0aHMgPSB0aGlzLnN1YlBhdGhzO1xuXHRcdGlmICggc3ViUGF0aHMubGVuZ3RoID09PSAwICkgcmV0dXJuIFtdO1xuXG5cdFx0aWYgKCBub0hvbGVzID09PSB0cnVlIClcdHJldHVyblx0dG9TaGFwZXNOb0hvbGVzKCBzdWJQYXRocyApO1xuXG5cblx0XHR2YXIgc29saWQsIHRtcFBhdGgsIHRtcFNoYXBlLCBzaGFwZXMgPSBbXTtcblxuXHRcdGlmICggc3ViUGF0aHMubGVuZ3RoID09PSAxICkge1xuXG5cdFx0XHR0bXBQYXRoID0gc3ViUGF0aHNbIDAgXTtcblx0XHRcdHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XG5cdFx0XHR0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXHRcdFx0cmV0dXJuIHNoYXBlcztcblxuXHRcdH1cblxuXHRcdHZhciBob2xlc0ZpcnN0ID0gISBpc0Nsb2NrV2lzZSggc3ViUGF0aHNbIDAgXS5nZXRQb2ludHMoKSApO1xuXHRcdGhvbGVzRmlyc3QgPSBpc0NDVyA/ICEgaG9sZXNGaXJzdCA6IGhvbGVzRmlyc3Q7XG5cblx0XHQvLyBjb25zb2xlLmxvZyhcIkhvbGVzIGZpcnN0XCIsIGhvbGVzRmlyc3QpO1xuXG5cdFx0dmFyIGJldHRlclNoYXBlSG9sZXMgPSBbXTtcblx0XHR2YXIgbmV3U2hhcGVzID0gW107XG5cdFx0dmFyIG5ld1NoYXBlSG9sZXMgPSBbXTtcblx0XHR2YXIgbWFpbklkeCA9IDA7XG5cdFx0dmFyIHRtcFBvaW50cztcblxuXHRcdG5ld1NoYXBlc1sgbWFpbklkeCBdID0gdW5kZWZpbmVkO1xuXHRcdG5ld1NoYXBlSG9sZXNbIG1haW5JZHggXSA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc3ViUGF0aHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dG1wUGF0aCA9IHN1YlBhdGhzWyBpIF07XG5cdFx0XHR0bXBQb2ludHMgPSB0bXBQYXRoLmdldFBvaW50cygpO1xuXHRcdFx0c29saWQgPSBpc0Nsb2NrV2lzZSggdG1wUG9pbnRzICk7XG5cdFx0XHRzb2xpZCA9IGlzQ0NXID8gISBzb2xpZCA6IHNvbGlkO1xuXG5cdFx0XHRpZiAoIHNvbGlkICkge1xuXG5cdFx0XHRcdGlmICggKCAhIGhvbGVzRmlyc3QgKSAmJiAoIG5ld1NoYXBlc1sgbWFpbklkeCBdICkgKVx0bWFpbklkeCArKztcblxuXHRcdFx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHsgczogbmV3IFNoYXBlKCksIHA6IHRtcFBvaW50cyB9O1xuXHRcdFx0XHRuZXdTaGFwZXNbIG1haW5JZHggXS5zLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xuXG5cdFx0XHRcdGlmICggaG9sZXNGaXJzdCApXHRtYWluSWR4ICsrO1xuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdjdycsIGkpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG5ld1NoYXBlSG9sZXNbIG1haW5JZHggXS5wdXNoKCB7IGg6IHRtcFBhdGgsIHA6IHRtcFBvaW50c1sgMCBdIH0gKTtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdjY3cnLCBpKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gb25seSBIb2xlcz8gLT4gcHJvYmFibHkgYWxsIFNoYXBlcyB3aXRoIHdyb25nIG9yaWVudGF0aW9uXG5cdFx0aWYgKCAhIG5ld1NoYXBlc1sgMCBdIClcdHJldHVyblx0dG9TaGFwZXNOb0hvbGVzKCBzdWJQYXRocyApO1xuXG5cblx0XHRpZiAoIG5ld1NoYXBlcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHR2YXIgYW1iaWd1b3VzID0gZmFsc2U7XG5cdFx0XHR2YXIgdG9DaGFuZ2UgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XG5cblx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XG5cblx0XHRcdFx0dmFyIHNobyA9IG5ld1NoYXBlSG9sZXNbIHNJZHggXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaElkeCA9IDA7IGhJZHggPCBzaG8ubGVuZ3RoOyBoSWR4ICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGhvID0gc2hvWyBoSWR4IF07XG5cdFx0XHRcdFx0dmFyIGhvbGVfdW5hc3NpZ25lZCA9IHRydWU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgczJJZHggPSAwOyBzMklkeCA8IG5ld1NoYXBlcy5sZW5ndGg7IHMySWR4ICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGlzUG9pbnRJbnNpZGVQb2x5Z29uKCBoby5wLCBuZXdTaGFwZXNbIHMySWR4IF0ucCApICkge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggc0lkeCAhPT0gczJJZHggKVx0dG9DaGFuZ2UucHVzaCggeyBmcm9tczogc0lkeCwgdG9zOiBzMklkeCwgaG9sZTogaElkeCB9ICk7XG5cdFx0XHRcdFx0XHRcdGlmICggaG9sZV91bmFzc2lnbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aG9sZV91bmFzc2lnbmVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgczJJZHggXS5wdXNoKCBobyApO1xuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRhbWJpZ3VvdXMgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggaG9sZV91bmFzc2lnbmVkICkge1xuXG5cdFx0XHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiYW1iaWd1b3VzOiBcIiwgYW1iaWd1b3VzKTtcblx0XHRcdGlmICggdG9DaGFuZ2UubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInRvIGNoYW5nZTogXCIsIHRvQ2hhbmdlKTtcblx0XHRcdFx0aWYgKCAhIGFtYmlndW91cyApXHRuZXdTaGFwZUhvbGVzID0gYmV0dGVyU2hhcGVIb2xlcztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIHRtcEhvbGVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG5ld1NoYXBlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dG1wU2hhcGUgPSBuZXdTaGFwZXNbIGkgXS5zO1xuXHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XG5cdFx0XHR0bXBIb2xlcyA9IG5ld1NoYXBlSG9sZXNbIGkgXTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IHRtcEhvbGVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHRtcFNoYXBlLmhvbGVzLnB1c2goIHRtcEhvbGVzWyBqIF0uaCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL2NvbnNvbGUubG9nKFwic2hhcGVcIiwgc2hhcGVzKTtcblxuXHRcdHJldHVybiBzaGFwZXM7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgU2hhcGVQYXRoIH07XG4iLCIvKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgU2hhcGVQYXRoIH0gZnJvbSAnLi9TaGFwZVBhdGguanMnO1xuXG5cbmZ1bmN0aW9uIEZvbnQoIGRhdGEgKSB7XG5cblx0dGhpcy50eXBlID0gJ0ZvbnQnO1xuXG5cdHRoaXMuZGF0YSA9IGRhdGE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRm9udC5wcm90b3R5cGUsIHtcblxuXHRpc0ZvbnQ6IHRydWUsXG5cblx0Z2VuZXJhdGVTaGFwZXM6IGZ1bmN0aW9uICggdGV4dCwgc2l6ZSApIHtcblxuXHRcdGlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IDEwMDtcblxuXHRcdHZhciBzaGFwZXMgPSBbXTtcblx0XHR2YXIgcGF0aHMgPSBjcmVhdGVQYXRocyggdGV4dCwgc2l6ZSwgdGhpcy5kYXRhICk7XG5cblx0XHRmb3IgKCB2YXIgcCA9IDAsIHBsID0gcGF0aHMubGVuZ3RoOyBwIDwgcGw7IHAgKysgKSB7XG5cblx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCBzaGFwZXMsIHBhdGhzWyBwIF0udG9TaGFwZXMoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNoYXBlcztcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIGRhdGEgKSB7XG5cblx0dmFyIGNoYXJzID0gQXJyYXkuZnJvbSA/IEFycmF5LmZyb20oIHRleHQgKSA6IFN0cmluZyggdGV4dCApLnNwbGl0KCAnJyApOyAvLyBzZWUgIzEzOTg4XG5cdHZhciBzY2FsZSA9IHNpemUgLyBkYXRhLnJlc29sdXRpb247XG5cdHZhciBsaW5lX2hlaWdodCA9ICggZGF0YS5ib3VuZGluZ0JveC55TWF4IC0gZGF0YS5ib3VuZGluZ0JveC55TWluICsgZGF0YS51bmRlcmxpbmVUaGlja25lc3MgKSAqIHNjYWxlO1xuXG5cdHZhciBwYXRocyA9IFtdO1xuXG5cdHZhciBvZmZzZXRYID0gMCwgb2Zmc2V0WSA9IDA7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0dmFyIGNoYXIgPSBjaGFyc1sgaSBdO1xuXG5cdFx0aWYgKCBjaGFyID09PSAnXFxuJyApIHtcblxuXHRcdFx0b2Zmc2V0WCA9IDA7XG5cdFx0XHRvZmZzZXRZIC09IGxpbmVfaGVpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIHJldCA9IGNyZWF0ZVBhdGgoIGNoYXIsIHNjYWxlLCBvZmZzZXRYLCBvZmZzZXRZLCBkYXRhICk7XG5cdFx0XHRvZmZzZXRYICs9IHJldC5vZmZzZXRYO1xuXHRcdFx0cGF0aHMucHVzaCggcmV0LnBhdGggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHBhdGhzO1xuXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhdGgoIGNoYXIsIHNjYWxlLCBvZmZzZXRYLCBvZmZzZXRZLCBkYXRhICkge1xuXG5cdHZhciBnbHlwaCA9IGRhdGEuZ2x5cGhzWyBjaGFyIF0gfHwgZGF0YS5nbHlwaHNbICc/JyBdO1xuXG5cdGlmICggISBnbHlwaCApIHJldHVybjtcblxuXHR2YXIgcGF0aCA9IG5ldyBTaGFwZVBhdGgoKTtcblxuXHR2YXIgeCwgeSwgY3B4LCBjcHksIGNweDEsIGNweTEsIGNweDIsIGNweTI7XG5cblx0aWYgKCBnbHlwaC5vICkge1xuXG5cdFx0dmFyIG91dGxpbmUgPSBnbHlwaC5fY2FjaGVkT3V0bGluZSB8fCAoIGdseXBoLl9jYWNoZWRPdXRsaW5lID0gZ2x5cGguby5zcGxpdCggJyAnICkgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG91dGxpbmUubGVuZ3RoOyBpIDwgbDsgKSB7XG5cblx0XHRcdHZhciBhY3Rpb24gPSBvdXRsaW5lWyBpICsrIF07XG5cblx0XHRcdHN3aXRjaCAoIGFjdGlvbiApIHtcblxuXHRcdFx0XHRjYXNlICdtJzogLy8gbW92ZVRvXG5cblx0XHRcdFx0XHR4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLm1vdmVUbyggeCwgeSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnbCc6IC8vIGxpbmVUb1xuXG5cdFx0XHRcdFx0eCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHR5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5saW5lVG8oIHgsIHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ3EnOiAvLyBxdWFkcmF0aWNDdXJ2ZVRvXG5cblx0XHRcdFx0XHRjcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdHBhdGgucXVhZHJhdGljQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4LCBjcHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2InOiAvLyBiZXppZXJDdXJ2ZVRvXG5cblx0XHRcdFx0XHRjcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTIgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLmJlemllckN1cnZlVG8oIGNweDEsIGNweTEsIGNweDIsIGNweTIsIGNweCwgY3B5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4geyBvZmZzZXRYOiBnbHlwaC5oYSAqIHNjYWxlLCBwYXRoOiBwYXRoIH07XG5cbn1cblxuZXhwb3J0IHsgRm9udCB9O1xuIiwiaW1wb3J0IHsgRm9udCB9IGZyb20gJy4uL2V4dHJhcy9jb3JlL0ZvbnQuanMnO1xuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vRmlsZUxvYWRlci5qcyc7XG5pbXBvcnQgeyBEZWZhdWx0TG9hZGluZ01hbmFnZXIgfSBmcm9tICcuL0xvYWRpbmdNYW5hZ2VyLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvbnRMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRm9udExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb247XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRm9udExvYWRlcjogdHlwZWZhY2UuanMgc3VwcG9ydCBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgdHlwZWZhY2UuanNvbiBpbnN0ZWFkLicgKTtcblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQuc3Vic3RyaW5nKCA2NSwgdGV4dC5sZW5ndGggLSAyICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZm9udCA9IHNjb3BlLnBhcnNlKCBqc29uICk7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBmb250ICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb250KCBqc29uICk7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgRm9udExvYWRlciB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBjb250ZXh0O1xuXG52YXIgQXVkaW9Db250ZXh0ID0ge1xuXG5cdGdldENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY29udGV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb250ZXh0ID0gbmV3ICggd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0ICkoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjb250ZXh0O1xuXG5cdH0sXG5cblx0c2V0Q29udGV4dDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnRleHQgPSB2YWx1ZTtcblxuXHR9XG5cbn07XG5cbmV4cG9ydCB7IEF1ZGlvQ29udGV4dCB9O1xuIiwiaW1wb3J0IHsgQXVkaW9Db250ZXh0IH0gZnJvbSAnLi4vYXVkaW8vQXVkaW9Db250ZXh0LmpzJztcbmltcG9ydCB7IEZpbGVMb2FkZXIgfSBmcm9tICcuL0ZpbGVMb2FkZXIuanMnO1xuaW1wb3J0IHsgRGVmYXVsdExvYWRpbmdNYW5hZ2VyIH0gZnJvbSAnLi9Mb2FkaW5nTWFuYWdlci5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBSZWVjZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vub3Rlcy5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW9Mb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQXVkaW9Mb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHQvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBidWZmZXIuIFRoZSBgZGVjb2RlQXVkaW9EYXRhYCBtZXRob2Rcblx0XHRcdC8vIGRldGFjaGVzIHRoZSBidWZmZXIgd2hlbiBjb21wbGV0ZSwgcHJldmVudGluZyByZXVzZS5cblx0XHRcdHZhciBidWZmZXJDb3B5ID0gYnVmZmVyLnNsaWNlKCAwICk7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblx0XHRcdGNvbnRleHQuZGVjb2RlQXVkaW9EYXRhKCBidWZmZXJDb3B5LCBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xuXG5cdFx0XHRcdG9uTG9hZCggYXVkaW9CdWZmZXIgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IEF1ZGlvTG9hZGVyIH07XG4iLCJpbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcbmltcG9ydCB7IF9NYXRoIH0gZnJvbSAnLi4vbWF0aC9NYXRoLmpzJztcbmltcG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTdGVyZW9DYW1lcmEoKSB7XG5cblx0dGhpcy50eXBlID0gJ1N0ZXJlb0NhbWVyYSc7XG5cblx0dGhpcy5hc3BlY3QgPSAxO1xuXG5cdHRoaXMuZXllU2VwID0gMC4wNjQ7XG5cblx0dGhpcy5jYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdHRoaXMuY2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7XG5cdHRoaXMuY2FtZXJhTC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5jYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdHRoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKCAyICk7XG5cdHRoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU3RlcmVvQ2FtZXJhLnByb3RvdHlwZSwge1xuXG5cdHVwZGF0ZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW5zdGFuY2UsIGZvY3VzLCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyLCB6b29tLCBleWVTZXA7XG5cblx0XHR2YXIgZXllUmlnaHQgPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciBleWVMZWZ0ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoIGNhbWVyYSApIHtcblxuXHRcdFx0dmFyIG5lZWRzVXBkYXRlID0gaW5zdGFuY2UgIT09IHRoaXMgfHwgZm9jdXMgIT09IGNhbWVyYS5mb2N1cyB8fCBmb3YgIT09IGNhbWVyYS5mb3YgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0IHx8IG5lYXIgIT09IGNhbWVyYS5uZWFyIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmYXIgIT09IGNhbWVyYS5mYXIgfHwgem9vbSAhPT0gY2FtZXJhLnpvb20gfHwgZXllU2VwICE9PSB0aGlzLmV5ZVNlcDtcblxuXHRcdFx0aWYgKCBuZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0XHRpbnN0YW5jZSA9IHRoaXM7XG5cdFx0XHRcdGZvY3VzID0gY2FtZXJhLmZvY3VzO1xuXHRcdFx0XHRmb3YgPSBjYW1lcmEuZm92O1xuXHRcdFx0XHRhc3BlY3QgPSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3Q7XG5cdFx0XHRcdG5lYXIgPSBjYW1lcmEubmVhcjtcblx0XHRcdFx0ZmFyID0gY2FtZXJhLmZhcjtcblx0XHRcdFx0em9vbSA9IGNhbWVyYS56b29tO1xuXG5cdFx0XHRcdC8vIE9mZi1heGlzIHN0ZXJlb3Njb3BpYyBlZmZlY3QgYmFzZWQgb25cblx0XHRcdFx0Ly8gaHR0cDovL3BhdWxib3Vya2UubmV0L3N0ZXJlb2dyYXBoaWNzL3N0ZXJlb3JlbmRlci9cblxuXHRcdFx0XHR2YXIgcHJvamVjdGlvbk1hdHJpeCA9IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCk7XG5cdFx0XHRcdGV5ZVNlcCA9IHRoaXMuZXllU2VwIC8gMjtcblx0XHRcdFx0dmFyIGV5ZVNlcE9uUHJvamVjdGlvbiA9IGV5ZVNlcCAqIG5lYXIgLyBmb2N1cztcblx0XHRcdFx0dmFyIHltYXggPSAoIG5lYXIgKiBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIGZvdiAqIDAuNSApICkgLyB6b29tO1xuXHRcdFx0XHR2YXIgeG1pbiwgeG1heDtcblxuXHRcdFx0XHQvLyB0cmFuc2xhdGUgeE9mZnNldFxuXG5cdFx0XHRcdGV5ZUxlZnQuZWxlbWVudHNbIDEyIF0gPSAtIGV5ZVNlcDtcblx0XHRcdFx0ZXllUmlnaHQuZWxlbWVudHNbIDEyIF0gPSBleWVTZXA7XG5cblx0XHRcdFx0Ly8gZm9yIGxlZnQgZXllXG5cblx0XHRcdFx0eG1pbiA9IC0geW1heCAqIGFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjtcblx0XHRcdFx0eG1heCA9IHltYXggKiBhc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XG5cblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdID0gMiAqIG5lYXIgLyAoIHhtYXggLSB4bWluICk7XG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTtcblxuXHRcdFx0XHR0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gZm9yIHJpZ2h0IGV5ZVxuXG5cdFx0XHRcdHhtaW4gPSAtIHltYXggKiBhc3BlY3QgLSBleWVTZXBPblByb2plY3Rpb247XG5cdFx0XHRcdHhtYXggPSB5bWF4ICogYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xuXG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBuZWFyIC8gKCB4bWF4IC0geG1pbiApO1xuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7XG5cblx0XHRcdFx0dGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggZXllTGVmdCApO1xuXHRcdFx0dGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBleWVSaWdodCApO1xuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG59ICk7XG5cblxuZXhwb3J0IHsgU3RlcmVvQ2FtZXJhIH07XG4iLCJpbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xuaW1wb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXRDdWJlIH0gZnJvbSAnLi4vcmVuZGVyZXJzL1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5qcyc7XG5pbXBvcnQgeyBMaW5lYXJGaWx0ZXIsIFJHQkZvcm1hdCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XG5cbi8qKlxuICogQ2FtZXJhIGZvciByZW5kZXJpbmcgY3ViZSBtYXBzXG4gKlx0LSByZW5kZXJzIHNjZW5lIGludG8gYXhpcy1hbGlnbmVkIGN1YmVcbiAqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEN1YmVDYW1lcmEoIG5lYXIsIGZhciwgY3ViZVJlc29sdXRpb24gKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdWJlQ2FtZXJhJztcblxuXHR2YXIgZm92ID0gOTAsIGFzcGVjdCA9IDE7XG5cblx0dmFyIGNhbWVyYVBYID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYVBYLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYVBYLmxvb2tBdCggbmV3IFZlY3RvcjMoIDEsIDAsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhUFggKTtcblxuXHR2YXIgY2FtZXJhTlggPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhTlgudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhTlgubG9va0F0KCBuZXcgVmVjdG9yMyggLSAxLCAwLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYU5YICk7XG5cblx0dmFyIGNhbWVyYVBZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYVBZLnVwLnNldCggMCwgMCwgMSApO1xuXHRjYW1lcmFQWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAxLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBZICk7XG5cblx0dmFyIGNhbWVyYU5ZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5ZLnVwLnNldCggMCwgMCwgLSAxICk7XG5cdGNhbWVyYU5ZLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIC0gMSwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWSApO1xuXG5cdHZhciBjYW1lcmFQWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFQWi5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAwLCAxICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBaICk7XG5cblx0dmFyIGNhbWVyYU5aID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5aLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYU5aLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWiApO1xuXG5cdHZhciBvcHRpb25zID0geyBmb3JtYXQ6IFJHQkZvcm1hdCwgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyIH07XG5cblx0dGhpcy5yZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXRDdWJlKCBjdWJlUmVzb2x1dGlvbiwgY3ViZVJlc29sdXRpb24sIG9wdGlvbnMgKTtcblx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gXCJDdWJlQ2FtZXJhXCI7XG5cblx0dGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSApIHtcblxuXHRcdGlmICggdGhpcy5wYXJlbnQgPT09IG51bGwgKSB0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXQ7XG5cdFx0dmFyIGdlbmVyYXRlTWlwbWFwcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcblxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMDtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWCwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAxO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5YLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDI7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFksIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMztcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWSwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSA0O1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBaLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGdlbmVyYXRlTWlwbWFwcztcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDU7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlosIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBudWxsICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCByZW5kZXJlciwgY29sb3IsIGRlcHRoLCBzdGVuY2lsICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gaTtcblx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdHJlbmRlcmVyLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTtcblxuXHRcdH1cblxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbnVsbCApO1xuXG5cdH07XG5cbn1cblxuQ3ViZUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkN1YmVDYW1lcmEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViZUNhbWVyYTtcblxuXG5leHBvcnQgeyBDdWJlQ2FtZXJhIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vbWF0aC9RdWF0ZXJuaW9uLmpzJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5pbXBvcnQgeyBBdWRpb0NvbnRleHQgfSBmcm9tICcuL0F1ZGlvQ29udGV4dC5qcyc7XG5cbmZ1bmN0aW9uIEF1ZGlvTGlzdGVuZXIoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdBdWRpb0xpc3RlbmVyJztcblxuXHR0aGlzLmNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpO1xuXG5cdHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblxuXHR0aGlzLmZpbHRlciA9IG51bGw7XG5cbn1cblxuQXVkaW9MaXN0ZW5lci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBdWRpb0xpc3RlbmVyLFxuXG5cdGdldElucHV0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluO1xuXG5cdH0sXG5cblx0cmVtb3ZlRmlsdGVyOiBmdW5jdGlvbiAoICkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyICk7XG5cdFx0XHR0aGlzLmZpbHRlci5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblx0XHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblx0XHRcdHRoaXMuZmlsdGVyID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0RmlsdGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXI7XG5cblx0fSxcblxuXHRzZXRGaWx0ZXI6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVyICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcblx0XHRcdHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5maWx0ZXIgPSB2YWx1ZTtcblx0XHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcblx0XHR0aGlzLmZpbHRlci5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0TWFzdGVyVm9sdW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XG5cblx0fSxcblxuXHRzZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoIHZhbHVlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cdFx0dmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBvcmllbnRhdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xuXG5cdFx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdFx0dmFyIGxpc3RlbmVyID0gdGhpcy5jb250ZXh0Lmxpc3RlbmVyO1xuXHRcdFx0dmFyIHVwID0gdGhpcy51cDtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApO1xuXG5cdFx0XHRvcmllbnRhdGlvbi5zZXQoIDAsIDAsIC0gMSApLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRpZiAoIGxpc3RlbmVyLnBvc2l0aW9uWCApIHtcblxuXHRcdFx0XHRsaXN0ZW5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5wb3NpdGlvblkuc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5wb3NpdGlvblouc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5mb3J3YXJkWC5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueCwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLmZvcndhcmRZLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIuZm9yd2FyZFouc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci51cFguc2V0VmFsdWVBdFRpbWUoIHVwLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci51cFkuc2V0VmFsdWVBdFRpbWUoIHVwLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci51cFouc2V0VmFsdWVBdFRpbWUoIHVwLnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGxpc3RlbmVyLnNldFBvc2l0aW9uKCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICk7XG5cdFx0XHRcdGxpc3RlbmVyLnNldE9yaWVudGF0aW9uKCBvcmllbnRhdGlvbi54LCBvcmllbnRhdGlvbi55LCBvcmllbnRhdGlvbi56LCB1cC54LCB1cC55LCB1cC56ICk7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG5leHBvcnQgeyBBdWRpb0xpc3RlbmVyIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFJlZWNlIEFhcm9uIExlY3JpdmFpbiAvIGh0dHA6Ly9yZWVjZW5vdGVzLmNvbS9cbiAqL1xuXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xuXG5mdW5jdGlvbiBBdWRpbyggbGlzdGVuZXIgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdBdWRpbyc7XG5cblx0dGhpcy5jb250ZXh0ID0gbGlzdGVuZXIuY29udGV4dDtcblxuXHR0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xuXHR0aGlzLmdhaW4uY29ubmVjdCggbGlzdGVuZXIuZ2V0SW5wdXQoKSApO1xuXG5cdHRoaXMuYXV0b3BsYXkgPSBmYWxzZTtcblxuXHR0aGlzLmJ1ZmZlciA9IG51bGw7XG5cdHRoaXMubG9vcCA9IGZhbHNlO1xuXHR0aGlzLnN0YXJ0VGltZSA9IDA7XG5cdHRoaXMub2Zmc2V0ID0gMDtcblx0dGhpcy5wbGF5YmFja1JhdGUgPSAxO1xuXHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IHRydWU7XG5cdHRoaXMuc291cmNlVHlwZSA9ICdlbXB0eSc7XG5cblx0dGhpcy5maWx0ZXJzID0gW107XG5cbn1cblxuQXVkaW8ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQXVkaW8sXG5cblx0Z2V0T3V0cHV0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluO1xuXG5cdH0sXG5cblx0c2V0Tm9kZVNvdXJjZTogZnVuY3Rpb24gKCBhdWRpb05vZGUgKSB7XG5cblx0XHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IGZhbHNlO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdhdWRpb05vZGUnO1xuXHRcdHRoaXMuc291cmNlID0gYXVkaW9Ob2RlO1xuXHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRNZWRpYUVsZW1lbnRTb3VyY2U6IGZ1bmN0aW9uICggbWVkaWFFbGVtZW50ICkge1xuXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnbWVkaWFOb2RlJztcblx0XHR0aGlzLnNvdXJjZSA9IHRoaXMuY29udGV4dC5jcmVhdGVNZWRpYUVsZW1lbnRTb3VyY2UoIG1lZGlhRWxlbWVudCApO1xuXHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRCdWZmZXI6IGZ1bmN0aW9uICggYXVkaW9CdWZmZXIgKSB7XG5cblx0XHR0aGlzLmJ1ZmZlciA9IGF1ZGlvQnVmZmVyO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdidWZmZXInO1xuXG5cdFx0aWYgKCB0aGlzLmF1dG9wbGF5ICkgdGhpcy5wbGF5KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHBsYXk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiBBdWRpbyBpcyBhbHJlYWR5IHBsYXlpbmcuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBzb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7XG5cblx0XHRzb3VyY2UuYnVmZmVyID0gdGhpcy5idWZmZXI7XG5cdFx0c291cmNlLmxvb3AgPSB0aGlzLmxvb3A7XG5cdFx0c291cmNlLm9uZW5kZWQgPSB0aGlzLm9uRW5kZWQuYmluZCggdGhpcyApO1xuXHRcdHNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLnN0YXJ0VGltZSApO1xuXHRcdHRoaXMuc3RhcnRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO1xuXHRcdHNvdXJjZS5zdGFydCggdGhpcy5zdGFydFRpbWUsIHRoaXMub2Zmc2V0ICk7XG5cblx0XHR0aGlzLmlzUGxheWluZyA9IHRydWU7XG5cblx0XHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblxuXHRcdHJldHVybiB0aGlzLmNvbm5lY3QoKTtcblxuXHR9LFxuXG5cdHBhdXNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2Uuc3RvcCgpO1xuXHRcdFx0dGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGw7XG5cdFx0XHR0aGlzLm9mZnNldCArPSAoIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSAtIHRoaXMuc3RhcnRUaW1lICkgKiB0aGlzLnBsYXliYWNrUmF0ZTtcblx0XHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLnNvdXJjZS5zdG9wKCk7XG5cdFx0dGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGw7XG5cdFx0dGhpcy5vZmZzZXQgPSAwO1xuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbm5lY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgaSAtIDEgXS5jb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5jb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5jb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc2Nvbm5lY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgaSAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEZpbHRlcnM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlcnM7XG5cblx0fSxcblxuXHRzZXRGaWx0ZXJzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCAhIHZhbHVlICkgdmFsdWUgPSBbXTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuZGlzY29ubmVjdCgpO1xuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWU7XG5cdFx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuZmlsdGVycyA9IHZhbHVlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdldEZpbHRlcnMoKVsgMCBdO1xuXG5cdH0sXG5cblx0c2V0RmlsdGVyOiBmdW5jdGlvbiAoIGZpbHRlciApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZpbHRlcnMoIGZpbHRlciA/IFsgZmlsdGVyIF0gOiBbXSApO1xuXG5cdH0sXG5cblx0c2V0UGxheWJhY2tSYXRlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMucGxheWJhY2tSYXRlID0gdmFsdWU7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0UGxheWJhY2tSYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU7XG5cblx0fSxcblxuXHRvbkVuZGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXG5cdH0sXG5cblx0Z2V0TG9vcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmxvb3A7XG5cblx0fSxcblxuXHRzZXRMb29wOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMubG9vcCA9IHZhbHVlO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UubG9vcCA9IHRoaXMubG9vcDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Vm9sdW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XG5cblx0fSxcblxuXHRzZXRWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoIHZhbHVlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5leHBvcnQgeyBBdWRpbyB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgvUXVhdGVybmlvbi5qcyc7XG5pbXBvcnQgeyBBdWRpbyB9IGZyb20gJy4vQXVkaW8uanMnO1xuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcblxuZnVuY3Rpb24gUG9zaXRpb25hbEF1ZGlvKCBsaXN0ZW5lciApIHtcblxuXHRBdWRpby5jYWxsKCB0aGlzLCBsaXN0ZW5lciApO1xuXG5cdHRoaXMucGFubmVyID0gdGhpcy5jb250ZXh0LmNyZWF0ZVBhbm5lcigpO1xuXHR0aGlzLnBhbm5lci5jb25uZWN0KCB0aGlzLmdhaW4gKTtcblxufVxuXG5Qb3NpdGlvbmFsQXVkaW8ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQXVkaW8ucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUG9zaXRpb25hbEF1ZGlvLFxuXG5cdGdldE91dHB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyO1xuXG5cdH0sXG5cblx0Z2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZTtcblxuXHR9LFxuXG5cdHNldFJlZkRpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIucmVmRGlzdGFuY2UgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I7XG5cblx0fSxcblxuXHRzZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXREaXN0YW5jZU1vZGVsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbDtcblxuXHR9LFxuXG5cdHNldERpc3RhbmNlTW9kZWw6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U7XG5cblx0fSxcblxuXHRzZXRNYXhEaXN0YW5jZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLm1heERpc3RhbmNlID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldERpcmVjdGlvbmFsQ29uZTogZnVuY3Rpb24gKCBjb25lSW5uZXJBbmdsZSwgY29uZU91dGVyQW5nbGUsIGNvbmVPdXRlckdhaW4gKSB7XG5cblx0XHR0aGlzLnBhbm5lci5jb25lSW5uZXJBbmdsZSA9IGNvbmVJbm5lckFuZ2xlO1xuXHRcdHRoaXMucGFubmVyLmNvbmVPdXRlckFuZ2xlID0gY29uZU91dGVyQW5nbGU7XG5cdFx0dGhpcy5wYW5uZXIuY29uZU91dGVyR2FpbiA9IGNvbmVPdXRlckdhaW47XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHRcdHZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgb3JpZW50YXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRcdHZhciBwYW5uZXIgPSB0aGlzLnBhbm5lcjtcblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKTtcblxuXHRcdFx0b3JpZW50YXRpb24uc2V0KCAwLCAwLCAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHRcdHBhbm5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xuXHRcdFx0cGFubmVyLnNldE9yaWVudGF0aW9uKCBvcmllbnRhdGlvbi54LCBvcmllbnRhdGlvbi55LCBvcmllbnRhdGlvbi56ICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cblxufSApO1xuXG5leHBvcnQgeyBQb3NpdGlvbmFsQXVkaW8gfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpb0FuYWx5c2VyKCBhdWRpbywgZmZ0U2l6ZSApIHtcblxuXHR0aGlzLmFuYWx5c2VyID0gYXVkaW8uY29udGV4dC5jcmVhdGVBbmFseXNlcigpO1xuXHR0aGlzLmFuYWx5c2VyLmZmdFNpemUgPSBmZnRTaXplICE9PSB1bmRlZmluZWQgPyBmZnRTaXplIDogMjA0ODtcblxuXHR0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSggdGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCApO1xuXG5cdGF1ZGlvLmdldE91dHB1dCgpLmNvbm5lY3QoIHRoaXMuYW5hbHlzZXIgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBdWRpb0FuYWx5c2VyLnByb3RvdHlwZSwge1xuXG5cdGdldEZyZXF1ZW5jeURhdGE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEoIHRoaXMuZGF0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YTtcblxuXHR9LFxuXG5cdGdldEF2ZXJhZ2VGcmVxdWVuY3k6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2YWx1ZSA9IDAsIGRhdGEgPSB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YWx1ZSArPSBkYXRhWyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWUgLyBkYXRhLmxlbmd0aDtcblxuXHR9XG5cbn0gKTtcblxuZXhwb3J0IHsgQXVkaW9BbmFseXNlciB9O1xuIiwiaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgvUXVhdGVybmlvbi5qcyc7XG5cbi8qKlxuICpcbiAqIEJ1ZmZlcmVkIHNjZW5lIGdyYXBoIHByb3BlcnR5IHRoYXQgYWxsb3dzIHdlaWdodGVkIGFjY3VtdWxhdGlvbi5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFByb3BlcnR5TWl4ZXIoIGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUgKSB7XG5cblx0dGhpcy5iaW5kaW5nID0gYmluZGluZztcblx0dGhpcy52YWx1ZVNpemUgPSB2YWx1ZVNpemU7XG5cblx0dmFyIGJ1ZmZlclR5cGUgPSBGbG9hdDY0QXJyYXksXG5cdFx0bWl4RnVuY3Rpb247XG5cblx0c3dpdGNoICggdHlwZU5hbWUgKSB7XG5cblx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fc2xlcnA7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRidWZmZXJUeXBlID0gQXJyYXk7XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NlbGVjdDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fbGVycDtcblxuXHR9XG5cblx0dGhpcy5idWZmZXIgPSBuZXcgYnVmZmVyVHlwZSggdmFsdWVTaXplICogNCApO1xuXHQvLyBsYXlvdXQ6IFsgaW5jb21pbmcgfCBhY2N1MCB8IGFjY3UxIHwgb3JpZyBdXG5cdC8vXG5cdC8vIGludGVycG9sYXRvcnMgY2FuIHVzZSAuYnVmZmVyIGFzIHRoZWlyIC5yZXN1bHRcblx0Ly8gdGhlIGRhdGEgdGhlbiBnb2VzIHRvICdpbmNvbWluZydcblx0Ly9cblx0Ly8gJ2FjY3UwJyBhbmQgJ2FjY3UxJyBhcmUgdXNlZCBmcmFtZS1pbnRlcmxlYXZlZCBmb3Jcblx0Ly8gdGhlIGN1bXVsYXRpdmUgcmVzdWx0IGFuZCBhcmUgY29tcGFyZWQgdG8gZGV0ZWN0XG5cdC8vIGNoYW5nZXNcblx0Ly9cblx0Ly8gJ29yaWcnIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHByb3BlcnR5XG5cblx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uID0gbWl4RnVuY3Rpb247XG5cblx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblxuXHR0aGlzLnVzZUNvdW50ID0gMDtcblx0dGhpcy5yZWZlcmVuY2VDb3VudCA9IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlNaXhlci5wcm90b3R5cGUsIHtcblxuXHQvLyBhY2N1bXVsYXRlIGRhdGEgaW4gdGhlICdpbmNvbWluZycgcmVnaW9uIGludG8gJ2FjY3U8aT4nXG5cdGFjY3VtdWxhdGU6IGZ1bmN0aW9uICggYWNjdUluZGV4LCB3ZWlnaHQgKSB7XG5cblx0XHQvLyBub3RlOiBoYXBwaWx5IGFjY3VtdWxhdGluZyBub3RoaW5nIHdoZW4gd2VpZ2h0ID0gMCwgdGhlIGNhbGxlciBrbm93c1xuXHRcdC8vIHRoZSB3ZWlnaHQgYW5kIHNob3VsZG4ndCBoYXZlIG1hZGUgdGhlIGNhbGwgaW4gdGhlIGZpcnN0IHBsYWNlXG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcblxuXHRcdFx0Y3VycmVudFdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodDtcblxuXHRcdGlmICggY3VycmVudFdlaWdodCA9PT0gMCApIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gaW5jb21pbmcgKiB3ZWlnaHRcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBpIF0gPSBidWZmZXJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ICs9IHdlaWdodDtcblx0XHRcdHZhciBtaXggPSB3ZWlnaHQgLyBjdXJyZW50V2VpZ2h0O1xuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKCBidWZmZXIsIG9mZnNldCwgMCwgbWl4LCBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IGN1cnJlbnRXZWlnaHQ7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgb2YgJ2FjY3U8aT4nIHRvIHRoZSBiaW5kaW5nIHdoZW4gYWNjdXMgZGlmZmVyXG5cdGFwcGx5OiBmdW5jdGlvbiAoIGFjY3VJbmRleCApIHtcblxuXHRcdHZhciBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0b2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQsXG5cblx0XHRcdGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPCAxICkge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIG9yaWdpbmFsICogKCAxIC0gY3VtdWxhdGl2ZVdlaWdodCApXG5cblx0XHRcdHZhciBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogMztcblxuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKFxuXHRcdFx0XHRidWZmZXIsIG9mZnNldCwgb3JpZ2luYWxWYWx1ZU9mZnNldCwgMSAtIHdlaWdodCwgc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IHN0cmlkZSArIHN0cmlkZTsgaSAhPT0gZTsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBidWZmZXJbIGkgXSAhPT0gYnVmZmVyWyBpICsgc3RyaWRlIF0gKSB7XG5cblx0XHRcdFx0Ly8gdmFsdWUgaGFzIGNoYW5nZWQgLT4gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRcdFx0YmluZGluZy5zZXRWYWx1ZSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbWVtYmVyIHRoZSBzdGF0ZSBvZiB0aGUgYm91bmQgcHJvcGVydHkgYW5kIGNvcHkgaXQgdG8gYm90aCBhY2N1c1xuXHRzYXZlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0b3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7XG5cblx0XHRiaW5kaW5nLmdldFZhbHVlKCBidWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcblxuXHRcdC8vIGFjY3VbMC4uMV0gOj0gb3JpZyAtLSBpbml0aWFsbHkgZGV0ZWN0IGNoYW5nZXMgYWdhaW5zdCB0aGUgb3JpZ2luYWxcblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IG9yaWdpbmFsVmFsdWVPZmZzZXQ7IGkgIT09IGU7ICsrIGkgKSB7XG5cblx0XHRcdGJ1ZmZlclsgaSBdID0gYnVmZmVyWyBvcmlnaW5hbFZhbHVlT2Zmc2V0ICsgKCBpICUgc3RyaWRlICkgXTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgcHJldmlvdXNseSB0YWtlbiB2aWEgJ3NhdmVPcmlnaW5hbFN0YXRlJyB0byB0aGUgYmluZGluZ1xuXHRyZXN0b3JlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9yaWdpbmFsVmFsdWVPZmZzZXQgPSB0aGlzLnZhbHVlU2l6ZSAqIDM7XG5cdFx0dGhpcy5iaW5kaW5nLnNldFZhbHVlKCB0aGlzLmJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApO1xuXG5cdH0sXG5cblxuXHQvLyBtaXggZnVuY3Rpb25zXG5cblx0X3NlbGVjdDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHRpZiAoIHQgPj0gMC41ICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIGRzdE9mZnNldCArIGkgXSA9IGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfc2xlcnA6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCApIHtcblxuXHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgc3JjT2Zmc2V0LCB0ICk7XG5cblx0fSxcblxuXHRfbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHR2YXIgcyA9IDEgLSB0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBqID0gZHN0T2Zmc2V0ICsgaTtcblxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSAqIHMgKyBidWZmZXJbIHNyY09mZnNldCArIGkgXSAqIHQ7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgUHJvcGVydHlNaXhlciB9O1xuIiwiLyoqXG4gKlxuICogQSByZWZlcmVuY2UgdG8gYSByZWFsIHByb3BlcnR5IGluIHRoZSBzY2VuZSBncmFwaC5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbi8vIENoYXJhY3RlcnMgW10uOi8gYXJlIHJlc2VydmVkIGZvciB0cmFjayBiaW5kaW5nIHN5bnRheC5cbnZhciBSRVNFUlZFRF9DSEFSU19SRSA9ICdcXFxcW1xcXFxdXFxcXC46XFxcXC8nO1xuXG5mdW5jdGlvbiBDb21wb3NpdGUoIHRhcmdldEdyb3VwLCBwYXRoLCBvcHRpb25hbFBhcnNlZFBhdGggKSB7XG5cblx0dmFyIHBhcnNlZFBhdGggPSBvcHRpb25hbFBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7XG5cblx0dGhpcy5fdGFyZ2V0R3JvdXAgPSB0YXJnZXRHcm91cDtcblx0dGhpcy5fYmluZGluZ3MgPSB0YXJnZXRHcm91cC5zdWJzY3JpYmVfKCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ29tcG9zaXRlLnByb3RvdHlwZSwge1xuXG5cdGdldFZhbHVlOiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTsgLy8gYmluZCBhbGwgYmluZGluZ1xuXG5cdFx0dmFyIGZpcnN0VmFsaWRJbmRleCA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGJpbmRpbmcgPSB0aGlzLl9iaW5kaW5nc1sgZmlyc3RWYWxpZEluZGV4IF07XG5cblx0XHQvLyBhbmQgb25seSBjYWxsIC5nZXRWYWx1ZSBvbiB0aGUgZmlyc3Rcblx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIGJpbmRpbmcuZ2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTtcblxuXHR9LFxuXG5cdHNldFZhbHVlOiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uc2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRcdCAgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS5iaW5kKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR1bmJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRcdCAgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS51bmJpbmQoKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuXG5mdW5jdGlvbiBQcm9wZXJ0eUJpbmRpbmcoIHJvb3ROb2RlLCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdHRoaXMucGF0aCA9IHBhdGg7XG5cdHRoaXMucGFyc2VkUGF0aCA9IHBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7XG5cblx0dGhpcy5ub2RlID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2RlKCByb290Tm9kZSwgdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lICkgfHwgcm9vdE5vZGU7XG5cblx0dGhpcy5yb290Tm9kZSA9IHJvb3ROb2RlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZywge1xuXG5cdENvbXBvc2l0ZTogQ29tcG9zaXRlLFxuXG5cdGNyZWF0ZTogZnVuY3Rpb24gKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdFx0aWYgKCAhICggcm9vdCAmJiByb290LmlzQW5pbWF0aW9uT2JqZWN0R3JvdXAgKSApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9wZXJ0eUJpbmRpbmcoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZSggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIHNwYWNlcyB3aXRoIHVuZGVyc2NvcmVzIGFuZCByZW1vdmVzIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMgZnJvbVxuXHQgKiBub2RlIG5hbWVzLCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIHBhcnNlVHJhY2tOYW1lKCkuXG5cdCAqXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSBOb2RlIG5hbWUgdG8gYmUgc2FuaXRpemVkLlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzYW5pdGl6ZU5vZGVOYW1lOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciByZXNlcnZlZFJlID0gbmV3IFJlZ0V4cCggJ1snICsgUkVTRVJWRURfQ0hBUlNfUkUgKyAnXScsICdnJyApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNhbml0aXplTm9kZU5hbWUoIG5hbWUgKSB7XG5cblx0XHRcdHJldHVybiBuYW1lLnJlcGxhY2UoIC9cXHMvZywgJ18nICkucmVwbGFjZSggcmVzZXJ2ZWRSZSwgJycgKTtcblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0cGFyc2VUcmFja05hbWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIEF0dGVtcHRzIHRvIGFsbG93IG5vZGUgbmFtZXMgZnJvbSBhbnkgbGFuZ3VhZ2UuIEVTNSdzIGBcXHdgIHJlZ2V4cCBtYXRjaGVzXG5cdFx0Ly8gb25seSBsYXRpbiBjaGFyYWN0ZXJzLCBhbmQgdGhlIHVuaWNvZGUgXFxwe0x9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiBTb1xuXHRcdC8vIGluc3RlYWQsIHdlIGV4Y2x1ZGUgcmVzZXJ2ZWQgY2hhcmFjdGVycyBhbmQgbWF0Y2ggZXZlcnl0aGluZyBlbHNlLlxuXHRcdHZhciB3b3JkQ2hhciA9ICdbXicgKyBSRVNFUlZFRF9DSEFSU19SRSArICddJztcblx0XHR2YXIgd29yZENoYXJPckRvdCA9ICdbXicgKyBSRVNFUlZFRF9DSEFSU19SRS5yZXBsYWNlKCAnXFxcXC4nLCAnJyApICsgJ10nO1xuXG5cdFx0Ly8gUGFyZW50IGRpcmVjdG9yaWVzLCBkZWxpbWl0ZWQgYnkgJy8nIG9yICc6Jy4gQ3VycmVudGx5IHVudXNlZCwgYnV0IG11c3Rcblx0XHQvLyBiZSBtYXRjaGVkIHRvIHBhcnNlIHRoZSByZXN0IG9mIHRoZSB0cmFjayBuYW1lLlxuXHRcdHZhciBkaXJlY3RvcnlSZSA9IC8oKD86V0MrW1xcLzpdKSopLy5zb3VyY2UucmVwbGFjZSggJ1dDJywgd29yZENoYXIgKTtcblxuXHRcdC8vIFRhcmdldCBub2RlLiBNYXkgY29udGFpbiB3b3JkIGNoYXJhY3RlcnMgKGEtekEtWjAtOV8pIGFuZCAnLicgb3IgJy0nLlxuXHRcdHZhciBub2RlUmUgPSAvKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0NPRCcsIHdvcmRDaGFyT3JEb3QgKTtcblxuXHRcdC8vIE9iamVjdCBvbiB0YXJnZXQgbm9kZSwgYW5kIGFjY2Vzc29yLiBNYXkgbm90IGNvbnRhaW4gcmVzZXJ2ZWRcblx0XHQvLyBjaGFyYWN0ZXJzLiBBY2Nlc3NvciBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBjbG9zaW5nIGJyYWNrZXQuXG5cdFx0dmFyIG9iamVjdFJlID0gLyg/OlxcLihXQyspKD86XFxbKC4rKVxcXSk/KT8vLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCB3b3JkQ2hhciApO1xuXG5cdFx0Ly8gUHJvcGVydHkgYW5kIGFjY2Vzc29yLiBNYXkgbm90IGNvbnRhaW4gcmVzZXJ2ZWQgY2hhcmFjdGVycy4gQWNjZXNzb3IgbWF5XG5cdFx0Ly8gY29udGFpbiBhbnkgbm9uLWJyYWNrZXQgY2hhcmFjdGVycy5cblx0XHR2YXIgcHJvcGVydHlSZSA9IC9cXC4oV0MrKSg/OlxcWyguKylcXF0pPy8uc291cmNlLnJlcGxhY2UoICdXQycsIHdvcmRDaGFyICk7XG5cblx0XHR2YXIgdHJhY2tSZSA9IG5ldyBSZWdFeHAoICcnXG5cdFx0XHQrICdeJ1xuXHRcdFx0KyBkaXJlY3RvcnlSZVxuXHRcdFx0KyBub2RlUmVcblx0XHRcdCsgb2JqZWN0UmVcblx0XHRcdCsgcHJvcGVydHlSZVxuXHRcdFx0KyAnJCdcblx0XHQpO1xuXG5cdFx0dmFyIHN1cHBvcnRlZE9iamVjdE5hbWVzID0gWyAnbWF0ZXJpYWwnLCAnbWF0ZXJpYWxzJywgJ2JvbmVzJyBdO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHBhcnNlVHJhY2tOYW1lKCB0cmFja05hbWUgKSB7XG5cblx0XHRcdHZhciBtYXRjaGVzID0gdHJhY2tSZS5leGVjKCB0cmFja05hbWUgKTtcblxuXHRcdFx0aWYgKCAhIG1hdGNoZXMgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHJlc3VsdHMgPSB7XG5cdFx0XHRcdC8vIGRpcmVjdG9yeU5hbWU6IG1hdGNoZXNbIDEgXSwgLy8gKHRzY2h3KSBjdXJyZW50bHkgdW51c2VkXG5cdFx0XHRcdG5vZGVOYW1lOiBtYXRjaGVzWyAyIF0sXG5cdFx0XHRcdG9iamVjdE5hbWU6IG1hdGNoZXNbIDMgXSxcblx0XHRcdFx0b2JqZWN0SW5kZXg6IG1hdGNoZXNbIDQgXSxcblx0XHRcdFx0cHJvcGVydHlOYW1lOiBtYXRjaGVzWyA1IF0sIC8vIHJlcXVpcmVkXG5cdFx0XHRcdHByb3BlcnR5SW5kZXg6IG1hdGNoZXNbIDYgXVxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGxhc3REb3QgPSByZXN1bHRzLm5vZGVOYW1lICYmIHJlc3VsdHMubm9kZU5hbWUubGFzdEluZGV4T2YoICcuJyApO1xuXG5cdFx0XHRpZiAoIGxhc3REb3QgIT09IHVuZGVmaW5lZCAmJiBsYXN0RG90ICE9PSAtIDEgKSB7XG5cblx0XHRcdFx0dmFyIG9iamVjdE5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZyggbGFzdERvdCArIDEgKTtcblxuXHRcdFx0XHQvLyBPYmplY3QgbmFtZXMgbXVzdCBiZSBjaGVja2VkIGFnYWluc3QgYSB3aGl0ZWxpc3QuIE90aGVyd2lzZSwgdGhlcmVcblx0XHRcdFx0Ly8gaXMgbm8gd2F5IHRvIHBhcnNlICdmb28uYmFyLmJheic6ICdiYXonIG11c3QgYmUgYSBwcm9wZXJ0eSwgYnV0XG5cdFx0XHRcdC8vICdiYXInIGNvdWxkIGJlIHRoZSBvYmplY3ROYW1lLCBvciBwYXJ0IG9mIGEgbm9kZU5hbWUgKHdoaWNoIGNhblxuXHRcdFx0XHQvLyBpbmNsdWRlICcuJyBjaGFyYWN0ZXJzKS5cblx0XHRcdFx0aWYgKCBzdXBwb3J0ZWRPYmplY3ROYW1lcy5pbmRleE9mKCBvYmplY3ROYW1lICkgIT09IC0gMSApIHtcblxuXHRcdFx0XHRcdHJlc3VsdHMubm9kZU5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZyggMCwgbGFzdERvdCApO1xuXHRcdFx0XHRcdHJlc3VsdHMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcmVzdWx0cy5wcm9wZXJ0eU5hbWUgPT09IG51bGwgfHwgcmVzdWx0cy5wcm9wZXJ0eU5hbWUubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGZpbmROb2RlOiBmdW5jdGlvbiAoIHJvb3QsIG5vZGVOYW1lICkge1xuXG5cdFx0aWYgKCAhIG5vZGVOYW1lIHx8IG5vZGVOYW1lID09PSBcIlwiIHx8IG5vZGVOYW1lID09PSBcInJvb3RcIiB8fCBub2RlTmFtZSA9PT0gXCIuXCIgfHwgbm9kZU5hbWUgPT09IC0gMSB8fCBub2RlTmFtZSA9PT0gcm9vdC5uYW1lIHx8IG5vZGVOYW1lID09PSByb290LnV1aWQgKSB7XG5cblx0XHRcdHJldHVybiByb290O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VhcmNoIGludG8gc2tlbGV0b24gYm9uZXMuXG5cdFx0aWYgKCByb290LnNrZWxldG9uICkge1xuXG5cdFx0XHR2YXIgYm9uZSA9IHJvb3Quc2tlbGV0b24uZ2V0Qm9uZUJ5TmFtZSggbm9kZU5hbWUgKTtcblxuXHRcdFx0aWYgKCBib25lICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGJvbmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHNlYXJjaCBpbnRvIG5vZGUgc3VidHJlZS5cblx0XHRpZiAoIHJvb3QuY2hpbGRyZW4gKSB7XG5cblx0XHRcdHZhciBzZWFyY2hOb2RlU3VidHJlZSA9IGZ1bmN0aW9uICggY2hpbGRyZW4gKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNoaWxkTm9kZSA9IGNoaWxkcmVuWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIGNoaWxkTm9kZS5uYW1lID09PSBub2RlTmFtZSB8fCBjaGlsZE5vZGUudXVpZCA9PT0gbm9kZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdHJldHVybiBjaGlsZE5vZGU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgcmVzdWx0ID0gc2VhcmNoTm9kZVN1YnRyZWUoIGNoaWxkTm9kZS5jaGlsZHJlbiApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXN1bHQgKSByZXR1cm4gcmVzdWx0O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIHN1YlRyZWVOb2RlID0gc2VhcmNoTm9kZVN1YnRyZWUoIHJvb3QuY2hpbGRyZW4gKTtcblxuXHRcdFx0aWYgKCBzdWJUcmVlTm9kZSApIHtcblxuXHRcdFx0XHRyZXR1cm4gc3ViVHJlZU5vZGU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLCB7IC8vIHByb3RvdHlwZSwgY29udGludWVkXG5cblx0Ly8gdGhlc2UgYXJlIHVzZWQgdG8gXCJiaW5kXCIgYSBub25leGlzdGVudCBwcm9wZXJ0eVxuXHRfZ2V0VmFsdWVfdW5hdmFpbGFibGU6IGZ1bmN0aW9uICgpIHt9LFxuXHRfc2V0VmFsdWVfdW5hdmFpbGFibGU6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdEJpbmRpbmdUeXBlOiB7XG5cdFx0RGlyZWN0OiAwLFxuXHRcdEVudGlyZUFycmF5OiAxLFxuXHRcdEFycmF5RWxlbWVudDogMixcblx0XHRIYXNGcm9tVG9BcnJheTogM1xuXHR9LFxuXG5cdFZlcnNpb25pbmc6IHtcblx0XHROb25lOiAwLFxuXHRcdE5lZWRzVXBkYXRlOiAxLFxuXHRcdE1hdHJpeFdvcmxkTmVlZHNVcGRhdGU6IDJcblx0fSxcblxuXHRHZXR0ZXJCeUJpbmRpbmdUeXBlOiBbXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRidWZmZXJbIG9mZnNldCBdID0gdGhpcy5ub2RlWyB0aGlzLnByb3BlcnR5TmFtZSBdO1xuXG5cdFx0fSxcblxuXHRcdGZ1bmN0aW9uIGdldFZhbHVlX2FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0dmFyIHNvdXJjZSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gc291cmNlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIG9mZnNldCArKyBdID0gc291cmNlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRidWZmZXJbIG9mZnNldCBdID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV90b0FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0XSxcblxuXHRTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZzogW1xuXG5cdFx0W1xuXHRcdFx0Ly8gRGlyZWN0XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdCggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBFbnRpcmVBcnJheVxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEFycmF5RWxlbWVudFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gSGFzVG9Gcm9tQXJyYXlcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdXG5cblx0XSxcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWVfdW5ib3VuZCggdGFyZ2V0QXJyYXksIG9mZnNldCApIHtcblxuXHRcdHRoaXMuYmluZCgpO1xuXHRcdHRoaXMuZ2V0VmFsdWUoIHRhcmdldEFycmF5LCBvZmZzZXQgKTtcblxuXHRcdC8vIE5vdGU6IFRoaXMgY2xhc3MgdXNlcyBhIFN0YXRlIHBhdHRlcm4gb24gYSBwZXItbWV0aG9kIGJhc2lzOlxuXHRcdC8vICdiaW5kJyBzZXRzICd0aGlzLmdldFZhbHVlJyAvICdzZXRWYWx1ZScgYW5kIHNoYWRvd3MgdGhlXG5cdFx0Ly8gcHJvdG90eXBlIHZlcnNpb24gb2YgdGhlc2UgbWV0aG9kcyB3aXRoIG9uZSB0aGF0IHJlcHJlc2VudHNcblx0XHQvLyB0aGUgYm91bmQgc3RhdGUuIFdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZCwgdGhlIG1ldGhvZHNcblx0XHQvLyBiZWNvbWUgbm8tb3BzLlxuXG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHNvdXJjZUFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTtcblx0XHR0aGlzLnNldFZhbHVlKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblxuXHQvLyBjcmVhdGUgZ2V0dGVyIC8gc2V0dGVyIHBhaXIgZm9yIGEgcHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoXG5cdGJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0YXJnZXRPYmplY3QgPSB0aGlzLm5vZGUsXG5cdFx0XHRwYXJzZWRQYXRoID0gdGhpcy5wYXJzZWRQYXRoLFxuXG5cdFx0XHRvYmplY3ROYW1lID0gcGFyc2VkUGF0aC5vYmplY3ROYW1lLFxuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyc2VkUGF0aC5wcm9wZXJ0eU5hbWUsXG5cdFx0XHRwcm9wZXJ0eUluZGV4ID0gcGFyc2VkUGF0aC5wcm9wZXJ0eUluZGV4O1xuXG5cdFx0aWYgKCAhIHRhcmdldE9iamVjdCApIHtcblxuXHRcdFx0dGFyZ2V0T2JqZWN0ID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2RlKCB0aGlzLnJvb3ROb2RlLCBwYXJzZWRQYXRoLm5vZGVOYW1lICkgfHwgdGhpcy5yb290Tm9kZTtcblxuXHRcdFx0dGhpcy5ub2RlID0gdGFyZ2V0T2JqZWN0O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2V0IGZhaWwgc3RhdGUgc28gd2UgY2FuIGp1c3QgJ3JldHVybicgb24gZXJyb3Jcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGU7XG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlO1xuXG5cdFx0Ly8gZW5zdXJlIHRoZXJlIGlzIGEgdmFsdWUgbm9kZVxuXHRcdGlmICggISB0YXJnZXRPYmplY3QgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6ICcgKyB0aGlzLnBhdGggKyAnIGJ1dCBpdCB3YXNuXFwndCBmb3VuZC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdE5hbWUgKSB7XG5cblx0XHRcdHZhciBvYmplY3RJbmRleCA9IHBhcnNlZFBhdGgub2JqZWN0SW5kZXg7XG5cblx0XHRcdC8vIHNwZWNpYWwgY2FzZXMgd2VyZSB3ZSBuZWVkIHRvIHJlYWNoIGRlZXBlciBpbnRvIHRoZSBoaWVyYXJjaHkgdG8gZ2V0IHRoZSBmYWNlIG1hdGVyaWFscy4uLi5cblx0XHRcdHN3aXRjaCAoIG9iamVjdE5hbWUgKSB7XG5cblx0XHRcdFx0Y2FzZSAnbWF0ZXJpYWxzJzpcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hdGVyaWFscyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hdGVyaWFscztcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2JvbmVzJzpcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3Quc2tlbGV0b24gKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBib25lcyBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBza2VsZXRvbi4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBwb3RlbnRpYWwgZnV0dXJlIG9wdGltaXphdGlvbjogc2tpcCB0aGlzIGlmIHByb3BlcnR5SW5kZXggaXMgYWxyZWFkeSBhbiBpbnRlZ2VyXG5cdFx0XHRcdFx0Ly8gYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLlxuXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0LnNrZWxldG9uLmJvbmVzO1xuXG5cdFx0XHRcdFx0Ly8gc3VwcG9ydCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50byBpbmRpY2VzLlxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRhcmdldE9iamVjdC5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBpIF0ubmFtZSA9PT0gb2JqZWN0SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdFx0b2JqZWN0SW5kZXggPSBpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3ROYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3ROYW1lIF07XG5cblx0XHRcdH1cblxuXG5cdFx0XHRpZiAoIG9iamVjdEluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuJywgdGhpcywgdGFyZ2V0T2JqZWN0ICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHJlc29sdmUgcHJvcGVydHlcblx0XHR2YXIgbm9kZVByb3BlcnR5ID0gdGFyZ2V0T2JqZWN0WyBwcm9wZXJ0eU5hbWUgXTtcblxuXHRcdGlmICggbm9kZVByb3BlcnR5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub2RlTmFtZSA9IHBhcnNlZFBhdGgubm9kZU5hbWU7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgcHJvcGVydHkgZm9yIHRyYWNrOiAnICsgbm9kZU5hbWUgK1xuXHRcdFx0XHQnLicgKyBwcm9wZXJ0eU5hbWUgKyAnIGJ1dCBpdCB3YXNuXFwndCBmb3VuZC4nLCB0YXJnZXRPYmplY3QgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSB2ZXJzaW9uaW5nIHNjaGVtZVxuXHRcdHZhciB2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5vbmU7XG5cblx0XHRpZiAoIHRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBtYXRlcmlhbFxuXG5cdFx0XHR2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5lZWRzVXBkYXRlO1xuXHRcdFx0dGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9IGVsc2UgaWYgKCB0YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBub2RlIHRyYW5zZm9ybVxuXG5cdFx0XHR2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7XG5cdFx0XHR0aGlzLnRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDtcblxuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSBob3cgdGhlIHByb3BlcnR5IGdldHMgYm91bmRcblx0XHR2YXIgYmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkRpcmVjdDtcblxuXHRcdGlmICggcHJvcGVydHlJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBhY2Nlc3MgYSBzdWIgZWxlbWVudCBvZiB0aGUgcHJvcGVydHkgYXJyYXkgKG9ubHkgcHJpbWl0aXZlcyBhcmUgc3VwcG9ydGVkIHJpZ2h0IG5vdylcblxuXHRcdFx0aWYgKCBwcm9wZXJ0eU5hbWUgPT09IFwibW9ycGhUYXJnZXRJbmZsdWVuY2VzXCIgKSB7XG5cblx0XHRcdFx0Ly8gcG90ZW50aWFsIG9wdGltaXphdGlvbiwgc2tpcCB0aGlzIGlmIHByb3BlcnR5SW5kZXggaXMgYWxyZWFkeSBhbiBpbnRlZ2VyLCBhbmQgY29udmVydCB0aGUgaW50ZWdlciBzdHJpbmcgdG8gYSB0cnVlIGludGVnZXIuXG5cblx0XHRcdFx0Ly8gc3VwcG9ydCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50byBpbmRpY2VzLlxuXHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5LicsIHRoaXMgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uWyBpIF0ubmFtZSA9PT0gcHJvcGVydHlJbmRleCApIHtcblxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eUluZGV4ID0gaTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0ubmFtZSA9PT0gcHJvcGVydHlJbmRleCApIHtcblxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eUluZGV4ID0gaTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudDtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXHRcdFx0dGhpcy5wcm9wZXJ0eUluZGV4ID0gcHJvcGVydHlJbmRleDtcblxuXHRcdH0gZWxzZSBpZiAoIG5vZGVQcm9wZXJ0eS5mcm9tQXJyYXkgIT09IHVuZGVmaW5lZCAmJiBub2RlUHJvcGVydHkudG9BcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBtdXN0IHVzZSBjb3B5IGZvciBPYmplY3QzRC5FdWxlci9RdWF0ZXJuaW9uXG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheTtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXG5cdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggbm9kZVByb3BlcnR5ICkgKSB7XG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheTtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7XG5cblx0XHR9XG5cblx0XHQvLyBzZWxlY3QgZ2V0dGVyIC8gc2V0dGVyXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVsgYmluZGluZ1R5cGUgXTtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1sgYmluZGluZ1R5cGUgXVsgdmVyc2lvbmluZyBdO1xuXG5cdH0sXG5cblx0dW5iaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5vZGUgPSBudWxsO1xuXG5cdFx0Ly8gYmFjayB0byB0aGUgcHJvdG90eXBlIHZlcnNpb24gb2YgZ2V0VmFsdWUgLyBzZXRWYWx1ZVxuXHRcdC8vIG5vdGU6IGF2b2lkaW5nIHRvIG11dGF0ZSB0aGUgc2hhcGUgb2YgJ3RoaXMnIHZpYSAnZGVsZXRlJ1xuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmJvdW5kO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmJvdW5kO1xuXG5cdH1cblxufSApO1xuXG4vLyFcXCBERUNMQVJFIEFMSUFTIEFGVEVSIGFzc2lnbiBwcm90b3R5cGUgIVxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwge1xuXG5cdC8vIGluaXRpYWwgc3RhdGUgb2YgdGhlc2UgbWV0aG9kcyB0aGF0IGNhbGxzICdiaW5kJ1xuXHRfZ2V0VmFsdWVfdW5ib3VuZDogUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5nZXRWYWx1ZSxcblx0X3NldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuc2V0VmFsdWUsXG5cbn0gKTtcblxuZXhwb3J0IHsgUHJvcGVydHlCaW5kaW5nIH07XG4iLCJpbXBvcnQgeyBQcm9wZXJ0eUJpbmRpbmcgfSBmcm9tICcuL1Byb3BlcnR5QmluZGluZy5qcyc7XG5pbXBvcnQgeyBfTWF0aCB9IGZyb20gJy4uL21hdGgvTWF0aC5qcyc7XG5cbi8qKlxuICpcbiAqIEEgZ3JvdXAgb2Ygb2JqZWN0cyB0aGF0IHJlY2VpdmVzIGEgc2hhcmVkIGFuaW1hdGlvbiBzdGF0ZS5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBcdC1cdEFkZCBvYmplY3RzIHlvdSB3b3VsZCBvdGhlcndpc2UgcGFzcyBhcyAncm9vdCcgdG8gdGhlXG4gKiBcdFx0Y29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9uIG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci5cbiAqXG4gKiBcdC1cdEluc3RlYWQgcGFzcyB0aGlzIG9iamVjdCBhcyAncm9vdCcuXG4gKlxuICogXHQtXHRZb3UgY2FuIGFsc28gYWRkIGFuZCByZW1vdmUgb2JqZWN0cyBsYXRlciB3aGVuIHRoZSBtaXhlclxuICogXHRcdGlzIHJ1bm5pbmcuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgXHRPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXBwZWFyIGFzIG9uZSBvYmplY3QgdG8gdGhlIG1peGVyLFxuICogIFx0c28gY2FjaGUgY29udHJvbCBvZiB0aGUgaW5kaXZpZHVhbCBvYmplY3RzIG11c3QgYmUgZG9uZVxuICogIFx0b24gdGhlIGdyb3VwLlxuICpcbiAqIExpbWl0YXRpb246XG4gKlxuICogXHQtIFx0VGhlIGFuaW1hdGVkIHByb3BlcnRpZXMgbXVzdCBiZSBjb21wYXRpYmxlIGFtb25nIHRoZVxuICogXHRcdGFsbCBvYmplY3RzIGluIHRoZSBncm91cC5cbiAqXG4gKiAgLVx0QSBzaW5nbGUgcHJvcGVydHkgY2FuIGVpdGhlciBiZSBjb250cm9sbGVkIHRocm91Z2ggYVxuICogIFx0dGFyZ2V0IGdyb3VwIG9yIGRpcmVjdGx5LCBidXQgbm90IGJvdGguXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbk9iamVjdEdyb3VwKCkge1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdC8vIGNhY2hlZCBvYmplY3RzIGZvbGxvd2VkIGJ5IHRoZSBhY3RpdmUgb25lc1xuXHR0aGlzLl9vYmplY3RzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApO1xuXG5cdHRoaXMubkNhY2hlZE9iamVjdHNfID0gMDtcdFx0XHQvLyB0aHJlc2hvbGRcblx0Ly8gbm90ZTogcmVhZCBieSBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlXG5cblx0dmFyIGluZGljZXMgPSB7fTtcblx0dGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7XHRcdC8vIGZvciBib29ra2VlcGluZ1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRpbmRpY2VzWyBhcmd1bWVudHNbIGkgXS51dWlkIF0gPSBpO1xuXG5cdH1cblxuXHR0aGlzLl9wYXRocyA9IFtdO1x0XHRcdFx0XHQvLyBpbnNpZGU6IHN0cmluZ1xuXHR0aGlzLl9wYXJzZWRQYXRocyA9IFtdO1x0XHRcdFx0Ly8gaW5zaWRlOiB7IHdlIGRvbid0IGNhcmUsIGhlcmUgfVxuXHR0aGlzLl9iaW5kaW5ncyA9IFtdOyBcdFx0XHRcdC8vIGluc2lkZTogQXJyYXk8IFByb3BlcnR5QmluZGluZyA+XG5cdHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OyBcdC8vIGluc2lkZTogaW5kaWNlcyBpbiB0aGVzZSBhcnJheXNcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHRoaXMuc3RhdHMgPSB7XG5cblx0XHRvYmplY3RzOiB7XG5cdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNjb3BlLl9vYmplY3RzLmxlbmd0aDtcblxuXHRcdFx0fSxcblx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy50b3RhbCAtIHNjb3BlLm5DYWNoZWRPYmplY3RzXztcblxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0IGJpbmRpbmdzUGVyT2JqZWN0KCkge1xuXG5cdFx0XHRyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbk9iamVjdEdyb3VwLnByb3RvdHlwZSwge1xuXG5cdGlzQW5pbWF0aW9uT2JqZWN0R3JvdXA6IHRydWUsXG5cblx0YWRkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0cGF0aHMgPSB0aGlzLl9wYXRocyxcblx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoLFxuXHRcdFx0a25vd25PYmplY3QgPSB1bmRlZmluZWQ7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyB1bmtub3duIG9iamVjdCAtPiBhZGQgaXQgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHRpbmRleCA9IG5PYmplY3RzICsrO1xuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0cy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0YmluZGluZ3NbIGogXS5wdXNoKCBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRrbm93bk9iamVjdCA9IG9iamVjdHNbIGluZGV4IF07XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHR2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxuXHRcdFx0XHRcdGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gb2JqZWN0O1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcblx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkO1xuXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHNpbmNlIHdlIGRvIG5vdCBib3RoZXIgdG8gY3JlYXRlIG5ldyBiaW5kaW5nc1xuXHRcdFx0XHRcdFx0Ly8gZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkLCB0aGUgYmluZGluZyBtYXlcblx0XHRcdFx0XHRcdC8vIG9yIG1heSBub3QgZXhpc3RcblxuXHRcdFx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0c1sgaW5kZXggXSAhPT0ga25vd25PYmplY3QgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgJyArXG5cdFx0XHRcdFx0XHQnZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuJyApO1xuXG5cdFx0XHR9IC8vIGVsc2UgdGhlIG9iamVjdCBpcyBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgaXQgdG8gYmVcblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID49IG5DYWNoZWRPYmplY3RzICkge1xuXG5cdFx0XHRcdC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IGludG8gdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHR2YXIgbGFzdENhY2hlZEluZGV4ID0gbkNhY2hlZE9iamVjdHMgKyssXG5cdFx0XHRcdFx0Zmlyc3RBY3RpdmVPYmplY3QgPSBvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXTtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBmaXJzdEFjdGl2ZU9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGZpcnN0QWN0aXZlT2JqZWN0O1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGxhc3RDYWNoZWRJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF0gPSBvYmplY3Q7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0Zmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdLFxuXHRcdFx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlO1xuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlICYgZm9yZ2V0XG5cdHVuY2FjaGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZGVsZXRlIGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0XHRpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0XHQvLyBvYmplY3QgaXMgY2FjaGVkLCBzaHJpbmsgdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHRcdHZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdLFxuXHRcdFx0XHRcdFx0bGFzdEluZGV4ID0gLS0gbk9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHQvLyBsYXN0IGNhY2hlZCBvYmplY3QgdGFrZXMgdGhpcyBvYmplY3QncyBwbGFjZVxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0XHQvLyBsYXN0IG9iamVjdCBnb2VzIHRvIHRoZSBhY3RpdmF0ZWQgc2xvdCBhbmQgcG9wXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3Q7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBhY3RpdmUsIGp1c3Qgc3dhcCB3aXRoIHRoZSBsYXN0IGFuZCBwb3BcblxuXHRcdFx0XHRcdHZhciBsYXN0SW5kZXggPSAtLSBuT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RPYmplY3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSAvLyBjYWNoZWQgb3IgYWN0aXZlXG5cblx0XHRcdH0gLy8gaWYgb2JqZWN0IGlzIGtub3duXG5cblx0XHR9IC8vIGZvciBhcmd1bWVudHNcblxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XG5cblx0fSxcblxuXHQvLyBJbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCBieSBiZWZyaWVuZGVkIFByb3BlcnR5QmluZGluZy5Db21wb3NpdGU6XG5cblx0c3Vic2NyaWJlXzogZnVuY3Rpb24gKCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdFx0Ly8gcmV0dXJucyBhbiBhcnJheSBvZiBiaW5kaW5ncyBmb3IgdGhlIGdpdmVuIHBhdGggdGhhdCBpcyBjaGFuZ2VkXG5cdFx0Ly8gYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQgb2JqZWN0cyBpbiB0aGUgZ3JvdXBcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF0sXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGJpbmRpbmdzWyBpbmRleCBdO1xuXG5cdFx0dmFyIHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0b2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9iamVjdHMgKTtcblxuXHRcdGluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0aW5kaWNlc0J5UGF0aFsgcGF0aCBdID0gaW5kZXg7XG5cblx0XHRwYXRocy5wdXNoKCBwYXRoICk7XG5cdFx0cGFyc2VkUGF0aHMucHVzaCggcGFyc2VkUGF0aCApO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmdzRm9yUGF0aCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSBuQ2FjaGVkT2JqZWN0cywgbiA9IG9iamVjdHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gb2JqZWN0c1sgaSBdO1xuXHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpIF0gPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBiaW5kaW5nc0ZvclBhdGg7XG5cblx0fSxcblxuXHR1bnN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCApIHtcblxuXHRcdC8vIHRlbGxzIHRoZSBncm91cCB0byBmb3JnZXQgYWJvdXQgYSBwcm9wZXJ0eSBwYXRoIGFuZCBubyBsb25nZXJcblx0XHQvLyB1cGRhdGUgdGhlIGFycmF5IHByZXZpb3VzbHkgb2J0YWluZWQgd2l0aCAnc3Vic2NyaWJlXydcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF07XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NJbmRleCA9IGJpbmRpbmdzLmxlbmd0aCAtIDEsXG5cdFx0XHRcdGxhc3RCaW5kaW5ncyA9IGJpbmRpbmdzWyBsYXN0QmluZGluZ3NJbmRleCBdLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NQYXRoID0gcGF0aFsgbGFzdEJpbmRpbmdzSW5kZXggXTtcblxuXHRcdFx0aW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7XG5cblx0XHRcdGJpbmRpbmdzWyBpbmRleCBdID0gbGFzdEJpbmRpbmdzO1xuXHRcdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRcdHBhcnNlZFBhdGhzWyBpbmRleCBdID0gcGFyc2VkUGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cdFx0XHRwYXJzZWRQYXRocy5wb3AoKTtcblxuXHRcdFx0cGF0aHNbIGluZGV4IF0gPSBwYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcblx0XHRcdHBhdGhzLnBvcCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IEFuaW1hdGlvbk9iamVjdEdyb3VwIH07XG4iLCJpbXBvcnQgeyBXcmFwQXJvdW5kRW5kaW5nLCBaZXJvQ3VydmF0dXJlRW5kaW5nLCBaZXJvU2xvcGVFbmRpbmcsIExvb3BQaW5nUG9uZywgTG9vcE9uY2UsIExvb3BSZXBlYXQgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuXG4vKipcbiAqXG4gKiBBY3Rpb24gcHJvdmlkZWQgYnkgQW5pbWF0aW9uTWl4ZXIgZm9yIHNjaGVkdWxpbmcgY2xpcCBwbGF5YmFjayBvbiBzcGVjaWZpY1xuICogb2JqZWN0cy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKlxuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbkFjdGlvbiggbWl4ZXIsIGNsaXAsIGxvY2FsUm9vdCApIHtcblxuXHR0aGlzLl9taXhlciA9IG1peGVyO1xuXHR0aGlzLl9jbGlwID0gY2xpcDtcblx0dGhpcy5fbG9jYWxSb290ID0gbG9jYWxSb290IHx8IG51bGw7XG5cblx0dmFyIHRyYWNrcyA9IGNsaXAudHJhY2tzLFxuXHRcdG5UcmFja3MgPSB0cmFja3MubGVuZ3RoLFxuXHRcdGludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdHZhciBpbnRlcnBvbGFudFNldHRpbmdzID0ge1xuXHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xuXHR9O1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudCA9IHRyYWNrc1sgaSBdLmNyZWF0ZUludGVycG9sYW50KCBudWxsICk7XG5cdFx0aW50ZXJwb2xhbnRzWyBpIF0gPSBpbnRlcnBvbGFudDtcblx0XHRpbnRlcnBvbGFudC5zZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7XG5cblx0fVxuXG5cdHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdHRoaXMuX2ludGVycG9sYW50cyA9IGludGVycG9sYW50cztcdC8vIGJvdW5kIGJ5IHRoZSBtaXhlclxuXG5cdC8vIGluc2lkZTogUHJvcGVydHlNaXhlciAobWFuYWdlZCBieSB0aGUgbWl4ZXIpXG5cdHRoaXMuX3Byb3BlcnR5QmluZGluZ3MgPSBuZXcgQXJyYXkoIG5UcmFja3MgKTtcblxuXHR0aGlzLl9jYWNoZUluZGV4ID0gbnVsbDtcdFx0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdHRoaXMuX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1x0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cblx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cblx0dGhpcy5sb29wID0gTG9vcFJlcGVhdDtcblx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1xuXG5cdC8vIGdsb2JhbCBtaXhlciB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyB0byBiZSBzdGFydGVkXG5cdC8vIGl0J3Mgc2V0IGJhY2sgdG8gJ251bGwnIHVwb24gc3RhcnQgb2YgdGhlIGFjdGlvblxuXHR0aGlzLl9zdGFydFRpbWUgPSBudWxsO1xuXG5cdC8vIHNjYWxlZCBsb2NhbCB0aW1lIG9mIHRoZSBhY3Rpb25cblx0Ly8gZ2V0cyBjbGFtcGVkIG9yIHdyYXBwZWQgdG8gMC4uY2xpcC5kdXJhdGlvbiBhY2NvcmRpbmcgdG8gbG9vcFxuXHR0aGlzLnRpbWUgPSAwO1xuXG5cdHRoaXMudGltZVNjYWxlID0gMTtcblx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gMTtcblxuXHR0aGlzLndlaWdodCA9IDE7XG5cdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IDE7XG5cblx0dGhpcy5yZXBldGl0aW9ucyA9IEluZmluaXR5OyBcdFx0Ly8gbm8uIG9mIHJlcGV0aXRpb25zIHdoZW4gbG9vcGluZ1xuXG5cdHRoaXMucGF1c2VkID0gZmFsc2U7XHRcdFx0XHQvLyB0cnVlIC0+IHplcm8gZWZmZWN0aXZlIHRpbWUgc2NhbGVcblx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcdFx0XHRcdC8vIGZhbHNlIC0+IHplcm8gZWZmZWN0aXZlIHdlaWdodFxuXG5cdHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgXHQ9IGZhbHNlO1x0Ly8ga2VlcCBmZWVkaW5nIHRoZSBsYXN0IGZyYW1lP1xuXG5cdHRoaXMuemVyb1Nsb3BlQXRTdGFydCBcdD0gdHJ1ZTtcdFx0Ly8gZm9yIHNtb290aCBpbnRlcnBvbGF0aW9uIHcvbyBzZXBhcmF0ZVxuXHR0aGlzLnplcm9TbG9wZUF0RW5kXHRcdD0gdHJ1ZTtcdFx0Ly8gY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmRcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25BY3Rpb24ucHJvdG90eXBlLCB7XG5cblx0Ly8gU3RhdGUgJiBTY2hlZHVsaW5nXG5cblx0cGxheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNldCgpO1xuXG5cdH0sXG5cblx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMucGF1c2VkID0gZmFsc2U7XG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuXHRcdHRoaXMudGltZSA9IDA7XHRcdFx0Ly8gcmVzdGFydCBjbGlwXG5cdFx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1x0Ly8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDtcdC8vIGZvcmdldCBzY2hlZHVsaW5nXG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdGlzUnVubmluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZW5hYmxlZCAmJiAhIHRoaXMucGF1c2VkICYmIHRoaXMudGltZVNjYWxlICE9PSAwICYmXG5cdFx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9PT0gbnVsbCAmJiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0cnVlIHdoZW4gcGxheSBoYXMgYmVlbiBjYWxsZWRcblx0aXNTY2hlZHVsZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdHN0YXJ0QXQ6IGZ1bmN0aW9uICggdGltZSApIHtcblxuXHRcdHRoaXMuX3N0YXJ0VGltZSA9IHRpbWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldExvb3A6IGZ1bmN0aW9uICggbW9kZSwgcmVwZXRpdGlvbnMgKSB7XG5cblx0XHR0aGlzLmxvb3AgPSBtb2RlO1xuXHRcdHRoaXMucmVwZXRpdGlvbnMgPSByZXBldGl0aW9ucztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gV2VpZ2h0XG5cblx0Ly8gc2V0IHRoZSB3ZWlnaHQgc3RvcHBpbmcgYW55IHNjaGVkdWxlZCBmYWRpbmdcblx0Ly8gYWx0aG91Z2ggLmVuYWJsZWQgPSBmYWxzZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHdlaWdodCBvZiB6ZXJvLCB0aGlzXG5cdC8vIG1ldGhvZCBkb2VzICpub3QqIGNoYW5nZSAuZW5hYmxlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmdcblx0c2V0RWZmZWN0aXZlV2VpZ2h0OiBmdW5jdGlvbiAoIHdlaWdodCApIHtcblxuXHRcdHRoaXMud2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0Ly8gbm90ZTogc2FtZSBsb2dpYyBhcyB3aGVuIHVwZGF0ZWQgYXQgcnVudGltZVxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHRoaXMuZW5hYmxlZCA/IHdlaWdodCA6IDA7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdGhlIHdlaWdodCBjb25zaWRlcmluZyBmYWRpbmcgYW5kIC5lbmFibGVkXG5cdGdldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodDtcblxuXHR9LFxuXG5cdGZhZGVJbjogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDAsIDEgKTtcblxuXHR9LFxuXG5cdGZhZGVPdXQ6IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAxLCAwICk7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVGcm9tOiBmdW5jdGlvbiAoIGZhZGVPdXRBY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0ZmFkZU91dEFjdGlvbi5mYWRlT3V0KCBkdXJhdGlvbiApO1xuXHRcdHRoaXMuZmFkZUluKCBkdXJhdGlvbiApO1xuXG5cdFx0aWYgKCB3YXJwICkge1xuXG5cdFx0XHR2YXIgZmFkZUluRHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLFxuXHRcdFx0XHRmYWRlT3V0RHVyYXRpb24gPSBmYWRlT3V0QWN0aW9uLl9jbGlwLmR1cmF0aW9uLFxuXG5cdFx0XHRcdHN0YXJ0RW5kUmF0aW8gPSBmYWRlT3V0RHVyYXRpb24gLyBmYWRlSW5EdXJhdGlvbixcblx0XHRcdFx0ZW5kU3RhcnRSYXRpbyA9IGZhZGVJbkR1cmF0aW9uIC8gZmFkZU91dER1cmF0aW9uO1xuXG5cdFx0XHRmYWRlT3V0QWN0aW9uLndhcnAoIDEuMCwgc3RhcnRFbmRSYXRpbywgZHVyYXRpb24gKTtcblx0XHRcdHRoaXMud2FycCggZW5kU3RhcnRSYXRpbywgMS4wLCBkdXJhdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVUbzogZnVuY3Rpb24gKCBmYWRlSW5BY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0cmV0dXJuIGZhZGVJbkFjdGlvbi5jcm9zc0ZhZGVGcm9tKCB0aGlzLCBkdXJhdGlvbiwgd2FycCApO1xuXG5cdH0sXG5cblx0c3RvcEZhZGluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdlaWdodEludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIHdlaWdodEludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHdlaWdodEludGVycG9sYW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIFRpbWUgU2NhbGUgQ29udHJvbFxuXG5cdC8vIHNldCB0aGUgdGltZSBzY2FsZSBzdG9wcGluZyBhbnkgc2NoZWR1bGVkIHdhcnBpbmdcblx0Ly8gYWx0aG91Z2ggLnBhdXNlZCA9IHRydWUgeWllbGRzIGFuIGVmZmVjdGl2ZSB0aW1lIHNjYWxlIG9mIHplcm8sIHRoaXNcblx0Ly8gbWV0aG9kIGRvZXMgKm5vdCogY2hhbmdlIC5wYXVzZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nXG5cdHNldEVmZmVjdGl2ZVRpbWVTY2FsZTogZnVuY3Rpb24gKCB0aW1lU2NhbGUgKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aGlzLnBhdXNlZCA/IDAgOiB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoZSB0aW1lIHNjYWxlIGNvbnNpZGVyaW5nIHdhcnBpbmcgYW5kIC5wYXVzZWRcblx0Z2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlO1xuXG5cdH0sXG5cblx0c2V0RHVyYXRpb246IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRoaXMuX2NsaXAuZHVyYXRpb24gLyBkdXJhdGlvbjtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHRzeW5jV2l0aDogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR0aGlzLnRpbWUgPSBhY3Rpb24udGltZTtcblx0XHR0aGlzLnRpbWVTY2FsZSA9IGFjdGlvbi50aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0aGFsdDogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLndhcnAoIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwgMCwgZHVyYXRpb24gKTtcblxuXHR9LFxuXG5cdHdhcnA6IGZ1bmN0aW9uICggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7XG5cblx0XHR2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSxcblx0XHRcdGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsXG5cblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlcztcblxuXHRcdHRpbWVzWyAwIF0gPSBub3c7XG5cdFx0dGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uO1xuXG5cdFx0dmFsdWVzWyAwIF0gPSBzdGFydFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblx0XHR2YWx1ZXNbIDEgXSA9IGVuZFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcFdhcnBpbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0aW1lU2NhbGVJbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0aWYgKCB0aW1lU2NhbGVJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB0aW1lU2NhbGVJbnRlcnBvbGFudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBPYmplY3QgQWNjZXNzb3JzXG5cblx0Z2V0TWl4ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlcjtcblxuXHR9LFxuXG5cdGdldENsaXA6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9jbGlwO1xuXG5cdH0sXG5cblx0Z2V0Um9vdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9taXhlci5fcm9vdDtcblxuXHR9LFxuXG5cdC8vIEludGVybmFcblxuXHRfdXBkYXRlOiBmdW5jdGlvbiAoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICkge1xuXG5cdFx0Ly8gY2FsbGVkIGJ5IHRoZSBtaXhlclxuXG5cdFx0aWYgKCAhIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0Ly8gY2FsbCAuX3VwZGF0ZVdlaWdodCgpIHRvIHVwZGF0ZSAuX2VmZmVjdGl2ZVdlaWdodFxuXG5cdFx0XHR0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBzdGFydFRpbWUgPSB0aGlzLl9zdGFydFRpbWU7XG5cblx0XHRpZiAoIHN0YXJ0VGltZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gY2hlY2sgZm9yIHNjaGVkdWxlZCBzdGFydCBvZiBhY3Rpb25cblxuXHRcdFx0dmFyIHRpbWVSdW5uaW5nID0gKCB0aW1lIC0gc3RhcnRUaW1lICkgKiB0aW1lRGlyZWN0aW9uO1xuXHRcdFx0aWYgKCB0aW1lUnVubmluZyA8IDAgfHwgdGltZURpcmVjdGlvbiA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm47IC8vIHlldCB0byBjb21lIC8gZG9uJ3QgZGVjaWRlIHdoZW4gZGVsdGEgPSAwXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc3RhcnRcblxuXHRcdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDsgLy8gdW5zY2hlZHVsZVxuXHRcdFx0ZGVsdGFUaW1lID0gdGltZURpcmVjdGlvbiAqIHRpbWVSdW5uaW5nO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYXBwbHkgdGltZSBzY2FsZSBhbmQgYWR2YW5jZSB0aW1lXG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy5fdXBkYXRlVGltZVNjYWxlKCB0aW1lICk7XG5cdFx0dmFyIGNsaXBUaW1lID0gdGhpcy5fdXBkYXRlVGltZSggZGVsdGFUaW1lICk7XG5cblx0XHQvLyBub3RlOiBfdXBkYXRlVGltZSBtYXkgZGlzYWJsZSB0aGUgYWN0aW9uIHJlc3VsdGluZyBpblxuXHRcdC8vIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgMFxuXG5cdFx0dmFyIHdlaWdodCA9IHRoaXMuX3VwZGF0ZVdlaWdodCggdGltZSApO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPiAwICkge1xuXG5cdFx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5faW50ZXJwb2xhbnRzO1xuXHRcdFx0dmFyIHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gaW50ZXJwb2xhbnRzLmxlbmd0aDsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTtcblx0XHRcdFx0cHJvcGVydHlNaXhlcnNbIGogXS5hY2N1bXVsYXRlKCBhY2N1SW5kZXgsIHdlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfdXBkYXRlV2VpZ2h0OiBmdW5jdGlvbiAoIHRpbWUgKSB7XG5cblx0XHR2YXIgd2VpZ2h0ID0gMDtcblxuXHRcdGlmICggdGhpcy5lbmFibGVkICkge1xuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLndlaWdodDtcblx0XHRcdHZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdO1xuXG5cdFx0XHRcdHdlaWdodCAqPSBpbnRlcnBvbGFudFZhbHVlO1xuXG5cdFx0XHRcdGlmICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIGludGVycG9sYW50VmFsdWUgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGZhZGVkIG91dCwgZGlzYWJsZVxuXHRcdFx0XHRcdFx0dGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB3ZWlnaHQ7XG5cdFx0cmV0dXJuIHdlaWdodDtcblxuXHR9LFxuXG5cdF91cGRhdGVUaW1lU2NhbGU6IGZ1bmN0aW9uICggdGltZSApIHtcblxuXHRcdHZhciB0aW1lU2NhbGUgPSAwO1xuXG5cdFx0aWYgKCAhIHRoaXMucGF1c2VkICkge1xuXG5cdFx0XHR0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTtcblxuXHRcdFx0dmFyIGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0dGltZVNjYWxlICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbW90aW9uIGhhcyBoYWx0ZWQsIHBhdXNlXG5cdFx0XHRcdFx0XHR0aGlzLnBhdXNlZCA9IHRydWU7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyB3YXJwIGRvbmUgLSBhcHBseSBmaW5hbCB0aW1lIHNjYWxlXG5cdFx0XHRcdFx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHRyZXR1cm4gdGltZVNjYWxlO1xuXG5cdH0sXG5cblx0X3VwZGF0ZVRpbWU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkge1xuXG5cdFx0dmFyIHRpbWUgPSB0aGlzLnRpbWUgKyBkZWx0YVRpbWU7XG5cdFx0dmFyIGR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbjtcblx0XHR2YXIgbG9vcCA9IHRoaXMubG9vcDtcblx0XHR2YXIgbG9vcENvdW50ID0gdGhpcy5fbG9vcENvdW50O1xuXG5cdFx0dmFyIHBpbmdQb25nID0gKCBsb29wID09PSBMb29wUGluZ1BvbmcgKTtcblxuXHRcdGlmICggZGVsdGFUaW1lID09PSAwICkge1xuXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkgcmV0dXJuIHRpbWU7XG5cblx0XHRcdHJldHVybiAoIHBpbmdQb25nICYmICggbG9vcENvdW50ICYgMSApID09PSAxICkgPyBkdXJhdGlvbiAtIHRpbWUgOiB0aW1lO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBsb29wID09PSBMb29wT25jZSApIHtcblxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0gMSApIHtcblxuXHRcdFx0XHQvLyBqdXN0IHN0YXJ0ZWRcblxuXHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSAwO1xuXHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0cnVlLCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGhhbmRsZV9zdG9wOiB7XG5cblx0XHRcdFx0aWYgKCB0aW1lID49IGR1cmF0aW9uICkge1xuXG5cdFx0XHRcdFx0dGltZSA9IGR1cmF0aW9uO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRpbWUgPCAwICkge1xuXG5cdFx0XHRcdFx0dGltZSA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIGJyZWFrIGhhbmRsZV9zdG9wO1xuXG5cdFx0XHRcdGlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTtcblx0XHRcdFx0ZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLFxuXHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lIDwgMCA/IC0gMSA6IDFcblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgeyAvLyByZXBldGl0aXZlIFJlcGVhdCBvciBQaW5nUG9uZ1xuXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkge1xuXG5cdFx0XHRcdC8vIGp1c3Qgc3RhcnRlZFxuXG5cdFx0XHRcdGlmICggZGVsdGFUaW1lID49IDAgKSB7XG5cblx0XHRcdFx0XHRsb29wQ291bnQgPSAwO1xuXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gd2hlbiBsb29waW5nIGluIHJldmVyc2UgZGlyZWN0aW9uLCB0aGUgaW5pdGlhbFxuXHRcdFx0XHRcdC8vIHRyYW5zaXRpb24gdGhyb3VnaCB6ZXJvIGNvdW50cyBhcyBhIHJlcGV0aXRpb24sXG5cdFx0XHRcdFx0Ly8gc28gbGVhdmUgbG9vcENvdW50IGF0IC0xXG5cblx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCB0cnVlLCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRpbWUgPj0gZHVyYXRpb24gfHwgdGltZSA8IDAgKSB7XG5cblx0XHRcdFx0Ly8gd3JhcCBhcm91bmRcblxuXHRcdFx0XHR2YXIgbG9vcERlbHRhID0gTWF0aC5mbG9vciggdGltZSAvIGR1cmF0aW9uICk7IC8vIHNpZ25lZFxuXHRcdFx0XHR0aW1lIC09IGR1cmF0aW9uICogbG9vcERlbHRhO1xuXG5cdFx0XHRcdGxvb3BDb3VudCArPSBNYXRoLmFicyggbG9vcERlbHRhICk7XG5cblx0XHRcdFx0dmFyIHBlbmRpbmcgPSB0aGlzLnJlcGV0aXRpb25zIC0gbG9vcENvdW50O1xuXG5cdFx0XHRcdGlmICggcGVuZGluZyA8PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8gaGF2ZSB0byBzdG9wIChzd2l0Y2ggc3RhdGUsIGNsYW1wIHRpbWUsIGZpcmUgZXZlbnQpXG5cblx0XHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XG5cdFx0XHRcdFx0ZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHRpbWUgPSBkZWx0YVRpbWUgPiAwID8gZHVyYXRpb24gOiAwO1xuXG5cdFx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdFx0dHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkZWx0YVRpbWUgPiAwID8gMSA6IC0gMVxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8ga2VlcCBydW5uaW5nXG5cblx0XHRcdFx0XHRpZiAoIHBlbmRpbmcgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGVudGVyaW5nIHRoZSBsYXN0IHJvdW5kXG5cblx0XHRcdFx0XHRcdHZhciBhdFN0YXJ0ID0gZGVsdGFUaW1lIDwgMDtcblx0XHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIGF0U3RhcnQsICEgYXRTdGFydCwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIGZhbHNlLCBmYWxzZSwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuX2xvb3BDb3VudCA9IGxvb3BDb3VudDtcblxuXHRcdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcblx0XHRcdFx0XHRcdHR5cGU6ICdsb29wJywgYWN0aW9uOiB0aGlzLCBsb29wRGVsdGE6IGxvb3BEZWx0YVxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBwaW5nUG9uZyAmJiAoIGxvb3BDb3VudCAmIDEgKSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBpbnZlcnQgdGltZSBmb3IgdGhlIFwicG9uZyByb3VuZFwiXG5cblx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcblx0XHRcdFx0cmV0dXJuIGR1cmF0aW9uIC0gdGltZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy50aW1lID0gdGltZTtcblx0XHRyZXR1cm4gdGltZTtcblxuXHR9LFxuXG5cdF9zZXRFbmRpbmdzOiBmdW5jdGlvbiAoIGF0U3RhcnQsIGF0RW5kLCBwaW5nUG9uZyApIHtcblxuXHRcdHZhciBzZXR0aW5ncyA9IHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M7XG5cblx0XHRpZiAoIHBpbmdQb25nICkge1xuXG5cdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCBcdD0gWmVyb1Nsb3BlRW5kaW5nO1xuXHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kXHRcdD0gWmVyb1Nsb3BlRW5kaW5nO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYXNzdW1pbmcgZm9yIExvb3BPbmNlIGF0U3RhcnQgPT0gYXRFbmQgPT0gdHJ1ZVxuXG5cdFx0XHRpZiAoIGF0U3RhcnQgKSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSB0aGlzLnplcm9TbG9wZUF0U3RhcnQgPyBaZXJvU2xvcGVFbmRpbmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gV3JhcEFyb3VuZEVuZGluZztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGF0RW5kICkge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZCA9IHRoaXMuemVyb1Nsb3BlQXRFbmQgPyBaZXJvU2xvcGVFbmRpbmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZCBcdCA9IFdyYXBBcm91bmRFbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdF9zY2hlZHVsZUZhZGluZzogZnVuY3Rpb24gKCBkdXJhdGlvbiwgd2VpZ2h0Tm93LCB3ZWlnaHRUaGVuICkge1xuXG5cdFx0dmFyIG1peGVyID0gdGhpcy5fbWl4ZXIsIG5vdyA9IG1peGVyLnRpbWUsXG5cdFx0XHRpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xuXHRcdFx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlcztcblxuXHRcdHRpbWVzWyAwIF0gPSBub3c7IFx0XHRcdFx0dmFsdWVzWyAwIF0gPSB3ZWlnaHROb3c7XG5cdFx0dGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uO1x0dmFsdWVzWyAxIF0gPSB3ZWlnaHRUaGVuO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgQW5pbWF0aW9uQWN0aW9uIH07XG4iLCJpbXBvcnQgeyBBbmltYXRpb25BY3Rpb24gfSBmcm9tICcuL0FuaW1hdGlvbkFjdGlvbi5qcyc7XG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi9jb3JlL0V2ZW50RGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBMaW5lYXJJbnRlcnBvbGFudCB9IGZyb20gJy4uL21hdGgvaW50ZXJwb2xhbnRzL0xpbmVhckludGVycG9sYW50LmpzJztcbmltcG9ydCB7IFByb3BlcnR5QmluZGluZyB9IGZyb20gJy4vUHJvcGVydHlCaW5kaW5nLmpzJztcbmltcG9ydCB7IFByb3BlcnR5TWl4ZXIgfSBmcm9tICcuL1Byb3BlcnR5TWl4ZXIuanMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uQ2xpcCB9IGZyb20gJy4vQW5pbWF0aW9uQ2xpcC5qcyc7XG5cbi8qKlxuICpcbiAqIFBsYXllciBmb3IgQW5pbWF0aW9uQ2xpcHMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25NaXhlciggcm9vdCApIHtcblxuXHR0aGlzLl9yb290ID0gcm9vdDtcblx0dGhpcy5faW5pdE1lbW9yeU1hbmFnZXIoKTtcblx0dGhpcy5fYWNjdUluZGV4ID0gMDtcblxuXHR0aGlzLnRpbWUgPSAwO1xuXG5cdHRoaXMudGltZVNjYWxlID0gMS4wO1xuXG59XG5cbkFuaW1hdGlvbk1peGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBbmltYXRpb25NaXhlcixcblxuXHRfYmluZEFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24sIHByb3RvdHlwZUFjdGlvbiApIHtcblxuXHRcdHZhciByb290ID0gYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHRyYWNrcyA9IGFjdGlvbi5fY2xpcC50cmFja3MsXG5cdFx0XHRuVHJhY2tzID0gdHJhY2tzLmxlbmd0aCxcblx0XHRcdGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzLFxuXHRcdFx0aW50ZXJwb2xhbnRzID0gYWN0aW9uLl9pbnRlcnBvbGFudHMsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblx0XHRcdGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ3NCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdGlmICggYmluZGluZ3NCeU5hbWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YmluZGluZ3NCeU5hbWUgPSB7fTtcblx0XHRcdGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ3NCeU5hbWU7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5UcmFja3M7ICsrIGkgKSB7XG5cblx0XHRcdHZhciB0cmFjayA9IHRyYWNrc1sgaSBdLFxuXHRcdFx0XHR0cmFja05hbWUgPSB0cmFjay5uYW1lLFxuXHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NCeU5hbWVbIHRyYWNrTmFtZSBdO1xuXG5cdFx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRiaW5kaW5nc1sgaSBdID0gYmluZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdC8vIGV4aXN0aW5nIGJpbmRpbmcsIG1ha2Ugc3VyZSB0aGUgY2FjaGUga25vd3NcblxuXHRcdFx0XHRcdGlmICggYmluZGluZy5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcblx0XHRcdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBwYXRoID0gcHJvdG90eXBlQWN0aW9uICYmIHByb3RvdHlwZUFjdGlvbi5cblx0XHRcdFx0XHRfcHJvcGVydHlCaW5kaW5nc1sgaSBdLmJpbmRpbmcucGFyc2VkUGF0aDtcblxuXHRcdFx0XHRiaW5kaW5nID0gbmV3IFByb3BlcnR5TWl4ZXIoXG5cdFx0XHRcdFx0UHJvcGVydHlCaW5kaW5nLmNyZWF0ZSggcm9vdCwgdHJhY2tOYW1lLCBwYXRoICksXG5cdFx0XHRcdFx0dHJhY2suVmFsdWVUeXBlTmFtZSwgdHJhY2suZ2V0VmFsdWVTaXplKCkgKTtcblxuXHRcdFx0XHQrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50O1xuXHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTtcblxuXHRcdFx0XHRiaW5kaW5nc1sgaSBdID0gYmluZGluZztcblxuXHRcdFx0fVxuXG5cdFx0XHRpbnRlcnBvbGFudHNbIGkgXS5yZXN1bHRCdWZmZXIgPSBiaW5kaW5nLmJ1ZmZlcjtcblxuXHRcdH1cblxuXHR9LFxuXG5cdF9hY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHRpZiAoICEgdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkge1xuXG5cdFx0XHRpZiAoIGFjdGlvbi5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHQvLyB0aGlzIGFjdGlvbiBoYXMgYmVlbiBmb3Jnb3R0ZW4gYnkgdGhlIGNhY2hlLCBidXQgdGhlIHVzZXJcblx0XHRcdFx0Ly8gYXBwZWFycyB0byBiZSBzdGlsbCB1c2luZyBpdCAtPiByZWJpbmRcblxuXHRcdFx0XHR2YXIgcm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkLFxuXHRcdFx0XHRcdGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0XHRcdHRoaXMuX2JpbmRBY3Rpb24oIGFjdGlvbixcblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcCAmJiBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXSApO1xuXG5cdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Ly8gaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZVxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIGJpbmRpbmcudXNlQ291bnQgKysgPT09IDAgKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9sZW5kQmluZGluZyggYmluZGluZyApO1xuXHRcdFx0XHRcdGJpbmRpbmcuc2F2ZU9yaWdpbmFsU3RhdGUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fbGVuZEFjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRfZGVhY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHRpZiAoIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcblxuXHRcdFx0dmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHQvLyBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggLS0gYmluZGluZy51c2VDb3VudCA9PT0gMCApIHtcblxuXHRcdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcblx0XHRcdFx0XHR0aGlzLl90YWtlQmFja0JpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fdGFrZUJhY2tBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZXJcblxuXHRfaW5pdE1lbW9yeU1hbmFnZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX2FjdGlvbnMgPSBbXTsgLy8gJ25BY3RpdmVBY3Rpb25zJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVzXG5cdFx0dGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAwO1xuXG5cdFx0dGhpcy5fYWN0aW9uc0J5Q2xpcCA9IHt9O1xuXHRcdC8vIGluc2lkZTpcblx0XHQvLyB7XG5cdFx0Ly8gXHRcdGtub3duQWN0aW9uczogQXJyYXk8IEFuaW1hdGlvbkFjdGlvbiA+XHQtIHVzZWQgYXMgcHJvdG90eXBlc1xuXHRcdC8vIFx0XHRhY3Rpb25CeVJvb3Q6IEFuaW1hdGlvbkFjdGlvblx0XHRcdC0gbG9va3VwXG5cdFx0Ly8gfVxuXG5cblx0XHR0aGlzLl9iaW5kaW5ncyA9IFtdOyAvLyAnbkFjdGl2ZUJpbmRpbmdzJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVzXG5cdFx0dGhpcy5fbkFjdGl2ZUJpbmRpbmdzID0gMDtcblxuXHRcdHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSA9IHt9OyAvLyBpbnNpZGU6IE1hcDwgbmFtZSwgUHJvcGVydHlNaXhlciA+XG5cblxuXHRcdHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMgPSBbXTsgLy8gc2FtZSBnYW1lIGFzIGFib3ZlXG5cdFx0dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgPSAwO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHRoaXMuc3RhdHMgPSB7XG5cblx0XHRcdGFjdGlvbnM6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9hY3Rpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVBY3Rpb25zO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRiaW5kaW5nczoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbEludGVycG9sYW50czoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RoO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9LFxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IGZvciBBbmltYXRpb25BY3Rpb24gb2JqZWN0c1xuXG5cdF9pc0FjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR2YXIgaW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7XG5cdFx0cmV0dXJuIGluZGV4ICE9PSBudWxsICYmIGluZGV4IDwgdGhpcy5fbkFjdGl2ZUFjdGlvbnM7XG5cblx0fSxcblxuXHRfYWRkSW5hY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB7XG5cblx0XHRcdFx0a25vd25BY3Rpb25zOiBbIGFjdGlvbiBdLFxuXHRcdFx0XHRhY3Rpb25CeVJvb3Q6IHt9XG5cblx0XHRcdH07XG5cblx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IDA7XG5cblx0XHRcdGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0gPSBhY3Rpb25zRm9yQ2xpcDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBrbm93bkFjdGlvbnMgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7XG5cblx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGtub3duQWN0aW9ucy5sZW5ndGg7XG5cdFx0XHRrbm93bkFjdGlvbnMucHVzaCggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBhY3Rpb25zLmxlbmd0aDtcblx0XHRhY3Rpb25zLnB1c2goIGFjdGlvbiApO1xuXG5cdFx0YWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdID0gYWN0aW9uO1xuXG5cdH0sXG5cblx0X3JlbW92ZUluYWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdLFxuXHRcdFx0Y2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcblxuXHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xuXHRcdGFjdGlvbnMucG9wKCk7XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xuXG5cblx0XHR2YXIgY2xpcFV1aWQgPSBhY3Rpb24uX2NsaXAudXVpZCxcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLFxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLFxuXHRcdFx0a25vd25BY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucyxcblxuXHRcdFx0bGFzdEtub3duQWN0aW9uID1cblx0XHRcdFx0a25vd25BY3Rpb25zRm9yQ2xpcFsga25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggLSAxIF0sXG5cblx0XHRcdGJ5Q2xpcENhY2hlSW5kZXggPSBhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXg7XG5cblx0XHRsYXN0S25vd25BY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBieUNsaXBDYWNoZUluZGV4O1xuXHRcdGtub3duQWN0aW9uc0ZvckNsaXBbIGJ5Q2xpcENhY2hlSW5kZXggXSA9IGxhc3RLbm93bkFjdGlvbjtcblx0XHRrbm93bkFjdGlvbnNGb3JDbGlwLnBvcCgpO1xuXG5cdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDtcblxuXG5cdFx0dmFyIGFjdGlvbkJ5Um9vdCA9IGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdCxcblx0XHRcdHJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZDtcblxuXHRcdGRlbGV0ZSBhY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApO1xuXG5cdH0sXG5cblx0X3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRpZiAoIC0tIGJpbmRpbmcucmVmZXJlbmNlQ291bnQgPT09IDAgKSB7XG5cblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdF9sZW5kQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdC8vIFsgYWN0aXZlIGFjdGlvbnMgfCAgaW5hY3RpdmUgYWN0aW9ucyAgXVxuXHRcdC8vIFsgIGFjdGl2ZSBhY3Rpb25zID58IGluYWN0aXZlIGFjdGlvbnMgXVxuXHRcdC8vICAgICAgICAgICAgICAgICBzICAgICAgICBhXG5cdFx0Ly8gICAgICAgICAgICAgICAgICA8LXN3YXAtPlxuXHRcdC8vICAgICAgICAgICAgICAgICBhICAgICAgICBzXG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVBY3Rpb25zICsrLFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0YWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XG5cblx0XHRmaXJzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUFjdGlvbjtcblxuXHR9LFxuXG5cdF90YWtlQmFja0FjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyAgfCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHw8IGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyAgICAgICAgYSAgICAgICAgc1xuXHRcdC8vICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgcyAgICAgICAgYVxuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0cHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblxuXHRcdFx0bGFzdEFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xuXHRcdGFjdGlvbnNbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYWN0aW9uO1xuXG5cdFx0bGFzdEFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVBY3Rpb247XG5cblx0fSxcblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgUHJvcGVydHlNaXhlciBvYmplY3RzXG5cblx0X2FkZEluYWN0aXZlQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLFxuXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0aWYgKCBiaW5kaW5nQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJpbmRpbmdCeU5hbWUgPSB7fTtcblx0XHRcdGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ0J5TmFtZTtcblxuXHRcdH1cblxuXHRcdGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdID0gYmluZGluZztcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7XG5cdFx0YmluZGluZ3MucHVzaCggYmluZGluZyApO1xuXG5cdH0sXG5cblx0X3JlbW92ZUluYWN0aXZlQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRwcm9wQmluZGluZyA9IGJpbmRpbmcuYmluZGluZyxcblx0XHRcdHJvb3RVdWlkID0gcHJvcEJpbmRpbmcucm9vdE5vZGUudXVpZCxcblx0XHRcdHRyYWNrTmFtZSA9IHByb3BCaW5kaW5nLnBhdGgsXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSxcblxuXHRcdFx0bGFzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBiaW5kaW5ncy5sZW5ndGggLSAxIF0sXG5cdFx0XHRjYWNoZUluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleDtcblxuXHRcdGxhc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xuXHRcdGJpbmRpbmdzWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVCaW5kaW5nO1xuXHRcdGJpbmRpbmdzLnBvcCgpO1xuXG5cdFx0ZGVsZXRlIGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdO1xuXG5cdFx0cmVtb3ZlX2VtcHR5X21hcDoge1xuXG5cdFx0XHRmb3IgKCB2YXIgXyBpbiBiaW5kaW5nQnlOYW1lICkgYnJlYWsgcmVtb3ZlX2VtcHR5X21hcDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG5cdFx0XHRkZWxldGUgYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHR9XG5cblx0fSxcblxuXHRfbGVuZEJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcblxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzICsrLFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXTtcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdGZpcnN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGZpcnN0SW5hY3RpdmVCaW5kaW5nO1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQmluZGluZ3MsXG5cblx0XHRcdGxhc3RBY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcblx0XHRiaW5kaW5nc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0bGFzdEFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YmluZGluZ3NbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUJpbmRpbmc7XG5cblx0fSxcblxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IG9mIEludGVycG9sYW50cyBmb3Igd2VpZ2h0IGFuZCB0aW1lIHNjYWxlXG5cblx0X2xlbmRDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLFxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgKyssXG5cdFx0XHRpbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRpZiAoIGludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbmV3IExpbmVhckludGVycG9sYW50KFxuXHRcdFx0XHRuZXcgRmxvYXQzMkFycmF5KCAyICksIG5ldyBGbG9hdDMyQXJyYXkoIDIgKSxcblx0XHRcdFx0MSwgdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciApO1xuXG5cdFx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0XHRpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW50ZXJwb2xhbnQ7XG5cblx0fSxcblxuXHRfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICggaW50ZXJwb2xhbnQgKSB7XG5cblx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcblx0XHRcdHByZXZJbmRleCA9IGludGVycG9sYW50Ll9fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMsXG5cblx0XHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0aW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0bGFzdEFjdGl2ZUludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRpbnRlcnBvbGFudHNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUludGVycG9sYW50O1xuXG5cdH0sXG5cblx0X2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXI6IG5ldyBGbG9hdDMyQXJyYXkoIDEgKSxcblxuXHQvLyByZXR1cm4gYW4gYWN0aW9uIGZvciBhIGNsaXAgb3B0aW9uYWxseSB1c2luZyBhIGN1c3RvbSByb290IHRhcmdldFxuXHQvLyBvYmplY3QgKHRoaXMgbWV0aG9kIGFsbG9jYXRlcyBhIGxvdCBvZiBkeW5hbWljIG1lbW9yeSBpbiBjYXNlIGFcblx0Ly8gcHJldmlvdXNseSB1bmtub3duIGNsaXAvcm9vdCBjb21iaW5hdGlvbiBpcyBzcGVjaWZpZWQpXG5cdGNsaXBBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkge1xuXG5cdFx0dmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXG5cdFx0XHRjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID9cblx0XHRcdFx0QW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLFxuXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXBPYmplY3QgIT09IG51bGwgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLFxuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sXG5cdFx0XHRwcm90b3R5cGVBY3Rpb24gPSBudWxsO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgZXhpc3RpbmdBY3Rpb24gPVxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdFx0aWYgKCBleGlzdGluZ0FjdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBleGlzdGluZ0FjdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyB3ZSBrbm93IHRoZSBjbGlwLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHBhcnNlIGFsbFxuXHRcdFx0Ly8gdGhlIGJpbmRpbmdzIGFnYWluIGJ1dCBjYW4ganVzdCBjb3B5XG5cdFx0XHRwcm90b3R5cGVBY3Rpb24gPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXTtcblxuXHRcdFx0Ly8gYWxzbywgdGFrZSB0aGUgY2xpcCBmcm9tIHRoZSBwcm90b3R5cGUgYWN0aW9uXG5cdFx0XHRpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKVxuXHRcdFx0XHRjbGlwT2JqZWN0ID0gcHJvdG90eXBlQWN0aW9uLl9jbGlwO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY2xpcCBtdXN0IGJlIGtub3duIHdoZW4gc3BlY2lmaWVkIHZpYSBzdHJpbmdcblx0XHRpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIGFsbG9jYXRlIGFsbCByZXNvdXJjZXMgcmVxdWlyZWQgdG8gcnVuIGl0XG5cdFx0dmFyIG5ld0FjdGlvbiA9IG5ldyBBbmltYXRpb25BY3Rpb24oIHRoaXMsIGNsaXBPYmplY3QsIG9wdGlvbmFsUm9vdCApO1xuXG5cdFx0dGhpcy5fYmluZEFjdGlvbiggbmV3QWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKTtcblxuXHRcdC8vIGFuZCBtYWtlIHRoZSBhY3Rpb24ga25vd24gdG8gdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdFx0dGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oIG5ld0FjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7XG5cblx0XHRyZXR1cm4gbmV3QWN0aW9uO1xuXG5cdH0sXG5cblx0Ly8gZ2V0IGFuIGV4aXN0aW5nIGFjdGlvblxuXHRleGlzdGluZ0FjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdCA9IG9wdGlvbmFsUm9vdCB8fCB0aGlzLl9yb290LFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cblx0XHRcdGNsaXBPYmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmluZycgP1xuXHRcdFx0XHRBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXAsXG5cblx0XHRcdGNsaXBVdWlkID0gY2xpcE9iamVjdCA/IGNsaXBPYmplY3QudXVpZCA6IGNsaXAsXG5cblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSB8fCBudWxsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHQvLyBkZWFjdGl2YXRlcyBhbGwgcHJldmlvdXNseSBzY2hlZHVsZWQgYWN0aW9uc1xuXHRzdG9wQWxsQWN0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRuQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdHRoaXMuX25BY3RpdmVBY3Rpb25zID0gMDtcblx0XHR0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQWN0aW9uczsgKysgaSApIHtcblxuXHRcdFx0YWN0aW9uc1sgaSBdLnJlc2V0KCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5CaW5kaW5nczsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS51c2VDb3VudCA9IDA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIGFkdmFuY2UgdGhlIHRpbWUgYW5kIHVwZGF0ZSBhcHBseSB0aGUgYW5pbWF0aW9uXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCBkZWx0YVRpbWUgKSB7XG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy50aW1lU2NhbGU7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRuQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXG5cdFx0XHR0aW1lID0gdGhpcy50aW1lICs9IGRlbHRhVGltZSxcblx0XHRcdHRpbWVEaXJlY3Rpb24gPSBNYXRoLnNpZ24oIGRlbHRhVGltZSApLFxuXG5cdFx0XHRhY2N1SW5kZXggPSB0aGlzLl9hY2N1SW5kZXggXj0gMTtcblxuXHRcdC8vIHJ1biBhY3RpdmUgYWN0aW9uc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQWN0aW9uczsgKysgaSApIHtcblxuXHRcdFx0dmFyIGFjdGlvbiA9IGFjdGlvbnNbIGkgXTtcblxuXHRcdFx0YWN0aW9uLl91cGRhdGUoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICk7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgc2NlbmUgZ3JhcGhcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYXBwbHkoIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdGhpcyBtaXhlcidzIHJvb3QgdGFyZ2V0IG9iamVjdFxuXHRnZXRSb290OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fcm9vdDtcblxuXHR9LFxuXG5cdC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgY2xpcFxuXHR1bmNhY2hlQ2xpcDogZnVuY3Rpb24gKCBjbGlwICkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwLnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbm90ZToganVzdCBjYWxsaW5nIF9yZW1vdmVJbmFjdGl2ZUFjdGlvbiB3b3VsZCBtZXNzIHVwIHRoZVxuXHRcdFx0Ly8gaXRlcmF0aW9uIHN0YXRlIGFuZCBhbHNvIHJlcXVpcmUgdXBkYXRpbmcgdGhlIHN0YXRlIHdlIGNhblxuXHRcdFx0Ly8ganVzdCB0aHJvdyBhd2F5XG5cblx0XHRcdHZhciBhY3Rpb25zVG9SZW1vdmUgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFjdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGFjdGlvbiA9IGFjdGlvbnNUb1JlbW92ZVsgaSBdO1xuXG5cdFx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHRcdHZhciBjYWNoZUluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXHRcdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdO1xuXG5cdFx0XHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7XG5cdFx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XG5cblx0XHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRcdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xuXHRcdFx0XHRhY3Rpb25zLnBvcCgpO1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gZnJlZSBhbGwgcmVzb3VyY2VzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciByb290IHRhcmdldCBvYmplY3Rcblx0dW5jYWNoZVJvb3Q6IGZ1bmN0aW9uICggcm9vdCApIHtcblxuXHRcdHZhciByb290VXVpZCA9IHJvb3QudXVpZCxcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwO1xuXG5cdFx0Zm9yICggdmFyIGNsaXBVdWlkIGluIGFjdGlvbnNCeUNsaXAgKSB7XG5cblx0XHRcdHZhciBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLmFjdGlvbkJ5Um9vdCxcblx0XHRcdFx0YWN0aW9uID0gYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0XHRpZiAoIGFjdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdGlmICggYmluZGluZ0J5TmFtZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgdHJhY2tOYW1lIGluIGJpbmRpbmdCeU5hbWUgKSB7XG5cblx0XHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcblx0XHRcdFx0YmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlIGEgdGFyZ2V0ZWQgY2xpcCBmcm9tIHRoZSBjYWNoZVxuXHR1bmNhY2hlQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdHZhciBhY3Rpb24gPSB0aGlzLmV4aXN0aW5nQWN0aW9uKCBjbGlwLCBvcHRpb25hbFJvb3QgKTtcblxuXHRcdGlmICggYWN0aW9uICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBBbmltYXRpb25NaXhlciB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFVuaWZvcm0oIHZhbHVlICkge1xuXG5cdGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IFR5cGUgcGFyYW1ldGVyIGlzIG5vIGxvbmdlciBuZWVkZWQuJyApO1xuXHRcdHZhbHVlID0gYXJndW1lbnRzWyAxIF07XG5cblx0fVxuXG5cdHRoaXMudmFsdWUgPSB2YWx1ZTtcblxufVxuXG5Vbmlmb3JtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRyZXR1cm4gbmV3IFVuaWZvcm0oIHRoaXMudmFsdWUuY2xvbmUgPT09IHVuZGVmaW5lZCA/IHRoaXMudmFsdWUgOiB0aGlzLnZhbHVlLmNsb25lKCkgKTtcblxufTtcblxuZXhwb3J0IHsgVW5pZm9ybSB9O1xuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuL0J1ZmZlckdlb21ldHJ5LmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSgpIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Jztcblx0dGhpcy5tYXhJbnN0YW5jZWRDb3VudCA9IHVuZGVmaW5lZDtcblxufVxuXG5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSxcblxuXHRpc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1heEluc3RhbmNlZENvdW50ID0gc291cmNlLm1heEluc3RhbmNlZENvdW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG5leHBvcnQgeyBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSB9O1xuIiwiaW1wb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXIgfSBmcm9tICcuL0ludGVybGVhdmVkQnVmZmVyLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSwgbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRJbnRlcmxlYXZlZEJ1ZmZlci5jYWxsKCB0aGlzLCBhcnJheSwgc3RyaWRlICk7XG5cblx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxO1xuXG59XG5cbkluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLFxuXG5cdGlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbmV4cG9ydCB7IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyIH07XG4iLCJpbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIGFycmF5LCBpdGVtU2l6ZSApO1xuXG5cdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGUgfHwgMTtcblxufVxuXG5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSxcblxuXHRpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cblxuXG5leHBvcnQgeyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgfTtcbiIsImltcG9ydCB7IFJheSB9IGZyb20gJy4uL21hdGgvUmF5LmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3Igc3RlcGhvbWkgLyBodHRwOi8vc3RlcGhhbmVnaW5pZXIuY29tL1xuICovXG5cbmZ1bmN0aW9uIFJheWNhc3Rlciggb3JpZ2luLCBkaXJlY3Rpb24sIG5lYXIsIGZhciApIHtcblxuXHR0aGlzLnJheSA9IG5ldyBSYXkoIG9yaWdpbiwgZGlyZWN0aW9uICk7XG5cdC8vIGRpcmVjdGlvbiBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQgKGZvciBhY2N1cmF0ZSBkaXN0YW5jZSBjYWxjdWxhdGlvbnMpXG5cblx0dGhpcy5uZWFyID0gbmVhciB8fCAwO1xuXHR0aGlzLmZhciA9IGZhciB8fCBJbmZpbml0eTtcblxuXHR0aGlzLnBhcmFtcyA9IHtcblx0XHRNZXNoOiB7fSxcblx0XHRMaW5lOiB7fSxcblx0XHRMT0Q6IHt9LFxuXHRcdFBvaW50czogeyB0aHJlc2hvbGQ6IDEgfSxcblx0XHRTcHJpdGU6IHt9XG5cdH07XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMucGFyYW1zLCB7XG5cdFx0UG9pbnRDbG91ZDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5Y2FzdGVyOiBwYXJhbXMuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIHBhcmFtcy5Qb2ludHMuJyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5Qb2ludHM7XG5cblx0XHRcdH1cblx0XHR9XG5cdH0gKTtcblxufVxuXG5mdW5jdGlvbiBhc2NTb3J0KCBhLCBiICkge1xuXG5cdHJldHVybiBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTtcblxufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3RPYmplY3QoIG9iamVjdCwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKSB7XG5cblx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0b2JqZWN0LnJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApO1xuXG5cdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0dmFyIGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aW50ZXJzZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHRydWUgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUmF5Y2FzdGVyLnByb3RvdHlwZSwge1xuXG5cdGxpbmVQcmVjaXNpb246IDEsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcblxuXHRcdHRoaXMucmF5LnNldCggb3JpZ2luLCBkaXJlY3Rpb24gKTtcblxuXHR9LFxuXG5cdHNldEZyb21DYW1lcmE6IGZ1bmN0aW9uICggY29vcmRzLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoICggY2FtZXJhICYmIGNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhICkgKSB7XG5cblx0XHRcdHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dGhpcy5yYXkuZGlyZWN0aW9uLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAwLjUgKS51bnByb2plY3QoIGNhbWVyYSApLnN1YiggdGhpcy5yYXkub3JpZ2luICkubm9ybWFsaXplKCk7XG5cblx0XHR9IGVsc2UgaWYgKCAoIGNhbWVyYSAmJiBjYW1lcmEuaXNPcnRob2dyYXBoaWNDYW1lcmEgKSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAoIGNhbWVyYS5uZWFyICsgY2FtZXJhLmZhciApIC8gKCBjYW1lcmEubmVhciAtIGNhbWVyYS5mYXIgKSApLnVucHJvamVjdCggY2FtZXJhICk7IC8vIHNldCBvcmlnaW4gaW4gcGxhbmUgb2YgY2FtZXJhXG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCAwLCAwLCAtIDEgKS50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlJheWNhc3RlcjogVW5zdXBwb3J0ZWQgY2FtZXJhIHR5cGUuJyApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0aW50ZXJzZWN0T2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCwgcmVjdXJzaXZlLCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciBpbnRlcnNlY3RzID0gb3B0aW9uYWxUYXJnZXQgfHwgW107XG5cblx0XHRpbnRlcnNlY3RPYmplY3QoIG9iamVjdCwgdGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7XG5cblx0XHRpbnRlcnNlY3RzLnNvcnQoIGFzY1NvcnQgKTtcblxuXHRcdHJldHVybiBpbnRlcnNlY3RzO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0T2JqZWN0czogZnVuY3Rpb24gKCBvYmplY3RzLCByZWN1cnNpdmUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGludGVyc2VjdHMgPSBvcHRpb25hbFRhcmdldCB8fCBbXTtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggb2JqZWN0cyApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHM6IG9iamVjdHMgaXMgbm90IGFuIEFycmF5LicgKTtcblx0XHRcdHJldHVybiBpbnRlcnNlY3RzO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gb2JqZWN0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpbnRlcnNlY3RPYmplY3QoIG9iamVjdHNbIGkgXSwgdGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7XG5cblx0XHR9XG5cblx0XHRpbnRlcnNlY3RzLnNvcnQoIGFzY1NvcnQgKTtcblxuXHRcdHJldHVybiBpbnRlcnNlY3RzO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IFJheWNhc3RlciB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIENsb2NrKCBhdXRvU3RhcnQgKSB7XG5cblx0dGhpcy5hdXRvU3RhcnQgPSAoIGF1dG9TdGFydCAhPT0gdW5kZWZpbmVkICkgPyBhdXRvU3RhcnQgOiB0cnVlO1xuXG5cdHRoaXMuc3RhcnRUaW1lID0gMDtcblx0dGhpcy5vbGRUaW1lID0gMDtcblx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XG5cblx0dGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ2xvY2sucHJvdG90eXBlLCB7XG5cblx0c3RhcnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuc3RhcnRUaW1lID0gKCB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7IC8vIHNlZSAjMTA3MzJcblxuXHRcdHRoaXMub2xkVGltZSA9IHRoaXMuc3RhcnRUaW1lO1xuXHRcdHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xuXHRcdHRoaXMucnVubmluZyA9IHRydWU7XG5cblx0fSxcblxuXHRzdG9wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdldEVsYXBzZWRUaW1lKCk7XG5cdFx0dGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cdFx0dGhpcy5hdXRvU3RhcnQgPSBmYWxzZTtcblxuXHR9LFxuXG5cdGdldEVsYXBzZWRUaW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdldERlbHRhKCk7XG5cdFx0cmV0dXJuIHRoaXMuZWxhcHNlZFRpbWU7XG5cblx0fSxcblxuXHRnZXREZWx0YTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRpZmYgPSAwO1xuXG5cdFx0aWYgKCB0aGlzLmF1dG9TdGFydCAmJiAhIHRoaXMucnVubmluZyApIHtcblxuXHRcdFx0dGhpcy5zdGFydCgpO1xuXHRcdFx0cmV0dXJuIDA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMucnVubmluZyApIHtcblxuXHRcdFx0dmFyIG5ld1RpbWUgPSAoIHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlIDogcGVyZm9ybWFuY2UgKS5ub3coKTtcblxuXHRcdFx0ZGlmZiA9ICggbmV3VGltZSAtIHRoaXMub2xkVGltZSApIC8gMTAwMDtcblx0XHRcdHRoaXMub2xkVGltZSA9IG5ld1RpbWU7XG5cblx0XHRcdHRoaXMuZWxhcHNlZFRpbWUgKz0gZGlmZjtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkaWZmO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IENsb2NrIH07XG4iLCJpbXBvcnQgeyBfTWF0aCB9IGZyb20gJy4vTWF0aC5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogUmVmOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TcGhlcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW1cbiAqXG4gKiBUaGUgcG9sZXMgKHBoaSkgYXJlIGF0IHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgeSBheGlzLlxuICogVGhlIGVxdWF0b3Igc3RhcnRzIGF0IHBvc2l0aXZlIHouXG4gKi9cblxuZnVuY3Rpb24gU3BoZXJpY2FsKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XG5cblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAxLjA7XG5cdHRoaXMucGhpID0gKCBwaGkgIT09IHVuZGVmaW5lZCApID8gcGhpIDogMDsgLy8gdXAgLyBkb3duIHRvd2FyZHMgdG9wIGFuZCBib3R0b20gcG9sZVxuXHR0aGlzLnRoZXRhID0gKCB0aGV0YSAhPT0gdW5kZWZpbmVkICkgPyB0aGV0YSA6IDA7IC8vIGFyb3VuZCB0aGUgZXF1YXRvciBvZiB0aGUgc3BoZXJlXG5cblx0cmV0dXJuIHRoaXM7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU3BoZXJpY2FsLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblx0XHR0aGlzLnBoaSA9IHBoaTtcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG90aGVyICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7XG5cdFx0dGhpcy5waGkgPSBvdGhlci5waGk7XG5cdFx0dGhpcy50aGV0YSA9IG90aGVyLnRoZXRhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZXN0cmljdCBwaGkgdG8gYmUgYmV0d2VlIEVQUyBhbmQgUEktRVBTXG5cdG1ha2VTYWZlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgRVBTID0gMC4wMDAwMDE7XG5cdFx0dGhpcy5waGkgPSBNYXRoLm1heCggRVBTLCBNYXRoLm1pbiggTWF0aC5QSSAtIEVQUywgdGhpcy5waGkgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24gKCB2ZWMzICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSB2ZWMzLmxlbmd0aCgpO1xuXG5cdFx0aWYgKCB0aGlzLnJhZGl1cyA9PT0gMCApIHtcblxuXHRcdFx0dGhpcy50aGV0YSA9IDA7XG5cdFx0XHR0aGlzLnBoaSA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnRoZXRhID0gTWF0aC5hdGFuMiggdmVjMy54LCB2ZWMzLnogKTsgLy8gZXF1YXRvciBhbmdsZSBhcm91bmQgeS11cCBheGlzXG5cdFx0XHR0aGlzLnBoaSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIHZlYzMueSAvIHRoaXMucmFkaXVzLCAtIDEsIDEgKSApOyAvLyBwb2xhciBhbmdsZVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgU3BoZXJpY2FsIH07XG4iLCIvKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogUmVmOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DeWxpbmRyaWNhbF9jb29yZGluYXRlX3N5c3RlbVxuICpcbiAqL1xuXG5mdW5jdGlvbiBDeWxpbmRyaWNhbCggcmFkaXVzLCB0aGV0YSwgeSApIHtcblxuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDsgLy8gZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luIHRvIGEgcG9pbnQgaW4gdGhlIHgteiBwbGFuZVxuXHR0aGlzLnRoZXRhID0gKCB0aGV0YSAhPT0gdW5kZWZpbmVkICkgPyB0aGV0YSA6IDA7IC8vIGNvdW50ZXJjbG9ja3dpc2UgYW5nbGUgaW4gdGhlIHgteiBwbGFuZSBtZWFzdXJlZCBpbiByYWRpYW5zIGZyb20gdGhlIHBvc2l0aXZlIHotYXhpc1xuXHR0aGlzLnkgPSAoIHkgIT09IHVuZGVmaW5lZCApID8geSA6IDA7IC8vIGhlaWdodCBhYm92ZSB0aGUgeC16IHBsYW5lXG5cblx0cmV0dXJuIHRoaXM7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3lsaW5kcmljYWwucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgdGhldGEsIHkgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cdFx0dGhpcy55ID0gb3RoZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjMyApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB2ZWMzLnggKiB2ZWMzLnggKyB2ZWMzLnogKiB2ZWMzLnogKTtcblx0XHR0aGlzLnRoZXRhID0gTWF0aC5hdGFuMiggdmVjMy54LCB2ZWMzLnogKTtcblx0XHR0aGlzLnkgPSB2ZWMzLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBDeWxpbmRyaWNhbCB9O1xuIiwiaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4vVmVjdG9yMi5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIEJveDIoIG1pbiwgbWF4ICkge1xuXG5cdHRoaXMubWluID0gKCBtaW4gIT09IHVuZGVmaW5lZCApID8gbWluIDogbmV3IFZlY3RvcjIoICsgSW5maW5pdHksICsgSW5maW5pdHkgKTtcblx0dGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9yMiggLSBJbmZpbml0eSwgLSBJbmZpbml0eSApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJveDIucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdFx0dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblx0XHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHRcdHRoaXMubWF4LmNvcHkoIGNlbnRlciApLmFkZCggaGFsZlNpemUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXguY29weSggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IC0gSW5maW5pdHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlzRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzXG5cblx0XHRyZXR1cm4gKCB0aGlzLm1heC54IDwgdGhpcy5taW4ueCApIHx8ICggdGhpcy5tYXgueSA8IHRoaXMubWluLnkgKTtcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0Q2VudGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwICkgOiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdH0sXG5cblx0Z2V0U2l6ZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCApIDogdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggcG9pbnQgKTtcblx0XHR0aGlzLm1heC5tYXgoIHBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHRoaXMubWluLnN1YiggdmVjdG9yICk7XG5cdFx0dGhpcy5tYXguYWRkKCB2ZWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApO1xuXHRcdHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdHBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueTtcblxuXHR9LFxuXG5cdGdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55IClcblx0XHQpO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHQvLyB1c2luZyA0IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9uc1xuXG5cdFx0cmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0Ym94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXHRcdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3Q6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWF4KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWluKCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVuaW9uOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1heCggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5taW4uYWRkKCBvZmZzZXQgKTtcblx0XHR0aGlzLm1heC5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApO1xuXG5cdH1cblxufSApO1xuXG5cbmV4cG9ydCB7IEJveDIgfTtcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgX01hdGggfSBmcm9tICcuL01hdGguanMnO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBMaW5lMyggc3RhcnQsIGVuZCApIHtcblxuXHR0aGlzLnN0YXJ0ID0gKCBzdGFydCAhPT0gdW5kZWZpbmVkICkgPyBzdGFydCA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuZW5kID0gKCBlbmQgIT09IHVuZGVmaW5lZCApID8gZW5kIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMaW5lMy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggc3RhcnQsIGVuZCApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggc3RhcnQgKTtcblx0XHR0aGlzLmVuZC5jb3B5KCBlbmQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApO1xuXHRcdHRoaXMuZW5kLmNvcHkoIGxpbmUuZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9LFxuXG5cdGRlbHRhOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmVuZCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8oIHRoaXMuZW5kICk7XG5cblx0fSxcblxuXHRhdDogZnVuY3Rpb24gKCB0LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydFAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzdGFydEVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0XHRzdGFydFAuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMuc3RhcnQgKTtcblx0XHRcdHN0YXJ0RW5kLnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7XG5cblx0XHRcdHZhciBzdGFydEVuZDIgPSBzdGFydEVuZC5kb3QoIHN0YXJ0RW5kICk7XG5cdFx0XHR2YXIgc3RhcnRFbmRfc3RhcnRQID0gc3RhcnRFbmQuZG90KCBzdGFydFAgKTtcblxuXHRcdFx0dmFyIHQgPSBzdGFydEVuZF9zdGFydFAgLyBzdGFydEVuZDI7XG5cblx0XHRcdGlmICggY2xhbXBUb0xpbmUgKSB7XG5cblx0XHRcdFx0dCA9IF9NYXRoLmNsYW1wKCB0LCAwLCAxICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBjbGFtcFRvTGluZSwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRvTGluZSApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cdFx0dGhpcy5lbmQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHRyZXR1cm4gbGluZS5zdGFydC5lcXVhbHMoIHRoaXMuc3RhcnQgKSAmJiBsaW5lLmVuZC5lcXVhbHMoIHRoaXMuZW5kICk7XG5cblx0fVxuXG59ICk7XG5cblxuZXhwb3J0IHsgTGluZTMgfTtcbiIsImltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vLi4vY29yZS9PYmplY3QzRC5qcyc7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbW1lZGlhdGVSZW5kZXJPYmplY3QoIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7XG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCAvKiByZW5kZXJDYWxsYmFjayAqLyApIHt9O1xuXG59XG5cbkltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbW1lZGlhdGVSZW5kZXJPYmplY3Q7XG5cbkltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90b3R5cGUuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgPSB0cnVlO1xuXG5cbmV4cG9ydCB7IEltbWVkaWF0ZVJlbmRlck9iamVjdCB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uL21hdGgvTWF0cml4My5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xuXG5mdW5jdGlvbiBWZXJ0ZXhOb3JtYWxzSGVscGVyKCBvYmplY3QsIHNpemUsIGhleCwgbGluZXdpZHRoICkge1xuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdHRoaXMuc2l6ZSA9ICggc2l6ZSAhPT0gdW5kZWZpbmVkICkgPyBzaXplIDogMTtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmMDAwMDtcblxuXHR2YXIgd2lkdGggPSAoIGxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyBsaW5ld2lkdGggOiAxO1xuXG5cdC8vXG5cblx0dmFyIG5Ob3JtYWxzID0gMDtcblxuXHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmZhY2VzLmxlbmd0aCAqIDM7XG5cblx0fSBlbHNlIGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdG5Ob3JtYWxzID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWwuY291bnQ7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7XG5cblx0Ly9cblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBWZXJ0ZXhOb3JtYWxzSGVscGVyO1xuXG5WZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0dmFyIGtleXMgPSBbICdhJywgJ2InLCAnYycgXTtcblxuXHRcdHRoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5vYmplY3QubWF0cml4V29ybGQ7XG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHQvL1xuXG5cdFx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciB2ZXJ0aWNlcyA9IG9iakdlb21ldHJ5LnZlcnRpY2VzO1xuXG5cdFx0XHR2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlcztcblxuXHRcdFx0dmFyIGlkeCA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmVydGV4ID0gdmVydGljZXNbIGZhY2VbIGtleXNbIGogXSBdIF07XG5cblx0XHRcdFx0XHR2YXIgbm9ybWFsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzWyBqIF07XG5cblx0XHRcdFx0XHR2MS5jb3B5KCB2ZXJ0ZXggKS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHR2Mi5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7XG5cblx0XHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7XG5cblx0XHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIG9ialBvcyA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdHZhciBvYmpOb3JtID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRcdHZhciBpZHggPSAwO1xuXG5cdFx0XHQvLyBmb3Igc2ltcGxpY2l0eSwgaWdub3JlIGluZGV4IGFuZCBkcmF3Y2FsbHMsIGFuZCByZW5kZXIgZXZlcnkgbm9ybWFsXG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBvYmpQb3MuY291bnQ7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR2MS5zZXQoIG9ialBvcy5nZXRYKCBqICksIG9ialBvcy5nZXRZKCBqICksIG9ialBvcy5nZXRaKCBqICkgKS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0djIuc2V0KCBvYmpOb3JtLmdldFgoIGogKSwgb2JqTm9ybS5nZXRZKCBqICksIG9iak5vcm0uZ2V0WiggaiApICk7XG5cblx0XHRcdFx0djIuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApO1xuXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApO1xuXG5cdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCkgKTtcblxuXG5leHBvcnQgeyBWZXJ0ZXhOb3JtYWxzSGVscGVyIH07XG4iLCIvKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xuaW1wb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5cbmZ1bmN0aW9uIFNwb3RMaWdodEhlbHBlciggbGlnaHQsIGNvbG9yICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IFtcblx0XHQwLCAwLCAwLCBcdDAsIDAsIDEsXG5cdFx0MCwgMCwgMCwgXHQxLCAwLCAxLFxuXHRcdDAsIDAsIDAsXHQtIDEsIDAsIDEsXG5cdFx0MCwgMCwgMCwgXHQwLCAxLCAxLFxuXHRcdDAsIDAsIDAsIFx0MCwgLSAxLCAxXG5cdF07XG5cblx0Zm9yICggdmFyIGkgPSAwLCBqID0gMSwgbCA9IDMyOyBpIDwgbDsgaSArKywgaiArKyApIHtcblxuXHRcdHZhciBwMSA9ICggaSAvIGwgKSAqIE1hdGguUEkgKiAyO1xuXHRcdHZhciBwMiA9ICggaiAvIGwgKSAqIE1hdGguUEkgKiAyO1xuXG5cdFx0cG9zaXRpb25zLnB1c2goXG5cdFx0XHRNYXRoLmNvcyggcDEgKSwgTWF0aC5zaW4oIHAxICksIDEsXG5cdFx0XHRNYXRoLmNvcyggcDIgKSwgTWF0aC5zaW4oIHAyICksIDFcblx0XHQpO1xuXG5cdH1cblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZhbHNlIH0gKTtcblxuXHR0aGlzLmNvbmUgPSBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwb3RMaWdodEhlbHBlcjtcblxuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdmVjdG9yMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdHZhciBjb25lTGVuZ3RoID0gdGhpcy5saWdodC5kaXN0YW5jZSA/IHRoaXMubGlnaHQuZGlzdGFuY2UgOiAxMDAwO1xuXHRcdHZhciBjb25lV2lkdGggPSBjb25lTGVuZ3RoICogTWF0aC50YW4oIHRoaXMubGlnaHQuYW5nbGUgKTtcblxuXHRcdHRoaXMuY29uZS5zY2FsZS5zZXQoIGNvbmVXaWR0aCwgY29uZVdpZHRoLCBjb25lTGVuZ3RoICk7XG5cblx0XHR2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0dmVjdG9yMi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHR0aGlzLmNvbmUubG9va0F0KCB2ZWN0b3IyLnN1YiggdmVjdG9yICkgKTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdFx0fVxuXG5cdH07XG5cbn0oKTtcblxuXG5leHBvcnQgeyBTcG90TGlnaHRIZWxwZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBTZWFuIEdyaWZmaW4gLyBodHRwOi8vdHdpdHRlci5jb20vc2dyaWZcbiAqIEBhdXRob3IgTWljaGFlbCBHdWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xuaW1wb3J0IHsgVmVydGV4Q29sb3JzIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcblxuZnVuY3Rpb24gZ2V0Qm9uZUxpc3QoIG9iamVjdCApIHtcblxuXHR2YXIgYm9uZUxpc3QgPSBbXTtcblxuXHRpZiAoIG9iamVjdCAmJiBvYmplY3QuaXNCb25lICkge1xuXG5cdFx0Ym9uZUxpc3QucHVzaCggb2JqZWN0ICk7XG5cblx0fVxuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IG9iamVjdC5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRib25lTGlzdC5wdXNoLmFwcGx5KCBib25lTGlzdCwgZ2V0Qm9uZUxpc3QoIG9iamVjdC5jaGlsZHJlblsgaSBdICkgKTtcblxuXHR9XG5cblx0cmV0dXJuIGJvbmVMaXN0O1xuXG59XG5cbmZ1bmN0aW9uIFNrZWxldG9uSGVscGVyKCBvYmplY3QgKSB7XG5cblx0dmFyIGJvbmVzID0gZ2V0Qm9uZUxpc3QoIG9iamVjdCApO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgY29sb3JzID0gW107XG5cblx0dmFyIGNvbG9yMSA9IG5ldyBDb2xvciggMCwgMCwgMSApO1xuXHR2YXIgY29sb3IyID0gbmV3IENvbG9yKCAwLCAxLCAwICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYm9uZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0dmFyIGJvbmUgPSBib25lc1sgaSBdO1xuXG5cdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvcjEuciwgY29sb3IxLmcsIGNvbG9yMS5iICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzLCBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdyaXRlOiBmYWxzZSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnJvb3QgPSBvYmplY3Q7XG5cdHRoaXMuYm9uZXMgPSBib25lcztcblxuXHR0aGlzLm1hdHJpeCA9IG9iamVjdC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2tlbGV0b25IZWxwZXI7XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgYm9uZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHZhciBtYXRyaXhXb3JsZEludiA9IG5ldyBNYXRyaXg0KCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdHZhciBib25lcyA9IHRoaXMuYm9uZXM7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXG5cdFx0bWF0cml4V29ybGRJbnYuZ2V0SW52ZXJzZSggdGhpcy5yb290Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgYm9uZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgYm9uZSA9IGJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xuXG5cdFx0XHRcdGJvbmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4V29ybGRJbnYsIGJvbmUubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggYm9uZU1hdHJpeCApO1xuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGosIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHRib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeFdvcmxkSW52LCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBib25lTWF0cml4ICk7XG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaiArIDEsIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHRqICs9IDI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdH07XG5cbn0oKTtcblxuZXhwb3J0IHsgU2tlbGV0b25IZWxwZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL29iamVjdHMvTWVzaC5qcyc7XG5pbXBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBTcGhlcmVCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2dlb21ldHJpZXMvU3BoZXJlR2VvbWV0cnkuanMnO1xuXG5mdW5jdGlvbiBQb2ludExpZ2h0SGVscGVyKCBsaWdodCwgc3BoZXJlU2l6ZSwgY29sb3IgKSB7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5jb2xvciA9IGNvbG9yO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBTcGhlcmVCdWZmZXJHZW9tZXRyeSggc3BoZXJlU2l6ZSwgNCwgMiApO1xuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlIH0gKTtcblxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMubWF0cml4ID0gdGhpcy5saWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy51cGRhdGUoKTtcblxuXG5cdC8qXG5cdHZhciBkaXN0YW5jZUdlb21ldHJ5ID0gbmV3IFRIUkVFLkljb3NhaGVkcm9uR2VvbWV0cnkoIDEsIDIgKTtcblx0dmFyIGRpc3RhbmNlTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleENvbG9yLCBmb2c6IGZhbHNlLCB3aXJlZnJhbWU6IHRydWUsIG9wYWNpdHk6IDAuMSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xuXG5cdHRoaXMubGlnaHRTcGhlcmUgPSBuZXcgVEhSRUUuTWVzaCggYnVsYkdlb21ldHJ5LCBidWxiTWF0ZXJpYWwgKTtcblx0dGhpcy5saWdodERpc3RhbmNlID0gbmV3IFRIUkVFLk1lc2goIGRpc3RhbmNlR2VvbWV0cnksIGRpc3RhbmNlTWF0ZXJpYWwgKTtcblxuXHR2YXIgZCA9IGxpZ2h0LmRpc3RhbmNlO1xuXG5cdGlmICggZCA9PT0gMC4wICkge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xuXG5cdH1cblxuXHR0aGlzLmFkZCggdGhpcy5saWdodERpc3RhbmNlICk7XG5cdCovXG5cbn1cblxuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApO1xuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludExpZ2h0SGVscGVyO1xuXG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dGhpcy5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cblx0fVxuXG5cdC8qXG5cdHZhciBkID0gdGhpcy5saWdodC5kaXN0YW5jZTtcblxuXHRpZiAoIGQgPT09IDAuMCApIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gZmFsc2U7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gdHJ1ZTtcblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7XG5cblx0fVxuXHQqL1xuXG59O1xuXG5cbmV4cG9ydCB7IFBvaW50TGlnaHRIZWxwZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBhYmVsbmF0aW9uIC8gaHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvblxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcbmltcG9ydCB7IExpbmUgfSBmcm9tICcuLi9vYmplY3RzL0xpbmUuanMnO1xuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcblxuZnVuY3Rpb24gUmVjdEFyZWFMaWdodEhlbHBlciggbGlnaHQsIGNvbG9yICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UgfSApO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggNSAqIDMgKSwgMyApICk7XG5cblx0dGhpcy5saW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXHR0aGlzLmFkZCggdGhpcy5saW5lICk7XG5cblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlY3RBcmVhTGlnaHRIZWxwZXI7XG5cblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdC8vIGNhbGN1bGF0ZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgaGVscGVyXG5cblx0dmFyIGh4ID0gdGhpcy5saWdodC53aWR0aCAqIDAuNTtcblx0dmFyIGh5ID0gdGhpcy5saWdodC5oZWlnaHQgKiAwLjU7XG5cblx0dmFyIHBvc2l0aW9uID0gdGhpcy5saW5lLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdHZhciBhcnJheSA9IHBvc2l0aW9uLmFycmF5O1xuXG5cdC8vIHVwZGF0ZSB2ZXJ0aWNlc1xuXG5cdGFycmF5WyAwIF0gPSBoeDsgYXJyYXlbIDEgXSA9IC0gaHk7IGFycmF5WyAyIF0gPSAwO1xuXHRhcnJheVsgMyBdID0gaHg7IGFycmF5WyA0IF0gPSBoeTsgYXJyYXlbIDUgXSA9IDA7XG5cdGFycmF5WyA2IF0gPSAtIGh4OyBhcnJheVsgNyBdID0gaHk7IGFycmF5WyA4IF0gPSAwO1xuXHRhcnJheVsgOSBdID0gLSBoeDsgYXJyYXlbIDEwIF0gPSAtIGh5OyBhcnJheVsgMTEgXSA9IDA7XG5cdGFycmF5WyAxMiBdID0gaHg7IGFycmF5WyAxMyBdID0gLSBoeTsgYXJyYXlbIDE0IF0gPSAwO1xuXG5cdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHR9XG5cbn07XG5cbmV4cG9ydCB7IFJlY3RBcmVhTGlnaHRIZWxwZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vb2JqZWN0cy9NZXNoLmpzJztcbmltcG9ydCB7IFZlcnRleENvbG9ycyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9nZW9tZXRyaWVzL09jdGFoZWRyb25HZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5cbmZ1bmN0aW9uIEhlbWlzcGhlcmVMaWdodEhlbHBlciggbGlnaHQsIHNpemUsIGNvbG9yICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggc2l6ZSApO1xuXHRnZW9tZXRyeS5yb3RhdGVZKCBNYXRoLlBJICogMC41ICk7XG5cblx0dGhpcy5tYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyB3aXJlZnJhbWU6IHRydWUsIGZvZzogZmFsc2UgfSApO1xuXHRpZiAoIHRoaXMuY29sb3IgPT09IHVuZGVmaW5lZCApIHRoaXMubWF0ZXJpYWwudmVydGV4Q29sb3JzID0gVmVydGV4Q29sb3JzO1xuXG5cdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXHR2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb24uY291bnQgKiAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHRoaXMuYWRkKCBuZXcgTWVzaCggZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEhlbWlzcGhlcmVMaWdodEhlbHBlcjtcblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuY2hpbGRyZW5bIDAgXS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cbkhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBjb2xvcjEgPSBuZXcgQ29sb3IoKTtcblx0dmFyIGNvbG9yMiA9IG5ldyBDb2xvcigpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR2YXIgbWVzaCA9IHRoaXMuY2hpbGRyZW5bIDAgXTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGNvbG9ycyA9IG1lc2guZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAnY29sb3InICk7XG5cblx0XHRcdGNvbG9yMS5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cdFx0XHRjb2xvcjIuY29weSggdGhpcy5saWdodC5ncm91bmRDb2xvciApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjb2xvcnMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBjb2xvciA9ICggaSA8ICggbCAvIDIgKSApID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0XHRcdGNvbG9ycy5zZXRYWVooIGksIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb2xvcnMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0bWVzaC5sb29rQXQoIHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKS5uZWdhdGUoKSApO1xuXG5cdH07XG5cbn0oKTtcblxuXG5leHBvcnQgeyBIZW1pc3BoZXJlTGlnaHRIZWxwZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5pbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XG5pbXBvcnQgeyBWZXJ0ZXhDb2xvcnMgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xuXG5mdW5jdGlvbiBHcmlkSGVscGVyKCBzaXplLCBkaXZpc2lvbnMsIGNvbG9yMSwgY29sb3IyICkge1xuXG5cdHNpemUgPSBzaXplIHx8IDEwO1xuXHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgMTA7XG5cdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICE9PSB1bmRlZmluZWQgPyBjb2xvcjEgOiAweDQ0NDQ0NCApO1xuXHRjb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTtcblxuXHR2YXIgY2VudGVyID0gZGl2aXNpb25zIC8gMjtcblx0dmFyIHN0ZXAgPSBzaXplIC8gZGl2aXNpb25zO1xuXHR2YXIgaGFsZlNpemUgPSBzaXplIC8gMjtcblxuXHR2YXIgdmVydGljZXMgPSBbXSwgY29sb3JzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBqID0gMCwgayA9IC0gaGFsZlNpemU7IGkgPD0gZGl2aXNpb25zOyBpICsrLCBrICs9IHN0ZXAgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAtIGhhbGZTaXplLCAwLCBrLCBoYWxmU2l6ZSwgMCwgayApO1xuXHRcdHZlcnRpY2VzLnB1c2goIGssIDAsIC0gaGFsZlNpemUsIGssIDAsIGhhbGZTaXplICk7XG5cblx0XHR2YXIgY29sb3IgPSBpID09PSBjZW50ZXIgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXG5cdH1cblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbkdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuR3JpZEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBHcmlkSGVscGVyO1xuXG5leHBvcnQgeyBHcmlkSGVscGVyIH07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIEhlY3RhdGUgLyBodHRwOi8vd3d3LmdpdGh1Yi5jb20vSGVjdGF0ZVxuICovXG5cbmltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcbmltcG9ydCB7IFZlcnRleENvbG9ycyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XG5cbmZ1bmN0aW9uIFBvbGFyR3JpZEhlbHBlciggcmFkaXVzLCByYWRpYWxzLCBjaXJjbGVzLCBkaXZpc2lvbnMsIGNvbG9yMSwgY29sb3IyICkge1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxMDtcblx0cmFkaWFscyA9IHJhZGlhbHMgfHwgMTY7XG5cdGNpcmNsZXMgPSBjaXJjbGVzIHx8IDg7XG5cdGRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCA2NDtcblx0Y29sb3IxID0gbmV3IENvbG9yKCBjb2xvcjEgIT09IHVuZGVmaW5lZCA/IGNvbG9yMSA6IDB4NDQ0NDQ0ICk7XG5cdGNvbG9yMiA9IG5ldyBDb2xvciggY29sb3IyICE9PSB1bmRlZmluZWQgPyBjb2xvcjIgOiAweDg4ODg4OCApO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgY29sb3JzID0gW107XG5cblx0dmFyIHgsIHo7XG5cdHZhciB2LCBpLCBqLCByLCBjb2xvcjtcblxuXHQvLyBjcmVhdGUgdGhlIHJhZGlhbHNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSByYWRpYWxzOyBpICsrICkge1xuXG5cdFx0diA9ICggaSAvIHJhZGlhbHMgKSAqICggTWF0aC5QSSAqIDIgKTtcblxuXHRcdHggPSBNYXRoLnNpbiggdiApICogcmFkaXVzO1xuXHRcdHogPSBNYXRoLmNvcyggdiApICogcmFkaXVzO1xuXG5cdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblxuXHRcdGNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdH1cblxuXHQvLyBjcmVhdGUgdGhlIGNpcmNsZXNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSBjaXJjbGVzOyBpICsrICkge1xuXG5cdFx0Y29sb3IgPSAoIGkgJiAxICkgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRyID0gcmFkaXVzIC0gKCByYWRpdXMgLyBjaXJjbGVzICogaSApO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPCBkaXZpc2lvbnM7IGogKysgKSB7XG5cblx0XHRcdC8vIGZpcnN0IHZlcnRleFxuXG5cdFx0XHR2ID0gKCBqIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHRcdHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdHogPSBNYXRoLmNvcyggdiApICogcjtcblxuXHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdFx0Ly8gc2Vjb25kIHZlcnRleFxuXG5cdFx0XHR2ID0gKCAoIGogKyAxICkgLyBkaXZpc2lvbnMgKSAqICggTWF0aC5QSSAqIDIgKTtcblxuXHRcdFx0eCA9IE1hdGguc2luKCB2ICkgKiByO1xuXHRcdFx0eiA9IE1hdGguY29zKCB2ICkgKiByO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cblBvbGFyR3JpZEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Qb2xhckdyaWRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9sYXJHcmlkSGVscGVyO1xuXG5leHBvcnQgeyBQb2xhckdyaWRIZWxwZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuLi9tYXRoL01hdHJpeDMuanMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XG5pbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcblxuZnVuY3Rpb24gRmFjZU5vcm1hbHNIZWxwZXIoIG9iamVjdCwgc2l6ZSwgaGV4LCBsaW5ld2lkdGggKSB7XG5cblx0Ly8gRmFjZU5vcm1hbHNIZWxwZXIgb25seSBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeVxuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdHRoaXMuc2l6ZSA9ICggc2l6ZSAhPT0gdW5kZWZpbmVkICkgPyBzaXplIDogMTtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDtcblxuXHR2YXIgd2lkdGggPSAoIGxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyBsaW5ld2lkdGggOiAxO1xuXG5cdC8vXG5cblx0dmFyIG5Ob3JtYWxzID0gMDtcblxuXHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmZhY2VzLmxlbmd0aDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3VwcG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4nICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7XG5cblx0Ly9cblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGYWNlTm9ybWFsc0hlbHBlcjtcblxuRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gb2JqR2VvbWV0cnkudmVydGljZXM7XG5cblx0XHR2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlcztcblxuXHRcdHZhciBpZHggPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gZmFjZS5ub3JtYWw7XG5cblx0XHRcdHYxLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmEgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmIgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmMgXSApXG5cdFx0XHRcdC5kaXZpZGVTY2FsYXIoIDMgKVxuXHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2Mi5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHR9XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpICk7XG5cblxuZXhwb3J0IHsgRmFjZU5vcm1hbHNIZWxwZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5pbXBvcnQgeyBMaW5lIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lLmpzJztcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbXG5cdFx0LSBzaXplLCBzaXplLCAwLFxuXHRcdHNpemUsIHNpemUsIDAsXG5cdFx0c2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgc2l6ZSwgMFxuXHRdLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dGhpcy5saWdodFBsYW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXHR0aGlzLmFkZCggdGhpcy5saWdodFBsYW5lICk7XG5cblx0Z2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAwLCAxIF0sIDMgKSApO1xuXG5cdHRoaXMudGFyZ2V0TGluZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0dGhpcy5hZGQoIHRoaXMudGFyZ2V0TGluZSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGlyZWN0aW9uYWxMaWdodEhlbHBlcjtcblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHR0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdHYzLnN1YlZlY3RvcnMoIHYyLCB2MSApO1xuXG5cdFx0dGhpcy5saWdodFBsYW5lLmxvb2tBdCggdjMgKTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cdFx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXHRcdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudGFyZ2V0TGluZS5sb29rQXQoIHYzICk7XG5cdFx0dGhpcy50YXJnZXRMaW5lLnNjYWxlLnogPSB2My5sZW5ndGgoKTtcblxuXHR9O1xuXG59KCk7XG5cblxuZXhwb3J0IHsgRGlyZWN0aW9uYWxMaWdodEhlbHBlciB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKlx0LSBzaG93cyBmcnVzdHVtLCBsaW5lIG9mIHNpZ2h0IGFuZCB1cCBvZiB0aGUgY2FtZXJhXG4gKlx0LSBzdWl0YWJsZSBmb3IgZmFzdCB1cGRhdGVzXG4gKiBcdC0gYmFzZWQgb24gZnJ1c3R1bSB2aXN1YWxpemF0aW9uIGluIGxpZ2h0Z2wuanMgc2hhZG93bWFwIGV4YW1wbGVcbiAqXHRcdGh0dHA6Ly9ldmFudy5naXRodWIuY29tL2xpZ2h0Z2wuanMvdGVzdHMvc2hhZG93bWFwLmh0bWxcbiAqL1xuXG5pbXBvcnQgeyBDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL0NhbWVyYS5qcyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XG5pbXBvcnQgeyBGYWNlQ29sb3JzIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuXG5mdW5jdGlvbiBDYW1lcmFIZWxwZXIoIGNhbWVyYSApIHtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiwgdmVydGV4Q29sb3JzOiBGYWNlQ29sb3JzIH0gKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciBwb2ludE1hcCA9IHt9O1xuXG5cdC8vIGNvbG9yc1xuXG5cdHZhciBjb2xvckZydXN0dW0gPSBuZXcgQ29sb3IoIDB4ZmZhYTAwICk7XG5cdHZhciBjb2xvckNvbmUgPSBuZXcgQ29sb3IoIDB4ZmYwMDAwICk7XG5cdHZhciBjb2xvclVwID0gbmV3IENvbG9yKCAweDAwYWFmZiApO1xuXHR2YXIgY29sb3JUYXJnZXQgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cdHZhciBjb2xvckNyb3NzID0gbmV3IENvbG9yKCAweDMzMzMzMyApO1xuXG5cdC8vIG5lYXJcblxuXHRhZGRMaW5lKCAnbjEnLCAnbjInLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24yJywgJ240JywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduNCcsICduMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjMnLCAnbjEnLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBmYXJcblxuXHRhZGRMaW5lKCAnZjEnLCAnZjInLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ2YyJywgJ2Y0JywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICdmNCcsICdmMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnZjMnLCAnZjEnLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBzaWRlc1xuXG5cdGFkZExpbmUoICduMScsICdmMScsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjInLCAnZjInLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24zJywgJ2YzJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduNCcsICdmNCcsIGNvbG9yRnJ1c3R1bSApO1xuXG5cdC8vIGNvbmVcblxuXHRhZGRMaW5lKCAncCcsICduMScsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCAncCcsICduMicsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCAncCcsICduMycsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCAncCcsICduNCcsIGNvbG9yQ29uZSApO1xuXG5cdC8vIHVwXG5cblx0YWRkTGluZSggJ3UxJywgJ3UyJywgY29sb3JVcCApO1xuXHRhZGRMaW5lKCAndTInLCAndTMnLCBjb2xvclVwICk7XG5cdGFkZExpbmUoICd1MycsICd1MScsIGNvbG9yVXAgKTtcblxuXHQvLyB0YXJnZXRcblxuXHRhZGRMaW5lKCAnYycsICd0JywgY29sb3JUYXJnZXQgKTtcblx0YWRkTGluZSggJ3AnLCAnYycsIGNvbG9yQ3Jvc3MgKTtcblxuXHQvLyBjcm9zc1xuXG5cdGFkZExpbmUoICdjbjEnLCAnY24yJywgY29sb3JDcm9zcyApO1xuXHRhZGRMaW5lKCAnY24zJywgJ2NuNCcsIGNvbG9yQ3Jvc3MgKTtcblxuXHRhZGRMaW5lKCAnY2YxJywgJ2NmMicsIGNvbG9yQ3Jvc3MgKTtcblx0YWRkTGluZSggJ2NmMycsICdjZjQnLCBjb2xvckNyb3NzICk7XG5cblx0ZnVuY3Rpb24gYWRkTGluZSggYSwgYiwgY29sb3IgKSB7XG5cblx0XHRhZGRQb2ludCggYSwgY29sb3IgKTtcblx0XHRhZGRQb2ludCggYiwgY29sb3IgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gYWRkUG9pbnQoIGlkLCBjb2xvciApIHtcblxuXHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0aWYgKCBwb2ludE1hcFsgaWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwb2ludE1hcFsgaWQgXSA9IFtdO1xuXG5cdFx0fVxuXG5cdFx0cG9pbnRNYXBbIGlkIF0ucHVzaCggKCB2ZXJ0aWNlcy5sZW5ndGggLyAzICkgLSAxICk7XG5cblx0fVxuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cdGlmICggdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCApIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5wb2ludE1hcCA9IHBvaW50TWFwO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuQ2FtZXJhSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkNhbWVyYUhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYW1lcmFIZWxwZXI7XG5cbkNhbWVyYUhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBnZW9tZXRyeSwgcG9pbnRNYXA7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBjYW1lcmEgPSBuZXcgQ2FtZXJhKCk7XG5cblx0ZnVuY3Rpb24gc2V0UG9pbnQoIHBvaW50LCB4LCB5LCB6ICkge1xuXG5cdFx0dmVjdG9yLnNldCggeCwgeSwgeiApLnVucHJvamVjdCggY2FtZXJhICk7XG5cblx0XHR2YXIgcG9pbnRzID0gcG9pbnRNYXBbIHBvaW50IF07XG5cblx0XHRpZiAoIHBvaW50cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBwb2ludHNbIGkgXSwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHRnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0cG9pbnRNYXAgPSB0aGlzLnBvaW50TWFwO1xuXG5cdFx0dmFyIHcgPSAxLCBoID0gMTtcblxuXHRcdC8vIHdlIG5lZWQganVzdCBjYW1lcmEgcHJvamVjdGlvbiBtYXRyaXhcblx0XHQvLyB3b3JsZCBtYXRyaXggbXVzdCBiZSBpZGVudGl0eVxuXG5cdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weSggdGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0Ly8gY2VudGVyIC8gdGFyZ2V0XG5cblx0XHRzZXRQb2ludCggJ2MnLCAwLCAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ3QnLCAwLCAwLCAxICk7XG5cblx0XHQvLyBuZWFyXG5cblx0XHRzZXRQb2ludCggJ24xJywgLSB3LCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnbjInLCB3LCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnbjMnLCAtIHcsIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnbjQnLCB3LCBoLCAtIDEgKTtcblxuXHRcdC8vIGZhclxuXG5cdFx0c2V0UG9pbnQoICdmMScsIC0gdywgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmMicsIHcsIC0gaCwgMSApO1xuXHRcdHNldFBvaW50KCAnZjMnLCAtIHcsIGgsIDEgKTtcblx0XHRzZXRQb2ludCggJ2Y0JywgdywgaCwgMSApO1xuXG5cdFx0Ly8gdXBcblxuXHRcdHNldFBvaW50KCAndTEnLCB3ICogMC43LCBoICogMS4xLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ3UyJywgLSB3ICogMC43LCBoICogMS4xLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ3UzJywgMCwgaCAqIDIsIC0gMSApO1xuXG5cdFx0Ly8gY3Jvc3NcblxuXHRcdHNldFBvaW50KCAnY2YxJywgLSB3LCAwLCAxICk7XG5cdFx0c2V0UG9pbnQoICdjZjInLCB3LCAwLCAxICk7XG5cdFx0c2V0UG9pbnQoICdjZjMnLCAwLCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggJ2NmNCcsIDAsIGgsIDEgKTtcblxuXHRcdHNldFBvaW50KCAnY24xJywgLSB3LCAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ2NuMicsIHcsIDAsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnY24zJywgMCwgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ2NuNCcsIDAsIGgsIC0gMSApO1xuXG5cdFx0Z2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH07XG5cbn0oKTtcblxuXG5leHBvcnQgeyBDYW1lcmFIZWxwZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5pbXBvcnQgeyBCb3gzIH0gZnJvbSAnLi4vbWF0aC9Cb3gzLmpzJztcbmltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcbmltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XG5cbmZ1bmN0aW9uIEJveEhlbHBlciggb2JqZWN0LCBjb2xvciApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblxuXHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSBjb2xvciA9IDB4ZmZmZjAwO1xuXG5cdHZhciBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDAsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDQsIDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgXSApO1xuXHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheSggOCAqIDMgKTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApO1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuQm94SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkJveEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hIZWxwZXI7XG5cbkJveEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuJyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRib3guc2V0RnJvbU9iamVjdCggdGhpcy5vYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYm94LmlzRW1wdHkoKSApIHJldHVybjtcblxuXHRcdHZhciBtaW4gPSBib3gubWluO1xuXHRcdHZhciBtYXggPSBib3gubWF4O1xuXG5cdFx0Lypcblx0XHQgIDVfX19fNFxuXHRcdDEvX19fMC98XG5cdFx0fCA2X198Xzdcblx0XHQyL19fXzMvXG5cblx0XHQwOiBtYXgueCwgbWF4LnksIG1heC56XG5cdFx0MTogbWluLngsIG1heC55LCBtYXguelxuXHRcdDI6IG1pbi54LCBtaW4ueSwgbWF4Lnpcblx0XHQzOiBtYXgueCwgbWluLnksIG1heC56XG5cdFx0NDogbWF4LngsIG1heC55LCBtaW4uelxuXHRcdDU6IG1pbi54LCBtYXgueSwgbWluLnpcblx0XHQ2OiBtaW4ueCwgbWluLnksIG1pbi56XG5cdFx0NzogbWF4LngsIG1pbi55LCBtaW4uelxuXHRcdCovXG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0dmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7XG5cblx0XHRhcnJheVsgMCBdID0gbWF4Lng7IGFycmF5WyAxIF0gPSBtYXgueTsgYXJyYXlbIDIgXSA9IG1heC56O1xuXHRcdGFycmF5WyAzIF0gPSBtaW4ueDsgYXJyYXlbIDQgXSA9IG1heC55OyBhcnJheVsgNSBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDYgXSA9IG1pbi54OyBhcnJheVsgNyBdID0gbWluLnk7IGFycmF5WyA4IF0gPSBtYXguejtcblx0XHRhcnJheVsgOSBdID0gbWF4Lng7IGFycmF5WyAxMCBdID0gbWluLnk7IGFycmF5WyAxMSBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDEyIF0gPSBtYXgueDsgYXJyYXlbIDEzIF0gPSBtYXgueTsgYXJyYXlbIDE0IF0gPSBtaW4uejtcblx0XHRhcnJheVsgMTUgXSA9IG1pbi54OyBhcnJheVsgMTYgXSA9IG1heC55OyBhcnJheVsgMTcgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAxOCBdID0gbWluLng7IGFycmF5WyAxOSBdID0gbWluLnk7IGFycmF5WyAyMCBdID0gbWluLno7XG5cdFx0YXJyYXlbIDIxIF0gPSBtYXgueDsgYXJyYXlbIDIyIF0gPSBtaW4ueTsgYXJyYXlbIDIzIF0gPSBtaW4uejtcblxuXHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0fTtcblxufSApKCk7XG5cbkJveEhlbHBlci5wcm90b3R5cGUuc2V0RnJvbU9iamVjdCA9IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXHR0aGlzLnVwZGF0ZSgpO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbmV4cG9ydCB7IEJveEhlbHBlciB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5pbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5cbmZ1bmN0aW9uIEJveDNIZWxwZXIoIGJveCwgaGV4ICkge1xuXG5cdHRoaXMudHlwZSA9ICdCb3gzSGVscGVyJztcblxuXHR0aGlzLmJveCA9IGJveDtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDtcblxuXHR2YXIgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSggWyAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA0LCAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IF0gKTtcblxuXHR2YXIgcG9zaXRpb25zID0gWyAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAtIDEsIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAtIDEsIC0gMSwgLSAxLCAtIDEsIDEsIC0gMSwgLSAxIF07XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEgKSApO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApO1xuXG5cdHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cbn1cblxuQm94M0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Cb3gzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveDNIZWxwZXI7XG5cbkJveDNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkID0gZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHR2YXIgYm94ID0gdGhpcy5ib3g7XG5cblx0aWYgKCBib3guaXNFbXB0eSgpICkgcmV0dXJuO1xuXG5cdGJveC5nZXRDZW50ZXIoIHRoaXMucG9zaXRpb24gKTtcblxuXHRib3guZ2V0U2l6ZSggdGhpcy5zY2FsZSApO1xuXG5cdHRoaXMuc2NhbGUubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG59O1xuXG5leHBvcnQgeyBCb3gzSGVscGVyIH07XG4iLCIvKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmltcG9ydCB7IExpbmUgfSBmcm9tICcuLi9vYmplY3RzL0xpbmUuanMnO1xuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL29iamVjdHMvTWVzaC5qcyc7XG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XG5pbXBvcnQgeyBGcm9udFNpZGUsIEJhY2tTaWRlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcblxuZnVuY3Rpb24gUGxhbmVIZWxwZXIoIHBsYW5lLCBzaXplLCBoZXggKSB7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lSGVscGVyJztcblxuXHR0aGlzLnBsYW5lID0gcGxhbmU7XG5cblx0dGhpcy5zaXplID0gKCBzaXplID09PSB1bmRlZmluZWQgKSA/IDEgOiBzaXplO1xuXG5cdHZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmluZWQgKSA/IGhleCA6IDB4ZmZmZjAwO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBbIDEsIC0gMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAwLCAwLCAwIF07XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cblx0Ly9cblxuXHR2YXIgcG9zaXRpb25zMiA9IFsgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIC0gMSwgMSBdO1xuXG5cdHZhciBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkyLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uczIsIDMgKSApO1xuXHRnZW9tZXRyeTIuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIG9wYWNpdHk6IDAuMiwgdHJhbnNwYXJlbnQ6IHRydWUsIGRlcHRoV3JpdGU6IGZhbHNlIH0gKSApICk7XG5cbn1cblxuUGxhbmVIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZS5wcm90b3R5cGUgKTtcblBsYW5lSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBsYW5lSGVscGVyO1xuXG5QbGFuZUhlbHBlci5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQgPSBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdHZhciBzY2FsZSA9IC0gdGhpcy5wbGFuZS5jb25zdGFudDtcblxuXHRpZiAoIE1hdGguYWJzKCBzY2FsZSApIDwgMWUtOCApIHNjYWxlID0gMWUtODsgLy8gc2lnbiBkb2VzIG5vdCBtYXR0ZXJcblxuXHR0aGlzLnNjYWxlLnNldCggMC41ICogdGhpcy5zaXplLCAwLjUgKiB0aGlzLnNpemUsIHNjYWxlICk7XG5cblx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLnNpZGUgPSAoIHNjYWxlIDwgMCApID8gQmFja1NpZGUgOiBGcm9udFNpZGU7IC8vIHJlbmRlcmVyIGZsaXBzIHNpZGUgd2hlbiBkZXRlcm1pbmFudCA8IDA7IGZsaXBwaW5nIG5vdCB3YW50ZWQgaGVyZVxuXG5cdHRoaXMubG9va0F0KCB0aGlzLnBsYW5lLm5vcm1hbCApO1xuXG5cdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG59O1xuXG5leHBvcnQgeyBQbGFuZUhlbHBlciB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqXG4gKiBDcmVhdGVzIGFuIGFycm93IGZvciB2aXN1YWxpemluZyBkaXJlY3Rpb25zXG4gKlxuICogUGFyYW1ldGVyczpcbiAqICBkaXIgLSBWZWN0b3IzXG4gKiAgb3JpZ2luIC0gVmVjdG9yM1xuICogIGxlbmd0aCAtIE51bWJlclxuICogIGNvbG9yIC0gY29sb3IgaW4gaGV4IHZhbHVlXG4gKiAgaGVhZExlbmd0aCAtIE51bWJlclxuICogIGhlYWRXaWR0aCAtIE51bWJlclxuICovXG5cbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcbmltcG9ydCB7IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9nZW9tZXRyaWVzL0N5bGluZGVyR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTWVzaEJhc2ljTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL29iamVjdHMvTWVzaC5qcyc7XG5pbXBvcnQgeyBMaW5lIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lLmpzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xuXG52YXIgbGluZUdlb21ldHJ5LCBjb25lR2VvbWV0cnk7XG5cbmZ1bmN0aW9uIEFycm93SGVscGVyKCBkaXIsIG9yaWdpbiwgbGVuZ3RoLCBjb2xvciwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkge1xuXG5cdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSAweGZmZmYwMDtcblx0aWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIGxlbmd0aCA9IDE7XG5cdGlmICggaGVhZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0aCA9IDAuMiAqIGxlbmd0aDtcblx0aWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7XG5cblx0aWYgKCBsaW5lR2VvbWV0cnkgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGxpbmVHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRcdGxpbmVHZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAsIDEsIDAgXSwgMyApICk7XG5cblx0XHRjb25lR2VvbWV0cnkgPSBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggMCwgMC41LCAxLCA1LCAxICk7XG5cdFx0Y29uZUdlb21ldHJ5LnRyYW5zbGF0ZSggMCwgLSAwLjUsIDAgKTtcblxuXHR9XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBvcmlnaW4gKTtcblxuXHR0aGlzLmxpbmUgPSBuZXcgTGluZSggbGluZUdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApO1xuXHR0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmFkZCggdGhpcy5saW5lICk7XG5cblx0dGhpcy5jb25lID0gbmV3IE1lc2goIGNvbmVHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblx0dGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdHRoaXMuc2V0RGlyZWN0aW9uKCBkaXIgKTtcblx0dGhpcy5zZXRMZW5ndGgoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7XG5cbn1cblxuQXJyb3dIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5BcnJvd0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcnJvd0hlbHBlcjtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldERpcmVjdGlvbiA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciBheGlzID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHJhZGlhbnM7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHNldERpcmVjdGlvbiggZGlyICkge1xuXG5cdFx0Ly8gZGlyIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0aWYgKCBkaXIueSA+IDAuOTk5OTkgKSB7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXQoIDAsIDAsIDAsIDEgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGRpci55IDwgLSAwLjk5OTk5ICkge1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAxLCAwLCAwLCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRheGlzLnNldCggZGlyLnosIDAsIC0gZGlyLnggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0cmFkaWFucyA9IE1hdGguYWNvcyggZGlyLnkgKTtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIHJhZGlhbnMgKTtcblxuXHRcdH1cblxuXHR9O1xuXG59KCkgKTtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldExlbmd0aCA9IGZ1bmN0aW9uICggbGVuZ3RoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKSB7XG5cblx0aWYgKCBoZWFkTGVuZ3RoID09PSB1bmRlZmluZWQgKSBoZWFkTGVuZ3RoID0gMC4yICogbGVuZ3RoO1xuXHRpZiAoIGhlYWRXaWR0aCA9PT0gdW5kZWZpbmVkICkgaGVhZFdpZHRoID0gMC4yICogaGVhZExlbmd0aDtcblxuXHR0aGlzLmxpbmUuc2NhbGUuc2V0KCAxLCBNYXRoLm1heCggMCwgbGVuZ3RoIC0gaGVhZExlbmd0aCApLCAxICk7XG5cdHRoaXMubGluZS51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLmNvbmUuc2NhbGUuc2V0KCBoZWFkV2lkdGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xuXHR0aGlzLmNvbmUucG9zaXRpb24ueSA9IGxlbmd0aDtcblx0dGhpcy5jb25lLnVwZGF0ZU1hdHJpeCgpO1xuXG59O1xuXG5BcnJvd0hlbHBlci5wcm90b3R5cGUuc2V0Q29sb3IgPSBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdHRoaXMubGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KCBjb2xvciApO1xuXHR0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weSggY29sb3IgKTtcblxufTtcblxuXG5leHBvcnQgeyBBcnJvd0hlbHBlciB9O1xuIiwiLyoqXG4gKiBAYXV0aG9yIHNyb3VjaGVyYXkgLyBodHRwOi8vc3JvdWNoZXJheS5vcmcvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcbmltcG9ydCB7IFZlcnRleENvbG9ycyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcblxuZnVuY3Rpb24gQXhlc0hlbHBlciggc2l6ZSApIHtcblxuXHRzaXplID0gc2l6ZSB8fCAxO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQwLCAwLCAwLFx0c2l6ZSwgMCwgMCxcblx0XHQwLCAwLCAwLFx0MCwgc2l6ZSwgMCxcblx0XHQwLCAwLCAwLFx0MCwgMCwgc2l6ZVxuXHRdO1xuXG5cdHZhciBjb2xvcnMgPSBbXG5cdFx0MSwgMCwgMCxcdDEsIDAuNiwgMCxcblx0XHQwLCAxLCAwLFx0MC42LCAxLCAwLFxuXHRcdDAsIDAsIDEsXHQwLCAwLjYsIDFcblx0XTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbkF4ZXNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuQXhlc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBeGVzSGVscGVyO1xuXG5cbmV4cG9ydCB7IEF4ZXNIZWxwZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5pbXBvcnQgeyBBdWRpbyB9IGZyb20gJy4vYXVkaW8vQXVkaW8uanMnO1xuaW1wb3J0IHsgQXVkaW9BbmFseXNlciB9IGZyb20gJy4vYXVkaW8vQXVkaW9BbmFseXNlci5qcyc7XG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4vY2FtZXJhcy9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XG5pbXBvcnQgeyBGbGF0U2hhZGluZyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7XG5cdEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUsXG5cdEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUsXG5cdFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSxcblx0SW50MzJCdWZmZXJBdHRyaWJ1dGUsXG5cdFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSxcblx0SW50MTZCdWZmZXJBdHRyaWJ1dGUsXG5cdFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSxcblx0VWludDhCdWZmZXJBdHRyaWJ1dGUsXG5cdEludDhCdWZmZXJBdHRyaWJ1dGUsXG5cdEJ1ZmZlckF0dHJpYnV0ZVxufSBmcm9tICcuL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEZhY2UzIH0gZnJvbSAnLi9jb3JlL0ZhY2UzLmpzJztcbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnLi9jb3JlL0dlb21ldHJ5LmpzJztcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi9jb3JlL09iamVjdDNELmpzJztcbmltcG9ydCB7IFVuaWZvcm0gfSBmcm9tICcuL2NvcmUvVW5pZm9ybS5qcyc7XG5pbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4vZXh0cmFzL2NvcmUvQ3VydmUuanMnO1xuaW1wb3J0IHsgQ3VydmVQYXRoIH0gZnJvbSAnLi9leHRyYXMvY29yZS9DdXJ2ZVBhdGguanMnO1xuaW1wb3J0IHsgUGF0aCB9IGZyb20gJy4vZXh0cmFzL2NvcmUvUGF0aC5qcyc7XG5pbXBvcnQgeyBDYXRtdWxsUm9tQ3VydmUzIH0gZnJvbSAnLi9leHRyYXMvY3VydmVzL0NhdG11bGxSb21DdXJ2ZTMuanMnO1xuaW1wb3J0IHsgQXhlc0hlbHBlciB9IGZyb20gJy4vaGVscGVycy9BeGVzSGVscGVyLmpzJztcbmltcG9ydCB7IEJveEhlbHBlciB9IGZyb20gJy4vaGVscGVycy9Cb3hIZWxwZXIuanMnO1xuaW1wb3J0IHsgR3JpZEhlbHBlciB9IGZyb20gJy4vaGVscGVycy9HcmlkSGVscGVyLmpzJztcbmltcG9ydCB7IFNrZWxldG9uSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL1NrZWxldG9uSGVscGVyLmpzJztcbmltcG9ydCB7IEJveEdlb21ldHJ5IH0gZnJvbSAnLi9nZW9tZXRyaWVzL0JveEdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEVkZ2VzR2VvbWV0cnkgfSBmcm9tICcuL2dlb21ldHJpZXMvRWRnZXNHZW9tZXRyeS5qcyc7XG5pbXBvcnQgeyBFeHRydWRlR2VvbWV0cnkgfSBmcm9tICcuL2dlb21ldHJpZXMvRXh0cnVkZUdlb21ldHJ5LmpzJztcbmltcG9ydCB7IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4vZ2VvbWV0cmllcy9FeHRydWRlR2VvbWV0cnkuanMnO1xuaW1wb3J0IHsgU2hhcGVHZW9tZXRyeSB9IGZyb20gJy4vZ2VvbWV0cmllcy9TaGFwZUdlb21ldHJ5LmpzJztcbmltcG9ydCB7IFdpcmVmcmFtZUdlb21ldHJ5IH0gZnJvbSAnLi9nZW9tZXRyaWVzL1dpcmVmcmFtZUdlb21ldHJ5LmpzJztcbmltcG9ydCB7IExpZ2h0IH0gZnJvbSAnLi9saWdodHMvTGlnaHQuanMnO1xuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0xvYWRlci5qcyc7XG5pbXBvcnQgeyBMb2FkZXJVdGlscyB9IGZyb20gJy4vbG9hZGVycy9Mb2FkZXJVdGlscy5qcyc7XG5pbXBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0ZpbGVMb2FkZXIuanMnO1xuaW1wb3J0IHsgQXVkaW9Mb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvQXVkaW9Mb2FkZXIuanMnO1xuaW1wb3J0IHsgQ3ViZVRleHR1cmVMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvQ3ViZVRleHR1cmVMb2FkZXIuanMnO1xuaW1wb3J0IHsgRGF0YVRleHR1cmVMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvRGF0YVRleHR1cmVMb2FkZXIuanMnO1xuaW1wb3J0IHsgVGV4dHVyZUxvYWRlciB9IGZyb20gJy4vbG9hZGVycy9UZXh0dXJlTG9hZGVyLmpzJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9tYXRlcmlhbHMvTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBNZXNoUGhvbmdNYXRlcmlhbCB9IGZyb20gJy4vbWF0ZXJpYWxzL01lc2hQaG9uZ01hdGVyaWFsLmpzJztcbmltcG9ydCB7IFBvaW50c01hdGVyaWFsIH0gZnJvbSAnLi9tYXRlcmlhbHMvUG9pbnRzTWF0ZXJpYWwuanMnO1xuaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuL21hdGVyaWFscy9TaGFkZXJNYXRlcmlhbC5qcyc7XG5pbXBvcnQgeyBCb3gyIH0gZnJvbSAnLi9tYXRoL0JveDIuanMnO1xuaW1wb3J0IHsgQm94MyB9IGZyb20gJy4vbWF0aC9Cb3gzLmpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi9tYXRoL0NvbG9yLmpzJztcbmltcG9ydCB7IExpbmUzIH0gZnJvbSAnLi9tYXRoL0xpbmUzLmpzJztcbmltcG9ydCB7IF9NYXRoIH0gZnJvbSAnLi9tYXRoL01hdGguanMnO1xuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4vbWF0aC9NYXRyaXgzLmpzJztcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuL21hdGgvTWF0cml4NC5qcyc7XG5pbXBvcnQgeyBQbGFuZSB9IGZyb20gJy4vbWF0aC9QbGFuZS5qcyc7XG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi9tYXRoL1F1YXRlcm5pb24uanMnO1xuaW1wb3J0IHsgUmF5IH0gZnJvbSAnLi9tYXRoL1JheS5qcyc7XG5pbXBvcnQgeyBUcmlhbmdsZSB9IGZyb20gJy4vbWF0aC9UcmlhbmdsZS5qcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi9tYXRoL1ZlY3RvcjIuanMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vbWF0aC9WZWN0b3IzLmpzJztcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuL21hdGgvVmVjdG9yNC5qcyc7XG5pbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcbmltcG9ydCB7IExPRCB9IGZyb20gJy4vb2JqZWN0cy9MT0QuanMnO1xuaW1wb3J0IHsgUG9pbnRzIH0gZnJvbSAnLi9vYmplY3RzL1BvaW50cy5qcyc7XG5pbXBvcnQgeyBTcHJpdGUgfSBmcm9tICcuL29iamVjdHMvU3ByaXRlLmpzJztcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSAnLi9vYmplY3RzL1NrZWxldG9uLmpzJztcbmltcG9ydCB7IFdlYkdMUmVuZGVyZXIgfSBmcm9tICcuL3JlbmRlcmVycy9XZWJHTFJlbmRlcmVyLmpzJztcbmltcG9ydCB7IFdlYkdMUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9yZW5kZXJlcnMvV2ViR0xSZW5kZXJUYXJnZXQuanMnO1xuaW1wb3J0IHsgV2ViR0xTaGFkb3dNYXAgfSBmcm9tICcuL3JlbmRlcmVycy93ZWJnbC9XZWJHTFNoYWRvd01hcC5qcyc7XG5pbXBvcnQgeyBXZWJWUk1hbmFnZXIgfSBmcm9tICcuL3JlbmRlcmVycy93ZWJ2ci9XZWJWUk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgSW1hZ2VVdGlscyB9IGZyb20gJy4vZXh0cmFzL0ltYWdlVXRpbHMuanMnO1xuaW1wb3J0IHsgU2hhcGUgfSBmcm9tICcuL2V4dHJhcy9jb3JlL1NoYXBlLmpzJztcbmltcG9ydCB7IEN1YmVDYW1lcmEgfSBmcm9tICcuL2NhbWVyYXMvQ3ViZUNhbWVyYS5qcyc7XG5cbmV4cG9ydCB7IEJveEdlb21ldHJ5IGFzIEN1YmVHZW9tZXRyeSB9O1xuXG5leHBvcnQgZnVuY3Rpb24gRmFjZTQoIGEsIGIsIGMsIGQsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmFjZTQgaGFzIGJlZW4gcmVtb3ZlZC4gQSBUSFJFRS5GYWNlMyB3aWxsIGJlIGNyZWF0ZWQgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgRmFjZTMoIGEsIGIsIGMsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKTtcblxufVxuXG5leHBvcnQgdmFyIExpbmVTdHJpcCA9IDA7XG5cbmV4cG9ydCB2YXIgTGluZVBpZWNlcyA9IDE7XG5cbmV4cG9ydCBmdW5jdGlvbiBNZXNoRmFjZU1hdGVyaWFsKCBtYXRlcmlhbHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBtYXRlcmlhbHM7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE11bHRpTWF0ZXJpYWwoIG1hdGVyaWFscyApIHtcblxuXHRpZiAoIG1hdGVyaWFscyA9PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWxzID0gW107XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7XG5cdG1hdGVyaWFscy5pc011bHRpTWF0ZXJpYWwgPSB0cnVlO1xuXHRtYXRlcmlhbHMubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xuXHRtYXRlcmlhbHMuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWxzLnNsaWNlKCk7XG5cblx0fTtcblx0cmV0dXJuIG1hdGVyaWFscztcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gUG9pbnRDbG91ZCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFBhcnRpY2xlKCBtYXRlcmlhbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlNwcml0ZS4nICk7XG5cdHJldHVybiBuZXcgU3ByaXRlKCBtYXRlcmlhbCApO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQYXJ0aWNsZVN5c3RlbSggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlU3lzdGVtIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQb2ludENsb3VkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUG9pbnRDbG91ZE1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gUGFydGljbGVTeXN0ZW1NYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZVN5c3RlbU1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFZlcnRleCggeCwgeSwgeiApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZXJ0ZXggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLlZlY3RvcjMgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVmVjdG9yMyggeCwgeSwgeiApO1xuXG59XG5cbi8vXG5cbmV4cG9ydCBmdW5jdGlvbiBEeW5hbWljQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSgpLnNldER5bmFtaWMoIHRydWUgKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApLnNldER5bmFtaWMoIHRydWUgKTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gSW50OEF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQ4QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgSW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVpbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gVWludDhDbGFtcGVkQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDhDbGFtcGVkQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gSW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgSW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBVaW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJbnQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVpbnQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlVpbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZsb2F0MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGbG9hdDY0QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmxvYXQ2NEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBGbG9hdDY0QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG4vL1xuXG5DdXJ2ZS5jcmVhdGUgPSBmdW5jdGlvbiAoIGNvbnN0cnVjdCwgZ2V0UG9pbnQgKSB7XG5cblx0Y29uc29sZS5sb2coICdUSFJFRS5DdXJ2ZS5jcmVhdGUoKSBoYXMgYmVlbiBkZXByZWNhdGVkJyApO1xuXG5cdGNvbnN0cnVjdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblx0Y29uc3RydWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdDtcblx0Y29uc3RydWN0LnByb3RvdHlwZS5nZXRQb2ludCA9IGdldFBvaW50O1xuXG5cdHJldHVybiBjb25zdHJ1Y3Q7XG5cbn07XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEN1cnZlUGF0aC5wcm90b3R5cGUsIHtcblxuXHRjcmVhdGVQb2ludHNHZW9tZXRyeTogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLicgKTtcblxuXHRcdC8vIGdlbmVyYXRlIGdlb21ldHJ5IGZyb20gcGF0aCBwb2ludHMgKGZvciBMaW5lIG9yIFBvaW50cyBvYmplY3RzKVxuXG5cdFx0dmFyIHB0cyA9IHRoaXMuZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7XG5cblx0fSxcblxuXHRjcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeTogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLicgKTtcblxuXHRcdC8vIGdlbmVyYXRlIGdlb21ldHJ5IGZyb20gZXF1aWRpc3RhbnQgc2FtcGxpbmcgYWxvbmcgdGhlIHBhdGhcblxuXHRcdHZhciBwdHMgPSB0aGlzLmdldFNwYWNlZFBvaW50cyggZGl2aXNpb25zICk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoIHB0cyApO1xuXG5cdH0sXG5cblx0Y3JlYXRlR2VvbWV0cnk6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4nICk7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzLnB1c2goIG5ldyBWZWN0b3IzKCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJ5O1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBQYXRoLnByb3RvdHlwZSwge1xuXG5cdGZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuJyApO1xuXHRcdHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbmV4cG9ydCBmdW5jdGlvbiBDbG9zZWRTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5DbG9zZWRTcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXHR0aGlzLmNsb3NlZCA9IHRydWU7XG5cbn1cblxuQ2xvc2VkU3BsaW5lQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlICk7XG5cbi8vXG5cbmV4cG9ydCBmdW5jdGlvbiBTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXG59XG5cblNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG4vL1xuXG5leHBvcnQgZnVuY3Rpb24gU3BsaW5lKCBwb2ludHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BsaW5lIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuJyApO1xuXG5cdENhdG11bGxSb21DdXJ2ZTMuY2FsbCggdGhpcywgcG9pbnRzICk7XG5cdHRoaXMudHlwZSA9ICdjYXRtdWxscm9tJztcblxufVxuXG5TcGxpbmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgKTtcblxuT2JqZWN0LmFzc2lnbiggU3BsaW5lLnByb3RvdHlwZSwge1xuXG5cdGluaXRGcm9tQXJyYXk6IGZ1bmN0aW9uICggLyogYSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5pbml0RnJvbUFycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Z2V0Q29udHJvbFBvaW50c0FycmF5OiBmdW5jdGlvbiAoIC8qIG9wdGlvbmFsVGFyZ2V0ICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmdldENvbnRyb2xQb2ludHNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJlcGFyYW1ldHJpemVCeUFyY0xlbmd0aDogZnVuY3Rpb24gKCAvKiBzYW1wbGluZ0NvZWYgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAucmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbmV4cG9ydCBmdW5jdGlvbiBBeGlzSGVscGVyKCBzaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkF4aXNIZWxwZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5BeGVzSGVscGVyLicgKTtcblx0cmV0dXJuIG5ldyBBeGVzSGVscGVyKCBzaXplICk7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEJvdW5kaW5nQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJvdW5kaW5nQm94SGVscGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIENyZWF0aW5nIGEgVEhSRUUuQm94SGVscGVyIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEJveEhlbHBlciggb2JqZWN0LCBjb2xvciApO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBFZGdlc0hlbHBlciggb2JqZWN0LCBoZXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRWRnZXNIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkVkZ2VzR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBuZXcgRWRnZXNHZW9tZXRyeSggb2JqZWN0Lmdlb21ldHJ5ICksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4ICE9PSB1bmRlZmluZWQgPyBoZXggOiAweGZmZmZmZiB9ICkgKTtcblxufVxuXG5HcmlkSGVscGVyLnByb3RvdHlwZS5zZXRDb2xvcnMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdyaWRIZWxwZXI6IHNldENvbG9ycygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHBhc3MgdGhlbSBpbiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC4nICk7XG5cbn07XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLicgKTtcblxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIFdpcmVmcmFtZUhlbHBlciggb2JqZWN0LCBoZXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2lyZWZyYW1lSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5XaXJlZnJhbWVHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBXaXJlZnJhbWVHZW9tZXRyeSggb2JqZWN0Lmdlb21ldHJ5ICksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4ICE9PSB1bmRlZmluZWQgPyBoZXggOiAweGZmZmZmZiB9ICkgKTtcblxufVxuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0ZXh0cmFjdFVybEJhc2U6IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTG9hZGVyOiAuZXh0cmFjdFVybEJhc2UoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApO1xuXG5cdH1cblxufSApO1xuXG5leHBvcnQgZnVuY3Rpb24gWEhSTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuJyApO1xuXHRyZXR1cm4gbmV3IEZpbGVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gQmluYXJ5VGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CaW5hcnlUZXh0dXJlTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRGF0YVRleHR1cmVMb2FkZXIuJyApO1xuXHRyZXR1cm4gbmV3IERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICk7XG5cbn1cblxuLy9cblxuT2JqZWN0LmFzc2lnbiggQm94Mi5wcm90b3R5cGUsIHtcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXHRlbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTtcblxuXHR9LFxuXHRzaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fVxufSApO1xuXG5PYmplY3QuYXNzaWduKCBCb3gzLnByb3RvdHlwZSwge1xuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cdGVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0fSxcblx0c2l6ZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRTaXplKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH1cbn0gKTtcblxuTGluZTMucHJvdG90eXBlLmNlbnRlciA9IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxufTtcblxuT2JqZWN0LmFzc2lnbiggX01hdGgsIHtcblxuXHRyYW5kb20xNjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLnJhbmRvbTE2KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIE1hdGgucmFuZG9tKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIE1hdGgucmFuZG9tKCk7XG5cblx0fSxcblxuXHRuZWFyZXN0UG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5uZWFyZXN0UG93ZXJPZlR3bygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZsb29yUG93ZXJPZlR3bygpLicgKTtcblx0XHRyZXR1cm4gX01hdGguZmxvb3JQb3dlck9mVHdvKCB2YWx1ZSApO1xuXG5cdH0sXG5cblx0bmV4dFBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoOiAubmV4dFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jZWlsUG93ZXJPZlR3bygpLicgKTtcblx0XHRyZXR1cm4gX01hdGguY2VpbFBvd2VyT2ZUd28oIHZhbHVlICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDMucHJvdG90eXBlLCB7XG5cblx0ZmxhdHRlblRvQXJyYXlPZmZzZXQ6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRyaXgzOiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLlwiICk7XG5cdFx0cmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhcHBseVRvQnVmZmVyOiBmdW5jdGlvbiAoIGJ1ZmZlciAvKiwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYnVmZmVyICk7XG5cblx0fSxcblx0YXBwbHlUb1ZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHtcblxuXHRleHRyYWN0UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY29weVBvc2l0aW9uKCBtICk7XG5cblx0fSxcblx0ZmxhdHRlblRvQXJyYXlPZmZzZXQ6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLlwiICk7XG5cdFx0cmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cdGdldFBvc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjE7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0UG9zaXRpb24oKSB7XG5cblx0XHRcdGlmICggdjEgPT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5nZXRQb3NpdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMyApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cdHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblxuXHR9LFxuXHRtdWx0aXBseVRvQXJyYXk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yNDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3I0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVBeGlzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAucm90YXRlQXhpcygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0di50cmFuc2Zvcm1EaXJlY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXHRjcm9zc1ZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuY3Jvc3NWZWN0b3IoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHR9LFxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVYKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVZKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVaKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlQnlBeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZUJ5QXhpcygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uICggYnVmZmVyIC8qLCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBidWZmZXIgKTtcblxuXHR9LFxuXHRhcHBseVRvVmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIC8qIGFycmF5LCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdG1ha2VGcnVzdHVtOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm1ha2VGcnVzdHVtKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApO1xuXG5cdH1cblxufSApO1xuXG5QbGFuZS5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25MaW5lID0gZnVuY3Rpb24gKCBsaW5lICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4nICk7XG5cdHJldHVybiB0aGlzLmludGVyc2VjdHNMaW5lKCBsaW5lICk7XG5cbn07XG5cblF1YXRlcm5pb24ucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMyA9IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgaXMgbm93IHZlY3Rvci5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHZlY3Rvci5hcHBseVF1YXRlcm5pb24oIHRoaXMgKTtcblxufTtcblxuT2JqZWN0LmFzc2lnbiggUmF5LnByb3RvdHlwZSwge1xuXG5cdGlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvblBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzUGxhbmUoIHBsYW5lICk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZS5wcm90b3R5cGUsIHtcblxuXHRhcmVhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmFyZWEoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRBcmVhKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldEFyZWEoKTtcblxuXHR9LFxuXHRiYXJ5Y29vcmRGcm9tUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldEJhcnljb29yZCggcG9pbnQsIHRhcmdldCApO1xuXG5cdH0sXG5cdG1pZHBvaW50OiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAubWlkcG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRNaWRwb2ludCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRNaWRwb2ludCggdGFyZ2V0ICk7XG5cblx0fSxcblx0bm9ybWFsOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldE5vcm1hbCggdGFyZ2V0ICk7XG5cblx0fSxcblx0cGxhbmU6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5wbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFBsYW5lKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFBsYW5lKCB0YXJnZXQgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUsIHtcblxuXHRiYXJ5Y29vcmRGcm9tUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIGEsIGIsIGMsIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuJyApO1xuXHRcdHJldHVybiBUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCBhLCBiLCBjLCB0YXJnZXQgKTtcblxuXHR9LFxuXHRub3JtYWw6IGZ1bmN0aW9uICggYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4nICk7XG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldE5vcm1hbCggYSwgYiwgYywgdGFyZ2V0ICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFNoYXBlLnByb3RvdHlwZSwge1xuXG5cdGV4dHJhY3RBbGxQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGU6IC5leHRyYWN0QWxsUG9pbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5leHRyYWN0UG9pbnRzKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0cmFjdFBvaW50cyggZGl2aXNpb25zICk7XG5cblx0fSxcblx0ZXh0cnVkZTogZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGU6IC5leHRydWRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV4dHJ1ZGVHZW9tZXRyeSgpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgRXh0cnVkZUdlb21ldHJ5KCB0aGlzLCBvcHRpb25zICk7XG5cblx0fSxcblx0bWFrZUdlb21ldHJ5OiBmdW5jdGlvbiAoIG9wdGlvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIG5ldyBTaGFwZUdlb21ldHJ5KCB0aGlzLCBvcHRpb25zICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0ZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cblx0fSxcblx0ZGlzdGFuY2VUb01hbmhhdHRhbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oIHYgKTtcblxuXHR9LFxuXHRsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjMucHJvdG90eXBlLCB7XG5cblx0c2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0c2V0RXVsZXJGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21RdWF0ZXJuaW9uKCkgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0Z2V0UG9zaXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbSApO1xuXG5cdH0sXG5cdGdldFNjYWxlRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldFNjYWxlRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhTY2FsZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4U2NhbGUoIG0gKTtcblxuXHR9LFxuXHRnZXRDb2x1bW5Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIGluZGV4LCBtYXRyaXggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbWF0cml4LCBpbmRleCApO1xuXG5cdH0sXG5cdGFwcGx5UHJvamVjdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmFwcGx5UHJvamVjdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuYXBwbHlNYXRyaXg0KCBtICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtICk7XG5cblx0fSxcblx0ZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cblx0fSxcblx0ZGlzdGFuY2VUb01hbmhhdHRhbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oIHYgKTtcblxuXHR9LFxuXHRsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7XG5cblx0ZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cblx0fSxcblx0bGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBHZW9tZXRyeS5wcm90b3R5cGUsIHtcblxuXHRjb21wdXRlVGFuZ2VudHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGNvbXB1dGVMaW5lRGlzdGFuY2VzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR2VvbWV0cnk6IC5jb21wdXRlTGluZURpc3RhbmNlcygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5MaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIE9iamVjdDNELnByb3RvdHlwZSwge1xuXG5cdGdldENoaWxkQnlOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldENoaWxkQnlOYW1lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0T2JqZWN0QnlOYW1lKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5TmFtZSggbmFtZSApO1xuXG5cdH0sXG5cdHJlbmRlckRlcHRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBkaXN0YW5jZSwgYXhpcyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApO1xuXG5cdH0sXG5cdGdldFdvcmxkUm90YXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUm90YXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuT2JqZWN0M0QuZ2V0V29ybGRRdWF0ZXJuaW9uKCB0YXJnZXQgKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE9iamVjdDNELnByb3RvdHlwZSwge1xuXG5cdGV1bGVyT3JkZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRpb24ub3JkZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuJyApO1xuXHRcdFx0dGhpcy5yb3RhdGlvbi5vcmRlciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR1c2VRdWF0ZXJuaW9uOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMT0QucHJvdG90eXBlLCB7XG5cblx0b2JqZWN0czoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MT0Q6IC5vYmplY3RzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmxldmVscy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5sZXZlbHM7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIFNrZWxldG9uLnByb3RvdHlwZSwgJ3VzZVZlcnRleFRleHR1cmUnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEN1cnZlLnByb3RvdHlwZSwgJ19fYXJjTGVuZ3RoRGl2aXNpb25zJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdH0sXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApO1xuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gdmFsdWU7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cblBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZS5zZXRMZW5zID0gZnVuY3Rpb24gKCBmb2NhbExlbmd0aCwgZmlsbUdhdWdlICkge1xuXG5cdGNvbnNvbGUud2FybiggXCJUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYS5zZXRMZW5zIGlzIGRlcHJlY2F0ZWQuIFwiICtcblx0XHRcdFwiVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuXCIgKTtcblxuXHRpZiAoIGZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgdGhpcy5maWxtR2F1Z2UgPSBmaWxtR2F1Z2U7XG5cdHRoaXMuc2V0Rm9jYWxMZW5ndGgoIGZvY2FsTGVuZ3RoICk7XG5cbn07XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMaWdodC5wcm90b3R5cGUsIHtcblx0b25seVNoYWRvdzoge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLm9ubHlTaGFkb3cgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUZvdjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGb3YgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZvdi4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuZm92ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUxlZnQ6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTGVmdCBpcyBub3cgLnNoYWRvdy5jYW1lcmEubGVmdC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEubGVmdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFSaWdodDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFSaWdodCBpcyBub3cgLnNoYWRvdy5jYW1lcmEucmlnaHQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLnJpZ2h0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVRvcDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFUb3AgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnRvcC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEudG9wID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUJvdHRvbToge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYU5lYXI6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTmVhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEubmVhci4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEubmVhciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFGYXI6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRmFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mYXIuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmZhciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFWaXNpYmxlOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dCaWFzOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0JpYXMgaXMgbm93IC5zaGFkb3cuYmlhcy4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5iaWFzID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0RhcmtuZXNzOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93RGFya25lc3MgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcFdpZHRoOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcFdpZHRoIGlzIG5vdyAuc2hhZG93Lm1hcFNpemUud2lkdGguJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cubWFwU2l6ZS53aWR0aCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dNYXBIZWlnaHQ6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1hcFNpemUuaGVpZ2h0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93Lm1hcFNpemUuaGVpZ2h0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRsZW5ndGg6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAubGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuY291bnQgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcnJheS5sZW5ndGg7XG5cblx0XHR9XG5cdH0sXG5cdGNvcHlJbmRpY2VzQXJyYXk6IGZ1bmN0aW9uICggLyogaW5kaWNlcyAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5jb3B5SW5kaWNlc0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGFkZEluZGV4OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuJyApO1xuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGV4ICk7XG5cblx0fSxcblx0YWRkRHJhd0NhbGw6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50LCBpbmRleE9mZnNldCApIHtcblxuXHRcdGlmICggaW5kZXhPZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIG5vIGxvbmdlciBzdXBwb3J0cyBpbmRleE9mZnNldC4nICk7XG5cblx0XHR9XG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4nICk7XG5cdFx0dGhpcy5hZGRHcm91cCggc3RhcnQsIGNvdW50ICk7XG5cblx0fSxcblx0Y2xlYXJEcmF3Q2FsbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY2xlYXJEcmF3Q2FsbHMoKSBpcyBub3cgLmNsZWFyR3JvdXBzKCkuJyApO1xuXHRcdHRoaXMuY2xlYXJHcm91cHMoKTtcblxuXHR9LFxuXHRjb21wdXRlVGFuZ2VudHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Y29tcHV0ZU9mZnNldHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGRyYXdjYWxsczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmdyb3VwcztcblxuXHRcdH1cblx0fSxcblx0b2Zmc2V0czoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLm9mZnNldHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmdyb3VwcztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUsIHtcblxuXHRnZXRBcnJheXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5nZXRBcnJheXMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXG5cdGFkZFNoYXBlTGlzdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlTGlzdCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cblx0YWRkU2hhcGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVW5pZm9ybS5wcm90b3R5cGUsIHtcblxuXHRkeW5hbWljOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IC5keW5hbWljIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0b25VcGRhdGU6IHtcblx0XHR2YWx1ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHR3cmFwQXJvdW5kOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0d3JhcFJHQjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBSR0IgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKCk7XG5cblx0XHR9XG5cdH0sXG5cblx0c2hhZGluZzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLmZsYXRTaGFkaW5nID0gKCB2YWx1ZSA9PT0gRmxhdFNoYWRpbmcgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHRtZXRhbDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQnICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLCB7XG5cblx0ZGVyaXZhdGl2ZXM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLiBTaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTtcblx0XHRcdHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggV2ViR0xSZW5kZXJlci5wcm90b3R5cGUsIHtcblxuXHRhbmltYXRlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFuaW1hdGUoKSBpcyBub3cgLnNldEFuaW1hdGlvbkxvb3AoKS4nICk7XG5cdFx0dGhpcy5zZXRBbmltYXRpb25Mb29wKCBjYWxsYmFjayApO1xuXG5cdH0sXG5cblx0Z2V0Q3VycmVudFJlbmRlclRhcmdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHR9LFxuXG5cdGdldE1heEFuaXNvdHJvcHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRNYXhBbmlzb3Ryb3B5KCkgaXMgbm93IC5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpO1xuXG5cdH0sXG5cblx0Z2V0UHJlY2lzaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMucHJlY2lzaW9uO1xuXG5cdH0sXG5cblx0cmVzZXRHTFN0YXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAucmVzZXRHTFN0YXRlKCkgaXMgbm93IC5zdGF0ZS5yZXNldCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zdGF0ZS5yZXNldCgpO1xuXG5cdH0sXG5cblx0c3VwcG9ydHNGbG9hdFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnT0VTX3RleHR1cmVfZmxvYXRcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlc1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcycgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQzogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNCbGVuZE1pbk1heDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQmxlbmRNaW5NYXgoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdFWFRfYmxlbmRfbWlubWF4XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2JsZW5kX21pbm1heCcgKTtcblxuXHR9LFxuXHRzdXBwb3J0c1ZlcnRleFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcygpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXM7XG5cblx0fSxcblx0c3VwcG9ydHNJbnN0YW5jZWRBcnJheXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0luc3RhbmNlZEFycmF5cygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ0FOR0xFX2luc3RhbmNlZF9hcnJheXNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdH0sXG5cdGVuYWJsZVNjaXNzb3JUZXN0OiBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZW5hYmxlU2Npc3NvclRlc3QoKSBpcyBub3cgLnNldFNjaXNzb3JUZXN0KCkuJyApO1xuXHRcdHRoaXMuc2V0U2Npc3NvclRlc3QoIGJvb2xlYW4gKTtcblxuXHR9LFxuXHRpbml0TWF0ZXJpYWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5pbml0TWF0ZXJpYWwoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhZGRQcmVQbHVnaW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQcmVQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhZGRQb3N0UGx1Z2luOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUG9zdFBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHVwZGF0ZVNoYWRvd01hcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnVwZGF0ZVNoYWRvd01hcCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHNldEZhY2VDdWxsaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyZXIucHJvdG90eXBlLCB7XG5cblx0c2hhZG93TWFwRW5hYmxlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAuZW5hYmxlZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLmVuYWJsZWQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwVHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLnR5cGUgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwQ3VsbEZhY2U6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIHZhbHVlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH1cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMU2hhZG93TWFwLnByb3RvdHlwZSwge1xuXG5cdGN1bGxGYWNlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggLyogY3VsbEZhY2UgKi8gKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHJlbmRlclJldmVyc2VTaWRlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0cmVuZGVyU2luZ2xlU2lkZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSwge1xuXG5cdHdyYXBTOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUud3JhcFM7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1cmUud3JhcFMuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLndyYXBTID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHdyYXBUOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUud3JhcFQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLndyYXBUID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdG1hZ0ZpbHRlcjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUubWFnRmlsdGVyO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLm1hZ0ZpbHRlciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRtaW5GaWx0ZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm1pbkZpbHRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0YW5pc290cm9weToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUuYW5pc290cm9weSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm9mZnNldDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5vZmZzZXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0cmVwZWF0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5yZXBlYXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5yZXBlYXQgaXMgbm93IC50ZXh0dXJlLnJlcGVhdC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUucmVwZWF0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGZvcm1hdDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuZm9ybWF0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmZvcm1hdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR0eXBlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLnR5cGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS50eXBlID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGdlbmVyYXRlTWlwbWFwczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYlZSTWFuYWdlci5wcm90b3R5cGUsIHtcblxuXHRzdGFuZGluZzoge1xuXHRcdHNldDogZnVuY3Rpb24gKCAvKiB2YWx1ZSAqLyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViVlJNYW5hZ2VyOiAuc3RhbmRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5BdWRpby5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uICggZmlsZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogLmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkF1ZGlvTG9hZGVyIGluc3RlYWQuJyApO1xuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXHR2YXIgYXVkaW9Mb2FkZXIgPSBuZXcgQXVkaW9Mb2FkZXIoKTtcblx0YXVkaW9Mb2FkZXIubG9hZCggZmlsZSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRzY29wZS5zZXRCdWZmZXIoIGJ1ZmZlciApO1xuXG5cdH0gKTtcblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkF1ZGlvQW5hbHlzZXIucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW9BbmFseXNlcjogLmdldERhdGEoKSBpcyBub3cgLmdldEZyZXF1ZW5jeURhdGEoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtcblxufTtcblxuLy9cblxuQ3ViZUNhbWVyYS5wcm90b3R5cGUudXBkYXRlQ3ViZU1hcCA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIHNjZW5lICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1YmVDYW1lcmE6IC51cGRhdGVDdWJlTWFwKCkgaXMgbm93IC51cGRhdGUoKS4nICk7XG5cdHJldHVybiB0aGlzLnVwZGF0ZSggcmVuZGVyZXIsIHNjZW5lICk7XG5cbn07XG5cbi8vXG5cbmV4cG9ydCB2YXIgR2VvbWV0cnlVdGlscyA9IHtcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeTEsIGdlb21ldHJ5MiwgbWF0ZXJpYWxJbmRleE9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4nICk7XG5cdFx0dmFyIG1hdHJpeDtcblxuXHRcdGlmICggZ2VvbWV0cnkyLmlzTWVzaCApIHtcblxuXHRcdFx0Z2VvbWV0cnkyLm1hdHJpeEF1dG9VcGRhdGUgJiYgZ2VvbWV0cnkyLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHRtYXRyaXggPSBnZW9tZXRyeTIubWF0cml4O1xuXHRcdFx0Z2VvbWV0cnkyID0gZ2VvbWV0cnkyLmdlb21ldHJ5O1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkxLm1lcmdlKCBnZW9tZXRyeTIsIG1hdHJpeCwgbWF0ZXJpYWxJbmRleE9mZnNldCApO1xuXG5cdH0sXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIGdlb21ldHJ5LmNlbnRlcigpO1xuXG5cdH1cblxufTtcblxuSW1hZ2VVdGlscy5jcm9zc09yaWdpbiA9IHVuZGVmaW5lZDtcblxuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZSA9IGZ1bmN0aW9uICggdXJsLCBtYXBwaW5nLCBvbkxvYWQsIG9uRXJyb3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuJyApO1xuXG5cdHZhciBsb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuXHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblxuXHR2YXIgdGV4dHVyZSA9IGxvYWRlci5sb2FkKCB1cmwsIG9uTG9hZCwgdW5kZWZpbmVkLCBvbkVycm9yICk7XG5cblx0aWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZztcblxuXHRyZXR1cm4gdGV4dHVyZTtcblxufTtcblxuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgPSBmdW5jdGlvbiAoIHVybHMsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTtcblxuXHR2YXIgbG9hZGVyID0gbmV3IEN1YmVUZXh0dXJlTG9hZGVyKCk7XG5cdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdHZhciB0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIHVybHMsIG9uTG9hZCwgdW5kZWZpbmVkLCBvbkVycm9yICk7XG5cblx0aWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZztcblxuXHRyZXR1cm4gdGV4dHVyZTtcblxufTtcblxuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7XG5cbn07XG5cbkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7XG5cbn07XG5cbi8vXG5cbmV4cG9ydCBmdW5jdGlvbiBQcm9qZWN0b3IoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb2plY3RvciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVyZXJzL1Byb2plY3Rvci5qcy4nICk7XG5cblx0dGhpcy5wcm9qZWN0VmVjdG9yID0gZnVuY3Rpb24gKCB2ZWN0b3IsIGNhbWVyYSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlByb2plY3RvcjogLnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnByb2plY3QoKS4nICk7XG5cdFx0dmVjdG9yLnByb2plY3QoIGNhbWVyYSApO1xuXG5cdH07XG5cblx0dGhpcy51bnByb2plY3RWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3RvciwgY2FtZXJhICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUHJvamVjdG9yOiAudW5wcm9qZWN0VmVjdG9yKCkgaXMgbm93IHZlY3Rvci51bnByb2plY3QoKS4nICk7XG5cdFx0dmVjdG9yLnVucHJvamVjdCggY2FtZXJhICk7XG5cblx0fTtcblxuXHR0aGlzLnBpY2tpbmdSYXkgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvamVjdG9yOiAucGlja2luZ1JheSgpIGlzIG5vdyByYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSgpLicgKTtcblxuXHR9O1xuXG59XG5cbi8vXG5cbmV4cG9ydCBmdW5jdGlvbiBDYW52YXNSZW5kZXJlcigpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3JlbmRlcmVycy9DYW52YXNSZW5kZXJlci5qcycgKTtcblxuXHR0aGlzLmRvbUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0dGhpcy5jbGVhciA9IGZ1bmN0aW9uICgpIHt9O1xuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICgpIHt9O1xuXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7fTtcblx0dGhpcy5zZXRTaXplID0gZnVuY3Rpb24gKCkge307XG5cbn1cblxuLy9cblxuZXhwb3J0IHZhciBTY2VuZVV0aWxzID0ge1xuXG5cdGNyZWF0ZU11bHRpTWF0ZXJpYWxPYmplY3Q6IGZ1bmN0aW9uICggLyogZ2VvbWV0cnksIG1hdGVyaWFscyAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzJyApO1xuXG5cdH0sXG5cblx0ZGV0YWNoOiBmdW5jdGlvbiAoIC8qIGNoaWxkLCBwYXJlbnQsIHNjZW5lICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3V0aWxzL1NjZW5lVXRpbHMuanMnICk7XG5cblx0fSxcblxuXHRhdHRhY2g6IGZ1bmN0aW9uICggLyogY2hpbGQsIHNjZW5lLCBwYXJlbnQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcycgKTtcblxuXHR9XG5cbn07XG5cbi8vXG5cbmV4cG9ydCBmdW5jdGlvbiBMZW5zRmxhcmUoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkxlbnNGbGFyZSBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvb2JqZWN0cy9MZW5zZmxhcmUuanMnICk7XG5cbn1cbiJdLCJuYW1lcyI6WyJ0b0pTT04iLCJDdXJ2ZXNbICdMaW5lQ3VydmUnIF0iXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBLEtBQUssTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEdBQUc7O0NBRW5DLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFckM7O0FBRUQsS0FBSyxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRzs7Ozs7Q0FLckMsTUFBTSxDQUFDLFNBQVMsR0FBRyxXQUFXLEtBQUssR0FBRzs7RUFFckMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksQ0FB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OztBQUdwQyxBQUFVLElBQUMsTUFBTSxHQUFHO0lBQ2hCLElBQUksRUFBRSxZQUFZO0lBQ2xCLE1BQU0sRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUM3RCxJQUFJLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLE9BQU8sQ0FBQztLQUNYO0lBQ0QsS0FBSyxFQUFFLFdBQVc7UUFDZCxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7S0FDN0I7SUFDRCxRQUFRLEVBQUUsV0FBVztRQUNqQixJQUFJLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLE9BQU8sQ0FBQztLQUNYO0lBQ0QsR0FBRyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUM3RCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBQztLQUNaO0lBQ0QsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQztLQUNYO0lBQ0QsUUFBUSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDeEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsUUFBUSxDQUFDO1FBQ1QsS0FBSyxDQUFDO1lBQ0YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsTUFBTTtRQUNWLEtBQUssQ0FBQztZQUNGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLE1BQU07UUFDVixLQUFLLENBQUM7WUFDRixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNSLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNSLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFDO1NBQ1g7UUFDRCxPQUFPLENBQUM7S0FDWDtJQUNELEdBQUcsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNULENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDVCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNULENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNULENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNWLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNWLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDVixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsT0FBTyxDQUFDO0tBQ1g7SUFDRCxNQUFNLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNULENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDVCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNULENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDVCxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxPQUFPLENBQUM7S0FDWDtJQUNELFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDdEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDYixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNkLE9BQU8sQ0FBQztLQUNYO0lBQ0QsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDN0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsT0FBTyxDQUFDO0tBQ1g7SUFDRCxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQzlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENB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LENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsT0FBTyxDQUFDO0tBQ1g7SUFDRCxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixPQUFPLENBQUM7S0FDWDtJQUNELE1BQU0sRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDO0tBQ3JJO0lBQ0QsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBQztLQUNsQjtJQUNELFlBQVksRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBQztLQUN0QjtDQUNKOztBQ3JjRDs7Ozs7QUFLQSxBQUFHLElBQUMsS0FBSyxHQUFHOztDQUVYLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUc7Q0FDdEIsT0FBTyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRTs7Q0FFdEIsWUFBWSxFQUFFLEVBQUUsWUFBWTs7OztFQUkzQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7O0VBRWIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFaEMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7R0FFeEQ7O0VBRUQsT0FBTyxTQUFTLFlBQVksR0FBRzs7R0FFOUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7R0FDeEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7R0FDeEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7R0FDeEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7R0FDeEMsSUFBSSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHO0lBQzFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHO0lBQzdHLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUU7SUFDdkcsR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQzs7O0dBRzVGLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztHQUUxQixDQUFDOztFQUVGLElBQUk7O0NBRUwsS0FBSyxFQUFFLFdBQVcsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0VBRW5DLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7RUFFL0M7Ozs7O0NBS0Qs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QUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOztFQUVoRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV2QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQzVELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDNUQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUM3RCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztFQUU3RCxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxRQUFRLEVBQUUsWUFBWTs7RUFFckIsSUFBSSxDQUFDLEdBQUc7O0dBRVAsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNWLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDVixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ1YsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFVixDQUFDOztFQUVGLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELEtBQUssRUFBRSxZQUFZOztFQUVsQixPQUFPLElBQUksT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7RUFFaEQ7O0NBRUQsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVwQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0VBQ3ZCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0VBRXBCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDM0UsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUMzRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQy9FLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRW5GLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFlBQVksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQzs7RUFFeEMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNwQixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ3BCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRXBCLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFlBQVksRUFBRSxXQUFXLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHOztFQUU5QyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ3JDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDckMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFckMsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsU0FBUyxFQUFFLFdBQVcsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUc7O0VBRTNDLElBQUksQ0FBQyxHQUFHO0dBQ1AsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztHQUM1QixLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0dBQzVCLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7R0FDNUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNWLENBQUM7O0VBRUYsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsZUFBZSxFQUFFLFlBQVk7O0VBRTVCLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0VBRXZCLE9BQU8sU0FBUyxlQUFlLEVBQUUsQ0FBQyxHQUFHOzs7O0dBSXBDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7R0FDdkIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQzs7R0FFcEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7R0FDekQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7R0FDekQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7O0dBRXpELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0dBQzNCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0dBQzNCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0dBQzNCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0dBRVosRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7R0FDM0IsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7R0FDM0IsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7R0FDM0IsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7R0FFWixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUMzQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUMzQixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUM3QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztHQUViLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDYixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ2IsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztHQUNiLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0dBRWIsT0FBTyxJQUFJLENBQUM7O0dBRVosQ0FBQzs7RUFFRixFQUFFOztDQUVILHFCQUFxQixFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUV6QyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRzs7R0FFbkMsT0FBTyxDQUFDLEtBQUssRUFBRSx1R0FBdUcsRUFBRSxDQUFDOztHQUV6SDs7RUFFRCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV2QixJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0VBQzFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDekMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUN6QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUV6QyxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztHQUU1QixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztHQUVuRCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNoQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2xCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0dBRVosRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztHQUN0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztHQUVsQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztHQUVqQixNQUFNLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0dBRW5DLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRW5ELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztHQUN0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRWhCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2hCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2hCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzs7R0FFZCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztHQUVqQixNQUFNLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0dBRW5DLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRW5ELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztHQUN0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2xCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7R0FFdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2hCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7R0FFdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNsQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ1osRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRWpCLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7R0FFbkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7R0FFbkQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDaEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7R0FFdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDaEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7R0FFdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0dBQ2QsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDaEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRWpCLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7R0FFbkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7R0FFbkQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDaEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7R0FFdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztHQUNaLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2hCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRWxCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDbEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7R0FFdkIsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztHQUVuQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztHQUVuRCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNoQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7R0FDZCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7R0FFaEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2hCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7R0FFdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2hCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7R0FFdkI7OztFQUdELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDWixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ1osRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7O0VBR2IsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNiLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDYixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2IsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFYixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCwwQkFBMEIsRUFBRSxZQUFZOztFQUV2QyxJQUFJLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2xDLElBQUksR0FBRyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWpDLE9BQU8sU0FBUywwQkFBMEIsRUFBRSxDQUFDLEdBQUc7O0dBRS9DLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOztHQUVwQyxDQUFDOztFQUVGLEVBQUU7O0NBRUgsTUFBTSxFQUFFLFlBQVk7O0VBRW5CLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7RUFDdEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztFQUN0QixJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztFQUV0QixPQUFPLFNBQVMsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHOztHQUV6QyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztHQUV2QixDQUFDLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7R0FFNUIsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHOzs7O0lBSXpCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztJQUVSOztHQUVELENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztHQUNkLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV4QixLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUc7Ozs7SUFJekIsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUc7O0tBRTdCLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDOztLQUVkLE1BQU07O0tBRU4sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7O0tBRWQ7O0lBRUQsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2QsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0lBRXhCOztHQUVELENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztHQUNkLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV2QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7R0FDNUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQzVDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7R0FFN0MsT0FBTyxJQUFJLENBQUM7O0dBRVosQ0FBQzs7RUFFRixFQUFFOztDQUVILFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRTNCLEtBQUssQ0FBQyxLQUFLLFNBQVMsR0FBRzs7R0FFdEIsT0FBTyxDQUFDLElBQUksRUFBRSxrR0FBa0csRUFBRSxDQUFDO0dBQ25ILE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFckM7O0VBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUV4Qzs7Q0FFRCxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRTNCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFeEM7O0NBRUQsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUVuQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO0VBQ3BCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7RUFDcEIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFdkIsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ2hFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNoRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDakUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUVqRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDaEUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ2hFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNqRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRWpFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3hELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3hELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3hELEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztFQUV6RCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUN4RCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUN4RCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUN4RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFekQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDeEQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDeEQsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDekQsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRXpELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3hELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3hELEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdB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QUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ2hFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNqRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Ozs7O0VBS2pFO0dBQ0MsR0FBRztJQUNGLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2QsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0lBQ2xCO0dBQ0QsR0FBRztJQUNGLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2QsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0lBQ2xCO0dBQ0QsR0FBRztJQUNGLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2QsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0lBQ2xCO0dBQ0QsR0FBRztJQUNGLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2QsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0lBQ2xCOztJQUVBOztFQUVGOztDQUVELFNBQVMsRUFBRSxZQUFZOztFQUV0QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0VBQ3ZCLElBQUksR0FBRyxDQUFDOztFQUVSLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNoRCxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDaEQsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOztFQUVoRCxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbEQsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ2xELEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7RUFFcEQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsV0FBVyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUUzQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV2QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRWYsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFLGlCQUFpQixHQUFHOzs7RUFHN0MsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVE7R0FDckIsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFROztHQUVmLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0dBQzFELEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0dBQzFELEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFO0dBQzVELEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFOztHQUU5RCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0dBQy9HLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7R0FDL0csR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztHQUMvRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRWpILElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRXhELEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRzs7R0FFaEIsSUFBSSxHQUFHLEdBQUcsb0VBQW9FLENBQUM7O0dBRS9FLEtBQUssaUJBQWlCLEtBQUssSUFBSSxHQUFHOztJQUVqQyxNQUFNLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDOztJQUV2QixNQUFNOztJQUVOLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7O0lBRXBCOztHQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztHQUV2Qjs7RUFFRCxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztFQUVyQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztFQUN2QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7RUFDakksRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ2pJLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7RUFFakksRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7RUFDdkIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ2pJLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztFQUNqSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7O0VBRWpJLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO0VBQ3ZCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztFQUNqSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7RUFDbEksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDOztFQUVsSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztFQUN4QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7RUFDbEksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ2xJLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7RUFFbEksT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVyQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0VBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRTlCLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztFQUN6QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDekMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQzFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzs7RUFFMUMsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsaUJBQWlCLEVBQUUsWUFBWTs7RUFFOUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFdkIsSUFBSSxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDekUsSUFBSSxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUMs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RUFJMUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztFQUMxQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0VBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDZCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ3ZDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRTNCLElBQUksQ0FBQyxHQUFHOztHQUVQLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztHQUM3QyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7R0FDN0MsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztHQUNoRCxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUVWLENBQUM7O0dBRUQsT0FBTyxJQUFJLENBQUM7O0VBRWI7O0NBRUQsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRS9CLElBQUksQ0FBQyxHQUFHOztHQUVQLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDVixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ1YsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNWLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRVYsQ0FBQzs7RUFFRixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFL0IsSUFBSSxDQUFDLEdBQUc7O0dBRVAsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNWLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDVixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ1YsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFVixDQUFDOztFQUVGLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELE9BQU8sRUFBRSxXQUFXLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxHQUFHOztFQUVqRCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV2QixJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDO0VBQy9FLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUMxQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQzFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0VBRTFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7O1NBRXRDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ25DLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQzNCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQzNCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O1NBRVosRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDM0IsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDbkMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDM0IsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7U0FFWixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUMzQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUMzQixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUNwQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztTQUViLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ3RCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ3RCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ3RCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O1NBRWIsT0FBTyxJQUFJLENBQUM7O0VBRW5COztDQUVELFNBQVMsRUFBRSxZQUFZOztFQUV0QixJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0VBQzNCLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0VBRTNCLE9BQU8sU0FBUyxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEdBQUc7O0dBRXhELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0dBRXZCLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQUMxRCxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7R0FDMUQsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDOzs7R0FHM0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0dBQzdCLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7O0dBRXpCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0dBQ3RCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0dBQ3RCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOzs7R0FHdEIsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7R0FFcEIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztHQUNuQixJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0dBQ25CLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0dBRW5CLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0dBQzlCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0dBQzlCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDOztHQUU5QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztHQUM5QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztHQUM5QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQzs7R0FFOUIsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7R0FDOUIsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7R0FDOUIsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxLQUFLLENBQUM7O0dBRS9CLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7R0FFM0MsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDYixLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztHQUNiLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDOztHQUViLE9BQU8sSUFBSSxDQUFDOztHQUVaLENBQUM7O0VBRUYsRUFBRTs7Q0FFSCxlQUFlLEVBQUUsV0FBVyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRzs7RUFFakUsS0FBSyxHQUFHLEtBQUssU0FBUyxHQUFHOztHQUV4QixPQUFPLENBQUMsSUFBSSxFQUFFLHNHQUFzRyxFQUFFLENBQUM7O0dBRXZIOztFQUVELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7RUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUM7RUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7O0VBRXBDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksT0FBTyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUM7RUFDNUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxPQUFPLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQztFQUM1QyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7RUFDMUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7O0VBRTFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDcEQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNwRCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3JELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFdkQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRzs7RUFFbEUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztFQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDO0VBQy9CLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7RUFDL0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQzs7RUFFN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQztFQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxDQUFDO0VBQzdCLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7O0VBRTNCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7RUFDMUQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztFQUMxRCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7RUFDN0QsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFckQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsTUFBTSxFQUFFLFdBQVcsTUFBTSxHQUFHOztFQUUzQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0VBQ3ZCLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0VBRXpCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRS9CLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEtBQUssQ0FBQzs7R0FFeEM7O0VBRUQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsU0FBUyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7RUFFckMsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O0VBRXZDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRS9CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7R0FFekM7O0VBRUQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsT0FBTyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7RUFFbkMsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDdEMsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O0VBRXZDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0VBRXZCLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDMUIsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDOUIsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDOUIsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTlCLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzlCLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzlCLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzlCLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUU5QixLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUM5QixLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUM5QixLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNoQyxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFaEMsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDaEMsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDaEMsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDaEMsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRWhDLE9BQU8sS0FBSyxDQUFDOztFQUViOztDQUVELFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ3hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDVixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDVCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDVCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNWLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDVixJQUFJLENBQUMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2hCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2hCLFFBQVEsQ0FBQztFQUNULEtBQUssQ0FBQztHQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDVixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ1QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNWLE1BQU07RUFDUCxLQUFLLENBQUM7R0FDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztHQUNWLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDVixNQUFNO0VBQ1AsS0FBSyxDQUFDO0dBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7R0FDUixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7R0FDUixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBQztHQUNSO0VBQ0QsT0FBTyxDQUFDO0VBQ1I7Q0FDRCxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNULENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0dBQ1gsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3JDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7R0FDVCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ1QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUNULENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7R0FDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNyQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ1QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUNULENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7R0FDVixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0dBQ1YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDckMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDckMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDdEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDdEMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUNWLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7R0FDVixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0dBQ1YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUNWLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3RDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3RDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3RDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3RDLE9BQU8sQ0FBQztFQUNUO0NBQ0QsTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDVCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNULENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDVCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNULENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1QsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RELElBQUksQ0FBQyxDQUFDO0dBQ0wsT0FBTyxJQUFJLENBQUM7RUFDYixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDbkMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDbkMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDbkMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDcEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ3BDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDcEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ3BDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNwQyxPQUFPLENBQUM7RUFDUjs7Q0FFRCxFQUFFLENBQUM7O0FDbmpDSjs7Ozs7OztBQU9BLFNBQVMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFakMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ2pCLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNqQixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDakIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxTQUFTLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEM7O0FBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUU7O0NBRTFCLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRzs7RUFFakMsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRXBDOztDQUVELFNBQVMsRUFBRSxXQUFXLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRzs7OztFQUk3RSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRTtHQUM5QixFQUFFLEdBQUcsSUFBSSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUU7R0FDM0IsRUFBRSxHQUFHLElBQUksRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFO0dBQzNCLEVBQUUsR0FBRyxJQUFJLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRTs7R0FFM0IsRUFBRSxHQUFHLElBQUksRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFO0dBQzNCLEVBQUUsR0FBRyxJQUFJLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRTtHQUMzQixFQUFFLEdBQUcsSUFBSSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUU7R0FDM0IsRUFBRSxHQUFHLElBQUksRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRTdCLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRzs7R0FFdkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7O0lBRVosR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFOztJQUUzQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDNUIsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOzs7R0FHeEIsS0FBSyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRzs7SUFFOUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7S0FDNUIsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7SUFFcEMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUM5QixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDOztJQUU5Qjs7R0FFRCxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztHQUVuQixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0dBQ3hCLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7R0FDeEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztHQUN4QixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDOzs7R0FHeEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRzs7SUFFbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztJQUUvRCxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNSLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDUixFQUFFLElBQUksQ0FBQyxDQUFDOztJQUVSOztHQUVEOztFQUVELEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDdEIsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDMUIsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDMUIsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRTFCOztDQUVELEVBQUUsQ0FBQzs7QUFFSixNQUFNLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRTs7Q0FFOUMsQ0FBQyxFQUFFOztFQUVGLEdBQUcsRUFBRSxZQUFZOztHQUVoQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7O0dBRWY7O0VBRUQsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztHQUV2QixJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztHQUNoQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7R0FFeEI7O0VBRUQ7O0NBRUQsQ0FBQyxFQUFFOztFQUVGLEdBQUcsRUFBRSxZQUFZOztHQUVoQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7O0dBRWY7O0VBRUQsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztHQUV2QixJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztHQUNoQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7R0FFeEI7O0VBRUQ7O0NBRUQsQ0FBQyxFQUFFOztFQUVGLEdBQUcsRUFBRSxZQUFZOztHQUVoQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7O0dBRWY7O0VBRUQsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztHQUV2QixJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztHQUNoQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7R0FFeEI7O0VBRUQ7O0NBRUQsQ0FBQyxFQUFFOztFQUVGLEdBQUcsRUFBRSxZQUFZOztHQUVoQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7O0dBRWY7O0VBRUQsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztHQUV2QixJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztHQUNoQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7R0FFeEI7O0VBRUQ7O0NBRUQsRUFBRSxDQUFDOztBQUVKLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRTs7Q0FFcEMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUU1QixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNaLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ1osSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDWixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFWixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7RUFFeEIsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsS0FBSyxFQUFFLFlBQVk7O0VBRWxCLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFbEU7O0NBRUQsSUFBSSxFQUFFLFdBQVcsVUFBVSxHQUFHOztFQUU3QixJQUFJLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7RUFDdkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO0VBQ3ZCLElBQUksQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztFQUN2QixJQUFJLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7O0VBRXZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztFQUV4QixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxZQUFZLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztFQUV4QyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRzs7R0FFbkMsTUFBTSxJQUFJLEtBQUssRUFBRSxrR0FBa0csRUFBRSxDQUFDOztHQUV0SDs7RUFFRCxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOzs7Ozs7RUFNbEUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztFQUNuQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDOztFQUVuQixJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQ3RCLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDdEIsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFdEIsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUN0QixJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQ3RCLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXRCLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7R0FFdEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7R0FFdEMsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0dBRTdCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0dBRXRDLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztHQUU3QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztHQUV0QyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7R0FFN0IsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7R0FFdEMsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0dBRTdCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0dBRXRDLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztHQUU3QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztHQUV0Qzs7RUFFRCxLQUFLLE1BQU0sS0FBSyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0VBRWhELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELGdCQUFnQixFQUFFLFdBQVcsSUFBSSxFQUFFLEtBQUssR0FBRzs7Ozs7O0VBTTFDLElBQUksU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7O0VBRXJELElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDckIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNyQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3JCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7RUFFaEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0VBRXhCLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELHFCQUFxQixFQUFFLFdBQVcsQ0FBQyxHQUFHOzs7Ozs7RUFNckMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVE7O0dBRWxCLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtHQUMzQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7R0FDM0MsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFOztHQUU1QyxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0dBQ3ZCLENBQUMsQ0FBQzs7RUFFSCxLQUFLLEtBQUssR0FBRyxDQUFDLEdBQUc7O0dBRWhCLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7O0dBRW5DLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztHQUNuQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7R0FDNUIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0dBQzVCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQzs7R0FFNUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRzs7R0FFcEMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDOztHQUU3QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7R0FDNUIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0dBQ25C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QUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDOztHQUU5QixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7R0FFeEI7O0VBRUQsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztFQUNoRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQztFQUN6RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUUsR0FBRyxZQUFZO0dBQzVELE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxZQUFZLENBQUM7O0VBRW5ELElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0VBQzVDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0VBQzVDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0VBQzVDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDOztFQUU1QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7RUFFeEIsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsTUFBTSxFQUFFLFdBQVcsVUFBVSxHQUFHOztFQUUvQixPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxRQUFRLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLFVBQVUsQ0FBQyxFQUFF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LEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQzlDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRTlDLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFlBQVksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFNUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztFQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztFQUVuQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRWhFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0VBQ2hFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0VBQ2hFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDOztFQUVqRSxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxlQUFlLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRS9CLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDdkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7OztFQUkzQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNsQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNsQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNsQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOzs7O0VBSXBDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVB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QUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDakMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQ2pDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFakMsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVuQixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDakMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQ2pDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFakMsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsS0FBSyxFQUFFLFdBQVcsR0FBRyxFQUFFLEdBQUcsR0FBRzs7OztFQUk1QixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDdEQsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FB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LENBQUMsQ0FBQyxRQUFRLENBQUM7O0VBRXBCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUN4RCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDeEQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUV4RCxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxjQUFjLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRTlCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0VBRXBCLElBQUksQ0FBQyxHQUFHOztHQUVQLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtHQUN6QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7R0FDekIsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFOztHQUUxQixDQUFDOztFQUVGLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELHNCQUFzQixFQUFFLFlBQVk7O0VBRW5DLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0VBRXZCLE9BQU8sU0FBUyxzQkFBc0IsRUFBRSxTQUFTLEdBQUc7O0dBRW5ELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0lBRW5ELEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMzQixFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDM0IsRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUUzQixFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDOztJQUV4QixTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztJQUV4Qzs7R0FFRCxPQUFPLFNBQVMsQ0FBQzs7R0FFakIsQ0FBQzs7RUFFRixFQUFFOztDQUVILFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFeEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUV4Qzs7Q0FFRCxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRTNCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFeEM7O0NBRUQsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUVuQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO0VBQ3BCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7RUFDcEIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFdkIsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNoRCxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2hELElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWhELElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDaEQsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNoRCxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVoRCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDNUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzVDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFNUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzVDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUM1QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRTVDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUM1QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDNUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztFQUU1QyxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxjQUFjLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRTlCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0VBRXZCLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztFQUN6QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDekMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDOztFQUV6QyxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxXQUFXLEVBQUUsWUFBWTs7RUFFeEIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFdkIsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7R0FDeEMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0dBQ3JDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUV2QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUU3RTs7Q0FFRCxVQUFVLEVBQUUsV0FBVyxNQUFNLEVBQUUsaUJBQWlCLEdBQUc7O0VBRWxELEtBQUssTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEdBQUc7O0dBRWpDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsa0VBQWtFLEVBQUUsQ0FBQzs7R0FFcEY7O0VBRUQsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVE7R0FDdkIsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFROztHQUVsQixHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7R0FDM0MsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0dBQzNDLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTs7R0FFM0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7R0FDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7R0FDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7O0dBRTNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFekMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHOztHQUVoQixJQUFJLEdBQUcsR0FBRyxvRUFBb0UsQ0FBQzs7R0FFL0UsS0FBSyxpQkFBaUIsS0FBSyxJQUFJLEdBQUc7O0lBRWpDLE1BQU0sSUFBSSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7O0lBRXZCLE1BQU07O0lBRU4sT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQzs7SUFFcEI7O0dBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0dBRXZCOztFQUVELElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7O0VBRXJCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO0VBQ3ZCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7RUFDN0MsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7RUFFN0MsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7RUFDdkIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztFQUM3QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDOztFQUU3QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztFQUN2QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQzdDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7O0VBRTdDLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFNBQVMsRUFBRSxZQUFZOztFQUV0QixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFM0IsR0FBRyxHQUFHLENBQUMsRUFBRSxD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LEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUM1QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTVDLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELE1BQU0sRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFMUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztFQUMxQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUUxQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV2QixJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2hELElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWhELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDNUIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUM1QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztFQUU1QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDOUIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQzlCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7RUFFOUIsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsU0FBUyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsR0FBRzs7RUFFOUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFdkIsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFMUUsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsTUFBTSxFQUFFLFdBQVcsTUFBTSxHQUFHOztFQUUzQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0VBQ3ZCLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0VBRXpCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRTlCLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEtBQUssQ0FBQzs7R0FFeEM7O0VBRUQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsU0FBUyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7RUFFckMsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O0VBRXZDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRTlCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7R0FFekM7O0VBRUQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsT0FBTyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7RUFFbkMsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDdEMsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O0VBRXZDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0VBRXZCLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDMUIsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDOUIsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTlCLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzlCLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzlC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QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNqQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDakMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQ2pDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFakMsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsS0FBSyxFQUFFLFdBQVcsR0FBRyxFQUFFLEdBQUcsR0FBRzs7OztFQUk1QixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDdEQsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQ3RELElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUN0RCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJ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RXhCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNyRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDckUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQ3JFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFckUsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsTUFBTSxFQUFFLFlBQVk7O0VBRW5CLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ2xCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ2xCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ2xCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDOztFQUVsQixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRW5CLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUVqRTs7Q0FFRCxRQUFRLEVBQUUsWUFBWTs7RUFFckIsT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7O0VBRTdFOztDQUVELE1BQU0sRUFBRSxZQUFZOztFQUVuQixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRTFGOztDQUVELGVBQWUsRUFBRSxZQUFZOztFQUU1QixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUV6Rjs7Q0FFRCxTQUFTLEVBQUUsWUFBWTs7RUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7RUFFL0M7O0NBRUQsU0FBUyxFQUFFLFdBQVcsTUFBTSxHQUFHOztFQUU5QixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRWpEOztDQUVELElBQUksRUFBRSxXQUFXLENBQUMsRUFBRSxLQUFLLEdBQUc7O0VBRTNCLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDO0VBQ25DLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDO0VBQ25DLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDO0VBQ25DLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDOztFQUVuQyxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRzs7RUFFdkMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUVuRTs7Q0FFRCxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRXRCLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJ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QyxDQUFDLENBQUM7O0dBRWxDOztFQUVELEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztHQUV6QixHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDbkMsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztHQUVuQyxNQUFNOztHQUVOLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztHQUNuQyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0dBRW5DOztFQUVELEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztHQUV6QixHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDbkMsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztHQUVuQyxNQUFNOztHQUVOLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztHQUNuQyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0dBRW5DOztFQUVELFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUc7O0VBRTFEOztDQUVELGtCQUFrQixFQUFFLEVBQUUsWUFBWTs7O0VBR2pDLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7RUFDdkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztFQUN2QixJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOzs7RUFHdkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztFQUN2QixJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0VBQ3ZCLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0VBRXZCLElBQUksUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0VBRTdCLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7RUFDM0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7RUFFNUIsSUFBSSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7RUFFbkMsU0FBUyxVQUFVLEVBQUUsSUFBSSxHQUFHOztHQUUzQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7O0dBRVQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0lBRWxELFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUU5QixJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7SUFFckgsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUM1QixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzVCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0lBRTVCLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUc7Ozs7S0FJdkUsT0FBTyxLQUFLLENBQUM7O0tBRWI7O0lBRUQ7O0dBRUQsT0FBTyxJQUFJLENBQUM7O0dBRVo7O0VBRUQsT0FBTyxTQUFTLGtCQUFrQixFQUFFLFFBQVEsR0FBRzs7R0FFOUMsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUc7O0lBRXJCLE9BQU8sS0FBSyxDQUFDOztJQUViOzs7R0FHRCxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO0dBQ3pCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7O0dBR3ZDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztHQUNwQyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7R0FDcEMsRUFBRSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDOzs7R0FHcEMsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7R0FDeEIsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7R0FDeEIsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Ozs7O0dBS3hCLElBQUksSUFBSSxHQUFHO0lBQ1YsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqRCxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDakQsQ0FBQztHQUNGLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUc7O0lBRTNCLE9BQU8sS0FBSyxDQUFDOztJQUViOzs7R0FHRCxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ3JDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUc7O0lBRTNCLE9BQU8sS0FBSyxDQUFDOztJQUViOzs7O0dBSUQsY0FBYyxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7R0FDdEMsSUFBSSxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztHQUNoRSxPQUFPLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7R0FFMUIsQ0FBQzs7RUFFRixJQUFJOztDQUVMLFVBQVUsRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0VBRXRDLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRzs7R0FFM0IsT0FBTyxDQUFDLElBQUksRUFBRSxrREFBa0QsRUFBRSxDQUFDO0dBQ25FLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztHQUV2Qjs7RUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOztFQUV4RDs7Q0FFRCxlQUFlLEVBQUUsWUFBWTs7RUFFNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7RUFFdkIsT0FBTyxTQUFTLGVBQWUsRUFBRSxLQUFLLEdBQUc7O0dBRXhDLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0dBQ2hFLE9BQU8sWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7R0FFMUMsQ0FBQzs7RUFFRixFQUFFOztDQUVILGlCQUFpQixFQUFFLFlBQVk7O0VBRTlCLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0VBRXZCLE9BQU8sU0FBUyxpQkFBaUIsRUFBRSxNQUFNLEdBQUc7O0dBRTNDLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRzs7SUFFM0IsT0FBTyxDQUFDLElBQUksRUFBRSx5REFBeUQsRUFBRSxDQUFDO0lBQzFFLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDOztJQUV0Qjs7R0FFRCxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7R0FFaEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQzs7R0FFbEQsT0FBTyxNQUFNLENBQUM7O0dBRWQsQ0FBQzs7RUFFRixFQUFFOztDQUVILFNBQVMsRUFBRSxXQUFXLEdBQUcsR0FBRzs7RUFFM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7O0VBR3hCLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7RUFFdkMsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsS0FBSyxFQUFFLFdBQVcsR0FBRyxHQUFHOztFQUV2QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztFQUV4QixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxZQUFZLEVBQUUsV0FBVyxNQUFNLEdBQUc7OztFQUdqQyxLQUFLLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxPQUFPLElBQUksQ0FBQzs7RUFFbkMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7RUFFeEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNwRixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3BGLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDcEYsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNwRixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3JGLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0VBRXJGLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUMxRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDMUYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQzFGLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUs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LEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDbkUsSUFBSSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUV2RSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN2RixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN2RixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN2RixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN2RixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN4RixNQUFNLEVBQUUsQ0FBQyxF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Q0FBQyxHQUFHLENBQUMsQ0FBQztHQUM5QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0dBQzFCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0dBQzFELE9BQU8sQ0FBQyxDQUFDOztHQUVUOztFQUVELE9BQU8sU0FBUyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7OztHQUdqQyxDQUFDLEdBQUcsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDbEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUMzQixDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUUzQixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUc7O0lBRWQsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztJQUU3QixNQUFNOztJQUVOLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNyRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDOztJQUV0QixJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM1QixJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0lBRXBDOztHQUVELE9BQU8sSUFBSSxDQUFDOztHQUVaLENBQUM7O0VBRUYsRUFBRTs7Q0FFSCxRQUFRLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRTVCLFNBQVMsV0FBVyxFQUFFLE1BQU0sR0FBRzs7R0FFOUIsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHLE9BQU87O0dBRW5DLEtBQUssVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRzs7SUFFL0IsT0FBTyxDQUFDLElBQUksRUFBRSxrQ0FBa0MsR0FBRyxLQUFLLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQzs7SUFFakY7O0dBRUQ7OztFQUdELElBQUksQ0FBQyxDQUFDOztFQUVOLEtBQUssQ0FBQyxHQUFHLGlDQUFpQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRzs7OztHQUkxRCxJQUFJLEtBQUssQ0FBQztHQUNWLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNsQixJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRXhCLFNBQVMsSUFBSTs7SUFFWixLQUFLLEtBQUssQ0FBQztJQUNYLEtBQUssTUFBTTs7S0FFVixLQUFLLEtBQUssR0FBRywrREFBK0QsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUc7OztNQUdqRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7TUFDM0QsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO01BQzNELElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7TUFFM0QsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztNQUUxQixPQUFPLElBQUksQ0FBQzs7TUFFWjs7S0FFRCxLQUFLLEtBQUssR0FBRyxxRUFBcUUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUc7OztNQUd2RyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7TUFDM0QsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO01BQzNELElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7TUFFM0QsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztNQUUxQixPQUFPLElBQUksQ0FBQzs7TUFFWjs7S0FFRCxNQUFNOztJQUVQLEtBQUssS0FBSyxDQUFDO0lBQ1gsS0FBSyxNQUFNOztLQUVWLEtBQUssS0FBSyxHQUFHLCtFQUErRSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRzs7O01BR2pILElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7TUFDdkMsSUFBSSxDQUFDLEdBQUcsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7TUFDekMsSUFBSSxDQUFDLEdBQUcsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7O01BRXpDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7TUFFMUIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O01BRTlCOztLQUVELE1BQU07O0lBRVA7O0dBRUQsTUFBTSxLQUFLLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUc7Ozs7R0FJcEQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ2pCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7O0dBRXRCLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRzs7O0lBR2pCLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDakUsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUNqRSxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxF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S0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztHQUUzQixPQUFPLENBQUMsSUFBSSxFQUFFLCtDQUErQyxFQUFFLENBQUM7R0FDaEUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFOUI7O0VBRUQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzs7RUFFdkMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzlCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFOUIsSUFBSSxHQUFHLEVBQUUsVUFBVSxDQUFDO0VBQ3BCLElBQUksU0FBUyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUM7O0VBRXBDLEtBQUssR0FBRyxLQUFLLEdBQUcsR0FBRzs7R0FFbEIsR0FBRyxHQUFHLENBQUMsQ0FBQztHQUNSLFVBQVUsR0FBRyxDQUFDLENBQUM7O0dBRWYsTUFBTTs7R0FFTixJQUFJLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztHQUV0QixVQUFVLEdBQUcsU0FBUyxJQUFJLEdBQUcsR0FBRyxLQUFLLEtBQUssR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDOztHQUVsRixTQUFTLEdBQUc7O0lBRVgsS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNO0lBQzNE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Q0FBQyxDQUFDLEVBQUUsQ0FBQztFQUN6QyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUV6QyxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxRQUFRLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRTVCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztFQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDOztFQUVsQixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxjQUFjLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRTlCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ1osSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDWixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7RUFFWixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxJQUFJLEVBQUUsV0FBVyxLQUFLLEVBQUUsS0FBSyxHQUFHOztFQUUvQixJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQztFQUN2QyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQztFQUN2QyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQzs7RUFFdkMsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsTUFBTSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUV0QixPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENB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RSxDQUFDOztJQUV2QixFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDN0IsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzdCLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7SUFFN0IsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDeEIsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDeEIsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQzs7SUFFZixRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUM3QixRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUM3QixRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7SUFFN0I7O0dBRUQsTUFBTTs7R0FFTixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7R0FFMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUVuRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7SUFFdkIsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3RDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN0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QkFBb0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDOzs7QUFHbEUsU0FBUyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsR0FBRzs7Q0FFN0QsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUU3RTs7QUFFRCxxQkFBcUIsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDN0UscUJBQXFCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQzs7O0FBR3BFLFNBQVMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEdBQUc7O0NBRTVELGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFNUU7O0FBRUQsb0JBQW9CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQzVFLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUM7OztBQUdsRSxTQUFTLHFCQUFxQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxHQUFHOztDQUU3RCxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRTdFOztBQUVELHFCQUFxQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUM3RSxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLHFCQUFxQixDQUFDOzs7QUFHcEUsU0FBUyxzQkFBc0IsRUFBRSxL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Q0FBQyxHQUFHOztLQUUxQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7O0tBRW5DOztJQUVELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0tBRW5ELElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7S0FFeEIsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztLQUN4QixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOztLQUV4QixNQUFNLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxFQUFFLEdBQUcsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O01BRXpELEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztNQUMxQixFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7TUFDMUIsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztNQUUxQixFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztNQUM5QixFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztNQUM5QixFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7TUFFOUIsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7TUFDeEIsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7TUFDeEIsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQzs7TUFFZixPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztNQUN0QixPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDMUIsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOztNQUUxQixPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztNQUN0QixPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDMUIsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOztNQUUxQixPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztNQUN0QixPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDMUIsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOztNQUUxQjs7S0FFRDs7SUFFRCxNQUFNOzs7O0lBSU4sTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztLQUV4RCxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztLQUM3QixFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7S0FDakMsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztLQUVqQyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztLQUN4QixFQUFFLENBQUMsVUFBVSxF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QUNELENBQUM7Ozs7RUFJRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3RCLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQzlDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0VBRTdFLEtBQUssSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEdBQUc7O0dBRXBDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7O0dBRWpDLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxHQUFHOztJQUU3QixLQUFLLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSyxTQUFTLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7SUFFdkU7O0dBRUQsT0FBTyxJQUFJLENBQUM7O0dBRVo7O0VBRUQsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFL0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7RUFFdkIsS0FBSyxLQUFLLEtBQUssSUFBSSxHQUFHOztHQUVyQixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDOztHQUV0RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRztJQUNqQixJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSTtJQUNsQyxLQUFLLEVBQUUsS0FBSztJQUNaLENBQUM7O0dBRUY7O0VBRUQs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Q0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDOztFQUVsSCxLQUFLLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7RUFDOUcsS0FBSyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDOztFQUU5RyxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUc7O0dBRTNDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0dBQzlDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzs7R0FFdEM7O0VBRUQsS0FBSyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHOztHQUVyRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQzs7R0FFeEQ7O0VBRUQsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDckQsS0FBSyxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7O0VBRXRGLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxjQUFjLEdBQUcsSUFBSSxD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QUFFLEVBQUUsRUFBRSxDQUFDO01BQ3hDLE9BQU8sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztNQUUvQzs7S0FFRCxNQUFNOztLQUVOLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxHQUFHOzs7O01BSXJCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO01BQ2pELEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7TUFDckYsT0FBTyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O01BRS9DLE1BQU0sS0FBSyxFQUFFLElBQUksTUFBTSxHQUFHOzs7O01BSTFCLEVBQUUsR0FBRyxDQUFDLENBQUM7TUFDUCxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7TUFDMUQsT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7TUFFbkMsTUFBTTs7OztNQUlOLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUcsR0FBRyxTQUFTLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztNQUMvQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQztNQUNuRixPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7TUFFL0M7O0tBRUQ7O0lBRUQsTUFBTTs7OztJQUlOLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzNDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUN4QyxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7SUFFL0M7O0dBRUQsS0FBSyxrQkFBa0IsR0FBRzs7SUFFekIsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7SUFFbEY7O0dBRUQsS0FBSyxzQkFBc0IsR0FBRzs7SUFFN0Isc0JBQXNCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7O0lBRTVFOztHQUVELE9BQU8sT0FBTyxDQUFDOztHQUVmLENBQUM7O0VBRUYsRUFBRTs7Q0FFSCxlQUFlLEVBQUUsWUFBWTs7RUFFNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7RUFFdkIsT0FBTyxTQUFTLGVBQWUsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOztHQUVqRCxFQUFFLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0dBQzVDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0dBQ25DLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztHQUNsQyxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7O0dBRTVDLEtBQUssRUFBRSxHQUFHLE9BQU8sR0FBRyxPQUFPLElBQUksQ0FBQzs7R0FFaEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLENBQUM7OztHQUdwQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOzs7R0FHbkIsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7O0dBR25CLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLE9BQU8sSUFBSSxDQUFDOzs7OztHQUtwQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsT0FBTyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7O0dBRzNDLE9BQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7O0dBRTdCLENBQUM7O0VBRUYsRUFBRTs7Q0FFSCxnQkFBZ0IsRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFckMsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDOztFQUU5RDs7Q0FFRCxlQUFlLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRW5DLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7RUFFckQsS0FBSyxXQUFXLEtBQUssQ0FBQyxHQUFHOzs7R0FHeEIsS0FBSyxLQUFLLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUc7O0lBRWpELE9BQU8sQ0FBQyxDQUFDOztJQUVUOzs7O0dBSUQsT0FBTyxJQUFJLENBQUM7O0dBRVo7O0VBRUQsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLFdBQVcsQ0FBQzs7OztFQUk3RSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzs7RUFFekI7O0NBRUQsY0FBYyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7RUFFMUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFdEMsS0FBSyxDQUFDLEtBQUssSUFBSSxHQUFHOztHQUVqQixPQUFPLElBQUksQ0FBQzs7R0FFWjs7RUFFRCxPQUFPLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUU1Qjs7Q0FFRCxlQUFlLEVBQUUsV0FBVyxLQUFLLEdBQUc7Ozs7RUFJbkMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRXZELEtBQUssV0FBVyxLQUFLLENBQUMsR0FBRzs7R0FFeEIsT0FBTyxJQUFJLENBQUM7O0dBRVo7O0VBRUQsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDOztFQUVyRCxLQUFLLFdBQVcsR0FBRyxXQUFXLEdBQUcsQ0FBQyxHQUFHOztHQUVwQyxPQUFPLElBQUksQ0FBQzs7R0FFWjs7OztFQUlELE9BQU8sS0FBSyxDQUFDOztFQUViOztDQUVELFlBQVksRUFBRSxXQUFXLEdBQUcsRUFBRSxNQUFNLEdBQUc7O0VBRXRDLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7O0VBRTNDLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7R0FDakMsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7R0FDOUIsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzs7RUFFaEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7RUFFekIsS0FBSyxPQUFPLElBQUksQ0FBQyxHQUFHOztHQUVuQixJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztHQUMxQyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7R0FFMUMsTUFBTTs7R0FFTixJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztHQUMxQyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7R0FFMUM7O0VBRUQsS0FBSyxPQUFPLElBQUksQ0FBQyxHQUFHOztHQUVuQixLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztHQUMzQyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7R0FFM0MsTUFBTTs7R0FFTixLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztHQUMzQyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7R0FFM0M7O0VBRUQsS0FBSyxFQUFFLElBQUksR0FBRyxLQUFLLFFBQVEsS0FBSyxHQUFHLElBQUksRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOzs7OztFQUt4RCxLQUFLLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztFQUVsRCxLQUFLLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztFQUVsRCxLQUFLLE9BQU8sSUFBSSxDQUFDLEdBQUc7O0dBRW5CLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO0dBQzNDLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztHQUUzQyxNQUFNOztHQUVOLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO0dBQzNDLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztHQUUzQzs7RUFFRCxLQUFLLEVBQUUsSUFBSSxHQUFHLEtBQUssUUFBUSxLQUFLLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxJQUFJLENBQUM7O0VBRXhELEtBQUssS0FBSyxHQUFHLElBQUksSUFB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QUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHOztHQUVyRSxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7R0FFekMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7R0FDakIsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7R0FDakIsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0dBRWpCOztFQUVELE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsR0FBRzs7RUFFL0IsS0FBSyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRzs7R0FFckUsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0dBRXpDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ2pCLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ2pCLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztHQUVqQjs7RUFFRCxNQUFNOztFQUVOLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPOztFQUV0QyxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTlCLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRXRCOztDQUVEOztBQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTdCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7O0NBRXZCLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0VBRXhCLEtBQUssS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUc7O0dBRTNGLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0dBRTlDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ2pCLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ2pCLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ2pCLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztHQUVqQjs7RUFFRCxNQUFNOztFQUVOLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPOztFQUV0QyxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTlCLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRXRCOztDQUVEOzs7O0FBSUQsU0FBUyxX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QUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0NBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7O0NBRWpCLElBQUksS0FBSyxHQUFHLGFBQWEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXpDLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0VBRTVDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztFQUNsQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUUxQjs7Q0FFRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztFQUVoQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0VBRTVEOztDQUVEOztBQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxHQUFHOztDQUV2QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0NBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7O0NBRWpCLElBQUksS0FBSyxHQUFHLGFBQWEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXpDLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0VBRTVDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztFQUNsQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUUxQjs7Q0FFRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxH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LElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFOUQsSUFBSSxjQUFjLEdBQUc7RUFDcEIsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDeEUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUMxRSxDQUFDOztDQUVGLElBQUksT0FBTyxHQUFHO0VBQ2IsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ3RFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0VBQ3hFLENBQUM7O0NBRUYsSUFBSSxlQUFlLEdBQUc7RUFDckIsSUFBSSxPQUFPLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxFQUFFLElBQUksT0FBTyxFQUFFO0VBQzNDLElBQUksT0FBTyxFQUFFLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFB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QUVyQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDOztFQUVsQyxLQUFLLFFBQVEsQ0FBQyxHQUFHLEtBQUssSUFBSSxHQUFHOztHQUU1QixLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxHQUFHOztJQUU3QyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDOztJQUU1Qjs7R0FFRCxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7R0FFdkQ7O0VBRUQ7O0NBRUQsU0FBUyxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztFQUVyRCxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0VBQ3hDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7RUFDMUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztFQUM1QyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDOztFQUVsQyxLQUFLLFFBQVEsQ0FBQyxHQUFHLEtBQUssSUFBSSxHQUFHOztHQUU1QixLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxHQUFHOztJQUU3QyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDOztJQUU1Qjs7R0FFRCxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7R0FFdkQ7O0VBRUQ7O0NBRUQsU0FBUyxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHOztFQUU1QyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDOztFQUVwQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUc7O0dBRWhCLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7R0FDbEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7R0FFaEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxTQUFTLEdBQUc7O0dBRTNCLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7O0dBRXhDOztFQUVEOztDQUVELFNBQVMsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7RUFFckQsS0FBSyxRQUFRLENBQUMsV0FBVyxHQUFHOztHQUUzQixRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztHQUVsRDs7RUFFRDs7Q0FFRCxTQUFTLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0VBRW5ELFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7RUFDNUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDOztFQUVoRSxLQUFLLFFBQVEsQ0FBQyxXQUFXLEdBQUc7O0dBRTNCLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7O0dBRWxEOztFQUVELEtBQUssUUFBUSxDQUFDLE9BQU8sR0FBRzs7R0FFdkIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztHQUMxQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO0dBQzlDLEtBQUssUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7O0dBRWxFOztFQUVELEtBQUssUUFBUSxDQUFDLFNBQVMsR0FBRzs7R0FFekIsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztHQUM5QyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0dBQ3hELEtBQUssUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7O0dBRXRFOztFQUVELEtBQUssUUFBUSxDQUFDLGVBQWUsR0FBRzs7R0FFL0IsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztHQUMxRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztHQUM5RCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQzs7R0FFNUQ7O0VBRUQ7O0NBRUQsU0FBUyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztFQUVsRCxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRTNDLEtBQUssUUFBUSxDQUFDLFdBQVcsR0FBRzs7R0FFM0IsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQzs7R0FFbEQ7O0VBRUQ7O0NBRUQsU0FBUyx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztFQUV0RCxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO0VBQzlDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7O0VBRTlDLEtBQUssUUFBUSxDQUFDLFlBQVksR0FBRzs7R0FFNUIsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQzs7R0FFcEQ7O0VBRUQsS0FBSyxRQUFRLENBQUMsWUFBWSxHQUFHOztHQUU1QixRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDOztHQUVwRDs7RUFFRCxLQUFLLFFBQVEsQ0FBQyxXQUFXLEdBQUc7O0dBRTNCLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7O0dBRWxEOztFQUVELEtBQUssUUFBUSxDQUFDLE9BQU8sR0FBRzs7R0FFdkIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztHQUMxQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO0dBQzlDLEtBQUssUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7O0dBRWxFOztFQUVELEtBQUssUUFBUSxDQUFDLFNBQVMsR0FBRzs7R0FFekIsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztHQUM5QyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0dBQ3hELEtBQUssUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7O0dBRXRFOztFQUVELEtBQUssUUFBUSxDQUFDLGVBQWUsR0FBRzs7R0FFL0IsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztHQUMxRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztHQUM5RCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQzs7R0FFNUQ7O0VBRUQsS0FBSyxRQUFRLENBQUMsTUFBTSxHQUFHOzs7R0FHdEIsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQzs7R0FFMUQ7O0VBRUQ7O0NBRUQsU0FBUyx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztFQUV0RCx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRTlDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7O0VBRXBELFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7RUFDOUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUM7O0VBRWhFOztDQUVELFNBQVMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7RUFFbkQsS0FBSyxRQUFRLENBQUMsZUFBZSxHQUFHOztHQUUvQixRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO0dBQzFELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0dBQzlELFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDOztHQUU1RDs7RUFFRDs7Q0FFRCxTQUFTLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0VBRXRELEtBQUssUUFBUSxDQUFDLGVBQWUsR0FBRzs7R0FFL0IsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztHQUMxRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztHQUM5RCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQzs7R0FFNUQ7O0VBRUQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7RUFDcEUsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztFQUNwRCxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztFQUVsRDs7Q0FFRCxTQUFTLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0VBRXBELEtBQUssUUFBUSxDQUFDLE9BQU8sR0FBRzs7R0FFdkIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztHQUMxQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO0dBQzlDLEtBQUssUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7O0dBRWxFOztFQUVELEtBQUssUUFBUSxDQUFDLFNBQVMsR0FBRzs7R0FFekIsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztHQUM5QyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0dBQ3hELEtBQUssUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7O0dBRXRFOztFQUVELEtBQUssUUFBUSxDQUFDLGVBQWUsR0FBRzs7R0FFL0IsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztHQUMxRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztHQUM5RCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQzs7R0FFNUQ7O0VBRUQ7Ozs7Q0FJRCxTQUFTLDZCQUE2QixFQUFFLFFBQVEsRUFBRSxLQUFLLEdBQUc7O0VBRXpELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDOztFQUUvQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztFQUMvQyxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7RUFDekMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0VBQ3hDLFFBQVEsQ0FBQyxjQUFjLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztFQUM1QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7RUFFOUM7Ozs7Q0FJRCxTQUFTLGdCQUFnQixHQUFHOztFQUUzQixJQUFJLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQzs7RUFFcEMsS0FBSyxXQUFXLElBQUksWUFBWSxDQUFDLFdBQVcsR0FBRzs7R0FFOUMsT0FBTyxDQUFDLElBQUksRUFBRSxxQ0FBcUMsR0FBRyxXQUFXLEdBQUcsOENBQThDLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDOztHQUVoSjs7RUFFRCxpQkFBaUIsSUFBSSxDQUFDLENBQUM7O0VBRXZCLE9BQU8sV0FBVyxDQUFDOztFQUVuQjs7Q0FFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7OztDQUd6QyxJQUFJLENBQUMsWUFBWSxLQUFLLFlBQVk7O0VBRWpDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQzs7O0VBR25CLE9BQU8sU0FBUyxZQUFZLEVBQUUsT0FBTyxFQUFFLElBQUksR0FBRzs7R0FFN0MsS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLG1CQUFtQixHQUFHOztJQUU3QyxLQUFLLEVBQUUsTUFBTSxHQUFHOztLQUVmLE9BQU8sQ0FBQyxJQUFJLEVBQUUsOEdBQThHLEVBQUUsQ0FBQztLQUMvSCxNQUFNLEdBQUcsSUFBSSxDQUFDOztLQUVkOztJQUVELE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDOztJQUUxQjs7R0FFRCxRQUFRLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7R0FFdkMsQ0FBQzs7RUFFRixFQUFFLEVBQUUsQ0FBQzs7Q0FFTixJQUFJLENBQUMsVUFBVSxLQUFLLFlBQVk7O0VBRS9CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQzs7RUFFbkIsT0FBTyxTQUFTLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxHQUFHOztHQUUzQyxLQUFLLEVBQUUsTUFBTSxHQUFHOztJQUVmLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMkVBQTJFLEVBQUUsQ0FBQztJQUM1RixNQUFNLEdBQUcsSUFBSSxDQUFDOztJQUVkOztHQUVELFFBQVEsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOztHQUV2QyxDQUFDOztFQUVGLEVBQUUsRUFBRSxDQUFDOztDQUVOLElBQUksQ0FBQyxjQUFjLEtBQUssWUFBWTs7RUFFbkMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDOztFQUVuQixPQUFPLFNBQVMsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLEdBQUc7OztHQUcvQyxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsdUJBQXVCLEdBQUc7O0lBRWpELEtBQUssRUFBRSxNQUFNLEdBQUc7O0tBRWYsT0FBTyxDQUFDLElBQUksRUFBRSxxSEFBcUgsRUFBRSxDQUFDO0tBQ3RJLE1BQU0sR0FBRyxJQUFJLENBQUM7O0tBRWQ7O0lBRUQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7O0lBRTFCOzs7O0dBSUQsS0FBSyxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUMsYUFBYTtNQUNwQyxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsR0FBRzs7Ozs7SUFLbkUsUUFBUSxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O0lBRXpDLE1BQU07Ozs7SUFJTixRQUFRLENBQUMscUJBQXFCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOztJQUVoRDs7R0FFRCxDQUFDOztFQUVGLEVBQUUsRUFBRSxDQUFDOzs7O0NBSU4sSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLEtBQUssR0FBRzs7RUFFeEMsWUFBWSxHQUFHLEtBQUssQ0FBQzs7RUFFckIsQ0FBQzs7Q0FFRixJQUFJLENBQUMsZUFBZSxHQUFHLFlBQVk7O0VBRWxDLE9BQU8sb0JBQW9CLENBQUM7O0VBRTVCLENBQUM7O0NBRUYsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLFlBQVksR0FBRzs7RUFFaEQsb0JBQW9CLEdBQUcsWUFBWSxDQUFDOztFQUVwQyxLQUFLLFlBQVksSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLGtCQUFrQixLQUFLLFNBQVMsR0FBRzs7R0FFdEYsUUFBUSxDQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBRSxDQUFDOztHQUUzQzs7RUFFRCxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUM7RUFDL0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDOztFQUVuQixLQUFLLFlBQVksR0FBRzs7R0FFbkIsSUFBSSxrQkFBa0IsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLGtCQUFrQixDQUFDOztHQUUzRSxLQUFLLFlBQVksQ0FBQyx1QkFBdUIsR0FBRzs7SUFFM0MsV0FBVyxHQUFHLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNoRSxNQUFNLEdBQUcsSUFBSSxDQUFDOztJQUVkLE1BQU07O0lBRU4sV0FBVyxHQUFHLGtCQUFrQixDQUFDOztJQUVqQzs7R0FFRCxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0dBQy9DLGVBQWUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0dBQzdDLG1CQUFtQixHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7O0dBRS9DLE1BQU07O0dBRU4sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBQztHQUNqRSxlQUFlLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBQztHQUMvRCxtQkFBbUIsR0FBRyxZQUFZLENBQUM7O0dBRW5DOztFQUVELEtBQUssbUJBQW1CLEtBQUssV0FBVyxHQUFHOztHQUUxQyxHQUFHLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUM7R0FDcEQsbUJBQW1CLEdBQUcsV0FBVyxDQUFDOztHQUVsQzs7RUFFRCxLQUFLLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUM7RUFDbkMsS0FBSyxDQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQztFQUNqQyxLQUFLLENBQUMsY0FBYyxFQUFFLG1CQUFtQixFQUFFLENBQUM7O0VBRTVDLEtBQUssTUFBTSxHQUFHOztHQUViLElBQUksaUJBQWlCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7R0FDL0QsR0FBRyxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQywyQkFBMkIsR0FBRyxZQUFZLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7R0FFcE07O0VBRUQsQ0FBQzs7Q0FFRixJQUFJLENBQUMsc0JBQXNCLEdBQUcsV0FBVyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7RUFFcEYsS0FBSyxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsR0FBRzs7R0FFN0QsT0FBTyxDQUFDLEtBQUssRUFBRSwwRkFBMEYsRUFBRSxDQUFDO0dBQzVHLE9BQU87O0dBRVA7O0VBRUQsSUFBSSxXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQzs7RUFFcEUsS0FBSyxXQUFXLEdBQUc7O0dBRWxCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQzs7R0FFcEIsS0FBSyxXQUFXLEtBQUssbUJBQW1CLEdBQUc7O0lBRTFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQzs7SUFFcEQsT0FBTyxHQUFHLElBQUksQ0FBQzs7SUFFZjs7R0FFRCxJQUFJOztJQUVILElBQUksT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUM7SUFDbkMsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUNuQyxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDOztJQUUvQixLQUFLLGFBQWEsS0FBSyxVQUFVLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHOztLQUVsSSxPQUFPLENBQUMsS0FBSyxFQUFFLDJHQUEyRyxFQUFFLENBQUM7S0FDN0gsT0FBTzs7S0FFUDs7SUFFRCxLQUFLLFdBQVcsS0FBSyxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLDhCQUE4QixFQUFFO0tBQy9ILElBQUksV0FBVyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUMsUUFBUSxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLDBCQUEwQixFQUFFLEVBQUUsRUFBRTtLQUNySixJQUFJLFdBQVcsS0FBSyxhQUFhLE1BQU0sWUFBWSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixFQUFFLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSw2QkFBNkIsRUFBRSxFQUFFLEVBQUUsR0FBRzs7S0FFbEssT0FBTyxDQUFDLEtBQUssRUFBRSxxSEFBcUgsRUFBRSxDQUFDO0tBQ3ZJLE9BQU87O0tBRVA7O0lBRUQsS0FBSyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxvQkFBb0IsR0FBRzs7OztLQUlqRixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sWUFBWSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxZQUFZLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRSxFQUFFLEdBQUc7O01BRS9HLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7TUFFNUc7O0tBRUQsTUFBTTs7S0FFTixPQUFPLENBQUMsS0FBSyxFQUFFLDRHQUE0RyxFQUFFLENBQUM7O0tBRTlIOztJQUVELFNBQVM7O0lBRVQsS0FBSyxPQUFPLEdBQUc7O0tBRWQsR0FBRyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFLENBQUM7O0tBRTVEOztJQUVEOztHQUVEOztFQUVELENBQUM7O0NBRUYsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFdBQVcsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEdBQUc7O0VBRXJFLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0VBQ2hDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0VBQ2xDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDOztFQUUvQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFaEMsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVyRyxDQUFDOztDQUVGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxXQUFXLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssR0FBRzs7RUFFaEYsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7RUFDbkMsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7RUFDckMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7RUFDbEQsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7O0VBRTlDLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVuQyxLQUFLLFVBQVUsQ0FBQyxhQUFhLEdBQUc7O0dBRS9CLEdBQUcsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7R0FFaEksTUFBTTs7R0FFTixHQUFHLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7O0dBRTVHOztFQUVELENBQUM7O0NBRUY7O0FDMWxGRDs7Ozs7QUFLQSxTQUFTLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxHQUFHOztDQUVsQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQzs7Q0FFZixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxPQUFPLEtBQUssU0FBUyxLQUFLLE9BQU8sR0FBRyxPQUFPLENBQUM7O0NBRTdEOztBQUVELE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzs7QUFFbkMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsWUFBWTs7Q0FFckMsT0FBTyxJQUFJLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFL0MsQ0FBQzs7QUFFRixPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyx3QkFBd0I7O0NBRWxELE9BQU87RUFDTixJQUFJLEVBQUUsU0FBUztFQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtFQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87RUFDckIsQ0FBQzs7Q0FFRixDQUFDOztBQzlCRjs7Ozs7QUFLQSxTQUFTLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRzs7Q0FFaEMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7O0NBRWYsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFaEMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxTQUFTLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQztDQUM5QyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxLQUFLLFNBQVMsS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDOztDQUU5Qzs7QUFFRCxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7O0FBRTNCLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFlBQVk7O0NBRWpDLE9BQU8sSUFBSSxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEQsQ0FBQzs7QUFFRixHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyx3QkFBd0I7O0NBRTlDLE9BQU87RUFDTixJQUFJLEVBQUUsS0FBSztFQUNYLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtFQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7RUFDZixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7RUFDYixDQUFDOztDQUVGLENBQUM7O0FDakNGOzs7O0FBSUEsU0FBUyxLQUFLLEdBQUc7O0NBRWhCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXRCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDOztDQUVwQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztDQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztDQUNoQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDOztDQUU3QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzs7Q0FFdkI7O0FBRUQsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFOztDQUVyRSxXQUFXLEVBQUUsS0FBSzs7Q0FFbEIsSUFBSSxFQUFFLFdBQVcsTUFBTSxFQUFFLFNBQVMsR0FBRzs7RUFFcEMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7O0VBRXhELEtBQUssTUFBTSxDQUFDLFVBQVUsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0VBQzlFLEtBQUssTUFBTSxDQUFDLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO0VBQ3pELEtBQUssTUFBTSxDQUFDLGdCQUFnQixLQUFLLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDOztFQUVoRyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7RUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQzs7RUFFaEQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsTUFBTSxFQUFFLFdBQVcsSUFBSSxHQUFHOztFQUV6QixJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUV4RCxLQUFLLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0VBQ3hGLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7RUFFN0QsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsRUFBRSxDQUFDOztBQ2pESjs7OztBQUlBLFNBQVMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFM0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Q0FDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFN0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Q0FDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDOztDQUVqQjs7QUFFRCxNQUFNLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUU7O0NBRWxFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFdkIsS0FBSyxLQUFLLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQzs7RUFFdEM7O0NBRUQsRUFBRSxDQUFDOztBQUVKLE1BQU0sQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsU0FBUyxFQUFFOztDQUUzQyxtQkFBbUIsRUFBRSxJQUFJOztDQUV6QixnQkFBZ0IsRUFBRSxZQUFZLEVBQUU7O0NBRWhDLFFBQVEsRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFNUIsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHOztHQUU3QixNQUFNLElBQUksU0FBUyxFQUFFLHVEQUF1RCxFQUFFLENBQUM7O0dBRS9FOztFQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQ2xFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOztFQUVuQixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxVQUFVLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRTlCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDOztFQUVyQixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxJQUFJLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRXpCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7RUFDMUQsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztFQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7O0VBRTlCLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELE1BQU0sRUFBRSxXQUFXLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxHQUFHOztFQUU5QyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztFQUN0QixNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQzs7RUFFM0IsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFL0MsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0dBRXpEOztFQUVELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELEdBQUcsRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0VBRS9CLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztFQUV2QyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRWhDLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELEtBQUssRUFBRSxZQUFZOztFQUVsQixPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFM0M7O0NBRUQsUUFBUSxFQUFFLFdBQVcsUUFBUSxHQUFHOztFQUUvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDOztFQUVqQyxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxFQUFFLENBQUM7O0FDMUdKOzs7O0FBSUEsU0FBUywwQkFBMEIsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsR0FBRzs7Q0FFdEYsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztDQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztDQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Q0FFckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLEtBQUssSUFBSSxDQUFDOztDQUV0Qzs7QUFFRCxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsMEJBQTBCLENBQUMsU0FBUyxFQUFFOztDQUU5RCxLQUFLLEVBQUU7O0VBRU4sR0FBRyxFQUFFLFlBQVk7O0dBRWhCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7O0dBRXZCOztFQUVEOztDQUVELEtBQUssRUFBRTs7RUFFTixHQUFHLEVBQUUsWUFBWTs7R0FFaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzs7R0FFdkI7O0VBRUQ7O0NBRUQsRUFBRSxDQUFDOztBQUVKLE1BQU0sQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLENBQUMsU0FBUyxFQUFFOztDQUVwRCw0QkFBNEIsRUFBRSxJQUFJOztDQUVsQyxJQUFJLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxHQUFHOztFQUUzQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFOUQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsSUFBSSxFQUFFLFdBQVcsS0FBSyxFQUFFLENBQUMsR0FBRzs7RUFFM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVsRSxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxJQUFJLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxHQUFHOztFQUUzQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRWxFLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELElBQUksRUFBRSxXQUFXLEtBQUssRUFBRSxDQUFDLEdBQUc7O0VBRTNCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFbEUsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsSUFBSSxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUV4QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRWpFOztDQUVELElBQUksRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFckU7O0NBRUQsSUFBSSxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUV4QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOztFQUVyRTs7Q0FFRCxJQUFJLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRXhCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXJFOztDQUVELEtBQUssRUFBRSxXQUFXLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUUvQixLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0VBRS9DLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFakMsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsTUFBTSxFQUFFLFdBQVcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUVuQyxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0VBRS9DLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVqQyxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxPQUFPLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUV2QyxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0VBRS9DLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRWpDLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELEVBQUUsQ0FBQzs7QUNwSUo7Ozs7Ozs7Ozs7Ozs7QUFhQSxTQUFTLGNBQWMsRUFBRSxVQUFVLEdBQUc7O0NBRXJDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXRCLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7O0NBRTdCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDbkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7O0NBRWhCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDOztDQUVsQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztDQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFeEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFN0I7O0FBRUQsY0FBYyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUMvRCxjQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7QUFDdEQsY0FBYyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7O0FBRWpELGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVcsTUFBTSxHQUFHOztDQUVuRCxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUU3QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDaEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDOztDQUV0QixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0NBRWhDLE9BQU8sSUFBSSxDQUFDOztDQUVaLENBQUM7O0FDakRGOzs7O0FBSUEsQUFTQTtBQUNBLElBQUksUUFBUSxDQUFDOztBQUViLFNBQVMsTUFBTSxFQUFFLFFBQVEsR0FBRzs7Q0FFM0IsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7O0NBRXJCLEtBQUssUUFBUSxLQUFLLFNBQVMsR0FBRzs7RUFFN0IsUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7O0VBRWhDLElBQUksWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFO0dBQ3BDLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNyQixHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ25CLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ2pCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDbkIsRUFBRSxDQUFDOztFQUVKLElBQUksaUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWpFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDMUMsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSwwQkFBMEIsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7RUFDdEcsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSwwQkFBMEIsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7O0VBRWhHOztDQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0NBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxRQUFRLEtBQUssU0FBUyxLQUFLLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDOztDQUU3RSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFdEM7O0FBRUQsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFOztDQUV0RSxXQUFXLEVBQUUsTUFBTTs7Q0FFbkIsUUFBUSxFQUFFLElBQUk7O0NBRWQsT0FBTyxJQUFJLFlBQVk7O0VBRXRCLElBQUksY0FBYyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7RUFDbkMsSUFBSSxVQUFVLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztFQUMvQixJQUFJLFVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztFQUUvQixJQUFJLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0VBQ3BDLElBQUksZUFBZSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7RUFDcEMsSUFBSSxlQUFlLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7RUFFcEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztFQUN2QixJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0VBQ3ZCLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0VBRXZCLFNBQVMsZUFBZSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOzs7R0FHL0UsZUFBZSxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7O0dBR3hGLEtBQUssR0FBRyxLQUFLLFNBQVMsR0FBRzs7SUFFeEIsZUFBZSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxlQUFlLENBQUMsQ0FBQyxPQUFPLEdBQUcsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUUsZUFBZSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxlQUFlLENBQUMsQ0FBQyxPQUFPLEdBQUcsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUM7O0lBRTlFLE1BQU07O0lBRU4sZUFBZSxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQzs7SUFFeEM7OztHQUdELGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7R0FDbEMsY0FBYyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDO0dBQ3RDLGNBQWMsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQzs7O0dBR3RDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLENBQUM7O0dBRS9DOztFQUVELE9BQU8sU0FBUyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsR0FBRzs7R0FFaEQsVUFBVSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztHQUNsRCxlQUFlLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0dBQ25GLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7O0dBRXpELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0dBQ3RDLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQztHQUNiLEtBQUssUUFBUSxLQUFLLENBQUMsR0FBRzs7SUFFckIsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDM0IsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0lBRTNCOztHQUVELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0dBRXpCLGVBQWUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN2RixlQUFlLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3JGLGVBQWUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOzs7R0FHbkYsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7O0dBRXJGLEtBQUssU0FBUyxLQUFLLElBQUksR0FBRzs7O0lBR3pCLGVBQWUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDckYsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxDQUFDO0lBQ2pGLEtBQUssU0FBUyxLQUFLLElBQUksR0FBRzs7S0FFekIsT0FBTzs7S0FFUDs7SUFFRDs7R0FFRCxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLENBQUM7O0dBRWpFLEtBQUssUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUcsT0FBTzs7R0FFcEUsVUFBVSxDQUFDLElBQUksRUFBRTs7SUFFaEIsUUFBUSxFQUFFLFFBQVE7SUFDbEIsS0FBSyxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUU7SUFDN0IsSUFBSSxFQUFFLElBQUk7SUFDVixNQUFNLEVBQUUsSUFBSTs7SUFFWixFQUFFLENBQUM7O0dBRUosQ0FBQzs7RUFFRixFQUFFLEVBQUU7O0NBRUwsS0FBSyxFQUFFLFlBQVk7O0VBRWxCLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTFEOztDQUVELElBQUksRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFekIsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFN0MsS0FBSyxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRXJFLE9BQU8sSUFBSSxDQUFDOztFQUVaOzs7Q0FHRCxFQUFFLENBQUM7O0FDbktKOzs7Ozs7QUFNQSxTQUFTLEdBQUcsR0FBRzs7Q0FFZCxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV0QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQzs7Q0FFbEIsTUFBTSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRTtFQUM5QixNQUFNLEVBQUU7R0FDUCxVQUFVLEVBQUUsSUFBSTtHQUNoQixLQUFLLEVBQUUsRUFBRTtHQUNUO0VBQ0QsRUFBRSxDQUFDOztDQUVKOztBQUVELEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFbkUsV0FBVyxFQUFFLEdBQUc7O0NBRWhCLElBQUksRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFekIsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRXBELElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7O0VBRTNCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRWpELElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFeEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7R0FFdEQ7O0VBRUQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsUUFBUSxFQUFFLFdBQVcsTUFBTSxFQUFFLFFBQVEsR0FBRzs7RUFFdkMsS0FBSyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7O0VBRTNDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUVoQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztFQUV6QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFMUMsS0FBSyxRQUFRLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRzs7SUFFdEMsTUFBTTs7SUFFTjs7R0FFRDs7RUFFRCxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDOztFQUU5RCxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUVuQjs7Q0FFRCxvQkFBb0IsRUFBRSxXQUFXLFFBQVEsR0FBRzs7RUFFM0MsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7RUFFekIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFakQsS0FBSyxRQUFRLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRzs7SUFFdEMsTUFBTTs7SUFFTjs7R0FFRDs7RUFFRCxPQUFPLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDOztFQUU5Qjs7Q0FFRCxPQUFPLElBQUksWUFBWTs7RUFFdEIsSUFBSSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7RUFFbkMsT0FBTyxTQUFTLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxHQUFHOztHQUVoRCxjQUFjLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztHQUV6RCxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLENBQUM7O0dBRWpFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztHQUV2RSxDQUFDOztFQUVGLEVBQUUsRUFBRTs7Q0FFTCxNQUFNLEVBQUUsWUFBWTs7RUFFbkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztFQUN2QixJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztFQUV2QixPQUFPLFNBQVMsTUFBTSxFQUFFLE1BQU0sR0FBRzs7R0FFaEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7R0FFekIsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7SUFFeEIsRUFBRSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMvQyxFQUFFLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztJQUU3QyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDOztJQUVuQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7O0lBRWxDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0tBRWpELEtBQUssUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUc7O01BRXZDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7TUFDdkMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDOztNQUVsQyxNQUFNOztNQUVOLE1BQU07O01BRU47O0tBRUQ7O0lBRUQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztLQUVyQixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7O0tBRW5DOztJQUVEOztHQUVELENBQUM7O0VBRUYsRUFBRTs7Q0FFSCxNQUFNLEVBQUUsV0FBVyxJQUFJLEdBQUc7O0VBRXpCLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXhELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7RUFFeEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7RUFFekIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFakQsSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV4QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7SUFDeEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSTtJQUN6QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7SUFDeEIsRUFBRSxDQUFDOztHQUVKOztFQUVELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELEVBQUUsQ0FBQzs7QUMxS0o7Ozs7Ozs7QUFPQSxTQUFTLFFBQVEsRUFBRSxLQUFLLEVBQUUsWUFBWSxHQUFHOzs7O0NBSXhDLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDOztDQUVwQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQzs7OztDQUkvRCxLQUFLLFlBQVksS0FBSyxTQUFTLEdBQUc7O0VBRWpDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztFQUV6QixNQUFNOztFQUVOLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLE1BQU0sR0FBRzs7R0FFaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUU1QyxNQUFNOztHQUVOLE9BQU8sQ0FBQyxJQUFJLEVBQUUsa0RBQWtELEVBQUUsQ0FBQzs7R0FFbkUsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7O0dBRXZCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUV2RCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxFQUFFLENBQUM7O0lBRXhDOztHQUVEOztFQUVEOztDQUVEOztBQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRTs7Q0FFbEMsaUJBQWlCLEVBQUUsWUFBWTs7RUFFOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7O0VBRXZCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUV2RCxJQUFJLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztHQUU1QixLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUc7O0lBRXRCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7SUFFbEQ7O0dBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0dBRWxDOztFQUVEOztDQUVELElBQUksRUFBRSxZQUFZOztFQUVqQixJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOzs7O0VBSWhCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFbkQsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRXZCLEtBQUssSUFBSSxHQUFHOztJQUVYLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7SUFFdEQ7O0dBRUQ7Ozs7RUFJRCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRW5ELElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV2QixLQUFLLElBQUksR0FBRzs7SUFFWCxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUc7O0tBRXhDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztLQUV6QyxNQUFNOztLQUVOLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7S0FFckM7O0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7SUFFcEU7O0dBRUQ7O0VBRUQ7O0NBRUQsTUFBTSxFQUFFLEVBQUUsWUFBWTs7RUFFckIsSUFBSSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztFQUNqQyxJQUFJLGNBQWMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztFQUVuQyxPQUFPLFNBQVMsTUFBTSxHQUFHOztHQUV4QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0dBQ3ZCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7R0FDckMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztHQUNyQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDOzs7O0dBSW5DLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7Ozs7SUFJbEQsSUFBSSxNQUFNLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDOztJQUVsRSxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQzNELFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7SUFFN0M7O0dBRUQsS0FBSyxXQUFXLEtBQUssU0FBUyxHQUFHOztJQUVoQyxXQUFXLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7SUFFL0I7O0dBRUQsQ0FBQzs7RUFFRixJQUFJOztDQUVMLEtBQUssRUFBRSxZQUFZOztFQUVsQixPQUFPLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztFQUVyRDs7Q0FFRCxhQUFhLEVBQUUsV0FBVyxJQUFJLEdBQUc7O0VBRWhDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUV2RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUUzQixLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxHQUFHOztJQUV6QixPQUFPLElBQUksQ0FBQzs7SUFFWjs7R0FFRDs7RUFFRCxPQUFPLFNBQVMsQ0FBQzs7RUFFakI7O0NBRUQsRUFBRSxDQUFDOztBQzVLSjs7Ozs7O0FBTUEsU0FBUyxJQUFJLEdBQUc7O0NBRWYsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7O0NBRW5COztBQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFcEUsV0FBVyxFQUFFLElBQUk7O0NBRWpCLE1BQU0sRUFBRSxJQUFJOztDQUVaLEVBQUUsQ0FBQzs7QUNoQko7Ozs7OztBQU1BLFNBQVMsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0NBRTFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFdEMsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7O0NBRTFCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0NBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFdkMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQzdCLElBQUksUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVyQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRXhDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDOztDQUU1Qjs7QUFFRCxXQUFXLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7O0NBRXZFLFdBQVcsRUFBRSxXQUFXOztDQUV4QixhQUFhLEVBQUUsSUFBSTs7Q0FFbkIsU0FBUyxFQUFFLFlBQVk7O0VBRXRCLElBQUksS0FBSyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO0VBQzVCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFVixLQUFLLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHOzs7O0dBSXpELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0lBRTVELEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7OztJQUlqQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNsQixLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOzs7O0lBSW5CLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hDLEtBQUssS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDOztJQUVqRTs7OztHQUlELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0lBRTVELEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7SUFFakMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLFFBQVEsS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUUsTUFBTSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLFNBQVMsRUFBRSxHQUFHOzs7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Q2pELElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDbEMsSUFBSSxNQUFNLENBQUM7Ozs7Q0FJWCxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxHQUFHOzs7O0VBSXRDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0VBRTNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUU1QyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRXRCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUUxQixLQUFLLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQzFCLEtBQUssR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3RDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNyQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7O0lBRXJDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7SUFFbEMsS0FBSyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssU0FBUyxHQUFHOztLQUVqQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7S0FFeEQ7O0lBRUQ7O0dBRUQ7Ozs7RUFJRCxNQUFNLEdBQUcsSUFBSSxLQUFLLEdBQUc7O0dBRXBCLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7O0dBRWpCLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQUN2QyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0dBRTlDLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQUN2QyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0dBRTlDOztFQUVELE1BQU0sS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLGdCQUFnQixHQUFHOztFQUVuRCxJQUFJLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO0VBQzlCLElBQUksS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7RUFDeEIsSUFBSSxNQUFNLEVBQUUsTUFBTSxDQUFDOztFQUVuQixNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7RUFFdkIsS0FBSyxRQUFRLENBQUMsS0FBSyxLQUFLLElBQUksR0FBRzs7OztHQUk5QixRQUFRLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7R0FDeEMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7R0FDekIsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0dBRXpCLEtBQUssTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUc7O0lBRTFCLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7SUFFbEU7Ozs7R0FJRCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRzs7SUFFL0MsS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7SUFFcEIsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDcEIsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7O0lBRXBCLE1BQU0sQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEtBQUssS0FBSyxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7S0FFdkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O01BRTFCLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztNQUM5QixLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO01BQzFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztNQUNyQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7O01BRXJDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7TUFFbEMsS0FBSyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssU0FBUyxHQUFHOztPQUVqQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7T0FFeEQ7O01BRUQ7O0tBRUQ7O0lBRUQ7Ozs7R0FJRCxNQUFNLEdBQUcsSUFBSSxLQUFLLEdBQUc7O0lBRXBCLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7O0lBRWpCLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2pELFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7SUFFOUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDakQsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztJQUU5Qzs7R0FFRCxNQUFNOzs7O0dBSU4sUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOztHQUV4QyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7SUFFdEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7Ozs7O0tBSzFCLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNuQixNQUFNLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO0tBQy9DLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7S0FFOUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0tBQ25DLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDL0MsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztLQUU5Qzs7SUFFRDs7R0FFRDs7RUFFRDs7OztDQUlELElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksc0JBQXNCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTNFOztBQUVELGlCQUFpQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN4RSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDOztBQy9LNUQ7Ozs7Ozs7QUFPQSxBQUtBOzs7QUFHQSxTQUFTLGtCQUFrQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUVuRCxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV0QixJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDOztDQUVqQyxJQUFJLENBQUMsVUFBVSxHQUFHO0VBQ2pCLElBQUksRUFBRSxJQUFJO0VBQ1YsTUFBTSxFQUFFLE1BQU07RUFDZCxNQUFNLEVBQUUsTUFBTTtFQUNkLENBQUM7O0NBRUYsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksd0JBQXdCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDO0NBQ2hGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7Q0FFckI7O0FBRUQsa0JBQWtCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ25FLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUM7Ozs7QUFJOUQsU0FBUyx3QkFBd0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFekQsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUIsSUFBSSxDQUFDLElBQUksR0FBRywwQkFBMEIsQ0FBQzs7Q0FFdkMsSUFBSSxDQUFDLFVBQVUsR0FBRztFQUNqQixJQUFJLEVBQUUsSUFBSTtFQUNWLE1BQU0sRUFBRSxNQUFNO0VBQ2QsTUFBTSxFQUFFLE1BQU07RUFDZCxDQUFDOzs7O0NBSUYsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0NBQ2pCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztDQUNsQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7Q0FDakIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDOztDQUViLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQzs7Q0FFbEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUMzQyxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUzQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7O0NBRVQsS0FBSyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7RUFFdEIsT0FBTyxDQUFDLEtBQUssRUFBRSxrRkFBa0YsRUFBRSxDQUFDOztFQUVwRzs7OztDQUlELElBQUksVUFBVSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRTVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVoQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDOztFQUVuQixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQzs7OztHQUluQixJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztHQUNqQixRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Ozs7OztHQU1sQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHOztJQUVuQixJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDdkIsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0lBRXhCLE1BQU07O0lBRU4sSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3ZCLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztJQUV4Qjs7R0FFRCxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHOztJQUVuQixJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDdkIsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0lBRXhCLE1BQU07O0lBRU4sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3ZCLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztJQUV4Qjs7OztHQUlELE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0dBQzFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7OztHQUk3QyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFakI7O0VBRUQ7Ozs7Q0FJRCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRS9CLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0dBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUMvQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDdkMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFVBQVUsR0FBRyxDQUFDLENBQUM7Ozs7R0FJbkMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ3hCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFeEI7O0VBRUQ7Ozs7Q0FJRCxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQ3pCLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksc0JBQXNCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDM0UsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN4RSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLHNCQUFzQixFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVoRTs7QUFFRCx3QkFBd0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDL0Usd0JBQXdCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyx3QkFBd0IsQ0FBQzs7QUMvSjFFOzs7Ozs7QUFNQSxBQU1BOzs7QUFHQSxTQUFTLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFaEUsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEIsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQzs7Q0FFakMsSUFBSSxDQUFDLFVBQVUsR0FBRztFQUNqQixRQUFRLEVBQUUsUUFBUTtFQUNsQixPQUFPLEVBQUUsT0FBTztFQUNoQixNQUFNLEVBQUUsTUFBTTtFQUNkLE1BQU0sRUFBRSxNQUFNO0VBQ2QsQ0FBQzs7Q0FFRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDO0NBQzdGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7Q0FFckI7O0FBRUQsa0JBQWtCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ25FLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUM7Ozs7QUFJOUQsU0FBUyx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRXRFLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTVCLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7O0NBRXZDLElBQUksQ0FBQyxVQUFVLEdBQUc7RUFDakIsUUFBUSxFQUFFLFFBQVE7RUFDbEIsT0FBTyxFQUFFLE9BQU87RUFDaEIsTUFBTSxFQUFFLE1BQU07RUFDZCxNQUFNLEVBQUUsTUFBTTtFQUNkLENBQUM7O0NBRUYsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUM7Q0FDckIsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUM7Ozs7Q0FJckIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0NBQ3RCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQzs7OztDQUlsQixTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7Ozs7Q0FJcEIsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDOzs7O0NBSXZCLFdBQVcsRUFBRSxDQUFDOzs7O0NBSWQsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUMvRSxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLHNCQUFzQixFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3JGLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksc0JBQXNCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXJFLEtBQUssTUFBTSxLQUFLLENBQUMsR0FBRzs7RUFFbkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7O0VBRTVCLE1BQU07O0VBRU4sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0VBRXhCOzs7O0NBSUQsU0FBUyxTQUFTLEVBQUUsTUFBTSxHQUFHOztFQUU1QixJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0VBQ3RCLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7RUFDdEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7OztFQUl0QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOzs7O0dBSTdDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDeEMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUN4QyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOzs7O0dBSXhDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7R0FFakM7O0VBRUQ7O0NBRUQsU0FBUyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxHQUFHOztFQUV6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7OztFQUlqQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7O0VBRVgsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7O0VBSVQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRTlCLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7O0dBRVosSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO0dBQ3ZDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQzs7R0FFdkMsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQzs7R0FFcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0lBRTlCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxHQUFHOztLQUU1QixDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOztLQUVqQixNQUFNOztLQUVOLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7O0tBRTlDOztJQUVEOztHQUVEOzs7O0VBSUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRTdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0lBRTdDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztJQUU1QixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHOztLQUVsQixVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0tBQzlCLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7S0FDOUIsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztLQUUxQixNQUFNOztLQUVOLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7S0FDOUIsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7S0FDbEMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7S0FFOUI7O0lBRUQ7O0dBRUQ7O0VBRUQ7O0NBRUQsU0FBUyxZQUFZLEVBQUUsTUFBTSxHQUFHOztFQUUvQixJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOzs7O0VBSTNCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0dBRWxELE1BQU0sQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztHQUNqQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7R0FDakMsTUFBTSxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztHQUVqQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDOztHQUU1QyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7R0FDakMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0dBQ2pDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQzs7R0FFakM7O0VBRUQ7O0NBRUQsU0FBUyxXQUFXLEdBQUc7O0VBRXRCLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0VBRTNCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0dBRWxELE1BQU0sQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztHQUNqQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7R0FDakMsTUFBTSxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztHQUVqQyxJQUFJLENBQUMsR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0dBQzlDLElBQUksQ0FBQyxHQUFHLFdBQVcsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztHQUM5QyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0dBRTFCOztFQUVELFVBQVUsRUFBRSxDQUFDOztFQUViLFdBQVcsRUFBRSxDQUFDOztFQUVkOztDQUVELFNBQVMsV0FBVyxHQUFHOzs7O0VBSXRCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7Ozs7R0FJOUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztHQUMzQixJQUFJLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0dBQzNCLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0dBRTNCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztHQUNqQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFB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LEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7R0FFaEQsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFdkQsSUFBSSxHQUFHLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztHQUU5QixTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ2hDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDaEMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7R0FFaEM7O0VBRUQ7O0NBRUQsU0FBUyxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxHQUFHOztFQUVqRCxLQUFLLEVBQUUsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHOztHQUV4QyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRTlCOztFQUVELEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHOztHQUUvQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7R0FFakQ7O0VBRUQ7Ozs7Q0FJRCxTQUFTLE9BQU8sRUFBRSxNQUFNLEdBQUc7O0VBRTFCLE9BQU8s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LEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUM1QyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztHQUM1QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUM5QyxDQUFDOztDQUVGLElBQUksT0FBTyxHQUFHO0dBQ1osQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0dBQ25ELENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNoRCxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDNUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQy9DLENBQUM7O0NBRUYsd0JBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFekUsSUFBSSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQzs7Q0FFeEMsSUFBSSxDQUFDLFVBQVUsR0FBRztFQUNqQixNQUFNLEVBQUUsTUFBTTtFQUNkLE1BQU0sRUFBRSxNQUFNO0VBQ2QsQ0FBQzs7Q0FFRjs7QUFFRCx5QkFBeUIsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUMxRix5QkFBeUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLHlCQUF5QixDQUFDOztBQzVENUU7Ozs7QUFJQSxBQUdBOzs7QUFHQSxTQUFTLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRS9DLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXRCLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7O0NBRW5DLElBQUksQ0FBQyxVQUFVLEdBQUc7RUFDakIsTUFBTSxFQUFFLE1BQU07RUFDZCxNQUFNLEVBQUUsTUFBTTtFQUNkLENBQUM7O0NBRUYsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksMEJBQTBCLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7Q0FDNUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUVyQjs7QUFFRCxvQkFBb0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDckUsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQzs7OztBQUlsRSxTQUFTLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRXJELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRWQsSUFBSSxRQUFRLEdBQUc7OztFQUdkLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDMUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ3RCLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUN0QixDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7O0dBR2pCLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUN0QixDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7O0VBR25CLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNyQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7O0VBR25CLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUN0QixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNsQixDQUFDOztDQUVGLElBQUksT0FBTyxHQUFHO0VBQ2IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0VBQy9CLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtFQUMvQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDaEMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0VBQzlCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtFQUMvQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUU7RUFDL0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0VBQy9CLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNoQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDOUIsRUFBRSxFQUFFLENB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QyxDQUFDLEVBQUUsQ0FBQztHQUMxQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7R0FFMUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOzs7O0dBSTlDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztHQUU1QyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7Ozs7R0FJN0MsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUM7R0FDaEMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUM7O0dBRS9COztFQUVEOzs7O0NBSUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRXpDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUMsR0FBRyxHQUFHOzs7O0dBSXhDLElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0dBQ3ZELElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0dBQy9DLElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3ZDLElBQUksQ0FBQyxHQUFH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LEdBQUc7O0dBRXpDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLEdBQUcsR0FBRyxDQUFDO0dBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Ozs7R0FJekMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQzdELE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUM3RCxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUVoQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7Ozs7R0FJOUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNsQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ2xDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztHQUVoRCxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7Ozs7R0FJN0MsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUM7R0FDaEMs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SSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7O0NBRXRCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEdBQUc7O0VBRXhCLEtBQUssZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHOztHQUVsRyxPQUFPLEtBQUssQ0FBQzs7R0FFYjs7RUFFRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7RUFFWDs7Q0FFRCxPQUFPLElBQUksQ0FBQzs7Q0FFWjs7QUFFRCxTQUFTLFdBQVcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEdBQUc7O0NBRWhELElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJO0VBQ2YsQ0FBQyxHQUFHLEdBQUc7RUFDUCxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQzs7Q0FFZCxLQUFLLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxPQUFPLEtBQUssQ0FBQzs7OztDQUl6QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0VBQzVFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0VBQ3pFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0VBQ3pFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Ozs7Q0FJM0UsSUFBSSxJQUFJLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7RUFDckQsSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7Ozs7Q0FJcEQsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzs7Q0FFbEIsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMs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TUFBTSxJQUFJLENBQUMsQ0FBQzs7RUFFWixTQUFTLFNBQVMsR0FBRyxDQUFDLEdBQUc7O0NBRTFCLE9BQU8sSUFBSSxDQUFDOztDQUVaOzs7O0FBSUQsU0FBUyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRzs7OztDQUk1QyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUM7Q0FDbkMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDOztDQUVuQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQztDQUNwQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQztDQUNwQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQztDQUNwQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQzs7Q0FFcEMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUM7Q0FDcEMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUM7Q0FDcEMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUM7Q0FDcEMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUM7O0NBRXBDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEI7Ozs7QUFJRCxTQUFTLFdBQVcsRUFBRSxLQUFLLEdBQUc7O0NBRTdCLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxRQUFRLEdBQUcsS0FBSyxDQUFDOztDQUVoQyxHQUFHOztFQUVGLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFDckMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0VBRVgsU0FBUyxDQUFDLEtBQUssS0FBSyxHQUFHOztDQUV4QixPQUFPLFFBQVEsQ0FBQzs7Q0FFaEI7Ozs7QUFJRCxTQUFTLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUUxRCxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDO0VBQ2hFLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDO0VBQzFELEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7O0NBRTVEOzs7O0FBSUQsU0FBUyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFaEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ3pFLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV4RTs7OztBQUlELFNBQVMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUV4QixPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVyRTs7OztBQUlELFNBQVMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRXpCLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFdEM7Ozs7QUFJRCxTQUFTLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRXJDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0tBQ3ZDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUV6RCxPQUFPLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDO0tBQ3BELElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXREOzs7O0FBSUQsU0FBUyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUVsQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRVYsR0FBRzs7RUFFRixLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztNQUNuRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHOztHQUVuQyxPQUFPLElBQUksQ0FBQzs7R0FFWjs7RUFFRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7RUFFWCxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUc7O0NBRXBCLE9BQU8sS0FBSyxDQUFDOztDQUViOzs7O0FBSUQsU0FBUyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7RUFDbkMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztFQUN0RCxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXREOzs7O0FBSUQsU0FBUyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQztFQUNSLE1BQU0sR0FBRyxLQUFLO0VBQ2QsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7RUFDdEIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Q0FFeEIsR0FBRzs7RUFFRixLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6RCxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRzs7R0FFM0UsTUFBTSxHQUFHLEVBQUUsTUFBTSxDQUFDOztHQUVsQjs7RUFFRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7RUFFWCxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUc7O0NBRXBCLE9BQU8sTUFBTSxDQUFDOztDQUVkOzs7OztBQUtELFNBQVMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTdCLElBQUksRUFBRSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO0VBQ2pDLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtFQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUk7RUFDWCxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7Q0FFYixDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztDQUNYLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUVYLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0NBQ2IsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7O0NBRWIsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Q0FDYixFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQzs7Q0FFYixFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztDQUNiLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztDQUViLE9BQU8sRUFBRSxDQUFDOztDQUVWOzs7O0FBSUQsU0FBUyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHOztDQUVwQyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU1QixLQUFLLEVBQUUsSUFBSSxHQUFHOztFQUViLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7O0VBRVgsTUFBTTs7RUFFTixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDbkIsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7RUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7RUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7O0VBRWQ7O0NBRUQsT0FBTyxDQUFDLENBQUM7O0NBRVQ7O0FBRUQsU0FBUyxVQUFVLEVBQUUsQ0FBQyxHQUFHOztDQUV4QixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0NBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0NBRXJCLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0NBQ3ZDLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDOztDQUV2Qzs7QUFFRCxTQUFTLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7O0NBR3hCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs7Q0FHWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNYLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs7Q0FHWCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztDQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzs7O0NBR2pCLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDOzs7Q0FHZCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztDQUNsQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzs7O0NBR2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDOztDQUVyQjs7QUFFRCxTQUFTLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRTVDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQzs7Q0FFWixNQUFNLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEdBQUc7O0VBRXZELEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDckUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFTjs7Q0FFRCxPQUFPLEdBQUcsQ0FBQzs7Q0FFWDs7QUN2eUJEOzs7QUFHQSxBQUVBO0FBQ0EsQUFBRyxJQUFDLFVBQVUsR0FBRzs7OztDQUloQixJQUFJLEVBQUUsV0FBVyxPQUFPLEdBQUc7O0VBRTFCLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7RUFDdkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDOztFQUVaLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHOztHQUU3QyxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7R0FFdkU7O0VBRUQsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDOztFQUVmOztDQUVELFdBQVcsRUFBRSxXQUFXLEdBQUcsR0FBRzs7RUFFN0IsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFbEM7O0NBRUQsZ0JBQWdCLEVBQUUsV0FBVyxPQUFPLEVBQUUsS0FBSyxHQUFHOztFQUU3QyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7RUFDbEIsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO0VBQ3JCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQzs7RUFFZixlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUM7RUFDM0IsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7OztFQUloQyxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDOztFQUUvQixLQUFLLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxDQUFDOztFQUVqQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFekMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztHQUM5QixTQUFTLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQztHQUMvQixVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztHQUVuQzs7OztFQUlELElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDOzs7O0VBSTVELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0dBRS9DLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7O0dBRTFDOztFQUVELE9BQU8sS0FBSyxDQUFDOztFQUViOztDQUVELENBQUM7O0FBRUYsU0FBUyxlQUFlLEVBQUUsTUFBTSxHQUFHOztDQUVsQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztDQUV0QixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUc7O0VBRXJELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7RUFFYjs7Q0FFRDs7QUFFRCxTQUFTLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxHQUFHOztDQUV4QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFM0MsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDaEMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRWhDOztDQUVEOztBQzdGRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQSxBQU9BOzs7QUFHQSxTQUFTLGVBQWUsRUFBRSxNQUFNLEVBQUUsT0FBTyxHQUFHOztDQUUzQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV0QixJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDOztDQUU5QixJQUFJLENBQUMsVUFBVSxHQUFHO0VBQ2pCLE1BQU0sRUFBRSxNQUFNO0VBQ2QsT0FBTyxFQUFFLE9BQU87RUFDaEIsQ0FBQzs7Q0FFRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztDQUN4RSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7O0NBRXJCOztBQUVELGVBQWUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDaEUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDOztBQUV4RCxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxZQUFZOztDQUU5QyxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRWxELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0NBQ3BDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDOztDQUV0QyxPQUFPLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV2QyxDQUFDOzs7O0FBSUYsU0FBUyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxHQUFHOztDQUVqRCxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU1QixJQUFJLENBQUMsSUFBSSxHQUFHLHVCQUF1QixDQUFDOztDQUVwQyxJQUFJLENBQUMsVUFBVSxHQUFHO0VBQ2pCLE1BQU0sRUFBRSxNQUFNO0VBQ2QsT0FBTyxFQUFFLE9BQU87RUFDaEIsQ0FBQzs7Q0FFRixNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFdkQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDOztDQUVqQixJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7Q0FDdkIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDOztDQUVqQixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVqRCxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDeEIsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUVsQjs7OztDQUlELElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksc0JBQXNCLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDaEYsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Ozs7Q0FJNUIsU0FBUyxRQUFRLEVBQUUsS0FBSyxHQUFHOztFQUUxQixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7Ozs7RUFJckIsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7RUFDckYsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7RUFDNUQsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7O0VBRTlELElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLEtBQUssU0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0VBQ3BGLElBQUksY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEtBQUssU0FBUyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZGLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQztFQUN6RixJQUFJLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxLQUFLLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQzs7RUFFcEYsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQzs7RUFFdEMsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQzs7OztFQUl2RixLQUFLLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxHQUFHOztHQUVuQyxPQUFPLENBQUMsSUFBSSxFQUFFLGdFQUFnRSxFQUFFLENBQUM7R0FDakYsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7O0dBRXZCOzs7O0VBSUQsSUFBSSxVQUFVLEVBQUUsYUFBYSxHQUFHLEtBQUssQ0FBQztFQUN0QyxJQUFJLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQzs7RUFFNUMsS0FBSyxXQUFXLEdBQUc7O0dBRWxCLFVBQVUsR0FBRyxXQUFXLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDOztHQUVsRCxhQUFhLEdBQUcsSUFBSSxDQUFDO0dBQ3JCLFlBQVksR0FBRyxLQUFLLENBQUM7Ozs7OztHQU1yQixVQUFVLEdBQUcsV0FBVyxDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7OztHQUk3RCxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztHQUN6QixNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztHQUN2QixTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7R0FFMUI7Ozs7RUFJRCxLQUFLLEVBQUUsWUFBWSxHQUFHOztHQUVyQixhQUFhLEdBQUcsQ0FBQyxDQUFDO0dBQ2xCLGNBQWMsR0FBRyxDQUFDLENBQUM7R0FDbkIsU0FBUyxHQUFHLENBQUMsQ0FBQzs7R0FFZDs7OztFQUlELElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0VBRWpCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLENBQUM7O0VBRXZELElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7RUFDakMsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQzs7RUFFOUIsSUFBSSxPQUFPLEdBQUcsRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUVuRCxLQUFLLE9BQU8sR0FBRzs7R0FFZCxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDOzs7O0dBSTlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUU5QyxLQUFLLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUVuQixLQUFLLFVBQVUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUc7O0tBRXRDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7O0tBRTdCOztJQUVEOztHQUVEOzs7RUFHRCxJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDOzs7O0VBSTNELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQzs7RUFFdkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRTlDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRW5CLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDOztHQUVwQzs7O0VBR0QsU0FBUyxRQUFRLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUc7O0dBRWxDLEtBQUssRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSwyQ0FBMkMsRUFBRSxDQUFDOztHQUUxRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztHQUVwRDs7RUFFRCxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNO0dBQzVCLElBQUksRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7Ozs7O0VBTTNCLFNBQVMsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOzs7Ozs7Ozs7R0FT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LENBQUM7RUFDakMsSUFBSSxHQUFHLEdBQUcsUUFBUSxFQUFFLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDckMsSUFBSSxHQUFHLEdBQUcsUUFBUSxFQUFFLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXJDLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHOztHQUVuQyxPQUFPO0lBQ04sSUFBSSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUU7SUFDM0IsSUFBSSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUU7SUFDM0IsSUFBSSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUU7SUFDM0IsSUFBSSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUU7SUFDM0IsQ0FBQzs7R0FFRixNQUFNOztHQUVOLE9BQU87SUFDTixJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRTtJQUMzQixJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRTtJQUMzQixJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRTtJQUMzQixJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRTtJQUMzQixDQUFDOztHQUVGOztFQUVEO0NBQ0QsQ0FBQzs7QUFFRixTQUFTLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksR0FBRzs7OztDQUl4QyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFakIsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHOztFQUU5QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdB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RSxFQUFFLEdBQUcsR0FBRzs7RUFFM0MsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDOztFQUVyQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsY0FBYyxDQUFDOztFQUU1QixNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLGFBQWEsRUFBRSxFQUFFLEdBQUcsR0FBRzs7R0FFMUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGFBQWEsQ0FBQzs7OztHQUkzQixNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxHQUFHLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVUsR0FBRyxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUM7R0FDdEcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDO0dBQzdELE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxHQUFHLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVUsR0FBRyxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUM7O0dBRXBHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7OztHQUk5QyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7R0FDdkQsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOzs7O0dBSTdDLEdBQUcsQ0FB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Q2QsUUFBUSxFQUFFLFFBQVE7RUFDbEIsUUFBUSxFQUFFLFFBQVE7RUFDbEIsU0FBUyxFQUFFLFNBQVM7RUFDcEIsQ0FBQzs7Q0FFRixRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDeEMsUUFBUSxHQUFHLFFBQVEsSUFBSSxDQUFDLENBQUM7Q0FDekIsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7OztDQUlyQyxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7Ozs7O0NBS3JELElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztDQUNqQixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7Q0FDbEIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDOzs7O0NBSWIsSUFBSSxJQUFJLENBQUM7Q0FDVCxJQUFJLGVBQWUsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDO0NBQ3JDLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDM0IsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Ozs7Q0FJVCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFbEMsSUFBSSxHQUFHLEdBQUcsUUFBUSxHQUFHLENBQUMsR0FBRyxlQUFlLEdBQUcsU0FBUyxDQUFDOztFQUVyRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzFCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRTFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7OztHQUkvQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0dBQy9CLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztHQUN6QixNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDOztHQUUvQixRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7Ozs7R0FJOUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDO0dBQ3BCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0dBRWpDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7OztHQUd2Qjs7RUFFRDs7OztDQUlELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVqQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRTlDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7O0dBRTdCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztHQUNiLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0dBQzdCLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztHQUNqQyxJQUFJ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LFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNyQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFckMsS0FBSyxFQUFFLElBQUksR0FBRyxHQUFHOztHQUVoQixHQUFHLEdBQUcsRUFBRSxDQUFDO0dBQ1QsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV0Qjs7RUFFRCxLQUFLLEVBQUUsSUFBSSxHQUFHLEdBQUc7O0dBRWhCLEdBQUcsR0FBRyxFQUFFLENBQUM7R0FDVCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRXRCOztFQUVELEtBQUssRUFBRSxJQUFJLEdBQUcsR0FBRzs7R0FFaEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV0Qjs7RUFFRCxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7RUFFdEQsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDaEQsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Ozs7O0VBSzNELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUVsQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7R0FFeEMsU0FBUyxFQUFF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QUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Ozs7Ozs7OztDQVVuQyxTQUFTLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0VBRS9CLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDUixFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ1IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3JDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFL0I7O0NBRUQsT0FBTzs7RUFFTixjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxHQUFHOztHQUVwRCxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7R0FFN0Q7O0VBRUQsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7OztHQUdwRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQztHQUM3RSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFB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RyxDQUFDLEdBQUc7O0VBRWxDLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOztFQUVwQyxNQUFNOzs7RUFHTixHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDOUQsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7RUFFVDs7Q0FFRCxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUM1QixFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs7Q0FFcEMsS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztFQUV0QyxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs7RUFFcEMsTUFBTTs7O0VBR04sR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQzFFLEVBQUUsR0FBRyxHQUFHLENBQUM7O0VBRVQ7O0NBRUQsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLGFBQWEsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRzs7O0VBR3ZFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7RUFDcEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDdEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDdEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7OztFQUd0RCxLQUFLLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUM1QixLQUFLLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUM1QixLQUFLLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFNUIsRUFBRSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNyRSxFQUFFLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3JFLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRXJFLE1BQU0sS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVksR0FBRzs7RUFFN0MsRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxD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QUksRUFBRSxHQUFHLE1BQU0sRUFBRSxRQUFRLEtBQUssQ0FBQyxHQUFHLFFBQVEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDNUQsSUFBSSxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQzVCLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ25GLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUVuRixLQUFLLENBQUMsR0FBRztFQUNSLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtFQUM1QyxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7RUFDNUMsQ0FBQzs7Q0FFRixPQUFPLEtBQUssQ0FBQzs7Q0FFYixDQUFDOztBQUVGLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVcsTUFBTSxHQUFHOztDQUVoRCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUUxQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFakIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxD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RyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDOztFQUVoQixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFckQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQzs7R0FFakM7O0VBRUQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsUUFBUSxFQUFFLFdBQVcsSUFBSSxHQUFHOztFQUUzQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUUzQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7O0VBRWhCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUVyRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7O0dBRS9DOztFQUVELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELEVBQUUsQ0FBQzs7QUM1R0o7Ozs7O0FBS0EsU0FBUyxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FBRzs7Q0FFbEMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJ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S0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDekQsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDekQsS0FBSyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7RUFDcEUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7RUFDeEUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7RUFDeEUsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7RUFDN0UsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7RUFDN0UsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7RUFDeEUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7RUFDeEUsS0FBSyxJQUFJLENBQUMsa0JBQWtCLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7RUFDbkcsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7RUFDckUsS0FBSyxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7RUFDakYsS0FBSyxJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7RUFDdkYsS0FBSyxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7RUFDakYsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7RUFDdEQsS0FBSyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7RUFDOUUsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7RUFDckUsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDekQsS0FBSyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7RUFDbEUsS0FBSyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7RUFDOUUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7RUFDeEUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FB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Q0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFdBQVcsSUFBSSxHQUFHOztHQUVuQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzs7R0FFNUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRXpCOztDQUVELEtBQUssRUFBRSxXQUFXLElBQUksR0FBRzs7RUFFeEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQzs7RUFFcEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7O0VBRTVCLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRzs7R0FFMUIsSUFBSSxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztHQUMvRCxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksZUFBZSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztHQUUxRDs7RUFFRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7RUFFdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxVQUFVLEdBQUc7O0dBRTdCLElBQUksU0FBUyxHQUFHLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUNsQyxJQUFJLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDOztHQUV2RSxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxJQUFJLGVBQWUsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQzs7R0FFMUc7O0VBRUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxT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Q0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztPQUUxQixVQUFVLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUM7T0FDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7T0FFNUQ7O01BRUQ7O0tBRUQsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0tBRTVCOztJQUVEOztHQUVEOztFQUVELFNBQVMsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEdBQUc7O0dBRXBDLElBQUksbUJBQW1CLEdBQUcsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEtBQUssU0FBUyxLQUFLLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7O0dBRXBHLEtBQUssSUFBSSxDQUFDLFdBQVcsR0FBRzs7SUFFdkIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixHQUFHOztLQUUvRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO0tBQzlCLElBQUksQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUNwRSxJQUFJLENBQUMsR0FBRyxFQUFFLG1CQUFtQixHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDcEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FB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LEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQzs7R0FFekI7O0VBRUQsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDOztFQUV4QixLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQzs7RUFFdkQsS0FBSyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsR0FBRzs7R0FFaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztHQUV2QyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztHQUMzRixLQUFLLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDOztHQUUzRyxNQUFNOztHQUVOLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0dBQzlFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0dBQzlFLEtBQUssSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0dBQ3BGLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOztHQUVyRTs7RUFFRCxLQUFLLElBQUks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TSxHQUFHLENBQUMsQ0FBQzs7Q0FFekIsSUFBSSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUMvRCxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDN0IsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDMUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFckIsSUFBSSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUMvRCxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDN0IsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUM1QyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVyQixJQUFJLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQy9ELFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0IsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDMUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFckIsSUFBSSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFB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R0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0tBRS9ELElBQUksTUFBTSxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7S0FFM0MsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7S0FFckMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7O0tBRTlDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztLQUVqRyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztLQUV6QyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7S0FFZCxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztLQUV6QyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7S0FFZDs7SUFFRDs7R0FFRCxNQUFNLEtBQUssV0FBVyxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRzs7R0FFekQsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7O0dBRTdDLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDOztHQUU1QyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7Ozs7R0FJWixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxD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VUFBVSxDQUFDLFFBQVEsQ0FBQztDQUN0RCxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOzs7O0NBSTNCLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ25ELEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNqRCxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNuRCxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3ZELEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV0RCxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFNUIsS0FBSyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsR0FBRzs7RUFFL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7O0VBRTNDLE1BQU07O0VBRU4sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENB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LElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7R0FDaEMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDOztHQUV0QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUVoRCxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssTUFBTSxHQUFHLE1BQU0sQ0FBQzs7SUFFaEQsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7SUFFOUM7O0dBRUQsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0dBRTFCOztFQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQzs7RUFFL0UsQ0FBQzs7Q0FFRixFQUFFLENBQUM7O0FDNUZKOzs7QUFHQSxBQU9BO0FBQ0EsU0FBUyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUV0RCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztDQUNsQixTQUFTLEdBQUcsU0FBUyxJQUFJLEVBQUUsQ0FBQztDQUM1QixNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7Q0FDL0QsTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLFFBQVEsRUFBRSxDQUFDOztDQUUvRCxJQUFJLE1BQU0sR0FBRyxTQUFTLEdBQUcs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SSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzs7O0NBSXBDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzs7O0NBSXBDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQ2hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQ2hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQ2hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzs7O0NBSWhDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQy9CLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQy9CLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDOzs7O0NBSS9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQ2pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDOzs7O0NBSWhDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxD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LEVBQUUsQ0FBQztFQUM5QixRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUM1QixRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUM1QixRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Ozs7RUFJMUIsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUN4QyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDMUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOzs7O0VBSWhDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzdCLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUMzQixRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUM3QixRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTNCLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDL0IsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDN0IsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFD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LEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDM0QsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzNELEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMzRCxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDN0QsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzlELEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUM5RCxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFB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