bundle.js 1.8 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341
  1. var __extends = (this && this.__extends) || (function () {
  2. var extendStatics = Object.setPrototypeOf ||
  3. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  4. function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
  5. return function (d, b) {
  6. extendStatics(d, b);
  7. function __() { this.constructor = d; }
  8. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  9. };
  10. })();
  11. (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
  12. "use strict";
  13. Object.defineProperty(exports, "__esModule", { value: true });
  14. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  15. var DispatcherManager_1 = require("../utils/DispatcherManager");
  16. var Singleton_1 = require("../utils/Singleton");
  17. var ServerSocket_1 = require("../WXSDK/ServerSocket");
  18. var RoleData_1 = require("../Data/RoleData");
  19. /*
  20. * name;
  21. */
  22. var AgencyBaseControl = /** @class */ (function (_super) {
  23. __extends(AgencyBaseControl, _super);
  24. function AgencyBaseControl() {
  25. var _this = _super.call(this) || this;
  26. _this._objectPool = PanelResDic_1.PanelResDic.Instance;
  27. _this.initSelf();
  28. return _this;
  29. }
  30. AgencyBaseControl.prototype.initSelf = function () {
  31. };
  32. /**********混淆 */
  33. AgencyBaseControl.prototype.drawSomething = function () {
  34. this.sp = new Laya.Sprite();
  35. Laya.stage.addChild(this.sp);
  36. //画线
  37. this.sp.graphics.drawLine(10, 58, 146, 58, "#ff0000", 3);
  38. //画连续直线
  39. this.sp.graphics.drawLines(176, 58, [0, 0, 39, -50, 78, 0, 117, 50, 156, 0], "#ff0000", 5);
  40. //画曲线
  41. this.sp.graphics.drawCurves(352, 58, [0, 0, 19, -100, 39, 0, 58, 100, 78, 0, 97, -100, 117, 0, 136, 100, 156, 0], "#ff0000", 5);
  42. //画矩形
  43. this.sp.graphics.drawRect(10, 166, 166, 90, "#ffff00");
  44. //画多边形
  45. this.sp.graphics.drawPoly(264, 166, [0, 0, 60, 0, 78.48, 57, 30, 93.48, -18.48, 57], "#ffff00");
  46. //画三角形
  47. this.sp.graphics.drawPoly(400, 166, [0, 100, 50, 0, 100, 100], "#ffff00");
  48. //画圆
  49. this.sp.graphics.drawCircle(98, 332, 50, "#00ffff");
  50. //画扇形
  51. this.sp.graphics.drawPie(240, 290, 100, 10, 60, "#00ffff");
  52. //绘制圆角矩形,自定义路径
  53. this.sp.graphics.drawPath(400, 310, [["moveTo", 5, 0], ["lineTo", 105, 0], ["arcTo", 110, 0, 110, 5, 5], ["lineTo", 110, 55], ["arcTo", 110, 60, 105, 60, 5], ["lineTo", 5, 60], ["arcTo", 0, 60, 0, 55, 5], ["lineTo", 0, 5], ["arcTo", 0, 0, 5, 0, 5], ["closePath"]], { fillStyle: "#00ffff" });
  54. };
  55. /********** */
  56. /**
  57. * 注册全局侦听事件
  58. *
  59. */
  60. AgencyBaseControl.prototype.DisOn = function (type, callbackobj, callbackHandler) {
  61. DispatcherManager_1.DispatcherManager.addEventListener(type, callbackobj, callbackHandler);
  62. };
  63. /**
  64. * 抛出全局事件
  65. */
  66. AgencyBaseControl.prototype.DisTrigger = function (type, data) {
  67. if (data === void 0) { data = null; }
  68. DispatcherManager_1.DispatcherManager.dispatchEvent(type, data);
  69. };
  70. /**
  71. * 移除全局侦听事件
  72. */
  73. AgencyBaseControl.prototype.DisOff = function (type, callbackobj, callbackHandler) {
  74. DispatcherManager_1.DispatcherManager.removeEventListener(type, callbackobj, callbackHandler);
  75. };
  76. /************************** */
  77. AgencyBaseControl.prototype.setup = function () {
  78. var textBox = new Laya.Sprite();
  79. // 随机摆放文本
  80. var text;
  81. for (var i = 0; i < 1000; i++) {
  82. text = new Laya.Text();
  83. text.fontSize = 20;
  84. text.text = (Math.random() * 100).toFixed(0);
  85. text.rotation = Math.random() * 360;
  86. text.color = "#CCCCCC";
  87. text.x = Math.random() * Laya.stage.width;
  88. text.y = Math.random() * Laya.stage.height;
  89. textBox.addChild(text);
  90. }
  91. //缓存为静态图像
  92. textBox.cacheAs = "bitmap";
  93. Laya.stage.addChild(textBox);
  94. };
  95. /********* ********************/
  96. AgencyBaseControl.prototype.getSingleTon = function (ref) {
  97. return this._objectPool.getSingleTon(ref);
  98. };
  99. AgencyBaseControl.prototype.sendMessage = function (act, data, isShowWait) {
  100. if (data === void 0) { data = null; }
  101. if (isShowWait === void 0) { isShowWait = true; }
  102. ServerSocket_1.ServerSocket.Instance.sendMessage(act, data, isShowWait);
  103. };
  104. Object.defineProperty(AgencyBaseControl.prototype, "RoleData", {
  105. get: function () {
  106. if (!this.roleData) {
  107. this.roleData = RoleData_1.RoleData.Instance;
  108. }
  109. return this.roleData;
  110. },
  111. enumerable: true,
  112. configurable: true
  113. });
  114. return AgencyBaseControl;
  115. }(Singleton_1.Singleton));
  116. exports.AgencyBaseControl = AgencyBaseControl;
  117. },{"../Data/RoleData":31,"../PrefabControl/PanelResDic":46,"../WXSDK/ServerSocket":76,"../utils/DispatcherManager":83,"../utils/Singleton":89}],2:[function(require,module,exports){
  118. "use strict";
  119. Object.defineProperty(exports, "__esModule", { value: true });
  120. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  121. var GameState_1 = require("../utils/GameState");
  122. var ViewManager_1 = require("../View/ViewManager");
  123. var CompletePanel_1 = require("../View/CompletePanel");
  124. var GameStateControl_1 = require("../Control/GameStateControl");
  125. var GameUtils_1 = require("../utils/GameUtils");
  126. var SceneControl_1 = require("../Control/SceneControl");
  127. var PropManager_1 = require("../PrefabControl/PropManager");
  128. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  129. var Sdk_1 = require("../WXSDK/Sdk");
  130. var AgencyTrial_1 = require("./AgencyTrial");
  131. var GiftView_1 = require("../View/GiftView");
  132. var RecordManager_1 = require("../WXSDK/RecordManager");
  133. var AgencyInGame = /** @class */ (function (_super) {
  134. __extends(AgencyInGame, _super);
  135. function AgencyInGame() {
  136. return _super.call(this) || this;
  137. }
  138. AgencyInGame.prototype.initSelf = function () {
  139. this.DisOn(GameState_1.GameState.end, this, this.endgameHandler);
  140. this.DisOn(GameState_1.GameState.revive, this, this.RevivegameHandler);
  141. this.DisOn(GameState_1.GameState.lose, this, this.LosegameHandler);
  142. };
  143. /**复活界面 */
  144. AgencyInGame.prototype.RevivegameHandler = function () {
  145. Laya.timer.once(1000, this, this.reviveView);
  146. };
  147. /**失败界面 */
  148. AgencyInGame.prototype.LosegameHandler = function () {
  149. Laya.timer.once(1000, this, this.loseView);
  150. };
  151. AgencyInGame.prototype.reviveView = function () {
  152. RecordManager_1.RecordManager.Instance.RecordStop();
  153. var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
  154. var getGold = 0;
  155. Sdk_1.WxApi.recordAldEvent("打开结算界面(复活)");
  156. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
  157. };
  158. AgencyInGame.prototype.loseView = function () {
  159. RecordManager_1.RecordManager.Instance.RecordStop();
  160. var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
  161. var getGold = 0;
  162. Sdk_1.WxApi.recordAldEvent("打开结算界面(失败)");
  163. this.RecropLevelEnd(false);
  164. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
  165. };
  166. AgencyInGame.prototype.endgameHandler = function () {
  167. RecordManager_1.RecordManager.Instance.RecordStop();
  168. Laya.timer.once(1000, this, this.startEndView);
  169. };
  170. AgencyInGame.prototype.startEndView = function () {
  171. var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
  172. var getGold = 0;
  173. if (GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0) {
  174. getGold = this.RoleData.levelcfg.winGold;
  175. Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏胜利)");
  176. this.RecropLevelEnd(true);
  177. }
  178. else {
  179. var arr = GameUtils_1.GameUtils.cutstrtoArr(this.RoleData.levelcfg.failGod);
  180. getGold = GameUtils_1.GameUtils.randRangeint(Number(arr[0]), Number(arr[1]));
  181. Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏失败)");
  182. this.RecropLevelEnd(false);
  183. }
  184. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
  185. // ViewManager.Instance.add( ChoutiPanView,2 );
  186. };
  187. AgencyInGame.prototype.RecropLevelEnd = function (_win) {
  188. // if(!Laya.Browser.onWeiXin)return;
  189. // var stageid = this.RoleData.LevelID.toString();
  190. // var useid = PlayerAccount.CurrentAccount.CurAccountData.UseId;
  191. // var stagename = "第" + this.RoleData.LevelID + "关";
  192. // if(_win)
  193. // {
  194. // WxApi.levelSuccess(stageid,stagename,stageid);
  195. // }
  196. // else
  197. // {
  198. // var equipid = this.RoleData.CharacterID.toString();
  199. // var carname = this.RoleData.roleCfg.name;
  200. // WxApi.levelFail(stageid,stagename,stageid,"0",carname);
  201. // }
  202. };
  203. AgencyInGame.prototype.returnmainview = function (win) {
  204. if (win && PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
  205. var ran = Math.random();
  206. console.log("误触几率为---", ran);
  207. if (ran <= PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.EndCheat) {
  208. ViewManager_1.ViewManager.Instance.add(GiftView_1.default);
  209. }
  210. GameState_1.GameState.fuhuocishu = 1;
  211. GameState_1.GameState.recordscree = false;
  212. GameState_1.GameState.isdie = false;
  213. PropManager_1.PropManager.Instance.CloseGameOverEffect();
  214. ViewManager_1.ViewManager.Instance.close(CompletePanel_1.CompletePanel);
  215. this.DisTrigger(GameState_1.GameState.returnMainView);
  216. SceneControl_1.SceneControl.Instance.ShowTheGameScene();
  217. var agencytrial = this.getSingleTon(AgencyTrial_1.AgencyTrial);
  218. if (agencytrial.isshiyonging) {
  219. SceneControl_1.SceneControl.Instance.CreatePlayer(this.RoleData.roleCfg);
  220. agencytrial.isshiyonging = false;
  221. }
  222. }
  223. else {
  224. GameState_1.GameState.fuhuocishu = 1;
  225. GameState_1.GameState.recordscree = false;
  226. GameState_1.GameState.isdie = false;
  227. PropManager_1.PropManager.Instance.CloseGameOverEffect();
  228. ViewManager_1.ViewManager.Instance.close(CompletePanel_1.CompletePanel);
  229. this.DisTrigger(GameState_1.GameState.returnMainView);
  230. SceneControl_1.SceneControl.Instance.ShowTheGameScene();
  231. var agencytrial = this.getSingleTon(AgencyTrial_1.AgencyTrial);
  232. if (agencytrial.isshiyonging) {
  233. SceneControl_1.SceneControl.Instance.CreatePlayer(this.RoleData.roleCfg);
  234. agencytrial.isshiyonging = false;
  235. }
  236. }
  237. //打开好友邀请界面
  238. // ViewManager.Instance.add(FriendInviteView);
  239. };
  240. AgencyInGame.prototype.startGame = function () {
  241. AgencyInGame.gamenum++;
  242. var stageid = this.RoleData.getNowServerLevel().toString().toString();
  243. var stagename = "第" + stageid + "关";
  244. var useid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.UseId;
  245. Sdk_1.WxApi.levelStart(stageid, stagename, useid);
  246. GameStateControl_1.GameStateControl.Instance.startGame();
  247. };
  248. AgencyInGame.key = "AgencyInGame";
  249. AgencyInGame.gamenum = 0;
  250. return AgencyInGame;
  251. }(AgencyBaseControl_1.AgencyBaseControl));
  252. exports.AgencyInGame = AgencyInGame;
  253. },{"../Control/GameStateControl":20,"../Control/SceneControl":27,"../PrefabControl/PropManager":47,"../View/CompletePanel":59,"../View/GiftView":61,"../View/ViewManager":68,"../WXSDK/PlayerAccount":73,"../WXSDK/RecordManager":74,"../WXSDK/Sdk":75,"../utils/GameState":84,"../utils/GameUtils":85,"./AgencyBaseControl":1,"./AgencyTrial":7}],3:[function(require,module,exports){
  254. "use strict";
  255. Object.defineProperty(exports, "__esModule", { value: true });
  256. var ViewManager_1 = require("../View/ViewManager");
  257. var LoadingPanel_1 = require("../View/LoadingPanel");
  258. var AgencyUserMessage_1 = require("./AgencyUserMessage");
  259. var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
  260. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  261. var AgencyMain_1 = require("./AgencyMain");
  262. var RoleCFG_1 = require("../CFG/RoleCFG");
  263. var LevelCFG_1 = require("../CFG/LevelCFG");
  264. var BuildCFG_1 = require("../CFG/BuildCFG");
  265. var NpcCFG_1 = require("../CFG/NpcCFG");
  266. var GameCFG_1 = require("../CFG/GameCFG");
  267. var AgencySkin_1 = require("./AgencySkin");
  268. var Sdk_1 = require("../WXSDK/Sdk");
  269. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  270. var NetworkManager_1 = require("../WXSDK/NetworkManager");
  271. var Global_1 = require("../Global");
  272. var LotteryCFG_1 = require("../CFG/LotteryCFG");
  273. var AgencyLottery_1 = require("./AgencyLottery");
  274. var ttad_1 = require("../WXSDK/ttad");
  275. var AgencyLogin = /** @class */ (function (_super) {
  276. __extends(AgencyLogin, _super);
  277. function AgencyLogin() {
  278. return _super.call(this) || this;
  279. }
  280. AgencyLogin.prototype.initSelf = function () {
  281. this.DisOn(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_loginSucceed, this, this.Success);
  282. };
  283. AgencyLogin.prototype.Login = function () {
  284. ViewManager_1.ViewManager.Instance.add(LoadingPanel_1.LoadingPanel);
  285. this.loginprogress(0);
  286. // if(Laya.Browser.onWeiXin)
  287. // {
  288. // this.LoginWX();
  289. // }
  290. // else
  291. // {
  292. this.LoginLocal();
  293. // }
  294. };
  295. AgencyLogin.prototype.LoginWX = function () {
  296. var _this = this;
  297. Sdk_1.WxApi.recordAldEvent("开始微信登录");
  298. Sdk_1.WxApi.WXLogin(function (res) {
  299. if (res != "error") {
  300. Sdk_1.WxApi.recordAldEvent("微信登录成功");
  301. console.log("hplogin:" + "querychannel->" + Sdk_1.WxApi.querychannel + " referrerInfoappId->" + Sdk_1.WxApi.referrerInfoappId);
  302. _this.LoginLocal();
  303. }
  304. else {
  305. Sdk_1.WxApi.recordAldEvent("微信登录失败");
  306. _this.LoginWX();
  307. }
  308. });
  309. };
  310. AgencyLogin.prototype.LoginLocal = function (res) {
  311. if (res === void 0) { res = null; }
  312. Sdk_1.WxApi.recordAldEvent("开始本地登录");
  313. if (res) {
  314. new PlayerAccount_1.PlayerAccount(res.code, "", "", 0, "", "", "", "", Sdk_1.WxApi.shareOpenId, Sdk_1.WxApi.shareOpenId, Global_1.Global.gameVersion);
  315. }
  316. NetworkManager_1.NetworkManager.Instance.login(null, Laya.Handler.create(this, this.LoginComplete), null);
  317. //this.LoadSbp();
  318. };
  319. AgencyLogin.prototype.LoginComplete = function () {
  320. Sdk_1.WxApi.recordAldEvent("本地服务器登录完成...");
  321. // ShareUtil.Instance.onRegister();
  322. // GuangGao.InitVideo();
  323. Sdk_1.WxApi.aldSendOpenid(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid);
  324. this.Success();
  325. };
  326. AgencyLogin.prototype.loginprogress = function (value) {
  327. var loadingPanel = ViewManager_1.ViewManager.Instance.getView(LoadingPanel_1.LoadingPanel);
  328. if (loadingPanel) {
  329. loadingPanel.showWord(value);
  330. }
  331. };
  332. AgencyLogin.prototype.Success = function () {
  333. this.ResolveData();
  334. this.initData();
  335. this.StartMain();
  336. ttad_1.ttad.InitAD();
  337. };
  338. AgencyLogin.prototype.StartMain = function () {
  339. console.log("当前配置表总关卡:", LevelCFG_1.default.vec.length);
  340. this.getSingleTon(AgencyMain_1.AgencyMain).StartMain();
  341. };
  342. /**
  343. * 解析配置数据
  344. */
  345. AgencyLogin.prototype.ResolveData = function () {
  346. var byteData = PlayerAccount_1.PlayerAccount.CurrentAccount.nowConfig.gameConfig[0].config;
  347. if (byteData && byteData != "") {
  348. var arr = byteData.split("%file%");
  349. var i;
  350. var nums = arr.length;
  351. for (i = 0; i < nums; i++) {
  352. var itemarr = arr[i].split("%cfg%");
  353. var cla = AgencyLogin.configClass[itemarr[0]];
  354. if (cla) {
  355. cla.initCfg(itemarr[1]);
  356. }
  357. else {
  358. }
  359. }
  360. return true;
  361. }
  362. return false;
  363. };
  364. /**
  365. * 初始化游戏数据
  366. */
  367. AgencyLogin.prototype.initData = function () {
  368. this.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).init();
  369. this.getSingleTon(AgencySkin_1.AgencySkin).init();
  370. this.getSingleTon(AgencyLottery_1.AgencyLottery).init();
  371. };
  372. AgencyLogin.key = "AgencyLogin";
  373. AgencyLogin.configClass = {
  374. RoleCFG: RoleCFG_1.default,
  375. LevelCFG: LevelCFG_1.default,
  376. BuildCFG: BuildCFG_1.default,
  377. NpcCFG: NpcCFG_1.default,
  378. GameCFG: GameCFG_1.default,
  379. LotteryCFG: LotteryCFG_1.default
  380. };
  381. return AgencyLogin;
  382. }(AgencyBaseControl_1.AgencyBaseControl));
  383. exports.AgencyLogin = AgencyLogin;
  384. },{"../CFG/BuildCFG":9,"../CFG/GameCFG":10,"../CFG/LevelCFG":11,"../CFG/LotteryCFG":12,"../CFG/NpcCFG":13,"../CFG/RoleCFG":14,"../Global":39,"../View/LoadingPanel":63,"../View/ViewManager":68,"../WXSDK/NetworkManager":71,"../WXSDK/PlayerAccount":73,"../WXSDK/Sdk":75,"../WXSDK/WECHATEVENT":78,"../WXSDK/ttad":81,"./AgencyBaseControl":1,"./AgencyLottery":4,"./AgencyMain":5,"./AgencySkin":6,"./AgencyUserMessage":8}],4:[function(require,module,exports){
  385. "use strict";
  386. Object.defineProperty(exports, "__esModule", { value: true });
  387. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  388. var ViewManager_1 = require("../View/ViewManager");
  389. var LotteryPanel_1 = require("../View/LotteryPanel");
  390. var LotteryCFG_1 = require("../CFG/LotteryCFG");
  391. var GameUtils_1 = require("../utils/GameUtils");
  392. var GlobalTip_1 = require("../utils/GlobalTip");
  393. var RoleCFG_1 = require("../CFG/RoleCFG");
  394. var AgencySkin_1 = require("./AgencySkin");
  395. var AgencyLottery = /** @class */ (function (_super) {
  396. __extends(AgencyLottery, _super);
  397. function AgencyLottery() {
  398. var _this = _super.call(this) || this;
  399. _this.mStartX = 400;
  400. _this.mStartY = 500;
  401. _this.mActionIndex = 0;
  402. _this.mCurrIndex = 0;
  403. _this.mCurrSkinIndex = 0;
  404. return _this;
  405. }
  406. AgencyLottery.prototype.init = function () {
  407. };
  408. AgencyLottery.prototype.openView = function () {
  409. ViewManager_1.ViewManager.Instance.add(LotteryPanel_1.LotteryPanel);
  410. };
  411. /**************************** */
  412. AgencyLottery.prototype.createAnimation = function () {
  413. var ani = new Laya.Animation();
  414. // ani.loadAtlas(this.AniConfPath); // 加载图集动画
  415. ani.interval = 30; // 设置播放间隔(单位:毫秒)
  416. ani.index = 1; // 当前播放索引
  417. ani.play(); // 播放图集动画
  418. // 获取动画的边界信息
  419. var bounds = ani.getGraphicBounds();
  420. ani.pivot(bounds.width / 2, bounds.height / 2);
  421. ani.pos(Laya.stage.width / 2, Laya.stage.height / 2);
  422. Laya.stage.addChild(ani);
  423. };
  424. /************************* */
  425. AgencyLottery.prototype.getreward = function (cfg) {
  426. if (cfg) {
  427. switch (cfg.type) {
  428. case 1:
  429. this.RoleData.Money += Number(cfg.value);
  430. GlobalTip_1.GlobalTip.Instance.showWordTips("恭喜获得" + cfg.value + "金币!");
  431. break;
  432. case 2:
  433. var rolecfg = RoleCFG_1.default.dict[cfg.value];
  434. this.getSingleTon(AgencySkin_1.AgencySkin).setRoleState(rolecfg, 1);
  435. GlobalTip_1.GlobalTip.Instance.showWordTips("恭喜获得角色" + rolecfg.rolename);
  436. break;
  437. }
  438. }
  439. };
  440. AgencyLottery.prototype.GetReward = function () {
  441. var index = 0;
  442. var dicts = LotteryCFG_1.default.vec;
  443. var maxNum = 0;
  444. var cfg;
  445. var i = 0;
  446. for (i = 0; i < dicts.length; i++) {
  447. cfg = dicts[i];
  448. maxNum += cfg.weight;
  449. }
  450. var sordvalue = GameUtils_1.GameUtils.randRangeint(1, maxNum);
  451. var totalnum = 0;
  452. for (i = 0; i < dicts.length; i++) {
  453. cfg = dicts[i];
  454. totalnum += cfg.weight;
  455. if (totalnum >= sordvalue) {
  456. index = i;
  457. break;
  458. }
  459. }
  460. return index;
  461. };
  462. /************************************************ */
  463. AgencyLottery.prototype.startFun = function () {
  464. this.mAniPath = "res/spine/spineRes1/dragon.sk";
  465. // this.mFactory = new Templet();
  466. // this.mFactory.on(Event.COMPLETE, this, this.parseComplete);
  467. // this.mFactory.on(Event.ERROR, this, this.onError);
  468. // this.mFactory.loadAni(this.mAniPath);
  469. };
  470. AgencyLottery.prototype.onError = function () {
  471. console.log("error");
  472. };
  473. AgencyLottery.prototype.parseComplete = function () {
  474. //创建模式为1,可以启用换装
  475. this.mArmature = this.mFactory.buildArmature(1);
  476. this.mArmature.x = this.mStartX;
  477. this.mArmature.y = this.mStartY;
  478. this.mArmature.scale(0.5, 0.5);
  479. Laya.stage.addChild(this.mArmature);
  480. // this.mArmature.on(Event.STOPPED, this, this.completeHandler);
  481. this.play();
  482. };
  483. AgencyLottery.prototype.completeHandler = function () {
  484. this.play();
  485. };
  486. AgencyLottery.prototype.play = function () {
  487. this.mCurrIndex++;
  488. if (this.mCurrIndex >= this.mArmature.getAnimNum()) {
  489. this.mCurrIndex = 0;
  490. }
  491. this.mArmature.play(this.mCurrIndex, false);
  492. };
  493. AgencyLottery.key = "AgencyLottery";
  494. return AgencyLottery;
  495. }(AgencyBaseControl_1.AgencyBaseControl));
  496. exports.AgencyLottery = AgencyLottery;
  497. },{"../CFG/LotteryCFG":12,"../CFG/RoleCFG":14,"../View/LotteryPanel":64,"../View/ViewManager":68,"../utils/GameUtils":85,"../utils/GlobalTip":86,"./AgencyBaseControl":1,"./AgencySkin":6}],5:[function(require,module,exports){
  498. "use strict";
  499. Object.defineProperty(exports, "__esModule", { value: true });
  500. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  501. var ResourceControl_1 = require("../Control/ResourceControl");
  502. var LoadingPanel_1 = require("../View/LoadingPanel");
  503. var ViewManager_1 = require("../View/ViewManager");
  504. var ResDataControl_1 = require("../Control/ResDataControl");
  505. var MainPanel_1 = require("../View/MainPanel");
  506. var SceneControl_1 = require("../Control/SceneControl");
  507. var AssetPath_1 = require("../Config/AssetPath");
  508. var GameStateControl_1 = require("../Control/GameStateControl");
  509. var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
  510. var NpcCFG_1 = require("../CFG/NpcCFG");
  511. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  512. var PropManager_1 = require("../PrefabControl/PropManager");
  513. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  514. var GiftView_1 = require("../View/GiftView");
  515. var AgencyMain = /** @class */ (function (_super) {
  516. __extends(AgencyMain, _super);
  517. function AgencyMain() {
  518. var _this = _super.call(this) || this;
  519. _this._loadjd = 0;
  520. _this._alljd = 0;
  521. return _this;
  522. }
  523. AgencyMain.prototype.initSelf = function () {
  524. };
  525. AgencyMain.prototype.StartMain = function () {
  526. this._loadjd = 0;
  527. this._alljd = 20;
  528. WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage("subpackage", this, this.sub1complete, this.loadprogress, null);
  529. };
  530. AgencyMain.prototype.sub1complete = function () {
  531. this._loadjd = 20;
  532. this._alljd = 30;
  533. WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage("subpackage1", this, this.SubpackageOver, this.loadprogress, null);
  534. };
  535. AgencyMain.prototype.onComplete = function () {
  536. //添加父级猴子
  537. var dude = this.scene.addChild(Laya.Loader.getRes("res/threeDimen/skinModel/dude/dude.lh"));
  538. //缩放
  539. var scale = new Laya.Vector3(0.1, 0.1, 0.1);
  540. dude.transform.localScale = scale;
  541. dude.transform.rotate(new Laya.Vector3(0, 3.14, 0));
  542. };
  543. /*************************************** */
  544. AgencyMain.prototype.SubpackageOver = function () {
  545. this._loadjd = 50;
  546. this._alljd = 40;
  547. var pathArr = [];
  548. var urlArr = [];
  549. urlArr.push(AssetPath_1.AssetPath.get3DModel("startpanel"));
  550. urlArr.push(AssetPath_1.AssetPath.get3DModel("endpanel"));
  551. urlArr.push(AssetPath_1.AssetPath.get3DModel("speedupeffect"));
  552. urlArr.push(AssetPath_1.AssetPath.get3DModel("color_white"));
  553. urlArr.push(AssetPath_1.AssetPath.get3DModel("color_yellow"));
  554. urlArr.push(AssetPath_1.AssetPath.get3DModel("winline"));
  555. urlArr.push(AssetPath_1.AssetPath.get3DModel("fireworks"));
  556. urlArr.push(AssetPath_1.AssetPath.get3DModel("DirectionalLight"));
  557. // urlArr.push( AssetPath.get3DModel( "distantview" ) );
  558. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(this.RoleData.roleCfg.name));
  559. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel("Arrow"));
  560. var arr = this.RoleData.levelmapArr;
  561. var i = 0;
  562. for (i = 0; i < arr.length; i++) {
  563. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DModel(arr[i])) == -1) {
  564. urlArr.push(AssetPath_1.AssetPath.get3DModel(arr[i]));
  565. }
  566. }
  567. var npcArr = this.RoleData.levelcfg.npc;
  568. for (i = 0; i < npcArr.length; i++) {
  569. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) {
  570. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name));
  571. }
  572. }
  573. for (i = 0; i < urlArr.length; i++) {
  574. pathArr.push({ url: urlArr[i] });
  575. }
  576. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.load3Dcomplete, this.loadprogress);
  577. };
  578. AgencyMain.prototype.load3Dcomplete = function () {
  579. this._loadjd = 90;
  580. this._alljd = 10;
  581. ResourceControl_1.ResourceControl.Instance.loadGroup("main", this, this.loadcomplete, this.loadprogress, false);
  582. };
  583. AgencyMain.prototype.loadprogress = function (value) {
  584. var loadingpanel = ViewManager_1.ViewManager.Instance.getView(LoadingPanel_1.LoadingPanel);
  585. if (loadingpanel) {
  586. value = this._loadjd + Math.ceil(value / 100 * this._alljd);
  587. loadingpanel.showWord(value);
  588. }
  589. };
  590. AgencyMain.prototype.loadcomplete = function () {
  591. fairygui.UIConfig.buttonSound = "ui://lecxynh2iz9y26";
  592. GameStateControl_1.GameStateControl.Instance.init();
  593. ResDataControl_1.ResDataControl.Instance.AddViewPackByName("main");
  594. ViewManager_1.ViewManager.Instance.close(LoadingPanel_1.LoadingPanel);
  595. // FYHD_Sdk.InitSdk();
  596. ViewManager_1.ViewManager.Instance.add(MainPanel_1.MainPanel);
  597. console.log("新用户FYHD_Sdk.isnewuser---", FYHD_Sdk_1.FYHD_Sdk.isnewuser);
  598. var newuser = Laya.LocalStorage.getItem("is_newuser");
  599. if (FYHD_Sdk_1.FYHD_Sdk.isnewuser) {
  600. Laya.timer.once(500, this, function () {
  601. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
  602. ViewManager_1.ViewManager.Instance.add(GiftView_1.default);
  603. }
  604. });
  605. }
  606. else {
  607. Laya.LocalStorage.setItem("is_newuser", "1");
  608. }
  609. SceneControl_1.SceneControl.Instance.SetScene();
  610. PropManager_1.PropManager.Instance.InitEffect();
  611. };
  612. AgencyMain.key = "AgencyMain";
  613. return AgencyMain;
  614. }(AgencyBaseControl_1.AgencyBaseControl));
  615. exports.AgencyMain = AgencyMain;
  616. },{"../CFG/NpcCFG":13,"../Config/AssetPath":15,"../Control/GameStateControl":20,"../Control/ResDataControl":25,"../Control/ResourceControl":26,"../Control/SceneControl":27,"../PrefabControl/PropManager":47,"../View/GiftView":61,"../View/LoadingPanel":63,"../View/MainPanel":65,"../View/ViewManager":68,"../WXSDK/FYHD_Sdk":69,"../WXSDK/PlayerAccount":73,"../WXSDK/WXGamePlatform":79,"./AgencyBaseControl":1}],6:[function(require,module,exports){
  617. "use strict";
  618. Object.defineProperty(exports, "__esModule", { value: true });
  619. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  620. var LocalDataControl_1 = require("../Control/LocalDataControl");
  621. var UserDataInfo_1 = require("../Data/UserDataInfo");
  622. var SkinData_1 = require("../Data/SkinData");
  623. var RoleCFG_1 = require("../CFG/RoleCFG");
  624. var ViewManager_1 = require("../View/ViewManager");
  625. var SkinPanel_1 = require("../View/SkinPanel");
  626. var GlobalTip_1 = require("../utils/GlobalTip");
  627. var GameState_1 = require("../utils/GameState");
  628. var AgencySkin = /** @class */ (function (_super) {
  629. __extends(AgencySkin, _super);
  630. function AgencySkin() {
  631. return _super.call(this) || this;
  632. }
  633. AgencySkin.prototype.initSelf = function () {
  634. };
  635. AgencySkin.prototype.init = function () {
  636. this.localdata = LocalDataControl_1.LocalDataControl.Instance.GetLocalCaCheData(UserDataInfo_1.UserDataInfo.skin);
  637. var pifuData;
  638. if (!this.localdata.hasOwnProperty("pifu")) {
  639. this.localdata["pifu"] = {};
  640. }
  641. pifuData = this.localdata["pifu"];
  642. this.pifuArr = [];
  643. this.pifuDict = {};
  644. var i = 0;
  645. var nums = RoleCFG_1.default.vec.length;
  646. for (i = 0; i < nums; i++) {
  647. var pifuvo = new SkinData_1.SkinData;
  648. var cfg = RoleCFG_1.default.vec[i];
  649. pifuvo.roleCFG = cfg;
  650. var d = pifuData[cfg.id];
  651. if (d) {
  652. pifuvo.state = Number(d.state);
  653. pifuvo.hasnum = Number(d.hasnum);
  654. }
  655. else {
  656. pifuvo.state = 0;
  657. pifuvo.hasnum = 0;
  658. }
  659. if (cfg.getState == 0) {
  660. pifuvo.state = 1;
  661. }
  662. this.pifuArr.push(pifuvo);
  663. this.pifuDict[pifuvo.roleCFG.id] = pifuvo;
  664. }
  665. };
  666. AgencySkin.prototype.openview = function () {
  667. ViewManager_1.ViewManager.Instance.add(SkinPanel_1.SkinPanel);
  668. };
  669. AgencySkin.prototype.setRoleState = function (cfg, value) {
  670. var pifuvo = this.pifuDict[cfg.id];
  671. if (pifuvo) {
  672. pifuvo.state = 1;
  673. this.AddLocalSkinData(pifuvo.roleCFG.id, pifuvo.state, pifuvo.hasnum);
  674. }
  675. };
  676. AgencySkin.prototype.AddLocalSkinData = function (id, state, hasnum) {
  677. this.localdata["pifu"][id] = {};
  678. this.localdata["pifu"][id]["state"] = state;
  679. this.localdata["pifu"][id]["hasnum"] = hasnum;
  680. LocalDataControl_1.LocalDataControl.Instance.AddData(UserDataInfo_1.UserDataInfo.skin, this.localdata);
  681. };
  682. AgencySkin.prototype.createCantralRect = function () {
  683. this.rect = new Laya.Sprite();
  684. this.rect.graphics.drawRect(-100, -100, 200, 200, "gray");
  685. Laya.stage.addChild(this.rect);
  686. this.updateRectPos();
  687. };
  688. AgencySkin.prototype.updateRectPos = function () {
  689. this.rect.x = Laya.stage.width / 2;
  690. this.rect.y = Laya.stage.height / 2;
  691. };
  692. /****************************************** */
  693. AgencySkin.prototype.GainPifu = function (_skinitem) {
  694. if (_skinitem.state == 1) {
  695. this.RoleData.CharacterID = _skinitem.roleCFG.id;
  696. this.DisTrigger(GameState_1.GameState.updateSKinView);
  697. }
  698. else {
  699. switch (_skinitem.roleCFG.getState) {
  700. case 1: //视频获取
  701. _skinitem.hasnum++;
  702. if (_skinitem.roleCFG.need <= _skinitem.hasnum) {
  703. _skinitem.state = 1;
  704. }
  705. this.AddLocalSkinData(_skinitem.roleCFG.id, _skinitem.state, _skinitem.hasnum);
  706. this.DisTrigger(GameState_1.GameState.updateSKinView);
  707. break;
  708. case 2: //金币购买
  709. if (this.RoleData.Money >= _skinitem.roleCFG.need) {
  710. this.RoleData.Money -= _skinitem.roleCFG.need;
  711. _skinitem.state = 1;
  712. this.AddLocalSkinData(_skinitem.roleCFG.id, _skinitem.state, _skinitem.hasnum);
  713. this.DisTrigger(GameState_1.GameState.updateSKinView);
  714. GlobalTip_1.GlobalTip.Instance.showWordTips("购买成功");
  715. }
  716. else {
  717. GlobalTip_1.GlobalTip.Instance.showWordTips("金币不足");
  718. }
  719. break;
  720. case 3: //活动获取
  721. break;
  722. }
  723. }
  724. };
  725. AgencySkin.prototype.GainNoHaveSkin = function () {
  726. var arr = [];
  727. for (var s in this.pifuDict) {
  728. if (this.pifuDict[s].state == 0) {
  729. arr.push(this.pifuDict[s]);
  730. }
  731. }
  732. return arr;
  733. };
  734. AgencySkin.key = "AgencySkin";
  735. return AgencySkin;
  736. }(AgencyBaseControl_1.AgencyBaseControl));
  737. exports.AgencySkin = AgencySkin;
  738. },{"../CFG/RoleCFG":14,"../Control/LocalDataControl":22,"../Data/SkinData":32,"../Data/UserDataInfo":33,"../View/SkinPanel":66,"../View/ViewManager":68,"../utils/GameState":84,"../utils/GlobalTip":86,"./AgencyBaseControl":1}],7:[function(require,module,exports){
  739. "use strict";
  740. Object.defineProperty(exports, "__esModule", { value: true });
  741. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  742. var ViewManager_1 = require("../View/ViewManager");
  743. var TrialPanel_1 = require("../View/TrialPanel");
  744. var GameStateControl_1 = require("../Control/GameStateControl");
  745. var AssetPath_1 = require("../Config/AssetPath");
  746. var ResourceControl_1 = require("../Control/ResourceControl");
  747. var SceneControl_1 = require("../Control/SceneControl");
  748. var AgencyInGame_1 = require("./AgencyInGame");
  749. var EggPanel_1 = require("../View/EggPanel");
  750. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  751. var AgencyTrial = /** @class */ (function (_super) {
  752. __extends(AgencyTrial, _super);
  753. function AgencyTrial() {
  754. var _this = _super.call(this) || this;
  755. _this.isshiyonging = false;
  756. return _this;
  757. }
  758. AgencyTrial.prototype.openview = function (arr) {
  759. ViewManager_1.ViewManager.Instance.add(TrialPanel_1.TrialPanel, arr);
  760. };
  761. /**退出界面 */
  762. AgencyTrial.prototype.ExitPanel = function (_data) {
  763. this.isshiyonging = _data ? true : false;
  764. this._selectvo = _data;
  765. if (_data) {
  766. var urlArr = [];
  767. urlArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(_data.roleCFG.name) });
  768. ResourceControl_1.ResourceControl.Instance.loader3DArr(urlArr, this, this.SceneCreateComplete, null, true);
  769. }
  770. else {
  771. // if(AgencyInGame.gamenum>1){
  772. var random = Math.random();
  773. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser && random <= PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.HitEgg) {
  774. ViewManager_1.ViewManager.Instance.add(EggPanel_1.default);
  775. }
  776. else {
  777. GameStateControl_1.GameStateControl.Instance.entergame();
  778. }
  779. // }
  780. // else{
  781. // GameStateControl.Instance.entergame();
  782. // }
  783. }
  784. ViewManager_1.ViewManager.Instance.close(TrialPanel_1.TrialPanel);
  785. };
  786. /************************************************ */
  787. AgencyTrial.prototype.createSprite = function () {
  788. this.sprit = new Laya.Sprite();
  789. this.sprit.graphics.drawRect(0, 0, 200, 200, "#D2691E");
  790. this.sprit.pivot(100, 100);
  791. this.sprit.x = Laya.stage.width / 2;
  792. this.sprit.y = Laya.stage.height / 2;
  793. this.sprit.size(200, 200);
  794. Laya.stage.addChild(this.sprit);
  795. // this.sp.on(Interaction_CustomEvent.ROTATE, this, this.onRotate); // 侦听自定义的事件
  796. // this.sprit.on(Event.CLICK, this, this.onSpriteClick);
  797. };
  798. AgencyTrial.prototype.onSpriteClick = function (e) {
  799. var randomAngle = Math.random() * 180;
  800. //发送自定义事件
  801. // this.sprit.event(Interaction_CustomEvent.ROTATE, [randomAngle]);
  802. };
  803. // 触发自定义的rotate事件
  804. AgencyTrial.prototype.onRotate = function (newAngle) {
  805. // Tween.to(this.sp, { "rotation": newAngle }, 1000, Ease.elasticOut);
  806. };
  807. /******************************* */
  808. AgencyTrial.prototype.SceneCreateComplete = function () {
  809. SceneControl_1.SceneControl.Instance.CreatePlayer(this._selectvo.roleCFG);
  810. if (AgencyInGame_1.AgencyInGame.gamenum > 1) {
  811. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
  812. ViewManager_1.ViewManager.Instance.add(EggPanel_1.default);
  813. }
  814. else {
  815. GameStateControl_1.GameStateControl.Instance.entergame();
  816. }
  817. }
  818. else {
  819. GameStateControl_1.GameStateControl.Instance.entergame();
  820. }
  821. };
  822. /******************************* */
  823. AgencyTrial.prototype.createText = function () {
  824. var txt = new Laya.Text();
  825. //给文本的text属性赋值
  826. txt.text = "Layabox是性能最强的HTML5引擎技术提供商与优秀的游戏发行商,面向Flash开发者提供HTML5开发技术方案!";
  827. //设置宽度,高度自动匹配
  828. txt.width = 400;
  829. //自动换行
  830. txt.wordWrap = true;
  831. txt.align = "center";
  832. txt.fontSize = 40;
  833. txt.font = "Microsoft YaHei";
  834. txt.color = "#ff0000";
  835. txt.bold = true;
  836. txt.leading = 5;
  837. //设置描边属性
  838. txt.stroke = 2;
  839. txt.strokeColor = "#ffffff";
  840. txt.borderColor = "#00ff00";
  841. txt.x = (Laya.stage.width - txt.textWidth) / 2;
  842. txt.y = (Laya.stage.height - txt.textHeight) / 2;
  843. Laya.stage.addChild(txt);
  844. };
  845. /************************** */
  846. AgencyTrial.prototype.createInput = function () {
  847. var inputText = new Laya.Input();
  848. // 移动端输入提示符
  849. inputText.prompt = "Type some word...";
  850. //多行输入
  851. inputText.multiline = true;
  852. inputText.wordWrap = true;
  853. inputText.size(350, 100);
  854. inputText.x = Laya.stage.width - inputText.width >> 1;
  855. inputText.y = Laya.stage.height - inputText.height >> 1;
  856. inputText.padding = [2, 2, 2, 2];
  857. inputText.bgColor = "#666666";
  858. inputText.color = "#ffffff";
  859. inputText.fontSize = 20;
  860. Laya.stage.addChild(inputText);
  861. };
  862. AgencyTrial.key = "AgencyTrial";
  863. return AgencyTrial;
  864. }(AgencyBaseControl_1.AgencyBaseControl));
  865. exports.AgencyTrial = AgencyTrial;
  866. },{"../Config/AssetPath":15,"../Control/GameStateControl":20,"../Control/ResourceControl":26,"../Control/SceneControl":27,"../View/EggPanel":60,"../View/TrialPanel":67,"../View/ViewManager":68,"../WXSDK/PlayerAccount":73,"./AgencyBaseControl":1,"./AgencyInGame":2}],8:[function(require,module,exports){
  867. "use strict";
  868. Object.defineProperty(exports, "__esModule", { value: true });
  869. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  870. var AgencyUserMessage = /** @class */ (function (_super) {
  871. __extends(AgencyUserMessage, _super);
  872. function AgencyUserMessage() {
  873. var _this = _super.call(this) || this;
  874. _this.roleisinit = false;
  875. return _this;
  876. }
  877. AgencyUserMessage.prototype.initSelf = function () {
  878. };
  879. /**加金币 */
  880. AgencyUserMessage.prototype.GoldUp = function (_num) {
  881. this.RoleData.Money += _num;
  882. };
  883. /**************************** */
  884. AgencyUserMessage.prototype.createInput = function () {
  885. var inputText = new Laya.Input();
  886. inputText.size(350, 100);
  887. inputText.x = Laya.stage.width - inputText.width >> 1;
  888. inputText.y = Laya.stage.height - inputText.height >> 1;
  889. inputText.text = "这段文本不可编辑,但可复制";
  890. inputText.editable = false;
  891. // 设置字体样式
  892. inputText.bold = true;
  893. inputText.bgColor = "#666666";
  894. inputText.color = "#ffffff";
  895. inputText.fontSize = 20;
  896. Laya.stage.addChild(inputText);
  897. };
  898. /******************************** */
  899. AgencyUserMessage.prototype.init = function () {
  900. this.RoleData.init();
  901. this.roleisinit = true;
  902. };
  903. /************************ */
  904. AgencyUserMessage.prototype.createText = function () {
  905. var txt = new Laya.Text();
  906. txt.text =
  907. "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!\n" +
  908. "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!\n" +
  909. "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!";
  910. txt.borderColor = "#FFFF00";
  911. txt.size(300, 50);
  912. txt.fontSize = 20;
  913. txt.color = "#ffffff";
  914. Laya.stage.addChild(txt);
  915. return txt;
  916. };
  917. /**************************** */
  918. /**升级 */
  919. AgencyUserMessage.prototype.LevelUp = function () {
  920. this.RoleData.LevelUp();
  921. };
  922. AgencyUserMessage.key = "AgencyUserMessage";
  923. return AgencyUserMessage;
  924. }(AgencyBaseControl_1.AgencyBaseControl));
  925. exports.AgencyUserMessage = AgencyUserMessage;
  926. },{"./AgencyBaseControl":1}],9:[function(require,module,exports){
  927. "use strict";
  928. Object.defineProperty(exports, "__esModule", { value: true });
  929. //------------------------------------------------------------------------------
  930. //工具生成,请勿修改。
  931. //配置文件名称:build.xlsx。
  932. //------------------------------------------------------------------------------
  933. var BuildCFG = /** @class */ (function () {
  934. function BuildCFG() {
  935. }
  936. BuildCFG.initCfg = function (str) {
  937. var i = 0;
  938. var arr = str.split("\n");
  939. var i = 0;
  940. for (i = 0; i < arr.length; i++) {
  941. var singleStr = arr[i];
  942. var singleArr = singleStr.split("&");
  943. if (BuildCFG.dict[singleArr[0]])
  944. continue;
  945. var item = new BuildCFG();
  946. item.name = singleArr[0];
  947. item.buffx = Number(singleArr[1]);
  948. item.buffy = Number(singleArr[2]);
  949. item.buffz = Number(singleArr[3]);
  950. item.time = Number(singleArr[4]);
  951. BuildCFG.dict[item.name] = item;
  952. BuildCFG.vec.push(item);
  953. }
  954. };
  955. BuildCFG.dict = {};
  956. BuildCFG.vec = [];
  957. return BuildCFG;
  958. }());
  959. exports.default = BuildCFG;
  960. },{}],10:[function(require,module,exports){
  961. "use strict";
  962. Object.defineProperty(exports, "__esModule", { value: true });
  963. //------------------------------------------------------------------------------
  964. //工具生成,请勿修改。
  965. //配置文件名称:game.xlsx。
  966. //------------------------------------------------------------------------------
  967. var GameCFG = /** @class */ (function () {
  968. function GameCFG() {
  969. }
  970. GameCFG.initCfg = function (str) {
  971. var i = 0;
  972. var arr = str.split("\n");
  973. var i = 0;
  974. for (i = 0; i < arr.length; i++) {
  975. var singleStr = arr[i];
  976. var singleArr = singleStr.split("&");
  977. if (GameCFG.dict[singleArr[0]])
  978. continue;
  979. var item = new GameCFG();
  980. item.id = Number(singleArr[0]);
  981. item.value = singleArr[1];
  982. GameCFG.dict[item.id] = item;
  983. GameCFG.vec.push(item);
  984. }
  985. };
  986. GameCFG.dict = {};
  987. GameCFG.vec = [];
  988. return GameCFG;
  989. }());
  990. exports.default = GameCFG;
  991. },{}],11:[function(require,module,exports){
  992. "use strict";
  993. Object.defineProperty(exports, "__esModule", { value: true });
  994. //------------------------------------------------------------------------------
  995. //工具生成,请勿修改。
  996. //配置文件名称:level.xlsx。
  997. //------------------------------------------------------------------------------
  998. var LevelCFG = /** @class */ (function () {
  999. function LevelCFG() {
  1000. }
  1001. LevelCFG.initCfg = function (str) {
  1002. var i = 0;
  1003. var arr = str.split("\n");
  1004. var i = 0;
  1005. for (i = 0; i < arr.length; i++) {
  1006. var singleStr = arr[i];
  1007. var singleArr = singleStr.split("&");
  1008. if (LevelCFG.dict[singleArr[0]])
  1009. continue;
  1010. var item = new LevelCFG();
  1011. item.id = Number(singleArr[0]);
  1012. item.road = singleArr[1];
  1013. item.roleinitpos = JSON.parse(singleArr[2]);
  1014. item.npc = JSON.parse(singleArr[3]);
  1015. item.firstScenepos = singleArr[4];
  1016. item.winGold = Number(singleArr[5]);
  1017. item.failGod = singleArr[6];
  1018. LevelCFG.dict[item.id] = item;
  1019. LevelCFG.vec.push(item);
  1020. }
  1021. };
  1022. LevelCFG.dict = {};
  1023. LevelCFG.vec = [];
  1024. return LevelCFG;
  1025. }());
  1026. exports.default = LevelCFG;
  1027. },{}],12:[function(require,module,exports){
  1028. "use strict";
  1029. Object.defineProperty(exports, "__esModule", { value: true });
  1030. //------------------------------------------------------------------------------
  1031. //工具生成,请勿修改。
  1032. //配置文件名称:lottery.xlsx。
  1033. //------------------------------------------------------------------------------
  1034. var LotteryCFG = /** @class */ (function () {
  1035. function LotteryCFG() {
  1036. }
  1037. LotteryCFG.initCfg = function (str) {
  1038. var i = 0;
  1039. var arr = str.split("\n");
  1040. var i = 0;
  1041. for (i = 0; i < arr.length; i++) {
  1042. var singleStr = arr[i];
  1043. var singleArr = singleStr.split("&");
  1044. if (LotteryCFG.dict[singleArr[0]])
  1045. continue;
  1046. var item = new LotteryCFG();
  1047. item.id = Number(singleArr[0]);
  1048. item.type = Number(singleArr[1]);
  1049. item.value = singleArr[2];
  1050. item.weight = Number(singleArr[3]);
  1051. LotteryCFG.dict[item.id] = item;
  1052. LotteryCFG.vec.push(item);
  1053. }
  1054. };
  1055. LotteryCFG.dict = {};
  1056. LotteryCFG.vec = [];
  1057. return LotteryCFG;
  1058. }());
  1059. exports.default = LotteryCFG;
  1060. },{}],13:[function(require,module,exports){
  1061. "use strict";
  1062. Object.defineProperty(exports, "__esModule", { value: true });
  1063. //------------------------------------------------------------------------------
  1064. //工具生成,请勿修改。
  1065. //配置文件名称:npc.xlsx。
  1066. //------------------------------------------------------------------------------
  1067. var NpcCFG = /** @class */ (function () {
  1068. function NpcCFG() {
  1069. }
  1070. NpcCFG.initCfg = function (str) {
  1071. var i = 0;
  1072. var arr = str.split("\n");
  1073. var i = 0;
  1074. for (i = 0; i < arr.length; i++) {
  1075. var singleStr = arr[i];
  1076. var singleArr = singleStr.split("&");
  1077. if (NpcCFG.dict[singleArr[0]])
  1078. continue;
  1079. var item = new NpcCFG();
  1080. item.id = Number(singleArr[0]);
  1081. item.name = singleArr[1];
  1082. item.speed = Number(singleArr[2]);
  1083. item.frontjump = JSON.parse(singleArr[3]);
  1084. item.leftjump = JSON.parse(singleArr[4]);
  1085. item.rightjump = JSON.parse(singleArr[5]);
  1086. item.upclimb = Number(singleArr[6]);
  1087. item.slideclimb = JSON.parse(singleArr[7]);
  1088. item.jump_left = Number(singleArr[8]);
  1089. item.jump_right = Number(singleArr[9]);
  1090. item.start_ahead = Number(singleArr[10]);
  1091. item.distance = Number(singleArr[11]);
  1092. item.gravity = Number(singleArr[12]);
  1093. NpcCFG.dict[item.id] = item;
  1094. NpcCFG.vec.push(item);
  1095. }
  1096. };
  1097. NpcCFG.dict = {};
  1098. NpcCFG.vec = [];
  1099. return NpcCFG;
  1100. }());
  1101. exports.default = NpcCFG;
  1102. },{}],14:[function(require,module,exports){
  1103. "use strict";
  1104. Object.defineProperty(exports, "__esModule", { value: true });
  1105. //------------------------------------------------------------------------------
  1106. //工具生成,请勿修改。
  1107. //配置文件名称:role.xlsx。
  1108. //------------------------------------------------------------------------------
  1109. var RoleCFG = /** @class */ (function () {
  1110. function RoleCFG() {
  1111. }
  1112. RoleCFG.initCfg = function (str) {
  1113. var i = 0;
  1114. var arr = str.split("\n");
  1115. var i = 0;
  1116. for (i = 0; i < arr.length; i++) {
  1117. var singleStr = arr[i];
  1118. var singleArr = singleStr.split("&");
  1119. if (RoleCFG.dict[singleArr[0]])
  1120. continue;
  1121. var item = new RoleCFG();
  1122. item.id = Number(singleArr[0]);
  1123. item.name = singleArr[1];
  1124. item.speed = Number(singleArr[2]);
  1125. item.frontjump = JSON.parse(singleArr[3]);
  1126. item.leftjump = JSON.parse(singleArr[4]);
  1127. item.rightjump = JSON.parse(singleArr[5]);
  1128. item.upclimb = Number(singleArr[6]);
  1129. item.slideclimb = JSON.parse(singleArr[7]);
  1130. item.getState = Number(singleArr[8]);
  1131. item.need = Number(singleArr[9]);
  1132. item.icon = singleArr[10];
  1133. item.gravity = Number(singleArr[11]);
  1134. item.rolename = singleArr[12];
  1135. RoleCFG.dict[item.id] = item;
  1136. RoleCFG.vec.push(item);
  1137. }
  1138. };
  1139. RoleCFG.dict = {};
  1140. RoleCFG.vec = [];
  1141. return RoleCFG;
  1142. }());
  1143. exports.default = RoleCFG;
  1144. },{}],15:[function(require,module,exports){
  1145. "use strict";
  1146. Object.defineProperty(exports, "__esModule", { value: true });
  1147. var Global_1 = require("../Global");
  1148. /*
  1149. * name;
  1150. */
  1151. var AssetPath = /** @class */ (function () {
  1152. function AssetPath() {
  1153. }
  1154. AssetPath.init = function () {
  1155. AssetPath.versionrandom = "?v=" + Math.random();
  1156. };
  1157. AssetPath.getsound = function (id) {
  1158. return Global_1.Global.getUrl(AssetPath.resources + AssetPath.music + id + ".mp3");
  1159. };
  1160. AssetPath.getResConfig = function () {
  1161. return Global_1.Global.getUrl(AssetPath.resources + "resConfig.json");
  1162. };
  1163. AssetPath.getConfig = function (configname) {
  1164. return Global_1.Global.getUrl(AssetPath.resources + configname + ".bin");
  1165. };
  1166. AssetPath.get3Dscene = function (name) {
  1167. return Global_1.Global.getUrl(AssetPath.res + AssetPath.prop + "Conventional/" + name + ".ls");
  1168. };
  1169. AssetPath.get3DModel = function (name) {
  1170. return Global_1.Global.getUrl(AssetPath.res + AssetPath.prop + "Conventional/" + name + ".lh");
  1171. };
  1172. AssetPath.get3DRoleModel = function (name) {
  1173. return Global_1.Global.getUrl(AssetPath.res + "character/Conventional/" + name + ".lh");
  1174. };
  1175. AssetPath.getroleicon = function (id) {
  1176. return Global_1.Global.getUrl(AssetPath.res + "skinicon/" + id + ".png");
  1177. };
  1178. AssetPath.getVerisonurl = function () {
  1179. if (Global_1.Global.isdebug) {
  1180. return Global_1.Global.getUrl(AssetPath.res + "version.json") + AssetPath.versionrandom;
  1181. }
  1182. return Global_1.Global.getUrl(AssetPath.res + "version" + Global_1.Global.resconfigVersion + ".json");
  1183. };
  1184. AssetPath.getGameVersion = function () {
  1185. return Global_1.Global.getUrl("gameversion.json");
  1186. };
  1187. /**获取匹配人物头像icon */
  1188. AssetPath.pipeiicon = function (id) {
  1189. return Global_1.Global.getUrl(AssetPath.res + "icon/" + id + ".png");
  1190. };
  1191. AssetPath.res = "res/";
  1192. AssetPath.resources = "resources/";
  1193. // export var configs:string = "configs/";
  1194. AssetPath.ui = "ui/";
  1195. AssetPath.subpacksgeui = "character/ui/";
  1196. AssetPath.music = "music/";
  1197. AssetPath.versionrandom = "";
  1198. AssetPath.prop = "prop/";
  1199. AssetPath.skinicon = "skinicon/";
  1200. return AssetPath;
  1201. }());
  1202. exports.AssetPath = AssetPath;
  1203. },{"../Global":39}],16:[function(require,module,exports){
  1204. "use strict";
  1205. Object.defineProperty(exports, "__esModule", { value: true });
  1206. var AssetPath_1 = require("./AssetPath");
  1207. var Global_1 = require("../Global");
  1208. /*
  1209. * name;
  1210. */
  1211. var RecConfigs = /** @class */ (function (_super) {
  1212. __extends(RecConfigs, _super);
  1213. function RecConfigs() {
  1214. var _this = _super.call(this) || this;
  1215. RecConfigs.ins = _this;
  1216. return _this;
  1217. }
  1218. Object.defineProperty(RecConfigs, "Instance", {
  1219. get: function () {
  1220. if (RecConfigs.ins == null) {
  1221. return new RecConfigs();
  1222. }
  1223. return RecConfigs.ins;
  1224. },
  1225. enumerable: true,
  1226. configurable: true
  1227. });
  1228. RecConfigs.prototype.init = function () {
  1229. this.ResDic = {};
  1230. };
  1231. /****************************************************************** */
  1232. RecConfigs.prototype.loadUI = function () {
  1233. Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(this, function () {
  1234. var changeActionButton = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", "正常模式"));
  1235. changeActionButton.size(160, 40);
  1236. changeActionButton.labelBold = true;
  1237. changeActionButton.labelSize = 30;
  1238. changeActionButton.sizeGrid = "4,4,4,4";
  1239. changeActionButton.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
  1240. changeActionButton.pos(Laya.stage.width / 2 - changeActionButton.width * Laya.Browser.pixelRatio / 2, Laya.stage.height - 100 * Laya.Browser.pixelRatio);
  1241. changeActionButton.on(Laya.Event.CLICK, this, function () {
  1242. if (++this.curStateIndex % 2 == 1) {
  1243. this.sprite3D.active = false;
  1244. this.lineSprite3D.active = true;
  1245. changeActionButton.label = "网格模式";
  1246. }
  1247. else {
  1248. this.sprite3D.active = true;
  1249. this.lineSprite3D.active = false;
  1250. changeActionButton.label = "正常模式";
  1251. }
  1252. });
  1253. }));
  1254. };
  1255. /****************************************************************** */
  1256. RecConfigs.prototype.initRec = function (_res) {
  1257. if (_res != null && !RecConfigs.inited) {
  1258. RecConfigs.inited = true;
  1259. var groupsArr = _res.groups;
  1260. var resourcesArr = _res.resources;
  1261. var resourcesDict = {};
  1262. for (var item in resourcesArr) {
  1263. var child = resourcesArr[item];
  1264. switch (child.type) {
  1265. case "bin":
  1266. child.type = Laya.Loader.BUFFER;
  1267. break;
  1268. case "ls":
  1269. child.type = Laya.Scene;
  1270. break;
  1271. case "lh":
  1272. child.type = Laya.Sprite3D;
  1273. break;
  1274. case "lm":
  1275. child.type = Laya.MeshSprite3D;
  1276. break;
  1277. }
  1278. resourcesDict[child.name] = child;
  1279. }
  1280. for (var grouptype in groupsArr) {
  1281. var groupchild = groupsArr[grouptype];
  1282. var arr = groupchild.keys.split(",");
  1283. var childArr = [];
  1284. var chidstr;
  1285. for (chidstr in arr) {
  1286. var strChild = arr[chidstr];
  1287. if (strChild != "") {
  1288. var urls = resourcesDict[strChild].url;
  1289. urls = urls.replace("res/", AssetPath_1.AssetPath.res);
  1290. childArr.push({ url: Global_1.Global.getUrl(urls), type: resourcesDict[strChild].type });
  1291. }
  1292. }
  1293. this.ResDic[groupchild.name] = childArr;
  1294. }
  1295. Laya.loader.clearRes(AssetPath_1.AssetPath.getResConfig());
  1296. }
  1297. };
  1298. /**
  1299. * 是否已经初始化
  1300. */
  1301. RecConfigs.inited = false;
  1302. return RecConfigs;
  1303. }(Laya.EventDispatcher));
  1304. exports.RecConfigs = RecConfigs;
  1305. },{"../Global":39,"./AssetPath":15}],17:[function(require,module,exports){
  1306. "use strict";
  1307. Object.defineProperty(exports, "__esModule", { value: true });
  1308. var AssetPath_1 = require("../Config/AssetPath");
  1309. /*
  1310. * name;
  1311. */
  1312. var AudioControl = /** @class */ (function (_super) {
  1313. __extends(AudioControl, _super);
  1314. function AudioControl() {
  1315. var _this = _super.call(this) || this;
  1316. _this._isbgOpen = true;
  1317. _this.open = true;
  1318. _this._isAllOpen = true;
  1319. _this._nowBgName = "";
  1320. _this._isPlaybging = false;
  1321. /**
  1322. * 声音开关引用索引
  1323. */
  1324. _this._soundIndex = 0;
  1325. AudioControl.ins = _this;
  1326. return _this;
  1327. }
  1328. Object.defineProperty(AudioControl, "Instance", {
  1329. get: function () {
  1330. if (AudioControl.ins == null) {
  1331. return new AudioControl();
  1332. }
  1333. return AudioControl.ins;
  1334. },
  1335. enumerable: true,
  1336. configurable: true
  1337. });
  1338. AudioControl.prototype.init = function () {
  1339. Laya.SoundManager.autoReleaseSound = false;
  1340. Laya.SoundManager.autoStopMusic = true;
  1341. };
  1342. Object.defineProperty(AudioControl.prototype, "gamesoundOpen", {
  1343. set: function (value) {
  1344. this.open = value;
  1345. Laya.SoundManager.soundMuted = !value;
  1346. if (value == true) {
  1347. fairygui.UIConfig.buttonSoundVolumeScale = 1;
  1348. }
  1349. else {
  1350. fairygui.UIConfig.buttonSoundVolumeScale = 0;
  1351. }
  1352. },
  1353. enumerable: true,
  1354. configurable: true
  1355. });
  1356. Object.defineProperty(AudioControl.prototype, "GetSoundSwitch", {
  1357. /**
  1358. * 音效是否开启
  1359. */
  1360. get: function () {
  1361. return this.open;
  1362. },
  1363. enumerable: true,
  1364. configurable: true
  1365. });
  1366. Object.defineProperty(AudioControl.prototype, "isbgOpen", {
  1367. /**
  1368. * 背景音乐是否开启
  1369. */
  1370. get: function () {
  1371. return this._isbgOpen;
  1372. },
  1373. set: function (value) {
  1374. this._isbgOpen = value;
  1375. Laya.SoundManager.musicMuted = !value;
  1376. },
  1377. enumerable: true,
  1378. configurable: true
  1379. });
  1380. Object.defineProperty(AudioControl.prototype, "isAllOpen", {
  1381. /**
  1382. * 所有音乐是否开启
  1383. */
  1384. get: function () {
  1385. return this._isAllOpen;
  1386. },
  1387. set: function (value) {
  1388. if (value) {
  1389. this._soundIndex--;
  1390. if (this._soundIndex < 0) {
  1391. this._soundIndex = 0;
  1392. }
  1393. if (!this._isPlaybging && this._soundIndex == 0) {
  1394. this._isAllOpen = true;
  1395. this.setGameVolume(1);
  1396. this.playbgSound(this._nowBgName);
  1397. fairygui.UIConfig.buttonSoundVolumeScale = 1;
  1398. }
  1399. else {
  1400. this._isAllOpen = false;
  1401. }
  1402. }
  1403. else {
  1404. this._isAllOpen = false;
  1405. if (this._soundIndex < 0) {
  1406. this._soundIndex = 0;
  1407. }
  1408. this._soundIndex++;
  1409. if (this._isPlaybging) {
  1410. this.stopbgSound();
  1411. }
  1412. this.setGameVolume(0);
  1413. fairygui.UIConfig.buttonSoundVolumeScale = 0;
  1414. }
  1415. },
  1416. enumerable: true,
  1417. configurable: true
  1418. });
  1419. /**
  1420. * 停止播放音效
  1421. */
  1422. AudioControl.prototype.stopGameSound = function () {
  1423. Laya.SoundManager.stopAllSound();
  1424. };
  1425. /**
  1426. * 停止所有声音
  1427. */
  1428. AudioControl.prototype.ClearAllSOUND = function () {
  1429. this.stopGameSound();
  1430. this.stopbgSound();
  1431. };
  1432. /**
  1433. * 播放背景音乐
  1434. * @param soundName 声音名
  1435. */
  1436. AudioControl.prototype.playbgSound = function (soundName) {
  1437. this._nowBgName = soundName;
  1438. if (this._isAllOpen && this._nowBgName != "" && this._soundIndex <= 0 && !this._isPlaybging) {
  1439. this._isPlaybging = true;
  1440. Laya.SoundManager.playMusic(AssetPath_1.AssetPath.getsound(this._nowBgName));
  1441. this.bgSoundVolume = 0.4;
  1442. }
  1443. };
  1444. /**
  1445. * 停止背景音乐
  1446. */
  1447. AudioControl.prototype.stopbgSound = function () {
  1448. this._isPlaybging = false;
  1449. Laya.SoundManager.stopMusic();
  1450. };
  1451. Object.defineProperty(AudioControl.prototype, "bgSoundVolume", {
  1452. get: function () {
  1453. return Laya.SoundManager.musicVolume;
  1454. },
  1455. /**
  1456. * 设置背景音乐音量
  1457. * @param value 音量范围从 0(静音)至 1(最大音量)。
  1458. */
  1459. set: function (value) {
  1460. Laya.SoundManager.setMusicVolume(value);
  1461. },
  1462. enumerable: true,
  1463. configurable: true
  1464. });
  1465. Object.defineProperty(AudioControl.prototype, "soundVolume", {
  1466. get: function () {
  1467. return Laya.SoundManager.soundVolume;
  1468. },
  1469. /**
  1470. * 设置背景音乐音量
  1471. * @param value 音量范围从 0(静音)至 1(最大音量)。
  1472. */
  1473. set: function (value) {
  1474. Laya.SoundManager.setSoundVolume(value);
  1475. },
  1476. enumerable: true,
  1477. configurable: true
  1478. });
  1479. /**
  1480. * 设置所有声音音量
  1481. * @param value 音量范围从 0(静音)至 1(最大音量)。
  1482. */
  1483. AudioControl.prototype.setGameVolume = function (value) {
  1484. this.bgSoundVolume = value;
  1485. this.soundVolume = value;
  1486. };
  1487. /**
  1488. * 播放音效
  1489. * @param soundName 音效名
  1490. * @param loop 播放次数
  1491. */
  1492. AudioControl.prototype.playGameSound = function (soundName, loop) {
  1493. if (loop === void 0) { loop = 1; }
  1494. if (this._isAllOpen && soundName != "" && Laya.SoundManager.soundVolume != 0) {
  1495. Laya.SoundManager.playSound(AssetPath_1.AssetPath.getsound(soundName), loop);
  1496. }
  1497. };
  1498. return AudioControl;
  1499. }(Laya.EventDispatcher));
  1500. exports.AudioControl = AudioControl;
  1501. },{"../Config/AssetPath":15}],18:[function(require,module,exports){
  1502. "use strict";
  1503. Object.defineProperty(exports, "__esModule", { value: true });
  1504. var ResourceControl_1 = require("./ResourceControl");
  1505. var SkinItem_1 = require("../utils/SkinItem");
  1506. var CpaDownsView_1 = require("../Push/CpaDownsView");
  1507. var CpaItem_1 = require("../Push/CpaItem");
  1508. var BaoKuanGameView_1 = require("../Push/BaoKuanGameView");
  1509. var ShiwantuijianView_1 = require("../Push/ShiwantuijianView");
  1510. /*
  1511. * name;
  1512. */
  1513. var ConnectControl = /** @class */ (function (_super) {
  1514. __extends(ConnectControl, _super);
  1515. function ConnectControl() {
  1516. var _this = _super.call(this) || this;
  1517. /****************************************************** */
  1518. _this.motionCross = false;
  1519. _this.blendType = 0;
  1520. _this.motionIndex = 0;
  1521. _this.motions = ["run", "run_2", "attack", "attack_1", "attack_2", "dead", "idle_2", "idle_3", "idle_4", "idle4", "reload", "replace", "replace_2", "stop"];
  1522. return _this;
  1523. }
  1524. /**
  1525. * 组件绑定
  1526. */
  1527. ConnectControl.ConnectComponent = function () {
  1528. //main
  1529. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2pwlk1a", SkinItem_1.SkinItem);
  1530. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c527", CpaDownsView_1.default);
  1531. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c528", CpaItem_1.default);
  1532. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c529", BaoKuanGameView_1.default);
  1533. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52a", CpaItem_1.default);
  1534. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52b", ShiwantuijianView_1.default);
  1535. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52c", CpaItem_1.default);
  1536. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc21", CpaItem_1.default);
  1537. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc22", CpaItem_1.default);
  1538. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52e", CpaItem_1.default);
  1539. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2uotu6h", CpaItem_1.default);
  1540. // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2ip616l", GiftView);
  1541. // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52d", TuijianView);
  1542. // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2kalr6k",FriendInviteView);
  1543. };
  1544. ConnectControl.prototype.sceneLoaded = function (scene) {
  1545. Laya.stage.addChild(scene);
  1546. var animator = scene.getChildAt(2).getComponent(Laya.Animator);
  1547. this.addButton(100, 100, 160, 30, "动画过渡:否", 20, function (e) {
  1548. this.motionCross = !this.motionCross;
  1549. if (this.motionCross)
  1550. e.target.label = "动画过渡:是";
  1551. else
  1552. e.target.label = "动画过渡:否";
  1553. });
  1554. this.addButton(100, 160, 160, 30, "混合模式:全身", 20, function (e) {
  1555. this.blendType++;
  1556. (this.blendType === 3) && (this.blendType = 0);
  1557. switch (this.blendType) {
  1558. case 0:
  1559. e.target.label = "混合模式:全身";
  1560. break;
  1561. case 1:
  1562. e.target.label = "混合模式:上身";
  1563. break;
  1564. case 2:
  1565. e.target.label = "混合模式:下身";
  1566. break;
  1567. }
  1568. });
  1569. this.addButton(100, 220, 260, 40, "切换动作:attack_2", 28, function (e) {
  1570. switch (this.blendType) {
  1571. case 0:
  1572. if (this.motionCross) {
  1573. animator.crossFade(this.motions[this.motionIndex], 0.2, 0);
  1574. animator.crossFade(this.motions[this.motionIndex], 0.2, 1);
  1575. }
  1576. else {
  1577. animator.play(this.motions[this.motionIndex], 0);
  1578. animator.play(this.motions[this.motionIndex], 1);
  1579. }
  1580. break;
  1581. case 1:
  1582. if (this.motionCross)
  1583. animator.crossFade(this.motions[this.motionIndex], 0.2, 0);
  1584. else
  1585. animator.play(this.motions[this.motionIndex], 0);
  1586. break;
  1587. case 2:
  1588. if (this.motionCross)
  1589. animator.crossFade(this.motions[this.motionIndex], 0.2, 1);
  1590. else
  1591. animator.play(this.motions[this.motionIndex], 1);
  1592. break;
  1593. }
  1594. e.target.label = "切换动作:" + this.motions[this.motionIndex];
  1595. this.motionIndex++;
  1596. (this.motionIndex === this.motions.length) && (this.motionIndex = 0);
  1597. });
  1598. };
  1599. ConnectControl.prototype.addButton = function (x, y, width, height, text, size, clickFun) {
  1600. var thiss = this;
  1601. Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(null, function () {
  1602. var changeActionButton = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", text));
  1603. changeActionButton.size(width, height);
  1604. changeActionButton.labelBold = true;
  1605. changeActionButton.labelSize = size;
  1606. changeActionButton.sizeGrid = "4,4,4,4";
  1607. changeActionButton.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
  1608. changeActionButton.pos(x, y);
  1609. changeActionButton.on(Laya.Event.CLICK, thiss, clickFun);
  1610. }));
  1611. };
  1612. /****************************************************** */
  1613. /**
  1614. * 数据绑定
  1615. */
  1616. ConnectControl.Connnect = function () {
  1617. this.ConnectFairygui();
  1618. this.ConnectComponent();
  1619. };
  1620. /**
  1621. * ui框架的绑定
  1622. */
  1623. ConnectControl.ConnectFairygui = function () {
  1624. fairygui.UIConfig.gameLoaderManager = ResourceControl_1.ResourceControl.Instance;
  1625. //特效绑定( url 绑定组名,只有公共特效需要绑定 ) "ui://fqpgxr1kl6mw0":"effect1"
  1626. fairygui.UIConfig.gameEffectDict = {};
  1627. };
  1628. return ConnectControl;
  1629. }(Laya.EventDispatcher));
  1630. exports.ConnectControl = ConnectControl;
  1631. },{"../Push/BaoKuanGameView":48,"../Push/CpaDownsView":50,"../Push/CpaItem":52,"../Push/ShiwantuijianView":54,"../utils/SkinItem":90,"./ResourceControl":26}],19:[function(require,module,exports){
  1632. "use strict";
  1633. Object.defineProperty(exports, "__esModule", { value: true });
  1634. var LocalDataControl_1 = require("./LocalDataControl");
  1635. var TimeUtils_1 = require("../Time/TimeUtils");
  1636. var UserDataInfo_1 = require("../Data/UserDataInfo");
  1637. var TimesTamper_1 = require("../Time/TimesTamper");
  1638. var DateControl = /** @class */ (function () {
  1639. function DateControl() {
  1640. DateControl.ins = this;
  1641. }
  1642. Object.defineProperty(DateControl, "Instance", {
  1643. get: function () {
  1644. if (DateControl.ins == null) {
  1645. return new DateControl();
  1646. }
  1647. return DateControl.ins;
  1648. },
  1649. enumerable: true,
  1650. configurable: true
  1651. });
  1652. /************************************************************** */
  1653. DateControl.prototype.loadUI = function () {
  1654. Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(this, function () {
  1655. var button = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", "关闭HDR"));
  1656. button.size(200, 40);
  1657. button.labelBold = true;
  1658. button.labelSize = 30;
  1659. button.sizeGrid = "4,4,4,4";
  1660. button.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
  1661. button.pos(Laya.stage.width / 2 - button.width * Laya.Browser.pixelRatio / 2, Laya.stage.height - 60 * Laya.Browser.pixelRatio);
  1662. button.on(Laya.Event.CLICK, this, function () {
  1663. var enableHDR = this.camera.enableHDR;
  1664. if (enableHDR)
  1665. button.label = "开启HDR";
  1666. else
  1667. button.label = "关闭HDR";
  1668. this.camera.enableHDR = !enableHDR;
  1669. });
  1670. }));
  1671. };
  1672. /************************************************ */
  1673. DateControl.prototype.SetSelf = function () {
  1674. var lastday = LocalDataControl_1.LocalDataControl.Instance.getstr(UserDataInfo_1.UserDataInfo.lastDay);
  1675. var nowday = TimeUtils_1.TimeUtils.formatYearMonthDate1(TimesTamper_1.TimesTamper.Instance.serverTime);
  1676. if (lastday != nowday) {
  1677. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lastDay, nowday);
  1678. DateControl.Fresh = true;
  1679. }
  1680. else {
  1681. DateControl.Fresh = false;
  1682. }
  1683. };
  1684. return DateControl;
  1685. }());
  1686. exports.DateControl = DateControl;
  1687. },{"../Data/UserDataInfo":33,"../Time/TimeUtils":56,"../Time/TimesTamper":58,"./LocalDataControl":22}],20:[function(require,module,exports){
  1688. "use strict";
  1689. Object.defineProperty(exports, "__esModule", { value: true });
  1690. var JoystickModule_1 = require("../JoystickModule");
  1691. var DispatcherManager_1 = require("../utils/DispatcherManager");
  1692. var GameState_1 = require("../utils/GameState");
  1693. var SceneControl_1 = require("../Control/SceneControl");
  1694. var PropManager_1 = require("../PrefabControl/PropManager");
  1695. var TimerService_1 = require("../Time/TimerService");
  1696. var GameCFG_1 = require("../CFG/GameCFG");
  1697. var AudioControl_1 = require("../Control/AudioControl");
  1698. var Sdk_1 = require("../WXSDK/Sdk");
  1699. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  1700. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  1701. var AgencyTrial_1 = require("../Agency/AgencyTrial");
  1702. var AgencySkin_1 = require("../Agency/AgencySkin");
  1703. var RecordManager_1 = require("../WXSDK/RecordManager");
  1704. var GameStateControl = /** @class */ (function () {
  1705. function GameStateControl() {
  1706. /**
  1707. * 0:未开始,1:游戏中,2:暂停中
  1708. */
  1709. this.nowGameState = 0;
  1710. this._zhuanxiangbeishu = 0;
  1711. this._huadongSpeedX = 0;
  1712. this._huadongClimbSpeedX = 0;
  1713. this.endGamePlayerArr = [];
  1714. this._isneedShunyiX = false;
  1715. this._nowTime = 0;
  1716. this._lastAngle = 0;
  1717. this._time = 0;
  1718. this.nowMingCi = 0;
  1719. this._nums = 0;
  1720. this._all = 0;
  1721. GameStateControl.ins = this;
  1722. }
  1723. Object.defineProperty(GameStateControl, "Instance", {
  1724. get: function () {
  1725. if (GameStateControl.ins == null) {
  1726. return new GameStateControl();
  1727. }
  1728. return GameStateControl.ins;
  1729. },
  1730. enumerable: true,
  1731. configurable: true
  1732. });
  1733. GameStateControl.prototype.init = function () {
  1734. this._huadongSpeedX = Number(GameCFG_1.default.dict[4].value);
  1735. this._huadongClimbSpeedX = Number(GameCFG_1.default.dict[5].value);
  1736. if (GameCFG_1.default.dict[7]) {
  1737. this._zhuanxiangbeishu = Number(GameCFG_1.default.dict[7].value);
  1738. }
  1739. else {
  1740. this._zhuanxiangbeishu = 2;
  1741. }
  1742. this.initEvent();
  1743. };
  1744. GameStateControl.prototype.initEvent = function () {
  1745. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.lose, this, this.endGame);
  1746. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.end, this, this.endGame);
  1747. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.npcend, this, this.npcendGameHandler);
  1748. };
  1749. GameStateControl.prototype.npcendGameHandler = function (str) {
  1750. this.endGamePlayerArr.push(str);
  1751. };
  1752. GameStateControl.prototype.setClickPanel = function (panel) {
  1753. this._joystickModule = new JoystickModule_1.JoystickModule(panel);
  1754. this._joystickModule.setEventCallback(this, this.ondownfun, this.onmovefun, this.onupfun);
  1755. };
  1756. GameStateControl.prototype.ondownfun = function () {
  1757. this._lastAngle = 0;
  1758. this._nowTime = Laya.Browser.now() / 1000;
  1759. };
  1760. GameStateControl.prototype.onmovefun = function (offsetX) {
  1761. if (this.nowGameState == 1) {
  1762. var disAngle = this._joystickModule.angle - this._lastAngle;
  1763. this._lastAngle = this._joystickModule.angle;
  1764. if (PropManager_1.PropManager.iscarmanpc) {
  1765. PropManager_1.PropManager.npcscriptDict["npc_0"].Joy(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, disAngle * this._zhuanxiangbeishu);
  1766. }
  1767. else {
  1768. SceneControl_1.SceneControl.Instance.PlayerScript.Joy(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, offsetX > 0 ? this._huadongClimbSpeedX : -this._huadongClimbSpeedX, disAngle * this._zhuanxiangbeishu);
  1769. }
  1770. }
  1771. };
  1772. GameStateControl.prototype.onupfun = function () {
  1773. if (PropManager_1.PropManager.iscarmanpc) {
  1774. PropManager_1.PropManager.npcscriptDict["npc_0"].Joy(0, 0);
  1775. }
  1776. else {
  1777. if (this.nowGameState == 1) {
  1778. SceneControl_1.SceneControl.Instance.PlayerScript.Joy(0, 0, 0);
  1779. }
  1780. }
  1781. };
  1782. GameStateControl.prototype.update = function (dt) {
  1783. if (this.nowGameState == 1) {
  1784. this._time = 0;
  1785. var npcdict = PropManager_1.PropManager.npcscriptDict;
  1786. this._nums = 0;
  1787. this._all = 0;
  1788. var s;
  1789. var npcsp;
  1790. for (s in npcdict) {
  1791. npcsp = npcdict[s];
  1792. if (npcsp.getAction() == 1) {
  1793. if (PropManager_1.PropManager.mainRole.transform.position.z < npcsp.getPostion().z) {
  1794. this._nums++;
  1795. }
  1796. this._all++;
  1797. }
  1798. }
  1799. this.nowMingCi = this.endGamePlayerArr.length + ((this._all + 1) - this._nums);
  1800. PropManager_1.PropManager.txt_mingci.text = "第" + this.nowMingCi + "名";
  1801. }
  1802. };
  1803. GameStateControl.prototype.startGame = function () {
  1804. var RoleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
  1805. var agencyskin = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencySkin_1.AgencySkin);
  1806. var nohasskinArr = agencyskin.GainNoHaveSkin();
  1807. if (nohasskinArr.length == 0) {
  1808. this.entergame();
  1809. }
  1810. else {
  1811. PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyTrial_1.AgencyTrial).openview(nohasskinArr);
  1812. }
  1813. };
  1814. GameStateControl.prototype.entergame = function (jiasu) {
  1815. RecordManager_1.RecordManager.Instance.RecordStart();
  1816. this.nowMingCi = 0;
  1817. this.endGamePlayerArr.length = 0;
  1818. this.nowGameState = 1;
  1819. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  1820. this.update(500);
  1821. if (jiasu) {
  1822. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.start, jiasu);
  1823. }
  1824. else {
  1825. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.start);
  1826. }
  1827. AudioControl_1.AudioControl.Instance.playbgSound("bgm");
  1828. Sdk_1.WxApi.recordAldEvent("主界面点击开始游戏...");
  1829. };
  1830. GameStateControl.prototype.stopGame = function () {
  1831. this.nowGameState = 2;
  1832. this.onupfun();
  1833. };
  1834. GameStateControl.prototype.endGame = function () {
  1835. if (PropManager_1.PropManager.jiantouArr && PropManager_1.PropManager.jiantouArr.length > 0) {
  1836. var arr = PropManager_1.PropManager.jiantouArr;
  1837. for (var i = arr.length - 1; i >= 0; i--) {
  1838. arr[i].destroy();
  1839. arr.splice(i, 1);
  1840. }
  1841. }
  1842. PropManager_1.PropManager.jiantouArr.length = 0;
  1843. this.nowGameState = 0;
  1844. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  1845. var npcdict = PropManager_1.PropManager.npcscriptDict;
  1846. if (npcdict) {
  1847. for (var s in npcdict) {
  1848. npcdict[s].stop();
  1849. }
  1850. }
  1851. this.onupfun();
  1852. AudioControl_1.AudioControl.Instance.stopbgSound();
  1853. };
  1854. return GameStateControl;
  1855. }());
  1856. exports.GameStateControl = GameStateControl;
  1857. },{"../Agency/AgencySkin":6,"../Agency/AgencyTrial":7,"../Agency/AgencyUserMessage":8,"../CFG/GameCFG":10,"../Control/AudioControl":17,"../Control/SceneControl":27,"../JoystickModule":41,"../PrefabControl/PanelResDic":46,"../PrefabControl/PropManager":47,"../Time/TimerService":57,"../WXSDK/RecordManager":74,"../WXSDK/Sdk":75,"../utils/DispatcherManager":83,"../utils/GameState":84}],21:[function(require,module,exports){
  1858. "use strict";
  1859. Object.defineProperty(exports, "__esModule", { value: true });
  1860. var Global_1 = require("../Global");
  1861. var LayOUT_1 = require("../utils/LayOUT");
  1862. /*
  1863. * name;
  1864. */
  1865. var LayoutControl = /** @class */ (function (_super) {
  1866. __extends(LayoutControl, _super);
  1867. function LayoutControl() {
  1868. var _this = _super.call(this) || this;
  1869. _this._uilayerZorder = 0;
  1870. _this._upuilayerZorder = 200;
  1871. _this._tipslayerZorder = 1000;
  1872. _this._guidelayerZorder = 600;
  1873. /**
  1874. * ui层
  1875. */
  1876. _this.uiLayer = new fairygui.GComponent();
  1877. /**
  1878. * 最定层
  1879. */
  1880. _this.topLayer = new fairygui.GComponent();
  1881. /**
  1882. * 背景层( 或者3D场景层 )
  1883. */
  1884. _this.background = new fairygui.GComponent();
  1885. _this._position = new Laya.Vector3();
  1886. _this._outPos = new Laya.Vector3();
  1887. _this.scaleDelta = 0;
  1888. LayoutControl.ins = _this;
  1889. return _this;
  1890. }
  1891. Object.defineProperty(LayoutControl, "Instance", {
  1892. get: function () {
  1893. if (LayoutControl.ins == null) {
  1894. return new LayoutControl();
  1895. }
  1896. return LayoutControl.ins;
  1897. },
  1898. enumerable: true,
  1899. configurable: true
  1900. });
  1901. LayoutControl.prototype.AddLayerByName = function (itemview, layer) {
  1902. if (layer == LayOUT_1.LayOUT.BG) {
  1903. LayoutControl.Instance.background.addChild(itemview);
  1904. }
  1905. else if (layer == LayOUT_1.LayOUT.UI) {
  1906. this._uilayerZorder++;
  1907. LayoutControl.Instance.uiLayer.addChild(itemview);
  1908. itemview.sortingOrder = this._uilayerZorder;
  1909. }
  1910. else if (layer == LayOUT_1.LayOUT.UITop) {
  1911. this._upuilayerZorder++;
  1912. LayoutControl.Instance.uiLayer.addChild(itemview);
  1913. itemview.sortingOrder = this._upuilayerZorder;
  1914. }
  1915. else if (layer == LayOUT_1.LayOUT.TIP) {
  1916. // GameLayerManager.Instance.tipsLayer.addChild(itemview);
  1917. this._tipslayerZorder++;
  1918. LayoutControl.Instance.uiLayer.addChild(itemview);
  1919. itemview.sortingOrder = this._tipslayerZorder;
  1920. }
  1921. else if (layer == LayOUT_1.LayOUT.GUIDE) {
  1922. this._guidelayerZorder++;
  1923. LayoutControl.Instance.uiLayer.addChild(itemview);
  1924. itemview.sortingOrder = this._guidelayerZorder;
  1925. }
  1926. };
  1927. //初始化层级
  1928. LayoutControl.prototype.initlayer = function () {
  1929. Global_1.Global.stage.addChild(fairygui.GRoot.inst.displayObject);
  1930. fairygui.GRoot.inst.addChild(this.background);
  1931. fairygui.GRoot.inst.addChild(this.uiLayer);
  1932. fairygui.GRoot.inst.addChild(this.topLayer);
  1933. };
  1934. LayoutControl.prototype.addHorizontalBox = function (x, y, z) {
  1935. var box = this.scene.addChild(new Laya.MeshSprite3D(this.mesh2));
  1936. box.meshRenderer.material = this.mat1;
  1937. box.meshRenderer.castShadow = true;
  1938. box.meshRenderer.receiveShadow = true;
  1939. this.tmpVector.setValue(x, y, z);
  1940. box.transform.position = this.tmpVector;
  1941. var rigidBody = box.addComponent(Laya.Rigidbody3D);
  1942. rigidBody.mass = 10;
  1943. rigidBody.friction = 1.0;
  1944. rigidBody.restitution = 0.2;
  1945. var boxShape = new Laya.BoxColliderShape(2, 0.33, 0.5);
  1946. rigidBody.colliderShape = boxShape;
  1947. };
  1948. /************************************************ */
  1949. LayoutControl.prototype.ClearLayerByName = function (layer) {
  1950. switch (layer) {
  1951. case LayOUT_1.LayOUT.UI:
  1952. this._uilayerZorder--;
  1953. if (this._uilayerZorder < 0) {
  1954. this._uilayerZorder = 0;
  1955. }
  1956. break;
  1957. case LayOUT_1.LayOUT.UITop:
  1958. this._upuilayerZorder--;
  1959. if (this._upuilayerZorder < 200) {
  1960. this._upuilayerZorder = 200;
  1961. }
  1962. break;
  1963. case LayOUT_1.LayOUT.TIP:
  1964. this._tipslayerZorder--;
  1965. if (this._tipslayerZorder < 1000) {
  1966. this._tipslayerZorder = 1000;
  1967. }
  1968. break;
  1969. case LayOUT_1.LayOUT.GUIDE:
  1970. this._tipslayerZorder--;
  1971. if (this._tipslayerZorder < 600) {
  1972. this._tipslayerZorder = 600;
  1973. }
  1974. break;
  1975. }
  1976. };
  1977. LayoutControl.prototype.onComplete = function () {
  1978. //加载三维地面
  1979. var grid = this.scene.addChild(Laya.Loader.getRes("res/threeDimen/staticModel/grid/plane.lh"));
  1980. //加载二维猴子
  1981. this.layaMonkey2D = Laya.stage.addChild(new Laya.Image("res/threeDimen/monkey.png"));
  1982. //开启定时器循环
  1983. Laya.timer.frameLoop(1, this, this.animate);
  1984. };
  1985. LayoutControl.prototype.animate = function () {
  1986. //变换位置
  1987. this._position.x = Math.sin(this.scaleDelta += 0.01);
  1988. //计算位置
  1989. this.camera.viewport.project(this._position, this.camera.projectionViewMatrix, this._outPos);
  1990. this.layaMonkey2D.pos(this._outPos.x / Laya.stage.clientScaleX, this._outPos.y / Laya.stage.clientScaleY);
  1991. };
  1992. return LayoutControl;
  1993. }(Laya.EventDispatcher));
  1994. exports.LayoutControl = LayoutControl;
  1995. },{"../Global":39,"../utils/LayOUT":88}],22:[function(require,module,exports){
  1996. "use strict";
  1997. Object.defineProperty(exports, "__esModule", { value: true });
  1998. var Global_1 = require("../Global");
  1999. var PlatfromType_1 = require("../WXSDK/PlatfromType");
  2000. /*
  2001. * 本地数据缓存管理器
  2002. */
  2003. var LocalDataControl = /** @class */ (function (_super) {
  2004. __extends(LocalDataControl, _super);
  2005. function LocalDataControl() {
  2006. var _this = _super.call(this) || this;
  2007. LocalDataControl.ins = _this;
  2008. return _this;
  2009. }
  2010. Object.defineProperty(LocalDataControl, "Instance", {
  2011. get: function () {
  2012. if (LocalDataControl.ins == null) {
  2013. return new LocalDataControl();
  2014. }
  2015. return LocalDataControl.ins;
  2016. },
  2017. enumerable: true,
  2018. configurable: true
  2019. });
  2020. LocalDataControl.prototype.init = function () {
  2021. };
  2022. /**
  2023. * 添加本地缓存数据 object
  2024. * @param key
  2025. * @param value
  2026. */
  2027. LocalDataControl.prototype.AddData = function (key, value) {
  2028. this.AddLocalData(key, value);
  2029. };
  2030. /**
  2031. * 获取本地缓存数据 object
  2032. * @param key
  2033. */
  2034. LocalDataControl.prototype.getObj = function (key) {
  2035. return this.GetLocalCaCheData(key);
  2036. };
  2037. /**
  2038. * 添加本地缓存数据 string
  2039. * @param key
  2040. * @param value
  2041. */
  2042. LocalDataControl.prototype.addstr = function (key, value) {
  2043. this.addCacheStr(key, value);
  2044. };
  2045. LocalDataControl.prototype.addnum = function (key, value) {
  2046. this.addCacheStr(key, value.toString());
  2047. };
  2048. /**
  2049. * 获取本地缓存数据 string
  2050. * @param key
  2051. */
  2052. LocalDataControl.prototype.getstr = function (key) {
  2053. return this.getCachestr(key);
  2054. };
  2055. /**
  2056. * 获取本地缓存数据 number
  2057. * @param key
  2058. */
  2059. LocalDataControl.prototype.getnum = function (key) {
  2060. return Number(this.getCachestr(key));
  2061. };
  2062. /**
  2063. * 清理指定本地缓存数据
  2064. * @param key
  2065. */
  2066. LocalDataControl.prototype.removeCache = function (key) {
  2067. this.removeselectCache(key);
  2068. };
  2069. /**
  2070. * 清理所有本地缓存数据
  2071. */
  2072. LocalDataControl.prototype.clearAll = function () {
  2073. this.clearAllCache();
  2074. };
  2075. LocalDataControl.prototype.AddLocalData = function (key, value) {
  2076. switch (Global_1.Global.nowplatfrom) {
  2077. case PlatfromType_1.PlatfromType.wx:
  2078. this.setStorageSyncWX(key, value);
  2079. break;
  2080. default:
  2081. Laya.LocalStorage.setJSON(key, value);
  2082. break;
  2083. }
  2084. };
  2085. LocalDataControl.prototype.GetLocalCaCheData = function (key) {
  2086. var obj;
  2087. switch (Global_1.Global.nowplatfrom) {
  2088. case PlatfromType_1.PlatfromType.wx:
  2089. obj = this.getStorageSyncWX(key);
  2090. break;
  2091. default:
  2092. obj = Laya.LocalStorage.getJSON(key);
  2093. break;
  2094. }
  2095. if (!obj) {
  2096. obj = {};
  2097. }
  2098. return obj;
  2099. };
  2100. LocalDataControl.prototype.addCacheStr = function (key, value) {
  2101. switch (Global_1.Global.nowplatfrom) {
  2102. case PlatfromType_1.PlatfromType.wx:
  2103. this.setStorageSyncWX(key, value);
  2104. break;
  2105. default:
  2106. Laya.LocalStorage.setItem(key, value);
  2107. break;
  2108. }
  2109. };
  2110. LocalDataControl.prototype.getCachestr = function (key) {
  2111. var str = "0";
  2112. switch (Global_1.Global.nowplatfrom) {
  2113. case PlatfromType_1.PlatfromType.wx:
  2114. str = this.getStorageSyncWX(key);
  2115. break;
  2116. default:
  2117. str = Laya.LocalStorage.getItem(key);
  2118. break;
  2119. }
  2120. if (str == null || str == "") {
  2121. str = "0";
  2122. }
  2123. return str;
  2124. };
  2125. LocalDataControl.prototype.removeselectCache = function (key) {
  2126. switch (Global_1.Global.nowplatfrom) {
  2127. case PlatfromType_1.PlatfromType.wx:
  2128. this.removeStorageWX(key);
  2129. break;
  2130. default:
  2131. Laya.LocalStorage.removeItem(key);
  2132. break;
  2133. }
  2134. };
  2135. LocalDataControl.prototype.clearAllCache = function () {
  2136. switch (Global_1.Global.nowplatfrom) {
  2137. case PlatfromType_1.PlatfromType.wx:
  2138. this.clearStorageWX();
  2139. break;
  2140. default:
  2141. Laya.LocalStorage.clear();
  2142. break;
  2143. }
  2144. };
  2145. /**
  2146. * 本地存储
  2147. * @param key
  2148. * @param data
  2149. */
  2150. LocalDataControl.prototype.setStorageSyncWX = function (key, data) {
  2151. var wx = Laya.Browser.window.wx;
  2152. if (wx) {
  2153. wx.setStorageSync(key, data);
  2154. }
  2155. };
  2156. /**
  2157. * 获取本地存储
  2158. * @param key
  2159. */
  2160. LocalDataControl.prototype.getStorageSyncWX = function (key) {
  2161. var wx = Laya.Browser.window.wx;
  2162. if (wx) {
  2163. return wx.getStorageSync(key);
  2164. }
  2165. return null;
  2166. };
  2167. /**
  2168. * 从本地缓存中移除指定 key
  2169. * @param key
  2170. */
  2171. LocalDataControl.prototype.removeStorageWX = function (key) {
  2172. if (Laya.Browser.window.wx) {
  2173. Laya.Browser.window.wx.removeStorage(key);
  2174. }
  2175. };
  2176. /**
  2177. * 清理存储数据
  2178. */
  2179. LocalDataControl.prototype.clearStorageWX = function () {
  2180. if (Laya.Browser.window.wx) {
  2181. Laya.Browser.window.wx.clearStorageSync();
  2182. }
  2183. };
  2184. return LocalDataControl;
  2185. }(Laya.EventDispatcher));
  2186. exports.LocalDataControl = LocalDataControl;
  2187. },{"../Global":39,"../WXSDK/PlatfromType":72}],23:[function(require,module,exports){
  2188. "use strict";
  2189. Object.defineProperty(exports, "__esModule", { value: true });
  2190. var ResDataControl_1 = require("../Control/ResDataControl");
  2191. var ResourceControl_1 = require("../Control/ResourceControl");
  2192. var DispatcherManager_1 = require("../utils/DispatcherManager");
  2193. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  2194. var ViewAction_1 = require("../utils/ViewAction");
  2195. var ViewManager_1 = require("../View/ViewManager");
  2196. var ComponentEventData_1 = require("../Data/ComponentEventData");
  2197. var GamePool_1 = require("../PrefabControl/GamePool");
  2198. /*
  2199. * name;
  2200. */
  2201. var PanelBaseControl = /** @class */ (function (_super) {
  2202. __extends(PanelBaseControl, _super);
  2203. /**
  2204. * 界面初始化
  2205. * @param pkgName 包名
  2206. * @param resName 界面名
  2207. * @param isAddpackage 是否添加包
  2208. * @param ActionType 界面打开动画类型
  2209. * @param clickBgIsColse 黑色背景 0:无背景 1:背景无关闭事件 2:背景有关闭事件
  2210. * @param iscache 是否添加到缓存池(如是为true,则加入进缓存池定时根据是否引用清理。 若是为false,则不清理当前缓存,如若清理,请手动清理 )
  2211. */
  2212. function PanelBaseControl(pkgName, resName, isAddpackage, ActionType, clickBgIsColse, iscache) {
  2213. if (pkgName === void 0) { pkgName = ""; }
  2214. if (resName === void 0) { resName = ""; }
  2215. if (isAddpackage === void 0) { isAddpackage = false; }
  2216. if (ActionType === void 0) { ActionType = ViewAction_1.ViewAction.ActionType_none; }
  2217. if (clickBgIsColse === void 0) { clickBgIsColse = 0; }
  2218. if (iscache === void 0) { iscache = true; }
  2219. var _this = _super.call(this) || this;
  2220. _this.isguideing = false;
  2221. _this.PackageName = "";
  2222. _this.ResourcesName = "";
  2223. _this._iscache = true;
  2224. _this._ActionType = ViewAction_1.ViewAction.ActionType_none;
  2225. _this._clickBgIsColse = 0;
  2226. /**
  2227. * 事件容器
  2228. */
  2229. _this.EventResDic = {};
  2230. /**
  2231. * 全局事件容器
  2232. */
  2233. _this.EventGlobal = {};
  2234. _this._iscache = iscache;
  2235. _this.PackageName = pkgName;
  2236. _this.ResourcesName = resName;
  2237. _this._isAddpackage = isAddpackage;
  2238. _this._ActionType = ActionType;
  2239. _this._clickBgIsColse = clickBgIsColse;
  2240. _this.showModalWait();
  2241. return _this;
  2242. }
  2243. PanelBaseControl.prototype.ResolveUI = function (pkgname, resname, isaddpackage, ActionType, clickBgIsColse, iscache) {
  2244. if (ActionType === void 0) { ActionType = ViewAction_1.ViewAction.ActionType_none; }
  2245. if (clickBgIsColse === void 0) { clickBgIsColse = 0; }
  2246. if (iscache === void 0) { iscache = true; }
  2247. this.PackageName = pkgname;
  2248. this.ResourcesName = resname;
  2249. this._ActionType = ActionType;
  2250. this._clickBgIsColse = clickBgIsColse;
  2251. ResDataControl_1.ResDataControl.Instance.AddViewPackByName(pkgname, isaddpackage, iscache);
  2252. this.contentPane = fairygui.UIPackage.createObject(pkgname, resname).asCom;
  2253. for (var str in this.contentPane._children) {
  2254. var item = this.contentPane._children[str];
  2255. if (item.name == "item_panel") {
  2256. var itempanel = item;
  2257. if (itempanel) {
  2258. for (var str1 in itempanel._children) {
  2259. var itempanelItem = itempanel._children[str1];
  2260. this[itempanelItem.name] = itempanelItem;
  2261. }
  2262. }
  2263. // this[item.name] = item;
  2264. this.item_panel = item;
  2265. }
  2266. else {
  2267. this[item.name] = item;
  2268. }
  2269. }
  2270. this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  2271. this.contentPane.setPivot(0.5, 0.5);
  2272. this.setPivot(0.5, 0.5);
  2273. this.setclickBgIsColse();
  2274. this.initView();
  2275. this.initEvent();
  2276. this.ShowViewACTION();
  2277. };
  2278. /**
  2279. * 加载ui
  2280. * @param groupName 组名
  2281. * @param target 作用域
  2282. * @param onLoadedHandler 加载完成回调函数
  2283. */
  2284. PanelBaseControl.prototype.LoadViewUI = function (groupName, target, onLoadedHandler) {
  2285. this._loadTarget = target;
  2286. this._onLoadedHandler = onLoadedHandler;
  2287. ResourceControl_1.ResourceControl.Instance.loadGroup(groupName, this, this.LoadComplete);
  2288. };
  2289. /******************************************************************* */
  2290. PanelBaseControl.prototype.createLabel = function (color, strokeColor) {
  2291. var STROKE_WIDTH = 4;
  2292. var label = new Laya.Label();
  2293. label.font = "Microsoft YaHei";
  2294. label.text = "SAMPLE DEMO";
  2295. label.fontSize = 30;
  2296. label.color = color;
  2297. if (strokeColor) {
  2298. label.stroke = STROKE_WIDTH;
  2299. label.strokeColor = strokeColor;
  2300. }
  2301. Laya.stage.addChild(label);
  2302. return label;
  2303. };
  2304. /****************************************************************** */
  2305. /**
  2306. * 加载资源数组
  2307. * @param urls 资源数组
  2308. * @param target 作用域
  2309. * @param onLoadedHandler 加载完成回调函数
  2310. */
  2311. PanelBaseControl.prototype.loadUibyArr = function (urls, target, onLoadedHandler) {
  2312. // this.showModalWait();
  2313. this._loadTarget = target;
  2314. this._onLoadedHandler = onLoadedHandler;
  2315. ResourceControl_1.ResourceControl.Instance.Loaders(urls, this, this.LoadComplete);
  2316. };
  2317. /********************************************************************* */
  2318. PanelBaseControl.prototype.createRadioGroup = function (skin) {
  2319. var rg = new Laya.RadioGroup();
  2320. rg.skin = skin;
  2321. rg.space = 70;
  2322. rg.direction = "v";
  2323. rg.labels = "Item1, Item2, Item3";
  2324. rg.labelColors = "#787878,#d3d3d3,#FFFFFF";
  2325. rg.labelSize = 20;
  2326. rg.labelBold = true;
  2327. rg.labelPadding = "5,0,0,5";
  2328. rg.selectHandler = new Laya.Handler(this, this.onSelectChange);
  2329. Laya.stage.addChild(rg);
  2330. return rg;
  2331. };
  2332. PanelBaseControl.prototype.onSelectChange = function (index) {
  2333. console.log("你选择了第 " + (index + 1) + " 项");
  2334. };
  2335. /********************************************************************* */
  2336. PanelBaseControl.prototype.LoadComplete = function () {
  2337. if (this._loadTarget && this._onLoadedHandler) {
  2338. this._onLoadedHandler.call(this._loadTarget);
  2339. }
  2340. };
  2341. PanelBaseControl.prototype.removeEffectPackage = function (packageName) {
  2342. ResDataControl_1.ResDataControl.Instance.ClearPackByName(packageName, true);
  2343. };
  2344. PanelBaseControl.prototype.getpanelController = function (name) {
  2345. if (this.item_panel) {
  2346. return this.item_panel.getController(name);
  2347. }
  2348. return null;
  2349. };
  2350. /************************************************************ */
  2351. PanelBaseControl.prototype.setup = function () {
  2352. this.createLabel("#FFFFFF", null).pos(30, 50);
  2353. this.createLabel("#00FFFF", null).pos(290, 50);
  2354. this.createLabel("#FFFF00", "#FFFFFF").pos(30, 100);
  2355. this.createLabel("#000000", "#FFFFFF").pos(290, 100);
  2356. this.createLabel("#FFFFFF", "#00FFFF").pos(30, 150);
  2357. this.createLabel("#0080FF", "#00FFFF").pos(290, 150);
  2358. };
  2359. /************************************************************ */
  2360. PanelBaseControl.prototype.getpanelTransition = function (name) {
  2361. if (this.item_panel) {
  2362. return this.item_panel.getTransition(name);
  2363. }
  2364. return null;
  2365. };
  2366. PanelBaseControl.prototype.getChildformContentPanel = function (name) {
  2367. if (this.contentPane) {
  2368. return this.contentPane.getChild(name);
  2369. }
  2370. return null;
  2371. };
  2372. /*界面初始化*/
  2373. PanelBaseControl.prototype.onInit = function () {
  2374. _super.prototype.onInit.call(this);
  2375. if (this.PackageName != "" && this.ResourcesName != "") {
  2376. this.ResolveUI(this.PackageName, this.ResourcesName, this._isAddpackage, this._ActionType, this._clickBgIsColse, this._iscache);
  2377. }
  2378. };
  2379. //解析ui
  2380. PanelBaseControl.prototype.initView = function () {
  2381. };
  2382. PanelBaseControl.prototype.initEvent = function () {
  2383. };
  2384. PanelBaseControl.prototype.ShowViewACTION = function () {
  2385. switch (this._ActionType) {
  2386. case ViewAction_1.ViewAction.ActionType_none:
  2387. this.windowanmoend();
  2388. break;
  2389. case ViewAction_1.ViewAction.ActionType_addmoveToMiddle:
  2390. this.contentPane.x = fairygui.GRoot.inst.width;
  2391. Laya.Tween.to(this.contentPane, { x: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  2392. break;
  2393. case ViewAction_1.ViewAction.ActionType_addmoveFromBottom:
  2394. this.contentPane.y = fairygui.GRoot.inst.height;
  2395. Laya.Tween.to(this.contentPane, { y: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  2396. break;
  2397. case ViewAction_1.ViewAction.ActionType_addscaleMinToMax:
  2398. this.contentPane.scaleX = this.contentPane.scaleY = 0.01;
  2399. Laya.Tween.to(this.contentPane, { scaleX: 1, scaleY: 1 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  2400. break;
  2401. }
  2402. };
  2403. /******************************************************** */
  2404. PanelBaseControl.prototype.createCheckBox = function (skin) {
  2405. var cb = new Laya.CheckBox(skin);
  2406. Laya.stage.addChild(cb);
  2407. cb.labelColors = "white";
  2408. cb.labelSize = 20;
  2409. cb.labelFont = "Microsoft YaHei";
  2410. cb.labelPadding = "3,0,0,5";
  2411. return cb;
  2412. };
  2413. PanelBaseControl.prototype.updateLabel = function (checkBox) {
  2414. checkBox.label = checkBox.selected ? "已选中" : "未选中";
  2415. };
  2416. /******************************************************** */
  2417. PanelBaseControl.prototype.windowanmoend = function () {
  2418. Laya.timer.callLater(this, this.onShowView);
  2419. };
  2420. PanelBaseControl.prototype.onShowView = function () {
  2421. this.closeModalWait();
  2422. this.showClickBg();
  2423. };
  2424. PanelBaseControl.prototype.showClickBg = function () {
  2425. if (this._clickBg) {
  2426. this._clickBg.alpha = 0.55;
  2427. if (this._clickBgIsColse == 2 && !this.hasClickListener()) {
  2428. this._clickBg.onClick(this, this.ClickExitView);
  2429. }
  2430. }
  2431. };
  2432. /**点击关闭页面按钮 */
  2433. PanelBaseControl.prototype.ClickExitView = function () {
  2434. ViewManager_1.ViewManager.Instance.close(this.viewKey, true);
  2435. };
  2436. /*获取管理数据模块*/
  2437. PanelBaseControl.prototype.getProxy = function (d) {
  2438. return PanelResDic_1.PanelResDic.Instance.getSingleTon(d);
  2439. };
  2440. /**
  2441. * 界面关闭事件
  2442. */
  2443. PanelBaseControl.prototype.ExitView = function (ActionType) {
  2444. if (ActionType === void 0) { ActionType = ""; }
  2445. if (this._clickBg) {
  2446. this._clickBg.visible = false;
  2447. }
  2448. if (ActionType == "") {
  2449. switch (this._ActionType) {
  2450. case ViewAction_1.ViewAction.ActionType_none:
  2451. this.destory();
  2452. break;
  2453. case ViewAction_1.ViewAction.ActionType_addmoveToMiddle:
  2454. Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2455. break;
  2456. case ViewAction_1.ViewAction.ActionType_addmoveFromBottom:
  2457. Laya.Tween.to(this, { y: fairygui.GRoot.inst.height }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2458. break;
  2459. case ViewAction_1.ViewAction.ActionType_addscaleMinToMax:
  2460. Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2461. break;
  2462. }
  2463. }
  2464. else {
  2465. switch (ActionType) {
  2466. case ViewAction_1.ViewAction.ActionType_none:
  2467. this.destory();
  2468. break;
  2469. case ViewAction_1.ViewAction.ActionType_removescaleMaxToMin:
  2470. Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2471. break;
  2472. case ViewAction_1.ViewAction.ActionType_removemoveToRight:
  2473. Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2474. break;
  2475. }
  2476. }
  2477. };
  2478. PanelBaseControl.prototype.getTransitionByName = function (id) {
  2479. return this.contentPane.getTransition(id);
  2480. };
  2481. /**注册事件 */
  2482. PanelBaseControl.prototype.dispacheDatatrigger = function (type, data) {
  2483. if (data === void 0) { data = null; }
  2484. DispatcherManager_1.DispatcherManager.dispatchEvent(type, data);
  2485. };
  2486. /**
  2487. * 注册全局事件
  2488. * @param type
  2489. * @param thisObject
  2490. * @param listener
  2491. */
  2492. PanelBaseControl.prototype.addDataEvent = function (type, thisObject, listener) {
  2493. if (!this.EventGlobal.hasOwnProperty(type)) {
  2494. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2495. this.EventGlobal[type] = vo;
  2496. vo.type = type;
  2497. vo.thisObject = thisObject;
  2498. vo.listener = listener;
  2499. DispatcherManager_1.DispatcherManager.addEventListener(type, thisObject, listener);
  2500. }
  2501. };
  2502. /**
  2503. * 移除全局事件
  2504. * @param type
  2505. * @param thisObject
  2506. * @param listener
  2507. */
  2508. PanelBaseControl.prototype.ClearEventData = function (type, thisObject, listener) {
  2509. if (this.EventGlobal[type]) {
  2510. var vo = this.EventGlobal[type];
  2511. DispatcherManager_1.DispatcherManager.removeEventListener(type, thisObject, listener);
  2512. vo.clear();
  2513. delete this.EventGlobal[type];
  2514. }
  2515. };
  2516. /**
  2517. * 移除组件事件
  2518. * @param type 时间类型
  2519. * @param callbackobj 作用域
  2520. * @param callbackHandler 事件回调
  2521. */
  2522. PanelBaseControl.prototype.ClearEventByType = function (target, type, thisObject, listener) {
  2523. if (target && this.EventResDic[target.name]) {
  2524. var arr = this.EventResDic[target.name];
  2525. var i = 0;
  2526. var nums = arr.length;
  2527. var vo;
  2528. for (i; i < nums; i++) {
  2529. vo = arr[i];
  2530. if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) {
  2531. target.off(type, thisObject, listener);
  2532. vo.clear();
  2533. arr.splice(i, 1);
  2534. break;
  2535. }
  2536. }
  2537. }
  2538. };
  2539. /**
  2540. * 注册组件事件,调用此方法,界面关闭会自动移除
  2541. * @param type 时间类型
  2542. * @param callbackobj 作用域
  2543. * @param callbackHandler 事件回调
  2544. */
  2545. PanelBaseControl.prototype.AddEventByType = function (target, type, thisObject, listener, args) {
  2546. if (args === void 0) { args = null; }
  2547. if (target) {
  2548. if (target.name == null || target.name == "") {
  2549. throw "baseview addListener target.name is null";
  2550. }
  2551. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2552. vo.target = target;
  2553. vo.type = type;
  2554. vo.thisObject = thisObject;
  2555. vo.listener = listener;
  2556. if (!this.EventResDic.hasOwnProperty(target.name)) {
  2557. this.EventResDic[target.name] = [];
  2558. }
  2559. var bo = this.JudgeIsHaveEvent(target, type);
  2560. if (!bo) {
  2561. target.on(type, thisObject, listener, args);
  2562. this.EventResDic[target.name].push(vo);
  2563. }
  2564. }
  2565. };
  2566. /**判断是否含有事件 */
  2567. PanelBaseControl.prototype.JudgeIsHaveEvent = function (target, type) {
  2568. var eventArr;
  2569. eventArr = this.EventResDic[target.name];
  2570. var childvo;
  2571. for (var s in eventArr) {
  2572. childvo = eventArr[s];
  2573. if (childvo && childvo.type == type) {
  2574. return true;
  2575. }
  2576. }
  2577. return false;
  2578. };
  2579. PanelBaseControl.prototype.getComById = function (id) {
  2580. return this.contentPane.getChild(id).asCom;
  2581. };
  2582. PanelBaseControl.prototype.getControllerByBame = function (id) {
  2583. return this.contentPane.getController(id);
  2584. };
  2585. /**
  2586. * 移除所有组件事件
  2587. */
  2588. PanelBaseControl.prototype.ClearEvent = function () {
  2589. if (this.EventResDic) {
  2590. var s;
  2591. var dict = this.EventResDic;
  2592. var arr;
  2593. var i;
  2594. var nums = 0;
  2595. var vo;
  2596. for (s in dict) {
  2597. arr = dict[s];
  2598. if (arr && arr.length > 0) {
  2599. i = 0;
  2600. nums = arr.length;
  2601. for (i = nums - 1; i >= 0; i--) {
  2602. vo = arr[i];
  2603. if (vo) {
  2604. if (vo.target) {
  2605. vo.target.off(vo.type, vo.thisObject, vo.listener);
  2606. }
  2607. vo.clear();
  2608. }
  2609. arr.splice(i, 1);
  2610. }
  2611. }
  2612. delete this.EventResDic[s];
  2613. }
  2614. }
  2615. this.EventResDic = {};
  2616. };
  2617. PanelBaseControl.prototype.clearEvent = function () {
  2618. };
  2619. /* 销毁*/
  2620. PanelBaseControl.prototype.destory = function () {
  2621. this.clearEvent();
  2622. this.closeModalWait();
  2623. this.ClearGlobalEvent();
  2624. this.ClearEvent();
  2625. this._loadTarget = null;
  2626. this._onLoadedHandler = null;
  2627. Laya.Tween.clearTween(this);
  2628. ResDataControl_1.ResDataControl.Instance.ClearPackByName(this.PackageName, false);
  2629. this.PackageName = null;
  2630. this.ResourcesName = null;
  2631. if (this._clickBg) {
  2632. this._clickBg.offClick(this, this.ClickExitView);
  2633. this._clickBg.dispose();
  2634. this._clickBg = null;
  2635. }
  2636. this.viewKey = null;
  2637. this.dispose();
  2638. };
  2639. PanelBaseControl.prototype.setclickBgIsColse = function () {
  2640. if (this.isShowing && this._clickBgIsColse > 0 && this.contentPane) {
  2641. if (!this._clickBg && PanelBaseControl.viewbgUrl != "") {
  2642. this._clickBg = new fairygui.GLoader();
  2643. this._clickBg.touchable = true;
  2644. this._clickBg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  2645. this._clickBg.url = PanelBaseControl.viewbgUrl;
  2646. this._clickBg.fill = fairygui.LoaderFillType.ScaleFree;
  2647. this._clickBg.alpha = 0;
  2648. this.contentPane.addChildAt(this._clickBg, 0);
  2649. }
  2650. }
  2651. };
  2652. /**
  2653. * 移除所有全局事件
  2654. */
  2655. PanelBaseControl.prototype.ClearGlobalEvent = function () {
  2656. if (this.EventGlobal) {
  2657. var s;
  2658. var dict = this.EventGlobal;
  2659. for (s in dict) {
  2660. var vo = dict[s];
  2661. if (vo) {
  2662. this.ClearEventData(vo.type, vo.thisObject, vo.listener);
  2663. }
  2664. }
  2665. }
  2666. this.EventGlobal = {};
  2667. };
  2668. PanelBaseControl.viewbgUrl = "";
  2669. return PanelBaseControl;
  2670. }(fairygui.Window));
  2671. exports.PanelBaseControl = PanelBaseControl;
  2672. },{"../Control/ResDataControl":25,"../Control/ResourceControl":26,"../Data/ComponentEventData":28,"../PrefabControl/GamePool":45,"../PrefabControl/PanelResDic":46,"../View/ViewManager":68,"../utils/DispatcherManager":83,"../utils/ViewAction":91}],24:[function(require,module,exports){
  2673. "use strict";
  2674. Object.defineProperty(exports, "__esModule", { value: true });
  2675. var DispatcherManager_1 = require("../utils/DispatcherManager");
  2676. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  2677. var ComponentEventData_1 = require("../Data/ComponentEventData");
  2678. var GamePool_1 = require("../PrefabControl/GamePool");
  2679. var PanelChildControl = /** @class */ (function (_super) {
  2680. __extends(PanelChildControl, _super);
  2681. function PanelChildControl() {
  2682. var _this = _super.call(this) || this;
  2683. /**
  2684. * 事件容器
  2685. */
  2686. _this.EventResDic = {};
  2687. /**
  2688. * 全局事件容器
  2689. */
  2690. _this.EventGlobal = {};
  2691. /******************************************** */
  2692. _this.DIALOG_WIDTH = 220;
  2693. _this.DIALOG_HEIGHT = 275;
  2694. _this.CLOSE_BTN_WIDTH = 43;
  2695. _this.CLOSE_BTN_PADDING = 5;
  2696. return _this;
  2697. }
  2698. /**
  2699. * 移除所有组件事件
  2700. */
  2701. PanelChildControl.prototype.ClearEvent = function () {
  2702. if (this.EventResDic) {
  2703. var s;
  2704. var dict = this.EventResDic;
  2705. var arr;
  2706. var i;
  2707. var nums = 0;
  2708. var vo;
  2709. for (s in dict) {
  2710. arr = dict[s];
  2711. if (arr && arr.length > 0) {
  2712. i = 0;
  2713. nums = arr.length;
  2714. for (i = nums - 1; i >= 0; i--) {
  2715. vo = arr[i];
  2716. if (vo) {
  2717. if (vo.target) {
  2718. vo.target.off(vo.type, vo.thisObject, vo.listener);
  2719. }
  2720. vo.clear();
  2721. }
  2722. arr.splice(i, 1);
  2723. }
  2724. }
  2725. delete this.EventResDic[s];
  2726. }
  2727. }
  2728. this.EventResDic = {};
  2729. };
  2730. PanelChildControl.prototype.dispose = function () {
  2731. this.ClearGlobalEvent();
  2732. this.ClearEvent();
  2733. _super.prototype.dispose.call(this);
  2734. };
  2735. PanelChildControl.prototype.constructFromXML = function (xml) {
  2736. _super.prototype.constructFromXML.call(this, xml);
  2737. for (var str in this._children) {
  2738. var item = this._children[str];
  2739. this[item.name] = item;
  2740. }
  2741. this.onInit();
  2742. };
  2743. PanelChildControl.prototype.onInit = function () {
  2744. };
  2745. /*获取管理数据模块*/
  2746. PanelChildControl.prototype.getProxy = function (d) {
  2747. return PanelResDic_1.PanelResDic.Instance.getSingleTon(d);
  2748. };
  2749. PanelChildControl.prototype.dispacheDatatrigger = function (type, data) {
  2750. if (data === void 0) { data = null; }
  2751. DispatcherManager_1.DispatcherManager.dispatchEvent(type, data);
  2752. };
  2753. PanelChildControl.prototype.hasDataEvent = function (type) {
  2754. return DispatcherManager_1.DispatcherManager.hasEventListener(type);
  2755. };
  2756. /**
  2757. * 注册全局事件
  2758. * @param type
  2759. * @param thisObject
  2760. * @param listener
  2761. */
  2762. PanelChildControl.prototype.AddEventData = function (type, thisObject, listener) {
  2763. if (!this.EventGlobal.hasOwnProperty(type)) {
  2764. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2765. this.EventGlobal[type] = vo;
  2766. vo.type = type;
  2767. vo.thisObject = thisObject;
  2768. vo.listener = listener;
  2769. DispatcherManager_1.DispatcherManager.addEventListener(type, thisObject, listener);
  2770. }
  2771. };
  2772. PanelChildControl.prototype.onSkinLoadComplete = function () {
  2773. var dialog = new Laya.Dialog();
  2774. var bg = new Laya.Image(this.assets[0]);
  2775. dialog.addChild(bg);
  2776. var button = new Laya.Button(this.assets[1]);
  2777. // button.name = Dialog.CLOSE;
  2778. button.pos(this.DIALOG_WIDTH - this.CLOSE_BTN_WIDTH - this.CLOSE_BTN_PADDING, this.CLOSE_BTN_PADDING);
  2779. dialog.addChild(button);
  2780. dialog.dragArea = "0,0," + this.DIALOG_WIDTH + "," + this.DIALOG_HEIGHT;
  2781. dialog.show();
  2782. };
  2783. /******************************************** */
  2784. /**
  2785. * 移除全局事件
  2786. * @param type
  2787. * @param thisObject
  2788. * @param listener
  2789. */
  2790. PanelChildControl.prototype.removeDataEvent = function (type, thisObject, listener) {
  2791. if (this.EventGlobal[type]) {
  2792. var vo = this.EventGlobal[type];
  2793. DispatcherManager_1.DispatcherManager.removeEventListener(type, thisObject, listener);
  2794. vo.clear();
  2795. delete this.EventGlobal[type];
  2796. }
  2797. };
  2798. /**
  2799. * 注册组件事件,调用此方法,界面关闭会自动移除
  2800. * @param type 时间类型
  2801. * @param callbackobj 作用域
  2802. * @param callbackHandler 事件回调
  2803. */
  2804. PanelChildControl.prototype.AddEventByType = function (target, type, thisObject, listener, args) {
  2805. if (args === void 0) { args = null; }
  2806. if (target) {
  2807. if (target.name == null || target.name == "") {
  2808. throw "childbaseview addListener target.name is null";
  2809. }
  2810. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2811. vo.target = target;
  2812. vo.type = type;
  2813. vo.thisObject = thisObject;
  2814. vo.listener = listener;
  2815. if (!this.EventResDic.hasOwnProperty(target.name)) {
  2816. this.EventResDic[target.name] = [];
  2817. }
  2818. var bo = this.JudgeIsHaveEvent(target, type);
  2819. if (!bo) {
  2820. target.on(type, thisObject, listener, args);
  2821. this.EventResDic[target.name].push(vo);
  2822. }
  2823. }
  2824. };
  2825. PanelChildControl.prototype.JudgeIsHaveEvent = function (target, type) {
  2826. var eventArr;
  2827. eventArr = this.EventResDic[target.name];
  2828. var childvo;
  2829. for (var s in eventArr) {
  2830. childvo = eventArr[s];
  2831. if (childvo && childvo.type == type) {
  2832. return true;
  2833. }
  2834. }
  2835. return false;
  2836. };
  2837. /**
  2838. * 移除组件事件
  2839. * @param type 时间类型
  2840. * @param callbackobj 作用域
  2841. * @param callbackHandler 事件回调
  2842. */
  2843. PanelChildControl.prototype.ClearEventByType = function (target, type, thisObject, listener) {
  2844. if (target && this.EventResDic[target.name]) {
  2845. var arr = this.EventResDic[target.name];
  2846. var i = 0;
  2847. var nums = arr.length;
  2848. var vo;
  2849. for (i; i < nums; i++) {
  2850. vo = arr[i];
  2851. if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) {
  2852. target.off(type, thisObject, listener);
  2853. vo.clear();
  2854. arr.splice(i, 1);
  2855. break;
  2856. }
  2857. }
  2858. }
  2859. };
  2860. /**
  2861. * 移除所有全局事件
  2862. */
  2863. PanelChildControl.prototype.ClearGlobalEvent = function () {
  2864. if (this.EventGlobal) {
  2865. var s;
  2866. var dict = this.EventGlobal;
  2867. for (s in dict) {
  2868. var vo = dict[s];
  2869. if (vo) {
  2870. this.removeDataEvent(vo.type, vo.thisObject, vo.listener);
  2871. }
  2872. }
  2873. }
  2874. this.EventGlobal = {};
  2875. };
  2876. /***************************************************** */
  2877. PanelChildControl.prototype.placeHScroller = function () {
  2878. var hs = new Laya.HScrollBar();
  2879. hs.skin = "res/ui/hscroll.png";
  2880. hs.width = 300;
  2881. hs.pos(50, 170);
  2882. hs.min = 0;
  2883. hs.max = 100;
  2884. hs.changeHandler = new Laya.Handler(this, this.onChange);
  2885. Laya.stage.addChild(hs);
  2886. };
  2887. PanelChildControl.prototype.placeVScroller = function () {
  2888. var vs = new Laya.VScrollBar();
  2889. vs.skin = "res/ui/vscroll.png";
  2890. vs.height = 300;
  2891. vs.pos(400, 50);
  2892. vs.min = 0;
  2893. vs.max = 100;
  2894. vs.changeHandler = new Laya.Handler(this, this.onChange);
  2895. Laya.stage.addChild(vs);
  2896. };
  2897. PanelChildControl.prototype.onChange = function (value) {
  2898. console.log("滚动条的位置: value=" + value);
  2899. };
  2900. return PanelChildControl;
  2901. }(fairygui.GComponent));
  2902. exports.PanelChildControl = PanelChildControl;
  2903. },{"../Data/ComponentEventData":28,"../PrefabControl/GamePool":45,"../PrefabControl/PanelResDic":46,"../utils/DispatcherManager":83}],25:[function(require,module,exports){
  2904. "use strict";
  2905. Object.defineProperty(exports, "__esModule", { value: true });
  2906. var ResourceControl_1 = require("./ResourceControl");
  2907. var LocalData_1 = require("../Data/LocalData");
  2908. var GamePool_1 = require("../PrefabControl/GamePool");
  2909. var AssetPath_1 = require("../Config/AssetPath");
  2910. var TimerService_1 = require("../Time/TimerService");
  2911. var Tab = Laya.Tab;
  2912. /*
  2913. * 资源管理器;
  2914. */
  2915. var ResDataControl = /** @class */ (function () {
  2916. function ResDataControl() {
  2917. /************************************************ */
  2918. this._time = 0;
  2919. this.ClearInterval = 50000;
  2920. this.CheckInterval = 20000;
  2921. /******************************************************************* */
  2922. this.skins = ["res/ui/tab1.png", "res/ui/tab2.png"];
  2923. ResDataControl.ins = this;
  2924. }
  2925. Object.defineProperty(ResDataControl, "Instance", {
  2926. get: function () {
  2927. if (ResDataControl.ins == null) {
  2928. return new ResDataControl();
  2929. }
  2930. return ResDataControl.ins;
  2931. },
  2932. enumerable: true,
  2933. configurable: true
  2934. });
  2935. /**
  2936. * 添加包
  2937. * @param path 路径( 事例:res/ui/ )
  2938. * @param pkgname 包名
  2939. * @param isaddpackage 是否添加
  2940. * @param isCache 是否缓存
  2941. */
  2942. ResDataControl.prototype.AddPackByName = function (path, pkgname, isaddpackage, isCache) {
  2943. if (isaddpackage === void 0) { isaddpackage = true; }
  2944. if (isCache === void 0) { isCache = true; }
  2945. if (isaddpackage) {
  2946. fairygui.UIPackage.addPackage(path + pkgname, pkgname);
  2947. }
  2948. this.AddLocalLiveData(pkgname, isCache);
  2949. };
  2950. ResDataControl.prototype.init = function () {
  2951. GamePool_1.GamePool.Mark(LocalData_1.LocalData.ResDicValue, LocalData_1.LocalData);
  2952. this.urlRes = {};
  2953. this.packageRes = {};
  2954. this.NoLiveData = { "loading": true, "main": true, "uicomponent": true };
  2955. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  2956. };
  2957. /**
  2958. * 清理资源缓存(Array)
  2959. * @param urls 资源数组
  2960. * @param packageName 包名
  2961. */
  2962. ResDataControl.prototype.RemoveResources = function (urls, packageName) {
  2963. if (packageName === void 0) { packageName = ""; }
  2964. if (packageName != "") {
  2965. fairygui.UIPackage.removePackage(packageName);
  2966. }
  2967. for (var s in urls) {
  2968. this.RemoveResourcesByurl(urls[s].url, true);
  2969. }
  2970. };
  2971. /************************************************ */
  2972. ResDataControl.prototype.placeHSlider = function () {
  2973. var hs = new Laya.HSlider();
  2974. hs.skin = "res/ui/hslider.png";
  2975. hs.width = 300;
  2976. hs.pos(50, 170);
  2977. hs.min = 0;
  2978. hs.max = 100;
  2979. hs.value = 50;
  2980. hs.tick = 1;
  2981. Laya.stage.addChild(hs);
  2982. };
  2983. ResDataControl.prototype.placeVSlider = function () {
  2984. var vs = new Laya.VSlider();
  2985. vs.skin = "res/ui/vslider.png";
  2986. vs.height = 300;
  2987. vs.pos(400, 50);
  2988. vs.min = 0;
  2989. vs.max = 100;
  2990. vs.value = 50;
  2991. vs.tick = 1;
  2992. Laya.stage.addChild(vs);
  2993. };
  2994. ResDataControl.prototype.update = function (dt) {
  2995. this._time += dt;
  2996. if (this._time > this.CheckInterval) //1分钟检查一次
  2997. {
  2998. if (ResourceControl_1.ResourceControl.Instance.running) //如果当前在加载中,延时1秒检测
  2999. {
  3000. this._time -= 1000;
  3001. return;
  3002. }
  3003. this.RefreshGroupRes();
  3004. this._time = 0;
  3005. }
  3006. };
  3007. /**
  3008. * 清理资源缓存(url)
  3009. * @param url 要清理的资源url
  3010. * @param isClear 对于缓存池中的数据,当引用为0时,是否直接强制清除( 如果为false,则等待缓存定时刷新时候再去判断 )
  3011. */
  3012. ResDataControl.prototype.RemoveResourcesByurl = function (url, isClear) {
  3013. if (isClear === void 0) { isClear = false; }
  3014. if (this.urlRes.hasOwnProperty(url)) {
  3015. if (isClear) {
  3016. Laya.loader.clearRes(url);
  3017. delete this.urlRes[url];
  3018. }
  3019. else {
  3020. this.urlRes[url]--;
  3021. }
  3022. }
  3023. else {
  3024. Laya.loader.clearRes(url);
  3025. }
  3026. };
  3027. ResDataControl.prototype.ClearLiveDataByPackName = function (pkgName) {
  3028. if (this.packageRes[pkgName]) {
  3029. var vo = this.packageRes[pkgName];
  3030. vo.clear();
  3031. delete this.packageRes[pkgName];
  3032. }
  3033. };
  3034. /**
  3035. * 添加ui包
  3036. * @param pkgname 包名
  3037. * @param isaddpackage 是否创建uipackage
  3038. * @param isCache 是否添加到组缓存中( 如果添加,则参与定时清理的逻辑,常驻资源请勿设置为ture )
  3039. */
  3040. ResDataControl.prototype.AddViewPackByName = function (pkgname, isaddpackage, isCache) {
  3041. if (isaddpackage === void 0) { isaddpackage = true; }
  3042. if (isCache === void 0) { isCache = true; }
  3043. if (isaddpackage) {
  3044. if (pkgname == "main") {
  3045. fairygui.UIPackage.addPackage(AssetPath_1.AssetPath.res + AssetPath_1.AssetPath.subpacksgeui + pkgname, pkgname);
  3046. }
  3047. else {
  3048. fairygui.UIPackage.addPackage(AssetPath_1.AssetPath.resources + AssetPath_1.AssetPath.ui + pkgname, pkgname);
  3049. }
  3050. }
  3051. this.AddLocalLiveData(pkgname, isCache);
  3052. };
  3053. /**
  3054. * 移除包
  3055. * @param pkgname 包名
  3056. * @param isclear 是否强制清除( 如果为false则等待定时器判断清理,如果为true则强制清除 )
  3057. */
  3058. ResDataControl.prototype.ClearPackByName = function (pkgname, isclear) {
  3059. if (isclear === void 0) { isclear = false; }
  3060. if (pkgname == "" || pkgname == null) {
  3061. return;
  3062. }
  3063. if (isclear) {
  3064. fairygui.UIPackage.removePackage(pkgname);
  3065. if (this.packageRes.hasOwnProperty(pkgname)) {
  3066. delete this.packageRes[pkgname];
  3067. }
  3068. }
  3069. else {
  3070. if (this.packageRes.hasOwnProperty(pkgname)) {
  3071. var vo = this.packageRes[pkgname];
  3072. if (vo) {
  3073. vo.ref--;
  3074. }
  3075. }
  3076. }
  3077. };
  3078. ResDataControl.prototype.RefreshGroupRes = function () {
  3079. var nowTime = Laya.Browser.now();
  3080. var s;
  3081. if (this.packageRes) {
  3082. var vo;
  3083. for (s in this.packageRes) {
  3084. vo = this.packageRes[s];
  3085. if (vo.ref <= 0 && (nowTime - vo.time) > this.ClearInterval) {
  3086. this.ClearPackByName(vo.packageName, true);
  3087. this.ClearLiveDataByPackName(vo.packageName);
  3088. }
  3089. }
  3090. }
  3091. //清理图片缓存
  3092. if (this.urlRes) {
  3093. var resourceurlPool = this.urlRes;
  3094. for (s in resourceurlPool) {
  3095. if (resourceurlPool[s] <= 0) {
  3096. this.RemoveResourcesByurl(s, true);
  3097. }
  3098. }
  3099. }
  3100. };
  3101. ResDataControl.prototype.onSkinLoaded = function () {
  3102. var tabA = this.createTab(this.skins[0]);
  3103. tabA.pos(40, 120);
  3104. tabA.labelColors = "#000000,#d3d3d3,#333333";
  3105. var tabB = this.createTab(this.skins[1]);
  3106. tabB.pos(40, 220);
  3107. tabB.labelColors = "#FFFFFF,#8FB299,#FFFFFF";
  3108. };
  3109. ResDataControl.prototype.createTab = function (skin) {
  3110. var tab = new Tab();
  3111. tab.skin = skin;
  3112. tab.labelBold = true;
  3113. tab.labelSize = 20;
  3114. tab.labelStrokeColor = "#000000";
  3115. tab.labels = "Tab Control 1,Tab Control 2,Tab Control 3";
  3116. tab.labelPadding = "0,0,0,0";
  3117. tab.selectedIndex = 1;
  3118. Laya.stage.addChild(tab);
  3119. return tab;
  3120. };
  3121. /******************************************************************* */
  3122. /**
  3123. * 获取已经加载过的数据
  3124. * @param url 资源url
  3125. * @param isCache 是否存储在缓存池中,默认为true
  3126. */
  3127. ResDataControl.prototype.GainResources = function (url, isCache) {
  3128. if (isCache === void 0) { isCache = true; }
  3129. if (isCache) {
  3130. if (this.urlRes[url] == null) {
  3131. this.urlRes[url] = 0;
  3132. }
  3133. this.urlRes[url]++;
  3134. }
  3135. return Laya.loader.getRes(url);
  3136. };
  3137. ResDataControl.prototype.AddLocalLiveData = function (pkgname, isCache) {
  3138. if (isCache && !this.NoLiveData.hasOwnProperty(pkgname)) {
  3139. var vo;
  3140. if (!this.packageRes.hasOwnProperty(pkgname)) {
  3141. vo = GamePool_1.GamePool.GetItem(LocalData_1.LocalData.ResDicValue);
  3142. vo.packageName = pkgname;
  3143. this.packageRes[pkgname] = vo;
  3144. }
  3145. else {
  3146. vo = this.packageRes[pkgname];
  3147. }
  3148. vo.ref++;
  3149. vo.time = Laya.Browser.now();
  3150. }
  3151. };
  3152. return ResDataControl;
  3153. }());
  3154. exports.ResDataControl = ResDataControl;
  3155. },{"../Config/AssetPath":15,"../Data/LocalData":30,"../PrefabControl/GamePool":45,"../Time/TimerService":57,"./ResourceControl":26}],26:[function(require,module,exports){
  3156. "use strict";
  3157. Object.defineProperty(exports, "__esModule", { value: true });
  3158. /*
  3159. * name;
  3160. */
  3161. var Handler = Laya.Handler;
  3162. var DispatcherManager_1 = require("../utils/DispatcherManager");
  3163. var RecConfigs_1 = require("../Config/RecConfigs");
  3164. var ResourceControl = /** @class */ (function (_super) {
  3165. __extends(ResourceControl, _super);
  3166. function ResourceControl() {
  3167. var _this = _super.call(this) || this;
  3168. _this._groupIndex = 0;
  3169. _this.running = false;
  3170. /**
  3171. * 要加载的总数量
  3172. */
  3173. _this._loadNum = 0;
  3174. /**
  3175. * 已经加载的数量
  3176. */
  3177. _this._loadedNum = 0;
  3178. _this._preloadNum = 0;
  3179. _this._cut = 0;
  3180. _this._nowLoadArr = null;
  3181. ResourceControl.ins = _this;
  3182. return _this;
  3183. }
  3184. Object.defineProperty(ResourceControl, "Instance", {
  3185. get: function () {
  3186. if (ResourceControl.ins == null) {
  3187. return new ResourceControl();
  3188. }
  3189. return ResourceControl.ins;
  3190. },
  3191. enumerable: true,
  3192. configurable: true
  3193. });
  3194. ResourceControl.prototype.init = function () {
  3195. this._configs = new Array();
  3196. this._groups = {};
  3197. Laya.loader.retryNum = 4;
  3198. Laya.loader.on(Laya.Event.ERROR, this, this.onError);
  3199. Laya.loader.on("errorsMsg", this, this.errorsMsghandler);
  3200. Laya.loader.on("gameerrorsMsg", this, this.gameerrorsMsghandler);
  3201. };
  3202. ResourceControl.prototype.onLoadConfigComplete = function () {
  3203. if (this._onConfigCompleteTarget != null && this._onConfigComplete != null) {
  3204. this._onConfigComplete.call(this._onConfigCompleteTarget);
  3205. }
  3206. };
  3207. ResourceControl.prototype.errorsMsghandler = function (msg) {
  3208. DispatcherManager_1.DispatcherManager.dispatchEvent("loadfailEvent", msg);
  3209. };
  3210. ResourceControl.prototype.gameerrorsMsghandler = function (msg) {
  3211. DispatcherManager_1.DispatcherManager.dispatchEvent("gameserrosEvent", msg);
  3212. };
  3213. /**
  3214. * 加载资源组
  3215. * @param groupName 组名
  3216. * @param onResourceLoadTarget 作用域
  3217. * @param ResourceLoadComplete 完成事件
  3218. * @param onResourceProgress 加载进度事件
  3219. * @param isShow 是否显示加载状态
  3220. */
  3221. ResourceControl.prototype.loadGroup = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3222. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3223. if (isShow === void 0) { isShow = true; }
  3224. if (args === void 0) { args = null; }
  3225. // Debuger.log(groupName);
  3226. var data = {};
  3227. data.complete = ResourceLoadComplete;
  3228. data.completeTarget = onResourceLoadTarget;
  3229. data.progress = onResourceProgress;
  3230. data.urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
  3231. data.isShow = isShow;
  3232. data.args = args;
  3233. data.type = "group";
  3234. data.resouseType = "2D";
  3235. this._configs.push(data);
  3236. this.loadStart();
  3237. };
  3238. /**
  3239. * 加载单个资源
  3240. * @param url 资源url
  3241. * @param type 资源类型
  3242. * @param onResourceLoadTarget 作用域
  3243. * @param ResourceLoadComplete 完成事件
  3244. * @param onResourceProgress 加载进度事件
  3245. * @param isShow 是否显示加载状态
  3246. */
  3247. ResourceControl.prototype.Loader = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3248. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3249. if (isShow === void 0) { isShow = true; }
  3250. if (args === void 0) { args = null; }
  3251. var data = {};
  3252. data.complete = ResourceLoadComplete;
  3253. data.completeTarget = onResourceLoadTarget;
  3254. data.progress = onResourceProgress;
  3255. data.urls = [{ url: url, type: type }];
  3256. data.isShow = isShow;
  3257. data.args = args;
  3258. data.type = "single";
  3259. data.resouseType = "2D";
  3260. this._configs.push(data);
  3261. this.loadStart();
  3262. };
  3263. /**
  3264. * 加载数组资源
  3265. * @param urls
  3266. * @param onResourceLoadTarget
  3267. * @param ResourceLoadComplete
  3268. * @param onResourceProgress
  3269. * @param isShow
  3270. */
  3271. ResourceControl.prototype.Loaders = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3272. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3273. if (isShow === void 0) { isShow = true; }
  3274. if (args === void 0) { args = null; }
  3275. var data = {};
  3276. data.complete = ResourceLoadComplete;
  3277. data.completeTarget = onResourceLoadTarget;
  3278. data.progress = onResourceProgress;
  3279. data.urls = urls;
  3280. data.isShow = isShow;
  3281. data.type = "arr";
  3282. data.args = args;
  3283. data.resouseType = "2D";
  3284. this._configs.push(data);
  3285. this.loadStart();
  3286. };
  3287. /**
  3288. * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 )
  3289. * @param urls
  3290. * @param onResourceLoadTarget
  3291. * @param ResourceLoadComplete
  3292. * @param onResourceProgress
  3293. * @param isShow
  3294. */
  3295. ResourceControl.prototype.loaderArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, cut) {
  3296. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3297. if (cut === void 0) { cut = 3; }
  3298. var data = {};
  3299. data.complete = ResourceLoadComplete;
  3300. data.completeTarget = onResourceLoadTarget;
  3301. data.progress = onResourceProgress;
  3302. data.urls = urls;
  3303. data.isShow = false;
  3304. data.type = "loaderArr";
  3305. data.cut = cut;
  3306. data.resouseType = "2D";
  3307. this._configs.push(data);
  3308. this.startLoad1();
  3309. };
  3310. ResourceControl.prototype.startLoad1 = function () {
  3311. if (!this.running && this._configs.length > 0) {
  3312. this._nowLoadData = this._configs.shift();
  3313. this._nowLoadArr = this._nowLoadData.urls.concat().reverse();
  3314. this._loadNum = this._nowLoadArr.length;
  3315. this._loadedNum = 0;
  3316. this._preloadNum = this._loadedNum;
  3317. this._cut = Number(this._nowLoadData.cut);
  3318. this.loadStart1();
  3319. }
  3320. };
  3321. ResourceControl.prototype.loadStart1 = function () {
  3322. if (this.running) {
  3323. return;
  3324. }
  3325. if (this._nowLoadArr && this._nowLoadArr.length > 0) {
  3326. this.running = true;
  3327. var needArr;
  3328. if (this._nowLoadArr.length > this._cut) {
  3329. needArr = this._nowLoadArr.splice(0, this._cut);
  3330. }
  3331. else {
  3332. needArr = this._nowLoadArr.splice(0);
  3333. }
  3334. this._cut = needArr.length;
  3335. this._preloadNum = this._loadedNum;
  3336. this.onLoadingArr(0);
  3337. var resouseType = this._nowLoadData.resouseType;
  3338. if (resouseType == "2D" || resouseType == null) {
  3339. Laya.loader.load(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false));
  3340. }
  3341. else {
  3342. Laya.loader.create(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false));
  3343. }
  3344. }
  3345. else {
  3346. this._nowLoadData = null;
  3347. this.startLoad1();
  3348. }
  3349. };
  3350. ResourceControl.prototype.onLoadingArr = function (value) {
  3351. this._loadedNum = this._preloadNum + value * this._cut;
  3352. if (this._nowLoadData) {
  3353. var allvalue = Math.ceil((this._loadedNum / this._loadNum) * 100);
  3354. if (this._nowLoadData.progress != null) {
  3355. this._nowLoadData.progress.call(this._nowLoadData.completeTarget, allvalue, Math.floor(value * 100));
  3356. }
  3357. }
  3358. };
  3359. ResourceControl.prototype.onLoadCompleteArr = function () {
  3360. this.onLoadingArr(1);
  3361. this._loadedNum = this._preloadNum + this._cut;
  3362. this.running = false;
  3363. if (this._loadedNum == this._loadNum) {
  3364. if (this._nowLoadData && this._nowLoadData.complete) {
  3365. this._nowLoadData.complete.call(this._nowLoadData.completeTarget);
  3366. }
  3367. }
  3368. Laya.timer.callLater(this, this.loadStart1);
  3369. // this.loadStart1();
  3370. };
  3371. ResourceControl.prototype.loadStart = function () {
  3372. if (this.running || this._configs.length == 0) {
  3373. return;
  3374. }
  3375. this.running = true;
  3376. this._nowLoadData = this._configs[0];
  3377. var arr = this._nowLoadData.urls;
  3378. var isShow = this._nowLoadData.isShow;
  3379. if (isShow) {
  3380. fairygui.GRoot.inst.showModalWait();
  3381. }
  3382. var resouseType = this._nowLoadData.resouseType;
  3383. if (arr != null) {
  3384. if (resouseType == "2D" || resouseType == null) {
  3385. Laya.loader.load(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false));
  3386. }
  3387. else {
  3388. Laya.loader.create(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false));
  3389. }
  3390. }
  3391. };
  3392. // 加载进度侦听器
  3393. ResourceControl.prototype.onLoading = function (progress) {
  3394. if (this._nowLoadData) {
  3395. progress = Math.ceil(Number(progress * 100));
  3396. if (this._nowLoadData.progress != null) {
  3397. this._nowLoadData.progress.call(this._nowLoadData.completeTarget, progress);
  3398. }
  3399. }
  3400. };
  3401. ResourceControl.prototype.onLoadComplete = function (args) {
  3402. if (args === void 0) { args = null; }
  3403. fairygui.GRoot.inst.closeModalWait();
  3404. if (this._nowLoadData && this._nowLoadData.complete) {
  3405. if (this._nowLoadData.args) {
  3406. this._nowLoadData.complete.call(this._nowLoadData.completeTarget, this._nowLoadData.args);
  3407. }
  3408. else {
  3409. this._nowLoadData.complete.call(this._nowLoadData.completeTarget);
  3410. }
  3411. }
  3412. this.running = false;
  3413. this._nowLoadData = null;
  3414. this._configs.shift();
  3415. this.loadStart();
  3416. };
  3417. ResourceControl.prototype.onError = function (err) {
  3418. fairygui.GRoot.inst.closeModalWait();
  3419. };
  3420. /**
  3421. * 加载3D单个资源
  3422. * @param url 资源url
  3423. * @param type 资源类型
  3424. * @param onResourceLoadTarget 作用域
  3425. * @param ResourceLoadComplete 完成事件
  3426. * @param onResourceProgress 加载进度事件
  3427. * @param isShow 是否显示加载状态
  3428. */
  3429. ResourceControl.prototype.Loader3D = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow) {
  3430. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3431. if (isShow === void 0) { isShow = true; }
  3432. var data = {};
  3433. data.complete = ResourceLoadComplete;
  3434. data.completeTarget = onResourceLoadTarget;
  3435. data.progress = onResourceProgress;
  3436. data.urls = [{ url: url, type: type }];
  3437. data.isShow = isShow;
  3438. data.type = "single";
  3439. data.resouseType = "3D";
  3440. this._configs.push(data);
  3441. this.loadStart();
  3442. };
  3443. /**
  3444. * 加载3D资源组
  3445. * @param groupName 组名
  3446. * @param onResourceLoadTarget 作用域
  3447. * @param ResourceLoadComplete 完成事件
  3448. * @param onResourceProgress 加载进度事件
  3449. * @param isShow 是否显示加载状态
  3450. */
  3451. ResourceControl.prototype.loadGroup3D = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3452. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3453. if (isShow === void 0) { isShow = true; }
  3454. if (args === void 0) { args = null; }
  3455. var data = {};
  3456. data.complete = ResourceLoadComplete;
  3457. data.completeTarget = onResourceLoadTarget;
  3458. data.progress = onResourceProgress;
  3459. data.urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
  3460. data.isShow = isShow;
  3461. data.args = args;
  3462. data.type = "group";
  3463. data.resouseType = "3D";
  3464. this._configs.push(data);
  3465. this.loadStart();
  3466. };
  3467. /**
  3468. * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 )
  3469. * @param urls
  3470. * @param onResourceLoadTarget
  3471. * @param ResourceLoadComplete
  3472. * @param onResourceProgress
  3473. * @param isShow
  3474. */
  3475. ResourceControl.prototype.loader3DArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isshow, args) {
  3476. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3477. if (isshow === void 0) { isshow = false; }
  3478. if (args === void 0) { args = null; }
  3479. var data = {};
  3480. data.complete = ResourceLoadComplete;
  3481. data.completeTarget = onResourceLoadTarget;
  3482. data.progress = onResourceProgress;
  3483. data.urls = urls;
  3484. data.isShow = isshow;
  3485. data.args = args;
  3486. data.type = "loaderArr";
  3487. data.resouseType = "3D";
  3488. this._configs.push(data);
  3489. this.loadStart();
  3490. };
  3491. /**
  3492. * 加载特效
  3493. * @param groupName
  3494. * @param onResourceLoadTarget
  3495. * @param ResourceLoadComplete
  3496. * @param args
  3497. */
  3498. ResourceControl.prototype.loadEffect = function (groupName, onResourceLoadTarget, ResourceLoadComplete, args) {
  3499. if (args === void 0) { args = null; }
  3500. var urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
  3501. if (urls && urls.length > 0) {
  3502. Laya.loader.load(urls, Handler.create(onResourceLoadTarget, ResourceLoadComplete, [args]));
  3503. }
  3504. };
  3505. return ResourceControl;
  3506. }(Laya.EventDispatcher));
  3507. exports.ResourceControl = ResourceControl;
  3508. },{"../Config/RecConfigs":16,"../utils/DispatcherManager":83}],27:[function(require,module,exports){
  3509. "use strict";
  3510. Object.defineProperty(exports, "__esModule", { value: true });
  3511. var LayoutControl_1 = require("./LayoutControl");
  3512. var AssetPath_1 = require("../Config/AssetPath");
  3513. var CameraManager_1 = require("../Game/CameraManager");
  3514. var PropManager_1 = require("../PrefabControl/PropManager");
  3515. var Player_1 = require("../Game/Player");
  3516. var DispatcherManager_1 = require("../utils/DispatcherManager");
  3517. var GameState_1 = require("../utils/GameState");
  3518. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  3519. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  3520. var GameUtils_1 = require("../utils/GameUtils");
  3521. var NpcCFG_1 = require("../CFG/NpcCFG");
  3522. var NpcScript_1 = require("../Game/NpcScript");
  3523. var ResourceControl_1 = require("./ResourceControl");
  3524. var GameCFG_1 = require("../CFG/GameCFG");
  3525. var CharacterState_1 = require("../PrefabControl/CharacterState");
  3526. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  3527. var CharacterPool_1 = require("../PrefabControl/CharacterPool");
  3528. var Sprite = Laya.Sprite;
  3529. var Event = Laya.Event;
  3530. var SceneControl = /** @class */ (function () {
  3531. function SceneControl() {
  3532. this._initPosY = 1;
  3533. this.index = 0;
  3534. this.preRadian = 0;
  3535. SceneControl.ins = this;
  3536. }
  3537. Object.defineProperty(SceneControl, "Instance", {
  3538. get: function () {
  3539. if (SceneControl.ins == null) {
  3540. return new SceneControl();
  3541. }
  3542. return SceneControl.ins;
  3543. },
  3544. enumerable: true,
  3545. configurable: true
  3546. });
  3547. //创建主角
  3548. SceneControl.prototype.CreatePlayer = function (rolecfg) {
  3549. var iscreate = false;
  3550. if (!PropManager_1.PropManager.mainRole) {
  3551. iscreate = true;
  3552. }
  3553. else if (PropManager_1.PropManager.mainRole.name != "Character" + rolecfg.name) {
  3554. iscreate = true;
  3555. this.ClearMomentCharacter();
  3556. }
  3557. if (iscreate) {
  3558. // var sp:Laya.Sprite3D = Laya.Loader.getRes(AssetPath.get3DRoleModel(RoleData.roleCfg.name)) as Laya.Sprite3D;
  3559. // PropManager.mainRole = Laya.Sprite3D.instantiate(sp, PropManager.scene3D, false,new Laya.Vector3( 0,0,0 )) as Laya.Sprite3D;
  3560. PropManager_1.PropManager.mainRole = CharacterPool_1.CharacterPool.AddCharacter(rolecfg.name, Player_1.Player, PropManager_1.PropManager.scene3D);
  3561. PropManager_1.PropManager.mainRole.name = "Character" + rolecfg.name;
  3562. this.PlayerScript = PropManager_1.PropManager.mainRole.getComponent(Player_1.Player);
  3563. // this.mainRoleScript.resouseName = RoleData.roleCfg.name;
  3564. // if( )
  3565. // this.mainRoleScript = PropManager.mainRole.addComponent( MainRAoleScript );
  3566. }
  3567. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3568. var RoleData = agencyusermessage.RoleData;
  3569. var info = RoleData.levelcfg.roleinitpos;
  3570. var chidarr = GameUtils_1.GameUtils.cutstrtoArr(info.offsetPos);
  3571. var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2]));
  3572. var posVec = new Laya.Vector3;
  3573. var selectVec;
  3574. if (info.initbuild == "startpanel") {
  3575. posVec.x = PropManager_1.PropManager.startPlane.transform.position.x + offsetPos.x;
  3576. posVec.y = PropManager_1.PropManager.startPlane.transform.position.y + offsetPos.y;
  3577. posVec.z = PropManager_1.PropManager.startPlane.transform.position.z + offsetPos.z;
  3578. selectVec = PropManager_1.PropManager.startPlane.getChildByName("child_pos").transform.position;
  3579. }
  3580. else {
  3581. var childpos = PropManager_1.PropManager.getPosVecbyScene(RoleData.levelmapArr[0], info.initbuild);
  3582. posVec.x = childpos.x + offsetPos.x;
  3583. posVec.y = childpos.y + offsetPos.y;
  3584. posVec.z = childpos.z + offsetPos.z;
  3585. selectVec = childpos;
  3586. }
  3587. PropManager_1.PropManager.mainRole.transform.position = posVec;
  3588. this.cameraScript.SetCameraPosition(PropManager_1.PropManager.mainRole.transform.position);
  3589. this.PlayerScript.setnowSelectVec(selectVec);
  3590. this.PlayerScript.nowAction = CharacterState_1.CharacterState.stand;
  3591. this.PlayerScript.PlayAnimator(CharacterState_1.CharacterState.stand);
  3592. // var UIPos = PropManager.mainRole.transform.position;
  3593. // var NAMEUI = new Laya.Text();
  3594. // NAMEUI.text = "自己";
  3595. // NAMEUI.fontSize = 60;
  3596. // NAMEUI.color = "#ffffff";
  3597. // NAMEUI.scaleX = 0.5;
  3598. // NAMEUI.scaleY = 0.5;
  3599. // NAMEUI.align = "center";
  3600. // NAMEUI.valign = "middle";
  3601. // Laya.stage.addChild(NAMEUI);
  3602. // Laya.timer.frameLoop(1, this, () => {
  3603. // let ScreenPos = new Laya.Vector3();
  3604. // PropManager.carma.worldToViewportPoint(UIPos, ScreenPos);
  3605. // NAMEUI.pos(ScreenPos.x, ScreenPos.y);
  3606. // })
  3607. };
  3608. //创建npc
  3609. SceneControl.prototype.createNpc = function () {
  3610. console.log("CreatNpc---");
  3611. this.ClearNpc();
  3612. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3613. var RoleData = agencyusermessage.RoleData;
  3614. var arr = RoleData.levelcfg.npc;
  3615. var childdict;
  3616. var index = 0;
  3617. PropManager_1.PropManager.npcnum = arr.length;
  3618. for (var s in arr) {
  3619. childdict = arr[s];
  3620. var selectVec = null;
  3621. var npccfg = NpcCFG_1.default.dict[childdict.id];
  3622. var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DRoleModel(npccfg.name));
  3623. var chidarr = GameUtils_1.GameUtils.cutstrtoArr(childdict.offsetPos);
  3624. var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2]));
  3625. var posVec = new Laya.Vector3;
  3626. if (childdict.scene == "startpanel") {
  3627. posVec.x = PropManager_1.PropManager.startPlane.transform.position.x + offsetPos.x;
  3628. posVec.y = PropManager_1.PropManager.startPlane.transform.position.y + 1 + offsetPos.y;
  3629. posVec.z = PropManager_1.PropManager.startPlane.transform.position.z + offsetPos.z;
  3630. selectVec = PropManager_1.PropManager.startPlane.getChildByName("child_pos").transform.position;
  3631. }
  3632. else {
  3633. var childpos = PropManager_1.PropManager.getPosVecbyScene(childdict.scene, childdict.initbuild);
  3634. posVec.x = childpos.x + offsetPos.x;
  3635. posVec.y = childpos.y + offsetPos.y;
  3636. posVec.z = childpos.z + offsetPos.z;
  3637. selectVec = childpos;
  3638. }
  3639. var npcsp = CharacterPool_1.CharacterPool.AddCharacter(npccfg.name, NpcScript_1.NpcScript, PropManager_1.PropManager.scene3D);
  3640. npcsp.name = "npc_" + index;
  3641. npcsp.transform.position = posVec;
  3642. var npcscript = npcsp.getComponent(NpcScript_1.NpcScript);
  3643. npcscript.setnowSelectVec(selectVec);
  3644. npcscript.npcinfo(npccfg);
  3645. PropManager_1.PropManager.npcDict[npcsp.name] = npcsp;
  3646. PropManager_1.PropManager.npcscriptDict[npcsp.name] = npcscript;
  3647. npcscript.PlayAnimator(CharacterState_1.CharacterState.stand);
  3648. index++;
  3649. // this.ShowUI(npcsp);
  3650. }
  3651. console.log("CreatNpc2---");
  3652. };
  3653. SceneControl.prototype.ShowUI = function (_sprite) {
  3654. var UIPos = _sprite.transform.position;
  3655. var NAMEUI = new Laya.Text();
  3656. var random = GameUtils_1.GameUtils.randRangeint(1, 30);
  3657. NAMEUI.text = "npc_" + this.index;
  3658. NAMEUI.fontSize = 60;
  3659. NAMEUI.color = "#ffffff";
  3660. NAMEUI.scaleX = 0.5;
  3661. NAMEUI.scaleY = 0.5;
  3662. NAMEUI.align = "center";
  3663. NAMEUI.valign = "middle";
  3664. Laya.stage.addChild(NAMEUI);
  3665. Laya.timer.frameLoop(1, this, function () {
  3666. var ScreenPos = new Laya.Vector3();
  3667. PropManager_1.PropManager.carma.worldToViewportPoint(UIPos, ScreenPos);
  3668. NAMEUI.pos(ScreenPos.x, ScreenPos.y + 20);
  3669. });
  3670. this.index++;
  3671. };
  3672. SceneControl.prototype.ShowTheGameScene = function () {
  3673. var pathArr = [];
  3674. var urlArr = [];
  3675. this.cameraScript.iscanfollow = true;
  3676. var roleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
  3677. var arr = roleData.levelmapArr;
  3678. var i = 0;
  3679. for (i = 0; i < arr.length; i++) {
  3680. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DModel(arr[i])) == -1) {
  3681. urlArr.push(AssetPath_1.AssetPath.get3DModel(arr[i]));
  3682. }
  3683. }
  3684. var npcArr = roleData.levelcfg.npc;
  3685. for (i = 0; i < npcArr.length; i++) {
  3686. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) {
  3687. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name));
  3688. }
  3689. }
  3690. for (i = 0; i < urlArr.length; i++) {
  3691. pathArr.push({ url: urlArr[i] });
  3692. }
  3693. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.SceneCreatComplete, null, true);
  3694. };
  3695. SceneControl.prototype.SceneCreatComplete = function () {
  3696. this.RefreshTerrain();
  3697. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3698. var RoleData = agencyusermessage.RoleData;
  3699. this.CreatePlayer(RoleData.roleCfg);
  3700. this.createNpc();
  3701. };
  3702. SceneControl.prototype.ListenOnEvent = function () {
  3703. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.start, this, this.EnterGame);
  3704. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.jump, this, this.Jump);
  3705. DispatcherManager_1.DispatcherManager.addEventListener(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid, this, this.RefreshCharacterModel);
  3706. };
  3707. SceneControl.prototype.CharacterLoadEnd = function (url) {
  3708. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3709. var RoleData = agencyusermessage.RoleData;
  3710. if (AssetPath_1.AssetPath.get3DModel(RoleData.roleCfg.name) == url) {
  3711. this.CreatePlayer(RoleData.roleCfg);
  3712. }
  3713. };
  3714. SceneControl.prototype.Jump = function () {
  3715. this.PlayerScript.TestJump();
  3716. };
  3717. /************************************************************** */
  3718. SceneControl.prototype.setup = function () {
  3719. this.createSprite();
  3720. Laya.stage.on(Event.MOUSE_UP, this, this.onMouseUp);
  3721. Laya.stage.on(Event.MOUSE_OUT, this, this.onMouseUp);
  3722. };
  3723. SceneControl.prototype.createSprite = function () {
  3724. this.sp = new Sprite();
  3725. var w = 200, h = 300;
  3726. this.sp.graphics.drawRect(0, 0, w, h, "#FF7F50");
  3727. this.sp.size(w, h);
  3728. this.sp.pivot(w / 2, h / 2);
  3729. this.sp.pos(Laya.stage.width / 2, Laya.stage.height / 2);
  3730. Laya.stage.addChild(this.sp);
  3731. this.sp.on(Event.MOUSE_DOWN, this, this.onMouseDown);
  3732. };
  3733. SceneControl.prototype.onMouseDown = function (e) {
  3734. var touches = e.touches;
  3735. if (touches && touches.length == 2) {
  3736. this.preRadian = Math.atan2(touches[0].stageY - touches[1].stageY, touches[0].stageX - touches[1].stageX);
  3737. Laya.stage.on(Event.MOUSE_MOVE, this, this.onMouseMove);
  3738. }
  3739. };
  3740. SceneControl.prototype.onMouseMove = function (e) {
  3741. var touches = e.touches;
  3742. if (touches && touches.length == 2) {
  3743. var nowRadian = Math.atan2(touches[0].stageY - touches[1].stageY, touches[0].stageX - touches[1].stageX);
  3744. this.sp.rotation += 180 / Math.PI * (nowRadian - this.preRadian);
  3745. this.preRadian = nowRadian;
  3746. }
  3747. };
  3748. SceneControl.prototype.onMouseUp = function (e) {
  3749. Laya.stage.off(Event.MOUSE_MOVE, this, this.onMouseMove);
  3750. };
  3751. /********************************** */
  3752. SceneControl.prototype.EnterGame = function (jiasu) {
  3753. this.PlayerScript.startRun(jiasu);
  3754. var npcdict = PropManager_1.PropManager.npcscriptDict;
  3755. for (var s in npcdict) {
  3756. var npcscript = npcdict[s];
  3757. npcscript.startRun();
  3758. }
  3759. };
  3760. SceneControl.prototype.ClearMomentCharacter = function () {
  3761. if (PropManager_1.PropManager.mainRole && this.PlayerScript) {
  3762. CharacterPool_1.CharacterPool.ClearCharacter(PropManager_1.PropManager.mainRole, this.PlayerScript.resouseName, this.PlayerScript);
  3763. this.PlayerScript = null;
  3764. PropManager_1.PropManager.mainRole = null;
  3765. }
  3766. };
  3767. SceneControl.prototype.SetScene = function () {
  3768. var backgroundParent = LayoutControl_1.LayoutControl.Instance.background.displayObject;
  3769. var scenebg = fairygui.UIPackage.createObject("main", "gambg");
  3770. scenebg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  3771. LayoutControl_1.LayoutControl.Instance.background.addChild(scenebg);
  3772. // UiManager.instance.add( GameBgView,null,LayerNotify.LAYER_BACKGROUND );
  3773. //添加3D场景
  3774. PropManager_1.PropManager.scene3D = backgroundParent.addChild(new Laya.Scene3D());
  3775. PropManager_1.PropManager.scene3D.physicsSimulation.continuousCollisionDetection = true;
  3776. //添加照相机
  3777. PropManager_1.PropManager.carma = (PropManager_1.PropManager.scene3D.addChild(new Laya.Camera(0, 0.1, 70)));
  3778. this.cameraScript = PropManager_1.PropManager.carma.addComponent(CameraManager_1.CameraManager);
  3779. PropManager_1.PropManager.carma.clearFlag = Laya.BaseCamera.CLEARFLAG_DEPTHONLY;
  3780. //添加方向光
  3781. var directionLight = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("DirectionalLight")); //PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  3782. PropManager_1.PropManager.scene3D.addChild(directionLight);
  3783. // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  3784. // var directionLight: Laya.DirectionLight = PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  3785. // directionLight.color = new Laya.Vector3(1,1,1);
  3786. // directionLight.intensity = 0.5;
  3787. // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  3788. PropManager_1.PropManager.startPlane = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("startpanel"));
  3789. PropManager_1.PropManager.scene3D.addChild(PropManager_1.PropManager.startPlane);
  3790. PropManager_1.PropManager.endPlane = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("endpanel"));
  3791. PropManager_1.PropManager.scene3D.addChild(PropManager_1.PropManager.endPlane);
  3792. // PropManager.bgsprite3d = Laya.Loader.getRes(AssetPath.get3DModel("distantview"));
  3793. // PropManager.scene3D.addChild(PropManager.bgsprite3d);
  3794. //雾化代码
  3795. PropManager_1.PropManager.scene3D.enableFog = true;
  3796. //设置雾化的颜色
  3797. var fogArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[2].value);
  3798. if (GameCFG_1.default.dict[8]) {
  3799. var wucolor = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[8].value);
  3800. PropManager_1.PropManager.scene3D.fogColor = new Laya.Vector3(Number(wucolor[0]), Number(wucolor[1]), Number(wucolor[2]));
  3801. }
  3802. else {
  3803. PropManager_1.PropManager.scene3D.fogColor = new Laya.Vector3(0, 0, 0.6);
  3804. }
  3805. //设置雾化的起始位置,相对于相机的距离
  3806. var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[3].value);
  3807. PropManager_1.PropManager.scene3D.fogStart = Number(valueArr[0]);
  3808. //设置雾化最浓处的距离。
  3809. PropManager_1.PropManager.scene3D.fogRange = Number(valueArr[1]);
  3810. this.ShowTheGameScene();
  3811. this.ListenOnEvent();
  3812. };
  3813. /**清除所有NPC */
  3814. SceneControl.prototype.ClearNpc = function () {
  3815. var npcdict = PropManager_1.PropManager.npcDict;
  3816. var s;
  3817. for (s in npcdict) {
  3818. var sp = npcdict[s];
  3819. var npcscript = PropManager_1.PropManager.npcscriptDict[s];
  3820. var resousename = npcscript.resouseName;
  3821. CharacterPool_1.CharacterPool.ClearCharacter(sp, resousename, npcscript);
  3822. delete PropManager_1.PropManager.npcscriptDict[s];
  3823. delete npcdict[s];
  3824. }
  3825. };
  3826. SceneControl.prototype.Pattern = function (mapSprite3D) {
  3827. console.log("Pattern1----");
  3828. if (PropManager_1.PropManager.patternDict[mapSprite3D.name]) {
  3829. delete PropManager_1.PropManager.patternDict[mapSprite3D.name];
  3830. }
  3831. var BlocksSprite = mapSprite3D.getChildByName("Blocks");
  3832. var chiddict = {};
  3833. var chidsp;
  3834. var buildSp;
  3835. var index = 0;
  3836. while (BlocksSprite.getChildByName("build_all_" + index)) {
  3837. buildSp = BlocksSprite.getChildByName("build_all_" + index);
  3838. chidsp = buildSp.getChildByName("child_pos");
  3839. chiddict["build_all_" + index] = chidsp.transform.position;
  3840. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3841. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3842. }
  3843. index++;
  3844. }
  3845. index = 0;
  3846. while (BlocksSprite.getChildByName("build_front_" + index)) {
  3847. buildSp = BlocksSprite.getChildByName("build_front_" + index);
  3848. chidsp = buildSp.getChildByName("child_pos");
  3849. chiddict["build_front_" + index] = chidsp.transform.position;
  3850. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3851. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3852. }
  3853. index++;
  3854. }
  3855. index = 0;
  3856. while (BlocksSprite.getChildByName("build_left_" + index)) {
  3857. buildSp = BlocksSprite.getChildByName("build_left_" + index);
  3858. chidsp = buildSp.getChildByName("child_pos");
  3859. chiddict["build_left_" + index] = chidsp.transform.position;
  3860. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3861. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3862. }
  3863. index++;
  3864. }
  3865. index = 0;
  3866. while (BlocksSprite.getChildByName("build_right_" + index)) {
  3867. buildSp = BlocksSprite.getChildByName("build_right_" + index);
  3868. chidsp = buildSp.getChildByName("child_pos");
  3869. chiddict["build_right_" + index] = chidsp.transform.position;
  3870. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3871. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3872. }
  3873. index++;
  3874. }
  3875. index = 0;
  3876. while (BlocksSprite.getChildByName("build_frontleft_" + index)) {
  3877. buildSp = BlocksSprite.getChildByName("build_frontleft_" + index);
  3878. chidsp = buildSp.getChildByName("child_pos");
  3879. chiddict["build_frontleft_" + index] = chidsp.transform.position;
  3880. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3881. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3882. }
  3883. index++;
  3884. }
  3885. index = 0;
  3886. while (BlocksSprite.getChildByName("build_frontright_" + index)) {
  3887. buildSp = BlocksSprite.getChildByName("build_frontright_" + index);
  3888. chidsp = buildSp.getChildByName("child_pos");
  3889. chiddict["build_frontright_" + index] = chidsp.transform.position;
  3890. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3891. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3892. }
  3893. index++;
  3894. }
  3895. index = 0;
  3896. while (BlocksSprite.getChildByName("build_leftright_" + index)) {
  3897. buildSp = BlocksSprite.getChildByName("build_leftright_" + index);
  3898. chidsp = buildSp.getChildByName("child_pos");
  3899. chiddict["build_leftright_" + index] = chidsp.transform.position;
  3900. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3901. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3902. }
  3903. index++;
  3904. }
  3905. index = 0;
  3906. var Props = mapSprite3D.getChildByName("Props");
  3907. while (Props.getChildByName("Scaffolding_" + index)) {
  3908. chidsp = Props.getChildByName("Scaffolding_" + index).getChildByName("child_pos");
  3909. chiddict["Scaffolding_" + index] = chidsp.transform.position;
  3910. index++;
  3911. }
  3912. index = 0;
  3913. while (Props.getChildByName("grilling_" + index)) {
  3914. chidsp = Props.getChildByName("grilling_" + index).getChildByName("child_pos");
  3915. chiddict["grilling_" + index] = chidsp.transform.position;
  3916. index++;
  3917. }
  3918. index = 0;
  3919. var jumpchildSp;
  3920. var iscreatejt = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData.LevelID < 3 ? true : false;
  3921. while (Props.getChildByName("JumpBoost_" + index)) {
  3922. jumpchildSp = Props.getChildByName("JumpBoost_" + index);
  3923. if (iscreatejt) {
  3924. var pos = jumpchildSp.transform.position.clone();
  3925. pos.y += 3;
  3926. var jiantou = Laya.Sprite3D.instantiate(Laya.loader.getRes(AssetPath_1.AssetPath.get3DRoleModel("Arrow")), PropManager_1.PropManager.scene3D, false, pos);
  3927. PropManager_1.PropManager.jiantouArr.push(jiantou);
  3928. }
  3929. index++;
  3930. }
  3931. PropManager_1.PropManager.patternDict[mapSprite3D.name] = chiddict;
  3932. console.log("Pattern2----");
  3933. };
  3934. /***************************************************** */
  3935. SceneControl.prototype.onSpriteClick = function (e) {
  3936. var randomAngle = Math.random() * 180;
  3937. //发送自定义事件
  3938. // this.sp.event(Interaction_CustomEvent.ROTATE, [randomAngle]);
  3939. };
  3940. // 触发自定义的rotate事件
  3941. SceneControl.prototype.onRotate = function (newAngle) {
  3942. Laya.Tween.to(this.sp, { "rotation": newAngle }, 1000, Laya.Ease.elasticOut);
  3943. };
  3944. /***************************************************** */
  3945. SceneControl.prototype.RefreshCharacterModel = function () {
  3946. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3947. var RoleData = agencyusermessage.RoleData;
  3948. var pathArr = [];
  3949. pathArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(RoleData.roleCfg.name) });
  3950. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.CharacterLoadEnd, null, true, AssetPath_1.AssetPath.get3DModel(RoleData.roleCfg.name));
  3951. };
  3952. /*********更新地形 */
  3953. SceneControl.prototype.RefreshTerrain = function () {
  3954. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3955. var RoleData = agencyusermessage.RoleData;
  3956. var nowlevelcfg = RoleData.levelcfg;
  3957. var mapArr = RoleData.levelmapArr;
  3958. var mapSprite3D;
  3959. var mapname;
  3960. var _lastmapSprite3D;
  3961. for (var s in PropManager_1.PropManager.nowmapDict) {
  3962. PropManager_1.PropManager.nowmapDict[s].active = false;
  3963. }
  3964. for (var i = 0; i < mapArr.length; i++) {
  3965. mapname = mapArr[i];
  3966. console.log("mapname1----", mapname);
  3967. if (PropManager_1.PropManager.nowmapDict[mapname]) {
  3968. mapSprite3D = PropManager_1.PropManager.nowmapDict[mapname];
  3969. mapSprite3D.active = true;
  3970. }
  3971. else {
  3972. console.log("mapname2----", mapname);
  3973. var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel(mapname));
  3974. console.log("mapname3----", mapname);
  3975. mapSprite3D = Laya.Sprite3D.instantiate(sp, PropManager_1.PropManager.scene3D, false, null);
  3976. console.log("mapname4----", mapname);
  3977. PropManager_1.PropManager.nowmapDict[mapname] = mapSprite3D;
  3978. console.log("mapname5----", mapname);
  3979. }
  3980. if (i == 0) {
  3981. var arr = GameUtils_1.GameUtils.cutstrtoArr(nowlevelcfg.firstScenepos);
  3982. mapSprite3D.transform.position = new Laya.Vector3(Number(arr[0]), Number(arr[1]), Number(arr[2]));
  3983. }
  3984. else {
  3985. var endPos = _lastmapSprite3D.getChildByName("END").transform.position.clone();
  3986. endPos.x = 0;
  3987. endPos.y = 0;
  3988. mapSprite3D.transform.position = endPos;
  3989. }
  3990. this.Pattern(mapSprite3D);
  3991. _lastmapSprite3D = mapSprite3D;
  3992. var endPos1 = mapSprite3D.getChildByName("END").transform.position.clone();
  3993. endPos1.z += Number(GameCFG_1.default.dict[6].value);
  3994. PropManager_1.PropManager.endPlane.transform.position = endPos1;
  3995. PropManager_1.PropManager.gamewinPosZ = endPos1.z;
  3996. PropManager_1.PropManager.gamewinPosZ -= 2;
  3997. // PropManager.bgsprite3d.transform.position = new Laya.Vector3( 0,-20,-40 );
  3998. }
  3999. };
  4000. /*使用界面显示,0:砸蛋,1:宝箱*/
  4001. SceneControl.EggGGroup = 0;
  4002. return SceneControl;
  4003. }());
  4004. exports.SceneControl = SceneControl;
  4005. },{"../Agency/AgencyUserMessage":8,"../CFG/GameCFG":10,"../CFG/NpcCFG":13,"../Config/AssetPath":15,"../Data/UserInfoEvent":34,"../Game/CameraManager":36,"../Game/NpcScript":37,"../Game/Player":38,"../PrefabControl/CharacterPool":43,"../PrefabControl/CharacterState":44,"../PrefabControl/PanelResDic":46,"../PrefabControl/PropManager":47,"../utils/DispatcherManager":83,"../utils/GameState":84,"../utils/GameUtils":85,"./LayoutControl":21,"./ResourceControl":26}],28:[function(require,module,exports){
  4006. "use strict";
  4007. Object.defineProperty(exports, "__esModule", { value: true });
  4008. var GamePool_1 = require("../PrefabControl/GamePool");
  4009. var ComponentEventData = /** @class */ (function () {
  4010. function ComponentEventData() {
  4011. }
  4012. ComponentEventData.prototype.listenKeyboard = function () {
  4013. this.keyDownList = [];
  4014. //添加键盘按下事件,一直按着某按键则会不断触发
  4015. Laya.stage.on(Laya.Event.KEY_DOWN, this, this.onKeyDown);
  4016. //添加键盘抬起事件
  4017. Laya.stage.on(Laya.Event.KEY_UP, this, this.onKeyUp);
  4018. };
  4019. /**键盘按下处理*/
  4020. ComponentEventData.prototype.onKeyDown = function (e) {
  4021. var keyCode = e["keyCode"];
  4022. this.keyDownList[keyCode] = true;
  4023. };
  4024. ComponentEventData.prototype.clear = function () {
  4025. this.target = null;
  4026. this.type = null;
  4027. this.thisObject = null;
  4028. this.listener = null;
  4029. GamePool_1.GamePool.RemoveItem(ComponentEventData.ResDicValue, this);
  4030. };
  4031. /**键盘抬起处理*/
  4032. ComponentEventData.prototype.onKeyUp = function (e) {
  4033. delete this.keyDownList[e["keyCode"]];
  4034. };
  4035. ComponentEventData.ResDicValue = "ComponentEventData";
  4036. return ComponentEventData;
  4037. }());
  4038. exports.ComponentEventData = ComponentEventData;
  4039. },{"../PrefabControl/GamePool":45}],29:[function(require,module,exports){
  4040. "use strict";
  4041. Object.defineProperty(exports, "__esModule", { value: true });
  4042. /*
  4043. * name;
  4044. */
  4045. var DataInfoBase = /** @class */ (function (_super) {
  4046. __extends(DataInfoBase, _super);
  4047. function DataInfoBase() {
  4048. return _super.call(this) || this;
  4049. }
  4050. /***********混淆********* */
  4051. DataInfoBase.prototype.showApe = function () {
  4052. var monkey1Path = "./res/apes/monkey1.png", monkey2Path = "./res/apes/monkey2.png";
  4053. // 方法1:使用loadImage
  4054. var ape = new Laya.Sprite();
  4055. Laya.stage.addChild(ape);
  4056. ape.loadImage(monkey1Path);
  4057. // 方法2:使用drawTexture
  4058. Laya.loader.load(monkey2Path, Laya.Handler.create(this, function () {
  4059. var monkey2 = Laya.loader.getRes(monkey2Path);
  4060. var ape2 = new Laya.Sprite();
  4061. Laya.stage.addChild(ape2);
  4062. ape2.graphics.drawTexture(monkey2, 100, 0);
  4063. }));
  4064. };
  4065. /*********************** */
  4066. DataInfoBase.prototype.DataInfo = function (data) {
  4067. if (data) {
  4068. for (var s in data) {
  4069. var itemd = this[s];
  4070. if (itemd != null) {
  4071. this[s] = data[s];
  4072. }
  4073. // else
  4074. // {
  4075. // Debuger.log( "VO:未定义属性-" + s );
  4076. // }
  4077. }
  4078. }
  4079. };
  4080. /*********混淆 */
  4081. DataInfoBase.prototype.createButton = function (skin, name, cb, index) {
  4082. var btn = new Laya.Button(skin, name);
  4083. Laya.stage.addChild(btn);
  4084. btn.on(Laya.Event.CLICK, this, cb);
  4085. btn.size(147, 55);
  4086. btn.name = name;
  4087. btn.right = 10;
  4088. btn.top = index * (btn.height + 10);
  4089. return btn;
  4090. };
  4091. /***************** */
  4092. DataInfoBase.prototype.dispatchEvent = function (type, data) {
  4093. this.event(type, data);
  4094. };
  4095. return DataInfoBase;
  4096. }(Laya.EventDispatcher));
  4097. exports.DataInfoBase = DataInfoBase;
  4098. },{}],30:[function(require,module,exports){
  4099. "use strict";
  4100. Object.defineProperty(exports, "__esModule", { value: true });
  4101. var GamePool_1 = require("../PrefabControl/GamePool");
  4102. var Sprite = Laya.Sprite;
  4103. var Event = Laya.Event;
  4104. /*
  4105. * name;
  4106. */
  4107. var LocalData = /** @class */ (function (_super) {
  4108. __extends(LocalData, _super);
  4109. function LocalData() {
  4110. var _this = _super !== null && _super.apply(this, arguments) || this;
  4111. /**
  4112. * 引用次数
  4113. */
  4114. _this.ref = 0;
  4115. /**
  4116. * 最后一次被引用的时间
  4117. */
  4118. _this.time = 0;
  4119. /**
  4120. * 包名
  4121. */
  4122. _this.packageName = "";
  4123. return _this;
  4124. }
  4125. LocalData.prototype.createCoralRect = function () {
  4126. var coralRect = new Sprite();
  4127. coralRect.graphics.drawRect(0, 0, Laya.stage.width, Laya.stage.height / 2, "#FF7F50");
  4128. //设置名称
  4129. coralRect.name = "珊瑚色容器";
  4130. coralRect.size(Laya.stage.width, Laya.stage.height / 2);
  4131. Laya.stage.addChild(coralRect);
  4132. coralRect.on(Event.MOUSE_DOWN, this, this.onDown);
  4133. };
  4134. LocalData.prototype.createDeepSkyblueRect = function () {
  4135. var deepSkyblueRect = new Sprite();
  4136. deepSkyblueRect.graphics.drawRect(0, 0, 100, 100, "#00BFFF");
  4137. //设置名称
  4138. deepSkyblueRect.name = "天蓝色矩形";
  4139. //设置宽高(要接收鼠标事件必须设置宽高,否则不会被命中)
  4140. deepSkyblueRect.size(100, 100);
  4141. deepSkyblueRect.pos(10, 10);
  4142. Laya.stage.addChild(deepSkyblueRect);
  4143. deepSkyblueRect.on(Event.MOUSE_DOWN, this, this.onDown);
  4144. };
  4145. LocalData.prototype.clear = function () {
  4146. this.ref = 0;
  4147. this.time = 0;
  4148. this.packageName = "";
  4149. GamePool_1.GamePool.RemoveItem(LocalData.ResDicValue, this);
  4150. };
  4151. /**侦听处理方法*/
  4152. LocalData.prototype.onDown = function (e) {
  4153. this.logger.text += "点击 - " + e.target.name + "\n";
  4154. };
  4155. LocalData.ResDicValue = "LocalData";
  4156. return LocalData;
  4157. }(Laya.EventDispatcher));
  4158. exports.LocalData = LocalData;
  4159. },{"../PrefabControl/GamePool":45}],31:[function(require,module,exports){
  4160. "use strict";
  4161. Object.defineProperty(exports, "__esModule", { value: true });
  4162. var DispatcherManager_1 = require("../utils/DispatcherManager");
  4163. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  4164. var LocalDataControl_1 = require("../Control/LocalDataControl");
  4165. var UserDataInfo_1 = require("../Data/UserDataInfo");
  4166. var RoleCFG_1 = require("../CFG/RoleCFG");
  4167. var LevelCFG_1 = require("../CFG/LevelCFG");
  4168. var GameUtils_1 = require("../utils/GameUtils");
  4169. var DataInfoBase_1 = require("./DataInfoBase");
  4170. var Templet = Laya.Templet;
  4171. var Event = Laya.Event;
  4172. var RoleData = /** @class */ (function (_super) {
  4173. __extends(RoleData, _super);
  4174. function RoleData() {
  4175. var _this = _super.call(this) || this;
  4176. /**
  4177. * 金币
  4178. */
  4179. _this._Gold = 0;
  4180. _this._roleid = 0;
  4181. _this._leveid = 0;
  4182. _this.mStartX = 400;
  4183. _this.mStartY = 500;
  4184. _this.mActionIndex = 0;
  4185. _this.mCurrIndex = 0;
  4186. _this.mCurrSkinIndex = 0;
  4187. /****************************************************** */
  4188. _this.movespeed = 0;
  4189. _this.frontjump = new Laya.Vector3;
  4190. _this.leftjump = new Laya.Vector3;
  4191. _this.rightjump = new Laya.Vector3;
  4192. _this.upclimb = 0;
  4193. _this.slideclimb = new Laya.Vector3;
  4194. RoleData.ins = _this;
  4195. return _this;
  4196. }
  4197. Object.defineProperty(RoleData, "Instance", {
  4198. get: function () {
  4199. if (RoleData.ins == null) {
  4200. return new RoleData();
  4201. }
  4202. return RoleData.ins;
  4203. },
  4204. enumerable: true,
  4205. configurable: true
  4206. });
  4207. RoleData.prototype.init = function () {
  4208. var localdatacontrol = LocalDataControl_1.LocalDataControl.Instance;
  4209. // var nowGold:number = Number(PlayerAccount.CurrentAccount.CurAccountData.GetUser(AccountUser.money));
  4210. // this.Gold = nowGold;
  4211. this.Money = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.gold);
  4212. this._roleid = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.roleid);
  4213. if (this.CharacterID == 0) {
  4214. this.CharacterID = 1;
  4215. }
  4216. else {
  4217. this.InitCharacterInfo();
  4218. }
  4219. this._leveid = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.levelid);
  4220. if (this._leveid == 0) {
  4221. this._leveid = 1;
  4222. }
  4223. this.RefreshLevel();
  4224. };
  4225. Object.defineProperty(RoleData.prototype, "nowlevel", {
  4226. get: function () {
  4227. return this._leveid;
  4228. },
  4229. enumerable: true,
  4230. configurable: true
  4231. });
  4232. RoleData.prototype.getNowServerLevel = function () {
  4233. return this._leveid;
  4234. };
  4235. RoleData.prototype.LevelUp = function () {
  4236. this._leveid++;
  4237. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.levelid, this._leveid.toString());
  4238. this.RefreshLevel();
  4239. };
  4240. /*********************************************************** */
  4241. RoleData.prototype.startFun = function () {
  4242. this.mAniPath = "res/spine/spineRes6/alien.sk";
  4243. this.mFactory = new Templet();
  4244. this.mFactory.on(Event.COMPLETE, this, this.parseComplete);
  4245. this.mFactory.on(Event.ERROR, this, this.onError);
  4246. this.mFactory.loadAni(this.mAniPath);
  4247. };
  4248. RoleData.prototype.onError = function () {
  4249. console.log("error");
  4250. };
  4251. RoleData.prototype.parseComplete = function () {
  4252. //创建模式为1,可以启用换装
  4253. this.mArmature = this.mFactory.buildArmature(1);
  4254. this.mArmature.x = this.mStartX;
  4255. this.mArmature.y = this.mStartY;
  4256. this.mArmature.scale(0.5, 0.5);
  4257. Laya.stage.addChild(this.mArmature);
  4258. this.mArmature.on(Event.LABEL, this, this.onEvent);
  4259. this.play();
  4260. };
  4261. /******************************************************************** */
  4262. RoleData.prototype.RefreshLevel = function () {
  4263. var lv = this._leveid;
  4264. var nowcfglv = 0;
  4265. var allnums = LevelCFG_1.default.vec.length;
  4266. if (lv > allnums) {
  4267. var value = (lv - allnums) % (allnums - 2);
  4268. if (value == 0) {
  4269. nowcfglv = allnums;
  4270. }
  4271. else {
  4272. nowcfglv = value + 2;
  4273. }
  4274. }
  4275. else {
  4276. nowcfglv = lv;
  4277. }
  4278. this.levelcfg = LevelCFG_1.default.dict[nowcfglv];
  4279. this.levelmapArr = GameUtils_1.GameUtils.cutstrtoArr(this.levelcfg.road);
  4280. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_levelid);
  4281. };
  4282. RoleData.prototype.play = function () {
  4283. this.mCurrIndex++;
  4284. if (this.mCurrIndex >= this.mArmature.getAnimNum()) {
  4285. this.mCurrIndex = 0;
  4286. }
  4287. this.mArmature.play(this.mCurrIndex, false);
  4288. };
  4289. RoleData.prototype.onEvent = function (e) {
  4290. Laya.stage.addChild(this.mLabelSprite);
  4291. this.mLabelSprite.x = this.mStartX;
  4292. this.mLabelSprite.y = this.mStartY;
  4293. this.mLabelSprite.graphics.clear();
  4294. };
  4295. RoleData.prototype.InitCharacterInfo = function () {
  4296. this.roleCfg = RoleCFG_1.default.dict[this._roleid];
  4297. this.movespeed = this.roleCfg.speed;
  4298. this.frontjump = this.roleCfg.frontjump;
  4299. this.leftjump = this.roleCfg.leftjump;
  4300. this.rightjump = this.roleCfg.rightjump;
  4301. this.upclimb = Number(this.roleCfg.upclimb);
  4302. this.slideclimb = this.roleCfg.slideclimb;
  4303. // this.frontjump.x = Number( this.roleCfg.frontjump.x );
  4304. // this.frontjump.y = Number( this.roleCfg.frontjump.y );
  4305. // this.frontjump.z = Number( this.roleCfg.frontjump.z );
  4306. // this.leftjump.x = Number( this.roleCfg.leftjump.x );
  4307. // this.leftjump.y = Number( this.roleCfg.leftjump.y );
  4308. // this.leftjump.z = Number( this.roleCfg.leftjump.z );
  4309. // this.rightjump.x = Number( this.roleCfg.rightjump.x );
  4310. // this.rightjump.y = Number( this.roleCfg.rightjump.y );
  4311. // this.rightjump.z = Number( this.roleCfg.rightjump.z );
  4312. // this.slideclimb.x = Number( this.roleCfg.slideclimb.x );
  4313. // this.slideclimb.y = Number( this.roleCfg.slideclimb.y );
  4314. // this.slideclimb.z = Number( this.roleCfg.slideclimb.z );
  4315. };
  4316. Object.defineProperty(RoleData.prototype, "LevelID", {
  4317. // public set leveid( value:number )
  4318. // {
  4319. // if( this._leveid != value )
  4320. // {
  4321. // this._leveid = value;
  4322. // this.levelcfg = LevelCFG.dict[ this._leveid ];
  4323. // this.levelmapArr = GameUtils.cutstrtoArr(this.levelcfg.road);
  4324. // CacheManager.getInstance().addstr( UserDataInfo.levelid,this._leveid.toString() );
  4325. // DispatcherManager.dispatchEvent( UserInfoEvent.userinfoEvent_updateroleid );
  4326. // }
  4327. // }
  4328. get: function () {
  4329. return this._leveid;
  4330. },
  4331. enumerable: true,
  4332. configurable: true
  4333. });
  4334. Object.defineProperty(RoleData.prototype, "CharacterID", {
  4335. get: function () {
  4336. return this._roleid;
  4337. },
  4338. set: function (value) {
  4339. if (this._roleid != value) {
  4340. this._roleid = value;
  4341. this.InitCharacterInfo();
  4342. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.roleid, this._roleid.toString());
  4343. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid);
  4344. }
  4345. },
  4346. enumerable: true,
  4347. configurable: true
  4348. });
  4349. Object.defineProperty(RoleData.prototype, "Money", {
  4350. get: function () {
  4351. return this._Gold;
  4352. },
  4353. set: function (value) {
  4354. if (this._Gold != value) {
  4355. this._Gold = value;
  4356. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.gold, this._Gold.toString());
  4357. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.UserInfoEvent_updateUserData);
  4358. }
  4359. },
  4360. enumerable: true,
  4361. configurable: true
  4362. });
  4363. return RoleData;
  4364. }(DataInfoBase_1.DataInfoBase));
  4365. exports.RoleData = RoleData;
  4366. },{"../CFG/LevelCFG":11,"../CFG/RoleCFG":14,"../Control/LocalDataControl":22,"../Data/UserDataInfo":33,"../Data/UserInfoEvent":34,"../utils/DispatcherManager":83,"../utils/GameUtils":85,"./DataInfoBase":29}],32:[function(require,module,exports){
  4367. "use strict";
  4368. Object.defineProperty(exports, "__esModule", { value: true });
  4369. var SkinData = /** @class */ (function () {
  4370. function SkinData() {
  4371. /**
  4372. * 0:未拥有,1:已经拥有
  4373. */
  4374. this.state = 0;
  4375. this.hasnum = 0;
  4376. /************************************ */
  4377. }
  4378. /************************************ */
  4379. SkinData.prototype.createText = function () {
  4380. var txt = new Laya.Text();
  4381. txt.text = "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!";
  4382. txt.width = 300;
  4383. txt.fontSize = 40;
  4384. txt.color = "#ffffff";
  4385. //设置文本为多行文本
  4386. txt.wordWrap = true;
  4387. txt.x = Laya.stage.width - txt.textWidth >> 1;
  4388. txt.y = Laya.stage.height - txt.textHeight >> 1;
  4389. Laya.stage.addChild(txt);
  4390. };
  4391. return SkinData;
  4392. }());
  4393. exports.SkinData = SkinData;
  4394. },{}],33:[function(require,module,exports){
  4395. "use strict";
  4396. Object.defineProperty(exports, "__esModule", { value: true });
  4397. var Event = Laya.Event;
  4398. var UserDataInfo = /** @class */ (function () {
  4399. function UserDataInfo() {
  4400. }
  4401. /******************************* */
  4402. UserDataInfo.prototype.onCallLater = function () {
  4403. console.log("onCallLater triggered");
  4404. var text = new Laya.Text();
  4405. text.font = "SimHei";
  4406. text.fontSize = 30;
  4407. text.color = "#FFFFFF";
  4408. text.text = "打开控制台可见该函数仅触发了一次";
  4409. text.size(Laya.stage.width, Laya.stage.height);
  4410. text.wordWrap = true;
  4411. text.valign = "middle";
  4412. text.align = "center";
  4413. Laya.stage.addChild(text);
  4414. };
  4415. UserDataInfo.prototype.onDecreaseAlpha1 = function (e) {
  4416. //移除鼠标单击事件
  4417. this.button1.off(Event.CLICK, this, this.onDecreaseAlpha1);
  4418. //定时执行一次(间隔时间)
  4419. Laya.timer.once(3000, this, this.onComplete1);
  4420. };
  4421. UserDataInfo.prototype.onDecreaseAlpha2 = function (e) {
  4422. //移除鼠标单击事件
  4423. this.button2.off(Event.CLICK, this, this.onDecreaseAlpha2);
  4424. //定时执行一次(基于帧率)
  4425. Laya.timer.frameOnce(60, this, this.onComplete2);
  4426. };
  4427. UserDataInfo.prototype.onComplete1 = function () {
  4428. //spBtn1的透明度减少0.5
  4429. this.button1.alpha -= 0.5;
  4430. };
  4431. UserDataInfo.prototype.onComplete2 = function () {
  4432. //spBtn2的透明度减少0.5
  4433. this.button2.alpha -= 0.5;
  4434. };
  4435. /******************************************************** */
  4436. /**
  4437. * 记录上次离开时间
  4438. */
  4439. UserDataInfo.lasttime = "lasttime";
  4440. UserDataInfo.caplastflushtime = "captime";
  4441. UserDataInfo.capstorageappids = "capappids";
  4442. UserDataInfo.hasgetappids = "hasgetappids";
  4443. /******************************* */
  4444. /**
  4445. * 角色信息
  4446. */
  4447. UserDataInfo.roleData = "roleData";
  4448. /********************************************************************** */
  4449. UserDataInfo.gold = "gold";
  4450. UserDataInfo.roleid = "roleid";
  4451. UserDataInfo.levelid = "levelid";
  4452. /**
  4453. * 皮肤
  4454. */
  4455. UserDataInfo.skin = "skin";
  4456. UserDataInfo.lastDay = "lastDay";
  4457. UserDataInfo.nowdayShare = "dayshare";
  4458. UserDataInfo.nowdayVideo = "dayvideo";
  4459. return UserDataInfo;
  4460. }());
  4461. exports.UserDataInfo = UserDataInfo;
  4462. },{}],34:[function(require,module,exports){
  4463. "use strict";
  4464. Object.defineProperty(exports, "__esModule", { value: true });
  4465. var UserInfoEvent = /** @class */ (function () {
  4466. function UserInfoEvent() {
  4467. }
  4468. UserInfoEvent.UserInfoEvent_updateUserData = "UserInfoEvent_updateUserData";
  4469. UserInfoEvent.userinfoEvent_updateroleid = "userinfoEvent_updateroleid";
  4470. UserInfoEvent.userinfoEvent_levelid = "userinfoEvent_levelid";
  4471. UserInfoEvent.updatePlayerInfo = "UserInfoEvent_updatePlayerInfo";
  4472. return UserInfoEvent;
  4473. }());
  4474. exports.UserInfoEvent = UserInfoEvent;
  4475. },{}],35:[function(require,module,exports){
  4476. "use strict";
  4477. Object.defineProperty(exports, "__esModule", { value: true });
  4478. var Global_1 = require("./Global");
  4479. var PanelResDic_1 = require("./PrefabControl/PanelResDic");
  4480. var DispatcherManager_1 = require("./utils/DispatcherManager");
  4481. var ComponentEventData_1 = require("./Data/ComponentEventData");
  4482. var RecConfigs_1 = require("./Config/RecConfigs");
  4483. var TimesTamper_1 = require("./Time/TimesTamper");
  4484. var AssetPath_1 = require("./Config/AssetPath");
  4485. var TimerService_1 = require("./Time/TimerService");
  4486. var GlobalWaiting_1 = require("./GlobalWaiting");
  4487. var PanelBaseControl_1 = require("./Control/PanelBaseControl");
  4488. var GamePool_1 = require("./PrefabControl/GamePool");
  4489. var LayoutControl_1 = require("./Control/LayoutControl");
  4490. var ViewManager_1 = require("./View/ViewManager");
  4491. var ResourceControl_1 = require("./Control/ResourceControl");
  4492. var ResDataControl_1 = require("./Control/ResDataControl");
  4493. var AudioControl_1 = require("./Control/AudioControl");
  4494. var ConnectControl_1 = require("./Control/ConnectControl");
  4495. var pingtaiutils_1 = require("./WXSDK/pingtaiutils");
  4496. var AgencyLogin_1 = require("./Agency/AgencyLogin");
  4497. var AgencyUserMessage_1 = require("./Agency/AgencyUserMessage");
  4498. var AgencyMain_1 = require("./Agency/AgencyMain");
  4499. var AgencyInGame_1 = require("./Agency/AgencyInGame");
  4500. var AgencySkin_1 = require("./Agency/AgencySkin");
  4501. var AgencyTrial_1 = require("./Agency/AgencyTrial");
  4502. var AgencyLottery_1 = require("./Agency/AgencyLottery");
  4503. /*
  4504. * name;
  4505. */
  4506. var GameContents = /** @class */ (function (_super) {
  4507. __extends(GameContents, _super);
  4508. function GameContents() {
  4509. return _super.call(this) || this;
  4510. }
  4511. /**
  4512. * 初始化游戏
  4513. */
  4514. GameContents.prototype.initGame = function () {
  4515. RecConfigs_1.RecConfigs.Instance.init();
  4516. DispatcherManager_1.DispatcherManager.init();
  4517. TimerService_1.TimerService.Instance.init();
  4518. LayoutControl_1.LayoutControl.Instance.initlayer();
  4519. ViewManager_1.ViewManager.Instance.init();
  4520. ResourceControl_1.ResourceControl.Instance.init();
  4521. ResDataControl_1.ResDataControl.Instance.init();
  4522. AudioControl_1.AudioControl.Instance.init();
  4523. ConnectControl_1.ConnectControl.Connnect();
  4524. TimesTamper_1.TimesTamper.Instance.init();
  4525. pingtaiutils_1.pingtaiutils.Instance.init();
  4526. this.initPoolObject();
  4527. this.initProxy();
  4528. this.initmapView();
  4529. this.beginLoadHandler();
  4530. };
  4531. /**
  4532. * 初始化对象池
  4533. */
  4534. GameContents.prototype.initPoolObject = function () {
  4535. GamePool_1.GamePool.Mark(ComponentEventData_1.ComponentEventData.ResDicValue, ComponentEventData_1.ComponentEventData);
  4536. };
  4537. /**
  4538. * 初始化模块代理类
  4539. */
  4540. GameContents.prototype.initProxy = function () {
  4541. var mvcpool = PanelResDic_1.PanelResDic.Instance;
  4542. mvcpool.AgencyAdd(AgencyLogin_1.AgencyLogin);
  4543. mvcpool.AgencyAdd(AgencyUserMessage_1.AgencyUserMessage);
  4544. mvcpool.AgencyAdd(AgencyMain_1.AgencyMain);
  4545. mvcpool.AgencyAdd(AgencyInGame_1.AgencyInGame);
  4546. mvcpool.AgencyAdd(AgencySkin_1.AgencySkin);
  4547. mvcpool.AgencyAdd(AgencyTrial_1.AgencyTrial);
  4548. mvcpool.AgencyAdd(AgencyLottery_1.AgencyLottery);
  4549. };
  4550. GameContents.prototype.initmapView = function () {
  4551. var mvcpool = PanelResDic_1.PanelResDic.Instance;
  4552. // mvcpool.mapView( MapViewType.DailyrewardView,DailyrewardView );
  4553. };
  4554. GameContents.prototype.beginLoadHandler = function () {
  4555. var patharr = [];
  4556. patharr.push({ url: AssetPath_1.AssetPath.getResConfig(), type: Laya.Loader.JSON });
  4557. patharr.push({ url: AssetPath_1.AssetPath.getGameVersion(), type: Laya.Loader.JSON });
  4558. ResourceControl_1.ResourceControl.Instance.Loaders(patharr, this, this.recloadComplete);
  4559. };
  4560. GameContents.prototype.recloadComplete = function () {
  4561. var gameversion = ResDataControl_1.ResDataControl.Instance.GainResources(AssetPath_1.AssetPath.getGameVersion(), false);
  4562. if (gameversion) {
  4563. Global_1.Global.gameVersion = gameversion.version;
  4564. }
  4565. else {
  4566. Global_1.Global.gameVersion = "1.0.0";
  4567. }
  4568. var configres = ResDataControl_1.ResDataControl.Instance.GainResources(AssetPath_1.AssetPath.getResConfig(), false);
  4569. RecConfigs_1.RecConfigs.Instance.initRec(configres);
  4570. ResourceControl_1.ResourceControl.Instance.loadGroup("loading", this, this.onPreLoaded, this.onPreprogress);
  4571. };
  4572. GameContents.prototype.onPreprogress = function (value) {
  4573. };
  4574. GameContents.prototype.onPreLoaded = function () {
  4575. ResDataControl_1.ResDataControl.Instance.AddViewPackByName("loading", true, false);
  4576. var globalwaiturl = fairygui.UIPackage.getItemURL("loading", "globalWaiting");
  4577. PanelBaseControl_1.PanelBaseControl.viewbgUrl = fairygui.UIPackage.getItemURL("loading", "img_black");
  4578. fairygui.UIObjectFactory.setPackageItemExtension(globalwaiturl, GlobalWaiting_1.GlobalWaiting);
  4579. fairygui.UIConfig.globalModalWaiting = globalwaiturl;
  4580. fairygui.UIConfig.windowModalWaiting = globalwaiturl;
  4581. // CPAUtils.init();
  4582. this.Login();
  4583. };
  4584. GameContents.prototype.Login = function () {
  4585. PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyLogin_1.AgencyLogin).Login();
  4586. };
  4587. return GameContents;
  4588. }(Laya.EventDispatcher));
  4589. exports.GameContents = GameContents;
  4590. },{"./Agency/AgencyInGame":2,"./Agency/AgencyLogin":3,"./Agency/AgencyLottery":4,"./Agency/AgencyMain":5,"./Agency/AgencySkin":6,"./Agency/AgencyTrial":7,"./Agency/AgencyUserMessage":8,"./Config/AssetPath":15,"./Config/RecConfigs":16,"./Control/AudioControl":17,"./Control/ConnectControl":18,"./Control/LayoutControl":21,"./Control/PanelBaseControl":23,"./Control/ResDataControl":25,"./Control/ResourceControl":26,"./Data/ComponentEventData":28,"./Global":39,"./GlobalWaiting":40,"./PrefabControl/GamePool":45,"./PrefabControl/PanelResDic":46,"./Time/TimerService":57,"./Time/TimesTamper":58,"./View/ViewManager":68,"./WXSDK/pingtaiutils":80,"./utils/DispatcherManager":83}],36:[function(require,module,exports){
  4591. "use strict";
  4592. Object.defineProperty(exports, "__esModule", { value: true });
  4593. var PropManager_1 = require("../PrefabControl/PropManager");
  4594. var GameUtils_1 = require("../utils/GameUtils");
  4595. var GameCFG_1 = require("../CFG/GameCFG");
  4596. var Sprite = Laya.Sprite;
  4597. var TiledMap = Laya.TiledMap;
  4598. var Point = Laya.Point;
  4599. var Rectangle = Laya.Rectangle;
  4600. var Handler = Laya.Handler;
  4601. var CameraManager = /** @class */ (function (_super) {
  4602. __extends(CameraManager, _super);
  4603. function CameraManager() {
  4604. var _this = _super.call(this) || this;
  4605. _this.iscanfollow = false;
  4606. /***************************************************************** */
  4607. _this._upvec = new Laya.Vector3(0, 1, 0);
  4608. _this._index = 0;
  4609. _this._slerpValue = 8;
  4610. _this._lookatVec = new Laya.Vector3;
  4611. return _this;
  4612. }
  4613. CameraManager.prototype.onAwake = function () {
  4614. //获取脚本所属对象
  4615. this.camera = this.owner;
  4616. this._toVec = new Laya.Vector3();
  4617. this.camera.fieldOfView = 90;
  4618. };
  4619. CameraManager.prototype.onStart = function () {
  4620. this._transform = this.camera.transform;
  4621. //旋转摄像机角度
  4622. this._transform.rotate(new Laya.Vector3(0, 0, 0), true, false);
  4623. // this.camera.clearColor = null;
  4624. };
  4625. CameraManager.prototype.createMap = function () {
  4626. this.tiledMap = new TiledMap();
  4627. this.tiledMap.createMap("res/tiledMap/isometric_grass_and_water.json", new Rectangle(0, 0, Laya.stage.width, Laya.stage.height), Handler.create(this, this.mapLoaded), null, new Point(1600, 800));
  4628. };
  4629. CameraManager.prototype.onStageClick = function () {
  4630. var p = new Point(0, 0);
  4631. this.layer.getTilePositionByScreenPos(Laya.stage.mouseX, Laya.stage.mouseY, p);
  4632. this.layer.getScreenPositionByTilePos(Math.floor(p.x), Math.floor(p.y), p);
  4633. this.sprite.pos(p.x, p.y);
  4634. };
  4635. CameraManager.prototype.mapLoaded = function () {
  4636. this.layer = this.tiledMap.getLayerByIndex(0);
  4637. var radiusX = 32;
  4638. var radiusY = Math.tan(180 / Math.PI * 30) * radiusX;
  4639. var color = "#FF7F50";
  4640. this.sprite = new Sprite();
  4641. this.sprite.graphics.drawLine(0, 0, -radiusX, radiusY, color);
  4642. this.sprite.graphics.drawLine(0, 0, radiusX, radiusY, color);
  4643. this.sprite.graphics.drawLine(-radiusX, radiusY, 0, radiusY * 2, color);
  4644. this.sprite.graphics.drawLine(radiusX, radiusY, 0, radiusY * 2, color);
  4645. Laya.stage.addChild(this.sprite);
  4646. };
  4647. CameraManager.prototype.onUpdate = function () {
  4648. if (this.iscanfollow) {
  4649. if (PropManager_1.PropManager.iscarmanpc) {
  4650. if (PropManager_1.PropManager.npcDict["npc_0"]) {
  4651. Laya.Vector3.add(PropManager_1.PropManager.npcDict["npc_0"].transform.position, this._disVector, this._toVec);
  4652. this._transform.position = this._toVec;
  4653. this._transform.position.x = PropManager_1.PropManager.npcDict["npc_0"].transform.position.x;
  4654. this._transform.lookAt(PropManager_1.PropManager.npcDict["npc_0"].transform.position, this._upvec);
  4655. }
  4656. }
  4657. else {
  4658. if (PropManager_1.PropManager.mainRole) {
  4659. Laya.Vector3.add(PropManager_1.PropManager.mainRole.transform.position, this._disVector, this._toVec);
  4660. // this._toVec.x = PropManager.mainRole.transform.position.x;
  4661. // this._transform.position = this._toVec;
  4662. // this._transform.lookAt( PropManager.mainRole.transform.position,this._upvec );
  4663. Laya.Vector3.lerp(this._transform.position, this._toVec, 16 / 1000 * this._slerpValue, this._toVec);
  4664. // this._toVec.z = PropManager.mainRole.transform.position.z+this._disVector.z;
  4665. // this._toVec.y = PropManager.mainRole.transform.position.y + this._disVector.y;
  4666. this._transform.position = this._toVec;
  4667. this._lookatVec.x = this._toVec.x;
  4668. this._lookatVec.y = PropManager_1.PropManager.mainRole.transform.position.y;
  4669. this._lookatVec.z = PropManager_1.PropManager.mainRole.transform.position.z;
  4670. this._transform.lookAt(this._lookatVec, this._upvec);
  4671. }
  4672. }
  4673. }
  4674. };
  4675. CameraManager.prototype.GameEndRotate = function (targetPos, speed) {
  4676. this.iscanfollow = false;
  4677. this._transform.translate(speed, false);
  4678. this._transform.lookAt(targetPos, this._upvec);
  4679. };
  4680. CameraManager.prototype.SetCameraPosition = function (vec) {
  4681. var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[1].value);
  4682. this._disVector = new Laya.Vector3(Number(valueArr[0]), Number(valueArr[1]), Number(valueArr[2]));
  4683. Laya.Vector3.add(vec, this._disVector, this._toVec);
  4684. this.camera.transform.position = this._toVec;
  4685. this.camera.transform.position.x = vec.x;
  4686. // this.camera.transform.lookAt( vec,new Laya.Vector3( 0,1,0 ) );
  4687. };
  4688. return CameraManager;
  4689. }(Laya.Script3D));
  4690. exports.CameraManager = CameraManager;
  4691. },{"../CFG/GameCFG":10,"../PrefabControl/PropManager":47,"../utils/GameUtils":85}],37:[function(require,module,exports){
  4692. "use strict";
  4693. Object.defineProperty(exports, "__esModule", { value: true });
  4694. var TimerService_1 = require("../Time/TimerService");
  4695. var PropManager_1 = require("../PrefabControl/PropManager");
  4696. var CharacterState_1 = require("../PrefabControl/CharacterState");
  4697. var BuildCFG_1 = require("../CFG/BuildCFG");
  4698. var CameraManager_1 = require("./CameraManager");
  4699. var DispatcherManager_1 = require("../utils/DispatcherManager");
  4700. var GameState_1 = require("../utils/GameState");
  4701. var GameUtils_1 = require("../utils/GameUtils");
  4702. var NpcScript = /** @class */ (function (_super) {
  4703. __extends(NpcScript, _super);
  4704. function NpcScript() {
  4705. var _this = _super.call(this) || this;
  4706. _this._nowAction = "";
  4707. _this.resouseName = "";
  4708. _this._shangpaVec = new Laya.Vector3;
  4709. /**是否发生碰撞 */
  4710. _this.haveCollision = false;
  4711. _this._TargetCollision = "";
  4712. _this._normalizeVec = new Laya.Vector3;
  4713. _this.staybuild = "";
  4714. _this.stayscene = "";
  4715. /**
  4716. * 0:未锁,1:锁左边,2:锁右边
  4717. */
  4718. _this._lockxstate = 0;
  4719. /**
  4720. * 状态,0:等待状态,1:开始状态,2:完成状态
  4721. */
  4722. _this._nowRoleState = 0;
  4723. _this.movespeed = 0;
  4724. _this.frontjumpspeed = new Laya.Vector3;
  4725. _this.leftjumpspeed = new Laya.Vector3;
  4726. _this.rightjumpspeed = new Laya.Vector3;
  4727. _this.climbspeed = 0;
  4728. _this.sideclimbspeed = new Laya.Vector3;
  4729. _this._lockbyBuildname = "";
  4730. /**
  4731. * 0:未被锁,1:锁定左边,2:锁定右边,
  4732. */
  4733. _this._lockstate = 0;
  4734. _this.LastAction = "";
  4735. _this._moveTime = 0;
  4736. _this._chixuTime = 0;
  4737. _this._isActionNums = false;
  4738. _this._isneedactionnum = 0;
  4739. _this._needactiontime = 0;
  4740. _this._moveVec = new Laya.Vector3;
  4741. _this.jumpSpeed = new Laya.Vector3;
  4742. _this.jumpHight = 0;
  4743. _this._disy = 0;
  4744. _this.Gravity_g = 10; //重力加速度
  4745. _this._checktime = 0;
  4746. _this._ending = false;
  4747. _this._endAnmoSpeed = new Laya.Vector3();
  4748. _this._endanmotime = 1;
  4749. _this._endAnmoSpeed1 = new Laya.Vector3;
  4750. _this._changeMoveX = 0;
  4751. _this.HaveForceJump = false;
  4752. _this.quaternion = new Laya.Quaternion;
  4753. return _this;
  4754. }
  4755. NpcScript.prototype.onAwake = function () {
  4756. this._animator = this.owner.getComponent(Laya.Animator);
  4757. PropManager_1.PropManager.setAnimator(this._animator);
  4758. };
  4759. NpcScript.prototype.onStart = function () {
  4760. this._speedMoveV3 = new Laya.Vector3(0, 0, 0);
  4761. this._transform = this.owner.transform;
  4762. var sp = this.owner;
  4763. sp.getChildByName("lefttrail").active = false;
  4764. sp.getChildByName("righttrail").active = false;
  4765. };
  4766. NpcScript.prototype.startRun = function () {
  4767. if (this._nowNpcinfo.gravity) {
  4768. this.Gravity_g = this._nowNpcinfo.gravity;
  4769. }
  4770. else {
  4771. this.Gravity_g = 10;
  4772. }
  4773. this._checktime = 500;
  4774. this._nowRoleState = 1;
  4775. this._ending = false;
  4776. this._changeMoveX = 0;
  4777. this._initPosVec = this._transform.position.clone();
  4778. this.staybuild = "";
  4779. this.stayscene = "";
  4780. this._nowAction = CharacterState_1.CharacterState.stand;
  4781. this.nowAction = CharacterState_1.CharacterState.run;
  4782. this._speedMoveV3.x = 0;
  4783. this._speedMoveV3.y = 0;
  4784. this._speedMoveV3.z = -this.movespeed;
  4785. this._iscanMove = true;
  4786. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  4787. };
  4788. NpcScript.prototype.npcinfo = function (cfg) {
  4789. this._nowNpcinfo = cfg;
  4790. this.movespeed = this._nowNpcinfo.speed;
  4791. this.climbspeed = Number(this._nowNpcinfo.upclimb);
  4792. this.frontjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.frontjump.x), Number(this._nowNpcinfo.frontjump.y), Number(this._nowNpcinfo.frontjump.z));
  4793. this.leftjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.leftjump.x), Number(this._nowNpcinfo.leftjump.y), Number(this._nowNpcinfo.leftjump.z));
  4794. this.rightjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.rightjump.x), Number(this._nowNpcinfo.rightjump.y), Number(this._nowNpcinfo.rightjump.z));
  4795. this.sideclimbspeed = new Laya.Vector3(Number(this._nowNpcinfo.slideclimb.x), Number(this._nowNpcinfo.slideclimb.y), Number(this._nowNpcinfo.slideclimb.z));
  4796. // this.frontjump.x = Number( this._nowNpcinfo.frontjump.x );
  4797. // this.frontjump.y = Number( this._nowNpcinfo.frontjump.y );
  4798. // this.frontjump.z = Number( this._nowNpcinfo.frontjump.z );
  4799. // this.leftjump.x = Number( this._nowNpcinfo.leftjump.x );
  4800. // this.leftjump.y = Number( this._nowNpcinfo.leftjump.y );
  4801. // this.leftjump.z = Number( this._nowNpcinfo.leftjump.z );
  4802. // this.rightjump.x = Number( this._nowNpcinfo.rightjump.x );
  4803. // this.rightjump.y = Number( this._nowNpcinfo.rightjump.y );
  4804. // this.rightjump.z = Number( this._nowNpcinfo.rightjump.z );
  4805. // this.upclimb = Number( this._nowNpcinfo.upclimb );
  4806. // this.slideclimb.x = Number( this._nowNpcinfo.slideclimb.x );
  4807. // this.slideclimb.y = Number( this._nowNpcinfo.slideclimb.y );
  4808. // this.slideclimb.z = Number( this._nowNpcinfo.slideclimb.z );
  4809. };
  4810. /**
  4811. * 开始碰撞时执行
  4812. */
  4813. NpcScript.prototype.onCollisionEnter = function (collision) {
  4814. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  4815. var contactPoint = collision.contacts[0];
  4816. this.Calculate(contactPoint.normal, collision.other.owner);
  4817. }
  4818. };
  4819. NpcScript.prototype.setnowSelectVec = function (pos) {
  4820. this._nowselectVec = pos;
  4821. };
  4822. NpcScript.prototype.Calculate = function (normal, target) {
  4823. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) {
  4824. return;
  4825. }
  4826. this._TargetCollision = target.name;
  4827. var n = new Laya.Vector3;
  4828. Laya.Vector3.normalize(normal, this._normalizeVec);
  4829. if (this._TargetCollision.indexOf("build") != -1 || this._TargetCollision.indexOf("Scaffolding") != -1 ||
  4830. this._TargetCollision.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  4831. {
  4832. if (this._TargetCollision.indexOf("build") != -1) {
  4833. this.staybuild = this._TargetCollision;
  4834. this.stayscene = target.parent.parent.name;
  4835. }
  4836. if (this._TargetCollision.indexOf("irongauze") != -1) {
  4837. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  4838. }
  4839. else {
  4840. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._TargetCollision);
  4841. }
  4842. if (this._normalizeVec.z == -1) //上爬
  4843. {
  4844. if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.1)) {
  4845. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  4846. this.nowAction = CharacterState_1.CharacterState.run;
  4847. }
  4848. else {
  4849. this.nowAction = CharacterState_1.CharacterState.climbup;
  4850. this._shangpaVec = this._nowselectVec.clone();
  4851. }
  4852. }
  4853. else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) {
  4854. this.nowAction = CharacterState_1.CharacterState.run;
  4855. }
  4856. else if (this._normalizeVec.x == -1) {
  4857. if (this.nowAction == CharacterState_1.CharacterState.run) {
  4858. this._lockxstate = 1;
  4859. }
  4860. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  4861. this._lockxstate = 1;
  4862. }
  4863. else {
  4864. this.nowAction = CharacterState_1.CharacterState.climbleft;
  4865. }
  4866. }
  4867. else if (this._normalizeVec.x == 1) {
  4868. if (this.nowAction == CharacterState_1.CharacterState.run) {
  4869. this._lockxstate = 2;
  4870. }
  4871. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  4872. this._lockxstate = 2;
  4873. }
  4874. else {
  4875. this.nowAction = CharacterState_1.CharacterState.climbright;
  4876. }
  4877. }
  4878. else {
  4879. if (this._normalizeVec.z != 1) {
  4880. this.nowAction = CharacterState_1.CharacterState.climbupblock;
  4881. this._shangpaVec = this._nowselectVec.clone();
  4882. }
  4883. }
  4884. }
  4885. else if (this._TargetCollision.indexOf("panel_jump") != -1) //加速板跳跃
  4886. {
  4887. this.nowAction = CharacterState_1.CharacterState.speedupjump;
  4888. // this.setJump( this.nowAction );
  4889. }
  4890. else if (this._TargetCollision.indexOf("panel_downslip") != -1) {
  4891. this.nowAction = CharacterState_1.CharacterState.downmove;
  4892. // this.setJump( this.nowAction );
  4893. }
  4894. else if (this._TargetCollision.indexOf("box_Board") != -1 && this.nowAction != CharacterState_1.CharacterState.downmove) {
  4895. if (this._normalizeVec.z == -1) //上爬
  4896. {
  4897. this.nowAction = CharacterState_1.CharacterState.climbup;
  4898. this._shangpaVec = this._nowselectVec.clone();
  4899. }
  4900. }
  4901. else if (this._TargetCollision.indexOf("box_sidejump") != -1) {
  4902. this.nowAction = CharacterState_1.CharacterState.sidespeedup;
  4903. // this.setJump( this.nowAction );
  4904. }
  4905. else if (this._TargetCollision.indexOf("box_Surmount") != -1) {
  4906. this.nowAction = CharacterState_1.CharacterState.cross;
  4907. // this.setJump( this.nowAction );
  4908. }
  4909. else if (this._TargetCollision.indexOf("irongauze") != -1) {
  4910. this.nowAction = CharacterState_1.CharacterState.climbup;
  4911. this._shangpaVec = this._nowselectVec.clone();
  4912. }
  4913. };
  4914. /**
  4915. * 持续碰撞时执行
  4916. */
  4917. NpcScript.prototype.onCollisionStay = function (collision) {
  4918. // Debuger.log( "碰撞中" );
  4919. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  4920. this.haveCollision = true;
  4921. var contactPoint = collision.contacts[0];
  4922. var target = collision.other.owner;
  4923. var targetname = target.name;
  4924. if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1 && targetname.indexOf("role") == -1) {
  4925. this._TargetCollision = targetname;
  4926. }
  4927. if (this._TargetCollision.indexOf("build") != -1 || this._TargetCollision.indexOf("Scaffolding") != -1 ||
  4928. this._TargetCollision.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  4929. {
  4930. if (this._TargetCollision.indexOf("build") != -1) {
  4931. this.staybuild = this._TargetCollision;
  4932. this.stayscene = target.parent.parent.name;
  4933. }
  4934. if (this._TargetCollision.indexOf("irongauze") != -1) {
  4935. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  4936. }
  4937. else {
  4938. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._TargetCollision);
  4939. }
  4940. }
  4941. }
  4942. };
  4943. /**
  4944. * 结束碰撞时执行
  4945. */
  4946. NpcScript.prototype.onCollisionExit = function (collision) {
  4947. this.haveCollision = false;
  4948. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  4949. var contactPoint = collision.contacts[0];
  4950. this.CheckEnd(contactPoint.normal, collision.other.owner);
  4951. }
  4952. };
  4953. NpcScript.prototype.CheckEnd = function (normal, target) {
  4954. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) {
  4955. return;
  4956. }
  4957. if (this.HaveForceJump) {
  4958. this.HaveForceJump = false;
  4959. return;
  4960. }
  4961. if (this._lockxstate) {
  4962. this._lockxstate = 0;
  4963. return;
  4964. }
  4965. if (this._TargetCollision != target.name) {
  4966. return;
  4967. }
  4968. if (target.name.indexOf("panel_jump") != -1) {
  4969. return;
  4970. }
  4971. switch (this.nowAction) {
  4972. case CharacterState_1.CharacterState.climbup:
  4973. case CharacterState_1.CharacterState.climbupblock:
  4974. if (this._TargetCollision.indexOf("box_Board") != -1) {
  4975. this.JumpAction(this._changeMoveX);
  4976. }
  4977. else {
  4978. if (this._changeMoveX > 0) {
  4979. this.nowAction = CharacterState_1.CharacterState.jumpright;
  4980. }
  4981. else if (this._changeMoveX < 0) {
  4982. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  4983. }
  4984. }
  4985. break;
  4986. case CharacterState_1.CharacterState.climbright:
  4987. case CharacterState_1.CharacterState.climbleft:
  4988. this.JumpAction(this._changeMoveX);
  4989. break;
  4990. case CharacterState_1.CharacterState.run:
  4991. this.JumpAction(this._changeMoveX);
  4992. break;
  4993. case CharacterState_1.CharacterState.MoveX:
  4994. this.JumpAction(this._speedMoveV3.x);
  4995. break;
  4996. }
  4997. };
  4998. NpcScript.prototype.JumpAction = function (value, isquanzhong) {
  4999. if (isquanzhong === void 0) { isquanzhong = false; }
  5000. if (value > 0) {
  5001. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5002. }
  5003. else if (value < 0) {
  5004. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5005. }
  5006. else {
  5007. if (isquanzhong) {
  5008. if (this._TargetCollision.indexOf("build") != -1) {
  5009. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  5010. var allvalue = 0;
  5011. var sort;
  5012. var selectdir = "";
  5013. if (this._TargetCollision.indexOf("leftright") != -1) {
  5014. allvalue = this._nowNpcinfo.jump_left + this._nowNpcinfo.jump_right;
  5015. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5016. if (sort <= this._nowNpcinfo.jump_left) {
  5017. selectdir = "left";
  5018. }
  5019. else {
  5020. selectdir = "right";
  5021. }
  5022. }
  5023. else if (this._TargetCollision.indexOf("frontright") != -1) {
  5024. allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_right;
  5025. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5026. if (sort <= this._nowNpcinfo.start_ahead) {
  5027. selectdir = "front";
  5028. }
  5029. else {
  5030. selectdir = "right";
  5031. }
  5032. }
  5033. else if (this._TargetCollision.indexOf("frontleft") != -1) {
  5034. allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left;
  5035. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5036. if (sort <= this._nowNpcinfo.start_ahead) {
  5037. selectdir = "front";
  5038. }
  5039. else {
  5040. selectdir = "left";
  5041. }
  5042. }
  5043. else if (this._TargetCollision.indexOf("right") != -1) {
  5044. selectdir = "right";
  5045. }
  5046. else if (this._TargetCollision.indexOf("left") != -1) {
  5047. selectdir = "left";
  5048. }
  5049. else if (this._TargetCollision.indexOf("front") != -1) {
  5050. selectdir = "front";
  5051. }
  5052. else {
  5053. allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left + this._nowNpcinfo.jump_right;
  5054. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5055. if (sort <= this._nowNpcinfo.start_ahead) {
  5056. selectdir = "front";
  5057. }
  5058. else if (sort <= this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left) {
  5059. selectdir = "left";
  5060. }
  5061. else {
  5062. selectdir = "right";
  5063. }
  5064. }
  5065. switch (selectdir) {
  5066. case "left":
  5067. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5068. break;
  5069. case "right":
  5070. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5071. break;
  5072. case "front":
  5073. this.nowAction = CharacterState_1.CharacterState.jump;
  5074. break;
  5075. default:
  5076. this.nowAction = CharacterState_1.CharacterState.jump;
  5077. break;
  5078. }
  5079. }
  5080. else {
  5081. this.nowAction = CharacterState_1.CharacterState.jump;
  5082. }
  5083. }
  5084. else {
  5085. this.nowAction = CharacterState_1.CharacterState.jump;
  5086. }
  5087. }
  5088. };
  5089. Object.defineProperty(NpcScript.prototype, "nowAction", {
  5090. get: function () {
  5091. return this._nowAction;
  5092. },
  5093. set: function (value) {
  5094. if (this._nowRoleState == 1) {
  5095. if (this._nowAction != value || this.LastAction == CharacterState_1.CharacterState.speedupjump || this.LastAction == CharacterState_1.CharacterState.jumpright) {
  5096. this.LastAction = this._nowAction;
  5097. this._nowAction = value;
  5098. this._moveTime = 0;
  5099. switch (this._nowAction) {
  5100. case CharacterState_1.CharacterState.stand:
  5101. this._isActionNums = false;
  5102. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  5103. break;
  5104. case CharacterState_1.CharacterState.run:
  5105. if (this.LastAction == CharacterState_1.CharacterState.jump || this.LastAction == CharacterState_1.CharacterState.jumpleft || this.LastAction == CharacterState_1.CharacterState.jumpright) {
  5106. this._isActionNums = true;
  5107. this._isneedactionnum = 1;
  5108. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  5109. if (sort < 50) {
  5110. this.PlayAnimator(CharacterState_1.CharacterState.land1);
  5111. }
  5112. else {
  5113. this.PlayAnimator(CharacterState_1.CharacterState.land2);
  5114. }
  5115. }
  5116. else {
  5117. this._isActionNums = false;
  5118. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5119. }
  5120. break;
  5121. case CharacterState_1.CharacterState.jump:
  5122. this.PlayAnimator(CharacterState_1.CharacterState.jump);
  5123. this._isActionNums = true;
  5124. this._isneedactionnum = 1;
  5125. this.jumpSpeed.x = this.frontjumpspeed.x;
  5126. this.jumpSpeed.y = this.frontjumpspeed.y;
  5127. this.jumpSpeed.z = this.frontjumpspeed.z;
  5128. break;
  5129. case CharacterState_1.CharacterState.jumpleft:
  5130. this.jumpSpeed = this.leftjumpspeed;
  5131. // this.jumpSpeed.x = this.leftjumpspeed.x;
  5132. // this.jumpSpeed.y = this.leftjumpspeed.y;
  5133. // this.jumpSpeed.z = this.leftjumpspeed.z;
  5134. this._isActionNums = true;
  5135. this._isneedactionnum = 1;
  5136. this.PlayAnimator(CharacterState_1.CharacterState.leftjump);
  5137. break;
  5138. case CharacterState_1.CharacterState.jumpright:
  5139. this.jumpSpeed = this.rightjumpspeed;
  5140. // this.jumpSpeed.x = this.rightjumpspeed.x;
  5141. // this.jumpSpeed.y = this.rightjumpspeed.y;
  5142. // this.jumpSpeed.z = this.rightjumpspeed.z;
  5143. this._isActionNums = true;
  5144. this._isneedactionnum = 1;
  5145. this.PlayAnimator(CharacterState_1.CharacterState.rightjump);
  5146. break;
  5147. case CharacterState_1.CharacterState.speedupjump:
  5148. var buildcfg = BuildCFG_1.default.dict["panel_jump"];
  5149. this.jumpSpeed.x = buildcfg.buffx;
  5150. this.jumpSpeed.y = buildcfg.buffy;
  5151. if (this.LastAction == CharacterState_1.CharacterState.speedupjump) {
  5152. this.jumpSpeed.z = this.jumpSpeed.z * buildcfg.buffz;
  5153. }
  5154. else {
  5155. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  5156. }
  5157. this._isActionNums = true;
  5158. this._isneedactionnum = 1;
  5159. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  5160. if (sort < 50) {
  5161. this.PlayAnimator(CharacterState_1.CharacterState.highjump1);
  5162. }
  5163. else {
  5164. this.PlayAnimator(CharacterState_1.CharacterState.highjump2);
  5165. }
  5166. break;
  5167. case CharacterState_1.CharacterState.downmove:
  5168. var buildcfg = BuildCFG_1.default.dict["panel_downslip"];
  5169. this.jumpSpeed.x = buildcfg.buffx;
  5170. this.jumpSpeed.y = buildcfg.buffy;
  5171. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  5172. this._chixuTime = buildcfg.time;
  5173. this._isActionNums = true;
  5174. this._isneedactionnum = 1;
  5175. this.PlayAnimator(CharacterState_1.CharacterState.huachan);
  5176. break;
  5177. case CharacterState_1.CharacterState.cross:
  5178. var buildcfg = BuildCFG_1.default.dict["box_Surmount"];
  5179. this.jumpSpeed.x = buildcfg.buffx;
  5180. this.jumpSpeed.y = buildcfg.buffy + 0.5;
  5181. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  5182. this._chixuTime = buildcfg.time;
  5183. this._isActionNums = true;
  5184. this._isneedactionnum = 1;
  5185. this.PlayAnimator(CharacterState_1.CharacterState.hurdle);
  5186. break;
  5187. case CharacterState_1.CharacterState.climbup:
  5188. case CharacterState_1.CharacterState.climbupblock:
  5189. this.jumpSpeed.x = 0;
  5190. this.jumpSpeed.y = this.climbspeed;
  5191. this.jumpSpeed.z = 0;
  5192. this._isActionNums = false;
  5193. this.PlayAnimator(CharacterState_1.CharacterState.climbwall);
  5194. break;
  5195. case CharacterState_1.CharacterState.climbleft:
  5196. this.jumpSpeed = new Laya.Vector3(0, this.sideclimbspeed.y, this.sideclimbspeed.z);
  5197. // this.jumpSpeed.x = 0;
  5198. // this.jumpSpeed.y = this.sideclimbspeed.y;
  5199. // this.jumpSpeed.z = this.sideclimbspeed.z;
  5200. this._isActionNums = false;
  5201. this.PlayAnimator(CharacterState_1.CharacterState.runwallleft);
  5202. break;
  5203. case CharacterState_1.CharacterState.climbright:
  5204. this.jumpSpeed = new Laya.Vector3(0, this.sideclimbspeed.y, this.sideclimbspeed.z);
  5205. // this.jumpSpeed.x = 0;
  5206. // this.jumpSpeed.y = this.sideclimbspeed.y;
  5207. // this.jumpSpeed.z = this.sideclimbspeed.z;
  5208. this._isActionNums = false;
  5209. this.PlayAnimator(CharacterState_1.CharacterState.runwallright);
  5210. break;
  5211. case CharacterState_1.CharacterState.ClimbMotion:
  5212. this._isActionNums = true;
  5213. this._isneedactionnum = 0;
  5214. this._needactiontime = 0.3;
  5215. this._moveTime = 0;
  5216. this.PlayAnimator(CharacterState_1.CharacterState.climbend);
  5217. break;
  5218. }
  5219. }
  5220. }
  5221. },
  5222. enumerable: true,
  5223. configurable: true
  5224. });
  5225. NpcScript.prototype.update = function (dt) {
  5226. if (this._nowRoleState == 1) {
  5227. dt = 16;
  5228. this._checktime += dt;
  5229. if (PropManager_1.PropManager.iscarmanpc) {
  5230. }
  5231. else {
  5232. if (this._checktime >= 500) {
  5233. this._checktime = 0;
  5234. if (this._nowNpcinfo && PropManager_1.PropManager.mainRole) {
  5235. if (this._transform.position.z + this._nowNpcinfo.distance < PropManager_1.PropManager.mainRole.transform.position.z) {
  5236. this._iscanMove = false;
  5237. }
  5238. else {
  5239. this._iscanMove = true;
  5240. }
  5241. }
  5242. }
  5243. }
  5244. if (this._iscanMove) {
  5245. var distime = dt / 1000;
  5246. this._moveTime += distime;
  5247. switch (this.nowAction) {
  5248. case CharacterState_1.CharacterState.run: //跑动
  5249. this._moveVec.y = 0;
  5250. this._moveVec.z = distime * this._speedMoveV3.z;
  5251. if (this._lockxstate == 0) {
  5252. this._moveVec.x = this._changeMoveX * distime;
  5253. }
  5254. else if (this._lockxstate == 1) {
  5255. if (this._changeMoveX < 0) {
  5256. this._moveVec.x = 0;
  5257. }
  5258. else {
  5259. this._moveVec.x = this._changeMoveX * distime;
  5260. }
  5261. }
  5262. else if (this._lockxstate == 2) {
  5263. if (this._changeMoveX > 0) {
  5264. this._moveVec.x = 0;
  5265. }
  5266. else {
  5267. this._moveVec.x = this._changeMoveX * distime;
  5268. }
  5269. }
  5270. this._transform.translate(this._moveVec, false);
  5271. break;
  5272. case CharacterState_1.CharacterState.climbup: //爬升
  5273. this._moveVec.z = 0;
  5274. this._moveVec.y = distime * this.jumpSpeed.y;
  5275. if (this._lockxstate == 1) {
  5276. if (this._changeMoveX < 0) {
  5277. this._moveVec.x = 0;
  5278. }
  5279. else {
  5280. this._moveVec.x = this._changeMoveX * distime;
  5281. }
  5282. }
  5283. else if (this._lockstate == 2) {
  5284. if (this._changeMoveX > 0) {
  5285. this._moveVec.x = 0;
  5286. }
  5287. else {
  5288. this._moveVec.x = this._changeMoveX * distime;
  5289. }
  5290. }
  5291. else {
  5292. this._moveVec.x = this._changeMoveX * distime;
  5293. }
  5294. this._transform.translate(this._moveVec, false);
  5295. if (this._shangpaVec) {
  5296. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  5297. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5298. }
  5299. }
  5300. else if (this._nowselectVec) {
  5301. if (this._transform.position.y + 1 > this._nowselectVec.y) {
  5302. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5303. }
  5304. }
  5305. break;
  5306. case CharacterState_1.CharacterState.climbupblock:
  5307. this._moveVec.z = 0;
  5308. this._moveVec.y = distime * this.jumpSpeed.y;
  5309. this._moveVec.x = 0;
  5310. this._transform.translate(this._moveVec, false);
  5311. if (this._shangpaVec) {
  5312. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  5313. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5314. }
  5315. }
  5316. else if (this._transform.position.y + 1 > this._nowselectVec.y) {
  5317. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5318. }
  5319. break;
  5320. case CharacterState_1.CharacterState.jump: //跳跃
  5321. case CharacterState_1.CharacterState.jumpleft:
  5322. case CharacterState_1.CharacterState.jumpright:
  5323. this._disy = this.jumpSpeed.y - this.Gravity_g * distime;
  5324. this.jumpSpeed.y = this._disy;
  5325. this._moveVec.x = this.jumpSpeed.x * distime;
  5326. this._moveVec.y = this._disy * distime;
  5327. this._moveVec.z = this.jumpSpeed.z * distime;
  5328. this._transform.translate(this._moveVec, false);
  5329. break;
  5330. case CharacterState_1.CharacterState.speedupjump:
  5331. this._disy = this.jumpSpeed.y - this.Gravity_g * distime;
  5332. this.jumpSpeed.y = this._disy;
  5333. this._moveVec.x = this.jumpSpeed.x * distime;
  5334. this._moveVec.y = this._disy * distime;
  5335. this._moveVec.z = this.jumpSpeed.z * distime;
  5336. this._transform.translate(this._moveVec, false);
  5337. break;
  5338. case CharacterState_1.CharacterState.climbleft:
  5339. case CharacterState_1.CharacterState.climbright:
  5340. this._moveVec.z = distime * this.jumpSpeed.y;
  5341. this._moveVec.y = this.jumpSpeed.y * distime;
  5342. this._moveVec.x = 0;
  5343. this._transform.translate(this._moveVec, false);
  5344. break;
  5345. case CharacterState_1.CharacterState.MoveX:
  5346. this._moveVec.z = distime * this._speedMoveV3.z;
  5347. this._moveVec.x = this._speedMoveV3.x * distime;
  5348. this._transform.translate(this._moveVec, false);
  5349. if (this._moveTime > 0.1) {
  5350. this.nowAction = CharacterState_1.CharacterState.run;
  5351. }
  5352. break;
  5353. case CharacterState_1.CharacterState.downmove:
  5354. this._moveVec.y = this.jumpSpeed.x;
  5355. this._moveVec.x = this.jumpSpeed.y;
  5356. this._moveVec.z = this.jumpSpeed.z * distime;
  5357. this._transform.translate(this._moveVec, false);
  5358. if (this._moveTime > this._chixuTime) {
  5359. this.nowAction = CharacterState_1.CharacterState.run;
  5360. }
  5361. break;
  5362. case CharacterState_1.CharacterState.sidespeedup:
  5363. this._moveVec.y = 0;
  5364. this._moveVec.x = 0;
  5365. this._moveVec.z = this.jumpSpeed.z * distime;
  5366. this._transform.translate(this._moveVec, false);
  5367. if (this._moveTime > this._chixuTime && this.LastAction == CharacterState_1.CharacterState.climbleft || this.LastAction == CharacterState_1.CharacterState.climbright) {
  5368. this.nowAction = this.LastAction;
  5369. }
  5370. else {
  5371. this.nowAction = CharacterState_1.CharacterState.jump;
  5372. // this.setJump( this.nowAction );
  5373. }
  5374. break;
  5375. case CharacterState_1.CharacterState.cross:
  5376. this._disy = this.jumpSpeed.y - this.Gravity_g * distime;
  5377. this.jumpSpeed.y = this._disy;
  5378. this._moveVec.x = this.jumpSpeed.x * distime;
  5379. this._moveVec.y = this._disy * distime;
  5380. this._moveVec.z = this.jumpSpeed.z * distime;
  5381. this._transform.translate(this._moveVec, false);
  5382. break;
  5383. case CharacterState_1.CharacterState.ClimbMotion:
  5384. if (this._nowselectVec) {
  5385. if (this._transform.position.y < this._nowselectVec.y) {
  5386. this._moveVec.x = 0;
  5387. this._moveVec.y = (1 / 0.3) * distime;
  5388. this._moveVec.z = 0;
  5389. this._transform.translate(this._moveVec, false);
  5390. }
  5391. }
  5392. break;
  5393. }
  5394. if (this._nowselectVec && (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.downmove) && !this.haveCollision) {
  5395. if (this._transform.position.z <= this._nowselectVec.z) {
  5396. if (this._changeMoveX > 0) {
  5397. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5398. }
  5399. else if (this._changeMoveX < 0) {
  5400. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5401. }
  5402. else {
  5403. this.nowAction = CharacterState_1.CharacterState.jump;
  5404. }
  5405. }
  5406. }
  5407. if (this._transform.position.y < PropManager_1.PropManager.diePosY) //角色死亡
  5408. {
  5409. if (this.stayscene == "" || this.staybuild == "") {
  5410. this._transform.position = this._initPosVec.clone();
  5411. }
  5412. else {
  5413. this._transform.position = PropManager_1.PropManager.getPosVecbyScene(this.stayscene, this.staybuild).clone();
  5414. }
  5415. this.nowAction = CharacterState_1.CharacterState.run;
  5416. }
  5417. if (this._transform.position.z < PropManager_1.PropManager.gamewinPosZ) {
  5418. this.Win();
  5419. }
  5420. if (this._isActionNums) {
  5421. //如果当前播放state已经播放完了一次
  5422. if (this._isneedactionnum > 0) {
  5423. if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) {
  5424. switch (this._nowActionName) {
  5425. case CharacterState_1.CharacterState.jump:
  5426. case CharacterState_1.CharacterState.leftjump:
  5427. case CharacterState_1.CharacterState.rightjump:
  5428. case CharacterState_1.CharacterState.highjump1:
  5429. case CharacterState_1.CharacterState.highjump2:
  5430. case CharacterState_1.CharacterState.hurdle:
  5431. this._isActionNums = false;
  5432. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  5433. break;
  5434. case CharacterState_1.CharacterState.huachan:
  5435. case CharacterState_1.CharacterState.climbend:
  5436. this._isActionNums = false;
  5437. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5438. this.nowAction = CharacterState_1.CharacterState.run;
  5439. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  5440. break;
  5441. case CharacterState_1.CharacterState.land1:
  5442. case CharacterState_1.CharacterState.land2:
  5443. this._isActionNums = false;
  5444. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5445. break;
  5446. }
  5447. }
  5448. }
  5449. else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) {
  5450. switch (this._nowActionName) {
  5451. case CharacterState_1.CharacterState.jump:
  5452. case CharacterState_1.CharacterState.leftjump:
  5453. case CharacterState_1.CharacterState.rightjump:
  5454. case CharacterState_1.CharacterState.highjump1:
  5455. case CharacterState_1.CharacterState.highjump2:
  5456. case CharacterState_1.CharacterState.hurdle:
  5457. this._isActionNums = false;
  5458. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  5459. break;
  5460. case CharacterState_1.CharacterState.huachan:
  5461. case CharacterState_1.CharacterState.climbend:
  5462. this._isActionNums = false;
  5463. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5464. this.nowAction = CharacterState_1.CharacterState.run;
  5465. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  5466. break;
  5467. }
  5468. }
  5469. }
  5470. }
  5471. else {
  5472. if (this._ending) {
  5473. var distime = dt / 1000;
  5474. this._moveTime += distime;
  5475. if (this._moveTime >= this._endanmotime) {
  5476. this.GameOver();
  5477. }
  5478. else {
  5479. this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime;
  5480. this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime;
  5481. this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime;
  5482. PropManager_1.PropManager.carma.getComponent(CameraManager_1.CameraManager).GameEndRotate(this._transform.position, this._endAnmoSpeed1);
  5483. }
  5484. }
  5485. }
  5486. }
  5487. };
  5488. NpcScript.prototype.GameOver = function () {
  5489. this._ending = false;
  5490. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5491. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.end);
  5492. };
  5493. NpcScript.prototype.Win = function () {
  5494. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5495. this._nowRoleState = 2;
  5496. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  5497. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.npcend, this.owner.name);
  5498. };
  5499. NpcScript.prototype.stop = function () {
  5500. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5501. };
  5502. NpcScript.prototype.destroy = function () {
  5503. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5504. _super.prototype.destroy.call(this);
  5505. };
  5506. NpcScript.prototype.Joy = function (value, angle) {
  5507. if (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.climbup || CharacterState_1.CharacterState.climbleft || CharacterState_1.CharacterState.climbright) {
  5508. this._changeMoveX = value;
  5509. }
  5510. if (this.nowAction == CharacterState_1.CharacterState.climbleft && this._changeMoveX > 0) //强制跳跃
  5511. {
  5512. this.HaveForceJump = true;
  5513. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5514. }
  5515. else if (this.nowAction == CharacterState_1.CharacterState.climbright && this._changeMoveX < 0) {
  5516. this.HaveForceJump = true;
  5517. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5518. }
  5519. if (this.nowAction == CharacterState_1.CharacterState.jump ||
  5520. this.nowAction == CharacterState_1.CharacterState.jumpleft ||
  5521. this.nowAction == CharacterState_1.CharacterState.jumpright ||
  5522. this.nowAction == CharacterState_1.CharacterState.speedupjump)
  5523. angle = -angle * Math.PI / 180;
  5524. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion);
  5525. Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed);
  5526. };
  5527. NpcScript.prototype.PlayAnimator = function (actionName) {
  5528. // this._nowActionName = actionName;
  5529. var _actionname = this.TransitionActionName(actionName);
  5530. this._nowActionName = actionName;
  5531. if (this._animator) {
  5532. if (this._nowActionName == CharacterState_1.CharacterState.climbend) {
  5533. this._animator.speed = 1.5;
  5534. }
  5535. else {
  5536. this._animator.speed = 1;
  5537. }
  5538. this._animator.play(_actionname, 0, 0);
  5539. }
  5540. };
  5541. /**转换动作名称 */
  5542. NpcScript.prototype.TransitionActionName = function (_actionname) {
  5543. switch (_actionname) {
  5544. case "rollover1":
  5545. return "cefan1";
  5546. case "rollover2":
  5547. return "cefan2";
  5548. case "runwallleft":
  5549. return "paoqiangleft";
  5550. case "rightjump":
  5551. return "rightjump";
  5552. case "runwallright":
  5553. return "paoqiangright";
  5554. case "leftjump":
  5555. return "leftjump";
  5556. case "climbwall":
  5557. return "paqiang";
  5558. case "climbend":
  5559. return "climbend";
  5560. case "stand":
  5561. return "stand";
  5562. case "sky":
  5563. return "kongzhong";
  5564. case "land1":
  5565. return "luodi1";
  5566. case "land2":
  5567. return "luodi2";
  5568. case "highjump1":
  5569. return "datiao1";
  5570. case "highjump2":
  5571. return "datiao2";
  5572. case "run":
  5573. return "run";
  5574. case "jump":
  5575. return "jump";
  5576. case "climbup":
  5577. return "Climb";
  5578. case "falldown":
  5579. return "Freefalling";
  5580. case "climbleft":
  5581. return "left_climb";
  5582. case "climbright":
  5583. return "right_climb";
  5584. case "jumpright":
  5585. return "right_jump";
  5586. case "jumpleft":
  5587. return "left_jump";
  5588. case "ClimbMotion":
  5589. return "PlayPalouAction";
  5590. case "huachan":
  5591. return "huachan";
  5592. case "hurdle":
  5593. return "kualan";
  5594. case "speedupjump":
  5595. return "jiasuJump";
  5596. case "MoveX":
  5597. return "xshunyi";
  5598. case "downmove":
  5599. return "downSlide";
  5600. case "sidespeedup":
  5601. return "slidejiasu";
  5602. case "cross":
  5603. return "surmount";
  5604. case "climbupblock":
  5605. return "lockclimb";
  5606. }
  5607. };
  5608. NpcScript.prototype.TestJump = function () {
  5609. this.nowAction = CharacterState_1.CharacterState.jump;
  5610. };
  5611. NpcScript.prototype.getPostion = function () {
  5612. return this._transform.position;
  5613. };
  5614. NpcScript.prototype.getAction = function () {
  5615. return this._nowRoleState;
  5616. };
  5617. return NpcScript;
  5618. }(Laya.Script3D));
  5619. exports.NpcScript = NpcScript;
  5620. },{"../CFG/BuildCFG":9,"../PrefabControl/CharacterState":44,"../PrefabControl/PropManager":47,"../Time/TimerService":57,"../utils/DispatcherManager":83,"../utils/GameState":84,"../utils/GameUtils":85,"./CameraManager":36}],38:[function(require,module,exports){
  5621. "use strict";
  5622. Object.defineProperty(exports, "__esModule", { value: true });
  5623. var TimerService_1 = require("../Time/TimerService");
  5624. var PropManager_1 = require("../PrefabControl/PropManager");
  5625. var CharacterState_1 = require("../PrefabControl/CharacterState");
  5626. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  5627. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  5628. var BuildCFG_1 = require("../CFG/BuildCFG");
  5629. var CameraManager_1 = require("./CameraManager");
  5630. var DispatcherManager_1 = require("../utils/DispatcherManager");
  5631. var GameState_1 = require("../utils/GameState");
  5632. var GameUtils_1 = require("../utils/GameUtils");
  5633. var GameStateControl_1 = require("../Control/GameStateControl");
  5634. var AudioControl_1 = require("../Control/AudioControl");
  5635. var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
  5636. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  5637. var Player = /** @class */ (function (_super) {
  5638. __extends(Player, _super);
  5639. function Player() {
  5640. var _this = _super.call(this) || this;
  5641. _this._isActionNums = false;
  5642. _this._isneedactionnum = 0;
  5643. _this._needactiontime = 0;
  5644. _this._nowActionState = "";
  5645. _this._multiple = new Laya.Vector3(1, 1, 1);
  5646. _this.LastActionState = "";
  5647. _this._moveTime = 0;
  5648. /**
  5649. * 加速buffvec
  5650. */
  5651. _this._lastjiasuState = "";
  5652. _this.buff_speeduptime = 0;
  5653. _this.canshake = false;
  5654. _this.shaketime = 0;
  5655. _this.doublespeedup = false;
  5656. _this.resouseName = "";
  5657. _this._isColling = false;
  5658. _this._nowCollTargetName = "";
  5659. _this._normalizeVec = new Laya.Vector3;
  5660. _this._nowbuildname = "";
  5661. _this._nowscenename = "";
  5662. /**
  5663. * 0:未锁,1:锁左边,2:锁右边
  5664. */
  5665. _this._lockxstate = 0;
  5666. _this._lockbyBuildname = "";
  5667. /**
  5668. * 0:未被锁,1:锁定左边,2:锁定右边,
  5669. */
  5670. _this._lockstate = 0;
  5671. _this._shangpaVec = new Laya.Vector3;
  5672. _this._moveVec = new Laya.Vector3;
  5673. _this.jumpSpeed = new Laya.Vector3;
  5674. _this.jumpHight = 0;
  5675. _this._disy = 0;
  5676. _this.g = 10; //重力加速度
  5677. _this._ending = false;
  5678. _this._endAnmoSpeed = new Laya.Vector3();
  5679. _this._endanmotime = 1;
  5680. _this._endAnmoSpeed1 = new Laya.Vector3;
  5681. _this._changeMoveX = 0;
  5682. _this.isforceJump = false;
  5683. _this.quaternion = new Laya.Quaternion;
  5684. Player.ins = _this;
  5685. return _this;
  5686. }
  5687. Object.defineProperty(Player, "Instance", {
  5688. get: function () {
  5689. if (Player.ins == null) {
  5690. return new Player();
  5691. }
  5692. return Player.ins;
  5693. },
  5694. enumerable: true,
  5695. configurable: true
  5696. });
  5697. Player.prototype.onAwake = function () {
  5698. this._animator = this.owner.getComponent(Laya.Animator);
  5699. PropManager_1.PropManager.setAnimator(this._animator);
  5700. this._speedMoveV3 = new Laya.Vector3(0, 0, 0);
  5701. var sp = this.owner;
  5702. this._transform = sp.transform;
  5703. this._RoleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
  5704. sp.getComponent(Laya.Rigidbody3D).ccdMotionThreshold = 0.001;
  5705. this.LeftTrial = sp.getChildByName("lefttrail");
  5706. this.RightTrial = sp.getChildByName("righttrail");
  5707. };
  5708. Player.prototype.startRun = function (jiasu) {
  5709. var _this = this;
  5710. if (this._RoleData.roleCfg.gravity) {
  5711. this.g = this._RoleData.roleCfg.gravity;
  5712. }
  5713. else {
  5714. this.g = 10;
  5715. }
  5716. this._multiple.x = 1;
  5717. this._multiple.y = 1;
  5718. this._multiple.z = 1;
  5719. this.buff_speeduptime = 0;
  5720. this.doublespeedup = false;
  5721. this._lastjiasuState = "";
  5722. this._ending = false;
  5723. this._changeMoveX = 0;
  5724. this._initPosVec = this._transform.position.clone();
  5725. console.log("玩家的初始位置----", this._initPosVec);
  5726. this._nowbuildname = "";
  5727. this._nowscenename = "";
  5728. this.nowAction = CharacterState_1.CharacterState.run;
  5729. this._speedMoveV3.x = 0;
  5730. this._speedMoveV3.y = 0;
  5731. if (jiasu) {
  5732. this._speedMoveV3.z = -this._RoleData.movespeed * 2;
  5733. Laya.timer.once(3000, this, function () {
  5734. _this._speedMoveV3.z = -_this._RoleData.movespeed;
  5735. });
  5736. }
  5737. else {
  5738. this._speedMoveV3.z = -this._RoleData.movespeed;
  5739. }
  5740. this._iscanMove = true;
  5741. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  5742. };
  5743. // private pzdict:any = {};
  5744. // private pzarr:Array<any> = [];
  5745. /**
  5746. * 开始碰撞时执行
  5747. */
  5748. Player.prototype.onCollisionEnter = function (collision) {
  5749. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  5750. var contactPoint = collision.contacts[0];
  5751. this.Calculate(contactPoint.normal, collision.other.owner, contactPoint.positionOnB);
  5752. }
  5753. };
  5754. /**
  5755. * 持续碰撞时执行
  5756. */
  5757. Player.prototype.onCollisionStay = function (collision) {
  5758. // Debuger.log( "碰撞中" );
  5759. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  5760. this._isColling = true;
  5761. var contactPoint = collision.contacts[0];
  5762. var target = collision.other.owner;
  5763. var targetname = target.name;
  5764. if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1) {
  5765. this._nowCollTargetName = targetname;
  5766. }
  5767. if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
  5768. this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  5769. {
  5770. if (this._nowCollTargetName.indexOf("build") != -1) {
  5771. this._nowbuildname = this._nowCollTargetName;
  5772. this._nowscenename = target.parent.parent.name;
  5773. }
  5774. if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  5775. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  5776. }
  5777. else {
  5778. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
  5779. }
  5780. }
  5781. }
  5782. };
  5783. /**
  5784. * 结束碰撞时执行
  5785. */
  5786. Player.prototype.onCollisionExit = function (collision) {
  5787. this._isColling = false;
  5788. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  5789. var contactPoint = collision.contacts[0];
  5790. this.CheckEnd(contactPoint.normal, collision.other.owner);
  5791. }
  5792. };
  5793. /**检测结束碰撞 */
  5794. Player.prototype.CheckEnd = function (normal, target) {
  5795. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) {
  5796. return;
  5797. }
  5798. if (this.isforceJump) {
  5799. this.isforceJump = false;
  5800. return;
  5801. }
  5802. if (this._lockxstate) {
  5803. this._lockxstate = 0;
  5804. return;
  5805. }
  5806. if (this._nowCollTargetName != target.name) {
  5807. return;
  5808. }
  5809. if (target.name.indexOf("panel_jump") != -1) {
  5810. return;
  5811. }
  5812. switch (this.nowAction) {
  5813. case CharacterState_1.CharacterState.climbup:
  5814. case CharacterState_1.CharacterState.climbupblock:
  5815. if (this._nowCollTargetName.indexOf("box_Board") != -1) {
  5816. this.JumpAction(this._changeMoveX);
  5817. }
  5818. else {
  5819. if (this._changeMoveX > 0) {
  5820. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5821. }
  5822. else if (this._changeMoveX < 0) {
  5823. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5824. }
  5825. }
  5826. break;
  5827. case CharacterState_1.CharacterState.climbright:
  5828. case CharacterState_1.CharacterState.climbleft:
  5829. this.JumpAction(this._changeMoveX);
  5830. break;
  5831. case CharacterState_1.CharacterState.run:
  5832. this.JumpAction(this._changeMoveX);
  5833. break;
  5834. case CharacterState_1.CharacterState.MoveX:
  5835. this.JumpAction(this._speedMoveV3.x);
  5836. break;
  5837. }
  5838. };
  5839. Player.prototype.setnowSelectVec = function (pos) {
  5840. this._nowselectVec = pos;
  5841. };
  5842. /**计算碰撞 */
  5843. Player.prototype.Calculate = function (normal, target, collpoint) {
  5844. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) {
  5845. return;
  5846. }
  5847. this._nowCollTargetName = target.name;
  5848. var n = new Laya.Vector3;
  5849. Laya.Vector3.normalize(normal, this._normalizeVec);
  5850. if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
  5851. this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  5852. {
  5853. if (this._nowCollTargetName.indexOf("build") != -1) {
  5854. this._nowbuildname = this._nowCollTargetName;
  5855. this._nowscenename = target.parent.parent.name;
  5856. }
  5857. if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  5858. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  5859. }
  5860. else {
  5861. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
  5862. }
  5863. if (this._normalizeVec.z == -1) //上爬
  5864. {
  5865. if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.2)) {
  5866. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  5867. this.nowAction = CharacterState_1.CharacterState.run;
  5868. }
  5869. else {
  5870. this.nowAction = CharacterState_1.CharacterState.climbup;
  5871. this._shangpaVec = this._nowselectVec.clone();
  5872. }
  5873. }
  5874. else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) {
  5875. this.nowAction = CharacterState_1.CharacterState.run;
  5876. }
  5877. else if (this._normalizeVec.x == -1) {
  5878. if (this.nowAction == CharacterState_1.CharacterState.run) {
  5879. this._lockxstate = 1;
  5880. }
  5881. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  5882. this._lockxstate = 1;
  5883. }
  5884. else {
  5885. this.nowAction = CharacterState_1.CharacterState.climbleft;
  5886. }
  5887. }
  5888. else if (this._normalizeVec.x == 1) {
  5889. if (this.nowAction == CharacterState_1.CharacterState.run) {
  5890. this._lockxstate = 2;
  5891. }
  5892. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  5893. this._lockxstate = 2;
  5894. }
  5895. else {
  5896. this.nowAction = CharacterState_1.CharacterState.climbright;
  5897. }
  5898. }
  5899. else {
  5900. if (this._normalizeVec.z != 1) {
  5901. this.nowAction = CharacterState_1.CharacterState.climbupblock;
  5902. this._shangpaVec = this._nowselectVec.clone();
  5903. }
  5904. }
  5905. }
  5906. else if (this._nowCollTargetName.indexOf("panel_jump") != -1) //加速板跳跃
  5907. {
  5908. this.nowAction = CharacterState_1.CharacterState.speedupjump;
  5909. }
  5910. else if (this._nowCollTargetName.indexOf("panel_downslip") != -1) {
  5911. this.nowAction = CharacterState_1.CharacterState.downmove;
  5912. }
  5913. else if (this._nowCollTargetName.indexOf("box_Board") != -1 && this.nowAction != CharacterState_1.CharacterState.downmove) {
  5914. if (this._normalizeVec.z == -1) //上爬
  5915. {
  5916. this.nowAction = CharacterState_1.CharacterState.climbup;
  5917. this._shangpaVec = this._nowselectVec.clone();
  5918. }
  5919. }
  5920. else if (this._nowCollTargetName.indexOf("box_sidejump") != -1) {
  5921. this.nowAction = CharacterState_1.CharacterState.sidespeedup;
  5922. }
  5923. else if (this._nowCollTargetName.indexOf("box_Surmount") != -1) {
  5924. this.nowAction = CharacterState_1.CharacterState.cross;
  5925. }
  5926. else if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  5927. this.nowAction = CharacterState_1.CharacterState.climbup;
  5928. this._shangpaVec = this._nowselectVec.clone();
  5929. }
  5930. };
  5931. Player.prototype.JumpAction = function (value) {
  5932. if (value > 0) {
  5933. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5934. // this.setJump( this.nowAction );
  5935. }
  5936. else if (value < 0) {
  5937. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5938. // this.setJump( this.nowAction );
  5939. }
  5940. else {
  5941. this.nowAction = CharacterState_1.CharacterState.jump;
  5942. // this.setJump( this.nowAction );
  5943. }
  5944. };
  5945. Player.prototype.PlayAnimator = function (actionName) {
  5946. var _actionname = this.TransitionActionName(actionName);
  5947. this._StateName = actionName;
  5948. if (this._animator) {
  5949. if (this._StateName == CharacterState_1.CharacterState.climbend || this._StateName == CharacterState_1.CharacterState.land1 || this._StateName == CharacterState_1.CharacterState.land2) {
  5950. this._animator.speed = 1.5;
  5951. }
  5952. else {
  5953. this._animator.speed = 1;
  5954. }
  5955. this._animator.play(_actionname, 0, 0);
  5956. }
  5957. };
  5958. /**转换动作名称 */
  5959. Player.prototype.TransitionActionName = function (_actionname) {
  5960. switch (_actionname) {
  5961. case "rollover1":
  5962. return "cefan1";
  5963. case "rollover2":
  5964. return "cefan2";
  5965. case "runwallleft":
  5966. return "paoqiangleft";
  5967. case "rightjump":
  5968. return "rightjump";
  5969. case "runwallright":
  5970. return "paoqiangright";
  5971. case "leftjump":
  5972. return "leftjump";
  5973. case "climbwall":
  5974. return "paqiang";
  5975. case "climbend":
  5976. return "climbend";
  5977. case "stand":
  5978. return "stand";
  5979. case "sky":
  5980. return "kongzhong";
  5981. case "land1":
  5982. return "luodi1";
  5983. case "land2":
  5984. return "luodi2";
  5985. case "highjump1":
  5986. return "datiao1";
  5987. case "highjump2":
  5988. return "datiao2";
  5989. case "run":
  5990. return "run";
  5991. case "jump":
  5992. return "jump";
  5993. case "climbup":
  5994. return "Climb";
  5995. case "falldown":
  5996. return "Freefalling";
  5997. case "climbleft":
  5998. return "left_climb";
  5999. case "climbright":
  6000. return "right_climb";
  6001. case "jumpright":
  6002. return "right_jump";
  6003. case "jumpleft":
  6004. return "left_jump";
  6005. case "ClimbMotion":
  6006. return "PlayPalouAction";
  6007. case "huachan":
  6008. return "huachan";
  6009. case "hurdle":
  6010. return "kualan";
  6011. case "speedupjump":
  6012. return "jiasuJump";
  6013. case "MoveX":
  6014. return "xshunyi";
  6015. case "downmove":
  6016. return "downSlide";
  6017. case "sidespeedup":
  6018. return "slidejiasu";
  6019. case "cross":
  6020. return "surmount";
  6021. case "climbupblock":
  6022. return "lockclimb";
  6023. }
  6024. };
  6025. Object.defineProperty(Player.prototype, "nowAction", {
  6026. get: function () {
  6027. return this._nowActionState;
  6028. },
  6029. set: function (value) {
  6030. if (this._nowActionState != value || this.LastActionState == CharacterState_1.CharacterState.speedupjump || this._nowActionState == CharacterState_1.CharacterState.speedupjump) {
  6031. this.LastActionState = this._nowActionState;
  6032. this._nowActionState = value;
  6033. this._moveTime = 0;
  6034. this.canshake = false;
  6035. this.ChangeTrial(true);
  6036. switch (this._nowActionState) {
  6037. case CharacterState_1.CharacterState.stand:
  6038. this._isActionNums = false;
  6039. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  6040. break;
  6041. case CharacterState_1.CharacterState.run:
  6042. if (this.LastActionState == CharacterState_1.CharacterState.jump || this.LastActionState == CharacterState_1.CharacterState.jumpleft || this.LastActionState == CharacterState_1.CharacterState.jumpright) {
  6043. this._isActionNums = true;
  6044. this._isneedactionnum = 1;
  6045. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  6046. if (sort < 50) {
  6047. this.PlayAnimator(CharacterState_1.CharacterState.land1);
  6048. }
  6049. else {
  6050. this.PlayAnimator(CharacterState_1.CharacterState.land2);
  6051. }
  6052. }
  6053. else {
  6054. this._isActionNums = false;
  6055. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6056. }
  6057. break;
  6058. case CharacterState_1.CharacterState.jump:
  6059. this.PlayAnimator(CharacterState_1.CharacterState.jump);
  6060. PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
  6061. this._isActionNums = true;
  6062. this._isneedactionnum = 1;
  6063. this.jumpSpeed.x = this._RoleData.frontjump.x;
  6064. this.jumpSpeed.y = this._RoleData.frontjump.y;
  6065. this.jumpSpeed.z = this._RoleData.frontjump.z;
  6066. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6067. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6068. break;
  6069. case CharacterState_1.CharacterState.jumpleft:
  6070. PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
  6071. this.jumpSpeed.x = this._RoleData.leftjump.x;
  6072. this.jumpSpeed.y = this._RoleData.leftjump.y;
  6073. this.jumpSpeed.z = this._RoleData.leftjump.z;
  6074. this._isActionNums = true;
  6075. this._isneedactionnum = 1;
  6076. this.PlayAnimator(CharacterState_1.CharacterState.leftjump);
  6077. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6078. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6079. break;
  6080. case CharacterState_1.CharacterState.jumpright:
  6081. PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
  6082. this.jumpSpeed.x = this._RoleData.rightjump.x;
  6083. this.jumpSpeed.y = this._RoleData.rightjump.y;
  6084. this.jumpSpeed.z = this._RoleData.rightjump.z;
  6085. this._isActionNums = true;
  6086. this._isneedactionnum = 1;
  6087. this.PlayAnimator(CharacterState_1.CharacterState.rightjump);
  6088. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6089. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6090. break;
  6091. case CharacterState_1.CharacterState.speedupjump:
  6092. var buildcfg = BuildCFG_1.default.dict["panel_jump"];
  6093. if (this.buff_speeduptime > 0) {
  6094. this._multiple.x = 1;
  6095. this._multiple.y = 1;
  6096. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6097. this.doublespeedup = true;
  6098. }
  6099. else {
  6100. this._multiple.x = 1;
  6101. this._multiple.y = 1;
  6102. this._multiple.z = buildcfg.buffz;
  6103. }
  6104. this.buff_speeduptime = buildcfg.time;
  6105. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6106. this.jumpSpeed.y = buildcfg.buffy;
  6107. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6108. this._isActionNums = true;
  6109. this._isneedactionnum = 1;
  6110. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  6111. if (sort < 50) {
  6112. this.PlayAnimator(CharacterState_1.CharacterState.highjump1);
  6113. }
  6114. else {
  6115. this.PlayAnimator(CharacterState_1.CharacterState.highjump2);
  6116. }
  6117. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6118. Laya.timer.clear(this, this.playspeedSound);
  6119. Laya.timer.once(200, this, this.playspeedSound);
  6120. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6121. break;
  6122. case CharacterState_1.CharacterState.downmove:
  6123. var buildcfg = BuildCFG_1.default.dict["panel_downslip"];
  6124. if (this.buff_speeduptime > 0) {
  6125. this._multiple.x = 1;
  6126. this._multiple.y = 1;
  6127. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6128. this.doublespeedup = true;
  6129. }
  6130. else {
  6131. this._multiple.x = 1;
  6132. this._multiple.y = 1;
  6133. this._multiple.z = buildcfg.buffz;
  6134. }
  6135. this.buff_speeduptime = buildcfg.time;
  6136. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6137. this.jumpSpeed.y = buildcfg.buffy * this._multiple.y;
  6138. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6139. this._isActionNums = true;
  6140. this._isneedactionnum = 1;
  6141. this.PlayAnimator(CharacterState_1.CharacterState.huachan);
  6142. this.playspeedSound();
  6143. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6144. break;
  6145. case CharacterState_1.CharacterState.sidespeedup:
  6146. var buildcfg = BuildCFG_1.default.dict["box_sidejump"];
  6147. if (this.buff_speeduptime > 0) {
  6148. this._multiple.x = 1;
  6149. this._multiple.y = 1;
  6150. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6151. this.doublespeedup = true;
  6152. }
  6153. else {
  6154. this._multiple.x = 1;
  6155. this._multiple.y = 1;
  6156. this._multiple.z = buildcfg.buffz;
  6157. }
  6158. this.buff_speeduptime = buildcfg.time;
  6159. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6160. this.jumpSpeed.y = buildcfg.buffy * this._multiple.y;
  6161. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6162. this._isActionNums = false;
  6163. this.playspeedSound();
  6164. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6165. // this.PlayAnimator( CharacterState. );
  6166. break;
  6167. case CharacterState_1.CharacterState.cross:
  6168. var buildcfg = BuildCFG_1.default.dict["box_Surmount"];
  6169. if (this.buff_speeduptime > 0) {
  6170. this._multiple.x = 1;
  6171. this._multiple.y = 1;
  6172. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6173. this.doublespeedup = true;
  6174. }
  6175. else {
  6176. this._multiple.x = 1;
  6177. this._multiple.y = 1;
  6178. this._multiple.z = buildcfg.buffz;
  6179. }
  6180. this.buff_speeduptime = buildcfg.time;
  6181. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6182. this.jumpSpeed.y = (buildcfg.buffy + 0.5) * this._multiple.y;
  6183. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6184. this._isActionNums = true;
  6185. this._isneedactionnum = 1;
  6186. this.PlayAnimator(CharacterState_1.CharacterState.hurdle);
  6187. break;
  6188. case CharacterState_1.CharacterState.climbup:
  6189. case CharacterState_1.CharacterState.climbupblock:
  6190. this.jumpSpeed.x = 0;
  6191. this.jumpSpeed.y = this._RoleData.upclimb;
  6192. this.jumpSpeed.z = 0;
  6193. this._isActionNums = false;
  6194. this.PlayAnimator(CharacterState_1.CharacterState.climbwall);
  6195. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6196. this.canshake = true;
  6197. this.shaketime = 0;
  6198. this.ChangeTrial(false);
  6199. break;
  6200. case CharacterState_1.CharacterState.climbleft:
  6201. this.jumpSpeed.x = 0;
  6202. this.jumpSpeed.y = this._RoleData.slideclimb.y;
  6203. this.jumpSpeed.z = this._RoleData.slideclimb.z;
  6204. this._isActionNums = false;
  6205. this.PlayAnimator(CharacterState_1.CharacterState.runwallleft);
  6206. this.ChangeTrial(false);
  6207. break;
  6208. case CharacterState_1.CharacterState.climbright:
  6209. this.jumpSpeed.x = 0;
  6210. this.jumpSpeed.y = this._RoleData.slideclimb.y;
  6211. this.jumpSpeed.z = this._RoleData.slideclimb.z;
  6212. this._isActionNums = false;
  6213. this.PlayAnimator(CharacterState_1.CharacterState.runwallright);
  6214. this.ChangeTrial(false);
  6215. break;
  6216. case CharacterState_1.CharacterState.ClimbMotion:
  6217. this._isActionNums = true;
  6218. this._isneedactionnum = 0;
  6219. this._needactiontime = 0.3;
  6220. this._moveTime = 0;
  6221. this.PlayAnimator(CharacterState_1.CharacterState.climbend);
  6222. break;
  6223. }
  6224. }
  6225. },
  6226. enumerable: true,
  6227. configurable: true
  6228. });
  6229. Player.prototype.playspeedSound = function () {
  6230. AudioControl_1.AudioControl.Instance.playGameSound("speedup");
  6231. };
  6232. Player.prototype.ChangeTrial = function (bo) {
  6233. if (this.LeftTrial && this.RightTrial && this.LeftTrial.active != bo) {
  6234. this.LeftTrial.active = bo;
  6235. this.RightTrial.active = bo;
  6236. }
  6237. };
  6238. Player.prototype.Joy = function (value, value1, angle) {
  6239. if (this.nowAction == CharacterState_1.CharacterState.run) {
  6240. this._changeMoveX = value;
  6241. }
  6242. else if (this.nowAction == CharacterState_1.CharacterState.climbup || CharacterState_1.CharacterState.climbleft || CharacterState_1.CharacterState.climbright) {
  6243. this._changeMoveX = value1;
  6244. }
  6245. if (this.nowAction == CharacterState_1.CharacterState.climbleft && this._changeMoveX > 0) //强制跳跃
  6246. {
  6247. this.isforceJump = true;
  6248. this.nowAction = CharacterState_1.CharacterState.jumpright;
  6249. }
  6250. else if (this.nowAction == CharacterState_1.CharacterState.climbright && this._changeMoveX < 0) {
  6251. this.isforceJump = true;
  6252. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  6253. }
  6254. if (this.nowAction == CharacterState_1.CharacterState.jump ||
  6255. this.nowAction == CharacterState_1.CharacterState.jumpleft ||
  6256. this.nowAction == CharacterState_1.CharacterState.jumpright ||
  6257. this.nowAction == CharacterState_1.CharacterState.speedupjump) {
  6258. angle = -angle * Math.PI / 180;
  6259. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion);
  6260. var jumpz = this.jumpSpeed.z;
  6261. Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed);
  6262. this.jumpSpeed.z = jumpz;
  6263. }
  6264. };
  6265. Player.prototype.update = function (dt) {
  6266. dt = 16;
  6267. if (this._iscanMove) {
  6268. var distime = dt / 1000;
  6269. this._moveTime += distime;
  6270. switch (this.nowAction) {
  6271. case CharacterState_1.CharacterState.run: //跑动
  6272. this._moveVec.y = 0;
  6273. this._moveVec.z = distime * (this._speedMoveV3.z * this._multiple.z);
  6274. if (this._lockxstate == 0) {
  6275. this._moveVec.x = this._changeMoveX * distime;
  6276. }
  6277. else if (this._lockxstate == 1) {
  6278. if (this._changeMoveX < 0) {
  6279. this._moveVec.x = 0;
  6280. }
  6281. else {
  6282. this._moveVec.x = this._changeMoveX * distime;
  6283. }
  6284. }
  6285. else if (this._lockxstate == 2) {
  6286. if (this._changeMoveX > 0) {
  6287. this._moveVec.x = 0;
  6288. }
  6289. else {
  6290. this._moveVec.x = this._changeMoveX * distime;
  6291. }
  6292. }
  6293. this._transform.translate(this._moveVec, false);
  6294. break;
  6295. case CharacterState_1.CharacterState.climbup: //爬升
  6296. this._moveVec.z = 0;
  6297. this._moveVec.y = distime * this.jumpSpeed.y;
  6298. if (this._lockxstate == 1) {
  6299. if (this._changeMoveX < 0) {
  6300. this._moveVec.x = 0;
  6301. }
  6302. else {
  6303. this._moveVec.x = this._changeMoveX * distime;
  6304. }
  6305. }
  6306. else if (this._lockstate == 2) {
  6307. if (this._changeMoveX > 0) {
  6308. this._moveVec.x = 0;
  6309. }
  6310. else {
  6311. this._moveVec.x = this._changeMoveX * distime;
  6312. }
  6313. }
  6314. else {
  6315. this._moveVec.x = this._changeMoveX * distime;
  6316. }
  6317. this._transform.translate(this._moveVec, false);
  6318. if (this._shangpaVec) {
  6319. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  6320. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6321. }
  6322. }
  6323. else if (this._nowselectVec) {
  6324. if (this._transform.position.y + 1 > this._nowselectVec.y) {
  6325. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6326. }
  6327. }
  6328. break;
  6329. case CharacterState_1.CharacterState.climbupblock:
  6330. this._moveVec.z = 0;
  6331. this._moveVec.y = distime * this.jumpSpeed.y;
  6332. this._moveVec.x = 0;
  6333. this._transform.translate(this._moveVec, false);
  6334. if (this._shangpaVec) {
  6335. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  6336. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6337. }
  6338. }
  6339. else if (this._transform.position.y + 1 > this._nowselectVec.y) {
  6340. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6341. }
  6342. break;
  6343. case CharacterState_1.CharacterState.jump: //跳跃
  6344. case CharacterState_1.CharacterState.jumpleft:
  6345. case CharacterState_1.CharacterState.jumpright:
  6346. this._disy = this.jumpSpeed.y - this.g * distime;
  6347. this.jumpSpeed.y = this._disy;
  6348. this._moveVec.x = this.jumpSpeed.x * distime;
  6349. this._moveVec.y = this._disy * distime;
  6350. this._moveVec.z = this.jumpSpeed.z * distime;
  6351. this._transform.translate(this._moveVec, false);
  6352. break;
  6353. case CharacterState_1.CharacterState.speedupjump:
  6354. this._disy = this.jumpSpeed.y - this.g * distime;
  6355. this.jumpSpeed.y = this._disy;
  6356. this._moveVec.x = this.jumpSpeed.x * distime;
  6357. this._moveVec.y = this._disy * distime;
  6358. this._moveVec.z = this.jumpSpeed.z * distime;
  6359. this._transform.translate(this._moveVec, false);
  6360. break;
  6361. case CharacterState_1.CharacterState.climbleft:
  6362. case CharacterState_1.CharacterState.climbright:
  6363. this._moveVec.z = distime * this.jumpSpeed.y;
  6364. this._moveVec.y = this.jumpSpeed.y * distime;
  6365. this._moveVec.x = 0;
  6366. this._transform.translate(this._moveVec, false);
  6367. break;
  6368. case CharacterState_1.CharacterState.MoveX:
  6369. this._moveVec.z = distime * this._speedMoveV3.z;
  6370. this._moveVec.x = this._speedMoveV3.x * distime;
  6371. this._transform.translate(this._moveVec, false);
  6372. if (this._moveTime > 0.1) {
  6373. this.nowAction = CharacterState_1.CharacterState.run;
  6374. }
  6375. break;
  6376. case CharacterState_1.CharacterState.downmove:
  6377. this._moveVec.y = this.jumpSpeed.x;
  6378. this._moveVec.x = this.jumpSpeed.y;
  6379. this._moveVec.z = this.jumpSpeed.z * distime;
  6380. this._transform.translate(this._moveVec, false);
  6381. break;
  6382. case CharacterState_1.CharacterState.sidespeedup:
  6383. this._moveVec.y = 0;
  6384. this._moveVec.x = 0;
  6385. this._moveVec.z = this.jumpSpeed.z * distime;
  6386. this._transform.translate(this._moveVec, false);
  6387. if (this.buff_speeduptime <= 0 && this.LastActionState == CharacterState_1.CharacterState.climbleft || this.LastActionState == CharacterState_1.CharacterState.climbright) {
  6388. this.nowAction = this.LastActionState;
  6389. }
  6390. else {
  6391. this.nowAction = CharacterState_1.CharacterState.jump;
  6392. }
  6393. break;
  6394. case CharacterState_1.CharacterState.cross:
  6395. this._disy = this.jumpSpeed.y - this.g * distime;
  6396. this.jumpSpeed.y = this._disy;
  6397. this._moveVec.x = this.jumpSpeed.x * distime;
  6398. this._moveVec.y = this._disy * distime;
  6399. this._moveVec.z = this.jumpSpeed.z * distime;
  6400. this._transform.translate(this._moveVec, false);
  6401. break;
  6402. case CharacterState_1.CharacterState.ClimbMotion:
  6403. if (this._nowselectVec) {
  6404. if (this._transform.position.y < this._nowselectVec.y) {
  6405. this._moveVec.x = 0;
  6406. this._moveVec.y = (1 / 0.3) * distime;
  6407. this._moveVec.z = 0;
  6408. this._transform.translate(this._moveVec, false);
  6409. }
  6410. }
  6411. break;
  6412. }
  6413. if (this._nowselectVec && (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.downmove) && !this._isColling) {
  6414. if (this._transform.position.z <= this._nowselectVec.z) {
  6415. if (this._changeMoveX > 0) {
  6416. this.nowAction = CharacterState_1.CharacterState.jumpright;
  6417. }
  6418. else if (this._changeMoveX < 0) {
  6419. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  6420. }
  6421. else {
  6422. this.nowAction = CharacterState_1.CharacterState.jump;
  6423. }
  6424. }
  6425. }
  6426. if (this._transform.position.y < PropManager_1.PropManager.diePosY - PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.DieDistance) //角色死亡
  6427. {
  6428. if (this._nowscenename == "" || this._nowbuildname == "") {
  6429. if (GameState_1.GameState.fuhuocishu > 0) {
  6430. this.Revive();
  6431. }
  6432. else {
  6433. this.Lose();
  6434. }
  6435. }
  6436. else {
  6437. if (GameState_1.GameState.fuhuocishu > 0) {
  6438. this.Revive();
  6439. }
  6440. else {
  6441. this.Lose();
  6442. }
  6443. }
  6444. this.nowAction = CharacterState_1.CharacterState.stand;
  6445. }
  6446. if (this._transform.position.z < PropManager_1.PropManager.gamewinPosZ) //到达终点
  6447. {
  6448. this.Win();
  6449. }
  6450. else {
  6451. PropManager_1.PropManager.pro_jindu.value = this._transform.position.z / PropManager_1.PropManager.gamewinPosZ * 100;
  6452. }
  6453. if (this._isActionNums) {
  6454. if (this._isneedactionnum > 0) {
  6455. if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) {
  6456. switch (this._StateName) {
  6457. case CharacterState_1.CharacterState.jump:
  6458. case CharacterState_1.CharacterState.leftjump:
  6459. case CharacterState_1.CharacterState.rightjump:
  6460. case CharacterState_1.CharacterState.highjump1:
  6461. case CharacterState_1.CharacterState.highjump2:
  6462. case CharacterState_1.CharacterState.hurdle:
  6463. this._isActionNums = false;
  6464. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6465. break;
  6466. case CharacterState_1.CharacterState.huachan:
  6467. case CharacterState_1.CharacterState.climbend:
  6468. this._isActionNums = false;
  6469. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6470. this.nowAction = CharacterState_1.CharacterState.run;
  6471. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  6472. break;
  6473. case CharacterState_1.CharacterState.land1:
  6474. // this._isActionNums = false;
  6475. // this.PlayAnimator( CharacterState.run );
  6476. case CharacterState_1.CharacterState.land2:
  6477. this._isActionNums = false;
  6478. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6479. break;
  6480. case CharacterState_1.CharacterState.huachan:
  6481. this.nowAction = CharacterState_1.CharacterState.run;
  6482. break;
  6483. }
  6484. }
  6485. }
  6486. else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) {
  6487. switch (this._StateName) {
  6488. case CharacterState_1.CharacterState.jump:
  6489. case CharacterState_1.CharacterState.leftjump:
  6490. case CharacterState_1.CharacterState.rightjump:
  6491. case CharacterState_1.CharacterState.highjump1:
  6492. case CharacterState_1.CharacterState.highjump2:
  6493. this._isActionNums = false;
  6494. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6495. this._changeMoveX = 0;
  6496. break;
  6497. case CharacterState_1.CharacterState.hurdle:
  6498. this._isActionNums = false;
  6499. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6500. break;
  6501. case CharacterState_1.CharacterState.huachan:
  6502. case CharacterState_1.CharacterState.climbend:
  6503. this._isActionNums = false;
  6504. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6505. this.nowAction = CharacterState_1.CharacterState.run;
  6506. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  6507. break;
  6508. }
  6509. }
  6510. }
  6511. if (this.buff_speeduptime > 0) {
  6512. this.buff_speeduptime -= distime;
  6513. PropManager_1.PropManager.Instance.SpeedUpEffect("jiasulizi", this._transform.position);
  6514. if (this.doublespeedup) {
  6515. PropManager_1.PropManager.Instance.SpeedUpEffect1("jiasulizi", this._transform.position);
  6516. }
  6517. }
  6518. else {
  6519. this._multiple.x = 1;
  6520. this._multiple.y = 1;
  6521. this._multiple.z = 1;
  6522. this.doublespeedup = false;
  6523. PropManager_1.PropManager.Instance.CloseSpeedUpEffect();
  6524. PropManager_1.PropManager.Instance.CloseSpeedUpEffect1();
  6525. }
  6526. if (this.canshake) {
  6527. this.shaketime += distime;
  6528. if (this.shaketime >= 0.5) {
  6529. this.shaketime = 0;
  6530. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6531. }
  6532. }
  6533. }
  6534. else {
  6535. if (this._ending) {
  6536. var distime = dt / 1000;
  6537. this._moveTime += distime;
  6538. if (this._moveTime >= this._endanmotime) {
  6539. this.GameOver();
  6540. }
  6541. else {
  6542. this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime;
  6543. this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime;
  6544. this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime;
  6545. PropManager_1.PropManager.carma.getComponent(CameraManager_1.CameraManager).GameEndRotate(this._transform.position, this._endAnmoSpeed1);
  6546. }
  6547. }
  6548. }
  6549. };
  6550. Player.prototype.Win = function () {
  6551. AudioControl_1.AudioControl.Instance.playGameSound("over");
  6552. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.end);
  6553. var carmaTrans = PropManager_1.PropManager.carma.transform;
  6554. this._endAnmoSpeed.z = (this._transform.position.z - 2 - carmaTrans.position.z) / this._endanmotime;
  6555. this._endAnmoSpeed.y = (this._transform.position.y - carmaTrans.position.y) / this._endanmotime;
  6556. this._endAnmoSpeed.x = (this._transform.position.x + 3 - carmaTrans.position.x) / this._endanmotime;
  6557. this._moveTime = 0;
  6558. this._iscanMove = false;
  6559. this._ending = true;
  6560. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6561. PropManager_1.PropManager.Instance.GameOverEffecf("yanhua", this._transform.position, GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0 ? true : false);
  6562. };
  6563. /**出现复活界面 */
  6564. Player.prototype.Revive = function () {
  6565. AudioControl_1.AudioControl.Instance.playGameSound("over");
  6566. GameState_1.GameState.isdie = true;
  6567. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.revive);
  6568. this._iscanMove = false;
  6569. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  6570. // this._ending = true;
  6571. };
  6572. Player.prototype.Lose = function () {
  6573. AudioControl_1.AudioControl.Instance.playGameSound("over");
  6574. GameState_1.GameState.isdie = true;
  6575. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
  6576. this._iscanMove = false;
  6577. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  6578. this._ending = true;
  6579. };
  6580. Player.prototype.GameOver = function () {
  6581. this._ending = false;
  6582. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  6583. };
  6584. Player.prototype.TestJump = function () {
  6585. this.nowAction = CharacterState_1.CharacterState.jump;
  6586. };
  6587. Player.prototype.destroy = function () {
  6588. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  6589. _super.prototype.destroy.call(this);
  6590. };
  6591. Player.prototype.XMove = function (state) {
  6592. if (this.nowAction == CharacterState_1.CharacterState.run) {
  6593. this._moveTime = 0;
  6594. this._speedMoveV3.x = state * 20;
  6595. this.nowAction = CharacterState_1.CharacterState.MoveX;
  6596. }
  6597. };
  6598. Player.prototype.dispose = function () {
  6599. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  6600. };
  6601. return Player;
  6602. }(Laya.Script3D));
  6603. exports.Player = Player;
  6604. },{"../Agency/AgencyUserMessage":8,"../CFG/BuildCFG":9,"../Control/AudioControl":17,"../Control/GameStateControl":20,"../PrefabControl/CharacterState":44,"../PrefabControl/PanelResDic":46,"../PrefabControl/PropManager":47,"../Time/TimerService":57,"../WXSDK/PlayerAccount":73,"../WXSDK/WXGamePlatform":79,"../utils/DispatcherManager":83,"../utils/GameState":84,"../utils/GameUtils":85,"./CameraManager":36}],39:[function(require,module,exports){
  6605. "use strict";
  6606. Object.defineProperty(exports, "__esModule", { value: true });
  6607. var Global = /** @class */ (function () {
  6608. function Global() {
  6609. }
  6610. Global.curHeight = function () {
  6611. return Laya.stage.height;
  6612. };
  6613. Global.curWidth = function () {
  6614. return Laya.stage.width;
  6615. };
  6616. Global.setVars = function () {
  6617. Global.stage = Laya.stage;
  6618. Global.sethttpurl();
  6619. };
  6620. Global.getUrl = function (url) {
  6621. if (url.indexOf("wxlocal") == -1) {
  6622. return Global.resourcehtttp + url + Global.versions;
  6623. }
  6624. return url;
  6625. };
  6626. Global.sethttpurl = function () {
  6627. if (Global.isdebug) {
  6628. Global.httpurl = "https://wxgamedev.51yoyoyo.com/";
  6629. }
  6630. else {
  6631. Global.httpurl = "https://minport.51yoyoyo.com/";
  6632. }
  6633. };
  6634. Global.httpurl = "";
  6635. Global.resourcehtttp = "";
  6636. Global.cdnurl = "https://wxgame.51yoyoyo.com/";
  6637. /**
  6638. * 资源后缀版本号
  6639. */
  6640. Global.versions = ""; //"?v=1.0.7";
  6641. Global.initWidth = 720;
  6642. Global.initHeight = 1280;
  6643. /**
  6644. * 资源版本号
  6645. */
  6646. Global.resconfigVersion = "";
  6647. /**
  6648. * 当前平台
  6649. */
  6650. Global.nowplatfrom = "";
  6651. /**
  6652. * 当前游戏appid
  6653. */
  6654. Global.appid = "wx46f4626932e5f48b";
  6655. /**
  6656. * 游戏版本号
  6657. */
  6658. Global.gameVersion = "1.0.0";
  6659. /**
  6660. * 是否调试版本
  6661. */
  6662. Global.isdebug = false;
  6663. Global.AppKeyID = 0;
  6664. Global.MemberID = 0;
  6665. return Global;
  6666. }());
  6667. exports.Global = Global;
  6668. },{}],40:[function(require,module,exports){
  6669. "use strict";
  6670. Object.defineProperty(exports, "__esModule", { value: true });
  6671. var GlobalWaiting = /** @class */ (function (_super) {
  6672. __extends(GlobalWaiting, _super);
  6673. function GlobalWaiting() {
  6674. var _this = _super.call(this) || this;
  6675. _this._isforcehide = false;
  6676. _this._lastTime = 0;
  6677. return _this;
  6678. }
  6679. GlobalWaiting.prototype.constructFromXML = function (xml) {
  6680. this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  6681. _super.prototype.constructFromXML.call(this, xml);
  6682. this.img_0 = this.getChild("img_0").asImage;
  6683. this.img_0.visible = false;
  6684. this.on(Laya.Event.DISPLAY, this, this.onAddedToStage);
  6685. this.on(Laya.Event.UNDISPLAY, this, this.onRemoveFromStage);
  6686. };
  6687. GlobalWaiting.prototype.onAddedToStage = function () {
  6688. this._lastTime = Laya.Browser.now();
  6689. Laya.timer.frameLoop(1, this, this.onTimer);
  6690. };
  6691. GlobalWaiting.prototype.onTimer = function () {
  6692. if (this.img_0) {
  6693. var nowtime = Laya.Browser.now();
  6694. var distime = nowtime - this._lastTime;
  6695. if (distime / 1000 >= 0) {
  6696. if (!this._isforcehide) {
  6697. this.img_0.visible = true;
  6698. }
  6699. var i = this.img_0.rotation;
  6700. i += 10;
  6701. if (i > 360)
  6702. i = i % 360;
  6703. this.img_0.rotation = i;
  6704. }
  6705. else {
  6706. this.img_0.visible = false;
  6707. }
  6708. }
  6709. };
  6710. GlobalWaiting.prototype.hideimg = function () {
  6711. this._isforcehide = true;
  6712. if (this.img_0) {
  6713. this.img_0.visible = false;
  6714. }
  6715. };
  6716. GlobalWaiting.prototype.onRemoveFromStage = function () {
  6717. Laya.timer.clear(this, this.onTimer);
  6718. };
  6719. return GlobalWaiting;
  6720. }(fairygui.GComponent));
  6721. exports.GlobalWaiting = GlobalWaiting;
  6722. },{}],41:[function(require,module,exports){
  6723. "use strict";
  6724. Object.defineProperty(exports, "__esModule", { value: true });
  6725. var JoystickModule = /** @class */ (function (_super) {
  6726. __extends(JoystickModule, _super);
  6727. function JoystickModule(clickpanel) {
  6728. var _this = _super.call(this) || this;
  6729. _this.dis = 0;
  6730. _this.degree = 0;
  6731. _this.angle = 0;
  6732. _this.offx = 0;
  6733. _this._iscanCBack = false;
  6734. _this.mLastMouseX = 0;
  6735. _this.mLastMouseY = 0;
  6736. _this.mX = 0;
  6737. _this.mY = 0;
  6738. _this._iacanCallback = false;
  6739. _this._clickpanel = clickpanel;
  6740. _this._button = new Laya.Point();
  6741. _this.touchId = -1;
  6742. _this.radius = 400;
  6743. _this._curPos = new Laya.Point();
  6744. _this._clickpanel.on(Laya.Event.MOUSE_DOWN, _this, _this.onTouchDown);
  6745. return _this;
  6746. }
  6747. JoystickModule.prototype.onTouchDown = function (evt) {
  6748. if (this.touchId == -1) { //First touch
  6749. this.touchId = evt.touchId;
  6750. this.offx = 0;
  6751. this._iscanCBack = false;
  6752. fairygui.GRoot.inst.globalToLocal(Laya.stage.mouseX, Laya.stage.mouseY, this._curPos);
  6753. var bx = this._curPos.x;
  6754. var by = this._curPos.y;
  6755. this._lastStageX = bx;
  6756. this._lastStageY = by;
  6757. this._startStageX = bx;
  6758. this._startStageY = by;
  6759. this._button.x = bx;
  6760. this._button.y = by;
  6761. if (this._callobj && this._downCallback) {
  6762. this._downCallback.call(this._callobj);
  6763. }
  6764. this._clickpanel.on(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove);
  6765. this._clickpanel.on(Laya.Event.MOUSE_UP, this, this.OnTouchUp);
  6766. this._clickpanel.on(Laya.Event.MOUSE_OUT, this, this.OnTouchUp);
  6767. }
  6768. };
  6769. JoystickModule.prototype.setEventCallback = function (callobj, downCallback, movecallback, upcallback) {
  6770. this._callobj = callobj;
  6771. this._downCallback = downCallback;
  6772. this._movecallback = movecallback;
  6773. this._updatecallback = upcallback;
  6774. };
  6775. JoystickModule.prototype.Trigger = function (evt) {
  6776. this.onTouchDown(evt);
  6777. };
  6778. //创建地图
  6779. JoystickModule.prototype.createMap = function () {
  6780. //创建地图对象
  6781. this.tiledMap = new Laya.TiledMap();
  6782. this.mX = this.mY = 0;
  6783. //创建地图,适当的时候调用destory销毁地图
  6784. this.tiledMap.createMap("res/tiledMap/desert.json", new Laya.Rectangle(0, 0, Laya.Browser.width, Laya.Browser.height), new Laya.Handler(this, this.completeHandler));
  6785. };
  6786. /**
  6787. * 地图加载完成的回调
  6788. */
  6789. JoystickModule.prototype.completeHandler = function () {
  6790. console.log("地图创建完成");
  6791. console.log("ClientW:" + Laya.Browser.clientWidth + " ClientH:" + Laya.Browser.clientHeight);
  6792. };
  6793. /************************************************* */
  6794. JoystickModule.prototype.OnTouchUp = function (evt) {
  6795. if (evt === void 0) { evt = null; }
  6796. if (this.touchId != -1 && evt.touchId == this.touchId) {
  6797. this.touchup();
  6798. if (this._callobj && this._updatecallback) {
  6799. this._updatecallback.call(this._callobj);
  6800. }
  6801. }
  6802. };
  6803. JoystickModule.prototype.touchup = function () {
  6804. this._iscanCBack = false;
  6805. this.touchId = -1;
  6806. this._clickpanel.off(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove);
  6807. this._clickpanel.off(Laya.Event.MOUSE_UP, this, this.OnTouchUp);
  6808. this._clickpanel.off(Laya.Event.MOUSE_OUT, this, this.OnTouchUp);
  6809. this._iacanCallback = false;
  6810. this.degree = 0;
  6811. };
  6812. JoystickModule.prototype.OnTouchMove = function (evt) {
  6813. if (this.touchId != -1 && evt.touchId == this.touchId) {
  6814. var bx = Laya.stage.mouseX;
  6815. var by = Laya.stage.mouseY;
  6816. var moveX = bx - this._lastStageX;
  6817. var moveY = by - this._lastStageY;
  6818. this._lastStageX = bx;
  6819. this._lastStageY = by;
  6820. var buttonX = this._button.x + moveX;
  6821. var buttonY = this._button.y + moveY;
  6822. var offsetX = buttonX - this._startStageX;
  6823. var offsetY = buttonY - this._startStageY;
  6824. var disX = 0;
  6825. if (moveX >= 2 || moveX <= -2) {
  6826. this._iscanCBack = true;
  6827. }
  6828. else {
  6829. this._iscanCBack = false;
  6830. }
  6831. this.offx = moveX;
  6832. if (offsetX == 0 && offsetY == 0) {
  6833. return;
  6834. }
  6835. if (offsetX > 0) {
  6836. if (offsetX > this.radius) {
  6837. disX = this.radius;
  6838. this.angle = 90;
  6839. }
  6840. else {
  6841. disX = this.radius - offsetX;
  6842. this.angle = 90 - disX / this.radius * 90;
  6843. }
  6844. }
  6845. else if (offsetX == 0) {
  6846. this.angle = 0;
  6847. }
  6848. else {
  6849. if (-offsetX > this.radius) {
  6850. disX = this.radius;
  6851. this.angle = -90;
  6852. }
  6853. else {
  6854. disX = this.radius + offsetX;
  6855. this.angle = -(90 - disX / this.radius * 90);
  6856. }
  6857. }
  6858. var rad = Math.atan2(offsetY, offsetX);
  6859. this.degree = rad;
  6860. var maxX = this.radius * Math.cos(rad);
  6861. var maxY = this.radius * Math.sin(rad);
  6862. if (Math.abs(offsetX) > Math.abs(maxX))
  6863. offsetX = maxX;
  6864. if (Math.abs(offsetY) > Math.abs(maxY))
  6865. offsetY = maxY;
  6866. buttonX = this._startStageX + offsetX;
  6867. buttonY = this._startStageY + offsetY;
  6868. if (buttonX < 0)
  6869. buttonX = 0;
  6870. if (buttonY > fairygui.GRoot.inst.height)
  6871. buttonY = fairygui.GRoot.inst.height;
  6872. this._button.x = buttonX;
  6873. this._button.y = buttonY;
  6874. this.dis = Math.sqrt(offsetX * offsetX + offsetY * offsetY);
  6875. this._iacanCallback = true;
  6876. if (this._iscanCBack && this._callobj && this._movecallback && this._iacanCallback) {
  6877. this._movecallback.call(this._callobj, this.offx);
  6878. }
  6879. }
  6880. };
  6881. JoystickModule.prototype.dispose = function () {
  6882. this._clickpanel.off(Laya.Event.MOUSE_DOWN, this, this.onTouchDown);
  6883. };
  6884. // private _center:fairygui.GImage;
  6885. JoystickModule.JoystickMoving = "JoystickMoving";
  6886. JoystickModule.JoystickUp = "JoystickUp";
  6887. return JoystickModule;
  6888. }(Laya.EventDispatcher));
  6889. exports.JoystickModule = JoystickModule;
  6890. },{}],42:[function(require,module,exports){
  6891. "use strict";
  6892. Object.defineProperty(exports, "__esModule", { value: true });
  6893. var Global_1 = require("./Global");
  6894. var Stage = Laya.Stage;
  6895. var AssetPath_1 = require("./Config/AssetPath");
  6896. var GameContents_1 = require("./GameContents");
  6897. var Sdk_1 = require("./WXSDK/Sdk");
  6898. var Main = /** @class */ (function () {
  6899. function Main() {
  6900. //根据IDE设置初始化引擎
  6901. // Laya.init(Global.initWidth, Global.initHeight, Laya["WebGL"]);
  6902. Laya3D.init(Global_1.Global.initWidth, Global_1.Global.initHeight);
  6903. Laya.stage.scaleMode = Stage.SCALE_FIXED_WIDTH;
  6904. Laya.stage.alignH = Stage.ALIGN_CENTER;
  6905. Laya.stage.alignV = Stage.ALIGN_TOP;
  6906. Laya.stage.screenMode = Stage.SCREEN_VERTICAL;
  6907. Laya.stage.bgColor = "#54B9F6";
  6908. // Laya.Stat.show();
  6909. Laya.alertGlobalError = true;
  6910. window['Config3D'] && (window['Config3D']["_default"]["_defaultPhysicsMemory"] = 128);
  6911. if (Laya.Browser.window.tt) {
  6912. // WxApi.WxInit();
  6913. Sdk_1.WxApi.CheckWXUpdate();
  6914. }
  6915. Laya.stage.on("resize", this, this.onResize);
  6916. }
  6917. Main.prototype.onResize = function () {
  6918. Laya.stage.off("resize", this, this.onResize);
  6919. Global_1.Global.setVars();
  6920. AssetPath_1.AssetPath.init();
  6921. fairygui.UIConfig.packageFileExtension = "bin";
  6922. fairygui.UIConfig.textureLinearSampling = true;
  6923. fairygui.UIConfig.defaultFont = "黑体";
  6924. fairygui.UIConfig.versions = Global_1.Global.versions;
  6925. var gameContent = new GameContents_1.GameContents();
  6926. gameContent.initGame();
  6927. };
  6928. return Main;
  6929. }());
  6930. //激活启动类
  6931. new Main();
  6932. },{"./Config/AssetPath":15,"./GameContents":35,"./Global":39,"./WXSDK/Sdk":75}],43:[function(require,module,exports){
  6933. "use strict";
  6934. Object.defineProperty(exports, "__esModule", { value: true });
  6935. var AssetPath_1 = require("../Config/AssetPath");
  6936. var CharacterPool = /** @class */ (function () {
  6937. function CharacterPool() {
  6938. }
  6939. CharacterPool.AddCharacter = function (resouceName, clas, parent) {
  6940. var skinnedmesh;
  6941. var arr = CharacterPool.roledict[resouceName];
  6942. if (arr && arr.length > 0) {
  6943. skinnedmesh = arr.shift();
  6944. skinnedmesh.active = true;
  6945. parent.addChild(skinnedmesh);
  6946. }
  6947. else {
  6948. var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DRoleModel(resouceName));
  6949. skinnedmesh = Laya.Sprite3D.instantiate(sp, parent, false, new Laya.Vector3(0, 0, 0));
  6950. }
  6951. if (clas) {
  6952. var cla = skinnedmesh.addComponent(clas);
  6953. cla.resouseName = resouceName;
  6954. }
  6955. var _out = new Laya.Quaternion;
  6956. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), 180 * Math.PI / 180, _out);
  6957. skinnedmesh.transform.rotation = _out;
  6958. return skinnedmesh;
  6959. };
  6960. CharacterPool.ClearCharacter = function (sp, resouceName, cla) {
  6961. if (!CharacterPool.roledict[resouceName]) {
  6962. CharacterPool.roledict[resouceName] = [];
  6963. }
  6964. if (cla) {
  6965. cla.destroy();
  6966. }
  6967. sp.active = false;
  6968. sp.removeSelf();
  6969. CharacterPool.roledict[resouceName].push(sp);
  6970. };
  6971. CharacterPool.roledict = {};
  6972. return CharacterPool;
  6973. }());
  6974. exports.CharacterPool = CharacterPool;
  6975. },{"../Config/AssetPath":15}],44:[function(require,module,exports){
  6976. "use strict";
  6977. Object.defineProperty(exports, "__esModule", { value: true });
  6978. var CharacterState = /** @class */ (function () {
  6979. function CharacterState() {
  6980. }
  6981. /**侧翻 cefan1 */
  6982. CharacterState.rollover1 = "rollover1";
  6983. /**侧翻 cefan2 */
  6984. CharacterState.rollover2 = "rollover2";
  6985. /**跑墙左 paoqiangleft */
  6986. CharacterState.runwallleft = "runwallleft";
  6987. /**右跳 rightjump */
  6988. CharacterState.rightjump = "rightjump";
  6989. /**跑墙右 paoqiangright */
  6990. CharacterState.runwallright = "runwallright";
  6991. /**左跳 leftjump*/
  6992. CharacterState.leftjump = "leftjump";
  6993. /**爬墙 paqiang */
  6994. CharacterState.climbwall = "climbwall";
  6995. /** ? climbend */
  6996. CharacterState.climbend = "climbend";
  6997. /**站立 stand*/
  6998. CharacterState.stand = "stand";
  6999. /**空中 kongzhong */
  7000. CharacterState.sky = "sky";
  7001. /**落地 luodi1 */
  7002. CharacterState.land1 = "land1";
  7003. /**落地 luodi2 */
  7004. CharacterState.land2 = "land2";
  7005. /**大跳 datiao1 */
  7006. CharacterState.highjump1 = "highjump1";
  7007. /**大跳 datiao2 */
  7008. CharacterState.highjump2 = "highjump2";
  7009. /**跑动 run */
  7010. CharacterState.run = "run";
  7011. /**跳跃 jump*/
  7012. CharacterState.jump = "jump";
  7013. /**爬升 Climb */
  7014. CharacterState.climbup = "climbup";
  7015. /**自由落体 Freefalling */
  7016. CharacterState.falldown = "falldown";
  7017. /**左爬 left_climb */
  7018. CharacterState.climbleft = "climbleft";
  7019. /**右爬 right_climb*/
  7020. CharacterState.climbright = "climbright";
  7021. /**右跳 right_jump */
  7022. CharacterState.jumpright = "jumpright";
  7023. /**左跳 left_jump */
  7024. CharacterState.jumpleft = "jumpleft";
  7025. /** PlayPalouAction*/
  7026. CharacterState.ClimbMotion = "ClimbMotion";
  7027. /** ? huachan */
  7028. CharacterState.huachan = "huachan";
  7029. /**跨栏 kualan */
  7030. CharacterState.hurdle = "hurdle";
  7031. /**
  7032. * 加速板跳跃 jiasuJump
  7033. */
  7034. CharacterState.speedupjump = "speedupjump";
  7035. /**
  7036. * x方向瞬移 xshunyi
  7037. */
  7038. CharacterState.MoveX = "MoveX";
  7039. /**
  7040. * 下滑位移 downSlide
  7041. */
  7042. CharacterState.downmove = "downmove";
  7043. /**
  7044. * 侧面加速 slidejiasu
  7045. */
  7046. CharacterState.sidespeedup = "sidespeedup";
  7047. /**
  7048. * 翻越 surmount
  7049. */
  7050. CharacterState.cross = "cross";
  7051. /**
  7052. * 锁定爬升 lockclimb
  7053. */
  7054. CharacterState.climbupblock = "climbupblock";
  7055. return CharacterState;
  7056. }());
  7057. exports.CharacterState = CharacterState;
  7058. },{}],45:[function(require,module,exports){
  7059. "use strict";
  7060. Object.defineProperty(exports, "__esModule", { value: true });
  7061. /*
  7062. * 对象池类
  7063. */
  7064. var Animation = Laya.Animation;
  7065. var GamePool = /** @class */ (function (_super) {
  7066. __extends(GamePool, _super);
  7067. function GamePool() {
  7068. var _this = _super.call(this) || this;
  7069. _this.AniConfPath = "res/fighter/fighter.json";
  7070. return _this;
  7071. }
  7072. GamePool.RemoveItem = function (key, obj) {
  7073. if (GamePool.contain[key]) {
  7074. var index = GamePool.contain[key].indexOf(obj);
  7075. if (index == -1) {
  7076. GamePool.contain[key].push(obj);
  7077. }
  7078. }
  7079. };
  7080. GamePool.GetItem = function (key) {
  7081. var args = [];
  7082. for (var _i = 1; _i < arguments.length; _i++) {
  7083. args[_i - 1] = arguments[_i];
  7084. }
  7085. if (GamePool.contain[key]) {
  7086. var arr = GamePool.contain[key];
  7087. if (arr.length == 0) {
  7088. var calssobj = GamePool.sprite3DArray[key];
  7089. var vo = new calssobj();
  7090. return vo;
  7091. }
  7092. return GamePool.contain[key].shift();
  7093. }
  7094. else {
  7095. console.log("此key值对应的类未被注册");
  7096. return null;
  7097. }
  7098. };
  7099. /******************************************* */
  7100. GamePool.prototype.createAnimation = function () {
  7101. var ani = new Animation();
  7102. ani.loadAtlas(this.AniConfPath); // 加载图集动画
  7103. ani.interval = 30; // 设置播放间隔(单位:毫秒)
  7104. ani.index = 1; // 当前播放索引
  7105. ani.play(); // 播放图集动画
  7106. // 获取动画的边界信息
  7107. var bounds = ani.getGraphicBounds();
  7108. ani.pivot(bounds.width / 2, bounds.height / 2);
  7109. ani.pos(Laya.stage.width / 2, Laya.stage.height / 2);
  7110. Laya.stage.addChild(ani);
  7111. };
  7112. /******************************************* */
  7113. GamePool.GetItemFairyGUI = function (url) {
  7114. if (!GamePool.contain[url]) {
  7115. GamePool.contain[url] = [];
  7116. }
  7117. var arr = GamePool.contain[url];
  7118. if (arr.length == 0) {
  7119. var vo = fairygui.UIPackage.createObjectFromURL(url);
  7120. return vo;
  7121. }
  7122. return GamePool.contain[url].shift();
  7123. };
  7124. GamePool.Mark = function (key, classarg) {
  7125. GamePool.sprite3DArray[key] = classarg;
  7126. GamePool.contain[key] = [];
  7127. };
  7128. GamePool.sprite3DArray = {};
  7129. GamePool.contain = {};
  7130. return GamePool;
  7131. }(Laya.EventDispatcher));
  7132. exports.GamePool = GamePool;
  7133. },{}],46:[function(require,module,exports){
  7134. "use strict";
  7135. Object.defineProperty(exports, "__esModule", { value: true });
  7136. var Singleton_1 = require("../utils/Singleton");
  7137. /*
  7138. * name;
  7139. */
  7140. var PanelResDic = /** @class */ (function (_super) {
  7141. __extends(PanelResDic, _super);
  7142. function PanelResDic() {
  7143. var _this = _super.call(this) || this;
  7144. PanelResDic.ins = _this;
  7145. return _this;
  7146. }
  7147. Object.defineProperty(PanelResDic, "Instance", {
  7148. get: function () {
  7149. if (PanelResDic.ins == null) {
  7150. return new PanelResDic();
  7151. }
  7152. return PanelResDic.ins;
  7153. },
  7154. enumerable: true,
  7155. configurable: true
  7156. });
  7157. PanelResDic.getView = function (viewkey) {
  7158. if (!PanelResDic._mapviewDict[viewkey]) {
  7159. throw "err0 未绑定的viewkey:" + viewkey;
  7160. }
  7161. return PanelResDic._mapviewDict[viewkey];
  7162. };
  7163. PanelResDic.prototype.getSingleTon = function (ref) {
  7164. return Singleton_1.Singleton.Instance(ref);
  7165. };
  7166. PanelResDic.prototype.mapView = function (viewkey, ref) {
  7167. if (!PanelResDic._mapviewDict[viewkey]) {
  7168. PanelResDic._mapviewDict[viewkey] = ref;
  7169. ref.key = viewkey;
  7170. }
  7171. };
  7172. PanelResDic.prototype.AgencyAdd = function (ref) {
  7173. Singleton_1.Singleton.create(ref);
  7174. };
  7175. PanelResDic.prototype.AgencyClear = function (ref) {
  7176. Singleton_1.Singleton.remove(ref);
  7177. };
  7178. PanelResDic._mapviewDict = {};
  7179. return PanelResDic;
  7180. }(Laya.EventDispatcher));
  7181. exports.PanelResDic = PanelResDic;
  7182. },{"../utils/Singleton":89}],47:[function(require,module,exports){
  7183. "use strict";
  7184. Object.defineProperty(exports, "__esModule", { value: true });
  7185. var AssetPath_1 = require("../Config/AssetPath");
  7186. var GameUtils_1 = require("../utils/GameUtils");
  7187. var PropManager = /** @class */ (function () {
  7188. function PropManager() {
  7189. this._outQUaternion4 = new Laya.Quaternion;
  7190. this._outQUaternion = new Laya.Quaternion;
  7191. PropManager.ins = this;
  7192. }
  7193. Object.defineProperty(PropManager, "Instance", {
  7194. get: function () {
  7195. if (PropManager.ins == null) {
  7196. return new PropManager();
  7197. }
  7198. return PropManager.ins;
  7199. },
  7200. enumerable: true,
  7201. configurable: true
  7202. });
  7203. PropManager.getPosVecbyScene = function (sceneName, buildname) {
  7204. if (PropManager.patternDict[sceneName]) {
  7205. return PropManager.patternDict[sceneName][buildname];
  7206. }
  7207. return null;
  7208. };
  7209. /**
  7210. * @param animator
  7211. * @param animatorDict
  7212. */
  7213. PropManager.setAnimator = function (animator) {
  7214. var chiddict;
  7215. for (var s in PropManager.actionDict) {
  7216. if (!animator.getControllerLayer().getAnimatorState(s)) {
  7217. chiddict = PropManager.actionDict[s];
  7218. //创建一个动画动作状态
  7219. var state1 = new Laya.AnimatorState();
  7220. //设置动作状态的名称
  7221. state1.name = s;
  7222. //设置动作状态播放的起始时间(起始时间与结束时间的设置为0-1的百分比数值) 要截取的时间点 / 动画的总时长
  7223. state1.clipStart = chiddict.s / PropManager.actionnums;
  7224. //设置动作状态播放的结束时间
  7225. state1.clipEnd = chiddict.e / PropManager.actionnums;
  7226. //得到默认动画赋值给Clip(getDefaultState默认动画为Unity中animation的数组顺序0下标的动画)
  7227. state1.clip = animator.getDefaultState().clip;
  7228. //动画播放是否循环
  7229. state1.clip.islooping = chiddict.islooping;
  7230. //添加动画状态到动画组件里
  7231. animator.addState(state1);
  7232. }
  7233. }
  7234. };
  7235. PropManager.prototype.InitEffect = function () {
  7236. var lizi = PropManager.getlizibyName("speedupeffect");
  7237. lizi.particleSystem.play();
  7238. lizi.active = false;
  7239. var lizi = PropManager.getlizibyName("color_white");
  7240. lizi.particleSystem.play();
  7241. lizi.active = false;
  7242. var lizi = PropManager.getlizibyName("color_yellow");
  7243. lizi.particleSystem.play();
  7244. lizi.active = false;
  7245. };
  7246. PropManager.prototype.SetEffectColor = function (name, pos) {
  7247. var closetime = 0;
  7248. Laya.timer.clear(this, this.EffectEnd);
  7249. this.EffectEndColor();
  7250. if (name == "color_white") {
  7251. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  7252. if (sort > 50) {
  7253. name = "color_yellow";
  7254. }
  7255. }
  7256. closetime = 500;
  7257. this._tanselizi = PropManager.getlizibyName(name);
  7258. this._tanselizi.transform.position = pos;
  7259. this._tanselizi.particleSystem.play();
  7260. if (closetime != 0) {
  7261. Laya.timer.once(closetime, this, this.EffectEndColor);
  7262. }
  7263. };
  7264. PropManager.prototype.EffectEndColor = function () {
  7265. if (this._tanselizi) {
  7266. this._tanselizi.particleSystem.stop();
  7267. this._tanselizi.active = false;
  7268. }
  7269. };
  7270. PropManager.prototype.SpeedUpEffect1 = function (name, pos) {
  7271. if (!this._engamelizi4 || (this._engamelizi4 && !this._engamelizi4.active)) {
  7272. this._engamelizi4 = PropManager.getlizibyName("speedupeffect");
  7273. this._engamelizi4.particleSystem.looping = true;
  7274. this._engamelizi4.transform.scale = new Laya.Vector3(20, 20, 20);
  7275. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion4);
  7276. this._engamelizi4.transform.rotation = this._outQUaternion4;
  7277. this._engamelizi4.particleSystem.play();
  7278. }
  7279. var lzpos = pos.clone();
  7280. lzpos.y += 5;
  7281. lzpos.z -= 10;
  7282. this._engamelizi4.transform.position = lzpos;
  7283. };
  7284. PropManager.prototype.CloseSpeedUpEffect1 = function () {
  7285. if (this._engamelizi4 && this._engamelizi4.active) {
  7286. this._engamelizi4.active = false;
  7287. }
  7288. };
  7289. PropManager.prototype.SpeedUpEffect = function (name, pos) {
  7290. if (!this._engamelizi3 || (this._engamelizi3 && !this._engamelizi3.active)) {
  7291. this._engamelizi3 = PropManager.getlizibyName("speedupeffect");
  7292. this._engamelizi3.particleSystem.looping = true;
  7293. this._engamelizi3.transform.scale = new Laya.Vector3(20, 20, 20);
  7294. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion);
  7295. this._engamelizi3.transform.rotation = this._outQUaternion;
  7296. this._engamelizi3.particleSystem.play();
  7297. }
  7298. var lzpos = pos.clone();
  7299. lzpos.y += 5;
  7300. this._engamelizi3.transform.position = lzpos;
  7301. };
  7302. PropManager.prototype.CloseSpeedUpEffect = function () {
  7303. if (this._engamelizi3 && this._engamelizi3.active) {
  7304. this._engamelizi3.active = false;
  7305. }
  7306. };
  7307. PropManager.prototype.GameOverEffecf = function (name, pos, iswin) {
  7308. this._engamelizi1 = PropManager.getlizibyName("fireworks");
  7309. this._engamelizi1.transform.position = pos;
  7310. this._engamelizi1.particleSystem.play();
  7311. if (iswin) {
  7312. this._engamelizi2 = PropManager.getlizibyName("winline");
  7313. this._engamelizi2.transform.position = pos;
  7314. this._engamelizi2.particleSystem.play();
  7315. }
  7316. };
  7317. PropManager.prototype.CloseGameOverEffect = function () {
  7318. if (this._engamelizi1) {
  7319. this._engamelizi1.particleSystem.stop();
  7320. this._engamelizi1.active = false;
  7321. }
  7322. if (this._engamelizi2) {
  7323. this._engamelizi2.particleSystem.stop();
  7324. this._engamelizi2.active = false;
  7325. }
  7326. };
  7327. // public setliziPlay( name:string,pos:Laya.Vector3 ):void
  7328. // {
  7329. // var closetime:number = 0;
  7330. // Laya.timer.clear( this,this.liziend );
  7331. // switch( name )
  7332. // {
  7333. // case "tanse_bai":
  7334. // if( name == "tanse_bai" )
  7335. // {
  7336. // var sort:number = GameUtils.randRangeint( 0,100 );
  7337. // if( sort > 50 )
  7338. // {
  7339. // name = "tanse_huang";
  7340. // }
  7341. // }
  7342. // closetime = 500;
  7343. // break;
  7344. // case "jiasulizi":
  7345. // break;
  7346. // case "win_xian":
  7347. // closetime = 0;
  7348. // break;
  7349. // case "yanhua":
  7350. // closetime = 0;
  7351. // break;
  7352. // }
  7353. // var lizi:Laya.ShuriKenParticle3D = PropManager.getlizibyName( name );
  7354. // lizi.transform.position = pos;
  7355. // lizi.particleSystem.play();
  7356. // if( closetime != 0 )
  7357. // {
  7358. // Laya.timer.once( closetime,this,this.liziend,[lizi] );
  7359. // }
  7360. // }
  7361. PropManager.prototype.EffectEnd = function (lizi) {
  7362. if (lizi) {
  7363. lizi.particleSystem.stop();
  7364. lizi.active = false;
  7365. }
  7366. };
  7367. PropManager.getlizibyName = function (name) {
  7368. var lizisp;
  7369. if (PropManager.liziDict[name]) {
  7370. lizisp = PropManager.liziDict[name];
  7371. }
  7372. else {
  7373. lizisp = Laya.Sprite3D.instantiate(Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel(name)));
  7374. PropManager.liziDict[name] = lizisp;
  7375. PropManager.scene3D.addChild(lizisp);
  7376. }
  7377. lizisp.active = true;
  7378. return lizisp;
  7379. };
  7380. PropManager.nowmapDict = {};
  7381. PropManager.diePosY = 0;
  7382. PropManager.gamewinPosZ = 0;
  7383. PropManager.patternDict = {};
  7384. PropManager.npcDict = {};
  7385. PropManager.npcscriptDict = {};
  7386. PropManager.npcnum = 0;
  7387. PropManager.iscarmanpc = false;
  7388. PropManager.liziDict = {};
  7389. PropManager.jiantouArr = [];
  7390. // /**
  7391. // * 判断是否爬到顶端
  7392. // */
  7393. // static checkisClimbTop( sceneName:string,buildname:string, pos:Laya.Vector3 ):boolean
  7394. // {
  7395. // var vec:Laya.Vector3 = PropManager.getPosVecbyScene( sceneName,buildname );
  7396. // if( vec && Math.abs(vec.y - pos.y) < 1.5 )
  7397. // {
  7398. // return true;
  7399. // }
  7400. // return false;
  7401. // }
  7402. PropManager.actionnums = 575;
  7403. PropManager.actionDict = {
  7404. "climbend": { s: 550, e: 575, islooping: false },
  7405. "stand": { s: 0, e: 80, islooping: true },
  7406. "run": { s: 90, e: 106, islooping: true },
  7407. "jump": { s: 110, e: 132, islooping: true },
  7408. "kongzhong": { s: 132, e: 145, islooping: true },
  7409. "luodi1": { s: 145, e: 160, islooping: true },
  7410. "luodi2": { s: 170, e: 202, islooping: true },
  7411. "datiao1": { s: 210, e: 235, islooping: true },
  7412. "datiao2": { s: 240, e: 273, islooping: true },
  7413. "huachan": { s: 280, e: 310, islooping: true },
  7414. "kualan": { s: 310, e: 346, islooping: true },
  7415. "cefan1": { s: 350, e: 391, islooping: true },
  7416. "cefan2": { s: 400, e: 434, islooping: true },
  7417. "paoqiangleft": { s: 440, islooping: true, e: 456 },
  7418. "rightjump": { s: 460, e: 477, islooping: true },
  7419. "paoqiangright": { s: 480, e: 496, islooping: true },
  7420. "leftjump": { s: 500, e: 517, islooping: true },
  7421. "paqiang": { s: 520, e: 542, islooping: true }
  7422. };
  7423. return PropManager;
  7424. }());
  7425. exports.PropManager = PropManager;
  7426. },{"../Config/AssetPath":15,"../utils/GameUtils":85}],48:[function(require,module,exports){
  7427. "use strict";
  7428. Object.defineProperty(exports, "__esModule", { value: true });
  7429. var PanelChildControl_1 = require("../Control/PanelChildControl");
  7430. var CpaEvent_1 = require("./CpaEvent");
  7431. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  7432. var RecommendView_1 = require("./RecommendView");
  7433. var TimerService_1 = require("../Time/TimerService");
  7434. var BaoKuanGameView = /** @class */ (function (_super) {
  7435. __extends(BaoKuanGameView, _super);
  7436. function BaoKuanGameView() {
  7437. var _this = _super.call(this) || this;
  7438. _this._time = 0;
  7439. _this.key = 0;
  7440. _this._istart = false;
  7441. return _this;
  7442. }
  7443. BaoKuanGameView.prototype.onInit = function () {
  7444. this.initView();
  7445. this.initEvent();
  7446. };
  7447. BaoKuanGameView.prototype.initView = function () {
  7448. this.c_state = this.getController("c_state");
  7449. this.t0 = this.getTransition("t0");
  7450. this.c_state.selectedIndex = 0;
  7451. };
  7452. BaoKuanGameView.prototype.initEvent = function () {
  7453. console.log("监听互推事件---BaokuanGame0");
  7454. this.AddEventData(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler);
  7455. };
  7456. BaoKuanGameView.prototype.yqhomedataHandler = function () {
  7457. console.log("监听互推事件---BaokuanGame1");
  7458. this.RefreshBKYX();
  7459. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  7460. };
  7461. BaoKuanGameView.prototype.update = function (dt) {
  7462. if (this._istart) {
  7463. this._time += dt;
  7464. if (this._time >= 5000) {
  7465. this._time = 0;
  7466. this.RefreshBKYX(true);
  7467. }
  7468. }
  7469. };
  7470. BaoKuanGameView.prototype.RefreshBKYX = function (isanmo) {
  7471. if (isanmo === void 0) { isanmo = false; }
  7472. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.recommend)
  7473. return;
  7474. console.log("监听互推事件---BaokuanGame2");
  7475. this.c_state.selectedIndex = 1;
  7476. var datas = RecommendView_1.Recommend.cainixihuanData;
  7477. var item;
  7478. for (var i = 0; i < 4; i++) {
  7479. if (this.key + i >= datas.length - 1) {
  7480. this.key = 0;
  7481. }
  7482. var curdata = datas[this.key + i];
  7483. item = this["item_" + i];
  7484. item.showData(curdata, true);
  7485. if (curdata == null)
  7486. continue;
  7487. }
  7488. this.key += 4;
  7489. if (this.key >= datas.length - 1) {
  7490. this.key = 0;
  7491. }
  7492. this._istart = true;
  7493. if (isanmo) {
  7494. this.t0.play(null, 1);
  7495. }
  7496. };
  7497. return BaoKuanGameView;
  7498. }(PanelChildControl_1.PanelChildControl));
  7499. exports.default = BaoKuanGameView;
  7500. },{"../Control/PanelChildControl":24,"../Time/TimerService":57,"../WXSDK/PlayerAccount":73,"./CpaEvent":51,"./RecommendView":53}],49:[function(require,module,exports){
  7501. "use strict";
  7502. Object.defineProperty(exports, "__esModule", { value: true });
  7503. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  7504. var RecommendView_1 = require("./RecommendView");
  7505. var ViewManager_1 = require("../View/ViewManager");
  7506. var TimerService_1 = require("../Time/TimerService");
  7507. var DispatcherManager_1 = require("../utils/DispatcherManager");
  7508. var GameState_1 = require("../utils/GameState");
  7509. var CompletePanel_1 = require("../View/CompletePanel");
  7510. var RoleData_1 = require("../Data/RoleData");
  7511. var ChoutiPanView = /** @class */ (function (_super) {
  7512. __extends(ChoutiPanView, _super);
  7513. function ChoutiPanView(end) {
  7514. var _this = _super.call(this, "main", "choutipanView") || this;
  7515. _this._iscanmove = false;
  7516. _this.isend = 0;
  7517. _this._movetime = 0;
  7518. _this._flushtime = 0;
  7519. _this.dir = true;
  7520. _this._nowvalue = 0;
  7521. _this.isend = end;
  7522. return _this;
  7523. }
  7524. ChoutiPanView.prototype.initView = function () {
  7525. this.list_0.setVirtual();
  7526. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  7527. this.list_1.setVirtual();
  7528. this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false);
  7529. this._nowList0 = RecommendView_1.Recommend.gdyxData;
  7530. this._nowList1 = RecommendView_1.Recommend.gdyxData;
  7531. this.list_0.numItems = this._nowList0.length;
  7532. this.list_1.numItems = this._nowList1.length;
  7533. this._isStart = true;
  7534. this._iscanmove = true;
  7535. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  7536. };
  7537. ChoutiPanView.prototype.initEvent = function () {
  7538. this.AddEventByType(this.btn_return, Laya.Event.CLICK, this, this.onclosefun);
  7539. this.AddEventByType(this.btn_jixugame, Laya.Event.CLICK, this, this.onclosefun);
  7540. this.AddEventByType(this.list_1, Laya.Event.MOUSE_DOWN, this, this.downclick);
  7541. this.AddEventByType(this.list_1, Laya.Event.MOUSE_UP, this, this.upclick);
  7542. this.AddEventByType(this.list_1, Laya.Event.MOUSE_OUT, this, this.upclick);
  7543. };
  7544. ChoutiPanView.prototype.itemrenderlist = function (index, item) {
  7545. if (index < this._nowList0.length) {
  7546. item.showData(this._nowList0[index]);
  7547. }
  7548. };
  7549. ChoutiPanView.prototype.itemrenderlist1 = function (index, item) {
  7550. if (index < this._nowList1.length) {
  7551. item.showData(this._nowList1[index]);
  7552. }
  7553. };
  7554. ChoutiPanView.prototype.downclick = function () {
  7555. this._isdown = true;
  7556. this._iscanmove = false;
  7557. Laya.timer.clear(this, this.timeoutCallback);
  7558. };
  7559. ChoutiPanView.prototype.timeoutCallback = function () {
  7560. this._iscanmove = true;
  7561. };
  7562. ChoutiPanView.prototype.upclick = function () {
  7563. if (this._isdown) {
  7564. this._isdown = false;
  7565. this._nowvalue = this.list_1.scrollPane.percY;
  7566. Laya.timer.once(2000, this, this.timeoutCallback);
  7567. }
  7568. };
  7569. ChoutiPanView.prototype.update = function (dt) {
  7570. if (this._isStart) {
  7571. if (this.list_1.scrollPane && this._nowList1 && this._iscanmove) {
  7572. if (this.dir) {
  7573. this._nowvalue += 0.001;
  7574. if (this._nowvalue >= 1) {
  7575. this._nowvalue = 1;
  7576. this.dir = false;
  7577. }
  7578. }
  7579. else {
  7580. this._nowvalue -= 0.001;
  7581. if (this._nowvalue <= 0) {
  7582. this._nowvalue = 0;
  7583. this.dir = true;
  7584. }
  7585. }
  7586. this.list_1.scrollPane.setPercY(this._nowvalue);
  7587. }
  7588. }
  7589. };
  7590. ChoutiPanView.prototype.onclosefun = function () {
  7591. if (this.isend == 1) {
  7592. ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
  7593. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
  7594. }
  7595. else if (this.isend == 2) {
  7596. var gold = RoleData_1.RoleData.Instance.levelcfg.winGold;
  7597. ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
  7598. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, gold);
  7599. }
  7600. else {
  7601. ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
  7602. }
  7603. };
  7604. ChoutiPanView.prototype.destory = function () {
  7605. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  7606. _super.prototype.destory.call(this);
  7607. };
  7608. ChoutiPanView.key = "ChoutiPanView";
  7609. return ChoutiPanView;
  7610. }(PanelBaseControl_1.PanelBaseControl));
  7611. exports.default = ChoutiPanView;
  7612. },{"../Control/PanelBaseControl":23,"../Data/RoleData":31,"../Time/TimerService":57,"../View/CompletePanel":59,"../View/ViewManager":68,"../utils/DispatcherManager":83,"../utils/GameState":84,"./RecommendView":53}],50:[function(require,module,exports){
  7613. "use strict";
  7614. Object.defineProperty(exports, "__esModule", { value: true });
  7615. var PanelChildControl_1 = require("../Control/PanelChildControl");
  7616. var CpaEvent_1 = require("./CpaEvent");
  7617. var RecommendView_1 = require("./RecommendView");
  7618. var TimerService_1 = require("../Time/TimerService");
  7619. var CpaDownsView = /** @class */ (function (_super) {
  7620. __extends(CpaDownsView, _super);
  7621. function CpaDownsView() {
  7622. var _this = _super.call(this) || this;
  7623. _this._iscanmove = false;
  7624. _this._movetime = 0;
  7625. _this._flushtime = 0;
  7626. _this.dir = true;
  7627. _this._nowvalue = 0;
  7628. return _this;
  7629. }
  7630. CpaDownsView.prototype.onInit = function () {
  7631. this.c_state = this.getController("c_state");
  7632. this.c_state.selectedIndex = 0;
  7633. this.initView();
  7634. this.initEvent();
  7635. };
  7636. CpaDownsView.prototype.initView = function () {
  7637. this.list_0.setVirtual();
  7638. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  7639. this._isStart = false;
  7640. };
  7641. CpaDownsView.prototype.initEvent = function () {
  7642. this.AddEventData(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler);
  7643. this.AddEventByType(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick);
  7644. this.AddEventByType(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick);
  7645. this.AddEventByType(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick);
  7646. };
  7647. CpaDownsView.prototype.downclick = function () {
  7648. this._isdown = true;
  7649. this._iscanmove = false;
  7650. Laya.timer.clear(this, this.timeoutCallback);
  7651. // ttad.CreateMoreGameBtn();
  7652. };
  7653. CpaDownsView.prototype.timeoutCallback = function () {
  7654. this._iscanmove = true;
  7655. };
  7656. CpaDownsView.prototype.upclick = function () {
  7657. if (this._isdown) {
  7658. this._isdown = false;
  7659. this._nowvalue = this.list_0.scrollPane.percX;
  7660. Laya.timer.once(2000, this, this.timeoutCallback);
  7661. }
  7662. };
  7663. CpaDownsView.prototype.update = function (dt) {
  7664. if (this._isStart) {
  7665. if (this.list_0.scrollPane && this._nowList && this._iscanmove) {
  7666. if (this.dir) {
  7667. this._nowvalue += 0.001;
  7668. if (this._nowvalue >= 1) {
  7669. this._nowvalue = 1;
  7670. this.dir = false;
  7671. }
  7672. }
  7673. else {
  7674. this._nowvalue -= 0.001;
  7675. if (this._nowvalue <= 0) {
  7676. this._nowvalue = 0;
  7677. this.dir = true;
  7678. }
  7679. }
  7680. this.list_0.scrollPane.setPercX(this._nowvalue);
  7681. }
  7682. }
  7683. };
  7684. CpaDownsView.prototype.itemrenderlist = function (index, item) {
  7685. if (index < this._nowList.length) {
  7686. item.showData(this._nowList[index], true);
  7687. }
  7688. };
  7689. CpaDownsView.prototype.yqhomedataHandler = function () {
  7690. this.c_state.selectedIndex = 1;
  7691. this._nowList = RecommendView_1.Recommend.cainixihuanData;
  7692. this.list_0.numItems = this._nowList.length;
  7693. for (var i = 0; i < this._nowList.length; i++) {
  7694. }
  7695. this._isStart = true;
  7696. this._iscanmove = true;
  7697. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  7698. };
  7699. CpaDownsView.prototype.dispose = function () {
  7700. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  7701. _super.prototype.dispose.call(this);
  7702. };
  7703. return CpaDownsView;
  7704. }(PanelChildControl_1.PanelChildControl));
  7705. exports.default = CpaDownsView;
  7706. },{"../Control/PanelChildControl":24,"../Time/TimerService":57,"./CpaEvent":51,"./RecommendView":53}],51:[function(require,module,exports){
  7707. "use strict";
  7708. Object.defineProperty(exports, "__esModule", { value: true });
  7709. var CpaEvent = /** @class */ (function () {
  7710. function CpaEvent() {
  7711. }
  7712. CpaEvent.YQHomeData = "CpaEvent_YQHomeData";
  7713. return CpaEvent;
  7714. }());
  7715. exports.default = CpaEvent;
  7716. },{}],52:[function(require,module,exports){
  7717. "use strict";
  7718. Object.defineProperty(exports, "__esModule", { value: true });
  7719. var PanelChildControl_1 = require("../Control/PanelChildControl");
  7720. var GameUtils_1 = require("../utils/GameUtils");
  7721. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  7722. var CpaItem = /** @class */ (function (_super) {
  7723. __extends(CpaItem, _super);
  7724. function CpaItem() {
  7725. var _this = _super.call(this) || this;
  7726. _this.ispenchoutipan = false;
  7727. return _this;
  7728. }
  7729. CpaItem.prototype.onInit = function () {
  7730. this.name = "capItem";
  7731. this.AddEventByType(this, Laya.Event.CLICK, this, this.onbtnclick);
  7732. };
  7733. CpaItem.prototype.onbtnclick = function () {
  7734. if (this._vo) {
  7735. var data = this._vo;
  7736. FYHD_Sdk_1.FYHD_Sdk.ShowHuTuiJump(data, this.ispenchoutipan);
  7737. // var appid = data.to_appid;
  7738. // var path = data.jump_path;
  7739. // let param = {"appId":appid.toString(),"path":path.toString()};
  7740. // if(Laya.Browser.onMobile)
  7741. // {
  7742. // Laya.Browser.window.wx.navigateToMiniProgram(
  7743. // {
  7744. // appId:appid.toString(),
  7745. // path:path.toString(),
  7746. // success:res=>
  7747. // {
  7748. // WxApi.recordAldEvent("跳转到游戏失成功","1");
  7749. // },
  7750. // fail:res=>
  7751. // {
  7752. // if( this.ispenchoutipan )
  7753. // {
  7754. // ViewManager.Instance.add( ChoutiPanView );
  7755. // }
  7756. // }
  7757. // });
  7758. // }
  7759. }
  7760. };
  7761. CpaItem.prototype.showData = function (data, isopenchoutipan) {
  7762. if (isopenchoutipan === void 0) { isopenchoutipan = false; }
  7763. this.ispenchoutipan = isopenchoutipan;
  7764. this._vo = data;
  7765. if (data) {
  7766. this.load_icon.url = data.icon;
  7767. if (this.txt_word) {
  7768. this.txt_word.text = data.togame_name;
  7769. }
  7770. if (this.img_tip) {
  7771. this.img_tip.visible = Math.random() > 0.5 ? true : false;
  7772. }
  7773. if (this.txt_word1) {
  7774. this.txt_word1.text = GameUtils_1.GameUtils.randRangeint(235470, 1561430).toString() + "人玩";
  7775. }
  7776. }
  7777. };
  7778. return CpaItem;
  7779. }(PanelChildControl_1.PanelChildControl));
  7780. exports.default = CpaItem;
  7781. },{"../Control/PanelChildControl":24,"../WXSDK/FYHD_Sdk":69,"../utils/GameUtils":85}],53:[function(require,module,exports){
  7782. "use strict";
  7783. Object.defineProperty(exports, "__esModule", { value: true });
  7784. var DispatcherManager_1 = require("../utils/DispatcherManager");
  7785. var CpaEvent_1 = require("./CpaEvent");
  7786. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  7787. var recommendPan = /** @class */ (function () {
  7788. function recommendPan(data) {
  7789. this.game_flg = data["game_flg"];
  7790. this.game_id = data["game_id"];
  7791. this.game_name = data["game_name"];
  7792. this.id = data["id"];
  7793. this.location_flg = data["location_flg"];
  7794. this.location_id = data["location_id"];
  7795. this.location_name = data["location_name"];
  7796. this.matter_type = data["matter_type"];
  7797. }
  7798. return recommendPan;
  7799. }());
  7800. exports.recommendPan = recommendPan;
  7801. var Recommend = /** @class */ (function () {
  7802. function Recommend() {
  7803. Recommend.InitData();
  7804. }
  7805. Recommend.InitData = function () {
  7806. Recommend.cainixihuanData = Recommend.GetCaiNiXiaHuanDatas();
  7807. Recommend.jiesuanData = Recommend.GetJIeSuanDatas();
  7808. Recommend.gdyxData = Recommend.GetGDYXDatas();
  7809. Recommend.baokuanyouxiData = Recommend.GetBaoKuanYouXiDatas();
  7810. Recommend.moreData = Recommend.GetMoreDatas();
  7811. for (var key in FYHD_Sdk_1.FYHD_Sdk.pushData) {
  7812. Recommend.recommendDic[FYHD_Sdk_1.FYHD_Sdk.pushData[key].location_flg] = new recommendPan(FYHD_Sdk_1.FYHD_Sdk.pushData[key]);
  7813. }
  7814. Recommend.getdata = true;
  7815. DispatcherManager_1.DispatcherManager.dispatchEvent(CpaEvent_1.default.YQHomeData);
  7816. console.log("互推数据初始化recommend--------------");
  7817. };
  7818. Recommend.GetSSDatas = function () {
  7819. var items = [];
  7820. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7821. return items;
  7822. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7823. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7824. }
  7825. return items;
  7826. };
  7827. Recommend.GetCaiNiXiaHuanDatas = function () {
  7828. var items = [];
  7829. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7830. return items;
  7831. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7832. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7833. }
  7834. return items;
  7835. };
  7836. Recommend.GetMoreDatas = function () {
  7837. var items = [];
  7838. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7839. return items;
  7840. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7841. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7842. }
  7843. return items;
  7844. };
  7845. Recommend.GetBaoKuanYouXiDatas = function () {
  7846. var items = [];
  7847. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7848. return items;
  7849. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7850. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7851. }
  7852. return items;
  7853. };
  7854. Recommend.GetJIeSuanDatas = function () {
  7855. var items = [];
  7856. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7857. return items;
  7858. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7859. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7860. }
  7861. return items;
  7862. };
  7863. Recommend.GetGDYXDatas = function () {
  7864. var items = [];
  7865. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7866. return items;
  7867. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7868. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7869. }
  7870. return items;
  7871. };
  7872. Recommend.getdata = false;
  7873. Recommend.recommendDic = {};
  7874. Recommend.cainixihuanData = [];
  7875. Recommend.baokuanyouxiData = [];
  7876. Recommend.gdyxData = [];
  7877. Recommend.jiesuanData = [];
  7878. Recommend.moreData = [];
  7879. return Recommend;
  7880. }());
  7881. exports.Recommend = Recommend;
  7882. var RecommendItem = /** @class */ (function () {
  7883. function RecommendItem(Data) {
  7884. this.icon = Data["icon"];
  7885. this.to_appid = Data["to_appid"];
  7886. this.togame_name = Data["togame_name"];
  7887. this.jump_path = Data["jump_path"];
  7888. this.jump_type = Data["jump_type"];
  7889. this.panel = Data["panel"];
  7890. this.qrcode = Data["qrcode"];
  7891. }
  7892. return RecommendItem;
  7893. }());
  7894. exports.RecommendItem = RecommendItem;
  7895. var RecommendView = /** @class */ (function () {
  7896. function RecommendView() {
  7897. }
  7898. return RecommendView;
  7899. }());
  7900. exports.default = RecommendView;
  7901. },{"../WXSDK/FYHD_Sdk":69,"../utils/DispatcherManager":83,"./CpaEvent":51}],54:[function(require,module,exports){
  7902. "use strict";
  7903. Object.defineProperty(exports, "__esModule", { value: true });
  7904. var PanelChildControl_1 = require("../Control/PanelChildControl");
  7905. var RecommendView_1 = require("./RecommendView");
  7906. var TimerService_1 = require("../Time/TimerService");
  7907. // import { ttad } from "../ttad";
  7908. var ShiwantuijianView = /** @class */ (function (_super) {
  7909. __extends(ShiwantuijianView, _super);
  7910. function ShiwantuijianView() {
  7911. var _this = _super.call(this) || this;
  7912. _this._iscanmove = false;
  7913. _this._movetime = 0;
  7914. _this._flushtime = 0;
  7915. _this.dir = true;
  7916. _this._nowvalue = 0;
  7917. return _this;
  7918. }
  7919. ShiwantuijianView.prototype.onInit = function () {
  7920. this.initView();
  7921. this.initEvent();
  7922. };
  7923. ShiwantuijianView.prototype.initView = function () {
  7924. this.list_0.setVirtual();
  7925. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  7926. this._nowlist = RecommendView_1.Recommend.jiesuanData;
  7927. if (this._nowlist.length > 0) {
  7928. this.list_0.numItems = this._nowlist.length;
  7929. this.visible = true;
  7930. for (var i = 0; i < this._nowlist.length; i++) {
  7931. }
  7932. this._isStart = true;
  7933. this._iscanmove = true;
  7934. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  7935. }
  7936. else {
  7937. this.visible = false;
  7938. }
  7939. };
  7940. ShiwantuijianView.prototype.initEvent = function () {
  7941. this.AddEventByType(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick);
  7942. this.AddEventByType(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick);
  7943. this.AddEventByType(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick);
  7944. };
  7945. ShiwantuijianView.prototype.downclick = function () {
  7946. this._isdown = true;
  7947. this._iscanmove = false;
  7948. Laya.timer.clear(this, this.timeoutCallback);
  7949. // ttad.CreateMoreGameBtn();
  7950. };
  7951. ShiwantuijianView.prototype.timeoutCallback = function () {
  7952. this._iscanmove = true;
  7953. };
  7954. ShiwantuijianView.prototype.upclick = function () {
  7955. if (this._isdown) {
  7956. this._isdown = false;
  7957. this._nowvalue = this.list_0.scrollPane.percY;
  7958. Laya.timer.once(2000, this, this.timeoutCallback);
  7959. }
  7960. };
  7961. ShiwantuijianView.prototype.itemrenderlist = function (index, item) {
  7962. if (index < this._nowlist.length) {
  7963. item.showData(this._nowlist[index], true);
  7964. }
  7965. };
  7966. ShiwantuijianView.prototype.update = function (dt) {
  7967. if (this._isStart) {
  7968. if (this.list_0.scrollPane && this._nowlist && this._nowlist.length > 0 && this._iscanmove) {
  7969. if (this.dir) {
  7970. this._nowvalue += 0.001;
  7971. if (this._nowvalue >= 1) {
  7972. this._nowvalue = 1;
  7973. this.dir = false;
  7974. }
  7975. }
  7976. else {
  7977. this._nowvalue -= 0.001;
  7978. if (this._nowvalue <= 0) {
  7979. this._nowvalue = 0;
  7980. this.dir = true;
  7981. }
  7982. }
  7983. this.list_0.scrollPane.setPercY(this._nowvalue);
  7984. }
  7985. }
  7986. };
  7987. ShiwantuijianView.prototype.dispose = function () {
  7988. this._iscanmove = false;
  7989. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  7990. _super.prototype.dispose.call(this);
  7991. };
  7992. return ShiwantuijianView;
  7993. }(PanelChildControl_1.PanelChildControl));
  7994. exports.default = ShiwantuijianView;
  7995. },{"../Control/PanelChildControl":24,"../Time/TimerService":57,"./RecommendView":53}],55:[function(require,module,exports){
  7996. "use strict";
  7997. Object.defineProperty(exports, "__esModule", { value: true });
  7998. var RecommendView_1 = require("./RecommendView");
  7999. var ViewManager_1 = require("../View/ViewManager");
  8000. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  8001. var GameUtils_1 = require("../utils/GameUtils");
  8002. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  8003. var TuijianView = /** @class */ (function (_super) {
  8004. __extends(TuijianView, _super);
  8005. function TuijianView() {
  8006. return _super.call(this, "main", "tuijianView") || this;
  8007. }
  8008. TuijianView.prototype.initView = function () {
  8009. this.list_1.setVirtual();
  8010. this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false);
  8011. this.list_2.setVirtual();
  8012. this.list_2.itemRenderer = Laya.Handler.create(this, this.itemrenderlist2, null, false);
  8013. this._nowlist1 = RecommendView_1.Recommend.gdyxData;
  8014. this._nowlist2 = RecommendView_1.Recommend.gdyxData;
  8015. this.list_1.numItems = 7;
  8016. this.list_2.numItems = this._nowlist2.length;
  8017. };
  8018. TuijianView.prototype.initEvent = function () {
  8019. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
  8020. this.AddEventByType(this.more, Laya.Event.CLICK, this, this.JumpApp);
  8021. };
  8022. TuijianView.prototype.itemrenderlist1 = function (index, item) {
  8023. if (index < 7) {
  8024. item.showData(this._nowlist1[index]);
  8025. }
  8026. };
  8027. TuijianView.prototype.itemrenderlist2 = function (index, item) {
  8028. if (index < this._nowlist2.length) {
  8029. item.showData(this._nowlist2[index]);
  8030. }
  8031. };
  8032. TuijianView.prototype.onclosefun = function () {
  8033. ViewManager_1.ViewManager.Instance.close(TuijianView);
  8034. };
  8035. //随机跳转游戏
  8036. TuijianView.prototype.JumpApp = function () {
  8037. var ran = GameUtils_1.GameUtils.randRangeint(0, this._nowlist1.length - 1);
  8038. FYHD_Sdk_1.FYHD_Sdk.ShowHuTuiJump(this._nowlist1[ran], false);
  8039. };
  8040. TuijianView.key = "TuijianView";
  8041. return TuijianView;
  8042. }(PanelBaseControl_1.PanelBaseControl));
  8043. exports.default = TuijianView;
  8044. },{"../Control/PanelBaseControl":23,"../View/ViewManager":68,"../WXSDK/FYHD_Sdk":69,"../utils/GameUtils":85,"./RecommendView":53}],56:[function(require,module,exports){
  8045. "use strict";
  8046. Object.defineProperty(exports, "__esModule", { value: true });
  8047. var TimeUtils = /** @class */ (function () {
  8048. function TimeUtils() {
  8049. }
  8050. /**
  8051. * 月/日 小时:分钟
  8052. * @param value
  8053. */
  8054. TimeUtils.formatData = function (value) {
  8055. var str = "";
  8056. var date = new Date(value * 1000);
  8057. str = this.getTwo(date.getMonth() + 1) + "/" + this.getTwo(date.getDate()) + " " + this.getTwo(date.getHours()) + ":" + this.getTwo(date.getMinutes());
  8058. return str;
  8059. };
  8060. /**
  8061. * 月/日
  8062. * @param value
  8063. */
  8064. TimeUtils.formatData1 = function (value) {
  8065. var str = "";
  8066. var date = new Date(value * 1000);
  8067. str = (date.getMonth() + 1) + "月" + date.getDate() + "日";
  8068. return str;
  8069. };
  8070. /**
  8071. * 年月日
  8072. * @param value
  8073. */
  8074. TimeUtils.formatYearMonthDate = function (value) {
  8075. var str = "";
  8076. var date = new Date(value * 1000);
  8077. str = date.getFullYear() + "." + (date.getMonth() + 1) + "." + date.getDate();
  8078. return str;
  8079. };
  8080. /**
  8081. * 年-月-日
  8082. * @param value
  8083. */
  8084. TimeUtils.formatYearMonthDate1 = function (value) {
  8085. var str = "";
  8086. var date = new Date(value * 1000);
  8087. var month = (date.getMonth() + 1) >= 10 ? (date.getMonth() + 1).toString() : "0" + (date.getMonth() + 1);
  8088. var dates = date.getDate() >= 10 ? date.getDate().toString() : "0" + date.getDate();
  8089. str = date.getFullYear() + "-" + month + "-" + dates;
  8090. return str;
  8091. };
  8092. TimeUtils.LXandJXTimeType = function (value) {
  8093. var str = "";
  8094. if (value < 0) {
  8095. str = "0秒";
  8096. }
  8097. else if (value < 60) {
  8098. str = Math.floor(value) + "秒";
  8099. }
  8100. else if (value < 60 * 60) {
  8101. str = Math.floor(value / 60) + "分钟";
  8102. }
  8103. else {
  8104. var hour;
  8105. hour = Math.floor(value / 60 / 60);
  8106. str = hour + "小时";
  8107. str += Math.floor((value - hour * 60 * 60) / 60) + "分钟";
  8108. }
  8109. return str;
  8110. };
  8111. /**
  8112. * 格式化时间
  8113. * @param time 秒
  8114. * @return 返回24:59:59
  8115. */
  8116. TimeUtils.formatTime = function (time) {
  8117. var str = "";
  8118. var hours = Math.floor(time / 3600);
  8119. if (hours > 0) {
  8120. str += hours >= 10 ? (hours + ":") : ("0" + hours + ":");
  8121. }
  8122. var minutes = Math.floor((time % 3600) / 60);
  8123. str += minutes >= 10 ? (minutes + ":") : ("0" + minutes + ":");
  8124. var second = Math.floor(time % 60);
  8125. str += second >= 10 ? (second + "") : ("0" + second);
  8126. return str;
  8127. };
  8128. /**
  8129. * 格式化时间
  8130. * @param time 秒
  8131. * @return 返回24小时59分59秒
  8132. */
  8133. TimeUtils.formatTime1 = function (time) {
  8134. var str = "";
  8135. var hours = Math.floor(time / 3600);
  8136. if (hours > 0) {
  8137. str += hours + "小时";
  8138. }
  8139. var minutes = Math.floor((time % 3600) / 60);
  8140. str += minutes + "分钟";
  8141. var second = Math.floor(time % 60);
  8142. str += second + "秒";
  8143. return str;
  8144. };
  8145. /**
  8146. * 格式化时间
  8147. * @param time 秒
  8148. * @return 返回1小时24分10秒
  8149. */
  8150. TimeUtils.formatTime5 = function (time) {
  8151. var str = "";
  8152. var hours = Math.floor(time / 3600);
  8153. if (hours > 0) {
  8154. str += hours + "小时";
  8155. }
  8156. var minutes = Math.floor((time % 3600) / 60);
  8157. if (minutes > 0) {
  8158. str += minutes + "分";
  8159. }
  8160. var second = Math.floor(time % 60);
  8161. str += second + "秒";
  8162. return str;
  8163. };
  8164. /**
  8165. * 格式化时间
  8166. * @param time 秒
  8167. * @return 返回1天24小时59分59秒
  8168. */
  8169. TimeUtils.formatTime2 = function (time) {
  8170. var str = "";
  8171. var day = Math.floor(time / 86400);
  8172. if (day > 0) {
  8173. str += day + "天";
  8174. }
  8175. var hours = Math.floor(time / 3600);
  8176. if (hours > 0) {
  8177. str += hours + "小时";
  8178. }
  8179. var minutes = Math.floor((time % 3600) / 60);
  8180. if (minutes > 0) {
  8181. str += minutes + "分钟";
  8182. }
  8183. var second = Math.ceil(time % 60);
  8184. str += second + "秒";
  8185. return str;
  8186. };
  8187. /**
  8188. * 格式化时间
  8189. * @param time 秒
  8190. * @return 返回1天24小时( 只保留两个 )
  8191. */
  8192. TimeUtils.formatTime6 = function (time) {
  8193. var str = "";
  8194. var index = 0;
  8195. var day = Math.floor(time / 86400);
  8196. if (day > 0) {
  8197. str += day + "天";
  8198. index++;
  8199. }
  8200. var hours = Math.floor((time % 86400) / 3600);
  8201. if (hours > 0) {
  8202. str += hours + "小时";
  8203. index++;
  8204. }
  8205. if (index < 2) {
  8206. var minutes = Math.floor((time % 3600) / 60);
  8207. if (minutes > 0) {
  8208. str += minutes + "分";
  8209. index++;
  8210. }
  8211. }
  8212. if (index < 2) {
  8213. var second = Math.ceil(time % 60);
  8214. str += second + "秒";
  8215. }
  8216. return str;
  8217. };
  8218. /**
  8219. * 格式化时间
  8220. * @param time 秒
  8221. * @return 返回1天24小时59分
  8222. */
  8223. TimeUtils.formatTime3 = function (time) {
  8224. var str = "";
  8225. var day = Math.floor(time / 86400);
  8226. str += day + "天";
  8227. var hours = Math.floor(time % 86400 / 3600);
  8228. str += hours + "小时";
  8229. var minutes = Math.floor((time % 86400 % 3600) / 60);
  8230. str += minutes + "分";
  8231. return str;
  8232. };
  8233. /**
  8234. * 格式化时间
  8235. * @param time 秒
  8236. * @return 返回1天24小时59分
  8237. */
  8238. TimeUtils.formatTime4 = function (time) {
  8239. var str = "";
  8240. if (time > 86400) {
  8241. var day = Math.floor(time / 86400);
  8242. str += day + "天";
  8243. }
  8244. if (time > 3600) {
  8245. var hours = Math.floor(time % 86400 / 3600);
  8246. str += hours + "小时";
  8247. }
  8248. if (time > 60) {
  8249. var minutes = Math.floor((time % 86400 % 3600) / 60);
  8250. str += minutes + "分钟";
  8251. }
  8252. return str;
  8253. };
  8254. /**
  8255. * 格式化时间
  8256. * @param time 秒
  8257. * @return 返回1天24小时59分
  8258. */
  8259. TimeUtils.formatTime4Arr = function (time) {
  8260. var arrTime = [];
  8261. var str = "";
  8262. // if (time >= 86400) {
  8263. // var day: number = Math.floor(time / 86400);
  8264. // arrTime.unshift(String(day));
  8265. // }
  8266. if (time >= 3600) {
  8267. var hours = Math.floor(time % 86400 / 3600);
  8268. arrTime.unshift(String(hours));
  8269. }
  8270. if (time >= 60) {
  8271. var minutes = Math.floor((time % 86400 % 3600) / 60);
  8272. arrTime.unshift(String(minutes));
  8273. }
  8274. return arrTime;
  8275. };
  8276. TimeUtils.getTwo = function (value) {
  8277. var str = String(value);
  8278. if (str.length < 2) {
  8279. str = "0" + str;
  8280. }
  8281. return str;
  8282. };
  8283. /**
  8284. * 日期转时间戳
  8285. * @param str 2018-1-1
  8286. */
  8287. TimeUtils.datetoTime = function (str) {
  8288. return Date.parse(str) / 1000;
  8289. };
  8290. return TimeUtils;
  8291. }());
  8292. exports.TimeUtils = TimeUtils;
  8293. },{}],57:[function(require,module,exports){
  8294. "use strict";
  8295. Object.defineProperty(exports, "__esModule", { value: true });
  8296. /*
  8297. * name;
  8298. */
  8299. var TimerService = /** @class */ (function (_super) {
  8300. __extends(TimerService, _super);
  8301. function TimerService() {
  8302. var _this = _super.call(this) || this;
  8303. _this._timeScale = 1;
  8304. _this._unscalableList = [];
  8305. TimerService.ins = _this;
  8306. return _this;
  8307. }
  8308. Object.defineProperty(TimerService, "Instance", {
  8309. get: function () {
  8310. if (TimerService.ins == null) {
  8311. return new TimerService();
  8312. }
  8313. return TimerService.ins;
  8314. },
  8315. enumerable: true,
  8316. configurable: true
  8317. });
  8318. TimerService.prototype.init = function () {
  8319. Laya.timer.frameLoop(1, this, this.onTimer);
  8320. };
  8321. TimerService.prototype.initEvent = function () {
  8322. };
  8323. TimerService.prototype.stop = function () {
  8324. Laya.timer.clear(this, this.onTimer);
  8325. };
  8326. TimerService.prototype.recover = function () {
  8327. this.stop();
  8328. Laya.timer.frameLoop(1, this, this.onTimer);
  8329. };
  8330. TimerService.prototype.onTimer = function () {
  8331. var i = 0;
  8332. for (i = 0; i < this._unscalableList.length; i++) {
  8333. this._unscalableList[i].update(Laya.timer.delta * this._timeScale);
  8334. }
  8335. };
  8336. TimerService.prototype.hasUpdataTarget = function (updateTarget) {
  8337. var index;
  8338. index = this._unscalableList.indexOf(updateTarget);
  8339. if (index != -1) {
  8340. return true;
  8341. }
  8342. return false;
  8343. };
  8344. TimerService.prototype.addUpdateTarget = function (updateTarget) {
  8345. var index;
  8346. index = this._unscalableList.indexOf(updateTarget);
  8347. if (index == -1) {
  8348. this._unscalableList.push(updateTarget);
  8349. }
  8350. };
  8351. TimerService.prototype.removeUpdateTarget = function (updateTarget) {
  8352. var index = this._unscalableList.indexOf(updateTarget);
  8353. if (index != -1) {
  8354. this._unscalableList.splice(index, 1);
  8355. }
  8356. };
  8357. Object.defineProperty(TimerService.prototype, "timeScale", {
  8358. get: function () {
  8359. return this._timeScale;
  8360. },
  8361. /**
  8362. * @private
  8363. */
  8364. set: function (value) {
  8365. if (value < 0 || isNaN(value)) {
  8366. value = 1;
  8367. }
  8368. this._timeScale = value;
  8369. },
  8370. enumerable: true,
  8371. configurable: true
  8372. });
  8373. return TimerService;
  8374. }(Laya.EventDispatcher));
  8375. exports.TimerService = TimerService;
  8376. },{}],58:[function(require,module,exports){
  8377. "use strict";
  8378. Object.defineProperty(exports, "__esModule", { value: true });
  8379. var UserDataInfo_1 = require("../Data/UserDataInfo");
  8380. var LocalDataControl_1 = require("../Control/LocalDataControl");
  8381. var TimesTamper = /** @class */ (function () {
  8382. function TimesTamper() {
  8383. this.lastgameTime = 0;
  8384. /**
  8385. * 同步服务器时间(秒)
  8386. */
  8387. this._serverTime = 0;
  8388. this.iscan = false;
  8389. this._onlinedistime = 0;
  8390. this._time = 0;
  8391. this._onlinetime = 0;
  8392. }
  8393. Object.defineProperty(TimesTamper, "Instance", {
  8394. get: function () {
  8395. if (TimesTamper.ins == null) {
  8396. return new TimesTamper();
  8397. }
  8398. return TimesTamper.ins;
  8399. },
  8400. enumerable: true,
  8401. configurable: true
  8402. });
  8403. TimesTamper.prototype.init = function () {
  8404. this.lastgameTime = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.lasttime);
  8405. Laya.timer.frameLoop(1, this, this.update);
  8406. };
  8407. TimesTamper.prototype.updateServiceTime = function (serverTime) {
  8408. this._serverTime = Number(serverTime);
  8409. this.iscan = true;
  8410. this._onlinedistime = this._serverTime;
  8411. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lasttime, this._serverTime.toString());
  8412. };
  8413. TimesTamper.prototype.update = function () {
  8414. if (this.iscan) {
  8415. this._time += Laya.timer.delta;
  8416. this._onlinetime += Laya.timer.delta;
  8417. this._serverTime += Laya.timer.delta / 1000;
  8418. if (this._time >= 30000) {
  8419. this._time = 0;
  8420. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lasttime, this._serverTime.toString());
  8421. }
  8422. if (this._onlinetime >= 90000) {
  8423. this._onlinetime = 0;
  8424. this.sendonlineTongji();
  8425. }
  8426. }
  8427. };
  8428. TimesTamper.prototype.sendonlineTongji = function () {
  8429. var distime = this.serverTime - this._onlinedistime;
  8430. if (distime > 0) {
  8431. this._onlinedistime = this.serverTime;
  8432. }
  8433. };
  8434. Object.defineProperty(TimesTamper.prototype, "serverTime", {
  8435. /**
  8436. * 服务器时间 ( 秒 )
  8437. * @return
  8438. *
  8439. */
  8440. get: function () {
  8441. return this._serverTime;
  8442. },
  8443. enumerable: true,
  8444. configurable: true
  8445. });
  8446. return TimesTamper;
  8447. }());
  8448. exports.TimesTamper = TimesTamper;
  8449. },{"../Control/LocalDataControl":22,"../Data/UserDataInfo":33}],59:[function(require,module,exports){
  8450. "use strict";
  8451. Object.defineProperty(exports, "__esModule", { value: true });
  8452. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  8453. var ViewAction_1 = require("../utils/ViewAction");
  8454. var GameStateControl_1 = require("../Control/GameStateControl");
  8455. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  8456. var AgencyInGame_1 = require("../Agency/AgencyInGame");
  8457. var ViewManager_1 = require("../View/ViewManager");
  8458. var GuangGao_1 = require("../WXSDK/GuangGao");
  8459. var GameState_1 = require("../utils/GameState");
  8460. var Player_1 = require("../Game/Player");
  8461. var PropManager_1 = require("../PrefabControl/PropManager");
  8462. var DispatcherManager_1 = require("../utils/DispatcherManager");
  8463. var CharacterState_1 = require("../PrefabControl/CharacterState");
  8464. var RecordManager_1 = require("../WXSDK/RecordManager");
  8465. var ttad_1 = require("../WXSDK/ttad");
  8466. // import ChoutiPanView from "../Push/ChoutiPanView";
  8467. var CompletePanel = /** @class */ (function (_super) {
  8468. __extends(CompletePanel, _super);
  8469. function CompletePanel(gold) {
  8470. var _this = _super.call(this, "main", "gameresult", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  8471. _this.getgold = 0;
  8472. _this._position = new Laya.Vector3();
  8473. _this._outPos = new Laya.Vector3();
  8474. _this.scaleDelta = 0;
  8475. _this.scale = new Laya.Vector3(0.1, 0.1, 0.1);
  8476. _this.time = 9;
  8477. _this.count = false;
  8478. _this.fuhuo = false;
  8479. _this.getgold = gold;
  8480. return _this;
  8481. }
  8482. /*************************************************************** */
  8483. CompletePanel.prototype.loadScene = function () {
  8484. Laya.Scene3D.load("res/threeDimen/scene/ParticleScene/Example_01.ls", Laya.Handler.create(this, function (scene) {
  8485. this.scene = Laya.stage.addChildAt(scene, 0);
  8486. var camera = this.scene.addChild(new Laya.Camera(0, 0.1, 100));
  8487. camera.transform.translate(new Laya.Vector3(0, 1, 0));
  8488. }));
  8489. };
  8490. CompletePanel.prototype.garbageCollection = function () {
  8491. this.scene.destroy(); //销毁场景
  8492. this.scene = null;
  8493. Laya.Resource.destroyUnusedResources(); //销毁无用资源(没有被场景树引用,并且没有加资源锁的)
  8494. };
  8495. /*************************************************************** */
  8496. CompletePanel.prototype.btn1click = function () {
  8497. if (this.c_state.selectedIndex == 0) {
  8498. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
  8499. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).LevelUp();
  8500. this._gameProxy.returnmainview(true);
  8501. }
  8502. else if (this.c_state.selectedIndex == 1) {
  8503. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
  8504. this._gameProxy.returnmainview();
  8505. // ViewManager.Instance.add( ChoutiPanView );
  8506. }
  8507. else if (this.c_state.selectedIndex == 2) {
  8508. // ShareUtil.shareImage("分享复活----",this.sharerevive,"1")
  8509. this.sharerevive();
  8510. }
  8511. };
  8512. CompletePanel.prototype.onComplete = function () {
  8513. Laya.Sprite3D.load("res/threeDimen/skinModel/LayaMonkey/LayaMonkey.lh", Laya.Handler.create(this, function (layaMonkey3D) {
  8514. this.layaMonkey3D = layaMonkey3D;
  8515. this.scene.addChild(layaMonkey3D);
  8516. this.layaMonkey2D = Laya.stage.addChild(new Laya.Image("res/threeDimen/monkey.png"));
  8517. Laya.timer.frameLoop(1, this, this.animate);
  8518. }));
  8519. };
  8520. CompletePanel.prototype.animate = function () {
  8521. this._position.x = Math.sin(this.scaleDelta += 0.01);
  8522. this.layaMonkey3D.transform.position = this._position;
  8523. this.layaMonkey3D.transform.scale = this.scale;
  8524. //转换坐标
  8525. this.camera.viewport.project(this.layaMonkey3D.transform.position, this.camera.projectionViewMatrix, this._outPos);
  8526. //赋值给2D
  8527. this.layaMonkey2D.pos(this._outPos.x / Laya.stage.clientScaleX, this._outPos.y / Laya.stage.clientScaleY);
  8528. };
  8529. /******************************************** */
  8530. CompletePanel.prototype.btn0click = function () {
  8531. if (this.c_state.selectedIndex == 0) {
  8532. this.playvideocallback();
  8533. // pingtaiutils.Instance.playVideo( "",this,this.playvideocallback );
  8534. }
  8535. else if (this.c_state.selectedIndex == 1) {
  8536. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
  8537. this._gameProxy.returnmainview();
  8538. // ViewManager.Instance.add( ChoutiPanView );
  8539. }
  8540. else if (this.c_state.selectedIndex == 2) {
  8541. this.count = false;
  8542. // pingtaiutils.Instance.playVideo("",this,this.playvideorevive);
  8543. this.playvideorevive();
  8544. }
  8545. };
  8546. /**看视频复活成功 */
  8547. CompletePanel.prototype.playvideorevive = function () {
  8548. var _this = this;
  8549. ttad_1.ttad.ShowVideo((function (isLoad) {
  8550. if (isLoad) {
  8551. // ViewManager.Instance.add(ChoutiPanView);
  8552. GameState_1.GameState.fuhuocishu--;
  8553. ViewManager_1.ViewManager.Instance.close(CompletePanel);
  8554. GameState_1.GameState.isdie = false;
  8555. Player_1.Player.Instance._iscanMove = true;
  8556. // Player.Instance.PlayAnimator( CharacterState.run );
  8557. Player_1.Player.Instance.nowAction = CharacterState_1.CharacterState.run;
  8558. if (Player_1.Player.Instance._nowscenename == "" || Player_1.Player.Instance._nowbuildname == "") {
  8559. console.log("玩家位置----", Player_1.Player.Instance._initPosVec);
  8560. console.log("玩家速度_moveVec", Player_1.Player.Instance._moveVec);
  8561. Player_1.Player.Instance._transform.position = new Laya.Vector3(0, 1, 3);
  8562. }
  8563. else {
  8564. console.log("当前场景名字---", Player_1.Player.Instance._nowscenename);
  8565. console.log("当前建筑名字---", Player_1.Player.Instance._nowbuildname);
  8566. console.log("建筑物位置----", PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname));
  8567. Player_1.Player.Instance._transform.position = PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname).clone();
  8568. }
  8569. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed * 2;
  8570. Laya.timer.once(3000, _this, function () {
  8571. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed;
  8572. });
  8573. }
  8574. else {
  8575. _this.count = true;
  8576. }
  8577. }));
  8578. };
  8579. /**分享复活成功 */
  8580. CompletePanel.prototype.sharerevive = function () {
  8581. var _this = this;
  8582. RecordManager_1.RecordManager.Instance.ShareVideo(function (isLoad) {
  8583. if (isLoad) {
  8584. RecordManager_1.RecordManager.Instance.RecordStart();
  8585. GameState_1.GameState.fuhuocishu--;
  8586. // GameState.recordscree = true;
  8587. ViewManager_1.ViewManager.Instance.close(CompletePanel);
  8588. GameState_1.GameState.isdie = false;
  8589. Player_1.Player.Instance._iscanMove = true;
  8590. // Player.Instance.PlayAnimator( CharacterState.run );
  8591. Player_1.Player.Instance.nowAction = CharacterState_1.CharacterState.run;
  8592. if (Player_1.Player.Instance._nowscenename == "" || Player_1.Player.Instance._nowbuildname == "") {
  8593. console.log("玩家位置----", Player_1.Player.Instance._initPosVec);
  8594. Player_1.Player.Instance._transform.position = new Laya.Vector3(0, 1, 3);
  8595. }
  8596. else {
  8597. console.log("当前场景名字---", Player_1.Player.Instance._nowscenename);
  8598. console.log("当前建筑名字---", Player_1.Player.Instance._nowbuildname);
  8599. console.log("建筑物位置----", PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname));
  8600. Player_1.Player.Instance._transform.position = PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname).clone();
  8601. }
  8602. // GlobalTip.Instance.showWordTips("复活加速成功");
  8603. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed * 2;
  8604. Laya.timer.once(3000, _this, function () {
  8605. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed;
  8606. });
  8607. }
  8608. else {
  8609. _this.count = true;
  8610. }
  8611. });
  8612. // if(_success){
  8613. // // ViewManager.Instance.add(ChoutiPanView);
  8614. // GameState.fuhuocishu --;
  8615. // ViewManager.Instance.close( CompletePanel );
  8616. // GameState.isdie = false;
  8617. // Player.Instance._iscanMove = true;
  8618. // // Player.Instance.PlayAnimator( CharacterState.run );
  8619. // Player.Instance.nowAction = CharacterState.run;
  8620. // if (Player.Instance._nowscenename == "" || Player.Instance._nowbuildname == "") {
  8621. // console.log("玩家位置----",Player.Instance._initPosVec);
  8622. // Player.Instance._transform.position = Player.Instance._initPosVec.clone()
  8623. // }
  8624. // else {
  8625. // console.log("当前场景名字---",Player.Instance._nowscenename);
  8626. // console.log("当前建筑名字---",Player.Instance._nowbuildname);
  8627. // console.log("建筑物位置----",PropManager.getPosVecbyScene(Player.Instance._nowscenename, Player.Instance._nowbuildname));
  8628. // Player.Instance._transform.position = PropManager.getPosVecbyScene(Player.Instance._nowscenename, Player.Instance._nowbuildname).clone();
  8629. // }
  8630. // // GlobalTip.Instance.showWordTips("复活加速成功");
  8631. // Player.Instance._speedMoveV3.z = -Player.Instance._RoleData.movespeed*2;
  8632. // Laya.timer.once(3000,this,()=>{
  8633. // Player.Instance._speedMoveV3.z = -Player.Instance._RoleData.movespeed;
  8634. // })
  8635. // }
  8636. // else{
  8637. // this.count = true;
  8638. // }
  8639. };
  8640. CompletePanel.prototype.playvideocallback = function () {
  8641. var _this = this;
  8642. RecordManager_1.RecordManager.Instance.ShareVideo((function (isLoad) {
  8643. if (isLoad) {
  8644. _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(_this.getgold * 3);
  8645. _this._gameProxy.returnmainview(true);
  8646. }
  8647. }));
  8648. // ttad.ShowVideo((isLoad=>{
  8649. // if(isLoad){
  8650. // ( this.getProxy( AgencyUserMessage ) as AgencyUserMessage ).GoldUp( this.getgold*3 );
  8651. // this._gameProxy.returnmainview(true);
  8652. // }
  8653. // }))
  8654. };
  8655. CompletePanel.prototype.destory = function () {
  8656. Laya.timer.clear(this, this.CountTime);
  8657. // Laya.timer.clear(this,this.playanimator);
  8658. // GuangGao.Clear();
  8659. ttad_1.ttad.Clear();
  8660. _super.prototype.destory.call(this);
  8661. };
  8662. CompletePanel.prototype.initView = function () {
  8663. this.tianjia.visible = false;
  8664. this.TianJiaAni = this.getTransitionByName("tianjiaani");
  8665. this.TianJiaAni.stop();
  8666. // Laya.timer.loop(2000,this,this.playanimator);
  8667. this.count = true;
  8668. this._gameProxy = this.getProxy(AgencyInGame_1.AgencyInGame);
  8669. this.c_state = this.getControllerByBame("c_state");
  8670. this.txt_gold.text = this.getgold.toString();
  8671. if (GameState_1.GameState.recordscree) {
  8672. this.BattleBtn.visible = false;
  8673. }
  8674. else {
  8675. this.BattleBtn.visible = true;
  8676. }
  8677. // this.BattleBtn.visible = !GameState.recordscree;
  8678. if (!GameState_1.GameState.isdie) { //玩家未死亡的状态
  8679. if (GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0) {
  8680. this.c_state.selectedIndex = 0;
  8681. }
  8682. else {
  8683. this.c_state.selectedIndex = 1;
  8684. }
  8685. }
  8686. else {
  8687. if (GameState_1.GameState.fuhuocishu > 0) {
  8688. this.c_state.selectedIndex = 2;
  8689. Laya.timer.loop(1000, this, this.CountTime);
  8690. }
  8691. else {
  8692. this.c_state.selectedIndex = 1;
  8693. }
  8694. }
  8695. GuangGao_1.GuangGao.CheatBanner(this.btn_1);
  8696. };
  8697. CompletePanel.prototype.playanimator = function () {
  8698. this.TianJiaAni.play(null, 1);
  8699. };
  8700. CompletePanel.prototype.initEvent = function () {
  8701. this.AddEventByType(this.btn_0, Laya.Event.CLICK, this, this.btn0click);
  8702. this.AddEventByType(this.btn_1, Laya.Event.CLICK, this, this.btn1click);
  8703. this.AddEventByType(this.BattleBtn, Laya.Event.CLICK, this, this.ShareBattle);
  8704. };
  8705. //倒计时
  8706. CompletePanel.prototype.CountTime = function () {
  8707. if (this.count && this.time > 0) {
  8708. this.time -= 1;
  8709. this.timenum.text = this.time.toString();
  8710. if (this.time < 1) {
  8711. Laya.timer.clear(this, this.CountTime);
  8712. GameState_1.GameState.fuhuocishu--;
  8713. // Laya.timer.clear(this,this.playanimator);
  8714. ViewManager_1.ViewManager.Instance.close(CompletePanel);
  8715. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
  8716. }
  8717. }
  8718. };
  8719. //录屏分享
  8720. CompletePanel.prototype.ShareBattle = function () {
  8721. var _this = this;
  8722. RecordManager_1.RecordManager.Instance.ShareVideo(function (isLoad) {
  8723. if (isLoad) {
  8724. _this.BattleBtn.visible = false;
  8725. }
  8726. });
  8727. // RecordManager.Instance.ShareVideo((isLoad=>{
  8728. // if(isLoad){
  8729. // this.BattleBtn.visible = false;
  8730. // }
  8731. // }))
  8732. };
  8733. CompletePanel.key = "CompletePanel";
  8734. return CompletePanel;
  8735. }(PanelBaseControl_1.PanelBaseControl));
  8736. exports.CompletePanel = CompletePanel;
  8737. },{"../Agency/AgencyInGame":2,"../Agency/AgencyUserMessage":8,"../Control/GameStateControl":20,"../Control/PanelBaseControl":23,"../Game/Player":38,"../PrefabControl/CharacterState":44,"../PrefabControl/PropManager":47,"../View/ViewManager":68,"../WXSDK/GuangGao":70,"../WXSDK/RecordManager":74,"../WXSDK/ttad":81,"../utils/DispatcherManager":83,"../utils/GameState":84,"../utils/ViewAction":91}],60:[function(require,module,exports){
  8738. "use strict";
  8739. Object.defineProperty(exports, "__esModule", { value: true });
  8740. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  8741. var GameUtils_1 = require("../utils/GameUtils");
  8742. var TimerService_1 = require("../Time/TimerService");
  8743. var GuangGao_1 = require("../WXSDK/GuangGao");
  8744. var ViewAction_1 = require("../utils/ViewAction");
  8745. var ViewManager_1 = require("./ViewManager");
  8746. var SceneControl_1 = require("../Control/SceneControl");
  8747. var GameStateControl_1 = require("../Control/GameStateControl");
  8748. var GlobalTip_1 = require("../utils/GlobalTip");
  8749. var ttad_1 = require("../WXSDK/ttad");
  8750. var EggPanel = /** @class */ (function (_super) {
  8751. __extends(EggPanel, _super);
  8752. function EggPanel() {
  8753. var _this = _super.call(this, "main", "eggview", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  8754. _this._isComplete = false;
  8755. _this._isShowBanner = false;
  8756. _this._bannerVal = 0.5;
  8757. _this._maxClickCnt = 18;
  8758. _this._clickCnt = 0;
  8759. _this._interval = 100;
  8760. _this._decrement = 1;
  8761. _this._time = 0;
  8762. return _this;
  8763. }
  8764. EggPanel.prototype.initView = function () {
  8765. this.hitani = this.getTransitionByName("hitani");
  8766. this.pro_0.value = 1;
  8767. this._bannerVal = GameUtils_1.GameUtils.randRangefloat(0.2, 0.4);
  8768. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  8769. // GuangGao.CheatBanner(this.btn_1);
  8770. // GuangGao.Clear();//h["default"].Clear()r["default"]
  8771. ttad_1.ttad.Clear();
  8772. var sceneheight = Laya.stage.height;
  8773. this.btn_1.y = sceneheight - this.btn_1.height - 15;
  8774. this.getrewardbtn.y = this.btn_1.y;
  8775. this.getrewardbtn.visible = false;
  8776. if (SceneControl_1.SceneControl.EggGGroup == 0) {
  8777. this.n6.visible = true;
  8778. }
  8779. };
  8780. EggPanel.prototype.bannercallback = function () {
  8781. };
  8782. EggPanel.prototype.initEvent = function () {
  8783. this.AddEventByType(this.btn_1, Laya.Event.CLICK, this, this.qiaoDa);
  8784. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, EggPanel.onclosefun);
  8785. this.AddEventByType(this.getrewardbtn, Laya.Event.CLICK, this, EggPanel.VideoGetReward);
  8786. };
  8787. EggPanel.prototype.update = function (dt) {
  8788. this._time += dt;
  8789. if (this._time >= this._interval) {
  8790. this._time = 0;
  8791. this.Daojishi();
  8792. }
  8793. };
  8794. EggPanel.prototype.Daojishi = function () {
  8795. var pv = this.pro_0.value;
  8796. pv -= this._decrement;
  8797. if (pv <= 0)
  8798. pv = 1;
  8799. this.pro_0.value = pv;
  8800. this._clickCnt = Math.ceil(pv * this._maxClickCnt / 100);
  8801. };
  8802. EggPanel.prototype.qiaoDa = function () {
  8803. var _this = this;
  8804. if (!this._isComplete) {
  8805. if (this.hitani != null && !this.hitani.playing) {
  8806. this.hitani.play(null, 1);
  8807. }
  8808. this._clickCnt++;
  8809. if (this._clickCnt > this._maxClickCnt)
  8810. this._clickCnt = this._maxClickCnt;
  8811. var pv = this._clickCnt / this._maxClickCnt;
  8812. if (pv > 1) {
  8813. pv = 1;
  8814. }
  8815. this.pro_0.value = pv * 100;
  8816. if (pv >= this._bannerVal && !this._isShowBanner) {
  8817. this._isShowBanner = true;
  8818. this.getrewardbtn.visible = true;
  8819. // GuangGao.OpenBanner();
  8820. Laya.timer.once(2000, this, function () {
  8821. _this.getrewardbtn.visible = false;
  8822. });
  8823. }
  8824. if (pv >= 1) {
  8825. this._isComplete = true;
  8826. EggPanel.getreward();
  8827. }
  8828. }
  8829. };
  8830. EggPanel.getreward = function () {
  8831. // var zpproxy:AgencyLottery = this.getProxy( AgencyLottery ) as AgencyLottery;
  8832. // var index = ( this.getProxy( AgencyLottery ) as AgencyLottery ).GetReward();
  8833. // var selectcfg:LotteryCFG = LotteryCFG.vec[ index ];
  8834. // zpproxy.getreward( selectcfg );
  8835. // TimerService.Instance.removeUpdateTarget( this );
  8836. GlobalTip_1.GlobalTip.Instance.showWordTips("获得开局加速");
  8837. EggPanel.onclosefun();
  8838. };
  8839. //看视频得奖励
  8840. EggPanel.VideoGetReward = function () {
  8841. ttad_1.ttad.ShowVideo((function (isLoad) {
  8842. if (isLoad) {
  8843. GlobalTip_1.GlobalTip.Instance.showWordTips("获得开局加速");
  8844. EggPanel.onclosefun();
  8845. }
  8846. else {
  8847. EggPanel.onclosefun();
  8848. }
  8849. }));
  8850. };
  8851. EggPanel.prototype.hidebanner = function () {
  8852. // PlatformTool.getInstance().hideBanner("EggView");
  8853. GuangGao_1.GuangGao.hidebanner();
  8854. };
  8855. EggPanel.onclosefun = function () {
  8856. ViewManager_1.ViewManager.Instance.close(EggPanel);
  8857. };
  8858. EggPanel.prototype.destory = function () {
  8859. // PlatformTool.getInstance().hideBanner("EggView");
  8860. // GuangGao.hidebanner();
  8861. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  8862. _super.prototype.destory.call(this);
  8863. GameStateControl_1.GameStateControl.Instance.entergame(true);
  8864. };
  8865. EggPanel.key = "EggPanel";
  8866. return EggPanel;
  8867. }(PanelBaseControl_1.PanelBaseControl));
  8868. exports.default = EggPanel;
  8869. },{"../Control/GameStateControl":20,"../Control/PanelBaseControl":23,"../Control/SceneControl":27,"../Time/TimerService":57,"../WXSDK/GuangGao":70,"../WXSDK/ttad":81,"../utils/GameUtils":85,"../utils/GlobalTip":86,"../utils/ViewAction":91,"./ViewManager":68}],61:[function(require,module,exports){
  8870. "use strict";
  8871. Object.defineProperty(exports, "__esModule", { value: true });
  8872. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  8873. var GameUtils_1 = require("../utils/GameUtils");
  8874. var TimerService_1 = require("../Time/TimerService");
  8875. var GuangGao_1 = require("../WXSDK/GuangGao");
  8876. var ViewManager_1 = require("./ViewManager");
  8877. var GlobalTip_1 = require("../utils/GlobalTip");
  8878. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  8879. var RoleData_1 = require("../Data/RoleData");
  8880. var ttad_1 = require("../WXSDK/ttad");
  8881. var GiftView = /** @class */ (function (_super) {
  8882. __extends(GiftView, _super);
  8883. function GiftView() {
  8884. var _this = _super.call(this, "main", "giftcheatview") || this;
  8885. _this._isComplete = false;
  8886. _this._isShowBanner = false;
  8887. _this._bannerVal = 0.5;
  8888. _this._maxClickCnt = 18;
  8889. _this._clickCnt = 0;
  8890. _this._interval = 100;
  8891. _this._decrement = 1;
  8892. _this._time = 0;
  8893. return _this;
  8894. }
  8895. GiftView.prototype.initView = function () {
  8896. this.anniu = this.item.asCom.getChildAt(2);
  8897. this.kuaisudianji = this.item.asCom.getChildAt(0);
  8898. this.shou = this.item.asCom.getChildAt(3);
  8899. this.di = this.item.asCom.getChildAt(1);
  8900. this.getrewardbtn = this.item.asCom.getChildAt(4);
  8901. this.getrewardbtn.visible = false;
  8902. this.clickani = this.item.getTransition("clickbtnani");
  8903. this.jindu.value = 1;
  8904. this._bannerVal = GameUtils_1.GameUtils.randRangefloat(0.2, 0.4);
  8905. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  8906. // GuangGao.Clear();
  8907. ttad_1.ttad.Clear();
  8908. Laya.timer.loop(2000, this, this.playAnimator);
  8909. // var sceneheight = Laya.stage.height;
  8910. // this.btnbox.y=sceneheight-this.btnbox.y-15;
  8911. };
  8912. GiftView.prototype.playAnimator = function () {
  8913. this.clickani.play(null, 1);
  8914. };
  8915. GiftView.prototype.initEvent = function () {
  8916. this.AddEventByType(this.anniu, Laya.Event.CLICK, this, this.qiaoDa);
  8917. this.AddEventByType(this.getrewardbtn, Laya.Event.CLICK, this, this.VideoGetReward);
  8918. };
  8919. GiftView.prototype.update = function (dt) {
  8920. this._time += dt;
  8921. if (this._time >= this._interval) {
  8922. this._time = 0;
  8923. this.Daojishi();
  8924. }
  8925. };
  8926. GiftView.prototype.Daojishi = function () {
  8927. var pv = this.jindu.value;
  8928. pv -= this._decrement;
  8929. if (pv <= 0)
  8930. pv = 1;
  8931. this.jindu.value = pv;
  8932. this._clickCnt = Math.ceil(pv * this._maxClickCnt / 100);
  8933. };
  8934. GiftView.prototype.qiaoDa = function () {
  8935. var _this = this;
  8936. if (this.shou.visible) {
  8937. this.shou.visible = false;
  8938. this.kuaisudianji.visible = false;
  8939. Laya.timer.clear(this, this.playAnimator);
  8940. }
  8941. if (!this._isComplete) {
  8942. this._clickCnt++;
  8943. if (this._clickCnt > this._maxClickCnt)
  8944. this._clickCnt = this._maxClickCnt;
  8945. var pv = this._clickCnt / this._maxClickCnt;
  8946. if (pv > 1) {
  8947. pv = 1;
  8948. }
  8949. this.jindu.value = pv * 100;
  8950. if (pv >= this._bannerVal && !this._isShowBanner) {
  8951. this._isShowBanner = true;
  8952. this.getrewardbtn.visible = true;
  8953. Laya.timer.once(2000, this, function () {
  8954. _this.getrewardbtn.visible = false;
  8955. });
  8956. }
  8957. if (pv >= 1) {
  8958. this._isComplete = true;
  8959. GiftView.getreward();
  8960. }
  8961. }
  8962. };
  8963. GiftView.getreward = function () {
  8964. RoleData_1.RoleData.Instance.Money += PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward;
  8965. // ( this.getProxy( AgencyUserMessage ) as AgencyUserMessage ).GoldUp( PlayerAccount.CurrentAccount.CurAccountData.CheatReward );
  8966. // var index = ( this.getProxy( AgencyLottery ) as AgencyLottery ).GetReward();
  8967. // var selectcfg:LotteryCFG = LotteryCFG.vec[ index ];
  8968. // zpproxy.getreward( selectcfg );
  8969. // TimerService.Instance.removeUpdateTarget( this );
  8970. GlobalTip_1.GlobalTip.Instance.showWordTips("获得" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward + "金币");
  8971. GiftView.onclosefun();
  8972. };
  8973. //看视频得奖励
  8974. GiftView.prototype.VideoGetReward = function () {
  8975. ttad_1.ttad.ShowVideo((function (isLoad) {
  8976. if (isLoad) {
  8977. RoleData_1.RoleData.Instance.Money += PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward;
  8978. GlobalTip_1.GlobalTip.Instance.showWordTips("获得" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward + "金币");
  8979. GiftView.onclosefun();
  8980. }
  8981. else {
  8982. GiftView.onclosefun();
  8983. }
  8984. }));
  8985. };
  8986. GiftView.prototype.hidebanner = function () {
  8987. GuangGao_1.GuangGao.hidebanner();
  8988. };
  8989. GiftView.onclosefun = function () {
  8990. ViewManager_1.ViewManager.Instance.close(GiftView);
  8991. };
  8992. GiftView.prototype.destory = function () {
  8993. GuangGao_1.GuangGao.hidebanner();
  8994. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  8995. _super.prototype.destory.call(this);
  8996. };
  8997. GiftView.key = "GiftView";
  8998. return GiftView;
  8999. }(PanelBaseControl_1.PanelBaseControl));
  9000. exports.default = GiftView;
  9001. },{"../Control/PanelBaseControl":23,"../Data/RoleData":31,"../Time/TimerService":57,"../WXSDK/GuangGao":70,"../WXSDK/PlayerAccount":73,"../WXSDK/ttad":81,"../utils/GameUtils":85,"../utils/GlobalTip":86,"./ViewManager":68}],62:[function(require,module,exports){
  9002. "use strict";
  9003. Object.defineProperty(exports, "__esModule", { value: true });
  9004. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9005. var DispatcherManager_1 = require("../utils/DispatcherManager");
  9006. var GameState_1 = require("../utils/GameState");
  9007. /*
  9008. * name;
  9009. */
  9010. var WordTipsPanel = /** @class */ (function (_super) {
  9011. __extends(WordTipsPanel, _super);
  9012. function WordTipsPanel() {
  9013. var _this = _super.call(this, "loading", "wordTips") || this;
  9014. _this.nowword = "";
  9015. return _this;
  9016. }
  9017. /****************************************** */
  9018. WordTipsPanel.prototype.showText = function () {
  9019. var text = new Laya.Text();
  9020. text.text = "Orientation-Portrait";
  9021. text.color = "gray";
  9022. text.font = "Impact";
  9023. text.fontSize = 50;
  9024. text.x = Laya.stage.width - text.width >> 1;
  9025. text.y = Laya.stage.height - text.height >> 1;
  9026. Laya.stage.addChild(text);
  9027. };
  9028. /****************************************** */
  9029. WordTipsPanel.prototype.showWord = function (word) {
  9030. this.nowword = word;
  9031. this.text_word.text = word;
  9032. this.t1.play(Laya.Handler.create(this, this.playEndCallback), 1);
  9033. };
  9034. WordTipsPanel.prototype.onInit = function () {
  9035. _super.prototype.onInit.call(this);
  9036. this.t1 = this.getpanelTransition("t1");
  9037. };
  9038. WordTipsPanel.prototype.createCantralRect = function () {
  9039. this.rect = new Laya.Sprite();
  9040. this.rect.graphics.drawRect(-100, -100, 200, 200, "gray");
  9041. Laya.stage.addChild(this.rect);
  9042. this.updateRectPos();
  9043. };
  9044. WordTipsPanel.prototype.updateRectPos = function () {
  9045. this.rect.x = Laya.stage.width / 2;
  9046. this.rect.y = Laya.stage.height / 2;
  9047. };
  9048. /*************************************************** */
  9049. WordTipsPanel.prototype.playEndCallback = function () {
  9050. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.removeselect, this);
  9051. };
  9052. WordTipsPanel.key = "WordTipsPanel";
  9053. return WordTipsPanel;
  9054. }(PanelBaseControl_1.PanelBaseControl));
  9055. exports.WordTipsPanel = WordTipsPanel;
  9056. },{"../Control/PanelBaseControl":23,"../utils/DispatcherManager":83,"../utils/GameState":84}],63:[function(require,module,exports){
  9057. "use strict";
  9058. Object.defineProperty(exports, "__esModule", { value: true });
  9059. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9060. var LoadingPanel = /** @class */ (function (_super) {
  9061. __extends(LoadingPanel, _super);
  9062. function LoadingPanel() {
  9063. return _super.call(this, "loading", "loading") || this;
  9064. }
  9065. LoadingPanel.prototype.onInit = function () {
  9066. _super.prototype.onInit.call(this);
  9067. };
  9068. LoadingPanel.prototype.showWord = function (value) {
  9069. this.pro.value = value;
  9070. };
  9071. LoadingPanel.prototype.onBoyClick = function (e) {
  9072. //点击后小人会放大缩小
  9073. var boy = e.target;
  9074. if (boy.scaleX === 1) {
  9075. boy.scale(1.2, 1.2);
  9076. }
  9077. else {
  9078. boy.scale(1, 1);
  9079. }
  9080. };
  9081. LoadingPanel.prototype.onTxtClick = function (e) {
  9082. //点击后切换适配模式
  9083. e.stopPropagation();
  9084. };
  9085. LoadingPanel.prototype.destory = function () {
  9086. this.clearEvent();
  9087. _super.prototype.destory.call(this);
  9088. };
  9089. LoadingPanel.key = "LoadingPanel";
  9090. return LoadingPanel;
  9091. }(PanelBaseControl_1.PanelBaseControl));
  9092. exports.LoadingPanel = LoadingPanel;
  9093. },{"../Control/PanelBaseControl":23}],64:[function(require,module,exports){
  9094. "use strict";
  9095. Object.defineProperty(exports, "__esModule", { value: true });
  9096. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9097. var ViewAction_1 = require("../utils/ViewAction");
  9098. var ViewManager_1 = require("../View/ViewManager");
  9099. var LotteryCFG_1 = require("../CFG/LotteryCFG");
  9100. var AssetPath_1 = require("../Config/AssetPath");
  9101. var RoleCFG_1 = require("../CFG/RoleCFG");
  9102. var AgencyLottery_1 = require("../Agency/AgencyLottery");
  9103. var GuangGao_1 = require("../WXSDK/GuangGao");
  9104. var ttad_1 = require("../WXSDK/ttad");
  9105. var LotteryPanel = /** @class */ (function (_super) {
  9106. __extends(LotteryPanel, _super);
  9107. function LotteryPanel() {
  9108. return _super.call(this, "main", "LotteryView", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  9109. }
  9110. LotteryPanel.prototype.showLogger = function () {
  9111. this.logger = new Laya.Text();
  9112. this.logger.fontSize = 30;
  9113. this.logger.color = "#FFFFFF";
  9114. this.logger.align = 'center';
  9115. this.logger.valign = 'middle';
  9116. this.logger.size(Laya.stage.width, Laya.stage.height);
  9117. this.logger.text = "等待响应...\n";
  9118. Laya.stage.addChild(this.logger);
  9119. };
  9120. /************************************* */
  9121. LotteryPanel.prototype.onHttpRequestError = function (e) {
  9122. console.log(e);
  9123. };
  9124. LotteryPanel.prototype.initEvent = function () {
  9125. this.AddEventByType(this.backbtn, Laya.Event.CLICK, this, this.onclosefun);
  9126. this.AddEventByType(this.lotterybtn, Laya.Event.CLICK, this, this.choujiangclick);
  9127. };
  9128. LotteryPanel.prototype.playComplte = function () {
  9129. if (this.tw) {
  9130. this.tw.clear();
  9131. this.tw = null;
  9132. }
  9133. this.backbtn.enabled = true;
  9134. this.lotterybtn.enabled = true;
  9135. this.agencylottery.getreward(this._selectcfg);
  9136. };
  9137. LotteryPanel.prototype.onclosefun = function () {
  9138. if (this.tw) {
  9139. this.tw.clear();
  9140. this.tw = null;
  9141. }
  9142. GuangGao_1.GuangGao.Clear();
  9143. ViewManager_1.ViewManager.Instance.close(LotteryPanel);
  9144. };
  9145. LotteryPanel.prototype.initView = function () {
  9146. this.agencylottery = this.getProxy(AgencyLottery_1.AgencyLottery);
  9147. var vec = LotteryCFG_1.default.vec;
  9148. for (var i = 0; i < vec.length; i++) {
  9149. var cfg = vec[i];
  9150. if (cfg.type == 1) {
  9151. this["icon_" + i].url = fairygui.UIPackage.getItemURL("main", "img_gold");
  9152. this["txt_" + i].text = "X" + cfg.value;
  9153. }
  9154. else {
  9155. var rolecfg = RoleCFG_1.default.dict[cfg.value];
  9156. this["icon_" + i].url = AssetPath_1.AssetPath.getroleicon(rolecfg.icon);
  9157. this["txt_" + i].text = rolecfg.rolename;
  9158. }
  9159. }
  9160. GuangGao_1.GuangGao.CheatBanner(this.lotterybtn);
  9161. };
  9162. /**************************************** */
  9163. LotteryPanel.prototype.onSocketClose = function () {
  9164. console.log("Socket closed");
  9165. };
  9166. LotteryPanel.prototype.onMessageReveived = function (message) {
  9167. console.log("Message from server:");
  9168. if (typeof message == "string") {
  9169. console.log(message);
  9170. }
  9171. else if (message instanceof ArrayBuffer) {
  9172. }
  9173. };
  9174. /**************************************** */
  9175. LotteryPanel.prototype.choujiangclick = function () {
  9176. this.videocallback();
  9177. // pingtaiutils.Instance.playVideo( "",this,this.videocallback );
  9178. };
  9179. LotteryPanel.prototype.videocallback = function () {
  9180. var _this = this;
  9181. ttad_1.ttad.ShowVideo((function (isLoad) {
  9182. if (isLoad) {
  9183. _this.startPlay();
  9184. }
  9185. }));
  9186. };
  9187. LotteryPanel.prototype.startPlay = function () {
  9188. var index = this.agencylottery.GetReward();
  9189. this._selectcfg = LotteryCFG_1.default.vec[index];
  9190. this.backbtn.enabled = false;
  9191. this.lotterybtn.enabled = false;
  9192. this._nowgetIndex = index;
  9193. var angle = 360 * 6 + (this._nowgetIndex) * 45 - 15;
  9194. if (this.item_panel.rotation == 0) {
  9195. this._tweeObject = { value: 0 };
  9196. }
  9197. else {
  9198. this._tweeObject = { value: this._preIndex * 45 - 15 };
  9199. }
  9200. this._preIndex = this._nowgetIndex;
  9201. this.tw = laya.utils.Tween.to(this._tweeObject, { value: angle }, 3000, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.playComplte));
  9202. this.tw.update = Laya.Handler.create(this, function () {
  9203. var value = this._tweeObject.value % 360;
  9204. this.item_panel.rotation = value;
  9205. }, null, false);
  9206. };
  9207. LotteryPanel.key = "LotteryPanel";
  9208. return LotteryPanel;
  9209. }(PanelBaseControl_1.PanelBaseControl));
  9210. exports.LotteryPanel = LotteryPanel;
  9211. },{"../Agency/AgencyLottery":4,"../CFG/LotteryCFG":12,"../CFG/RoleCFG":14,"../Config/AssetPath":15,"../Control/PanelBaseControl":23,"../View/ViewManager":68,"../WXSDK/GuangGao":70,"../WXSDK/ttad":81,"../utils/ViewAction":91}],65:[function(require,module,exports){
  9212. "use strict";
  9213. Object.defineProperty(exports, "__esModule", { value: true });
  9214. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9215. var GameStateControl_1 = require("../Control/GameStateControl");
  9216. var GameState_1 = require("../utils/GameState");
  9217. var PropManager_1 = require("../PrefabControl/PropManager");
  9218. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  9219. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  9220. var AgencySkin_1 = require("../Agency/AgencySkin");
  9221. var AgencyInGame_1 = require("../Agency/AgencyInGame");
  9222. var ViewManager_1 = require("../View/ViewManager");
  9223. var AgencyLottery_1 = require("../Agency/AgencyLottery");
  9224. var TuijianView_1 = require("../Push/TuijianView");
  9225. var ttad_1 = require("../WXSDK/ttad");
  9226. var MainPanel = /** @class */ (function (_super) {
  9227. __extends(MainPanel, _super);
  9228. function MainPanel() {
  9229. var _this = _super.call(this, "main", "mainview") || this;
  9230. /****************************************** */
  9231. // 一只凤凰的分辨率是550 * 400
  9232. _this.phoenixWidth = 550;
  9233. _this.phoenixHeight = 400;
  9234. _this.bgColorTweener = new Laya.Tween();
  9235. _this.gradientInterval = 2000;
  9236. _this.bgColorChannels = { r: 99, g: 0, b: 0xFF };
  9237. return _this;
  9238. }
  9239. MainPanel.prototype.updateUserDataHandler = function () {
  9240. this.txt_gold.text = this.agencyusermessage.RoleData.Money.toString();
  9241. };
  9242. MainPanel.prototype.returnmainHandler = function () {
  9243. var RoleData = this.agencyusermessage.RoleData;
  9244. // if( RoleData.nowlevel <= 2 )
  9245. // {
  9246. // this.c_state.selectedIndex = 0;
  9247. // }
  9248. // else
  9249. // {
  9250. this.c_state.selectedIndex = 1;
  9251. // }
  9252. };
  9253. MainPanel.prototype.onInit = function () {
  9254. _super.prototype.onInit.call(this);
  9255. };
  9256. MainPanel.prototype.createPhoenixes = function () {
  9257. var scaleFactor = Math.min(Laya.stage.width / (this.phoenixWidth * 2), Laya.stage.height / this.phoenixHeight);
  9258. // 加了混合模式的凤凰
  9259. var blendedPhoenix;
  9260. blendedPhoenix.blendMode = "lighter";
  9261. blendedPhoenix.scale(scaleFactor, scaleFactor);
  9262. blendedPhoenix.y = (Laya.stage.height - this.phoenixHeight * scaleFactor) / 2;
  9263. // 正常模式的凤凰
  9264. var normalPhoenix;
  9265. normalPhoenix.scale(scaleFactor, scaleFactor);
  9266. normalPhoenix.x = this.phoenixWidth * scaleFactor;
  9267. normalPhoenix.y = (Laya.stage.height - this.phoenixHeight * scaleFactor) / 2;
  9268. };
  9269. /****************************************** */
  9270. MainPanel.prototype.initView = function () {
  9271. this.ExitBtn.visible = false;
  9272. this.MoreFunBtn.visible = false;
  9273. this.MoreGameBtn.visible = false;
  9274. ttad_1.ttad.Showbanner();
  9275. // Laya.timer.once(500,this,()=>{
  9276. // console.log("main界面白名单----",FYHD_Sdk.iswhite);
  9277. // if(FYHD_Sdk.iswhite){
  9278. // this.ExitBtn.visible = true;
  9279. // }
  9280. // else{
  9281. // this.ExitBtn.visible = false;
  9282. // }
  9283. // })
  9284. this.MoreFunBtnScale = this.getTransitionByName("morefunbtnscale");
  9285. Laya.timer.loop(1000, this, this.playanimator2);
  9286. this.SkinAni = this.SkinBtn.getTransition("skinani");
  9287. this.LotteryAni = this.LotteryBtn.getTransition("lotteryani");
  9288. this.MoreAni = this.MoreGameBtn.getTransition("moreani");
  9289. Laya.timer.loop(3000, this, this.playanimator);
  9290. this.agencyusermessage = this.getProxy(AgencyUserMessage_1.AgencyUserMessage);
  9291. PropManager_1.PropManager.pro_jindu = this.pro_dis;
  9292. PropManager_1.PropManager.txt_mingci = this.txt_mingci;
  9293. this.c_state = this.getControllerByBame("c_state");
  9294. GameStateControl_1.GameStateControl.Instance.setClickPanel(this.load_clickpanel);
  9295. this.returnmainHandler();
  9296. this.updateUserDataHandler();
  9297. };
  9298. MainPanel.prototype.playanimator = function () {
  9299. this.SkinAni.play(null, 1);
  9300. this.LotteryAni.play(null, 1);
  9301. this.MoreAni.play(null, 1);
  9302. };
  9303. MainPanel.prototype.playanimator2 = function () {
  9304. this.MoreFunBtnScale.play(null, 1);
  9305. };
  9306. MainPanel.prototype.choujiangclick = function () {
  9307. ttad_1.ttad.Clear();
  9308. this.getProxy(AgencyLottery_1.AgencyLottery).openView();
  9309. };
  9310. MainPanel.prototype.tuijianclick = function () {
  9311. ViewManager_1.ViewManager.Instance.add(TuijianView_1.default);
  9312. };
  9313. MainPanel.prototype.skinclick = function () {
  9314. ttad_1.ttad.Clear();
  9315. this.getProxy(AgencySkin_1.AgencySkin).openview();
  9316. };
  9317. MainPanel.prototype.moreclick = function () {
  9318. // ViewManager.Instance.add( ChoutiPanView );
  9319. ttad_1.ttad.CreateMoreGameBtn();
  9320. };
  9321. MainPanel.prototype.btnclick = function () {
  9322. ttad_1.ttad.Clear();
  9323. this.c_state.selectedIndex = 2;
  9324. this.txt_lv.text = this.agencyusermessage.RoleData.getNowServerLevel().toString();
  9325. this.getProxy(AgencyInGame_1.AgencyInGame).startGame();
  9326. };
  9327. MainPanel.prototype.setclick = function () {
  9328. };
  9329. MainPanel.prototype.mapLoaded = function () {
  9330. this.layer = this.tiledMap.getLayerByIndex(0);
  9331. var radiusX = 32;
  9332. var radiusY = Math.tan(180 / Math.PI * 30) * radiusX;
  9333. var color = "#FF7F50";
  9334. this.sprite = new Laya.Sprite();
  9335. this.sprite.graphics.drawLine(0, 0, -radiusX, radiusY, color);
  9336. this.sprite.graphics.drawLine(0, 0, radiusX, radiusY, color);
  9337. this.sprite.graphics.drawLine(-radiusX, radiusY, 0, radiusY * 2, color);
  9338. this.sprite.graphics.drawLine(radiusX, radiusY, 0, radiusY * 2, color);
  9339. Laya.stage.addChild(this.sprite);
  9340. };
  9341. /*************************************** */
  9342. MainPanel.prototype.initEvent = function () {
  9343. this.AddEventByType(this.load_start, Laya.Event.CLICK, this, this.btnclick);
  9344. this.AddEventByType(this.SkinBtn, Laya.Event.CLICK, this, this.skinclick);
  9345. // this.AddEventByType( this.MoreGameBtn,Laya.Event.CLICK,this,this.moreclick );
  9346. // this.AddEventByType( this.MoreFunBtn,Laya.Event.CLICK,this,this.moreclick );
  9347. // this.AddEventByType( this.ExitBtn,Laya.Event.CLICK,this,this.tuijianclick );
  9348. this.addDataEvent(GameState_1.GameState.returnMainView, this, this.returnmainHandler);
  9349. this.AddEventByType(this.LotteryBtn, Laya.Event.CLICK, this, this.choujiangclick);
  9350. this.addDataEvent(UserInfoEvent_1.UserInfoEvent.UserInfoEvent_updateUserData, this, this.updateUserDataHandler);
  9351. };
  9352. MainPanel.key = "MainPanel";
  9353. return MainPanel;
  9354. }(PanelBaseControl_1.PanelBaseControl));
  9355. exports.MainPanel = MainPanel;
  9356. },{"../Agency/AgencyInGame":2,"../Agency/AgencyLottery":4,"../Agency/AgencySkin":6,"../Agency/AgencyUserMessage":8,"../Control/GameStateControl":20,"../Control/PanelBaseControl":23,"../Data/UserInfoEvent":34,"../PrefabControl/PropManager":47,"../Push/TuijianView":55,"../View/ViewManager":68,"../WXSDK/ttad":81,"../utils/GameState":84}],66:[function(require,module,exports){
  9357. "use strict";
  9358. Object.defineProperty(exports, "__esModule", { value: true });
  9359. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9360. var ViewAction_1 = require("../utils/ViewAction");
  9361. var AgencySkin_1 = require("../Agency/AgencySkin");
  9362. var GameState_1 = require("../utils/GameState");
  9363. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  9364. var ResourceControl_1 = require("../Control/ResourceControl");
  9365. var AssetPath_1 = require("../Config/AssetPath");
  9366. var CharacterState_1 = require("../PrefabControl/CharacterState");
  9367. var ViewManager_1 = require("../View/ViewManager");
  9368. var CharacterPool_1 = require("../PrefabControl/CharacterPool");
  9369. var Player_1 = require("../Game/Player");
  9370. var SkinPanel = /** @class */ (function (_super) {
  9371. __extends(SkinPanel, _super);
  9372. function SkinPanel() {
  9373. var _this = _super.call(this, "main", "skinview", false, ViewAction_1.ViewAction.ActionType_none, 0) || this;
  9374. _this._isdestorys = false;
  9375. _this._out = new Laya.Quaternion;
  9376. return _this;
  9377. }
  9378. SkinPanel.prototype.initView = function () {
  9379. this._isdestorys = false;
  9380. this.c_title = this.getControllerByBame("c_title");
  9381. this.agencyskin = this.getProxy(AgencySkin_1.AgencySkin);
  9382. this.list_0.setVirtual();
  9383. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemlistrender, null, false);
  9384. this.c_title.selectedIndex = 0;
  9385. this.onchange();
  9386. //添加3D场景
  9387. this._ui3DScene = this.displayObject.addChildAt(new Laya.Scene3D(), 0);
  9388. //添加照相机
  9389. this._uicarma3D = (this._ui3DScene.addChild(new Laya.Camera(0, 0.1, 80)));
  9390. // this._uicarma3D.clearColor = null;
  9391. this._uicarma3D.viewport = new Laya.Viewport(this.x, this.y, this.width, this.height);
  9392. this._uicarma3D.transform.translate(new Laya.Vector3(0, 1.2, 5), false);
  9393. // //添加方向光
  9394. // this._uilight = PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  9395. // this._uilight.color = new Laya.Vector3(0.6,0.6,0.6);
  9396. // this._uilight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  9397. this.updateroleHandler();
  9398. };
  9399. SkinPanel.prototype.initEvent = function () {
  9400. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
  9401. this.AddEventByType(this.c_title, fairygui.Events.STATE_CHANGED, this, this.onchange);
  9402. this.addDataEvent(GameState_1.GameState.updateSKinView, this, this.onchange);
  9403. this.addDataEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid, this, this.updateroleHandler);
  9404. };
  9405. SkinPanel.prototype.ClearCharacter = function () {
  9406. if (this._rolemo) {
  9407. var script = this._rolemo.getComponent(Player_1.Player);
  9408. CharacterPool_1.CharacterPool.ClearCharacter(this._rolemo, script.resouseName, script);
  9409. this._rolemo = null;
  9410. }
  9411. };
  9412. SkinPanel.prototype.onclosefun = function () {
  9413. ViewManager_1.ViewManager.Instance.close(SkinPanel);
  9414. };
  9415. SkinPanel.prototype.destory = function () {
  9416. this._isdestorys = true;
  9417. this.ClearCharacter();
  9418. if (this._uicarma3D) {
  9419. this._uicarma3D.destroy();
  9420. this._uicarma3D = null;
  9421. }
  9422. if (this._ui3DScene) {
  9423. this._ui3DScene.destroy();
  9424. this._ui3DScene = null;
  9425. }
  9426. _super.prototype.destory.call(this);
  9427. };
  9428. SkinPanel.prototype.onchange = function () {
  9429. if (this.c_title.selectedIndex == 0) {
  9430. this.list_0.numItems = this.agencyskin.pifuArr.length;
  9431. }
  9432. else {
  9433. this.list_0.numItems = 0;
  9434. }
  9435. };
  9436. SkinPanel.prototype.itemlistrender = function (index, item) {
  9437. if (this.c_title.selectedIndex == 0) {
  9438. if (index < this.agencyskin.pifuArr.length) {
  9439. item.showData(this.agencyskin.pifuArr[index]);
  9440. }
  9441. }
  9442. };
  9443. SkinPanel.prototype.updateroleHandler = function () {
  9444. var RoleData = this.agencyskin.RoleData;
  9445. this.ClearCharacter();
  9446. var pathArr = [];
  9447. pathArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(RoleData.roleCfg.name) });
  9448. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.loadcomplete, null, true, RoleData.roleCfg.name);
  9449. };
  9450. SkinPanel.prototype.loadcomplete = function (resousename) {
  9451. var RoleData = this.agencyskin.RoleData;
  9452. if (!this._isdestorys && this._ui3DScene && resousename == RoleData.roleCfg.name) {
  9453. this._rolemo = CharacterPool_1.CharacterPool.AddCharacter(resousename, Player_1.Player, this._ui3DScene);
  9454. this._rolemo.transform.position = new Laya.Vector3(0, 2, 0);
  9455. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), -135 * 180 / Math.PI, this._out);
  9456. this._rolemo.transform.rotation = this._out;
  9457. this._rolemo.getComponent(Player_1.Player).PlayAnimator(CharacterState_1.CharacterState.stand);
  9458. }
  9459. };
  9460. SkinPanel.key = "SkinPanel";
  9461. return SkinPanel;
  9462. }(PanelBaseControl_1.PanelBaseControl));
  9463. exports.SkinPanel = SkinPanel;
  9464. },{"../Agency/AgencySkin":6,"../Config/AssetPath":15,"../Control/PanelBaseControl":23,"../Control/ResourceControl":26,"../Data/UserInfoEvent":34,"../Game/Player":38,"../PrefabControl/CharacterPool":43,"../PrefabControl/CharacterState":44,"../View/ViewManager":68,"../utils/GameState":84,"../utils/ViewAction":91}],67:[function(require,module,exports){
  9465. "use strict";
  9466. Object.defineProperty(exports, "__esModule", { value: true });
  9467. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9468. var ViewAction_1 = require("../utils/ViewAction");
  9469. var GameUtils_1 = require("../utils/GameUtils");
  9470. var AssetPath_1 = require("../Config/AssetPath");
  9471. var AgencyTrial_1 = require("../Agency/AgencyTrial");
  9472. var GuangGao_1 = require("../WXSDK/GuangGao");
  9473. var ttad_1 = require("../WXSDK/ttad");
  9474. var TrialPanel = /** @class */ (function (_super) {
  9475. __extends(TrialPanel, _super);
  9476. function TrialPanel(arr) {
  9477. var _this = _super.call(this, "main", "shiyongView", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  9478. _this.skinarr = arr;
  9479. return _this;
  9480. }
  9481. TrialPanel.prototype.onInit = function () {
  9482. _super.prototype.onInit.call(this);
  9483. };
  9484. TrialPanel.prototype.initView = function () {
  9485. this.agencytrial = this.getProxy(AgencyTrial_1.AgencyTrial);
  9486. var index = GameUtils_1.GameUtils.randRangeint(0, this.skinarr.length - 1);
  9487. this._selectvo = this.skinarr[index];
  9488. this.load_icon.url = AssetPath_1.AssetPath.getroleicon(this._selectvo.roleCFG.icon);
  9489. // pingtaiutils.Instance.createBanner( "ShiYongView" );
  9490. GuangGao_1.GuangGao.CheatBanner(this.btn_close);
  9491. };
  9492. TrialPanel.prototype.initEvent = function () {
  9493. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
  9494. this.AddEventByType(this.btn_video, Laya.Event.CLICK, this, this.videofun);
  9495. };
  9496. TrialPanel.prototype.videofun = function () {
  9497. // pingtaiutils.Instance.playVideo( "",this,this.videocallback );
  9498. this.videocallback();
  9499. };
  9500. TrialPanel.prototype.videocallback = function () {
  9501. var _this = this;
  9502. ttad_1.ttad.ShowVideo((function (isLoad) {
  9503. if (isLoad) {
  9504. _this.agencytrial.ExitPanel(_this._selectvo);
  9505. }
  9506. }));
  9507. };
  9508. TrialPanel.prototype.onclosefun = function () {
  9509. this.agencytrial.ExitPanel(null);
  9510. };
  9511. TrialPanel.prototype.destory = function () {
  9512. // GuangGao.Clear();
  9513. ttad_1.ttad.Clear();
  9514. _super.prototype.destory.call(this);
  9515. };
  9516. TrialPanel.key = "TrialPanel";
  9517. return TrialPanel;
  9518. }(PanelBaseControl_1.PanelBaseControl));
  9519. exports.TrialPanel = TrialPanel;
  9520. },{"../Agency/AgencyTrial":7,"../Config/AssetPath":15,"../Control/PanelBaseControl":23,"../WXSDK/GuangGao":70,"../WXSDK/ttad":81,"../utils/GameUtils":85,"../utils/ViewAction":91}],68:[function(require,module,exports){
  9521. "use strict";
  9522. Object.defineProperty(exports, "__esModule", { value: true });
  9523. var LayOUT_1 = require("../utils/LayOUT");
  9524. var LayoutControl_1 = require("../Control/LayoutControl");
  9525. /**
  9526. *
  9527. * @author
  9528. *
  9529. */
  9530. var ViewManager = /** @class */ (function (_super) {
  9531. __extends(ViewManager, _super);
  9532. function ViewManager() {
  9533. var _this = _super.call(this) || this;
  9534. ViewManager.ins = _this;
  9535. return _this;
  9536. }
  9537. Object.defineProperty(ViewManager, "Instance", {
  9538. get: function () {
  9539. if (ViewManager.ins == null) {
  9540. return new ViewManager();
  9541. }
  9542. return ViewManager.ins;
  9543. },
  9544. enumerable: true,
  9545. configurable: true
  9546. });
  9547. ViewManager.prototype.init = function () {
  9548. this._views = {};
  9549. this.initEvent();
  9550. };
  9551. ViewManager.prototype.initEvent = function () {
  9552. };
  9553. /**
  9554. * view 视图对象类
  9555. * data 绑定数据 ( data 如果不为空,代表构造函数传参 )
  9556. * layer 层级
  9557. */
  9558. ViewManager.prototype.add = function (view, data, layer) {
  9559. if (data === void 0) { data = null; }
  9560. if (layer === void 0) { layer = LayOUT_1.LayOUT.UI; }
  9561. if (view.key == null) {
  9562. throw new Error("view have no key");
  9563. }
  9564. var type = view.key;
  9565. if (this._views[type]) {
  9566. var itemview = this._views[type];
  9567. return itemview;
  9568. }
  9569. var d;
  9570. if (data != null) {
  9571. d = new view(data);
  9572. }
  9573. else {
  9574. d = new view();
  9575. }
  9576. d.viewKey = view;
  9577. d.gameLayer = layer;
  9578. LayoutControl_1.LayoutControl.Instance.AddLayerByName(d, layer);
  9579. this._views[type] = d;
  9580. return d;
  9581. };
  9582. /**
  9583. * 关闭界面
  9584. * @param view 界面
  9585. * @param isbgclose 是否是点击背景关闭的状态
  9586. * @param isplayAnmo 是否播放关闭动画( 主要用于强制关闭 )
  9587. */
  9588. ViewManager.prototype.close = function (view, isbgclose, isplayAnmo) {
  9589. if (isbgclose === void 0) { isbgclose = false; }
  9590. if (isplayAnmo === void 0) { isplayAnmo = true; }
  9591. var type = view.key;
  9592. var item = this._views[type];
  9593. if (!item) {
  9594. return;
  9595. }
  9596. LayoutControl_1.LayoutControl.Instance.ClearLayerByName(item.gameLayer);
  9597. if (isplayAnmo) {
  9598. item.ExitView();
  9599. }
  9600. else {
  9601. item.destory();
  9602. }
  9603. delete this._views[type];
  9604. };
  9605. ViewManager.prototype.onresize = function (w, h) {
  9606. if (this._views != null) {
  9607. var itemview;
  9608. for (var item in this._views) {
  9609. itemview = this._views[item];
  9610. itemview.setSize(w, h);
  9611. }
  9612. }
  9613. };
  9614. ViewManager.prototype.getView = function (view) {
  9615. var type = view.key;
  9616. return this._views[type];
  9617. };
  9618. return ViewManager;
  9619. }(Laya.EventDispatcher));
  9620. exports.ViewManager = ViewManager;
  9621. },{"../Control/LayoutControl":21,"../utils/LayOUT":88}],69:[function(require,module,exports){
  9622. "use strict";
  9623. Object.defineProperty(exports, "__esModule", { value: true });
  9624. var RecommendView_1 = require("../Push/RecommendView");
  9625. var ViewManager_1 = require("../View/ViewManager");
  9626. var ChoutiPanView_1 = require("../Push/ChoutiPanView");
  9627. // import { Main } from "../Main";
  9628. // import ListItem from "../GameTools/ListItem";
  9629. // import { PanelManager, PanelType } from "../View/PanelManager";
  9630. // import GuangGao from "./GuangGao";
  9631. // import { WXSDK } from "./WXSDK";
  9632. var FYHD_Sdk = /** @class */ (function () {
  9633. function FYHD_Sdk() {
  9634. }
  9635. //初始化sdk
  9636. FYHD_Sdk.InitSdk = function () {
  9637. Laya.Browser.window.sdk.getFyhd().startSdk();
  9638. FYHD_Sdk.UserInfoAuth();
  9639. // let white = Laya.LocalStorage.getItem("is_white");
  9640. // if(white){
  9641. // FYHD_Sdk.iswhite = true;
  9642. // }
  9643. // else{
  9644. // FYHD_Sdk.getWhiteConfig();
  9645. // }
  9646. // let newuser = Laya.LocalStorage.getItem("is_newuser");
  9647. // if(!newuser){
  9648. // FYHD_Sdk.isnewuser = true;
  9649. // Laya.LocalStorage.setItem("is_newuser","1");
  9650. // }
  9651. // else{
  9652. // FYHD_Sdk.isnewuser = false;
  9653. // }
  9654. // FYHD_Sdk.PushData();
  9655. };
  9656. //用户授权
  9657. FYHD_Sdk.UserInfoAuth = function () {
  9658. if (!Laya.Browser.onWeiXin)
  9659. return;
  9660. Laya.Browser.window.sdk.getFyhd().getFyhdUserInfo(null, false, function (data) {
  9661. console.log("无授权回调:" + JSON.stringify(data));
  9662. if (data.result.user) {
  9663. FYHD_Sdk.openid = data.result.user.openid;
  9664. FYHD_Sdk.AuthInfo();
  9665. }
  9666. });
  9667. };
  9668. FYHD_Sdk.AuthInfo = function () {
  9669. var args = {
  9670. openid: FYHD_Sdk.openid,
  9671. };
  9672. Laya.Browser.window.sdk.getFyhd().loginData(args, function (data) {
  9673. console.log("授权上报回调:" + JSON.stringify(data));
  9674. FYHD_Sdk.ValueUser();
  9675. });
  9676. };
  9677. FYHD_Sdk.ValueUser = function () {
  9678. var args = {
  9679. openid: FYHD_Sdk.openid,
  9680. };
  9681. Laya.Browser.window.sdk.getFyhd().valueuser(args, function (data) {
  9682. console.log("有效用户上报:" + JSON.stringify(data));
  9683. });
  9684. };
  9685. FYHD_Sdk.getWhiteConfig = function () {
  9686. Laya.Browser.window.sdk.getFyhd().whiteConfig(function (e) {
  9687. FYHD_Sdk.iswhite = e.data.is_white;
  9688. if (FYHD_Sdk.iswhite) {
  9689. Laya.LocalStorage.setItem("is_white", "1");
  9690. }
  9691. console.log("白名单---", e);
  9692. });
  9693. };
  9694. FYHD_Sdk.SetHuTuiList = function (list, scrol, type) {
  9695. if (scrol === void 0) { scrol = 1; }
  9696. if (type === void 0) { type = ""; }
  9697. var arr = this.pushData;
  9698. if (!arr || arr.length == 0)
  9699. return;
  9700. list.selectEnable = false;
  9701. scrol == 1 ? list.vScrollBarSkin = "" : list.hScrollBarSkin = "";
  9702. list.renderHandler = Laya.Handler.create(this, this.updateItem, [type], false);
  9703. list.array = arr;
  9704. list.refresh();
  9705. };
  9706. FYHD_Sdk.updateItem = function (type, cell, index) {
  9707. // var aditem = cell.getComponent(ListItem) as ListItem;
  9708. // aditem.Refresh(type);
  9709. };
  9710. //点击事件上报
  9711. FYHD_Sdk.ClickAd = function (ad_type) {
  9712. console.log("上报类型---", ad_type);
  9713. if (!Laya.Browser.onWeiXin)
  9714. return;
  9715. var param = {
  9716. ad_type: ad_type,
  9717. //此处添加openid
  9718. openid: FYHD_Sdk.openid
  9719. };
  9720. console.log("点击参数:" + param);
  9721. Laya.Browser.window.sdk.getFyhd().advertisement(param, function (data) {
  9722. console.log("点击结果:" + JSON.stringify(data));
  9723. });
  9724. };
  9725. //互推信息
  9726. FYHD_Sdk.PushData = function () {
  9727. //console.log("pushdata--",Main.WX);
  9728. if (!Laya.Browser.onWeiXin)
  9729. return;
  9730. var param = {};
  9731. Laya.Browser.window.sdk.getFyhd().shareRecommend(param, function (data) {
  9732. console.log("热门游戏数据--", data);
  9733. if (data.data) {
  9734. FYHD_Sdk.pushData = data.data;
  9735. FYHD_Sdk.pushData.sort(FYHD_Sdk.ListSort);
  9736. FYHD_Sdk.isHaveDate = true;
  9737. //此处派发事件,展示互推
  9738. //EventManager.event(FYHD_Sdk.ShowAd);
  9739. }
  9740. console.log("获取互推信息:" + JSON.stringify(FYHD_Sdk.pushData));
  9741. new RecommendView_1.Recommend();
  9742. });
  9743. };
  9744. FYHD_Sdk.ShowHuTuiJump = function (data, open) {
  9745. if (!Laya.Browser.onWeiXin)
  9746. return;
  9747. if (data.jump_type == 2) //二维码跳转方法
  9748. {
  9749. Laya.Browser.window.wx.previewImage({ current: data.qrcode, urls: [data.qrcode] });
  9750. }
  9751. else if (data.jump_type == 1) //直跳方法
  9752. {
  9753. Laya.Browser.window.wx.navigateToMiniProgram({
  9754. appId: data.to_appid,
  9755. path: data.jump_path,
  9756. success: function (res) {
  9757. // 打开成功
  9758. console.log("上报成功:" + JSON.stringify(res));
  9759. FYHD_Sdk.PushClick(data.to_appid);
  9760. },
  9761. fail: function (res) {
  9762. if (open) {
  9763. ViewManager_1.ViewManager.Instance.add(ChoutiPanView_1.default);
  9764. }
  9765. }
  9766. });
  9767. }
  9768. else if (data.jump_type == 0) //平台跳转方法
  9769. {
  9770. Laya.Browser.window.wx.navigateToMiniProgram({
  9771. appId: data.platform_appid,
  9772. path: data.jump_path,
  9773. success: function (res) {
  9774. // 打开成功
  9775. console.log("上报成功:" + JSON.stringify(res));
  9776. FYHD_Sdk.PushClick(data.to_appid);
  9777. },
  9778. fail: function (res) {
  9779. if (open) {
  9780. ViewManager_1.ViewManager.Instance.add(ChoutiPanView_1.default);
  9781. }
  9782. }
  9783. });
  9784. }
  9785. };
  9786. //互推点击
  9787. FYHD_Sdk.PushClick = function (to_appid) {
  9788. if (!Laya.Browser.onWeiXin)
  9789. return;
  9790. var param = {
  9791. openid: FYHD_Sdk.openid,
  9792. to_appid: to_appid,
  9793. };
  9794. Laya.Browser.window.sdk.getFyhd().sharePlay(param, function (data) {
  9795. console.log("点击上报结果:" + JSON.stringify(data));
  9796. });
  9797. };
  9798. FYHD_Sdk.ListSort = function (a, b) {
  9799. if (Number(a["panel"]) < Number(b["panel"])) {
  9800. return -1;
  9801. }
  9802. if (Number(a["panel"]) == Number(b["panel"])) {
  9803. return 0;
  9804. }
  9805. if (Number(a["panel"]) > Number(b["panel"])) {
  9806. return 1;
  9807. }
  9808. };
  9809. FYHD_Sdk.Ad_ClickType = {
  9810. Video: "video_click",
  9811. Watch: "watch",
  9812. Share: "share",
  9813. Banner: "banner",
  9814. Push: "push",
  9815. PushClick: "icon_click"
  9816. };
  9817. FYHD_Sdk.pushData = [];
  9818. FYHD_Sdk.isHaveDate = false;
  9819. FYHD_Sdk.ShowAd = "ShowAd";
  9820. return FYHD_Sdk;
  9821. }());
  9822. exports.FYHD_Sdk = FYHD_Sdk;
  9823. },{"../Push/ChoutiPanView":49,"../Push/RecommendView":53,"../View/ViewManager":68}],70:[function(require,module,exports){
  9824. "use strict";
  9825. Object.defineProperty(exports, "__esModule", { value: true });
  9826. var PlayerAccount_1 = require("./PlayerAccount");
  9827. var ttad_1 = require("./ttad");
  9828. var WxGameItem = /** @class */ (function () {
  9829. function WxGameItem() {
  9830. this.appNameHidden = false;
  9831. this.color = "C93B3BFF";
  9832. this.size = 100;
  9833. this.borderWidth = 50;
  9834. this.borderColor = "A1A0A0FF";
  9835. }
  9836. return WxGameItem;
  9837. }());
  9838. exports.WxGameItem = WxGameItem;
  9839. var GuangGao = /** @class */ (function () {
  9840. function GuangGao() {
  9841. this.isVideoLoadCom = false;
  9842. }
  9843. Object.defineProperty(GuangGao, "hasbanner", {
  9844. get: function () {
  9845. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.banner) {
  9846. return true;
  9847. }
  9848. else {
  9849. return false;
  9850. }
  9851. },
  9852. enumerable: true,
  9853. configurable: true
  9854. });
  9855. Object.defineProperty(GuangGao, "hasvideo", {
  9856. get: function () {
  9857. if (Laya.Browser.onWeiXin && PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video) {
  9858. var videonum = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetGlobe;
  9859. return true;
  9860. }
  9861. else {
  9862. return false;
  9863. }
  9864. },
  9865. enumerable: true,
  9866. configurable: true
  9867. });
  9868. //预先加载视屏广告
  9869. GuangGao.InitVideo = function () {
  9870. var _this = this;
  9871. if (!Laya.Browser.onWeiXin || !PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video)
  9872. return;
  9873. console.log(this.bannerAdUnitId);
  9874. //vedio
  9875. this.fsaasfafssfa = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: this.videlAdUnitId });
  9876. this.fsaasfafssfa.onLoad(function () {
  9877. console.log('激励视频 广告加载成功');
  9878. _this.asfasfsaffsa = true;
  9879. });
  9880. this.fsaasfafssfa.onError(function (err) {
  9881. console.log("激励视屏加载失败:" + err);
  9882. _this.asfasfsaffsa = false;
  9883. });
  9884. this.afsfsaafsfsa = true;
  9885. };
  9886. //看视频
  9887. GuangGao.ShowVideo = function (callback) {
  9888. var _this = this;
  9889. if (this.hasvideo) {
  9890. if (this.asfasfsaffsa) {
  9891. console.log("showVideoAd:" + this.asfasfsaffsa);
  9892. this.SetVideoCallBack(callback);
  9893. this.fsaasfafssfa.show().catch(function (err) {
  9894. _this.fsaasfafssfa.load().then(function () {
  9895. _this.SetVideoCallBack(callback);
  9896. _this.fsaasfafssfa.show();
  9897. });
  9898. });
  9899. }
  9900. else {
  9901. // ShareUtil.shareImage("视频没有分享", callback
  9902. // , "1");
  9903. }
  9904. }
  9905. else {
  9906. callback(false);
  9907. // ShareUtil.shareImage("视频没有分享", callback
  9908. // , "1");
  9909. }
  9910. };
  9911. GuangGao.SetVideoCallBack = function (callback) {
  9912. var _this = this;
  9913. this.fsaasfafssfa.offClose();
  9914. this.fsaasfafssfa.onClose(function (res) {
  9915. console.log("激励视频关闭:" + res.isEnded);
  9916. if (res && res.isEnded || res === undefined) {
  9917. callback && callback(true);
  9918. }
  9919. else {
  9920. callback && callback(false);
  9921. }
  9922. _this.fsaasfafssfa.offClose();
  9923. });
  9924. };
  9925. //打开banner
  9926. GuangGao.OpenBanner = function (gap, callVack, iswait) {
  9927. // if (!this.hasbanner)
  9928. // {
  9929. // callVack(null);
  9930. // return;
  9931. // }
  9932. var _this = this;
  9933. if (gap === void 0) { gap = 0; }
  9934. if (callVack === void 0) { callVack = null; }
  9935. if (iswait === void 0) { iswait = false; }
  9936. if (!Laya.Browser.onWeiXin) {
  9937. callVack(null);
  9938. return;
  9939. }
  9940. this.canshowbanner = true;
  9941. var idd = this.bannerAdUnitId;
  9942. console.log("adUnitId:" + idd);
  9943. var newBanner = Laya.Browser.window.wx.createBannerAd({
  9944. adUnitId: idd,
  9945. style: {
  9946. left: 0,
  9947. top: 0,
  9948. width: 460
  9949. }
  9950. });
  9951. newBanner.onError(function (err) {
  9952. console.log(err);
  9953. callVack(null);
  9954. });
  9955. newBanner.onLoad(function () {
  9956. if (_this.curbanner)
  9957. _this.curbanner.destroy();
  9958. _this.curbanner = newBanner;
  9959. var hight = _this.GetRealHight(gap);
  9960. if (callVack != null) {
  9961. callVack(hight);
  9962. }
  9963. if (_this.canshowbanner && !iswait) {
  9964. _this.curbanner.show();
  9965. }
  9966. else {
  9967. _this.curbanner.hide();
  9968. }
  9969. });
  9970. };
  9971. GuangGao.GetRealHight = function (gap) {
  9972. if (this.curbanner) {
  9973. var info = Laya.Browser.window.wx.getSystemInfoSync();
  9974. this.curbanner.style.width = info.windowWidth;
  9975. this.curbanner.style.top = info.windowHeight - this.curbanner.style.realHeight - gap;
  9976. return Laya.stage.height / info.windowHeight * this.curbanner.style.realHeight;
  9977. }
  9978. };
  9979. //clear
  9980. GuangGao.Clear = function () {
  9981. GuangGao.clearTween();
  9982. Laya.timer.clearAll(this);
  9983. Laya.Tween.clearAll(this);
  9984. this.canshowbanner = false;
  9985. if (this.curbanner)
  9986. this.curbanner.hide();
  9987. // if (!Laya.Browser.onWeiXin) return;
  9988. // if (this.curbanner) this.curbanner.hide();
  9989. };
  9990. GuangGao.hidebanner = function () {
  9991. if (!Laya.Browser.onWeiXin)
  9992. return;
  9993. if (this.curbanner)
  9994. this.curbanner.hide();
  9995. };
  9996. GuangGao.showbanner = function () {
  9997. if (!Laya.Browser.onWeiXin)
  9998. return;
  9999. if (this.curbanner)
  10000. this.curbanner.show();
  10001. };
  10002. Object.defineProperty(GuangGao, "cancheat", {
  10003. get: function () {
  10004. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.cheat) {
  10005. return true;
  10006. }
  10007. else {
  10008. return false;
  10009. }
  10010. // if(!PlayerAccount.CurrentAccount.CurAccountData.cheat)
  10011. // {
  10012. // console.log("cheat:false-> CurAccountData.cheat != 1");
  10013. // return false;
  10014. // }
  10015. // var checkscence = PlayerAccount.CurrentAccount.CurAccountData.checkscence;
  10016. // if (checkscence == false)
  10017. // {
  10018. // console.log("cheat:true-> " + WxApi.sceneValue);
  10019. // return true;
  10020. // }
  10021. // if (WxApi.sceneValue == "1037" || WxApi.sceneValue == "1058"|| WxApi.sceneValue == "1067" || WxApi.sceneValue == "1095")
  10022. // {
  10023. // console.log("cheat:true-> " + WxApi.sceneValue);
  10024. // return true;
  10025. // }
  10026. // console.log("cheat:false-> " + WxApi.sceneValue);
  10027. // return false;
  10028. },
  10029. enumerable: true,
  10030. configurable: true
  10031. });
  10032. GuangGao.SetPosBanner = function (btn, complete) {
  10033. var _this = this;
  10034. if (Laya.Browser.onPC) {
  10035. complete(false);
  10036. return;
  10037. }
  10038. var info = Laya.Browser.window.wx.getSystemInfoSync();
  10039. //console.log(info);
  10040. //console.log(btn);
  10041. //console.log(btn.y,Laya.stage.height,info.windowHeight);
  10042. var reshight = btn.y * info.windowHeight / Laya.stage.height;
  10043. //console.log("reshight",reshight);
  10044. var idd = this.bannerAdUnitId;
  10045. console.log("adUnitId:" + idd);
  10046. if (this.curbanner)
  10047. this.curbanner.destroy();
  10048. var newBanner = Laya.Browser.window.wx.createBannerAd({
  10049. adUnitId: idd,
  10050. style: {
  10051. left: 0,
  10052. top: 0,
  10053. width: 720
  10054. }
  10055. });
  10056. newBanner.onError(function (err) {
  10057. console.log(err);
  10058. complete(false);
  10059. });
  10060. newBanner.onLoad(function () {
  10061. _this.curbanner = newBanner;
  10062. _this.curbanner.style.top = reshight;
  10063. //console.log("top",this.asgagassga.style.top);
  10064. if (_this.curbanner) {
  10065. console.log("banner show");
  10066. _this.curbanner.show();
  10067. Laya.timer.once(2300, _this, function () {
  10068. _this.curbanner.style.top = info.windowHeight - GuangGao.bannerhigt;
  10069. complete(true);
  10070. });
  10071. }
  10072. });
  10073. newBanner.onResize(function (res) {
  10074. GuangGao.bannerhigt = res.height;
  10075. _this.curbanner.style.width = info.windowWidth;
  10076. _this.curbanner.style.top = reshight;
  10077. });
  10078. };
  10079. //按钮误导
  10080. GuangGao.CheatBanner = function (btn, complete, gap) {
  10081. if (complete === void 0) { complete = null; }
  10082. if (gap === void 0) { gap = 0; }
  10083. ttad_1.ttad.Showbanner();
  10084. // if(!GuangGao.cancheat)
  10085. // {
  10086. // console.log("ignorecheat");
  10087. // GuangGao.OpenBanner(0,(height) =>
  10088. // {
  10089. // if(height == null)
  10090. // {
  10091. // }
  10092. // });
  10093. // }
  10094. // else
  10095. // {
  10096. // btn.y = Laya.stage.height-btn.height - 100;
  10097. // GuangGao.OpenBanner(gap,(height) =>
  10098. // {
  10099. // if(height == null)
  10100. // {
  10101. // }
  10102. // else
  10103. // {
  10104. // console.log("cheatstart","bottom:100");
  10105. // // btn.mouseEnabled = false;
  10106. // var end=Laya.stage.height-height-btn.height - 80;
  10107. // console.log("y:" + end);
  10108. // Laya.timer.once(PlayerAccount.CurrentAccount.CurAccountData.cheattime*1000,this,()=>
  10109. // {
  10110. // // btn.mouseEnabled = true;
  10111. // this.showbanner();
  10112. // GuangGao.clearTween();
  10113. // GuangGao.tween = Laya.Tween.to(btn,{y:end},200,null,Laya.Handler.create(this,()=>
  10114. // {
  10115. // if(complete != null)
  10116. // {
  10117. // complete();
  10118. // }
  10119. // }))
  10120. // })
  10121. // }
  10122. // },true);
  10123. // }
  10124. };
  10125. GuangGao.clearTween = function () {
  10126. if (GuangGao.tween) {
  10127. GuangGao.tween.clear();
  10128. GuangGao.tween = null;
  10129. }
  10130. };
  10131. GuangGao.prototype.loadVideo = function (cb) {
  10132. var _this = this;
  10133. if (!Laya.Browser.onWeiXin) {
  10134. if (cb)
  10135. cb(true);
  10136. return;
  10137. }
  10138. ;
  10139. this._onLoadVideo = cb;
  10140. if (!this._rewardedVideoAd) {
  10141. var index = GuangGao.videlAdUnitId;
  10142. this._rewardedVideoAd = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: index });
  10143. var isc = false;
  10144. this._rewardedVideoAd.onLoad(function () {
  10145. console.log("[LOG] 激励视频广告加载成功");
  10146. _this.isVideoLoadCom = true;
  10147. if (isc)
  10148. return;
  10149. isc = true;
  10150. _this._onLoadVideo && _this._onLoadVideo(true);
  10151. _this._onLoadVideo = null;
  10152. });
  10153. this._rewardedVideoAd.onError(function (err) {
  10154. console.log("[LOG] 激励视频广告加载失败");
  10155. console.log(err);
  10156. _this.isVideoLoadCom = false;
  10157. _this._onLoadVideo && _this._onLoadVideo(false);
  10158. _this._onLoadVideo = null;
  10159. });
  10160. this._rewardedVideoAd.onClose(function (res) {
  10161. if (!res || res.isEnded) {
  10162. _this._onVideoClose && _this._onVideoClose(true);
  10163. _this._onVideoClose = null;
  10164. }
  10165. else {
  10166. _this._onVideoClose && _this._onVideoClose(false);
  10167. _this._onVideoClose = null;
  10168. }
  10169. });
  10170. }
  10171. else {
  10172. if (this.isVideoLoadCom) {
  10173. this._onLoadVideo && this._onLoadVideo(true);
  10174. this._onLoadVideo = null;
  10175. }
  10176. else {
  10177. this._onLoadVideo && this._onLoadVideo(false);
  10178. this._onLoadVideo = null;
  10179. }
  10180. }
  10181. };
  10182. GuangGao.prototype.showVideo = function (cb) {
  10183. var _this = this;
  10184. if (!Laya.Browser.onWeiXin) {
  10185. if (cb)
  10186. cb(true);
  10187. return;
  10188. }
  10189. ;
  10190. this._onVideoClose = cb;
  10191. this._rewardedVideoAd.show().catch(function (err) {
  10192. _this._rewardedVideoAd.load().then(function () {
  10193. _this._rewardedVideoAd.show();
  10194. });
  10195. });
  10196. };
  10197. GuangGao.videlAdUnitId = "adunit-0c687084c908ee89";
  10198. GuangGao.bannerAdUnitId = "adunit-8c2d586135fa6d4f";
  10199. GuangGao.afsfsaafsfsa = false;
  10200. //视屏广告是否加载成功
  10201. GuangGao.asfasfsaffsa = false;
  10202. GuangGao.canshowbanner = true;
  10203. GuangGao.bannerhigt = 0;
  10204. return GuangGao;
  10205. }());
  10206. exports.GuangGao = GuangGao;
  10207. },{"./PlayerAccount":73,"./ttad":81}],71:[function(require,module,exports){
  10208. "use strict";
  10209. Object.defineProperty(exports, "__esModule", { value: true });
  10210. var Event = Laya.Event;
  10211. var HttpRequest = Laya.HttpRequest;
  10212. var PlayerAccount_1 = require("./PlayerAccount");
  10213. var Sdk_1 = require("./Sdk");
  10214. var TimesTamper_1 = require("../Time/TimesTamper");
  10215. var Global_1 = require("../Global");
  10216. // const PROTOCOL_URL:string = "https://pipelineapi.xwxgame.com/";
  10217. var PROTOCOL_URL = "https://parkourracetoutiao2api.xwxgame.com/";
  10218. var PROTOCOLS = /** @class */ (function () {
  10219. function PROTOCOLS() {
  10220. }
  10221. PROTOCOLS.Login = "user/login"; // not token
  10222. PROTOCOLS.game = "game/start";
  10223. PROTOCOLS.end = "game/play";
  10224. PROTOCOLS.Sign = "sign/sign";
  10225. // public static EquipHero = "theme/equipHero";
  10226. // public static BuyHero = "theme/buyHero";
  10227. // public static EquipHat = "theme/equipHat";
  10228. // public static BuyHat = "theme/buyHat";
  10229. // public static BuyDance = "theme/buyDance";
  10230. // public static EquipDance = "theme/equipDance";
  10231. PROTOCOLS.Buy = "theme/buy";
  10232. PROTOCOLS.Equip = "theme/equip";
  10233. PROTOCOLS.share = "fission/share";
  10234. PROTOCOLS.vd = "fission/vd";
  10235. PROTOCOLS.revival = "game/revival";
  10236. PROTOCOLS.fission = "theme/fission";
  10237. PROTOCOLS.themefission = "theme/fission";
  10238. PROTOCOLS.treasure = "treasure/click";
  10239. PROTOCOLS.Config = "config/table";
  10240. PROTOCOLS.Lottery = "lottery/lottery";
  10241. PROTOCOLS.GetAchieve = "achievement/getRewards";
  10242. PROTOCOLS.usersync = "user/sync";
  10243. return PROTOCOLS;
  10244. }());
  10245. exports.PROTOCOLS = PROTOCOLS;
  10246. ;
  10247. var NetworkManager = /** @class */ (function () {
  10248. function NetworkManager() {
  10249. NetworkManager.instance = this;
  10250. }
  10251. Object.defineProperty(NetworkManager, "Instance", {
  10252. get: function () {
  10253. if (NetworkManager.instance) {
  10254. return NetworkManager.instance;
  10255. }
  10256. else {
  10257. return new NetworkManager();
  10258. }
  10259. },
  10260. enumerable: true,
  10261. configurable: true
  10262. });
  10263. //#region 登入
  10264. /******************************* login *****************************/
  10265. NetworkManager.prototype.login = function (progresscb, completecb, errorcb) {
  10266. var userInfor = PlayerAccount_1.PlayerAccount.CurrentAccount;
  10267. var ver = Global_1.Global.gameVersion;
  10268. var args = "code=" + userInfor.Code + "&nickname=" + userInfor.NickName + "&avatar=" + userInfor.Avatar + "&gender=" + userInfor.Gender + "&country=" + userInfor.Country + "&province=" + userInfor.Province + "&city=" + userInfor.City + "& device=" + userInfor.Device + "$&share_id=" + userInfor.ShareId + "&scene=" + userInfor.Scene + "&v=" + ver;
  10269. var httpRequest = new HttpRequest();
  10270. httpRequest.once(Event.PROGRESS, this, this.onHttpRequestProgress, [progresscb, httpRequest]);
  10271. httpRequest.once(Event.COMPLETE, this, this.onLoginRequestComplete, [completecb, httpRequest]);
  10272. httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]);
  10273. httpRequest.send(PROTOCOL_URL + PROTOCOLS.Login, args, "post", "text");
  10274. };
  10275. NetworkManager.prototype.onHttpRequestProgress = function (progresscb, httpRequest) {
  10276. if (progresscb) {
  10277. console.log("HttpRequestProgress:...");
  10278. progresscb.run();
  10279. }
  10280. };
  10281. NetworkManager.prototype.onLoginRequestComplete = function (completecb, httpRequest) {
  10282. //console.log("登录数据:", httpRequest.data);
  10283. var data = JSON.parse(httpRequest.data);
  10284. if (data["code"] != "0") {
  10285. console.log("登录异常错误!错误信息:", httpRequest.data);
  10286. Sdk_1.WxApi.recordAldEvent("登录异常错误!错误信息:= " + data["code"], "httpRequest.dat");
  10287. //completecb.runWith(data);
  10288. return;
  10289. }
  10290. PlayerAccount_1.PlayerAccount.ServerTime = data["t"];
  10291. TimesTamper_1.TimesTamper.Instance.updateServiceTime(Number(data["t"]));
  10292. Sdk_1.WxApi.recordAldEvent("登录正式成功");
  10293. PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, completecb);
  10294. // ShareUtil.ShareMessage();
  10295. };
  10296. NetworkManager.prototype.onHttpRequestError = function (errorcb, httpRequest) {
  10297. if (errorcb != null) {
  10298. errorcb.runWith(httpRequest);
  10299. }
  10300. Sdk_1.WxApi.recordAldEvent("Error! Http request error.. ", "httpRequest.dat");
  10301. Sdk_1.WxApi.ShowLoading("连接网络失败...");
  10302. Laya.timer.once(8000, this, function () { Sdk_1.WxApi.HideLoading(); });
  10303. console.log("Error! Http request error..." + httpRequest.data);
  10304. };
  10305. //#endregion
  10306. /*
  10307. * 通用Http Post协议发送
  10308. * protocol 对应“PROTOCOLS”字典中协议名称
  10309. * hasToken 是否使用token,目前只有login协议不需要token,其他都需要token,所以此处自动组合
  10310. * param 参数列表,key是字段名,val是值,值需要先转string
  10311. * completecb 协议发送成功回调函数
  10312. * errorcb 协议发送失败回调函数
  10313. * return 返回值为void
  10314. */
  10315. NetworkManager.prototype.HttpPostRequest = function (protocol, param, completecb, errorcb, hasToken) {
  10316. if (hasToken === void 0) { hasToken = true; }
  10317. var args = "";
  10318. var url = PROTOCOL_URL + protocol;
  10319. // chechk add token
  10320. var account = PlayerAccount_1.PlayerAccount.CurrentAccount;
  10321. var accountdata = account.CurAccountData;
  10322. if (hasToken == true) {
  10323. args = "token=" + accountdata.m_token + "&";
  10324. }
  10325. Sdk_1.WxApi.ShowLoading("连接网络中...");
  10326. if (protocol == PROTOCOLS.game || protocol == PROTOCOLS.end || protocol == PROTOCOLS.fission || protocol == PROTOCOLS.vd ||
  10327. protocol == PROTOCOLS.themefission || protocol == PROTOCOLS.Lottery || protocol == PROTOCOLS.usersync) {
  10328. var str = "abcdefghijkimnopqrstuvwxyz0123456789";
  10329. var code = "{";
  10330. var mask = "";
  10331. for (var i = 0; i < 4; i++) {
  10332. mask += str[Math.floor(Math.random() * 100) % str.length];
  10333. }
  10334. for (var i = 0; i < param.length; i++) {
  10335. for (var key in param[i]) {
  10336. code += "\"" + key + "\":\"" + param[i][key] + "\"";
  10337. }
  10338. if (i < param.length - 1) {
  10339. code += ",";
  10340. }
  10341. else {
  10342. code += "}";
  10343. }
  10344. }
  10345. args += "_r=" + mask + this.base64Encode(code);
  10346. }
  10347. else {
  10348. if (param != null) {
  10349. for (var i = 0; i < param.length; i++) {
  10350. for (var key in param[i]) {
  10351. var val = param[i][key];
  10352. args += key + "=" + val;
  10353. if (i < param.length - 1) {
  10354. args += "&";
  10355. }
  10356. }
  10357. }
  10358. }
  10359. }
  10360. var httpRequest = new HttpRequest();
  10361. httpRequest.once(Event.COMPLETE, this, this.onHttpRequestComplete, [completecb, errorcb, httpRequest]);
  10362. httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]);
  10363. httpRequest.send(url, args, "post", "text");
  10364. };
  10365. NetworkManager.prototype.onHttpRequestComplete = function (succeedcb, failurecb, httpRequest) {
  10366. Sdk_1.WxApi.HideLoading();
  10367. var data = JSON.parse(httpRequest.data);
  10368. if (data["code"] == 0) {
  10369. PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, null);
  10370. if (succeedcb != null) {
  10371. succeedcb.runWith(data);
  10372. }
  10373. }
  10374. else {
  10375. if (failurecb != null) {
  10376. failurecb.runWith(data);
  10377. }
  10378. console.log("Error! Http request complete error, code: " + data["code"] + " message: " + data["message"]);
  10379. }
  10380. };
  10381. NetworkManager.prototype.base64Encode = function (str) {
  10382. var c1, c2, c3;
  10383. var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  10384. var i = 0, len = str.length, string = '';
  10385. while (i < len) {
  10386. c1 = str.charCodeAt(i++) & 0xff;
  10387. if (i == len) {
  10388. string += base64EncodeChars.charAt(c1 >> 2);
  10389. string += base64EncodeChars.charAt((c1 & 0x3) << 4);
  10390. string += "==";
  10391. break;
  10392. }
  10393. c2 = str.charCodeAt(i++);
  10394. if (i == len) {
  10395. string += base64EncodeChars.charAt(c1 >> 2);
  10396. string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  10397. string += base64EncodeChars.charAt((c2 & 0xF) << 2);
  10398. string += "=";
  10399. break;
  10400. }
  10401. c3 = str.charCodeAt(i++);
  10402. string += base64EncodeChars.charAt(c1 >> 2);
  10403. string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  10404. string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
  10405. string += base64EncodeChars.charAt(c3 & 0x3F);
  10406. }
  10407. return string;
  10408. };
  10409. return NetworkManager;
  10410. }());
  10411. exports.NetworkManager = NetworkManager;
  10412. },{"../Global":39,"../Time/TimesTamper":58,"./PlayerAccount":73,"./Sdk":75}],72:[function(require,module,exports){
  10413. "use strict";
  10414. Object.defineProperty(exports, "__esModule", { value: true });
  10415. var PlatfromType = /** @class */ (function () {
  10416. function PlatfromType() {
  10417. }
  10418. /**
  10419. * 电脑
  10420. */
  10421. PlatfromType.pc = "pc";
  10422. /**
  10423. * 微信小游戏
  10424. */
  10425. PlatfromType.wx = "wx";
  10426. /**
  10427. * qq小游戏
  10428. */
  10429. PlatfromType.qq = "qq";
  10430. /**
  10431. * 抖音
  10432. */
  10433. PlatfromType.tt = "tt";
  10434. return PlatfromType;
  10435. }());
  10436. exports.PlatfromType = PlatfromType;
  10437. },{}],73:[function(require,module,exports){
  10438. "use strict";
  10439. Object.defineProperty(exports, "__esModule", { value: true });
  10440. var Sdk_1 = require("../WXSDK/Sdk");
  10441. var GameUtils_1 = require("../utils/GameUtils");
  10442. var NetworkManager_1 = require("./NetworkManager");
  10443. var DispatcherManager_1 = require("../utils/DispatcherManager");
  10444. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  10445. var requiretype;
  10446. (function (requiretype) {
  10447. requiretype[requiretype["\u7CFB\u7EDF\u8D60\u9001"] = 1] = "\u7CFB\u7EDF\u8D60\u9001";
  10448. requiretype[requiretype["\u91D1\u5E01\u8D2D\u4E70"] = 2] = "\u91D1\u5E01\u8D2D\u4E70";
  10449. requiretype[requiretype["\u89C2\u770B\u89C6\u9891"] = 3] = "\u89C2\u770B\u89C6\u9891";
  10450. requiretype[requiretype["\u5206\u4EAB"] = 4] = "\u5206\u4EAB";
  10451. requiretype[requiretype["\u7B7E\u5230"] = 5] = "\u7B7E\u5230";
  10452. requiretype[requiretype["\u6D3B\u52A8"] = 6] = "\u6D3B\u52A8";
  10453. requiretype[requiretype["\u901A\u8FC7\u5173\u5361"] = 7] = "\u901A\u8FC7\u5173\u5361";
  10454. requiretype[requiretype["\u7D2F\u8BA1\u767B\u9646"] = 8] = "\u7D2F\u8BA1\u767B\u9646";
  10455. requiretype[requiretype["\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230"] = 9] = "\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230";
  10456. requiretype[requiretype["\u7816\u77F3\u8D2D\u4E70"] = 10] = "\u7816\u77F3\u8D2D\u4E70";
  10457. })(requiretype = exports.requiretype || (exports.requiretype = {}));
  10458. var AccountConfig;
  10459. (function (AccountConfig) {
  10460. AccountConfig[AccountConfig["crop"] = 0] = "crop";
  10461. AccountConfig[AccountConfig["things"] = 1] = "things";
  10462. AccountConfig[AccountConfig["land"] = 2] = "land";
  10463. AccountConfig[AccountConfig["global"] = 3] = "global";
  10464. AccountConfig[AccountConfig["entity"] = 4] = "entity";
  10465. AccountConfig[AccountConfig["sign"] = 5] = "sign";
  10466. AccountConfig[AccountConfig["rewards"] = 6] = "rewards";
  10467. AccountConfig[AccountConfig["achievement"] = 7] = "achievement";
  10468. AccountConfig[AccountConfig["invite"] = 8] = "invite";
  10469. AccountConfig[AccountConfig["mission"] = 9] = "mission";
  10470. AccountConfig[AccountConfig["treasure_click"] = 10] = "treasure_click";
  10471. AccountConfig[AccountConfig["theme"] = 11] = "theme";
  10472. AccountConfig[AccountConfig["lottery"] = 12] = "lottery";
  10473. })(AccountConfig = exports.AccountConfig || (exports.AccountConfig = {}));
  10474. var AccountUser;
  10475. (function (AccountUser) {
  10476. AccountUser[AccountUser["money"] = 0] = "money";
  10477. AccountUser[AccountUser["diamond"] = 1] = "diamond";
  10478. AccountUser[AccountUser["user_id"] = 2] = "user_id";
  10479. AccountUser[AccountUser["game_times"] = 3] = "game_times";
  10480. AccountUser[AccountUser["get_themes"] = 4] = "get_themes";
  10481. AccountUser[AccountUser["video_times"] = 5] = "video_times";
  10482. AccountUser[AccountUser["equip_themes"] = 6] = "equip_themes";
  10483. AccountUser[AccountUser["last_action_time"] = 7] = "last_action_time";
  10484. AccountUser[AccountUser["last_favorite_time"] = 8] = "last_favorite_time";
  10485. AccountUser[AccountUser["progress_themes"] = 9] = "progress_themes";
  10486. AccountUser[AccountUser["revival"] = 10] = "revival";
  10487. AccountUser[AccountUser["stage"] = 11] = "stage";
  10488. AccountUser[AccountUser["vmoney"] = 12] = "vmoney";
  10489. })(AccountUser = exports.AccountUser || (exports.AccountUser = {}));
  10490. var heroAttr;
  10491. (function (heroAttr) {
  10492. heroAttr[heroAttr["id"] = 0] = "id";
  10493. heroAttr[heroAttr["name"] = 1] = "name";
  10494. heroAttr[heroAttr["quality"] = 2] = "quality";
  10495. heroAttr[heroAttr["icon"] = 3] = "icon";
  10496. heroAttr[heroAttr["prefab"] = 4] = "prefab";
  10497. heroAttr[heroAttr["require_num"] = 5] = "require_num";
  10498. heroAttr[heroAttr["require_type"] = 6] = "require_type";
  10499. })(heroAttr = exports.heroAttr || (exports.heroAttr = {}));
  10500. var signdata;
  10501. (function (signdata) {
  10502. signdata[signdata["sign_days"] = 0] = "sign_days";
  10503. signdata[signdata["sign_time"] = 1] = "sign_time";
  10504. })(signdata = exports.signdata || (exports.signdata = {}));
  10505. var entity;
  10506. (function (entity) {
  10507. entity[entity["id"] = 0] = "id";
  10508. entity[entity["name"] = 1] = "name";
  10509. entity[entity["entity_id"] = 2] = "entity_id";
  10510. entity[entity["icon"] = 3] = "icon";
  10511. })(entity = exports.entity || (exports.entity = {}));
  10512. var skinattr;
  10513. (function (skinattr) {
  10514. skinattr[skinattr["effectValue_1"] = 0] = "effectValue_1";
  10515. skinattr[skinattr["effectValue_2"] = 1] = "effectValue_2";
  10516. skinattr[skinattr["effectValue_3"] = 2] = "effectValue_3";
  10517. skinattr[skinattr["effectValue_4"] = 3] = "effectValue_4";
  10518. })(skinattr = exports.skinattr || (exports.skinattr = {}));
  10519. var AccountData = /** @class */ (function () {
  10520. function AccountData(_token, _config, _appSetting, _user, _userbase, _useInvite, _user_stage, _user_sign, _user_achievement, _lottery, _use_land_task, _user_video) {
  10521. if (_useInvite === void 0) { _useInvite = null; }
  10522. if (_user_stage === void 0) { _user_stage = null; }
  10523. this.openid = "";
  10524. this.userId = "";
  10525. this.roadconfig = {};
  10526. this.m_RewardDic = {};
  10527. this.m_EntityDic = {};
  10528. this.m_AchievementDic = {};
  10529. this.m_token = _token;
  10530. this.m_app_setting = _appSetting;
  10531. this.m_user = _user;
  10532. this.m_user_base = _userbase;
  10533. this.m_sign = _user_sign;
  10534. this.m_task = _user_achievement;
  10535. this.lottery = _lottery;
  10536. this.m_use_land_task = _use_land_task;
  10537. this.m_user_video = _user_video;
  10538. this.userId = this.m_user["user_id"];
  10539. this.openid = this.m_user_base["openid"];
  10540. console.log("user_id:" + this.userId);
  10541. //console.log("open_id:"+this.openid);
  10542. }
  10543. Object.defineProperty(AccountData.prototype, "DieDistance", {
  10544. // public m_skinDic:Dictionary<number,SkinData> = new Dictionary();
  10545. //获取玩家落入空中死亡距离
  10546. get: function () {
  10547. return Number(this.m_app_setting["diedistance"]);
  10548. },
  10549. enumerable: true,
  10550. configurable: true
  10551. });
  10552. Object.defineProperty(AccountData.prototype, "HitEgg", {
  10553. //获取开局砸蛋几率
  10554. get: function () {
  10555. return Number(this.m_app_setting["hitegg"]);
  10556. },
  10557. enumerable: true,
  10558. configurable: true
  10559. });
  10560. Object.defineProperty(AccountData.prototype, "EndCheat", {
  10561. //获取结算后砸蛋出现几率
  10562. get: function () {
  10563. return Number(this.m_app_setting["endcheat"]);
  10564. },
  10565. enumerable: true,
  10566. configurable: true
  10567. });
  10568. Object.defineProperty(AccountData.prototype, "CheatReward", {
  10569. //获取误触奖励金币数
  10570. get: function () {
  10571. return Number(this.m_app_setting["cheatreward"]);
  10572. },
  10573. enumerable: true,
  10574. configurable: true
  10575. });
  10576. Object.defineProperty(AccountData.prototype, "WhiteUser", {
  10577. //白名单用户
  10578. get: function () {
  10579. return this.m_app_setting["WhiteUser"] == "1";
  10580. },
  10581. enumerable: true,
  10582. configurable: true
  10583. });
  10584. Object.defineProperty(AccountData.prototype, "lotterytime", {
  10585. get: function () {
  10586. return Number(this.lottery["day_video_times"]);
  10587. },
  10588. enumerable: true,
  10589. configurable: true
  10590. });
  10591. Object.defineProperty(AccountData.prototype, "share", {
  10592. get: function () {
  10593. return this.m_app_setting["share"] == "1";
  10594. },
  10595. enumerable: true,
  10596. configurable: true
  10597. });
  10598. Object.defineProperty(AccountData.prototype, "sharecontent", {
  10599. get: function () {
  10600. return this.m_app_setting["sharecontent"];
  10601. },
  10602. enumerable: true,
  10603. configurable: true
  10604. });
  10605. Object.defineProperty(AccountData.prototype, "ShareImage", {
  10606. get: function () {
  10607. return this.m_app_setting["ShareImage"];
  10608. },
  10609. enumerable: true,
  10610. configurable: true
  10611. });
  10612. Object.defineProperty(AccountData.prototype, "cheattime", {
  10613. get: function () {
  10614. return Number(this.m_app_setting["cheattime"]);
  10615. },
  10616. enumerable: true,
  10617. configurable: true
  10618. });
  10619. Object.defineProperty(AccountData.prototype, "banner", {
  10620. get: function () {
  10621. return this.m_app_setting["banner"] == "1";
  10622. },
  10623. enumerable: true,
  10624. configurable: true
  10625. });
  10626. Object.defineProperty(AccountData.prototype, "video", {
  10627. get: function () {
  10628. return this.m_app_setting["video"] == "1";
  10629. },
  10630. enumerable: true,
  10631. configurable: true
  10632. });
  10633. Object.defineProperty(AccountData.prototype, "BtnCanMove", {
  10634. get: function () {
  10635. return this.m_app_setting["BtnCanMove"] == "1";
  10636. },
  10637. enumerable: true,
  10638. configurable: true
  10639. });
  10640. Object.defineProperty(AccountData.prototype, "checkscence", {
  10641. get: function () {
  10642. return this.m_app_setting["checkscence"] == "1";
  10643. },
  10644. enumerable: true,
  10645. configurable: true
  10646. });
  10647. Object.defineProperty(AccountData.prototype, "banner_dis", {
  10648. get: function () {
  10649. return Number(this.m_app_setting["banner_dis"]);
  10650. },
  10651. enumerable: true,
  10652. configurable: true
  10653. });
  10654. Object.defineProperty(AccountData.prototype, "bannerMoveTime", {
  10655. get: function () {
  10656. return Number(this.m_app_setting["bannerMoveTime"]);
  10657. },
  10658. enumerable: true,
  10659. configurable: true
  10660. });
  10661. Object.defineProperty(AccountData.prototype, "createBannerTimes", {
  10662. get: function () {
  10663. return Number(this.m_app_setting["createBannerTimes"]);
  10664. },
  10665. enumerable: true,
  10666. configurable: true
  10667. });
  10668. Object.defineProperty(AccountData.prototype, "bannerMoveProp", {
  10669. get: function () {
  10670. return Number(this.m_app_setting["bannerMoveProp"]);
  10671. },
  10672. enumerable: true,
  10673. configurable: true
  10674. });
  10675. Object.defineProperty(AccountData.prototype, "isShareThenVideo", {
  10676. get: function () {
  10677. return this.m_app_setting["isShareThenVideo"] == "1";
  10678. },
  10679. enumerable: true,
  10680. configurable: true
  10681. });
  10682. Object.defineProperty(AccountData.prototype, "isShowHuiTui", {
  10683. get: function () {
  10684. return this.m_app_setting["isShowHuiTui"] == "1";
  10685. },
  10686. enumerable: true,
  10687. configurable: true
  10688. });
  10689. Object.defineProperty(AccountData.prototype, "start_sprint", {
  10690. get: function () {
  10691. return Number(this.m_app_setting["start_sprint"]);
  10692. },
  10693. enumerable: true,
  10694. configurable: true
  10695. });
  10696. Object.defineProperty(AccountData.prototype, "IsVideoModel", {
  10697. get: function () {
  10698. return this.m_app_setting["IsVideoModel"] == "1";
  10699. },
  10700. enumerable: true,
  10701. configurable: true
  10702. });
  10703. Object.defineProperty(AccountData.prototype, "videoModelNum", {
  10704. get: function () {
  10705. return Number(this.m_app_setting["videoModelNum"]);
  10706. },
  10707. enumerable: true,
  10708. configurable: true
  10709. });
  10710. Object.defineProperty(AccountData.prototype, "VideoModelTitle", {
  10711. get: function () {
  10712. return this.m_app_setting["VideoModelTitle"];
  10713. },
  10714. enumerable: true,
  10715. configurable: true
  10716. });
  10717. Object.defineProperty(AccountData.prototype, "failcount", {
  10718. get: function () {
  10719. return Number(this.m_app_setting["failcount"]);
  10720. },
  10721. enumerable: true,
  10722. configurable: true
  10723. });
  10724. Object.defineProperty(AccountData.prototype, "spminspeed", {
  10725. get: function () {
  10726. return Number(this.m_app_setting["spminspeed"]);
  10727. },
  10728. enumerable: true,
  10729. configurable: true
  10730. });
  10731. Object.defineProperty(AccountData.prototype, "bgm", {
  10732. get: function () {
  10733. return this.m_app_setting["bgm"] == "1";
  10734. },
  10735. enumerable: true,
  10736. configurable: true
  10737. });
  10738. Object.defineProperty(AccountData.prototype, "camerahight", {
  10739. get: function () {
  10740. return Number(this.m_app_setting["camerahight"]);
  10741. },
  10742. enumerable: true,
  10743. configurable: true
  10744. });
  10745. Object.defineProperty(AccountData.prototype, "ctnfilename", {
  10746. get: function () {
  10747. return this.m_app_setting["ctnfilename"];
  10748. },
  10749. enumerable: true,
  10750. configurable: true
  10751. });
  10752. Object.defineProperty(AccountData.prototype, "cheat", {
  10753. get: function () {
  10754. return this.m_app_setting["cheat"] == "1";
  10755. },
  10756. enumerable: true,
  10757. configurable: true
  10758. });
  10759. Object.defineProperty(AccountData.prototype, "shakestage", {
  10760. get: function () {
  10761. return this.m_app_setting["shakestage"] && this.m_app_setting["shakestage"] == "1";
  10762. },
  10763. enumerable: true,
  10764. configurable: true
  10765. });
  10766. Object.defineProperty(AccountData.prototype, "stageconfigcdn", {
  10767. get: function () {
  10768. return this.m_app_setting["stageconfigcdn"] == "1";
  10769. },
  10770. enumerable: true,
  10771. configurable: true
  10772. });
  10773. Object.defineProperty(AccountData.prototype, "playerspeed", {
  10774. get: function () {
  10775. return Number(this.m_app_setting["playerspeed"]);
  10776. },
  10777. enumerable: true,
  10778. configurable: true
  10779. });
  10780. Object.defineProperty(AccountData.prototype, "videlAdUnitId", {
  10781. get: function () {
  10782. return this.m_app_setting["videlAdUnitId"];
  10783. },
  10784. enumerable: true,
  10785. configurable: true
  10786. });
  10787. Object.defineProperty(AccountData.prototype, "bannerAdUnitId", {
  10788. get: function () {
  10789. return this.m_app_setting["bannerAdUnitId"];
  10790. },
  10791. enumerable: true,
  10792. configurable: true
  10793. });
  10794. Object.defineProperty(AccountData.prototype, "tri", {
  10795. get: function () {
  10796. return this.m_app_setting["tri"] == "1";
  10797. },
  10798. enumerable: true,
  10799. configurable: true
  10800. });
  10801. Object.defineProperty(AccountData.prototype, "recommend", {
  10802. get: function () {
  10803. return this.m_app_setting["recommend"] == "1";
  10804. },
  10805. enumerable: true,
  10806. configurable: true
  10807. });
  10808. Object.defineProperty(AccountData.prototype, "recommendflg", {
  10809. get: function () {
  10810. return this.m_app_setting["recommendflg"];
  10811. },
  10812. enumerable: true,
  10813. configurable: true
  10814. });
  10815. Object.defineProperty(AccountData.prototype, "egg", {
  10816. get: function () {
  10817. return this.m_app_setting["egg"] == "1";
  10818. },
  10819. enumerable: true,
  10820. configurable: true
  10821. });
  10822. Object.defineProperty(AccountData.prototype, "eggrate", {
  10823. get: function () {
  10824. return Number(this.m_app_setting["eggrate"]);
  10825. },
  10826. enumerable: true,
  10827. configurable: true
  10828. });
  10829. Object.defineProperty(AccountData.prototype, "UseId", {
  10830. get: function () {
  10831. return this.userId;
  10832. },
  10833. enumerable: true,
  10834. configurable: true
  10835. });
  10836. AccountData.prototype.GetConfig = function (_type) {
  10837. var type = AccountConfig[_type];
  10838. return this.m_configs[type];
  10839. };
  10840. AccountData.prototype.GetUser = function (_type) {
  10841. var type = AccountUser[_type];
  10842. return this.m_user[type];
  10843. };
  10844. Object.defineProperty(AccountData.prototype, "GetVideoTotal", {
  10845. get: function () {
  10846. return Number(this.m_user_video["total"]);
  10847. },
  10848. enumerable: true,
  10849. configurable: true
  10850. });
  10851. AccountData.prototype.GetSign = function (_datatype) {
  10852. var type = signdata[_datatype];
  10853. return this.m_sign[type];
  10854. };
  10855. AccountData.prototype.GetRewardConfig = function (_rewardid) {
  10856. var reward = this.m_RewardDic[_rewardid];
  10857. return reward;
  10858. };
  10859. AccountData.prototype.GetEntity = function (_id, attr) {
  10860. if (!this.m_EntityDic[_id])
  10861. return null;
  10862. return this.m_EntityDic[_id][entity[attr]];
  10863. };
  10864. AccountData.prototype.GetRewardDic = function () {
  10865. var config = this.GetConfig(AccountConfig.rewards);
  10866. for (var key in config) {
  10867. this.m_RewardDic[config[key].id] = config[key];
  10868. }
  10869. };
  10870. AccountData.prototype.GetEntityDic = function () {
  10871. var config = this.GetConfig(AccountConfig.entity);
  10872. for (var key in config) {
  10873. this.m_EntityDic[config[key].entity_id] = config[key];
  10874. }
  10875. };
  10876. AccountData.prototype.GetThemeById = function (_id) {
  10877. var data = this.GetConfig(AccountConfig.theme);
  10878. if (data) {
  10879. for (var index = 0; index < data.length; index++) {
  10880. var element = data[index];
  10881. if (element.id == _id) {
  10882. return element;
  10883. }
  10884. }
  10885. }
  10886. };
  10887. AccountData.prototype.GetSkinAttr = function (_id) {
  10888. var config = this.GetConfig(AccountConfig.theme);
  10889. for (var i = 0; i < config.length; i++) {
  10890. if (config[i].id == _id) {
  10891. return config[i];
  10892. }
  10893. }
  10894. };
  10895. AccountData.prototype.GetAchievementData = function () {
  10896. var data = this.GetConfig(AccountConfig.achievement);
  10897. var dic = {};
  10898. for (var key1 in data) {
  10899. var type1 = data[key1].type;
  10900. //var obj = {};
  10901. if (dic[type1]) {
  10902. continue;
  10903. }
  10904. var array = [];
  10905. for (var key2 in data) {
  10906. var type2 = data[key2].type;
  10907. if (type1 == type2) {
  10908. array.push(data[key2]);
  10909. }
  10910. }
  10911. dic[type1] = array;
  10912. }
  10913. this.m_AchievementDic = dic;
  10914. };
  10915. AccountData.prototype.HasTheme = function (_id) {
  10916. var has = false;
  10917. var getthemes = this.GetUser(AccountUser.get_themes);
  10918. for (var i = 0; i < getthemes.length; i++) {
  10919. if (getthemes[i] == _id) {
  10920. has = true;
  10921. }
  10922. }
  10923. return has;
  10924. };
  10925. AccountData.prototype.GetSkinDic = function (_config) {
  10926. };
  10927. AccountData.prototype.GetHeroProgress = function (_id) {
  10928. var config = this.m_user["progress_heroes"];
  10929. var progress = config[_id] ? config[_id] : 0;
  10930. return progress;
  10931. };
  10932. AccountData.prototype.GetHatProgress = function (_id) {
  10933. var config = this.m_user["progress_hats"];
  10934. var progress = config[_id] ? config[_id] : 0;
  10935. return progress;
  10936. };
  10937. AccountData.prototype.GetCbProgress = function (_id) {
  10938. var config = this.m_user["progress_dances"];
  10939. var progress = config[_id] ? config[_id] : 0;
  10940. return progress;
  10941. };
  10942. AccountData.prototype.HasMotor = function (_id) {
  10943. var data = this.GetUser(AccountUser.get_themes);
  10944. for (var i = 0; i < data.length; i++) {
  10945. var hd = data[i];
  10946. if (_id == hd) {
  10947. return true;
  10948. }
  10949. }
  10950. return false;
  10951. };
  10952. //获取皮肤的进度
  10953. AccountData.prototype.GetMotorProgress = function (_id) {
  10954. var config = this.m_user["progress_themes"];
  10955. var progress = config[_id] ? config[_id] : 0;
  10956. return progress;
  10957. };
  10958. AccountData.prototype.GetSeverConfig = function (_config) {
  10959. this.m_configs = _config;
  10960. this.GetSkinDic(this.m_configs);
  10961. this.GetRewardDic();
  10962. this.GetEntityDic();
  10963. // this.GetAchievementData();
  10964. var _globe = _config["global"];
  10965. for (var index = 0; index < _globe.length; index++) {
  10966. var element = _globe[index];
  10967. if (element.key == "tilirec") {
  10968. PlayerAccount.CurrentAccount.tilirec = Number(element.value);
  10969. return;
  10970. }
  10971. }
  10972. };
  10973. AccountData.prototype.UpdateSkinDic = function () {
  10974. this.GetSkinDic(this.m_configs);
  10975. };
  10976. AccountData.prototype.GetGlobe = function (_key) {
  10977. var globe = this.GetConfig(AccountConfig.global);
  10978. for (var key in globe) {
  10979. var obj = globe[key];
  10980. var kkk = obj["key"];
  10981. if (kkk == _key) {
  10982. var value = obj["value"];
  10983. return value;
  10984. }
  10985. }
  10986. return null;
  10987. };
  10988. return AccountData;
  10989. }());
  10990. exports.AccountData = AccountData;
  10991. var PlayerAccount = /** @class */ (function () {
  10992. function PlayerAccount(_code, _nickname, _avatar, _gender, _country, _province, _city, _device, _shareid, _scence, _ver) {
  10993. this.IsTest = false;
  10994. this.localTime = Laya.timer.currTimer;
  10995. this.Code = _code;
  10996. this.NickName = _nickname;
  10997. this.Avatar = _avatar;
  10998. this.Gender = _gender;
  10999. this.Country = _country;
  11000. this.Province = _province;
  11001. this.City = _city;
  11002. this.Device = _device;
  11003. this.ShareId = _shareid;
  11004. this.Scene = _scence;
  11005. this.ver = _ver;
  11006. this.IsTest = false;
  11007. PlayerAccount.instance = this;
  11008. }
  11009. Object.defineProperty(PlayerAccount, "CurrentAccount", {
  11010. get: function () {
  11011. if (PlayerAccount.instance == null) {
  11012. console.log("生成本地测试账号...");
  11013. return PlayerAccount.TestAccount;
  11014. }
  11015. return PlayerAccount.instance;
  11016. },
  11017. enumerable: true,
  11018. configurable: true
  11019. });
  11020. Object.defineProperty(PlayerAccount, "TestAccount", {
  11021. get: function () {
  11022. var code = Laya.LocalStorage.getItem("localcode");
  11023. if (!code) {
  11024. var time = new Date().getTime().toString();
  11025. var random = GameUtils_1.GameUtils.randRangeint(10000, 99999).toString();
  11026. code = "xj_" + time + random;
  11027. Laya.LocalStorage.setItem("localcode", code);
  11028. console.log(time, random);
  11029. console.log("新用户", code);
  11030. }
  11031. else {
  11032. console.log("老用户", code);
  11033. }
  11034. var curaccount = new PlayerAccount(code, null, null, null, null, null, null, null, null, null, null);
  11035. curaccount.IsTest = true;
  11036. return curaccount;
  11037. },
  11038. enumerable: true,
  11039. configurable: true
  11040. });
  11041. PlayerAccount.prototype.SetAccountData = function (data, completecb) {
  11042. var _this = this;
  11043. var token = data["token"];
  11044. var configs = data["configs"];
  11045. var app_setting = data["app_setting"];
  11046. var user = data["user"];
  11047. var user_base = data["user_base"];
  11048. var user_sign = data["user_sign"];
  11049. var user_achievement = data["user_achievement"];
  11050. var user_lottery = data["user_lottery"];
  11051. var user_land_task = data["user_land_task"];
  11052. var user_video = data["user_video"];
  11053. if (this.CurAccountData == null) {
  11054. Sdk_1.WxApi.recordAldEvent("开始获取config数据");
  11055. this.CurAccountData = new AccountData(token, configs, app_setting, user, user_base, null, null, user_sign, user_achievement, user_lottery, user_land_task, user_video);
  11056. this.CheckLocalConfig(data.table_version, function (_config) {
  11057. _this.CurAccountData.GetSeverConfig(_config);
  11058. _this.nowConfig = _config;
  11059. if (completecb != null) {
  11060. completecb.runWith(data);
  11061. }
  11062. });
  11063. }
  11064. else {
  11065. if (configs) {
  11066. this.CurAccountData.m_configs = configs;
  11067. }
  11068. if (app_setting) {
  11069. this.CurAccountData.m_app_setting = app_setting;
  11070. }
  11071. if (user) {
  11072. this.CurAccountData.m_user = user;
  11073. }
  11074. if (user_base) {
  11075. this.CurAccountData.m_user_base = user_base;
  11076. }
  11077. if (user_sign) {
  11078. this.CurAccountData.m_sign = user_sign;
  11079. }
  11080. if (user_achievement) {
  11081. this.CurAccountData.m_task = user_achievement;
  11082. }
  11083. if (user_lottery) {
  11084. this.CurAccountData.lottery = user_lottery;
  11085. }
  11086. if (user_land_task) {
  11087. this.CurAccountData.m_use_land_task = user_land_task;
  11088. }
  11089. if (user_video) {
  11090. this.CurAccountData.m_user_video = user_video;
  11091. }
  11092. }
  11093. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.updatePlayerInfo);
  11094. };
  11095. PlayerAccount.prototype.CheckLocalConfig = function (_ver, cb) {
  11096. var curconfig = Laya.LocalStorage.getJSON(PlayerAccount.localcofigkey);
  11097. if (curconfig) {
  11098. //Laya.LocalStorage.removeItem(PlayerAccount.localcofigkey);
  11099. if (curconfig.ver == _ver) {
  11100. console.log("sever配置是最新的...", _ver);
  11101. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  11102. cb(curconfig);
  11103. }
  11104. else {
  11105. NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) {
  11106. data.configs.ver = _ver;
  11107. Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs);
  11108. console.log("sever配置更新完成...", _ver);
  11109. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  11110. cb(data.configs);
  11111. }), Laya.Handler.create(this, function (data) {
  11112. console.log("配置获取失败" + data);
  11113. Sdk_1.WxApi.recordAldEvent("config接口获取失败");
  11114. }));
  11115. }
  11116. }
  11117. else {
  11118. NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) {
  11119. data.configs.ver = _ver;
  11120. Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs);
  11121. console.log("sever保存配置完成...", _ver);
  11122. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  11123. cb(data.configs);
  11124. }), Laya.Handler.create(this, function (data) {
  11125. console.log("配置获取失败" + data);
  11126. Sdk_1.WxApi.recordAldEvent("config接口获取失败");
  11127. }));
  11128. }
  11129. };
  11130. Object.defineProperty(PlayerAccount.prototype, "ServerTime", {
  11131. get: function () {
  11132. var time = Laya.timer.currTimer;
  11133. var stime = PlayerAccount.ServerTime + Math.ceil((time - this.localTime) / 1000);
  11134. return stime;
  11135. },
  11136. enumerable: true,
  11137. configurable: true
  11138. });
  11139. PlayerAccount.localcofigkey = "mconfig";
  11140. return PlayerAccount;
  11141. }());
  11142. exports.PlayerAccount = PlayerAccount;
  11143. },{"../Data/UserInfoEvent":34,"../WXSDK/Sdk":75,"../utils/DispatcherManager":83,"../utils/GameUtils":85,"./NetworkManager":71}],74:[function(require,module,exports){
  11144. "use strict";
  11145. Object.defineProperty(exports, "__esModule", { value: true });
  11146. var RecordManager = /** @class */ (function () {
  11147. function RecordManager() {
  11148. RecordManager.instance = this;
  11149. console.log("new record");
  11150. }
  11151. Object.defineProperty(RecordManager, "Instance", {
  11152. get: function () {
  11153. if (RecordManager.instance) {
  11154. return RecordManager.instance;
  11155. }
  11156. else {
  11157. var curmanager = new RecordManager();
  11158. curmanager.OnNew();
  11159. return curmanager;
  11160. }
  11161. },
  11162. enumerable: true,
  11163. configurable: true
  11164. });
  11165. RecordManager.prototype.RecordStart = function () {
  11166. if (!Laya.Browser.onMobile)
  11167. return;
  11168. console.log("RecordStart");
  11169. this.record.start({
  11170. duration: 60,
  11171. });
  11172. };
  11173. RecordManager.prototype.RecordStop = function () {
  11174. if (!Laya.Browser.onMobile)
  11175. return;
  11176. console.log("RecordStop");
  11177. this.record.stop();
  11178. };
  11179. RecordManager.prototype.ShareVideo = function (_cb) {
  11180. if (!Laya.Browser.onMobile)
  11181. return;
  11182. Laya.Browser.window.tt.shareAppMessage({
  11183. channel: "video",
  11184. query: "",
  11185. templateId: "11cd2ak160f4k19a6g",
  11186. title: "赢得了我,认你做大哥又如何",
  11187. desc: "赢得了我,认你做大哥又如何",
  11188. extra: {
  11189. videoPath: this.completepath,
  11190. videoTopics: ["赢得了我,认你做大哥又如何"]
  11191. },
  11192. success: function () {
  11193. _cb && _cb(true);
  11194. console.log("分享视频成功");
  11195. },
  11196. fail: function (e) {
  11197. _cb && _cb(false);
  11198. console.log("分享视频失败");
  11199. }
  11200. });
  11201. };
  11202. RecordManager.prototype.OnNew = function () {
  11203. var _this = this;
  11204. if (!Laya.Browser.onMobile)
  11205. return;
  11206. this.record = Laya.Browser.window.tt.getGameRecorderManager();
  11207. this.record.onStart(function (res) {
  11208. // 录屏开始
  11209. console.log(res);
  11210. });
  11211. this.record.onStop(function (res) {
  11212. _this.completepath = res.videoPath;
  11213. console.log(res.videoPath);
  11214. });
  11215. };
  11216. return RecordManager;
  11217. }());
  11218. exports.RecordManager = RecordManager;
  11219. },{}],75:[function(require,module,exports){
  11220. "use strict";
  11221. Object.defineProperty(exports, "__esModule", { value: true });
  11222. var systemtype;
  11223. (function (systemtype) {
  11224. systemtype[systemtype["ios"] = 0] = "ios";
  11225. systemtype[systemtype["android"] = 1] = "android";
  11226. systemtype[systemtype["other"] = 2] = "other";
  11227. })(systemtype = exports.systemtype || (exports.systemtype = {}));
  11228. var WxApi = /** @class */ (function () {
  11229. function WxApi() {
  11230. }
  11231. WxApi.recordAldEvent = function (key, value) {
  11232. if (value === void 0) { value = ""; }
  11233. // if(Laya.Browser.window && Laya.Browser.window.wx)
  11234. // {
  11235. // Laya.Browser.window.wx.aldSendEvent(key,{key:value});
  11236. // }
  11237. console.log("事件: ", key);
  11238. };
  11239. WxApi.WXLogin = function (cb) {
  11240. var that = this;
  11241. Laya.Browser.window.wx.login({
  11242. success: function (res) {
  11243. if (res.code) {
  11244. console.log("code:", res.code);
  11245. cb(res);
  11246. }
  11247. else {
  11248. console.log('获取用户登录态失败!' + res.errMsg);
  11249. }
  11250. },
  11251. fail: function (res) { console.log("wx.login: failed, res=" + res); }
  11252. });
  11253. };
  11254. WxApi.WxInit = function () {
  11255. var _this = this;
  11256. if (!Laya.Browser.onWeiXin)
  11257. return;
  11258. Laya.Browser.window.wx.showShareMenu({
  11259. withShareTicket: true
  11260. });
  11261. Laya.Browser.window.wx.onShow(function (option) {
  11262. console.log(option);
  11263. _this.shareOpenId = option.query.userId;
  11264. _this.querychannel = option.query.channel;
  11265. if (option.referrerInfo) {
  11266. _this.referrerInfoappId = option.referrerInfo.appId;
  11267. console.log("onShow appId is:", option.referrerInfo.appId);
  11268. }
  11269. _this.sceneValue = option.scene;
  11270. var scene = Laya.LocalStorage.getItem("scene");
  11271. if (scene) {
  11272. _this.sceneValue = scene;
  11273. console.log("读取配置场景值:" + scene);
  11274. }
  11275. else {
  11276. console.log("第一次拉取场景值:" + _this.sceneValue);
  11277. Laya.LocalStorage.setItem("scene", _this.sceneValue);
  11278. }
  11279. });
  11280. };
  11281. WxApi.ShowLoading = function (title) {
  11282. if (title === void 0) { title = "加载中..."; }
  11283. // if (this.isShowing) return;
  11284. // this.isShowing = true;
  11285. // (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.showLoading({ title: title, mask: true });
  11286. };
  11287. WxApi.HideLoading = function () {
  11288. // this.isShowing = false;
  11289. // (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.hideLoading();
  11290. };
  11291. WxApi.aldSendOpenid = function (_openid) {
  11292. // if(Laya.Browser.onMiniGame)
  11293. // {
  11294. // console.log("aldSendOpenid",_openid);
  11295. // Laya.Browser.window.wx.aldSendOpenid(_openid);
  11296. // }
  11297. };
  11298. //检测更新
  11299. WxApi.CheckWXUpdate = function () {
  11300. var updateManager = Laya.Browser.window.tt.getUpdateManager();
  11301. updateManager.onCheckForUpdate(function (res) {
  11302. console.log("最新版本:" + res.hasUpdate);
  11303. });
  11304. updateManager.onUpdateReady(function () {
  11305. Laya.Browser.window.tt.showModal({
  11306. showCancel: false,
  11307. title: '更新提示',
  11308. content: '新版本已经准备好,是否重启应用?',
  11309. success: function (res) {
  11310. updateManager.applyUpdate();
  11311. },
  11312. fail: function (res) {
  11313. updateManager.applyUpdate();
  11314. }
  11315. });
  11316. });
  11317. };
  11318. WxApi.levelStart = function (stageId, stageName, userId) {
  11319. // console.log("开始记录关卡:" + stageId);
  11320. // if (Laya.Browser.window && Laya.Browser.window.wx) {
  11321. // Laya.Browser.window.wx.aldStage.onStart(
  11322. // {
  11323. // stageId: stageId, //关卡ID 该字段必传
  11324. // stageName: stageName, //关卡名称 该字段必传
  11325. // userId: userId //用户ID 可选
  11326. // }
  11327. // );
  11328. // if(WxApi.newaccount)
  11329. // {
  11330. // Laya.Browser.window.wx.aldStage.onStart(
  11331. // {
  11332. // stageId: "新用户:" + stageId, //关卡ID 该字段必传
  11333. // stageName: stageName, //关卡名称 该字段必传
  11334. // userId: userId //用户ID 可选
  11335. // }
  11336. // );
  11337. // }
  11338. // }
  11339. };
  11340. WxApi.levelRunning = function (stageId, stageName, userId, userevive) {
  11341. console.log("记录关卡中:" + stageId);
  11342. // if(Laya.Browser.window && Laya.Browser.window.wx)
  11343. // {
  11344. // Laya.Browser.window.wx.aldStage.onRunning({
  11345. // stageId : stageId, //关卡ID 该字段必传
  11346. // stageName : stageName, //关卡名称 该字段必传
  11347. // userId : userId, //用户ID 可选
  11348. // event : "revive", //使用道具 关卡进行中,用户触发的操作 该字段必传
  11349. // params : {
  11350. // itemName : "使用复活",//使用道具名称 该字段必传
  11351. // itemCount : 1, //使用道具数量 可选
  11352. // desc : userevive //使用道具描述
  11353. // }
  11354. // });
  11355. // if(WxApi.newaccount)
  11356. // {
  11357. // Laya.Browser.window.wx.aldStage.onRunning({
  11358. // stageId :"新用户:" + stageId, //关卡ID 该字段必传
  11359. // stageName : stageName, //关卡名称 该字段必传
  11360. // userId : userId, //用户ID 可选
  11361. // event : "revive", //使用道具 关卡进行中,用户触发的操作 该字段必传
  11362. // params : {
  11363. // itemName : "使用复活",//使用道具名称 该字段必传
  11364. // itemCount : 1, //使用道具数量 可选
  11365. // desc : userevive //使用道具描述
  11366. // }
  11367. // })
  11368. // }
  11369. // }
  11370. };
  11371. WxApi.levelSuccess = function (stageId, stageName, userId) {
  11372. console.log("记录关卡:完成" + stageId);
  11373. // if (Laya.Browser.window && Laya.Browser.window.wx) {
  11374. // Laya.Browser.window.wx.aldStage.onEnd(
  11375. // {
  11376. // stageId: stageId, //关卡ID 该字段必传
  11377. // stageName: stageName, //关卡名称 该字段必传
  11378. // userId: userId, //用户ID 可选
  11379. // event: "complete", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  11380. // params:
  11381. // {
  11382. // desc: "关卡完成" //描述
  11383. // }
  11384. // }
  11385. // );
  11386. // if(WxApi.newaccount)
  11387. // {
  11388. // Laya.Browser.window.wx.aldStage.onEnd(
  11389. // {
  11390. // stageId:"新用户:" + stageId, //关卡ID 该字段必传
  11391. // stageName: stageName, //关卡名称 该字段必传
  11392. // userId: userId, //用户ID 可选
  11393. // event: "complete", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  11394. // params:
  11395. // {
  11396. // desc: "关卡完成" //描述
  11397. // }
  11398. // }
  11399. // );
  11400. // }
  11401. // }
  11402. };
  11403. WxApi.levelFail = function (stageId, stageName, userId, score, carname) {
  11404. console.log("记录关卡:失败" + stageId);
  11405. // if (Laya.Browser.window && Laya.Browser.window.wx) {
  11406. // Laya.Browser.window.wx.aldStage.onEnd(
  11407. // {
  11408. // stageId: stageId, //关卡ID 该字段必传
  11409. // stageName: stageName, //关卡名称 该字段必传
  11410. // userId: userId, //用户ID 可选
  11411. // event: "fail", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  11412. // params:
  11413. // {
  11414. // desc: "失败",
  11415. // score: score,//描述
  11416. // car: carname//描述
  11417. // }
  11418. // }
  11419. // );
  11420. // if(WxApi.newaccount)
  11421. // {
  11422. // Laya.Browser.window.wx.aldStage.onEnd(
  11423. // {
  11424. // stageId:"新用户:" + stageId, //关卡ID 该字段必传
  11425. // stageName: stageName, //关卡名称 该字段必传
  11426. // userId: userId, //用户ID 可选
  11427. // event: "fail", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  11428. // params:
  11429. // {
  11430. // desc: "失败",
  11431. // score: score,//描述
  11432. // car: carname//描述
  11433. // }
  11434. // }
  11435. // );
  11436. // }
  11437. // }
  11438. };
  11439. WxApi.OnShow = function (cb) {
  11440. if (!Laya.Browser.window.tt)
  11441. return;
  11442. Laya.Browser.window.tt.onShow(cb);
  11443. };
  11444. WxApi.OffShow = function (cb) {
  11445. if (!Laya.Browser.onWeiXin)
  11446. return;
  11447. Laya.Browser.window.tt.offShow(cb);
  11448. };
  11449. WxApi.shake = function () {
  11450. Laya.Browser.window.tt.vibrateShort({});
  11451. };
  11452. WxApi.shakeLong = function () {
  11453. Laya.Browser.window.tt.vibrateLong({});
  11454. };
  11455. WxApi.Shake = function (_short) {
  11456. if (_short === void 0) { _short = true; }
  11457. if (Laya.Browser.window.tt && WxApi.CanShake) {
  11458. if (_short) {
  11459. this.shake();
  11460. }
  11461. else {
  11462. this.shakeLong();
  11463. }
  11464. }
  11465. if (!_short) {
  11466. this.stageShake();
  11467. }
  11468. };
  11469. WxApi.stageShake = function (callBack, speed) {
  11470. if (callBack === void 0) { callBack = null; }
  11471. if (speed === void 0) { speed = 32; }
  11472. if (this.isShake || !this.canshakestage)
  11473. return;
  11474. this.isShake = true;
  11475. var point = new Laya.Vector2(Laya.stage.x, Laya.stage.y);
  11476. Laya.stage.timerLoop(speed, this, this.shakeObject, [point, callBack]);
  11477. };
  11478. WxApi.shakeObject = function (_point, _callBack) {
  11479. var count = (this.num++) % 4;
  11480. this.offsetArr[this.num % 2] = count < 2 ? 0 : this.offset;
  11481. Laya.stage.x = this.offsetArr[0] + _point.x;
  11482. Laya.stage.y = this.offsetArr[1] + _point.y;
  11483. if (this.num > (this.times * 4 + 1)) {
  11484. Laya.stage.clearTimer(this, this.shakeObject);
  11485. Laya.stage.pos(0, 0);
  11486. this.num = 0;
  11487. this.isShake = false;
  11488. if (_callBack != null) {
  11489. _callBack();
  11490. }
  11491. }
  11492. };
  11493. WxApi.ShowTxt = function (text) {
  11494. if (Laya.Browser.window.tt) {
  11495. Laya.Browser.window.tt.showToast({ title: text });
  11496. }
  11497. else {
  11498. console.log(text);
  11499. }
  11500. };
  11501. Object.defineProperty(WxApi, "SystemFrom", {
  11502. get: function () {
  11503. if (!Laya.Browser.onWeiXin)
  11504. return systemtype.other;
  11505. var info = Laya.Browser.window.wx.getSystemInfoSync();
  11506. var system = info.system;
  11507. var IOS = system.indexOf("iOS") != -1;
  11508. var Android = system.indexOf("Android") != -1;
  11509. if (IOS) {
  11510. return systemtype.ios;
  11511. }
  11512. else if (Android) {
  11513. return systemtype.android;
  11514. }
  11515. else {
  11516. return systemtype.other;
  11517. }
  11518. },
  11519. enumerable: true,
  11520. configurable: true
  11521. });
  11522. Object.defineProperty(WxApi, "IsLongScreenSystem", {
  11523. get: function () {
  11524. if (!Laya.Browser.onWeiXin)
  11525. return false;
  11526. var systemInfo = Laya.Browser.window.wx.getSystemInfoSync();
  11527. var platformModel = "ipx";
  11528. if (systemInfo != null) {
  11529. var model = systemInfo.model;
  11530. platformModel = systemInfo.brand + "_" + model + "_" + systemInfo.system + "_wx" + systemInfo.version + "_SDKVer" + systemInfo.SDKVersion;
  11531. console.log("platformModel:" + platformModel);
  11532. return !(model.indexOf("X") < 0) ||
  11533. ((model.indexOf("oppo") >= 0 || model.indexOf("OPPO") >= 0) && (model.indexOf("R15") >= 0 || model.indexOf("r15") >= 0)) ||
  11534. systemInfo.statusBarHeight > 20 ||
  11535. (model.indexOf("Note") >= 0 && (model.indexOf("7") >= 0 || model.indexOf("8") >= 0)) ||
  11536. ((model.indexOf("iPhone") >= 0) && (model.indexOf("11") >= 0));
  11537. }
  11538. },
  11539. enumerable: true,
  11540. configurable: true
  11541. });
  11542. WxApi.writeStage = function (stage) {
  11543. var kvDataList = new Array();
  11544. var date = new Date().getTime();
  11545. var myValue = JSON.stringify({
  11546. "wxgame": {
  11547. "stage": stage,
  11548. "update_time": date.toString(),
  11549. }
  11550. });
  11551. kvDataList.push({ key: "stage", value: myValue });
  11552. if (Laya.Browser.window.wx) {
  11553. Laya.Browser.window.wx.setUserCloudStorage({
  11554. KVDataList: kvDataList,
  11555. success: function (r) {
  11556. console.log("上传分数成功");
  11557. }
  11558. });
  11559. }
  11560. };
  11561. WxApi.cpVersionGreaterOrEqual = function (v1, v2) {
  11562. console.log("[LOG]\u57FA\u7840\u5E93\u7248\u672C\u53F7 curVer:" + v1 + " targVer:" + v2);
  11563. var v1Arr = v1.split(".");
  11564. var v2Arr = v2.split(".");
  11565. var len = v1Arr.length;
  11566. if (v2Arr.length < len) {
  11567. len = v2Arr.length;
  11568. }
  11569. for (var i = 0; i < len; i++) {
  11570. var ver1 = Number(v1Arr[i]);
  11571. var ver2 = Number(v2Arr[i]);
  11572. if (ver1 > ver2) {
  11573. return true;
  11574. }
  11575. else if (ver1 < ver2) {
  11576. return false;
  11577. }
  11578. }
  11579. return v1Arr.length >= v2Arr.length;
  11580. };
  11581. WxApi.newaccount = false;
  11582. WxApi.sceneValue = "";
  11583. WxApi.shareOpenId = "";
  11584. WxApi.querychannel = "";
  11585. WxApi.referrerInfoappId = "";
  11586. //显示加载信息
  11587. WxApi.isShowing = false;
  11588. WxApi.CanShake = true;
  11589. WxApi.times = 1.3;
  11590. WxApi.num = 0;
  11591. WxApi.offsetArr = [0, 0];
  11592. WxApi.offset = 14;
  11593. WxApi.canshakestage = false;
  11594. return WxApi;
  11595. }());
  11596. exports.WxApi = WxApi;
  11597. },{}],76:[function(require,module,exports){
  11598. "use strict";
  11599. Object.defineProperty(exports, "__esModule", { value: true });
  11600. var DispatcherManager_1 = require("../utils/DispatcherManager");
  11601. var SocketNofify_1 = require("../WXSDK/SocketNofify");
  11602. var ServerSocket = /** @class */ (function () {
  11603. /**
  11604. * socket连接中
  11605. */
  11606. function ServerSocket() {
  11607. /**
  11608. * 1:自动断线,2:主动断线
  11609. */
  11610. this._offlinestate = 0;
  11611. /**
  11612. * 断线重连次数
  11613. */
  11614. this._connetNums = 0;
  11615. this._socketconneting = false;
  11616. ServerSocket.ins = this;
  11617. }
  11618. Object.defineProperty(ServerSocket, "Instance", {
  11619. get: function () {
  11620. if (ServerSocket.ins == null) {
  11621. return new ServerSocket();
  11622. }
  11623. return ServerSocket.ins;
  11624. },
  11625. enumerable: true,
  11626. configurable: true
  11627. });
  11628. //连接服务器
  11629. ServerSocket.prototype.connectServer = function (gameHost) {
  11630. this._socketconneting = true;
  11631. this.removeSocket();
  11632. if (!this.sock || !this.sock.connected) {
  11633. this.openwaitpanel();
  11634. if (!this.sock) {
  11635. this.sock = new Laya.Socket();
  11636. this.sock.on(Laya.Event.OPEN, this, this.onSocketOpen);
  11637. this.sock.on(Laya.Event.MESSAGE, this, this.onReceiveMessage);
  11638. this.sock.on(Laya.Event.CLOSE, this, this.onSocketClose);
  11639. this.sock.on(Laya.Event.ERROR, this, this.ioErro);
  11640. }
  11641. this.sock.connectByUrl(gameHost);
  11642. }
  11643. };
  11644. ServerSocket.prototype.isConnect = function () {
  11645. if (this.sock && this.sock.connected) {
  11646. return true;
  11647. }
  11648. return false;
  11649. };
  11650. ServerSocket.prototype.ioErro = function (e) {
  11651. if (e === void 0) { e = null; }
  11652. this._socketconneting = false;
  11653. this._connetNums++;
  11654. this.closewaitpanel();
  11655. this.removeSocket();
  11656. this._offlinestate = 1;
  11657. };
  11658. ServerSocket.prototype.removeSocket = function () {
  11659. this._socketconneting = false;
  11660. if (this.sock) {
  11661. this.sock.off(Laya.Event.OPEN, this, this.onSocketOpen);
  11662. this.sock.off(Laya.Event.MESSAGE, this, this.onReceiveMessage);
  11663. this.sock.off(Laya.Event.CLOSE, this, this.onSocketClose);
  11664. this.sock.off(Laya.Event.ERROR, this, this.ioErro);
  11665. this.sock.cleanSocket();
  11666. this.sock.close();
  11667. this.sock = null;
  11668. }
  11669. };
  11670. /**
  11671. * 手动关闭游戏socket
  11672. */
  11673. ServerSocket.prototype.colseSocket = function (offlinestate) {
  11674. if (offlinestate === void 0) { offlinestate = 1; }
  11675. if (this.isConnect()) {
  11676. this.closewaitpanel();
  11677. this.removeSocket();
  11678. if (offlinestate != -1) {
  11679. this._offlinestate = offlinestate;
  11680. }
  11681. DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CLOSE);
  11682. }
  11683. };
  11684. ServerSocket.prototype.onSocketClose = function (e) {
  11685. if (e === void 0) { e = null; }
  11686. this._socketconneting = false;
  11687. this.closewaitpanel();
  11688. this._offlinestate = 1;
  11689. DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CLOSE);
  11690. };
  11691. ServerSocket.prototype.closewaitpanel = function () {
  11692. fairygui.GRoot.inst.closeModalWait();
  11693. };
  11694. ServerSocket.prototype.openwaitpanel = function () {
  11695. fairygui.GRoot.inst.showModalWait();
  11696. };
  11697. //连接成功返回
  11698. ServerSocket.prototype.onSocketOpen = function (event) {
  11699. if (event === void 0) { event = null; }
  11700. this._connetNums = 0;
  11701. this.closewaitpanel();
  11702. this._offlinestate = 0;
  11703. DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CONNECT_SUCCEED, null, false);
  11704. };
  11705. //向服务端发送消息
  11706. ServerSocket.prototype.sendMessage = function (act, data, isShowWait) {
  11707. if (isShowWait === void 0) { isShowWait = true; }
  11708. if (this.sock && this.sock.connected) {
  11709. if (isShowWait) {
  11710. this.openwaitpanel();
  11711. }
  11712. if (!data) {
  11713. data = {};
  11714. }
  11715. data.ACTION = act;
  11716. this.sock.send(JSON.stringify(data));
  11717. }
  11718. else {
  11719. }
  11720. };
  11721. //消息返回后,会广播出去
  11722. //Global.addEventListener("你发送的cmd名称",监听方法,this)
  11723. ServerSocket.prototype.onReceiveMessage = function (msg) {
  11724. if (msg === void 0) { msg = null; }
  11725. var socketdata = JSON.parse(msg);
  11726. };
  11727. return ServerSocket;
  11728. }());
  11729. exports.ServerSocket = ServerSocket;
  11730. },{"../WXSDK/SocketNofify":77,"../utils/DispatcherManager":83}],77:[function(require,module,exports){
  11731. "use strict";
  11732. Object.defineProperty(exports, "__esModule", { value: true });
  11733. var SocketNofify = /** @class */ (function () {
  11734. function SocketNofify() {
  11735. }
  11736. /**
  11737. * socket连接成功
  11738. */
  11739. SocketNofify.SOCKET_CONNECT_SUCCEED = "SOCKET_CONNECT_SUCCEED";
  11740. /**
  11741. * socket关闭
  11742. */
  11743. SocketNofify.SOCKET_CLOSE = "SOCKET_CLOSE";
  11744. /**
  11745. * 游戏重新连接
  11746. */
  11747. SocketNofify.Game_againConnetSocket = "Game_againConnetSocket";
  11748. return SocketNofify;
  11749. }());
  11750. exports.SocketNofify = SocketNofify;
  11751. },{}],78:[function(require,module,exports){
  11752. "use strict";
  11753. Object.defineProperty(exports, "__esModule", { value: true });
  11754. var WECHATEVENT = /** @class */ (function () {
  11755. function WECHATEVENT() {
  11756. }
  11757. /**
  11758. * 游戏进入后台事件
  11759. */
  11760. WECHATEVENT.WECHATEVENT_onhide = "WECHATEVENT_onhide";
  11761. WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd = "WECHATEVENT_onAudioInterruptionEnd";
  11762. WECHATEVENT.WECHATEVENT_losefocus = "WECHATEVENT_losefocus";
  11763. WECHATEVENT.WECHATEVENT_getfocus = "WECHATEVENT_getfocus";
  11764. WECHATEVENT.WECHATEVENT_updateVideoNums = "WECHATEVENT_updateVideoNums";
  11765. /**
  11766. * 用户打点
  11767. */
  11768. WECHATEVENT.message_9891002 = "9891002";
  11769. /**
  11770. * 获取后台数据
  11771. */
  11772. WECHATEVENT.message_9891101 = "9891101";
  11773. WECHATEVENT.WECHATEVENT_loginSucceed = "WECHATEVENT_loginSucceed";
  11774. /**
  11775. * 游戏从后台恢复显示事件
  11776. */
  11777. WECHATEVENT.WECHATEVENT_onshow = "WECHATEVENT_onshow";
  11778. /**
  11779. * 从收藏或者浮窗进入游戏
  11780. */
  11781. WECHATEVENT.WECHATEVENT_fromscorfk = "WECHATEVENT_fromscorfk";
  11782. /**
  11783. * 登录
  11784. */
  11785. WECHATEVENT.message_9891001 = "9891001";
  11786. /**
  11787. * 广告点击
  11788. */
  11789. WECHATEVENT.message_9891102 = "9891102";
  11790. /**
  11791. * 点击确定跳转到外部游戏
  11792. */
  11793. WECHATEVENT.message_9891103 = "9891103";
  11794. return WECHATEVENT;
  11795. }());
  11796. exports.WECHATEVENT = WECHATEVENT;
  11797. },{}],79:[function(require,module,exports){
  11798. "use strict";
  11799. Object.defineProperty(exports, "__esModule", { value: true });
  11800. var GameUtils_1 = require("../utils/GameUtils");
  11801. var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
  11802. var Global_1 = require("../Global");
  11803. var DateControl_1 = require("../Control/DateControl");
  11804. var LocalDataControl_1 = require("../Control/LocalDataControl");
  11805. var UserDataInfo_1 = require("../Data/UserDataInfo");
  11806. var GlobalTip_1 = require("../utils/GlobalTip");
  11807. var DispatcherManager_1 = require("../utils/DispatcherManager");
  11808. var AudioControl_1 = require("../Control/AudioControl");
  11809. /*
  11810. * name;
  11811. */
  11812. var WXGamePlatform = /** @class */ (function () {
  11813. function WXGamePlatform() {
  11814. this.isShareing = false;
  11815. this.bannerRunTime = 0;
  11816. this._bannerTypeList = [];
  11817. this._screenwidth = 0;
  11818. this.bannerheight = 0;
  11819. this.bannerwidth = 0;
  11820. this.isonResize = false;
  11821. /**
  11822. * 排行榜打开类型存储
  11823. */
  11824. this._openrankDict = {};
  11825. WXGamePlatform.ins = this;
  11826. }
  11827. Object.defineProperty(WXGamePlatform, "Instance", {
  11828. get: function () {
  11829. if (WXGamePlatform.ins == null) {
  11830. return new WXGamePlatform();
  11831. }
  11832. return WXGamePlatform.ins;
  11833. },
  11834. enumerable: true,
  11835. configurable: true
  11836. });
  11837. WXGamePlatform.prototype.init = function () {
  11838. this.showShareMenu({ withShareTicket: true });
  11839. this.onAudioInterruptionBegin();
  11840. this.onAudioInterruptionEnd();
  11841. };
  11842. WXGamePlatform.prototype.initShareDian = function (data) {
  11843. if (data && data.length > 0) {
  11844. var itemd;
  11845. for (var s in data) {
  11846. itemd = data[s];
  11847. WXGamePlatform.ShareDict[itemd.key] = itemd;
  11848. }
  11849. var firstd = data[0];
  11850. this.onShareAppMessage(firstd.tile, Global_1.Global.cdnurl + firstd.img);
  11851. }
  11852. };
  11853. WXGamePlatform.prototype.initData = function () {
  11854. if (DateControl_1.DateControl.Fresh) {
  11855. WXGamePlatform.dayShareNum = 0;
  11856. WXGamePlatform.dayVideoNum = 0;
  11857. this.updateDayShareInfo();
  11858. this.updateDayVideoInfo();
  11859. }
  11860. else {
  11861. WXGamePlatform.dayShareNum = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.nowdayShare);
  11862. WXGamePlatform.dayVideoNum = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.nowdayVideo);
  11863. }
  11864. };
  11865. /**
  11866. * 存储当天分享的信息
  11867. */
  11868. WXGamePlatform.prototype.updateDayShareInfo = function () {
  11869. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.nowdayShare, WXGamePlatform.dayShareNum.toString());
  11870. };
  11871. WXGamePlatform.prototype.updateDayVideoInfo = function () {
  11872. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.nowdayVideo, WXGamePlatform.dayVideoNum.toString());
  11873. };
  11874. WXGamePlatform.prototype.createUserAndLogin = function (callobj, succeedcallback, progressCallback, failcallback) {
  11875. if (progressCallback === void 0) { progressCallback = null; }
  11876. if (failcallback === void 0) { failcallback = null; }
  11877. WXGamePlatform.loginCallobj = callobj;
  11878. WXGamePlatform.loginsucceedcallback = succeedcallback;
  11879. WXGamePlatform.loginprogressCallback = progressCallback;
  11880. var wx = Laya.Browser.window.wx;
  11881. if (wx) {
  11882. var login_info = WXGamePlatform.Instance.getLaunchOptionsSync();
  11883. if (login_info) {
  11884. var query = login_info.query;
  11885. if (query && query.ChanID) {
  11886. WXGamePlatform.QuDaoID = query.ChanID;
  11887. }
  11888. var referrerInfo = login_info.referrerInfo;
  11889. if (WXGamePlatform.QuDaoID == "" && referrerInfo && referrerInfo.appId) {
  11890. WXGamePlatform.QuDaoID = referrerInfo.appId;
  11891. }
  11892. if (login_info.scene) {
  11893. WXGamePlatform.fromscene = Number(login_info.scene);
  11894. }
  11895. }
  11896. var systemres = wx.getSystemInfoSync();
  11897. var version = systemres.SDKVersion;
  11898. if (wx.getUpdateManager) {
  11899. var updateManager = wx.getUpdateManager();
  11900. updateManager.onCheckForUpdate(function (res) {
  11901. // 请求完新版本信息的回调
  11902. if (res.hasUpdate == true) {
  11903. updateManager.onUpdateReady(function () {
  11904. Laya.Browser.window.wx.showModal({
  11905. title: '更新提示',
  11906. content: '新版本已经准备好,是否重启应用?',
  11907. success: function (res) {
  11908. if (res.confirm) {
  11909. // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
  11910. updateManager.applyUpdate();
  11911. }
  11912. else {
  11913. WXGamePlatform.Instance.exitGame();
  11914. }
  11915. }
  11916. });
  11917. });
  11918. updateManager.onUpdateFailed(function () {
  11919. // 新版本下载失败
  11920. WXGamePlatform.Instance.exitGame();
  11921. });
  11922. }
  11923. else {
  11924. // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback )
  11925. // {
  11926. // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 );
  11927. // }
  11928. var wxplatform = WXGamePlatform.Instance;
  11929. wxplatform.login(callobj, succeedcallback, failcallback);
  11930. }
  11931. });
  11932. }
  11933. else {
  11934. // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback )
  11935. // {
  11936. // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 );
  11937. // }
  11938. var wxplatform = WXGamePlatform.Instance;
  11939. wxplatform.login(callobj, succeedcallback, failcallback);
  11940. }
  11941. }
  11942. };
  11943. WXGamePlatform.prototype.createUserInfoButton = function (callobj, callback, failcallback) {
  11944. this.userinfocallobj = callobj;
  11945. this.userinfosuccallback = callback;
  11946. this.userinfofailcallback = failcallback;
  11947. var wx = Laya.Browser.window.wx;
  11948. var res = wx.getSystemInfoSync();
  11949. if (res) {
  11950. var posx = (res.windowWidth - 151) / 2;
  11951. var posy = res.windowHeight - 172 - 40;
  11952. WXGamePlatform.Instance.userinfobutton = wx.createUserInfoButton({
  11953. type: 'image',
  11954. image: 'wxlocal/login.png',
  11955. style: {
  11956. left: posx,
  11957. top: posy,
  11958. width: 151,
  11959. height: 72
  11960. }
  11961. });
  11962. WXGamePlatform.Instance.userinfobutton.onTap(WXGamePlatform.Instance.userinfoButtonClick);
  11963. }
  11964. };
  11965. /**
  11966. * 判断是否已经授权
  11967. */
  11968. WXGamePlatform.prototype.getaccredit = function (callobj, accreditCallback) {
  11969. if (WXGamePlatform.accreditstate == 0) {
  11970. var wx = Laya.Browser.window.wx;
  11971. if (wx) {
  11972. wx.getSetting({
  11973. success: function (res) {
  11974. var itemd = res.authSetting;
  11975. if (itemd.hasOwnProperty("scope.userInfo") && itemd["scope.userInfo"] == true) //已经授权过
  11976. {
  11977. if (accreditCallback && callobj) {
  11978. accreditCallback.call(callobj, true);
  11979. }
  11980. }
  11981. else {
  11982. if (accreditCallback && callobj) {
  11983. accreditCallback.call(callobj, false);
  11984. }
  11985. }
  11986. }
  11987. });
  11988. }
  11989. else {
  11990. if (accreditCallback && callobj) {
  11991. accreditCallback.call(callobj, true);
  11992. }
  11993. }
  11994. }
  11995. else {
  11996. if (accreditCallback && callobj) {
  11997. accreditCallback.call(callobj, true);
  11998. }
  11999. }
  12000. };
  12001. WXGamePlatform.prototype.userinfoButtonClick = function (res) {
  12002. var wxplatform = WXGamePlatform.Instance;
  12003. if (res) {
  12004. var errMsg = res.errMsg;
  12005. if (errMsg == "getUserInfo:ok") {
  12006. WXGamePlatform.accreditstate = 1;
  12007. wxplatform.closeuserinfobUtton();
  12008. wxplatform.getUserInfo(false, wxplatform.userinfocallobj, wxplatform.userinfosuccallback, wxplatform.userinfofailcallback);
  12009. }
  12010. else {
  12011. if (wxplatform.userinfocallobj && wxplatform.userinfofailcallback) {
  12012. wxplatform.userinfofailcallback.call(wxplatform.userinfocallobj);
  12013. }
  12014. }
  12015. }
  12016. };
  12017. WXGamePlatform.prototype.closeuserinfobUtton = function () {
  12018. var wxplatform = WXGamePlatform.Instance;
  12019. if (wxplatform.userinfobutton) {
  12020. wxplatform.userinfobutton.offTap(wxplatform.userinfoButtonClick);
  12021. wxplatform.userinfobutton.destroy();
  12022. wxplatform.userinfobutton = null;
  12023. }
  12024. };
  12025. WXGamePlatform.prototype.getUserInfo = function (islogin, callobj, callback, failcallback) {
  12026. fairygui.GRoot.inst.showModalWait();
  12027. var wxplatform = WXGamePlatform.Instance;
  12028. var wx = Laya.Browser.window.wx;
  12029. if (wx) {
  12030. wx.getUserInfo({
  12031. success: function (res) {
  12032. var userInfo = res.userInfo;
  12033. WXGamePlatform.nickName = userInfo.nickName;
  12034. if (islogin) {
  12035. wxplatform.login(callobj, callback, failcallback);
  12036. }
  12037. else {
  12038. if (callobj && callback) {
  12039. callback.call(callobj, WXGamePlatform.nickName);
  12040. }
  12041. }
  12042. }
  12043. });
  12044. }
  12045. };
  12046. /**
  12047. * 登录
  12048. * @param callobj
  12049. * @param succeedcallback
  12050. * @param failCallback
  12051. */
  12052. WXGamePlatform.prototype.login = function (callobj, callback, failcallback) {
  12053. var wxplatform = WXGamePlatform.Instance;
  12054. if (Laya.Browser.window.wx) {
  12055. Laya.Browser.window.wx.login({
  12056. success: function (res) {
  12057. WXGamePlatform.code = res.code;
  12058. var itemd = {};
  12059. if (WXGamePlatform.QuDaoID != "") {
  12060. itemd.ChanID = WXGamePlatform.QuDaoID;
  12061. }
  12062. itemd.Code = WXGamePlatform.code;
  12063. itemd.AppID = Global_1.Global.appid;
  12064. itemd.Version = Global_1.Global.gameVersion;
  12065. },
  12066. fail: function (res) {
  12067. wxplatform.login(callobj, callback, failcallback);
  12068. }
  12069. });
  12070. }
  12071. };
  12072. WXGamePlatform.prototype.loginSucceedCallback = function (data) {
  12073. if (WXGamePlatform.loginCallobj && WXGamePlatform.loginsucceedcallback) {
  12074. WXGamePlatform.loginsucceedcallback.call(WXGamePlatform.loginCallobj, data);
  12075. }
  12076. };
  12077. WXGamePlatform.prototype.loadSubpackage = function (name, subcallobj, subcallback, updatecallback, subfailcallback) {
  12078. if (Laya.Browser.window.wx) {
  12079. this._subcallobj = subcallobj;
  12080. this._subcallback = subcallback;
  12081. this._updatecallback = updatecallback;
  12082. this._subfailcallback = subfailcallback;
  12083. var wx = Laya.Browser.window.wx;
  12084. if (wx.loadSubpackage) {
  12085. var loadTask = wx.loadSubpackage({
  12086. name: name,
  12087. success: function (res) {
  12088. // 分包加载成功后通过 success 回调
  12089. var wxgamePlatform = WXGamePlatform.Instance;
  12090. if (wxgamePlatform._subcallback && wxgamePlatform._subcallobj) {
  12091. wxgamePlatform._subcallback.call(wxgamePlatform._subcallobj);
  12092. }
  12093. },
  12094. fail: function (res) {
  12095. // 分包加载失败通过 fail 回调
  12096. var wxgamePlatform = WXGamePlatform.Instance;
  12097. if (wxgamePlatform._subfailcallback && wxgamePlatform._subcallobj) {
  12098. wxgamePlatform._subfailcallback.call(wxgamePlatform._subcallobj);
  12099. }
  12100. }
  12101. });
  12102. if (loadTask.onProgressUpdate) {
  12103. loadTask.onProgressUpdate(function (res) {
  12104. var wxgamePlatform = WXGamePlatform.Instance;
  12105. if (wxgamePlatform._updatecallback && wxgamePlatform._subcallobj) {
  12106. wxgamePlatform._updatecallback.call(wxgamePlatform._subcallobj, res.progress);
  12107. }
  12108. });
  12109. }
  12110. }
  12111. else {
  12112. if (subcallobj && subcallback) {
  12113. subcallback.call(subcallobj);
  12114. }
  12115. }
  12116. }
  12117. else {
  12118. if (subcallobj && subcallback) {
  12119. subcallback.call(subcallobj);
  12120. }
  12121. }
  12122. };
  12123. /**
  12124. * 获取转发详细信息
  12125. * @param obj
  12126. * @param callobj
  12127. * @param succeedcallback
  12128. * @param failCallback
  12129. */
  12130. WXGamePlatform.prototype.getShareInfo = function (obj, callobj, succeedcallback, failCallback) {
  12131. if (failCallback === void 0) { failCallback = null; }
  12132. if (Laya.Browser.window.wx) {
  12133. Laya.Browser.window.wx.getShareInfo({
  12134. shareTicket: obj.shareTicket,
  12135. success: function (res) {
  12136. succeedcallback.call(callobj, res);
  12137. }
  12138. });
  12139. }
  12140. };
  12141. /**
  12142. * 监听用户点击右上角菜单的“转发”按钮时触发的事件
  12143. * @param title
  12144. * @param imageUrl
  12145. */
  12146. WXGamePlatform.prototype.onShareAppMessage = function (title, imageUrl) {
  12147. if (Laya.Browser.window.wx) {
  12148. Laya.Browser.window.wx.onShareAppMessage(function () {
  12149. return {
  12150. title: title,
  12151. imageUrl: imageUrl
  12152. };
  12153. });
  12154. }
  12155. };
  12156. /**
  12157. * 主动拉起转发,进入选择通讯录界面。
  12158. * @param title
  12159. * @param imageUrl
  12160. */
  12161. WXGamePlatform.prototype.shareAppMessage = function (d) {
  12162. if (Laya.Browser.window.wx) {
  12163. Laya.Browser.window.wx.shareAppMessage(d);
  12164. }
  12165. };
  12166. /**
  12167. * 显示当前页面的转发按钮
  12168. * @param obj
  12169. */
  12170. WXGamePlatform.prototype.showShareMenu = function (obj) {
  12171. if (obj === void 0) { obj = null; }
  12172. if (Laya.Browser.window.wx) {
  12173. Laya.Browser.window.wx.showShareMenu(obj);
  12174. }
  12175. };
  12176. /**
  12177. * 更新转发属性
  12178. * @param obj
  12179. */
  12180. WXGamePlatform.prototype.updateShareMenu = function (obj) {
  12181. if (obj === void 0) { obj = null; }
  12182. if (Laya.Browser.window.wx) {
  12183. Laya.Browser.window.wx.updateShareMenu(obj);
  12184. }
  12185. };
  12186. /**
  12187. * 显示当前页面的转发按钮
  12188. */
  12189. WXGamePlatform.prototype.showMenu = function () {
  12190. if (Laya.Browser.window.wx) {
  12191. Laya.Browser.window.wx.showShareMenu();
  12192. }
  12193. };
  12194. /**
  12195. * 本地存储
  12196. * @param key
  12197. * @param data
  12198. */
  12199. WXGamePlatform.prototype.setStorageSync = function (key, data) {
  12200. var wx = Laya.Browser.window.wx;
  12201. if (wx) {
  12202. wx.setStorageSync(key, data);
  12203. }
  12204. };
  12205. /**
  12206. * 获取本地存储
  12207. * @param key
  12208. */
  12209. WXGamePlatform.prototype.getStorageSync = function (key) {
  12210. var wx = Laya.Browser.window.wx;
  12211. if (wx) {
  12212. return wx.getStorageSync(key);
  12213. }
  12214. return null;
  12215. };
  12216. WXGamePlatform.prototype.setUserCloudStorage = function (obj, callobj, succeedcallback, failCallback) {
  12217. if (callobj === void 0) { callobj = null; }
  12218. if (succeedcallback === void 0) { succeedcallback = null; }
  12219. if (failCallback === void 0) { failCallback = null; }
  12220. var wx = Laya.Browser.window.wx;
  12221. if (wx && wx.setUserCloudStorage) {
  12222. wx.setUserCloudStorage({
  12223. KVDataList: obj,
  12224. success: function (res) {
  12225. if (succeedcallback) {
  12226. succeedcallback.call(callobj, res);
  12227. }
  12228. },
  12229. fail: function (res) {
  12230. if (failCallback) {
  12231. failCallback.call(callobj);
  12232. }
  12233. }
  12234. });
  12235. }
  12236. };
  12237. /**
  12238. * 显示消息提示框
  12239. * @param word
  12240. */
  12241. WXGamePlatform.prototype.toast = function (word) {
  12242. if (Laya.Browser.window.wx) {
  12243. Laya.Browser.window.wx.showToast({ title: word });
  12244. }
  12245. };
  12246. /**
  12247. * 向开放数据域发送消息
  12248. * @param obj
  12249. */
  12250. WXGamePlatform.prototype.postMessage = function (str, data) {
  12251. if (data === void 0) { data = null; }
  12252. var wx = Laya.Browser.window.wx;
  12253. if (wx) {
  12254. var context = wx.getOpenDataContext();
  12255. context.postMessage({ action: str, data: data });
  12256. }
  12257. };
  12258. /**
  12259. * 创建一个 InnerAudioContext 实例
  12260. */
  12261. WXGamePlatform.prototype.createInnerAudioContext = function () {
  12262. if (Laya.Browser.window.wx) {
  12263. return Laya.Browser.window.wx.createInnerAudioContext();
  12264. }
  12265. return null;
  12266. };
  12267. /**
  12268. * 获取系统信息
  12269. */
  12270. WXGamePlatform.prototype.getSystemInfoSync = function () {
  12271. if (Laya.Browser.window.wx) {
  12272. return Laya.Browser.window.wx.getSystemInfoSync();
  12273. }
  12274. return null;
  12275. };
  12276. /**
  12277. * 预览图片,调用之后会在新打开的页面中全屏预览传入的图片,预览的过程中用户可以进行保存图片、发送给朋友等操作
  12278. * @param obj
  12279. */
  12280. WXGamePlatform.prototype.previewImage = function (obj) {
  12281. if (Laya.Browser.window.wx) {
  12282. Laya.Browser.window.wx.previewImage(obj);
  12283. }
  12284. };
  12285. /**
  12286. * 监听小游戏隐藏到后台事件。锁屏、按 HOME 键退到桌面、显示在聊天顶部等操作会触发此事件。
  12287. * @param callobj
  12288. * @param succeedcallback
  12289. */
  12290. WXGamePlatform.prototype.onHide = function (callobj, succeedcallback) {
  12291. if (Laya.Browser.window.wx) {
  12292. Laya.Browser.window.wx.onHide(function (res) {
  12293. WXGamePlatform.isShowing = false;
  12294. if (succeedcallback && callobj) {
  12295. succeedcallback.call(callobj, res);
  12296. }
  12297. });
  12298. }
  12299. };
  12300. /**
  12301. * 返回小程序启动参数
  12302. * @param callobj
  12303. * @param succeedcallback
  12304. */
  12305. WXGamePlatform.prototype.getLaunchOptionsSync = function () {
  12306. if (Laya.Browser.window.wx) {
  12307. return Laya.Browser.window.wx.getLaunchOptionsSync();
  12308. }
  12309. return null;
  12310. };
  12311. /**
  12312. * 隐藏消息提示框
  12313. * @param obj
  12314. */
  12315. WXGamePlatform.prototype.hideToast = function (obj) {
  12316. if (Laya.Browser.window.wx) {
  12317. Laya.Browser.window.wx.hideToast(obj);
  12318. }
  12319. };
  12320. /**
  12321. * 显示模态对话框
  12322. * @param obj
  12323. */
  12324. WXGamePlatform.prototype.showModal = function (obj) {
  12325. if (Laya.Browser.window.wx) {
  12326. Laya.Browser.window.wx.showModal(obj);
  12327. }
  12328. };
  12329. /**
  12330. * 清理存储数据
  12331. */
  12332. WXGamePlatform.prototype.clearStorage = function () {
  12333. if (Laya.Browser.window.wx) {
  12334. Laya.Browser.window.wx.clearStorageSync();
  12335. }
  12336. };
  12337. /**
  12338. * 使手机发生较短时间的振动(15 ms)
  12339. * @param obj
  12340. */
  12341. WXGamePlatform.prototype.vibrateShort = function () {
  12342. if (Laya.Browser.window.wx) {
  12343. Laya.Browser.window.wx.vibrateShort();
  12344. }
  12345. };
  12346. /**
  12347. * 从本地缓存中移除指定 key
  12348. * @param key
  12349. */
  12350. WXGamePlatform.prototype.removeStorage = function (key) {
  12351. if (Laya.Browser.window.wx) {
  12352. Laya.Browser.window.wx.removeStorage(key);
  12353. }
  12354. };
  12355. WXGamePlatform.prototype.onAudioInterruptionBegin = function () {
  12356. if (Laya.Browser.window.wx) {
  12357. Laya.Browser.window.wx.onAudioInterruptionBegin(function () {
  12358. // SoundssManager.Instance.playbgSound("bgm");
  12359. AudioControl_1.AudioControl.Instance.ClearAllSOUND();
  12360. });
  12361. }
  12362. };
  12363. WXGamePlatform.prototype.onAudioInterruptionEnd = function () {
  12364. if (Laya.Browser.window.wx) {
  12365. Laya.Browser.window.wx.onAudioInterruptionEnd(function () {
  12366. var wxgameplatform = WXGamePlatform.Instance;
  12367. Laya.timer.clear(wxgameplatform, wxgameplatform.onAudioEndCallback);
  12368. Laya.timer.once(500, wxgameplatform, wxgameplatform.onAudioEndCallback);
  12369. });
  12370. }
  12371. };
  12372. WXGamePlatform.prototype.onAudioEndCallback = function () {
  12373. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd);
  12374. };
  12375. /**
  12376. * 退出游戏
  12377. */
  12378. WXGamePlatform.prototype.exitGame = function () {
  12379. var wx = Laya.Browser.window.wx;
  12380. if (wx) {
  12381. wx.exitMiniProgram();
  12382. }
  12383. };
  12384. /**
  12385. * 打开客服对话框
  12386. */
  12387. WXGamePlatform.prototype.openCustomerService = function () {
  12388. var wx = Laya.Browser.window.wx;
  12389. if (wx) {
  12390. var version = wx.getSystemInfoSync().SDKVersion;
  12391. if (GameUtils_1.GameUtils.compareVersion(version, '2.0.3') >= 0 && wx.openCustomerServiceConversation) {
  12392. wx.openCustomerServiceConversation({
  12393. showMessageCard: true,
  12394. sendMessageImg: "https://resource.51yoyoyo.com/res/wxsendmessageimg/smi.jpg"
  12395. });
  12396. }
  12397. else {
  12398. // AlertUtils.showWordTips("当前微信版本不支持");
  12399. }
  12400. }
  12401. };
  12402. /**
  12403. * 监听内存不足告警
  12404. */
  12405. WXGamePlatform.prototype.onMemoryWarning = function () {
  12406. var wx = Laya.Browser.window.wx;
  12407. if (wx && wx.onMemoryWarning) {
  12408. wx.onMemoryWarning(function () {
  12409. });
  12410. }
  12411. };
  12412. WXGamePlatform.prototype.onError = function () {
  12413. var wx = Laya.Browser.window.wx;
  12414. if (wx && wx.onError) {
  12415. wx.onError(function (res) {
  12416. console.log("*****onError", res);
  12417. });
  12418. }
  12419. };
  12420. /**
  12421. * 开始分享
  12422. */
  12423. WXGamePlatform.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) {
  12424. if (callobj === void 0) { callobj = null; }
  12425. if (succeedCallback === void 0) { succeedCallback = null; }
  12426. if (failCallback === void 0) { failCallback = null; }
  12427. WXGamePlatform.nowShareindex = 0;
  12428. if (WXGamePlatform.ShareDict[key]) {
  12429. this.shareApp(WXGamePlatform.ShareDict[key], callobj, succeedCallback, failCallback);
  12430. }
  12431. };
  12432. WXGamePlatform.prototype.shareApp = function (info, callobj, success, failCallback) {
  12433. this.nowshareObj = callobj;
  12434. this.nowshareinfo = info;
  12435. this.nowsharesucceedfun = success;
  12436. this.nowsharefailfun = failCallback;
  12437. this.startShareTime = Laya.Browser.now();
  12438. this.isShareing = true;
  12439. WXGamePlatform.callbackfailstate = 0;
  12440. this.shareAppMessage({
  12441. title: info.tile, imageUrl: Global_1.Global.cdnurl + info.img, query: "",
  12442. success: function (res) {
  12443. },
  12444. fail: function (res) {
  12445. GlobalTip_1.GlobalTip.Instance.showWordTips("您取消了分享");
  12446. if (failCallback && callobj) {
  12447. failCallback.call(callobj);
  12448. }
  12449. },
  12450. cancel: function (res) {
  12451. WXGamePlatform.callbackfailstate = 1;
  12452. }
  12453. });
  12454. };
  12455. /**
  12456. * 监听小游戏回到前台的事件
  12457. * @param callobj
  12458. * @param succeedcallback
  12459. * @param failCallback
  12460. */
  12461. WXGamePlatform.prototype.onShow = function (callobj, succeedcallback, failCallback) {
  12462. if (callobj === void 0) { callobj = null; }
  12463. if (succeedcallback === void 0) { succeedcallback = null; }
  12464. if (failCallback === void 0) { failCallback = null; }
  12465. this.showobj = callobj;
  12466. this.showCallback = succeedcallback;
  12467. var wx = Laya.Browser.window.wx;
  12468. if (wx) {
  12469. wx.onShow(function (res) {
  12470. WXGamePlatform.isShowing = true;
  12471. if (res && res.scene) {
  12472. WXGamePlatform.fromscene = Number(res.scene);
  12473. }
  12474. Laya.timer.frameOnce(1, WXGamePlatform.Instance, WXGamePlatform.Instance.onShowSucceed);
  12475. });
  12476. }
  12477. };
  12478. WXGamePlatform.prototype.onShowSucceed = function () {
  12479. var wxgameplatform = WXGamePlatform.Instance;
  12480. if (wxgameplatform.showobj && wxgameplatform.showCallback) {
  12481. wxgameplatform.showCallback.call(wxgameplatform.showobj);
  12482. }
  12483. if (wxgameplatform.isShareing) //如果是分享状态
  12484. {
  12485. wxgameplatform.isShareing = false;
  12486. var isShareSucceed = false;
  12487. if (WXGamePlatform.callbackfailstate == 0) {
  12488. var nowTime = Laya.Browser.now();
  12489. var disTime = (nowTime - wxgameplatform.startShareTime) / 1000;
  12490. if (disTime >= WXGamePlatform.ShareTime || WXGamePlatform.nowShareindex >= 3) {
  12491. isShareSucceed = true;
  12492. }
  12493. }
  12494. WXGamePlatform.callbackfailstate = 0;
  12495. if (isShareSucceed) {
  12496. WXGamePlatform.dayShareNum++;
  12497. wxgameplatform.updateDayShareInfo();
  12498. if (wxgameplatform.nowshareObj && wxgameplatform.nowsharesucceedfun) {
  12499. wxgameplatform.nowsharesucceedfun.call(wxgameplatform.nowshareObj);
  12500. }
  12501. }
  12502. else {
  12503. WXGamePlatform.nowShareindex++;
  12504. wxgameplatform.showModal({
  12505. title: "提示", content: "请每次分享到不同群,是否重新分享?", showCancel: true, cancelText: '取消', confirmText: '确定',
  12506. success: function (res) {
  12507. var wxplatform = WXGamePlatform.Instance;
  12508. if (res.confirm) {
  12509. WXGamePlatform.Instance.shareApp(wxplatform.nowshareinfo, wxplatform.nowshareObj, wxplatform.nowsharesucceedfun, wxplatform.nowsharefailfun);
  12510. }
  12511. else {
  12512. if (wxplatform.nowsharefailfun && wxplatform.nowshareObj) {
  12513. wxplatform.nowsharefailfun.call(wxplatform.nowshareObj);
  12514. }
  12515. }
  12516. },
  12517. fail: function () {
  12518. },
  12519. complete: function () {
  12520. }
  12521. });
  12522. }
  12523. }
  12524. };
  12525. /**
  12526. * 看视频领奖励
  12527. * @param callobj
  12528. * @param succeedcallback
  12529. */
  12530. WXGamePlatform.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) {
  12531. var _this = this;
  12532. if (callobj === void 0) { callobj = null; }
  12533. if (succeedcallback === void 0) { succeedcallback = null; }
  12534. if (failCallback === void 0) { failCallback = null; }
  12535. if (istongjiNum === void 0) { istongjiNum = true; }
  12536. var wx = Laya.Browser.window.wx;
  12537. if (wx && wx.createRewardedVideoAd) {
  12538. if (!WXGamePlatform.videoplaying) {
  12539. var time = this.lockVideoLeftTime();
  12540. if (time > 0) {
  12541. GlobalTip_1.GlobalTip.Instance.showWordTips("广告尚未准备好,请" + time + "秒后再试");
  12542. return;
  12543. }
  12544. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_losefocus);
  12545. WXGamePlatform.istongjiVideoNum = istongjiNum;
  12546. this.nowvideokey = key;
  12547. WXGamePlatform.videoplaying = true;
  12548. this.videocallobj = callobj;
  12549. this.videosucceedCallback = succeedcallback;
  12550. this.videofailCallback = failCallback;
  12551. this.videoAd = wx.createRewardedVideoAd({
  12552. adUnitId: 'adunit-0c687084c908ee89'
  12553. });
  12554. this.videoAd.onClose(this.closeAD);
  12555. this.videoAd.onError(this.onerro);
  12556. this.videoAd.load().then(function () { return _this.videoAd.show(); }).catch(function (err) { console.log(err.errMsg), WXGamePlatform.Instance.failVideo(); });
  12557. }
  12558. }
  12559. };
  12560. WXGamePlatform.prototype.lockVideoLeftTime = function () {
  12561. var time = (Laya.Browser.now() - WXGamePlatform.lastVideoTime) / 1000;
  12562. time = WXGamePlatform.VideoTime - time;
  12563. return Math.ceil(time);
  12564. };
  12565. WXGamePlatform.prototype.onerro = function (res) {
  12566. var wxgamePlatform = WXGamePlatform.Instance;
  12567. WXGamePlatform.videoplaying = false;
  12568. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  12569. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  12570. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  12571. };
  12572. // 关闭广告
  12573. WXGamePlatform.prototype.closeAD = function (status) {
  12574. WXGamePlatform.lastVideoTime = Laya.Browser.now();
  12575. var wxgamePlatform = WXGamePlatform.Instance;
  12576. if (status && status.isEnded || status == undefined) {
  12577. if (WXGamePlatform.istongjiVideoNum) {
  12578. WXGamePlatform.dayVideoNum++;
  12579. wxgamePlatform.updateDayVideoInfo();
  12580. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_updateVideoNums);
  12581. }
  12582. if (wxgamePlatform.videocallobj && wxgamePlatform.videosucceedCallback) {
  12583. wxgamePlatform.videosucceedCallback.call(wxgamePlatform.videocallobj);
  12584. }
  12585. }
  12586. else {
  12587. GlobalTip_1.GlobalTip.Instance.showWordTips("未观看完整视频,无法获得奖励");
  12588. if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) {
  12589. wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj);
  12590. }
  12591. }
  12592. WXGamePlatform.videoplaying = false;
  12593. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  12594. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  12595. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  12596. };
  12597. // 广告失败
  12598. WXGamePlatform.prototype.failVideo = function () {
  12599. WXGamePlatform.lastVideoTime = Laya.Browser.now();
  12600. WXGamePlatform.videoplaying = false;
  12601. GlobalTip_1.GlobalTip.Instance.showWordTips("广告加载失败,试试别的方式吧~");
  12602. var wxgamePlatform = WXGamePlatform.Instance;
  12603. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  12604. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  12605. if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) {
  12606. wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj);
  12607. }
  12608. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  12609. };
  12610. WXGamePlatform.prototype.isCanVideo = function () {
  12611. if (WXGamePlatform.dayVideoNum < WXGamePlatform.VideoNum) {
  12612. if (WXGamePlatform.dayVideoNum == 0) {
  12613. return true;
  12614. }
  12615. var videobs = Math.floor(WXGamePlatform.dayVideoNum / WXGamePlatform.VideotoShare);
  12616. var sharebs = Math.floor(WXGamePlatform.dayShareNum / WXGamePlatform.SharetoVideo);
  12617. if (videobs > sharebs) {
  12618. return false;
  12619. }
  12620. else if (videobs < sharebs) {
  12621. return true;
  12622. }
  12623. else {
  12624. var videoyushu = WXGamePlatform.dayVideoNum % WXGamePlatform.VideotoShare;
  12625. if (videoyushu != 0) {
  12626. return true;
  12627. }
  12628. var shareyushu = WXGamePlatform.dayShareNum % WXGamePlatform.SharetoVideo;
  12629. if (shareyushu != 0) {
  12630. return false;
  12631. }
  12632. return true;
  12633. }
  12634. }
  12635. return false;
  12636. };
  12637. WXGamePlatform.prototype.createBanner = function (bannertype, style) {
  12638. if (bannertype === void 0) { bannertype = ""; }
  12639. if (Laya.Browser.window.wx) {
  12640. if (bannertype != "") {
  12641. var bo = false;
  12642. for (var i = 0; i < this._bannerTypeList.length; i++) {
  12643. if (bannertype == this._bannerTypeList[i].type) {
  12644. this._bannerTypeList[i].style = style;
  12645. var arr = this._bannerTypeList.splice(i, 1);
  12646. this._bannerTypeList.push(arr[0]);
  12647. bo = true;
  12648. break;
  12649. }
  12650. }
  12651. if (!bo) {
  12652. this._bannerTypeList.push({ type: bannertype, style: style });
  12653. }
  12654. }
  12655. else {
  12656. if (this._bannerTypeList.length == 0) {
  12657. return;
  12658. }
  12659. else {
  12660. var item = this._bannerTypeList[this._bannerTypeList.length - 1];
  12661. style = item.style;
  12662. }
  12663. }
  12664. if (this.bannerAd) {
  12665. var now = Laya.Browser.now();
  12666. //超过3分钟刷新
  12667. if (now - this.bannerRunTime > 60000 * 3) {
  12668. this.bannerAd.offError(this.bannerError);
  12669. this.bannerAd.offResize(this.bannerResize);
  12670. this.bannerAd.destory();
  12671. this.createNewBanner(style);
  12672. }
  12673. else {
  12674. this.showBanner(style);
  12675. }
  12676. }
  12677. else {
  12678. this.createNewBanner(style);
  12679. }
  12680. }
  12681. };
  12682. WXGamePlatform.prototype.createNewBanner = function (style) {
  12683. var wx = Laya.Browser.window.wx;
  12684. if (wx && wx.createBannerAd) {
  12685. this.nowStype = style;
  12686. this.bannerRunTime = Laya.Browser.now();
  12687. var info = this.getSystemInfoSync();
  12688. this._screenwidth = info.screenWidth;
  12689. var scale = 1;
  12690. if (style.hasOwnProperty("scale")) {
  12691. scale = style.scale;
  12692. }
  12693. this.bannerAd = wx.createBannerAd({
  12694. adUnitId: 'adunit-8c2d586135fa6d4f',
  12695. adIntervals: 30,
  12696. style: {
  12697. left: 0,
  12698. top: info.screenHeight - 105,
  12699. width: info.screenWidth * scale
  12700. }
  12701. });
  12702. if (this.bannerAd) {
  12703. this.bannerAd.onError(this.bannerError);
  12704. this.showBanner(style);
  12705. }
  12706. }
  12707. };
  12708. WXGamePlatform.prototype.bannerResize = function (res) {
  12709. var self = WXGamePlatform.Instance;
  12710. self.bannerAd.offResize(self.bannerResize);
  12711. self.isonResize = false;
  12712. var nowstype = self.nowStype;
  12713. if (!nowstype) {
  12714. return;
  12715. }
  12716. var info = self.getSystemInfoSync();
  12717. var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight;
  12718. var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth;
  12719. self.bannerwidth = res.width;
  12720. self.bannerheight = res.height;
  12721. if (nowstype.hasOwnProperty("x") && nowstype.x != 0) {
  12722. self.bannerAd.style.left = nowstype.x * percentageW;
  12723. }
  12724. else {
  12725. self.bannerAd.style.left = (info.windowWidth - res.width) * 0.5;
  12726. }
  12727. if (nowstype.hasOwnProperty("y") && nowstype.y != 0) {
  12728. self.bannerAd.style.top = nowstype.y * percentageH;
  12729. }
  12730. else {
  12731. self.bannerAd.style.top = (info.windowHeight - res.height) - 15;
  12732. }
  12733. };
  12734. WXGamePlatform.prototype.bannerError = function (err) {
  12735. };
  12736. WXGamePlatform.prototype.showBanner = function (style) {
  12737. if (this.bannerAd) {
  12738. this.nowStype = style;
  12739. var info = this.getSystemInfoSync();
  12740. var nowstype = this.nowStype;
  12741. var scale = 1;
  12742. if (nowstype.hasOwnProperty("scale")) {
  12743. scale = nowstype.scale;
  12744. }
  12745. var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight;
  12746. var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth;
  12747. if (nowstype.hasOwnProperty("x") && nowstype.x != 0) {
  12748. this.bannerAd.style.left = nowstype.x * percentageW;
  12749. }
  12750. else {
  12751. this.bannerAd.style.left = (info.windowWidth - this.bannerwidth) * 0.5;
  12752. }
  12753. if (nowstype.hasOwnProperty("y") && nowstype.y != 0) {
  12754. this.bannerAd.style.top = nowstype.y * percentageH;
  12755. }
  12756. else {
  12757. this.bannerAd.style.top = (info.windowHeight - this.bannerheight) - 15;
  12758. }
  12759. this.bannerAd.style.width = info.screenWidth * scale;
  12760. if (!this.isonResize) {
  12761. this.isonResize = true;
  12762. this.bannerAd.onResize(this.bannerResize);
  12763. }
  12764. this.bannerAd.show();
  12765. }
  12766. };
  12767. WXGamePlatform.prototype.hideBanner = function (type) {
  12768. if (type === void 0) { type = ""; }
  12769. if (this.bannerAd) {
  12770. this.bannerAd.hide();
  12771. }
  12772. if (type != "") {
  12773. for (var i = 0; i < this._bannerTypeList.length; i++) {
  12774. if (type == this._bannerTypeList[i].type) {
  12775. this._bannerTypeList.splice(i, 1);
  12776. break;
  12777. }
  12778. }
  12779. if (this._bannerTypeList.length > 0) {
  12780. var item = this._bannerTypeList[this._bannerTypeList.length - 1];
  12781. this.createBanner(item.type, item.style);
  12782. }
  12783. }
  12784. };
  12785. // private _wxOpenDataViewer:WXOpenDataViewer;
  12786. /**
  12787. * 打开好友排行榜
  12788. */
  12789. WXGamePlatform.prototype.openFriendRank = function (type, viewType, rect, parent, data) {
  12790. if (parent === void 0) { parent = null; }
  12791. if (data === void 0) { data = null; }
  12792. this.closeziyuStage();
  12793. this._openrankDict[viewType] = { type: type, viewType: viewType, rect: rect, parent: parent, data: data };
  12794. this.initziyuStage(rect, parent);
  12795. this.postMessage(type, data);
  12796. };
  12797. /**
  12798. * 排行榜打开状态时候,切换显示类型
  12799. * @param type
  12800. */
  12801. WXGamePlatform.prototype.changeFriendRank = function (type) {
  12802. this.postMessage(type);
  12803. };
  12804. /**
  12805. * 排行榜上一页
  12806. */
  12807. WXGamePlatform.prototype.prePageRank = function () {
  12808. };
  12809. /**
  12810. * 排行榜下一页
  12811. */
  12812. WXGamePlatform.prototype.nextPageRank = function () {
  12813. };
  12814. /**
  12815. * 关闭好友排行榜
  12816. */
  12817. WXGamePlatform.prototype.closeFriendRank = function (viewType) {
  12818. this.closeziyuStage();
  12819. if (this._openrankDict[viewType]) {
  12820. delete this._openrankDict[viewType];
  12821. }
  12822. for (var s in this._openrankDict) {
  12823. var itemd = this._openrankDict[s];
  12824. this.openFriendRank(itemd.type, itemd.viewType, itemd.rect, itemd.parent, itemd.data);
  12825. break;
  12826. }
  12827. };
  12828. /**
  12829. * 初始化子域
  12830. * @param rect
  12831. * @param parent
  12832. */
  12833. WXGamePlatform.prototype.initziyuStage = function (rect, parent) {
  12834. // if( !this._wxOpenDataViewer )
  12835. // {
  12836. // this._wxOpenDataViewer = new WXOpenDataViewer();
  12837. // if( parent )
  12838. // {
  12839. // parent.addChild( this._wxOpenDataViewer );
  12840. // }
  12841. // else
  12842. // {
  12843. // GameLayerManager.Instance.topLayer.displayObject.addChild( this._wxOpenDataViewer );
  12844. // }
  12845. // }
  12846. // this._wxOpenDataViewer.x = rect.x;
  12847. // this._wxOpenDataViewer.y = rect.y;
  12848. // this._wxOpenDataViewer.width = rect.width;
  12849. // this._wxOpenDataViewer.height = rect.height;
  12850. };
  12851. /**
  12852. * 销毁子域
  12853. */
  12854. WXGamePlatform.prototype.closeziyuStage = function () {
  12855. // if( this._wxOpenDataViewer )
  12856. // {
  12857. // this._wxOpenDataViewer.destroy();
  12858. // this._wxOpenDataViewer.removeSelf();
  12859. // this._wxOpenDataViewer = null;
  12860. // }
  12861. };
  12862. /**
  12863. * 数据上传(用于排行榜数据显示)
  12864. * @param param1 上报数据
  12865. * @param param2 上报数据
  12866. */
  12867. WXGamePlatform.prototype.storeToCloud = function (param1, param2) {
  12868. var cacheMager = LocalDataControl_1.LocalDataControl.Instance;
  12869. var score1 = cacheMager.getnum("param1");
  12870. // var score2:number = cacheMager.getnum( "param2" );
  12871. param1 = Math.floor(param1);
  12872. param2 = Math.floor(param2);
  12873. var result1 = param1;
  12874. var result2 = param2;
  12875. if (result1 < score1) {
  12876. result1 = score1;
  12877. }
  12878. else {
  12879. cacheMager.addstr("param1", result1.toString());
  12880. }
  12881. var arr = [];
  12882. arr.push({ key: "param1", value: result1.toString() });
  12883. arr.push({ key: "param2", value: result2 + "" });
  12884. this.setUserCloudStorage(arr);
  12885. };
  12886. WXGamePlatform.prototype.createGameClubButton = function (style, icon) {
  12887. if (icon === void 0) { icon = "green"; }
  12888. var wx = Laya.Browser.window.wx;
  12889. if (wx && style) {
  12890. style.width = 40;
  12891. style.height = 40;
  12892. WXGamePlatform.gameclubButton = wx.createGameClubButton({
  12893. icon: icon,
  12894. style: style
  12895. });
  12896. if (WXGamePlatform.gameclubButton) {
  12897. WXGamePlatform.gameclubButton.show();
  12898. }
  12899. }
  12900. };
  12901. WXGamePlatform.QuDaoID = ""; //微信广告ID
  12902. WXGamePlatform.isShowing = true;
  12903. /**
  12904. * 授权状态 0:未判断,1:已授权
  12905. */
  12906. WXGamePlatform.accreditstate = 0;
  12907. /**
  12908. * 当天分享次数
  12909. */
  12910. WXGamePlatform.dayShareNum = 0;
  12911. /**
  12912. * 当天看视频次数
  12913. */
  12914. WXGamePlatform.dayVideoNum = 0;
  12915. /**
  12916. * 判断分享是否成功时间间隔
  12917. */
  12918. WXGamePlatform.ShareTime = 0;
  12919. /**
  12920. * 每日最大看视频次数(成功累加一次)
  12921. */
  12922. WXGamePlatform.VideoNum = 0;
  12923. /**
  12924. * 看视频冷却时间
  12925. */
  12926. WXGamePlatform.VideoTime = 0;
  12927. /**
  12928. * 8好位cpa可弹出时间间隔(秒)
  12929. */
  12930. WXGamePlatform.jiliweitime = 100;
  12931. /**
  12932. * 分享几次切换到视频
  12933. */
  12934. WXGamePlatform.SharetoVideo = 1;
  12935. /**
  12936. * 视频几次切换到分享
  12937. */
  12938. WXGamePlatform.VideotoShare = 1;
  12939. /**
  12940. * 分享数据容器
  12941. */
  12942. WXGamePlatform.ShareDict = {};
  12943. /**
  12944. * 用户来源id
  12945. */
  12946. WXGamePlatform.fromscene = 0;
  12947. WXGamePlatform.nowShareindex = 0;
  12948. WXGamePlatform.callbackfailstate = 0;
  12949. WXGamePlatform.lastVideoTime = 0;
  12950. /**
  12951. * 视频是否在播放中
  12952. */
  12953. WXGamePlatform.videoplaying = false;
  12954. WXGamePlatform.istongjiVideoNum = true;
  12955. return WXGamePlatform;
  12956. }());
  12957. exports.WXGamePlatform = WXGamePlatform;
  12958. },{"../Control/AudioControl":17,"../Control/DateControl":19,"../Control/LocalDataControl":22,"../Data/UserDataInfo":33,"../Global":39,"../WXSDK/WECHATEVENT":78,"../utils/DispatcherManager":83,"../utils/GameUtils":85,"../utils/GlobalTip":86}],80:[function(require,module,exports){
  12959. "use strict";
  12960. Object.defineProperty(exports, "__esModule", { value: true });
  12961. var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
  12962. var PlatfromType_1 = require("./PlatfromType");
  12963. var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
  12964. var Global_1 = require("../Global");
  12965. var DispatcherManager_1 = require("../utils/DispatcherManager");
  12966. var TimesTamper_1 = require("../Time/TimesTamper");
  12967. var DateControl_1 = require("../Control/DateControl");
  12968. var AudioControl_1 = require("../Control/AudioControl");
  12969. /*
  12970. * name;
  12971. */
  12972. var pingtaiutils = /** @class */ (function () {
  12973. function pingtaiutils() {
  12974. this._isenable = false;
  12975. pingtaiutils.ins = this;
  12976. }
  12977. Object.defineProperty(pingtaiutils, "Instance", {
  12978. get: function () {
  12979. if (pingtaiutils.ins == null) {
  12980. return new pingtaiutils();
  12981. }
  12982. return pingtaiutils.ins;
  12983. },
  12984. enumerable: true,
  12985. configurable: true
  12986. });
  12987. /**
  12988. * 初始化平台
  12989. */
  12990. pingtaiutils.prototype.initPlatfrom = function () {
  12991. if (Laya.Browser.window.tt) {
  12992. Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.tt;
  12993. }
  12994. else if (Laya.Browser.window.wx) //微信小游戏
  12995. {
  12996. Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.wx;
  12997. }
  12998. else {
  12999. Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.pc;
  13000. }
  13001. };
  13002. pingtaiutils.prototype.init = function () {
  13003. this.initPlatfrom();
  13004. // switch( Global.nowplatfrom )
  13005. // {
  13006. // case PlatfromType.wx:
  13007. // WXGamePlatform.Instance.init();
  13008. // break;
  13009. // case PlatfromType.qq:
  13010. // break;
  13011. // default:
  13012. // break;
  13013. // }
  13014. // this.onShow( this,this.showcallback );
  13015. // this.onHide(this,this.hidecallback);
  13016. };
  13017. pingtaiutils.prototype.initData = function () {
  13018. DateControl_1.DateControl.Instance.SetSelf();
  13019. switch (Global_1.Global.nowplatfrom) {
  13020. case PlatfromType_1.PlatfromType.wx:
  13021. WXGamePlatform_1.WXGamePlatform.Instance.initData();
  13022. break;
  13023. default:
  13024. break;
  13025. }
  13026. };
  13027. /**
  13028. * 合违规判断 true:合规,false:违规
  13029. */
  13030. pingtaiutils.checkEnable = function () {
  13031. if (pingtaiutils.islegal == 1) {
  13032. return true;
  13033. }
  13034. return false;
  13035. };
  13036. pingtaiutils.prototype.login = function (callobj, succeedcallback, progressCallback, failcallback) {
  13037. if (callobj === void 0) { callobj = null; }
  13038. if (succeedcallback === void 0) { succeedcallback = null; }
  13039. if (progressCallback === void 0) { progressCallback = null; }
  13040. if (failcallback === void 0) { failcallback = null; }
  13041. fairygui.GRoot.inst.showModalWait();
  13042. this._logincallobj = callobj;
  13043. this._loginsucceedcallback = succeedcallback;
  13044. switch (Global_1.Global.nowplatfrom) {
  13045. case PlatfromType_1.PlatfromType.wx:
  13046. WXGamePlatform_1.WXGamePlatform.Instance.createUserAndLogin(this, this.loginSucceed, this.loginprogressCallback, this.loginfailcallback);
  13047. break;
  13048. default:
  13049. this.loginSucceed(null);
  13050. break;
  13051. }
  13052. };
  13053. pingtaiutils.prototype.loginprogressCallback = function (value) {
  13054. };
  13055. pingtaiutils.prototype.loginSucceed = function (data) {
  13056. fairygui.GRoot.inst.closeModalWait();
  13057. };
  13058. pingtaiutils.prototype.loginfailcallback = function () {
  13059. };
  13060. pingtaiutils.prototype.onShow = function (callobj, succeedcallback, failCallback) {
  13061. if (callobj === void 0) { callobj = null; }
  13062. if (succeedcallback === void 0) { succeedcallback = null; }
  13063. if (failCallback === void 0) { failCallback = null; }
  13064. switch (Global_1.Global.nowplatfrom) {
  13065. case PlatfromType_1.PlatfromType.wx:
  13066. WXGamePlatform_1.WXGamePlatform.Instance.onShow(callobj, succeedcallback, failCallback);
  13067. break;
  13068. case PlatfromType_1.PlatfromType.qq:
  13069. break;
  13070. }
  13071. };
  13072. pingtaiutils.prototype.showcallback = function () {
  13073. Laya.timer.clear(this, this.againplaybgSound);
  13074. Laya.timer.once(500, this, this.againplaybgSound);
  13075. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onshow);
  13076. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  13077. var fromscene = pingtaiutils.fromscene();
  13078. if (fromscene == 1089 || fromscene == 1131) {
  13079. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_fromscorfk);
  13080. }
  13081. };
  13082. pingtaiutils.prototype.againplaybgSound = function () {
  13083. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd);
  13084. };
  13085. pingtaiutils.prototype.onHide = function (callobj, succeedcallback) {
  13086. if (callobj === void 0) { callobj = null; }
  13087. if (succeedcallback === void 0) { succeedcallback = null; }
  13088. switch (Global_1.Global.nowplatfrom) {
  13089. case PlatfromType_1.PlatfromType.wx:
  13090. WXGamePlatform_1.WXGamePlatform.Instance.onHide(callobj, succeedcallback);
  13091. break;
  13092. case PlatfromType_1.PlatfromType.qq:
  13093. break;
  13094. }
  13095. };
  13096. pingtaiutils.prototype.hidecallback = function () {
  13097. TimesTamper_1.TimesTamper.Instance.sendonlineTongji();
  13098. AudioControl_1.AudioControl.Instance.ClearAllSOUND();
  13099. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onhide);
  13100. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_losefocus);
  13101. };
  13102. Object.defineProperty(pingtaiutils.prototype, "isshow", {
  13103. /**
  13104. * 当前游戏是否在显示中
  13105. */
  13106. get: function () {
  13107. var bo = true;
  13108. switch (Global_1.Global.nowplatfrom) {
  13109. case PlatfromType_1.PlatfromType.wx:
  13110. if (WXGamePlatform_1.WXGamePlatform.isShowing) {
  13111. bo = true;
  13112. }
  13113. bo = false;
  13114. break;
  13115. }
  13116. return bo;
  13117. },
  13118. enumerable: true,
  13119. configurable: true
  13120. });
  13121. /**
  13122. * 分包加载
  13123. */
  13124. pingtaiutils.prototype.loadSubpackage = function (typename, callobj, callback, callprogress, failcallback) {
  13125. if (failcallback === void 0) { failcallback = null; }
  13126. switch (Global_1.Global.nowplatfrom) {
  13127. case PlatfromType_1.PlatfromType.wx:
  13128. WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage(typename, callobj, callback, callprogress, failcallback);
  13129. break;
  13130. default:
  13131. if (callobj && callback) {
  13132. callback.call(callobj);
  13133. }
  13134. break;
  13135. }
  13136. };
  13137. /**
  13138. * 获取是否已经授权
  13139. * @param callobj
  13140. * @param callback
  13141. */
  13142. pingtaiutils.prototype.isaccredit = function (callobj, accreditCallback) {
  13143. switch (Global_1.Global.nowplatfrom) {
  13144. case PlatfromType_1.PlatfromType.wx:
  13145. WXGamePlatform_1.WXGamePlatform.Instance.getaccredit(callobj, accreditCallback);
  13146. break;
  13147. case PlatfromType_1.PlatfromType.qq:
  13148. WXGamePlatform_1.WXGamePlatform.Instance.getaccredit(callobj, accreditCallback);
  13149. break;
  13150. default:
  13151. if (accreditCallback && callobj) {
  13152. accreditCallback.call(callobj, true);
  13153. }
  13154. break;
  13155. }
  13156. };
  13157. /**
  13158. * 拿角色信息授权
  13159. */
  13160. pingtaiutils.prototype.createaccredit = function (callobj, callback, failcallback) {
  13161. switch (Global_1.Global.nowplatfrom) {
  13162. case PlatfromType_1.PlatfromType.wx:
  13163. WXGamePlatform_1.WXGamePlatform.Instance.createUserInfoButton(callobj, callback, failcallback);
  13164. break;
  13165. }
  13166. };
  13167. pingtaiutils.prototype.closeuserinfoButton = function () {
  13168. switch (Global_1.Global.nowplatfrom) {
  13169. case PlatfromType_1.PlatfromType.wx:
  13170. WXGamePlatform_1.WXGamePlatform.Instance.closeuserinfobUtton();
  13171. break;
  13172. }
  13173. };
  13174. /**
  13175. * 退出游戏
  13176. */
  13177. pingtaiutils.prototype.exitGame = function () {
  13178. switch (Global_1.Global.nowplatfrom) {
  13179. case PlatfromType_1.PlatfromType.wx:
  13180. WXGamePlatform_1.WXGamePlatform.Instance.exitGame();
  13181. break;
  13182. }
  13183. };
  13184. /**
  13185. * 打开客服对话框
  13186. */
  13187. pingtaiutils.prototype.openCustomerService = function () {
  13188. switch (Global_1.Global.nowplatfrom) {
  13189. case PlatfromType_1.PlatfromType.wx:
  13190. WXGamePlatform_1.WXGamePlatform.Instance.openCustomerService();
  13191. break;
  13192. }
  13193. };
  13194. /**
  13195. * 短震动
  13196. */
  13197. pingtaiutils.prototype.vibrateShort = function () {
  13198. switch (Global_1.Global.nowplatfrom) {
  13199. case PlatfromType_1.PlatfromType.wx:
  13200. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  13201. break;
  13202. default:
  13203. break;
  13204. }
  13205. };
  13206. pingtaiutils.isCanVideo = function () {
  13207. var bo = false;
  13208. if (pingtaiutils.checkEnable()) {
  13209. bo = true;
  13210. }
  13211. else {
  13212. switch (Global_1.Global.nowplatfrom) {
  13213. case PlatfromType_1.PlatfromType.wx:
  13214. bo = WXGamePlatform_1.WXGamePlatform.Instance.isCanVideo();
  13215. break;
  13216. default:
  13217. bo = true;
  13218. break;
  13219. }
  13220. }
  13221. return bo;
  13222. };
  13223. pingtaiutils.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) {
  13224. if (callobj === void 0) { callobj = null; }
  13225. if (succeedCallback === void 0) { succeedCallback = null; }
  13226. if (failCallback === void 0) { failCallback = null; }
  13227. switch (Global_1.Global.nowplatfrom) {
  13228. case PlatfromType_1.PlatfromType.wx:
  13229. WXGamePlatform_1.WXGamePlatform.Instance.startShareApp(key, callobj, succeedCallback, failCallback);
  13230. break;
  13231. default:
  13232. if (callobj && succeedCallback) {
  13233. succeedCallback.call(callobj);
  13234. }
  13235. break;
  13236. }
  13237. };
  13238. pingtaiutils.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) {
  13239. if (callobj === void 0) { callobj = null; }
  13240. if (succeedcallback === void 0) { succeedcallback = null; }
  13241. if (failCallback === void 0) { failCallback = null; }
  13242. if (istongjiNum === void 0) { istongjiNum = true; }
  13243. switch (Global_1.Global.nowplatfrom) {
  13244. case PlatfromType_1.PlatfromType.wx:
  13245. WXGamePlatform_1.WXGamePlatform.Instance.playVideo(key, callobj, succeedcallback, failCallback, istongjiNum);
  13246. break;
  13247. default:
  13248. if (callobj && succeedcallback) {
  13249. succeedcallback.call(callobj);
  13250. }
  13251. break;
  13252. }
  13253. };
  13254. pingtaiutils.prototype.createBanner = function (bannertype, style) {
  13255. if (style === void 0) { style = { x: 0, y: 0, scale: 1 }; }
  13256. switch (Global_1.Global.nowplatfrom) {
  13257. case PlatfromType_1.PlatfromType.wx:
  13258. WXGamePlatform_1.WXGamePlatform.Instance.createBanner(bannertype, style);
  13259. break;
  13260. default:
  13261. break;
  13262. }
  13263. };
  13264. pingtaiutils.prototype.hideBanner = function (bannertype) {
  13265. switch (Global_1.Global.nowplatfrom) {
  13266. case PlatfromType_1.PlatfromType.wx:
  13267. WXGamePlatform_1.WXGamePlatform.Instance.hideBanner(bannertype);
  13268. break;
  13269. default:
  13270. break;
  13271. }
  13272. };
  13273. /**
  13274. * 数据上传(用于排行榜数据显示)
  13275. * @param param1 上报数据1
  13276. * @param param2 上报数据2
  13277. */
  13278. pingtaiutils.prototype.storeToCloud = function (param1, param2) {
  13279. switch (Global_1.Global.nowplatfrom) {
  13280. case PlatfromType_1.PlatfromType.wx:
  13281. WXGamePlatform_1.WXGamePlatform.Instance.storeToCloud(param1, param2);
  13282. break;
  13283. default:
  13284. break;
  13285. }
  13286. };
  13287. /**
  13288. * 打开好友排行榜
  13289. */
  13290. pingtaiutils.prototype.openFriendRank = function (type, viewType, rect, parent, data) {
  13291. if (parent === void 0) { parent = null; }
  13292. if (data === void 0) { data = null; }
  13293. switch (Global_1.Global.nowplatfrom) {
  13294. case PlatfromType_1.PlatfromType.wx:
  13295. WXGamePlatform_1.WXGamePlatform.Instance.openFriendRank(type, viewType, rect, parent, data);
  13296. break;
  13297. default:
  13298. break;
  13299. }
  13300. };
  13301. /**
  13302. * 排行榜打开状态时候,切换显示类型
  13303. * @param type
  13304. */
  13305. pingtaiutils.prototype.changeFriendRank = function (type) {
  13306. switch (Global_1.Global.nowplatfrom) {
  13307. case PlatfromType_1.PlatfromType.wx:
  13308. WXGamePlatform_1.WXGamePlatform.Instance.changeFriendRank(type);
  13309. break;
  13310. default:
  13311. break;
  13312. }
  13313. };
  13314. /**
  13315. * 排行榜上一页
  13316. */
  13317. pingtaiutils.prototype.prePageRank = function () {
  13318. switch (Global_1.Global.nowplatfrom) {
  13319. case PlatfromType_1.PlatfromType.wx:
  13320. WXGamePlatform_1.WXGamePlatform.Instance.prePageRank();
  13321. break;
  13322. default:
  13323. break;
  13324. }
  13325. };
  13326. /**
  13327. * 排行榜下一页
  13328. */
  13329. pingtaiutils.prototype.nextPageRank = function () {
  13330. switch (Global_1.Global.nowplatfrom) {
  13331. case PlatfromType_1.PlatfromType.wx:
  13332. WXGamePlatform_1.WXGamePlatform.Instance.nextPageRank();
  13333. break;
  13334. default:
  13335. break;
  13336. }
  13337. };
  13338. /**
  13339. * 关闭好友排行榜
  13340. */
  13341. pingtaiutils.prototype.closeFriendRank = function (viewType) {
  13342. switch (Global_1.Global.nowplatfrom) {
  13343. case PlatfromType_1.PlatfromType.wx:
  13344. WXGamePlatform_1.WXGamePlatform.Instance.closeFriendRank(viewType);
  13345. break;
  13346. default:
  13347. break;
  13348. }
  13349. };
  13350. pingtaiutils.prototype.lockVideoLeftTime = function () {
  13351. var time = 0;
  13352. switch (Global_1.Global.nowplatfrom) {
  13353. case PlatfromType_1.PlatfromType.wx:
  13354. time = WXGamePlatform_1.WXGamePlatform.Instance.lockVideoLeftTime();
  13355. break;
  13356. default:
  13357. break;
  13358. }
  13359. return time;
  13360. };
  13361. pingtaiutils.dayVideoNums = function () {
  13362. var time = 0;
  13363. switch (Global_1.Global.nowplatfrom) {
  13364. case PlatfromType_1.PlatfromType.wx:
  13365. time = WXGamePlatform_1.WXGamePlatform.dayVideoNum;
  13366. break;
  13367. default:
  13368. break;
  13369. }
  13370. return time;
  13371. };
  13372. /**
  13373. * 1089:添加到我的小程序,1131:添加到浮窗
  13374. */
  13375. pingtaiutils.fromscene = function () {
  13376. var scene = 0;
  13377. switch (Global_1.Global.nowplatfrom) {
  13378. case PlatfromType_1.PlatfromType.wx:
  13379. scene = WXGamePlatform_1.WXGamePlatform.fromscene;
  13380. break;
  13381. default:
  13382. break;
  13383. }
  13384. return scene;
  13385. };
  13386. pingtaiutils.createGameClubButton = function (style, icon) {
  13387. if (icon === void 0) { icon = "green"; }
  13388. switch (Global_1.Global.nowplatfrom) {
  13389. case PlatfromType_1.PlatfromType.wx:
  13390. WXGamePlatform_1.WXGamePlatform.Instance.createGameClubButton(style, icon);
  13391. break;
  13392. default:
  13393. break;
  13394. }
  13395. };
  13396. /**
  13397. * 是否合规
  13398. */
  13399. pingtaiutils.islegal = 0;
  13400. return pingtaiutils;
  13401. }());
  13402. exports.pingtaiutils = pingtaiutils;
  13403. },{"../Control/AudioControl":17,"../Control/DateControl":19,"../Global":39,"../Time/TimesTamper":58,"../WXSDK/WECHATEVENT":78,"../WXSDK/WXGamePlatform":79,"../utils/DispatcherManager":83,"./PlatfromType":72}],81:[function(require,module,exports){
  13404. "use strict";
  13405. Object.defineProperty(exports, "__esModule", { value: true });
  13406. var PlayerAccount_1 = require("./PlayerAccount");
  13407. // import { Account } from "../Account/Account";
  13408. var ttshare = /** @class */ (function () {
  13409. function ttshare() {
  13410. }
  13411. ttshare.share = function () {
  13412. Laya.Browser.window.tt.shareAppMessage({
  13413. channel: "article",
  13414. templateId: "ocgf9b46464b9anlff",
  13415. title: "冲啊冲",
  13416. imageUrl: "jiazai/123.png",
  13417. query: "res.query",
  13418. success: function () { },
  13419. fail: function () { },
  13420. });
  13421. };
  13422. return ttshare;
  13423. }());
  13424. exports.ttshare = ttshare;
  13425. var ttad = /** @class */ (function () {
  13426. function ttad() {
  13427. ttad.instance = this;
  13428. }
  13429. Object.defineProperty(ttad, "Instance", {
  13430. get: function () {
  13431. if (ttad.instance) {
  13432. return ttad.instance;
  13433. }
  13434. else {
  13435. return new ttad();
  13436. }
  13437. },
  13438. enumerable: true,
  13439. configurable: true
  13440. });
  13441. ttad.InitAD = function () {
  13442. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video || !Laya.Browser.onMobile)
  13443. return;
  13444. ttad.bannerAdUnitId = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.bannerAdUnitId ? PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.bannerAdUnitId : ttad.bannerAdUnitId;
  13445. console.log("bannerAdUnitId", ttad.bannerAdUnitId);
  13446. ttad.videlAdUnitId = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.videlAdUnitId ? PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.videlAdUnitId : ttad.videlAdUnitId;
  13447. console.log("videlAdUnitId", ttad.videlAdUnitId);
  13448. ttad.videoAd = Laya.Browser.window.tt.createRewardedVideoAd({ adUnitId: this.videlAdUnitId });
  13449. ttad.videoAd.onClose(function (res) {
  13450. if (res.isEnded) {
  13451. if (ttad.closecallback) {
  13452. ttad.closecallback(true);
  13453. }
  13454. }
  13455. else {
  13456. if (ttad.closecallback) {
  13457. ttad.closecallback(false);
  13458. }
  13459. }
  13460. });
  13461. };
  13462. ttad.ShowVideo = function (_cb) {
  13463. var _this = this;
  13464. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video || !Laya.Browser.onMobile)
  13465. return;
  13466. console.log("show video");
  13467. ttad.closecallback = _cb;
  13468. ttad.videoAd.show().then(function () {
  13469. console.log("广告显示成功");
  13470. }).catch(function (err) {
  13471. ttad.ShowTxt("视频正在加载中");
  13472. console.log("广告组件出现问题", err);
  13473. // 可以手动加载一次
  13474. Laya.timer.once(200, _this, function () {
  13475. ttad.videoAd.load().then(function () {
  13476. console.log("手动加载成功");
  13477. // 加载成功后需要再显示广告
  13478. return ttad.videoAd.show();
  13479. });
  13480. });
  13481. });
  13482. };
  13483. ttad.Showbanner = function () {
  13484. if (!Laya.Browser.onMobile)
  13485. return;
  13486. console.log("show banner");
  13487. ttad.canshow = true;
  13488. var infor = Laya.Browser.window.tt.getSystemInfoSync();
  13489. var targetBannerAdWidth = 200;
  13490. if (ttad.bannerAd)
  13491. ttad.bannerAd.destroy();
  13492. Laya.timer.once(200, this, function () {
  13493. ttad.bannerAd = Laya.Browser.window.tt.createBannerAd({
  13494. adUnitId: ttad.bannerAdUnitId,
  13495. style: {
  13496. width: targetBannerAdWidth,
  13497. top: infor.windowHeight - (targetBannerAdWidth / 16) * 9 // 根据系统约定尺寸计算出广告高度
  13498. }
  13499. });
  13500. ttad.bannerAd.onLoad(function () {
  13501. if (ttad.canshow) {
  13502. ttad.bannerAd.show().then(function () {
  13503. console.log("广告显示成功");
  13504. }).catch(function (err) {
  13505. console.log("广告组件出现问题", err);
  13506. });
  13507. }
  13508. });
  13509. ttad.bannerAd.onResize(function (size) {
  13510. console.log(size.width, size.height);
  13511. ttad.bannerAd.style.top = infor.windowHeight - size.height;
  13512. ttad.bannerAd.style.left = (infor.windowWidth - size.width) / 2;
  13513. });
  13514. });
  13515. };
  13516. ttad.Clear = function () {
  13517. ttad.canshow = false;
  13518. ttad.closecallback = null;
  13519. if (ttad.bannerAd)
  13520. ttad.bannerAd.hide();
  13521. };
  13522. /**抖音更多游戏方法*/
  13523. ttad.CreateMoreGameBtn = function (fun) {
  13524. if (fun === void 0) { fun = null; }
  13525. if (!Laya.Browser.onMobile)
  13526. return;
  13527. if (Laya.Browser.onIOS) {
  13528. ttad.ShowTxt("暂未开放");
  13529. return;
  13530. }
  13531. Laya.Browser.window.tt.showMoreGamesModal({
  13532. appLaunchOptions: [
  13533. {
  13534. appId: "tt66d0106df9eaa083",
  13535. query: "foo=bar&baz=qux",
  13536. extraData: {}
  13537. }
  13538. ],
  13539. success: function (res) {
  13540. console.log("success", res.errMsg);
  13541. if (fun) {
  13542. fun();
  13543. }
  13544. },
  13545. fail: function (res) {
  13546. console.log("fail", res.errMsg);
  13547. }
  13548. });
  13549. // 监听弹窗关闭
  13550. // this.onMoreGamesModalClose();
  13551. };
  13552. /*监听弹窗关闭*/
  13553. // static onMoreGamesModalClose()
  13554. // {
  13555. // if(!Laya.Browser.onMobile)return;
  13556. // if( Laya.Browser.onIOS)
  13557. // {
  13558. // ttad.ShowTxt("暂未开放");
  13559. // return;
  13560. // }
  13561. // Laya.Browser.window.tt.onMoreGamesModalClose(function() {
  13562. // console.log("modal closed");
  13563. // if(Scene3DManager.getInstance().IsGamePasue)
  13564. // {
  13565. // EventUtils.dispatchEvent( GameEvent.continueGame );
  13566. // }
  13567. // });
  13568. // }
  13569. ttad.ShowTxt = function (text) {
  13570. if (Laya.Browser.window.tt) {
  13571. Laya.Browser.window.tt.showToast({ title: text });
  13572. }
  13573. else {
  13574. console.log(text);
  13575. }
  13576. };
  13577. ttad.videlAdUnitId = "15gfgp58pocp80hbkb";
  13578. ttad.bannerAdUnitId = "dsk7cohbl2f4jpjtq5";
  13579. ttad.canshow = true;
  13580. return ttad;
  13581. }());
  13582. exports.ttad = ttad;
  13583. },{"./PlayerAccount":73}],82:[function(require,module,exports){
  13584. "use strict";
  13585. Object.defineProperty(exports, "__esModule", { value: true });
  13586. /**
  13587. * 全局侦听类及消息处理
  13588. */
  13589. var DisPatcherOn = /** @class */ (function (_super) {
  13590. __extends(DisPatcherOn, _super);
  13591. function DisPatcherOn() {
  13592. var _this = _super.call(this) || this;
  13593. _this.isInit = false;
  13594. DisPatcherOn.ins = _this;
  13595. if (_this.isInit) {
  13596. }
  13597. if (_this._dispatcher == null) {
  13598. _this._dispatcher = new Laya.EventDispatcher();
  13599. _this.isInit = true;
  13600. }
  13601. return _this;
  13602. }
  13603. Object.defineProperty(DisPatcherOn, "Instance", {
  13604. get: function () {
  13605. if (DisPatcherOn.ins == null)
  13606. return new DisPatcherOn();
  13607. return DisPatcherOn.ins;
  13608. },
  13609. enumerable: true,
  13610. configurable: true
  13611. });
  13612. DisPatcherOn.prototype.addEventListener = function (type, listener, thisObject, useCapture, priority) {
  13613. if (useCapture === void 0) { useCapture = false; }
  13614. if (priority === void 0) { priority = 0; }
  13615. this._dispatcher.on(type, thisObject, listener);
  13616. };
  13617. DisPatcherOn.prototype.removeEventListener = function (type, listener, thisObject, useCapture) {
  13618. if (useCapture === void 0) { useCapture = false; }
  13619. this._dispatcher.off(type, thisObject, listener);
  13620. };
  13621. DisPatcherOn.prototype.hasEventListener = function (type) {
  13622. return this._dispatcher.hasListener(type);
  13623. };
  13624. DisPatcherOn.prototype.dispatchEvent = function (type, data) {
  13625. return this._dispatcher.event(type, data);
  13626. };
  13627. return DisPatcherOn;
  13628. }(Laya.EventDispatcher));
  13629. exports.DisPatcherOn = DisPatcherOn;
  13630. },{}],83:[function(require,module,exports){
  13631. "use strict";
  13632. Object.defineProperty(exports, "__esModule", { value: true });
  13633. var LEvent_1 = require("./LEvent");
  13634. var DisPatcherOn_1 = require("./DisPatcherOn");
  13635. /*
  13636. * name;
  13637. */
  13638. var DispatcherManager = /** @class */ (function () {
  13639. function DispatcherManager() {
  13640. }
  13641. DispatcherManager.init = function () {
  13642. DisPatcherOn_1.DisPatcherOn.Instance;
  13643. };
  13644. //新建事件
  13645. DispatcherManager.Event = function (type, obj, bubbles, cancelable) {
  13646. if (obj === void 0) { obj = null; }
  13647. if (bubbles === void 0) { bubbles = false; }
  13648. if (cancelable === void 0) { cancelable = false; }
  13649. return new LEvent_1.LEvent(type, obj, bubbles, cancelable);
  13650. };
  13651. //派发事件
  13652. DispatcherManager.dispatchEvent = function (type, obj, bubbles, cancelable) {
  13653. if (obj === void 0) { obj = null; }
  13654. if (bubbles === void 0) { bubbles = false; }
  13655. if (cancelable === void 0) { cancelable = false; }
  13656. DisPatcherOn_1.DisPatcherOn.Instance.dispatchEvent(type, obj);
  13657. };
  13658. //监听事件
  13659. DispatcherManager.addEventListener = function (type, thisObject, listener, useCapture, priority) {
  13660. if (useCapture === void 0) { useCapture = false; }
  13661. if (priority === void 0) { priority = 0; }
  13662. DisPatcherOn_1.DisPatcherOn.Instance.addEventListener(type, listener, thisObject, useCapture, priority);
  13663. };
  13664. DispatcherManager.hasEventListener = function (type) {
  13665. return DisPatcherOn_1.DisPatcherOn.Instance.hasEventListener(type);
  13666. };
  13667. DispatcherManager.removeEventListener = function (type, thisObject, listener, useCapture, priority) {
  13668. if (useCapture === void 0) { useCapture = false; }
  13669. if (priority === void 0) { priority = 0; }
  13670. DisPatcherOn_1.DisPatcherOn.Instance.removeEventListener(type, listener, thisObject);
  13671. };
  13672. return DispatcherManager;
  13673. }());
  13674. exports.DispatcherManager = DispatcherManager;
  13675. },{"./DisPatcherOn":82,"./LEvent":87}],84:[function(require,module,exports){
  13676. "use strict";
  13677. Object.defineProperty(exports, "__esModule", { value: true });
  13678. var Sprite = Laya.Sprite;
  13679. var GameState = /** @class */ (function () {
  13680. function GameState() {
  13681. /*********************************************************************** */
  13682. this.btnArr = ["res/button.png", "res/button.png", "res/button.png"];
  13683. this.nameArr = ["canvas截图", "sprite截图", "清理"];
  13684. }
  13685. GameState.prototype.drawSomething = function () {
  13686. this.sp = new Sprite();
  13687. Laya.stage.addChild(this.sp);
  13688. //画线
  13689. this.sp.graphics.drawLine(10, 58, 146, 58, "#ff0000", 3);
  13690. //画连续直线
  13691. this.sp.graphics.drawLines(176, 58, [0, 0, 39, -50, 78, 0, 117, 50, 156, 0], "#ff0000", 5);
  13692. //画曲线
  13693. this.sp.graphics.drawCurves(352, 58, [0, 0, 19, -100, 39, 0, 58, 100, 78, 0, 97, -100, 117, 0, 136, 100, 156, 0], "#ff0000", 5);
  13694. //画矩形
  13695. this.sp.graphics.drawRect(10, 166, 166, 90, "#ffff00");
  13696. //画多边形
  13697. this.sp.graphics.drawPoly(264, 166, [0, 0, 60, 0, 78.48, 57, 30, 93.48, -18.48, 57], "#ffff00");
  13698. //画三角形
  13699. this.sp.graphics.drawPoly(400, 166, [0, 100, 50, 0, 100, 100], "#ffff00");
  13700. //画圆
  13701. this.sp.graphics.drawCircle(98, 332, 50, "#00ffff");
  13702. //画扇形
  13703. this.sp.graphics.drawPie(240, 290, 100, 10, 60, "#00ffff");
  13704. //绘制圆角矩形,自定义路径
  13705. this.sp.graphics.drawPath(400, 310, [["moveTo", 5, 0], ["lineTo", 105, 0], ["arcTo", 110, 0, 110, 5, 5], ["lineTo", 110, 55], ["arcTo", 110, 60, 105, 60, 5], ["lineTo", 5, 60], ["arcTo", 0, 60, 0, 55, 5], ["lineTo", 0, 5], ["arcTo", 0, 0, 5, 0, 5], ["closePath"]], { fillStyle: "#00ffff" });
  13706. };
  13707. GameState.prototype._onclick = function (e) {
  13708. switch (e.target.name) {
  13709. case this.nameArr[0]:
  13710. var base64Url = this._canvas.toDataURL("image/png", 1);
  13711. this.drawImage.skin = base64Url;
  13712. break;
  13713. case this.nameArr[1]:
  13714. var text = Laya.stage.drawToTexture(Laya.Browser.clientWidth, Laya.Browser.clientHeight, 0, 0);
  13715. this.drawSp.graphics.drawTexture(text, 0, 0, this.drawSp.width, this.drawSp.height);
  13716. break;
  13717. case this.nameArr[2]:
  13718. this.drawImage.skin = null;
  13719. this.drawSp.graphics.clear();
  13720. this.drawSp.graphics.drawRect(0, 0, this.drawSp.width, this.drawSp.height, "#ff0000");
  13721. break;
  13722. }
  13723. };
  13724. GameState.removeselect = "GameState_removeselect";
  13725. GameState.npcend = "GameState_npcendGame";
  13726. /**
  13727. * 通关成功
  13728. */
  13729. GameState.win = "GameState_winGame";
  13730. /**
  13731. * 通关失败
  13732. */
  13733. GameState.fail = "GameState_failGame";
  13734. GameState.jump = "GameState_jumpgame";
  13735. /**
  13736. * 暂停游戏
  13737. */
  13738. GameState.stop = "GameState_stopGame";
  13739. /**
  13740. * 回到主界面
  13741. */
  13742. GameState.returnMainView = "returnMainView";
  13743. GameState.updateSKinView = "GameState_updateSKinView";
  13744. /*********************************************************************** */
  13745. /**
  13746. * 开始游戏
  13747. */
  13748. GameState.start = "GameState_startGame";
  13749. /**
  13750. * 结束游戏
  13751. */
  13752. GameState.end = "GameState_endGame";
  13753. /**失败 */
  13754. GameState.lose = "GameState_loseGame";
  13755. /**
  13756. * 复活
  13757. */
  13758. GameState.revive = "GameState_reviveGame";
  13759. /**是否复活 */
  13760. GameState.isdie = false;
  13761. /**允许复活次数 */
  13762. GameState.fuhuocishu = 1;
  13763. /**是否已经发布过录屏 */
  13764. GameState.recordscree = false;
  13765. return GameState;
  13766. }());
  13767. exports.GameState = GameState;
  13768. },{}],85:[function(require,module,exports){
  13769. "use strict";
  13770. Object.defineProperty(exports, "__esModule", { value: true });
  13771. /*
  13772. * 公共接口
  13773. */
  13774. var GameUtils;
  13775. (function (GameUtils) {
  13776. /**
  13777. * 随机函数(返回整型)
  13778. */
  13779. function randRangeint(min, max) {
  13780. var value = Math.floor(Math.random() * (max - min + 1)) + min;
  13781. if (value > max) {
  13782. value = max;
  13783. }
  13784. return value;
  13785. }
  13786. GameUtils.randRangeint = randRangeint;
  13787. /**
  13788. * 随机函数( 不取整 )
  13789. */
  13790. function randRangefloat(min, max) {
  13791. var value = Math.random() * (max - min + 1) + min;
  13792. if (value > max) {
  13793. value = max;
  13794. }
  13795. return value;
  13796. }
  13797. GameUtils.randRangefloat = randRangefloat;
  13798. function getTexbyPkgAndName(pkgname, texname) {
  13799. var uipackage = fairygui.UIPackage.getByName(pkgname);
  13800. if (uipackage) {
  13801. return uipackage.getItemAssetByName(texname);
  13802. }
  13803. return null;
  13804. }
  13805. GameUtils.getTexbyPkgAndName = getTexbyPkgAndName;
  13806. /**
  13807. * 切割分号变成Point对象
  13808. * @param str
  13809. */
  13810. function cutfenhaoPoint(str) {
  13811. var arr = str.split(";");
  13812. return new Laya.Point(Number(arr[0]), Number(arr[1]));
  13813. }
  13814. GameUtils.cutfenhaoPoint = cutfenhaoPoint;
  13815. /**
  13816. * 切割分号变成数据(number)
  13817. */
  13818. function cutfenhaotoArrnum(str) {
  13819. var numArr = [];
  13820. if (str == "") {
  13821. return numArr;
  13822. }
  13823. var arr = str.split(";");
  13824. var i = 0;
  13825. for (i; i < arr.length; i++) {
  13826. numArr.push(Number(arr[i]));
  13827. }
  13828. return numArr;
  13829. }
  13830. GameUtils.cutfenhaotoArrnum = cutfenhaotoArrnum;
  13831. /**
  13832. * 切割分号变成数据(string)
  13833. */
  13834. function cutfenhaotoArrstr(str) {
  13835. return str.split(";");
  13836. }
  13837. GameUtils.cutfenhaotoArrstr = cutfenhaotoArrstr;
  13838. /**
  13839. * 切割分号变成数据( { key:1,value:1 } )
  13840. */
  13841. function cutfenhaotoObj(str) {
  13842. var obj = {};
  13843. var arr = str.split(";");
  13844. obj.key = arr[0];
  13845. obj.value = arr[1];
  13846. return obj;
  13847. }
  13848. GameUtils.cutfenhaotoObj = cutfenhaotoObj;
  13849. /**切割str*/
  13850. function cutstrtoArr(str) {
  13851. var arr = str.split("|");
  13852. return arr;
  13853. }
  13854. GameUtils.cutstrtoArr = cutstrtoArr;
  13855. /**切割str( 1:1|1:1 ) to Array<{ key:1,value:1 }> */
  13856. function cutstrtoArr1(str) {
  13857. var reslutArr = [];
  13858. var arr = str.split("|");
  13859. var i = 0;
  13860. for (i = 0; i < arr.length; i++) {
  13861. var itemarr = arr[i].split(";");
  13862. reslutArr.push({ key: itemarr[0], value: itemarr[1] });
  13863. }
  13864. return reslutArr;
  13865. }
  13866. GameUtils.cutstrtoArr1 = cutstrtoArr1;
  13867. function cutstrtoObj(str) {
  13868. var resultobj = {};
  13869. var arr = str.split("|");
  13870. var i = 0;
  13871. for (i = 0; i < arr.length; i++) {
  13872. var itemarr = arr[i].split(";");
  13873. resultobj[itemarr[0]] = itemarr[1];
  13874. }
  13875. return resultobj;
  13876. }
  13877. GameUtils.cutstrtoObj = cutstrtoObj;
  13878. function compareVersion(v1, v2) {
  13879. v1 = v1.split('.');
  13880. v2 = v2.split('.');
  13881. var len = Math.max(v1.length, v2.length);
  13882. while (v1.length < len) {
  13883. v1.push('0');
  13884. }
  13885. while (v2.length < len) {
  13886. v2.push('0');
  13887. }
  13888. for (var i = 0; i < len; i++) {
  13889. var num1 = parseInt(v1[i]);
  13890. var num2 = parseInt(v2[i]);
  13891. if (num1 > num2) {
  13892. return 1;
  13893. }
  13894. else if (num1 < num2) {
  13895. return -1;
  13896. }
  13897. }
  13898. return 0;
  13899. }
  13900. GameUtils.compareVersion = compareVersion;
  13901. })(GameUtils = exports.GameUtils || (exports.GameUtils = {}));
  13902. },{}],86:[function(require,module,exports){
  13903. "use strict";
  13904. Object.defineProperty(exports, "__esModule", { value: true });
  13905. var GlobalTipPanel_1 = require("../View/GlobalTipPanel");
  13906. var LayoutControl_1 = require("../Control/LayoutControl");
  13907. var LayOUT_1 = require("../utils/LayOUT");
  13908. var DispatcherManager_1 = require("../utils/DispatcherManager");
  13909. var GameState_1 = require("../utils/GameState");
  13910. /*
  13911. * name;
  13912. */
  13913. var GlobalTip = /** @class */ (function () {
  13914. function GlobalTip() {
  13915. GlobalTip.ins = this;
  13916. }
  13917. Object.defineProperty(GlobalTip, "Instance", {
  13918. get: function () {
  13919. if (GlobalTip.ins == null) {
  13920. return new GlobalTip();
  13921. }
  13922. return GlobalTip.ins;
  13923. },
  13924. enumerable: true,
  13925. configurable: true
  13926. });
  13927. GlobalTip.prototype.initEvent = function () {
  13928. GlobalTip.isEvent = true;
  13929. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.removeselect, this, this.addwordList);
  13930. };
  13931. GlobalTip.prototype.showWordTips = function (word) {
  13932. if (!GlobalTip.isEvent) {
  13933. GlobalTip.Instance.initEvent();
  13934. }
  13935. if (GlobalTip.showWordList.length > 0) {
  13936. var lastword = GlobalTip.showWordList[GlobalTip.showWordList.length - 1].nowword;
  13937. // if( lastword == word )
  13938. // {
  13939. // return;
  13940. // }
  13941. }
  13942. if (GlobalTip.wordList.length > 0) {
  13943. var item = GlobalTip.wordList.shift();
  13944. LayoutControl_1.LayoutControl.Instance.AddLayerByName(item, LayOUT_1.LayOUT.TIP);
  13945. GlobalTip.showWordList.push(item);
  13946. item.showWord(word);
  13947. }
  13948. else {
  13949. if (GlobalTip.showWordList.length < 10) {
  13950. var item1 = new GlobalTipPanel_1.WordTipsPanel();
  13951. LayoutControl_1.LayoutControl.Instance.AddLayerByName(item1, LayOUT_1.LayOUT.TIP);
  13952. GlobalTip.showWordList.push(item1);
  13953. item1.showWord(word);
  13954. }
  13955. else {
  13956. var item1 = GlobalTip.showWordList.shift();
  13957. item1.showWord(word);
  13958. GlobalTip.showWordList.push(item1);
  13959. }
  13960. }
  13961. };
  13962. GlobalTip.prototype.addwordList = function (item) {
  13963. if (item) {
  13964. item.removeFromParent();
  13965. var index = GlobalTip.showWordList.indexOf(item);
  13966. if (index != -1) {
  13967. GlobalTip.showWordList.splice(index, 1);
  13968. }
  13969. LayoutControl_1.LayoutControl.Instance.ClearLayerByName(LayOUT_1.LayOUT.TIP);
  13970. GlobalTip.wordList.push(item);
  13971. }
  13972. };
  13973. GlobalTip.wordList = [];
  13974. GlobalTip.showWordList = [];
  13975. GlobalTip.maxNum = 10;
  13976. GlobalTip.isEvent = false;
  13977. return GlobalTip;
  13978. }());
  13979. exports.GlobalTip = GlobalTip;
  13980. },{"../Control/LayoutControl":21,"../View/GlobalTipPanel":62,"../utils/DispatcherManager":83,"../utils/GameState":84,"../utils/LayOUT":88}],87:[function(require,module,exports){
  13981. "use strict";
  13982. Object.defineProperty(exports, "__esModule", { value: true });
  13983. var LEvent = /** @class */ (function (_super) {
  13984. __extends(LEvent, _super);
  13985. function LEvent(type, obj, bubbles, cancelable) {
  13986. if (obj === void 0) { obj = null; }
  13987. if (bubbles === void 0) { bubbles = false; }
  13988. if (cancelable === void 0) { cancelable = false; }
  13989. var _this = _super.call(this) || this;
  13990. _this.CLASS_NAME = "LEvent";
  13991. if (obj) {
  13992. _this._obj = obj;
  13993. }
  13994. return _this;
  13995. }
  13996. LEvent.prototype.clone = function (obj) {
  13997. return new LEvent(this.type, obj ? obj : this._obj);
  13998. };
  13999. LEvent.prototype.toString = function () {
  14000. console.log(this.CLASS_NAME, "type", "bubbles", "cancelable");
  14001. };
  14002. Object.defineProperty(LEvent.prototype, "param", {
  14003. /**
  14004. * 传参获取
  14005. * @returns {any}
  14006. */
  14007. get: function () {
  14008. return this._obj;
  14009. },
  14010. enumerable: true,
  14011. configurable: true
  14012. });
  14013. return LEvent;
  14014. }(Laya.Event));
  14015. exports.LEvent = LEvent;
  14016. },{}],88:[function(require,module,exports){
  14017. "use strict";
  14018. Object.defineProperty(exports, "__esModule", { value: true });
  14019. var LayOUT = /** @class */ (function () {
  14020. function LayOUT() {
  14021. }
  14022. /**
  14023. * 背景层
  14024. */
  14025. LayOUT.BG = "BG";
  14026. /**
  14027. * ui层
  14028. */
  14029. LayOUT.UI = "UI";
  14030. /**
  14031. * ui层上层
  14032. */
  14033. LayOUT.UITop = "UITop";
  14034. /**
  14035. * tips层
  14036. */
  14037. LayOUT.TIP = "TIP";
  14038. /**
  14039. * 新手引导层
  14040. */
  14041. LayOUT.GUIDE = "GUIDE";
  14042. return LayOUT;
  14043. }());
  14044. exports.LayOUT = LayOUT;
  14045. },{}],89:[function(require,module,exports){
  14046. "use strict";
  14047. Object.defineProperty(exports, "__esModule", { value: true });
  14048. /*
  14049. * name;
  14050. */
  14051. var Singleton = /** @class */ (function (_super) {
  14052. __extends(Singleton, _super);
  14053. function Singleton() {
  14054. return _super.call(this) || this;
  14055. }
  14056. /**
  14057. * 获取单例类,若不存在则返回空
  14058. * @param ref 继承自Singleton的类
  14059. * @return *
  14060. */
  14061. Singleton.Instance = function (ref) {
  14062. if (ref.key == null) {
  14063. throw new Error("getinstance erro");
  14064. }
  14065. return this._dict[ref.key];
  14066. };
  14067. /**
  14068. * 获取单例类,若不存在则创建
  14069. * @param ref 继承自Singleton的类
  14070. * @return *
  14071. */
  14072. Singleton.getInstanceOrCreate = function (ref) {
  14073. if (ref.key == null) {
  14074. throw new Error("getInstanceOrCreate erro");
  14075. }
  14076. this.create(ref);
  14077. return this._dict[ref.key];
  14078. };
  14079. /**
  14080. * 创建单例类
  14081. * @param ref 继承自Singleton的类
  14082. * @return void
  14083. */
  14084. Singleton.create = function (ref) {
  14085. if (ref.key == null) {
  14086. throw new Error("create erro");
  14087. }
  14088. if (this._dict[ref.key] == null) {
  14089. this._dict[ref.key] = new ref();
  14090. }
  14091. return this._dict[ref.key];
  14092. };
  14093. /**
  14094. * 删除单例类
  14095. * @param ref 继承自Singleton的类
  14096. * @return void
  14097. */
  14098. Singleton.remove = function (ref) {
  14099. var key = ref.key;
  14100. if (this._dict[key] != null) {
  14101. this._dict[key].destory();
  14102. }
  14103. };
  14104. /**
  14105. * 销毁方法
  14106. */
  14107. Singleton.prototype.destory = function () {
  14108. };
  14109. Singleton._dict = {};
  14110. return Singleton;
  14111. }(Laya.EventDispatcher));
  14112. exports.Singleton = Singleton;
  14113. },{}],90:[function(require,module,exports){
  14114. "use strict";
  14115. Object.defineProperty(exports, "__esModule", { value: true });
  14116. var AgencySkin_1 = require("../Agency/AgencySkin");
  14117. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  14118. var GlobalTip_1 = require("../utils/GlobalTip");
  14119. var AssetPath_1 = require("../Config/AssetPath");
  14120. var MovieClip = Laya.MovieClip;
  14121. var ttad_1 = require("../WXSDK/ttad");
  14122. var SkinItem = /** @class */ (function (_super) {
  14123. __extends(SkinItem, _super);
  14124. function SkinItem() {
  14125. var _this = _super.call(this) || this;
  14126. /********************************************************** */
  14127. _this.bgColorChannels = { r: 99, g: 0, b: 0xFF };
  14128. /********************************************** */
  14129. _this.SWFPath = "res/swf/dragon.swf";
  14130. _this.MCWidth = 318;
  14131. _this.MCHeight = 406;
  14132. return _this;
  14133. }
  14134. SkinItem.prototype.getHexColorString = function () {
  14135. this.bgColorChannels.r = Math.floor(this.bgColorChannels.r);
  14136. // 绿色通道使用0
  14137. this.bgColorChannels.g = 0;
  14138. //obj.g = Math.floor(obj.g);
  14139. this.bgColorChannels.b = Math.floor(this.bgColorChannels.b);
  14140. var r = this.bgColorChannels.r.toString(16);
  14141. r = r.length == 2 ? r : "0" + r;
  14142. var g = this.bgColorChannels.g.toString(16);
  14143. g = g.length == 2 ? g : "0" + g;
  14144. var b = this.bgColorChannels.b.toString(16);
  14145. b = b.length == 2 ? b : "0" + b;
  14146. return "#" + r + g + b;
  14147. };
  14148. /********************************************************** */
  14149. SkinItem.prototype.constructFromXML = function (xml) {
  14150. _super.prototype.constructFromXML.call(this, xml);
  14151. for (var str in this._children) {
  14152. var item = this._children[str];
  14153. this[item.name] = item;
  14154. }
  14155. this.onInit();
  14156. };
  14157. SkinItem.prototype.onInit = function () {
  14158. this.initView();
  14159. this.initEvent();
  14160. };
  14161. SkinItem.prototype.initView = function () {
  14162. this.agencyskin = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencySkin_1.AgencySkin);
  14163. this.c_state = this.getController("c_state");
  14164. };
  14165. SkinItem.prototype.initEvent = function () {
  14166. this.on(Laya.Event.CLICK, this, this.btnclick);
  14167. };
  14168. SkinItem.prototype.btnclick = function () {
  14169. if (this.pifuvo) {
  14170. switch (this.c_state.selectedIndex) {
  14171. case 0:
  14172. break;
  14173. case 1: //拥有
  14174. this.agencyskin.GainPifu(this.pifuvo);
  14175. break;
  14176. case 2: //活动获取
  14177. GlobalTip_1.GlobalTip.Instance.showWordTips("暂未开放");
  14178. break;
  14179. case 3: //看视频获取
  14180. this.playvideocallback();
  14181. // pingtaiutils.Instance.playVideo( "",this,this.playvideocallback );
  14182. break;
  14183. case 4: //金币购买
  14184. this.agencyskin.GainPifu(this.pifuvo);
  14185. break;
  14186. }
  14187. }
  14188. };
  14189. SkinItem.prototype.createMovieClip = function () {
  14190. var mc = new MovieClip();
  14191. mc.load(this.SWFPath);
  14192. mc.x = (Laya.stage.width - this.MCWidth) / 2;
  14193. mc.y = (Laya.stage.height - this.MCHeight) / 2;
  14194. Laya.stage.addChild(mc);
  14195. };
  14196. /********************************************** */
  14197. SkinItem.prototype.playvideocallback = function () {
  14198. var _this = this;
  14199. ttad_1.ttad.ShowVideo((function (isLoad) {
  14200. if (isLoad) {
  14201. _this.agencyskin.GainPifu(_this.pifuvo);
  14202. }
  14203. }));
  14204. };
  14205. SkinItem.prototype.showData = function (vo) {
  14206. this.pifuvo = vo;
  14207. if (this.pifuvo) {
  14208. this.load_icon.icon = AssetPath_1.AssetPath.getroleicon(this.pifuvo.roleCFG.icon);
  14209. if (this.agencyskin.RoleData.CharacterID == this.pifuvo.roleCFG.id) {
  14210. this.c_state.selectedIndex = 0;
  14211. }
  14212. else if (this.pifuvo.state == 1) {
  14213. this.c_state.selectedIndex = 1;
  14214. }
  14215. else {
  14216. switch (this.pifuvo.roleCFG.getState) {
  14217. case 1:
  14218. this.c_state.selectedIndex = 3;
  14219. this.txt_need.text = this.pifuvo.hasnum + "/" + this.pifuvo.roleCFG.need;
  14220. break;
  14221. case 2:
  14222. this.c_state.selectedIndex = 4;
  14223. this.txt_need.text = this.pifuvo.roleCFG.need.toString();
  14224. break;
  14225. case 3:
  14226. this.c_state.selectedIndex = 2;
  14227. break;
  14228. }
  14229. }
  14230. }
  14231. };
  14232. /******************************************************** */
  14233. SkinItem.prototype.preFixNumber = function (num, strLen) {
  14234. return ("0000000000" + num).slice(-strLen);
  14235. };
  14236. SkinItem.prototype.evalBgColor = function () {
  14237. var color = Math.random() * 0xFFFFFF;
  14238. var channels = this.getColorChannals(color);
  14239. };
  14240. SkinItem.prototype.getColorChannals = function (color) {
  14241. var result = [];
  14242. result.push(color >> 16);
  14243. result.push(color >> 8 & 0xFF);
  14244. result.push(color & 0xFF);
  14245. return result;
  14246. };
  14247. /******************************************************** */
  14248. SkinItem.prototype.dispose = function () {
  14249. this.off(Laya.Event.CLICK, this, this.btnclick);
  14250. _super.prototype.dispose.call(this);
  14251. };
  14252. return SkinItem;
  14253. }(fairygui.GButton));
  14254. exports.SkinItem = SkinItem;
  14255. },{"../Agency/AgencySkin":6,"../Config/AssetPath":15,"../PrefabControl/PanelResDic":46,"../WXSDK/ttad":81,"../utils/GlobalTip":86}],91:[function(require,module,exports){
  14256. "use strict";
  14257. Object.defineProperty(exports, "__esModule", { value: true });
  14258. /**
  14259. * 继承baseView界面的打开关闭动效类型
  14260. */
  14261. var ViewAction = /** @class */ (function () {
  14262. function ViewAction() {
  14263. /************************ */
  14264. this._text = null;
  14265. }
  14266. /**
  14267. * 动画状态开始时执行。
  14268. */
  14269. ViewAction.prototype.onStateEnter = function () {
  14270. console.log("动画开始播放了");
  14271. this._text.text = "动画状态:动画开始播放";
  14272. };
  14273. /**
  14274. * 动画状态更新时执行。
  14275. */
  14276. ViewAction.prototype.onStateUpdate = function () {
  14277. console.log("动画状态更新了");
  14278. this._text.text = "动画状态:动画更新中";
  14279. };
  14280. /**
  14281. * 动画状态退出时执行。
  14282. */
  14283. ViewAction.prototype.onStateExit = function () {
  14284. console.log("动画退出了");
  14285. this._text.text = "动画状态:动画开始退出";
  14286. };
  14287. ViewAction.prototype.addBox = function () {
  14288. for (var i = 0; i < 8; i++) {
  14289. this.addVerticalBox(-0.65, 0.165 + i * 0.33 * 2, 0);
  14290. this.addVerticalBox(0, 0.165 + i * 0.33 * 2, 0);
  14291. this.addVerticalBox(0.65, 0.165 + i * 0.33 * 2, 0);
  14292. }
  14293. };
  14294. ViewAction.prototype.addVerticalBox = function (x, y, z) {
  14295. var box = this.scene.addChild(new Laya.MeshSprite3D(this.mesh1));
  14296. box.meshRenderer.material = this.mat1;
  14297. box.meshRenderer.castShadow = true;
  14298. box.meshRenderer.receiveShadow = true;
  14299. box.transform.position = new Laya.Vector3(x, y, z);
  14300. var rigidBody = box.addComponent(Laya.Rigidbody3D);
  14301. rigidBody.mass = 10;
  14302. rigidBody.friction = 0.4;
  14303. rigidBody.restitution = 0.2;
  14304. var boxShape = new Laya.BoxColliderShape(0.5, 0.33, 2);
  14305. rigidBody.colliderShape = boxShape;
  14306. };
  14307. /**
  14308. * 从小变大
  14309. */
  14310. ViewAction.ActionType_addscaleMinToMax = "ActionType_addscaleMinToMax";
  14311. /**
  14312. * 从大变小移出
  14313. */
  14314. ViewAction.ActionType_removescaleMaxToMin = "ActionType_removescaleMaxToMin";
  14315. /**
  14316. * 没有动效
  14317. */
  14318. ViewAction.ActionType_none = "ActionType_none";
  14319. /********************************************** */
  14320. /**
  14321. * 从右边移动到中央
  14322. */
  14323. ViewAction.ActionType_addmoveToMiddle = "ActionType_addmoveToMiddle";
  14324. /**
  14325. * 从最右边移出
  14326. */
  14327. ViewAction.ActionType_removemoveToRight = "ActionType_removemoveToRight";
  14328. /**
  14329. * 从底部向上移动
  14330. */
  14331. ViewAction.ActionType_addmoveFromBottom = "ActionType_addmoveFromBottom";
  14332. /**
  14333. * 从上向底部移动
  14334. */
  14335. ViewAction.ActionType_addmoveFromup = "ActionType_addmoveFromup";
  14336. return ViewAction;
  14337. }());
  14338. exports.ViewAction = ViewAction;
  14339. },{}]},{},[42])
  14340. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL0xheWFBaXIvTGF5YTIuMy4wL3Jlc291cmNlcy9hcHAvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInNyYy9BZ2VuY3kvQWdlbmN5QmFzZUNvbnRyb2wudHMiLCJzcmMvQWdlbmN5L0FnZW5jeUluR2FtZS50cyIsInNyYy9BZ2VuY3kvQWdlbmN5TG9naW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeUxvdHRlcnkudHMiLCJzcmMvQWdlbmN5L0FnZW5jeU1haW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeVNraW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeVRyaWFsLnRzIiwic3JjL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZS50cyIsInNyYy9DRkcvQnVpbGRDRkcudHMiLCJzcmMvQ0ZHL0dhbWVDRkcudHMiLCJzcmMvQ0ZHL0xldmVsQ0ZHLnRzIiwic3JjL0NGRy9Mb3R0ZXJ5Q0ZHLnRzIiwic3JjL0NGRy9OcGNDRkcudHMiLCJzcmMvQ0ZHL1JvbGVDRkcudHMiLCJzcmMvQ29uZmlnL0Fzc2V0UGF0aC50cyIsInNyYy9Db25maWcvUmVjQ29uZmlncy50cyIsInNyYy9Db250cm9sL0F1ZGlvQ29udHJvbC50cyIsInNyYy9Db250cm9sL0Nvbm5lY3RDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvRGF0ZUNvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9HYW1lU3RhdGVDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvTGF5b3V0Q29udHJvbC50cyIsInNyYy9Db250cm9sL0xvY2FsRGF0YUNvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9QYW5lbEJhc2VDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9SZXNEYXRhQ29udHJvbC50cyIsInNyYy9Db250cm9sL1Jlc291cmNlQ29udHJvbC50cyIsInNyYy9Db250cm9sL1NjZW5lQ29udHJvbC50cyIsInNyYy9EYXRhL0NvbXBvbmVudEV2ZW50RGF0YS50cyIsInNyYy9EYXRhL0RhdGFJbmZvQmFzZS50cyIsInNyYy9EYXRhL0xvY2FsRGF0YS50cyIsInNyYy9EYXRhL1JvbGVEYXRhLnRzIiwic3JjL0RhdGEvU2tpbkRhdGEudHMiLCJzcmMvRGF0YS9Vc2VyRGF0YUluZm8udHMiLCJzcmMvRGF0YS9Vc2VySW5mb0V2ZW50LnRzIiwic3JjL0dhbWVDb250ZW50cy50cyIsInNyYy9HYW1lL0NhbWVyYU1hbmFnZXIudHMiLCJzcmMvR2FtZS9OcGNTY3JpcHQudHMiLCJzcmMvR2FtZS9QbGF5ZXIudHMiLCJzcmMvR2xvYmFsLnRzIiwic3JjL0dsb2JhbFdhaXRpbmcudHMiLCJzcmMvSm95c3RpY2tNb2R1bGUudHMiLCJzcmMvTWFpbi50cyIsInNyYy9QcmVmYWJDb250cm9sL0NoYXJhY3RlclBvb2wudHMiLCJzcmMvUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZS50cyIsInNyYy9QcmVmYWJDb250cm9sL0dhbWVQb29sLnRzIiwic3JjL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWMudHMiLCJzcmMvUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlci50cyIsInNyYy9QdXNoL0Jhb0t1YW5HYW1lVmlldy50cyIsInNyYy9QdXNoL0Nob3V0aVBhblZpZXcudHMiLCJzcmMvUHVzaC9DcGFEb3duc1ZpZXcudHMiLCJzcmMvUHVzaC9DcGFFdmVudC50cyIsInNyYy9QdXNoL0NwYUl0ZW0udHMiLCJzcmMvUHVzaC9SZWNvbW1lbmRWaWV3LnRzIiwic3JjL1B1c2gvU2hpd2FudHVpamlhblZpZXcudHMiLCJzcmMvUHVzaC9UdWlqaWFuVmlldy50cyIsInNyYy9UaW1lL1RpbWVVdGlscy50cyIsInNyYy9UaW1lL1RpbWVyU2VydmljZS50cyIsInNyYy9UaW1lL1RpbWVzVGFtcGVyLnRzIiwic3JjL1ZpZXcvQ29tcGxldGVQYW5lbC50cyIsInNyYy9WaWV3L0VnZ1BhbmVsLnRzIiwic3JjL1ZpZXcvR2lmdFZpZXcudHMiLCJzcmMvVmlldy9HbG9iYWxUaXBQYW5lbC50cyIsInNyYy9WaWV3L0xvYWRpbmdQYW5lbC50cyIsInNyYy9WaWV3L0xvdHRlcnlQYW5lbC50cyIsInNyYy9WaWV3L01haW5QYW5lbC50cyIsInNyYy9WaWV3L1NraW5QYW5lbC50cyIsInNyYy9WaWV3L1RyaWFsUGFuZWwudHMiLCJzcmMvVmlldy9WaWV3TWFuYWdlci50cyIsInNyYy9XWFNESy9GWUhEX1Nkay50cyIsInNyYy9XWFNESy9HdWFuZ0dhby50cyIsInNyYy9XWFNESy9OZXR3b3JrTWFuYWdlci50cyIsInNyYy9XWFNESy9QbGF0ZnJvbVR5cGUudHMiLCJzcmMvV1hTREsvUGxheWVyQWNjb3VudC50cyIsInNyYy9XWFNESy9SZWNvcmRNYW5hZ2VyLnRzIiwic3JjL1dYU0RLL1Nkay50cyIsInNyYy9XWFNESy9TZXJ2ZXJTb2NrZXQudHMiLCJzcmMvV1hTREsvU29ja2V0Tm9maWZ5LnRzIiwic3JjL1dYU0RLL1dFQ0hBVEVWRU5ULnRzIiwic3JjL1dYU0RLL1dYR2FtZVBsYXRmb3JtLnRzIiwic3JjL1dYU0RLL3Bpbmd0YWl1dGlscy50cyIsInNyYy9XWFNESy90dGFkLnRzIiwic3JjL3V0aWxzL0Rpc1BhdGNoZXJPbi50cyIsInNyYy91dGlscy9EaXNwYXRjaGVyTWFuYWdlci50cyIsInNyYy91dGlscy9HYW1lU3RhdGUudHMiLCJzcmMvdXRpbHMvR2FtZVV0aWxzLnRzIiwic3JjL3V0aWxzL0dsb2JhbFRpcC50cyIsInNyYy91dGlscy9MRXZlbnQudHMiLCJzcmMvdXRpbHMvTGF5T1VULnRzIiwic3JjL3V0aWxzL1NpbmdsZXRvbi50cyIsInNyYy91dGlscy9Ta2luSXRlbS50cyIsInNyYy91dGlscy9WaWV3QWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1ZBLDREQUF5RDtBQUN6RCxnRUFBK0Q7QUFDL0QsZ0RBQTZDO0FBQzdDLHNEQUFtRDtBQUNuRCw2Q0FBMEM7QUFFMUM7O0VBRUU7QUFDRjtJQUF1QyxxQ0FBUztJQU01QztRQUFBLFlBQ0ksaUJBQU8sU0FHVjtRQUZHLEtBQUksQ0FBQyxXQUFXLEdBQUcseUJBQVcsQ0FBQyxRQUFRLENBQUM7UUFDeEMsS0FBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztJQUNwQixDQUFDO0lBQ1Msb0NBQVEsR0FBbEI7SUFHQSxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IseUNBQWEsR0FBckI7UUFDSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QixJQUFJO1FBQ0osSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsT0FBTztRQUNQLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0YsS0FBSztRQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hJLEtBQUs7UUFDTCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU07UUFDTixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEcsTUFBTTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRSxJQUFJO1FBQ0osSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELEtBQUs7UUFDTCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRCxjQUFjO1FBQ2QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FB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QUNwQixJQUFJO0lBRUcsc0JBQVUsR0FBVSxHQUFHLENBQUM7SUFFeEIsc0JBQVUsR0FBTztRQUNwQixVQUFVLEVBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsU0FBUyxFQUFDLEtBQUssRUFBRTtRQUMxQyxPQUFPLEVBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxFQUFFLEVBQUMsU0FBUyxFQUFDLElBQUksRUFBRTtRQUNuQyxLQUFLLEVBQUMsRUFBRSxDQUFDLEVBQUMsRUFBRSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsU0FBUyxFQUFDLElBQUksRUFBRTtRQUNuQyxNQUFNLEVBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsU0FBUyxFQUFDLElBQUksRUFBRTtRQUNyQyxXQUFXLEVBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsU0FBUyxFQUFDLElBQUksRUFBRTtRQUMxQyxRQUFRLEVBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsU0FBUyxFQUFDLElBQUksRUFBRTtRQUN2QyxRQUFRLEVBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsU0FBUyxFQUFDLElBQUksRUFBRTtRQUN2QyxTQUFTLEVBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsU0FBUyxFQUFDLElBQUksRUFBRTtRQUN4QyxTQUFTLEVBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsU0FBUyxFQUFDLElBQUksRUFBRTtRQUN4QyxTQUFTLEVBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsU0FBUyxFQUFDLElBQUksRUFBRTtRQUN4QyxRQUFRLEVBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxF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QUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0YsS0FBSztRQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hJLEtBQUs7UUFDTCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU07UUFDTixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEcsTUFBTTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRSxJQUFJO1FBQ0osSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxF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QUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RSxTQUFTLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztJQUN2QyxDQUFDO0lBMUNEOztPQUVHO0lBQ0ksc0NBQTJCLEdBQVUsNkJBQTZCLENBQUM7SUFFMUU7O09BRUc7SUFDSSx5Q0FBOEIsR0FBVSxnQ0FBZ0MsQ0FBQztJQUVoRjs7T0FFRztJQUNJLDBCQUFlLEdBQVUsaUJBQWlCLENBQUM7SUErQmxELGtEQUFrRDtJQUdsRDs7T0FFRztJQUNJLHFDQUEwQixHQUFRLDRCQUE0QixDQUFDO0lBQ3RFOztPQUVHO0lBQ0ksdUNBQTRCLEdBQVUsOEJBQThCLENBQUM7SUFFNUU7O09BRUc7SUFDSSx1Q0FBNEIsR0FBUSw4QkFBOEIsQ0FBQztJQUMxRTs7T0FFRztJQUNJLG1DQUF3QixHQUFRLDBCQUEwQixDQUFDO0lBS3RFLGlCQUFDO0NBaEdELEFBZ0dDLElBQUE7QUFoR1ksZ0NBQVUiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XHJcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbiAgICB9O1xyXG59KSgpO1xyXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWNcIjtcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQge1NpbmdsZXRvbn0gZnJvbSBcIi4uL3V0aWxzL1NpbmdsZXRvblwiO1xuaW1wb3J0IHtTZXJ2ZXJTb2NrZXR9IGZyb20gXCIuLi9XWFNESy9TZXJ2ZXJTb2NrZXRcIjtcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIEFnZW5jeUJhc2VDb250cm9sIGV4dGVuZHMgU2luZ2xldG9uXG57XG4gICAgcHJpdmF0ZSBfb2JqZWN0UG9vbDogUGFuZWxSZXNEaWM7XG5cbiAgICBwcml2YXRlIHNwOkxheWEuU3ByaXRlO1xuXG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fb2JqZWN0UG9vbCA9IFBhbmVsUmVzRGljLkluc3RhbmNlO1xuICAgICAgICB0aGlzLmluaXRTZWxmKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBpbml0U2VsZigpOnZvaWRcbiAgICB7XG5cbiAgICB9XG5cbiAgICAvKioqKioqKioqKua3t+a3hiAqL1xuICAgIHByaXZhdGUgZHJhd1NvbWV0aGluZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zcCA9IG5ldyBMYXlhLlNwcml0ZSgpO1xuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMuc3ApO1xuICAgICAgICAvL+eUu+e6v1xuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdMaW5lKDEwLCA1OCwgMTQ2LCA1OCwgXCIjZmYwMDAwXCIsIDMpO1xuICAgICAgICAvL+eUu+i/nue7reebtOe6v1xuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdMaW5lcygxNzYsIDU4LCBbMCwgMCwgMzksIC01MCwgNzgsIDAsIDExNywgNTAsIDE1NiwgMF0sIFwiI2ZmMDAwMFwiLCA1KTtcbiAgICAgICAgLy/nlLvmm7Lnur9cbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3Q3VydmVzKDM1MiwgNTgsIFswLCAwLCAxOSwgLTEwMCwgMzksIDAsIDU4LCAxMDAsIDc4LCAwLCA5NywgLTEwMCwgMTE3LCAwLCAxMzYsIDEwMCwgMTU2LCAwXSwgXCIjZmYwMDAwXCIsIDUpO1xuICAgICAgICAvL+eUu+efqeW9olxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdSZWN0KDEwLCAxNjYsIDE2NiwgOTAsIFwiI2ZmZmYwMFwiKTtcbiAgICAgICAgLy/nlLvlpJrovrnlvaJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UG9seSgyNjQsIDE2NiwgWzAsIDAsIDYwLCAwLCA3OC40OCwgNTcsIDMwLCA5My40OCwgLTE4LjQ4LCA1N10sIFwiI2ZmZmYwMFwiKTtcbiAgICAgICAgLy/nlLvkuInop5LlvaJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UG9seSg0MDAsIDE2NiwgWzAsIDEwMCwgNTAsIDAsIDEwMCwgMTAwXSwgXCIjZmZmZjAwXCIpO1xuICAgICAgICAvL+eUu+WchlxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdDaXJjbGUoOTgsIDMzMiwgNTAsIFwiIzAwZmZmZlwiKTtcbiAgICAgICAgLy/nlLvmiYflvaJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UGllKDI0MCwgMjkwLCAxMDAsIDEwLCA2MCwgXCIjMDBmZmZmXCIpO1xuICAgICAgICAvL+e7mOWItuWchuinkuefqeW9ou+8jOiHquWumuS5iei3r+W+hFxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQYXRoKDQwMCwgMzEwLCBbW1wibW92ZVRvXCIsIDUsIDBdLCBbXCJsaW5lVG9cIiwgMTA1LCAwXSwgW1wiYXJjVG9cIiwgMTEwLCAwLCAxMTAsIDUsIDVdLCBbXCJsaW5lVG9cIiwgMTEwLCA1NV0sIFtcImFyY1RvXCIsIDExMCwgNjAsIDEwNSwgNjAsIDVdLCBbXCJsaW5lVG9cIiwgNSwgNjBdLCBbXCJhcmNUb1wiLCAwLCA2MCwgMCwgNTUsIDVdLCBbXCJsaW5lVG9cIiwgMCwgNV0sIFtcImFyY1RvXCIsIDAsIDAsIDUsIDAsIDVdLCBbXCJjbG9zZVBhdGhcIl1dLCB7ZmlsbFN0eWxlOiBcIiMwMGZmZmZcIn0pO1xuICAgIH1cbiAgICAvKioqKioqKioqKiAqL1xuXG4gICAgLyoqXG4gICAgICogIOazqOWGjOWFqOWxgOS+puWQrOS6i+S7tlxuICAgICAqIFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBEaXNPbiggdHlwZTpzdHJpbmcsIGNhbGxiYWNrb2JqOmFueSwgY2FsbGJhY2tIYW5kbGVyOkZ1bmN0aW9uICk6dm9pZFxuICAgIHtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFja29iaiwgY2FsbGJhY2tIYW5kbGVyICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIOaKm+WHuuWFqOWxgOS6i+S7tiBcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgRGlzVHJpZ2dlcih0eXBlOnN0cmluZywgZGF0YTphbnkgPSBudWxsKTp2b2lkXG5cdHtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggdHlwZSwgZGF0YSApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOenu+mZpOWFqOWxgOS+puWQrOS6i+S7tlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBEaXNPZmYodHlwZTpzdHJpbmcsY2FsbGJhY2tvYmo6YW55LCBjYWxsYmFja0hhbmRsZXI6RnVuY3Rpb24pOnZvaWRcbiAgICB7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2tvYmosIGNhbGxiYWNrSGFuZGxlciApO1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgc2V0dXAoKTogdm9pZCB7XG4gICAgICAgIHZhciB0ZXh0Qm94OkxheWEuU3ByaXRlID0gbmV3IExheWEuU3ByaXRlKCk7XG5cbiAgICAgICAgLy8g6ZqP5py65pGG5pS+5paH5pysXG4gICAgICAgIHZhciB0ZXh0OkxheWEuVGV4dDtcbiAgICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IDEwMDA7IGkrKykge1xuICAgICAgICAgICAgdGV4dCA9IG5ldyBMYXlhLlRleHQoKTtcbiAgICAgICAgICAgIHRleHQuZm9udFNpemUgPSAyMDtcbiAgICAgICAgICAgIHRleHQudGV4dCA9IChNYXRoLnJhbmRvbSgpICogMTAwKS50b0ZpeGVkKDApO1xuICAgICAgICAgICAgdGV4dC5yb3RhdGlvbiA9IE1hdGgucmFuZG9tKCkgKiAzNjA7XG4gICAgICAgICAgICB0ZXh0LmNvbG9yID0gXCIjQ0NDQ0NDXCI7XG5cbiAgICAgICAgICAgIHRleHQueCA9IE1hdGgucmFuZG9tKCkgKiBMYXlhLnN0YWdlLndpZHRoO1xuICAgICAgICAgICAgdGV4dC55ID0gTWF0aC5yYW5kb20oKSAqIExheWEuc3RhZ2UuaGVpZ2h0O1xuXG4gICAgICAgICAgICB0ZXh0Qm94LmFkZENoaWxkKHRleHQpO1xuICAgICAgICB9XG4gICAgICAgIC8v57yT5a2Y5Li66Z2Z5oCB5Zu+5YOPXG4gICAgICAgIHRleHRCb3guY2FjaGVBcyA9IFwiYml0bWFwXCI7XG5cbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0ZXh0Qm94KTtcbiAgICB9XG4gICAgLyoqKioqKioqKiAqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIHByb3RlY3RlZCBnZXRTaW5nbGVUb24ocmVmOmFueSk6YW55XG5cdHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29iamVjdFBvb2wuZ2V0U2luZ2xlVG9uKHJlZik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNlbmRNZXNzYWdlKCBhY3Q6c3RyaW5nLGRhdGE6YW55ID0gbnVsbCxpc1Nob3dXYWl0OmJvb2xlYW4gPSB0cnVlICk6dm9pZFxuICAgIHtcbiAgICAgICAgU2VydmVyU29ja2V0Lkluc3RhbmNlLnNlbmRNZXNzYWdlKGFjdCwgZGF0YSwgaXNTaG93V2FpdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByb2xlRGF0YTpSb2xlRGF0YTtcblxuICAgIHB1YmxpYyBnZXQgUm9sZURhdGEoKTpSb2xlRGF0YVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvbGVEYXRhKXtcbiAgICAgICAgICAgIHRoaXMucm9sZURhdGEgPSBSb2xlRGF0YS5JbnN0YW5jZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb2xlRGF0YTtcbiAgICB9XG59IiwiaW1wb3J0IHtBZ2VuY3lCYXNlQ29udHJvbH0gZnJvbSBcIi4vQWdlbmN5QmFzZUNvbnRyb2xcIjtcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQge0NvbXBsZXRlUGFuZWx9IGZyb20gXCIuLi9WaWV3L0NvbXBsZXRlUGFuZWxcIjtcbmltcG9ydCB7R2FtZVN0YXRlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvR2FtZVN0YXRlQ29udHJvbFwiO1xuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xuaW1wb3J0IHtTY2VuZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcbmltcG9ydCB7IFBST1RPQ09MUywgTmV0d29ya01hbmFnZXIgfSBmcm9tIFwiLi4vV1hTREsvTmV0d29ya01hbmFnZXJcIjtcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uL1dYU0RLL1Nka1wiO1xuaW1wb3J0IHtBZ2VuY3lUcmlhbH0gZnJvbSBcIi4vQWdlbmN5VHJpYWxcIjtcbmltcG9ydCB7IEZZSERfU2RrIH0gZnJvbSBcIi4uL1dYU0RLL0ZZSERfU2RrXCI7XG5pbXBvcnQgRnJpZW5kSW52aXRlVmlldyBmcm9tIFwiLi4vUHVzaC9GcmllbmRJbnZpdGVWaWV3XCI7XG5pbXBvcnQgR2lmdFZpZXcgZnJvbSBcIi4uL1ZpZXcvR2lmdFZpZXdcIjtcbmltcG9ydCBDaG91dGlQYW5WaWV3IGZyb20gXCIuLi9QdXNoL0Nob3V0aVBhblZpZXdcIjtcbmltcG9ydCB7IFJlY29yZE1hbmFnZXIgfSBmcm9tIFwiLi4vV1hTREsvUmVjb3JkTWFuYWdlclwiO1xuXG5leHBvcnQgIGNsYXNzIEFnZW5jeUluR2FtZSBleHRlbmRzIEFnZW5jeUJhc2VDb250cm9sIFxue1xuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJBZ2VuY3lJbkdhbWVcIjtcbiAgICBzdGF0aWMgZ2FtZW51bTpudW1iZXIgPSAwO1xuXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cblxuICAgIHByb3RlY3RlZCBpbml0U2VsZigpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuRGlzT24oIEdhbWVTdGF0ZS5lbmQsdGhpcyx0aGlzLmVuZGdhbWVIYW5kbGVyICk7XG4gICAgICAgIHRoaXMuRGlzT24oR2FtZVN0YXRlLnJldml2ZSx0aGlzLHRoaXMuUmV2aXZlZ2FtZUhhbmRsZXIpO1xuICAgICAgICB0aGlzLkRpc09uKEdhbWVTdGF0ZS5sb3NlLHRoaXMsdGhpcy5Mb3NlZ2FtZUhhbmRsZXIpO1xuICAgIH1cbiAgICAvKirlpI3mtLvnlYzpnaIgKi9cbiAgICBwcml2YXRlIFJldml2ZWdhbWVIYW5kbGVyKCk6dm9pZHtcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDEwMDAsdGhpcyx0aGlzLnJldml2ZVZpZXcpO1xuICAgIH1cbiAgICAvKirlpLHotKXnlYzpnaIgKi9cbiAgICBwcml2YXRlIExvc2VnYW1lSGFuZGxlcigpOnZvaWR7XG4gICAgICAgIExheWEudGltZXIub25jZSgxMDAwLHRoaXMsdGhpcy5sb3NlVmlldyk7XG4gICAgfVxuICAgIHByaXZhdGUgcmV2aXZlVmlldygpe1xuICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlJlY29yZFN0b3AoKTtcbiAgICAgICAgdmFyIG5vd21pbmdjdmk6bnVtYmVyID0gR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5ub3dNaW5nQ2k7XG4gICAgICAgIHZhciBnZXRHb2xkOm51bWJlciA9IDA7XG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5omT5byA57uT566X55WM6Z2iKOWkjea0uylcIik7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ29tcGxldGVQYW5lbCxnZXRHb2xkICk7XG4gICAgfVxuICAgIHByaXZhdGUgbG9zZVZpZXcoKTp2b2lke1xuICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlJlY29yZFN0b3AoKTtcbiAgICAgICAgdmFyIG5vd21pbmdjdmk6bnVtYmVyID0gR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5ub3dNaW5nQ2k7XG4gICAgICAgIHZhciBnZXRHb2xkOm51bWJlciA9IDA7XG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5omT5byA57uT566X55WM6Z2iKOWksei0pSlcIik7XG4gICAgICAgIHRoaXMuUmVjcm9wTGV2ZWxFbmQoIGZhbHNlICk7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ29tcGxldGVQYW5lbCxnZXRHb2xkICk7XG4gICAgfVxuICAgIHByaXZhdGUgZW5kZ2FtZUhhbmRsZXIoKTp2b2lkXG4gICAge1xuICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlJlY29yZFN0b3AoKTtcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKCAxMDAwLHRoaXMsdGhpcy5zdGFydEVuZFZpZXcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGFydEVuZFZpZXcoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgbm93bWluZ2N2aTpudW1iZXIgPSBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLm5vd01pbmdDaTtcbiAgICAgICAgdmFyIGdldEdvbGQ6bnVtYmVyID0gMDtcbiAgICAgICAgaWYoIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2UuZW5kR2FtZVBsYXllckFyci5sZW5ndGggPT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdldEdvbGQgPSB0aGlzLlJvbGVEYXRhLmxldmVsY2ZnLndpbkdvbGQ7XG4gICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuaJk+W8gOe7k+eul+eVjOmdoijmuLjmiI/og5zliKkpXCIpO1xuICAgICAgICAgICAgdGhpcy5SZWNyb3BMZXZlbEVuZCggdHJ1ZSApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKCB0aGlzLlJvbGVEYXRhLmxldmVsY2ZnLmZhaWxHb2QgKTtcbiAgICAgICAgICAgIGdldEdvbGQgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCBOdW1iZXIoYXJyWzBdKSxOdW1iZXIoYXJyWzFdKSApO1xuICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLmiZPlvIDnu5PnrpfnlYzpnaIo5ri45oiP5aSx6LSlKVwiKTtcbiAgICAgICAgICAgIHRoaXMuUmVjcm9wTGV2ZWxFbmQoIGZhbHNlICk7XG4gICAgICAgIH1cbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDb21wbGV0ZVBhbmVsLGdldEdvbGQgKTtcbiAgICAgICAgLy8gVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3LDIgKTtcbiAgICB9XG5cbiAgICBSZWNyb3BMZXZlbEVuZChfd2luOmJvb2xlYW4pXG4gICAge1xuICAgICAgICAvLyBpZighTGF5YS5Ccm93c2VyLm9uV2VpWGluKXJldHVybjtcbiAgICAgICAgLy8gdmFyIHN0YWdlaWQgPSB0aGlzLlJvbGVEYXRhLkxldmVsSUQudG9TdHJpbmcoKTtcbiAgICAgICAgLy8gdmFyIHVzZWlkID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5Vc2VJZDtcbiAgICAgICAgLy8gdmFyIHN0YWdlbmFtZSA9IFwi56ysXCIgKyB0aGlzLlJvbGVEYXRhLkxldmVsSUQgKyBcIuWFs1wiO1xuICAgICAgICAvLyBpZihfd2luKVxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICBXeEFwaS5sZXZlbFN1Y2Nlc3Moc3RhZ2VpZCxzdGFnZW5hbWUsc3RhZ2VpZCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gZWxzZVxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICB2YXIgZXF1aXBpZCA9IHRoaXMuUm9sZURhdGEuQ2hhcmFjdGVySUQudG9TdHJpbmcoKTtcbiAgICAgICAgLy8gICAgIHZhciBjYXJuYW1lID0gdGhpcy5Sb2xlRGF0YS5yb2xlQ2ZnLm5hbWU7XG4gICAgICAgIC8vICAgICBXeEFwaS5sZXZlbEZhaWwoc3RhZ2VpZCxzdGFnZW5hbWUsc3RhZ2VpZCxcIjBcIixjYXJuYW1lKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXR1cm5tYWludmlldyh3aW4/KTp2b2lkXG4gICAge1xuICAgICAgICBpZiAod2luICYmIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuV2hpdGVVc2VyKSB7XG4gICAgICAgICAgICBsZXQgcmFuID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6K+v6Kem5Yeg546H5Li6LS0tXCIsIHJhbik7XG4gICAgICAgICAgICBpZiAocmFuIDw9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuRW5kQ2hlYXQpIHtcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoR2lmdFZpZXcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgR2FtZVN0YXRlLmZ1aHVvY2lzaHUgPSAxO1xuICAgICAgICAgICAgR2FtZVN0YXRlLnJlY29yZHNjcmVlID0gZmFsc2U7XG4gICAgICAgICAgICBHYW1lU3RhdGUuaXNkaWUgPSBmYWxzZTtcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLkluc3RhbmNlLkNsb3NlR2FtZU92ZXJFZmZlY3QoKTtcbiAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKENvbXBsZXRlUGFuZWwpO1xuICAgICAgICAgICAgdGhpcy5EaXNUcmlnZ2VyKEdhbWVTdGF0ZS5yZXR1cm5NYWluVmlldyk7XG4gICAgICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuU2hvd1RoZUdhbWVTY2VuZSgpO1xuICAgICAgICAgICAgdmFyIGFnZW5jeXRyaWFsOiBBZ2VuY3lUcmlhbCA9IHRoaXMuZ2V0U2luZ2xlVG9uKEFnZW5jeVRyaWFsKTtcbiAgICAgICAgICAgIGlmIChhZ2VuY3l0cmlhbC5pc3NoaXlvbmdpbmcpICB7XG4gICAgICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLkNyZWF0ZVBsYXllcih0aGlzLlJvbGVEYXRhLnJvbGVDZmcpO1xuICAgICAgICAgICAgICAgIGFnZW5jeXRyaWFsLmlzc2hpeW9uZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBHYW1lU3RhdGUuZnVodW9jaXNodSA9IDE7XG4gICAgICAgICAgICBHYW1lU3RhdGUucmVjb3Jkc2NyZWUgPSBmYWxzZTtcbiAgICAgICAgICAgIEdhbWVTdGF0ZS5pc2RpZSA9IGZhbHNlO1xuICAgICAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuQ2xvc2VHYW1lT3ZlckVmZmVjdCgpO1xuICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoQ29tcGxldGVQYW5lbCk7XG4gICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoR2FtZVN0YXRlLnJldHVybk1haW5WaWV3KTtcbiAgICAgICAgICAgIFNjZW5lQ29udHJvbC5JbnN0YW5jZS5TaG93VGhlR2FtZVNjZW5lKCk7XG4gICAgICAgICAgICB2YXIgYWdlbmN5dHJpYWw6IEFnZW5jeVRyaWFsID0gdGhpcy5nZXRTaW5nbGVUb24oQWdlbmN5VHJpYWwpO1xuICAgICAgICAgICAgaWYgKGFnZW5jeXRyaWFsLmlzc2hpeW9uZ2luZykgIHtcbiAgICAgICAgICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuQ3JlYXRlUGxheWVyKHRoaXMuUm9sZURhdGEucm9sZUNmZyk7XG4gICAgICAgICAgICAgICAgYWdlbmN5dHJpYWwuaXNzaGl5b25naW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy/miZPlvIDlpb3lj4vpgoDor7fnlYzpnaJcbiAgICAgICAgLy8gVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKEZyaWVuZEludml0ZVZpZXcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGFydEdhbWUoKTp2b2lkXG4gICAge1xuICAgICAgICBBZ2VuY3lJbkdhbWUuZ2FtZW51bSArKztcbiAgICAgICAgdmFyIHN0YWdlaWQgPSB0aGlzLlJvbGVEYXRhLmdldE5vd1NlcnZlckxldmVsKCkudG9TdHJpbmcoKS50b1N0cmluZygpO1xuICAgICAgICB2YXIgc3RhZ2VuYW1lID0gXCLnrKxcIiArIHN0YWdlaWQgKyBcIuWFs1wiO1xuICAgICAgICB2YXIgdXNlaWQgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLlVzZUlkO1xuICAgICAgICBXeEFwaS5sZXZlbFN0YXJ0KHN0YWdlaWQsc3RhZ2VuYW1lLHVzZWlkKTtcbiAgICAgICAgR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5zdGFydEdhbWUoKTtcbiAgICB9XG4gICBcbn0iLCJpbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQge0xvYWRpbmdQYW5lbH0gZnJvbSBcIi4uL1ZpZXcvTG9hZGluZ1BhbmVsXCI7XG5cbmltcG9ydCB7QWdlbmN5VXNlck1lc3NhZ2V9IGZyb20gXCIuL0FnZW5jeVVzZXJNZXNzYWdlXCI7XG5pbXBvcnQge1dFQ0hBVEVWRU5UfSBmcm9tIFwiLi4vV1hTREsvV0VDSEFURVZFTlRcIjtcbmltcG9ydCB7QWdlbmN5QmFzZUNvbnRyb2x9IGZyb20gXCIuL0FnZW5jeUJhc2VDb250cm9sXCI7XG5pbXBvcnQge0FnZW5jeU1haW59IGZyb20gXCIuL0FnZW5jeU1haW5cIjtcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi9DRkcvUm9sZUNGR1wiO1xuaW1wb3J0IExldmVsQ0ZHIGZyb20gXCIuLi9DRkcvTGV2ZWxDRkdcIjtcbmltcG9ydCBCdWlsZENGRyBmcm9tIFwiLi4vQ0ZHL0J1aWxkQ0ZHXCI7XG5pbXBvcnQgTnBjQ0ZHIGZyb20gXCIuLi9DRkcvTnBjQ0ZHXCI7XG5pbXBvcnQgR2FtZUNGRyBmcm9tIFwiLi4vQ0ZHL0dhbWVDRkdcIjtcbmltcG9ydCB7QWdlbmN5U2tpbn0gZnJvbSBcIi4vQWdlbmN5U2tpblwiO1xuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi4vV1hTREsvU2RrXCI7XG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyIH0gZnJvbSBcIi4uL1dYU0RLL05ldHdvcmtNYW5hZ2VyXCI7XG5pbXBvcnQgeyBNYWluQ29uZmlnIH0gZnJvbSBcIi4uL01haW5Db25maWdcIjtcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcbmltcG9ydCBMb3R0ZXJ5Q0ZHIGZyb20gXCIuLi9DRkcvTG90dGVyeUNGR1wiO1xuaW1wb3J0IHtBZ2VuY3lMb3R0ZXJ5fSBmcm9tIFwiLi9BZ2VuY3lMb3R0ZXJ5XCI7XG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xuaW1wb3J0IHsgU2hhcmVVdGlsIH0gZnJvbSBcIi4uL1dYU0RLL1NoYXJlVXRpbFwiO1xuaW1wb3J0IHsgR3VhbmdHYW8gfSBmcm9tIFwiLi4vV1hTREsvR3VhbmdHYW9cIjtcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vV1hTREsvdHRhZFwiO1xuXG5leHBvcnQgY2xhc3MgQWdlbmN5TG9naW4gZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbCBcbntcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5TG9naW5cIjtcbiAgICBcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxuICAgIFxuICAgIHByb3RlY3RlZCBpbml0U2VsZigpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuRGlzT24oIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2xvZ2luU3VjY2VlZCx0aGlzLHRoaXMuU3VjY2VzcyApO1xuICAgIH1cblxuICAgIHB1YmxpYyBMb2dpbigpOnZvaWRcbiAgICB7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggTG9hZGluZ1BhbmVsICk7XG4gICAgICAgIHRoaXMubG9naW5wcm9ncmVzcygwKTtcbiAgICAgICAgLy8gaWYoTGF5YS5Ccm93c2VyLm9uV2VpWGluKVxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICB0aGlzLkxvZ2luV1goKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBlbHNlXG4gICAgICAgIC8vIHtcbiAgICAgICAgICAgIHRoaXMuTG9naW5Mb2NhbCgpO1xuICAgICAgICAvLyB9XG4gICAgfVxuICAgIExvZ2luV1goKVxuICAgIHtcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLlvIDlp4vlvq7kv6HnmbvlvZVcIik7XG4gICAgICAgIFd4QXBpLldYTG9naW4oKHJlcykgPT4gXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBcImVycm9yXCIpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLlvq7kv6HnmbvlvZXmiJDlip9cIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaHBsb2dpbjpcIiArIFwicXVlcnljaGFubmVsLT5cIisgV3hBcGkucXVlcnljaGFubmVsICsgXCIgcmVmZXJyZXJJbmZvYXBwSWQtPlwiICsgV3hBcGkucmVmZXJyZXJJbmZvYXBwSWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkxvZ2luTG9jYWwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5b6u5L+h55m75b2V5aSx6LSlXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkxvZ2luV1goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBMb2dpbkxvY2FsKHJlcyA9IG51bGwpIFxuICAgIHtcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLlvIDlp4vmnKzlnLDnmbvlvZVcIik7XG4gICAgICAgIGlmKHJlcylcbiAgICAgICAge1xuICAgICAgICAgICAgbmV3IFBsYXllckFjY291bnQocmVzLmNvZGUsIFwiXCIsIFwiXCIsIDAsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFd4QXBpLnNoYXJlT3BlbklkLCBXeEFwaS5zaGFyZU9wZW5JZCxHbG9iYWwuZ2FtZVZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIE5ldHdvcmtNYW5hZ2VyLkluc3RhbmNlLmxvZ2luKG51bGwsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5Mb2dpbkNvbXBsZXRlKSwgbnVsbCk7XG4gICAgICAgIC8vdGhpcy5Mb2FkU2JwKCk7XG4gICAgfVxuXG4gICAgTG9naW5Db21wbGV0ZSgpIFxuICAgIHtcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLmnKzlnLDmnI3liqHlmajnmbvlvZXlrozmiJAuLi5cIik7XG4gICAgICAgIFxuICAgICAgICAvLyBTaGFyZVV0aWwuSW5zdGFuY2Uub25SZWdpc3RlcigpO1xuICAgICAgICAvLyBHdWFuZ0dhby5Jbml0VmlkZW8oKTtcbiAgICAgICAgV3hBcGkuYWxkU2VuZE9wZW5pZChQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLm9wZW5pZCk7XG4gICAgICAgIHRoaXMuU3VjY2VzcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9naW5wcm9ncmVzcyggdmFsdWU6bnVtYmVyICk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGxvYWRpbmdQYW5lbDpMb2FkaW5nUGFuZWwgPSBWaWV3TWFuYWdlci5JbnN0YW5jZS5nZXRWaWV3KCBMb2FkaW5nUGFuZWwgKTtcbiAgICAgICAgaWYoIGxvYWRpbmdQYW5lbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxvYWRpbmdQYW5lbC5zaG93V29yZCggdmFsdWUgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgU3VjY2VzcygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuUmVzb2x2ZURhdGEoICk7XG4gICAgICAgIHRoaXMuaW5pdERhdGEoKTtcbiAgICAgICAgdGhpcy5TdGFydE1haW4oKTtcbiAgICAgICAgdHRhZC5Jbml0QUQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIFN0YXJ0TWFpbigpOnZvaWRcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKCBcIuW9k+WJjemFjee9ruihqOaAu+WFs+WNoe+8mlwiLExldmVsQ0ZHLnZlYy5sZW5ndGggKTtcbiAgICAgICAgXG4gICAgICAgICggdGhpcy5nZXRTaW5nbGVUb24oIEFnZW5jeU1haW4gKSBhcyBBZ2VuY3lNYWluICkuU3RhcnRNYWluKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25maWdDbGFzczphbnkgPVxuICAgIHtcbiAgICAgICAgUm9sZUNGRzpSb2xlQ0ZHLFxuICAgICAgICBMZXZlbENGRzpMZXZlbENGRyxcbiAgICAgICAgQnVpbGRDRkc6QnVpbGRDRkcsXG4gICAgICAgIE5wY0NGRzpOcGNDRkcsXG4gICAgICAgIEdhbWVDRkc6R2FtZUNGRyxcbiAgICAgICAgTG90dGVyeUNGRzpMb3R0ZXJ5Q0ZHXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Kej5p6Q6YWN572u5pWw5o2uXG4gICAgICovXG4gICAgcHJpdmF0ZSBSZXNvbHZlRGF0YSgpOmJvb2xlYW4gXG4gICAge1xuICAgICAgICBsZXQgYnl0ZURhdGE6YW55ID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5ub3dDb25maWcuZ2FtZUNvbmZpZ1swXS5jb25maWc7XG4gICAgICAgIGlmKCBieXRlRGF0YSAmJiBieXRlRGF0YSAhPSBcIlwiIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gYnl0ZURhdGEuc3BsaXQoXCIlZmlsZSVcIik7XG4gICAgICAgICAgICB2YXIgaTpudW1iZXI7XG4gICAgICAgICAgICB2YXIgbnVtczpudW1iZXIgPSBhcnIubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKCBpPTA7aTxudW1zO2krKyApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1hcnI6QXJyYXk8c3RyaW5nPiA9IGFycltpXS5zcGxpdChcIiVjZmclXCIpO1xuICAgICAgICAgICAgICAgIHZhciBjbGE6IGFueSA9IEFnZW5jeUxvZ2luLmNvbmZpZ0NsYXNzW2l0ZW1hcnJbMF1dO1xuICAgICAgICAgICAgICAgIGlmIChjbGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhLmluaXRDZmcoaXRlbWFyclsxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yid5aeL5YyW5ri45oiP5pWw5o2uXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbml0RGF0YSgpOnZvaWRcbiAgICB7XG4gICAgICAgICggdGhpcy5nZXRTaW5nbGVUb24oIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5pbml0KCk7XG4gICAgICAgICggdGhpcy5nZXRTaW5nbGVUb24oIEFnZW5jeVNraW4gKSBhcyBBZ2VuY3lTa2luICkuaW5pdCgpO1xuICAgICAgICAoIHRoaXMuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lMb3R0ZXJ5ICkgYXMgQWdlbmN5TG90dGVyeSApLmluaXQoKTtcbiAgICB9XG5cbiAgIFxufSIsImltcG9ydCB7QWdlbmN5QmFzZUNvbnRyb2x9IGZyb20gXCIuL0FnZW5jeUJhc2VDb250cm9sXCI7XG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQge0xvdHRlcnlQYW5lbH0gZnJvbSBcIi4uL1ZpZXcvTG90dGVyeVBhbmVsXCI7XG5pbXBvcnQgTG90dGVyeUNGRyBmcm9tIFwiLi4vQ0ZHL0xvdHRlcnlDRkdcIjtcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi9DRkcvUm9sZUNGR1wiO1xuaW1wb3J0IHtBZ2VuY3lTa2lufSBmcm9tIFwiLi9BZ2VuY3lTa2luXCI7XG5cbmV4cG9ydCAgY2xhc3MgQWdlbmN5TG90dGVyeSBleHRlbmRzIEFnZW5jeUJhc2VDb250cm9sIFxue1xuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJBZ2VuY3lMb3R0ZXJ5XCI7XG4gICAgXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cbiAgICBcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWRcbiAgICB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgb3BlblZpZXcoKTp2b2lkXG4gICAge1xuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIExvdHRlcnlQYW5lbCApO1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBbmltYXRpb24oKTogdm9pZCB7XG4gICAgICAgIHZhciBhbmk6TGF5YS5BbmltYXRpb24gPSBuZXcgTGF5YS5BbmltYXRpb24oKTtcbiAgICAgICAgLy8gYW5pLmxvYWRBdGxhcyh0aGlzLkFuaUNvbmZQYXRoKTsgLy8g5Yqg6L295Zu+6ZuG5Yqo55S7XG4gICAgICAgIGFuaS5pbnRlcnZhbCA9IDMwOyAvLyDorr7nva7mkq3mlL7pl7TpmpTvvIjljZXkvY3vvJrmr6vnp5LvvIlcbiAgICAgICAgYW5pLmluZGV4ID0gMTsgLy8g5b2T5YmN5pKt5pS+57Si5byVXG4gICAgICAgIGFuaS5wbGF5KCk7IC8vIOaSreaUvuWbvumbhuWKqOeUu1xuXG4gICAgICAgIC8vIOiOt+WPluWKqOeUu+eahOi+ueeVjOS/oeaBr1xuICAgICAgICB2YXIgYm91bmRzOkxheWEuUmVjdGFuZ2xlID0gYW5pLmdldEdyYXBoaWNCb3VuZHMoKTtcbiAgICAgICAgYW5pLnBpdm90KGJvdW5kcy53aWR0aCAvIDIsIGJvdW5kcy5oZWlnaHQgLyAyKTtcblxuICAgICAgICBhbmkucG9zKExheWEuc3RhZ2Uud2lkdGggLyAyLCBMYXlhLnN0YWdlLmhlaWdodCAvIDIpO1xuXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoYW5pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1BbmlQYXRoOnN0cmluZztcbiAgICBwcml2YXRlIG1TdGFydFg6bnVtYmVyID0gNDAwO1xuICAgIHByaXZhdGUgbVN0YXJ0WTpudW1iZXIgPSA1MDA7XG4gICAgcHJpdmF0ZSBtRmFjdG9yeTpMYXlhLlRlbXBsZXQ7XG4gICAgcHJpdmF0ZSBtQWN0aW9uSW5kZXg6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIG1DdXJySW5kZXg6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIG1Bcm1hdHVyZTpMYXlhLlNrZWxldG9uO1xuICAgIHByaXZhdGUgbUN1cnJTa2luSW5kZXg6bnVtYmVyID0gMDtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5cbiAgICBwdWJsaWMgZ2V0cmV3YXJkKCBjZmc6TG90dGVyeUNGRyApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBjZmcgKVxuICAgICAgICB7XG4gICAgICAgICAgICBzd2l0Y2goIGNmZy50eXBlIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUm9sZURhdGEuTW9uZXkgKz0gTnVtYmVyKGNmZy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi5oGt5Zac6I635b6XXCIgKyBjZmcudmFsdWUgKyBcIumHkeW4ge+8gVwiICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICB2YXIgcm9sZWNmZzpSb2xlQ0ZHID0gUm9sZUNGRy5kaWN0WyBjZmcudmFsdWUgXTtcbiAgICAgICAgICAgICAgICAgICAgKCB0aGlzLmdldFNpbmdsZVRvbiggQWdlbmN5U2tpbiApIGFzIEFnZW5jeVNraW4gKS5zZXRSb2xlU3RhdGUoIHJvbGVjZmcsMSApO1xuICAgICAgICAgICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuaBreWWnOiOt+W+l+inkuiJslwiICsgcm9sZWNmZy5yb2xlbmFtZSApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgR2V0UmV3YXJkKCk6bnVtYmVyXG4gICAge1xuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcbiAgICAgICAgdmFyIGRpY3RzOkFycmF5PExvdHRlcnlDRkc+ID0gTG90dGVyeUNGRy52ZWM7XG4gICAgICAgIHZhciBtYXhOdW06bnVtYmVyID0gMDtcbiAgICAgICAgdmFyIGNmZzpMb3R0ZXJ5Q0ZHO1xuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xuICAgICAgICBmb3IoIGk9MDtpPGRpY3RzLmxlbmd0aDtpKysgKVxuICAgICAgICB7XG4gICAgICAgICAgICBjZmcgPSBkaWN0c1tpXTtcbiAgICAgICAgICAgIG1heE51bSArPSBjZmcud2VpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBzb3JkdmFsdWU6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMSxtYXhOdW0gKTtcbiAgICAgICAgdmFyIHRvdGFsbnVtOm51bWJlciA9IDA7XG4gICAgICAgIGZvciggaSA9IDA7aSA8IGRpY3RzLmxlbmd0aDtpKysgKVxuICAgICAgICB7XG4gICAgICAgICAgICBjZmcgPSBkaWN0c1tpXTtcbiAgICAgICAgICAgIHRvdGFsbnVtICs9IGNmZy53ZWlnaHQ7XG4gICAgICAgICAgICBpZiggdG90YWxudW0gPj0gc29yZHZhbHVlIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHVibGljIHN0YXJ0RnVuKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5tQW5pUGF0aCA9IFwicmVzL3NwaW5lL3NwaW5lUmVzMS9kcmFnb24uc2tcIjtcbiAgICAgICAgLy8gdGhpcy5tRmFjdG9yeSA9IG5ldyBUZW1wbGV0KCk7XG4gICAgICAgIC8vIHRoaXMubUZhY3Rvcnkub24oRXZlbnQuQ09NUExFVEUsIHRoaXMsIHRoaXMucGFyc2VDb21wbGV0ZSk7XG4gICAgICAgIC8vIHRoaXMubUZhY3Rvcnkub24oRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMub25FcnJvcik7XG4gICAgICAgIC8vIHRoaXMubUZhY3RvcnkubG9hZEFuaSh0aGlzLm1BbmlQYXRoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBvbkVycm9yKCk6dm9pZFxuICAgIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvclwiKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBwYXJzZUNvbXBsZXRlKCk6dm9pZCB7XG4gICAgICAgIC8v5Yib5bu65qih5byP5Li6Me+8jOWPr+S7peWQr+eUqOaNouijhVxuICAgICAgICB0aGlzLm1Bcm1hdHVyZSA9dGhpcy5tRmFjdG9yeS5idWlsZEFybWF0dXJlKDEpO1xuICAgICAgICB0aGlzLm1Bcm1hdHVyZS54ID0gdGhpcy5tU3RhcnRYO1xuICAgICAgICB0aGlzLm1Bcm1hdHVyZS55ID0gdGhpcy5tU3RhcnRZO1xuICAgICAgICB0aGlzLm1Bcm1hdHVyZS5zY2FsZSgwLjUsIDAuNSk7XG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5tQXJtYXR1cmUpO1xuICAgICAgICAvLyB0aGlzLm1Bcm1hdHVyZS5vbihFdmVudC5TVE9QUEVELCB0aGlzLCB0aGlzLmNvbXBsZXRlSGFuZGxlcik7XG4gICAgICAgIHRoaXMucGxheSgpO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIGNvbXBsZXRlSGFuZGxlcigpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMucGxheSgpO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIHBsYXkoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLm1DdXJySW5kZXgrKztcbiAgICAgICAgaWYgKHRoaXMubUN1cnJJbmRleCA+PSB0aGlzLm1Bcm1hdHVyZS5nZXRBbmltTnVtKCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubUN1cnJJbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tQXJtYXR1cmUucGxheSh0aGlzLm1DdXJySW5kZXgsZmFsc2UpO1xuICAgIH1cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbn0iLCJpbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xuaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1Jlc291cmNlQ29udHJvbFwiO1xuaW1wb3J0IHtMb2FkaW5nUGFuZWx9IGZyb20gXCIuLi9WaWV3L0xvYWRpbmdQYW5lbFwiO1xuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xuaW1wb3J0IHtSZXNEYXRhQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUmVzRGF0YUNvbnRyb2xcIjtcbmltcG9ydCB7TWFpblBhbmVsfSBmcm9tIFwiLi4vVmlldy9NYWluUGFuZWxcIjtcbmltcG9ydCB7U2NlbmVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9TY2VuZUNvbnRyb2xcIjtcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XG5pbXBvcnQge0dhbWVTdGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XG5pbXBvcnQge1dYR2FtZVBsYXRmb3JtfSBmcm9tIFwiLi4vV1hTREsvV1hHYW1lUGxhdGZvcm1cIjtcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi9DRkcvUm9sZUNGR1wiO1xuaW1wb3J0IE5wY0NGRyBmcm9tIFwiLi4vQ0ZHL05wY0NGR1wiO1xuaW1wb3J0IHtMb2NhbERhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9Mb2NhbERhdGFDb250cm9sXCI7XG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50LCBBY2NvdW50VXNlciB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlciwgUFJPVE9DT0xTIH0gZnJvbSBcIi4uL1dYU0RLL05ldHdvcmtNYW5hZ2VyXCI7XG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcbmltcG9ydCBHaWZ0VmlldyBmcm9tIFwiLi4vVmlldy9HaWZ0Vmlld1wiO1xuXG5leHBvcnQgY2xhc3MgQWdlbmN5TWFpbiBleHRlbmRzIEFnZW5jeUJhc2VDb250cm9sIFxue1xuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJBZ2VuY3lNYWluXCI7XG4gICAgXG4gICAgcHJpdmF0ZSBfbG9hZGpkOm51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBfYWxsamQ6bnVtYmVyID0gMDtcbiAgICBcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxuICAgIFxuICAgIHByb3RlY3RlZCBpbml0U2VsZigpOnZvaWRcbiAgICB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgU3RhcnRNYWluKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5fbG9hZGpkID0gMDtcbiAgICAgICAgdGhpcy5fYWxsamQgPSAyMDtcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UubG9hZFN1YnBhY2thZ2UoIFwic3VicGFja2FnZVwiLHRoaXMsdGhpcy5zdWIxY29tcGxldGUsdGhpcy5sb2FkcHJvZ3Jlc3MsbnVsbCApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3ViMWNvbXBsZXRlKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5fbG9hZGpkID0gMjA7XG4gICAgICAgIHRoaXMuX2FsbGpkID0gMzA7XG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmxvYWRTdWJwYWNrYWdlKCBcInN1YnBhY2thZ2UxXCIsdGhpcyx0aGlzLlN1YnBhY2thZ2VPdmVyLHRoaXMubG9hZHByb2dyZXNzLG51bGwgKTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHNjZW5lOkxheWEuU2NlbmUzRDtcbiAgICBwdWJsaWMgb25Db21wbGV0ZSgpIHtcblx0XHQvL+a3u+WKoOeItue6p+eMtOWtkFxuXHRcdHZhciBkdWRlID0gdGhpcy5zY2VuZS5hZGRDaGlsZChMYXlhLkxvYWRlci5nZXRSZXMoXCJyZXMvdGhyZWVEaW1lbi9za2luTW9kZWwvZHVkZS9kdWRlLmxoXCIpKSBhcyBMYXlhLlNwcml0ZTNEO1xuXHRcdC8v57yp5pS+XG5cdFx0dmFyIHNjYWxlID0gbmV3IExheWEuVmVjdG9yMygwLjEsIDAuMSwgMC4xKTtcblx0XHRkdWRlLnRyYW5zZm9ybS5sb2NhbFNjYWxlID0gc2NhbGU7XG5cdFx0ZHVkZS50cmFuc2Zvcm0ucm90YXRlKG5ldyBMYXlhLlZlY3RvcjMoIDAsIDMuMTQsIDApKTtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXHRcblxuICAgIHByaXZhdGUgU3VicGFja2FnZU92ZXIoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9sb2FkamQgPSA1MDtcbiAgICAgICAgdGhpcy5fYWxsamQgPSA0MDtcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xuICAgICAgICB2YXIgdXJsQXJyOkFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcInN0YXJ0cGFuZWxcIiApICk7XG4gICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJlbmRwYW5lbFwiICkgKTtcbiAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcInNwZWVkdXBlZmZlY3RcIiApICk7XG4gICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJjb2xvcl93aGl0ZVwiICkgKTtcbiAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcImNvbG9yX3llbGxvd1wiICkgKTtcbiAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcIndpbmxpbmVcIiApICk7XG4gICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJmaXJld29ya3NcIiApICk7XG4gICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJEaXJlY3Rpb25hbExpZ2h0XCIgKSApO1xuICAgICAgICAvLyB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNETW9kZWwoIFwiZGlzdGFudHZpZXdcIiApICk7XG4gICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoIHRoaXMuUm9sZURhdGEucm9sZUNmZy5uYW1lICkgKTtcbiAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggXCJBcnJvd1wiICkgKTtcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gdGhpcy5Sb2xlRGF0YS5sZXZlbG1hcEFycjtcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcbiAgICAgICAgZm9yKCBpID0gMDtpIDwgYXJyLmxlbmd0aDtpKysgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggdXJsQXJyLmluZGV4T2YoIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBhcnJbaV0gKSApID09IC0xIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNETW9kZWwoIGFycltpXSApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbnBjQXJyOkFycmF5PGFueT4gPSB0aGlzLlJvbGVEYXRhLmxldmVsY2ZnLm5wYztcbiAgICAgICAgZm9yKCBpID0gMDtpIDwgbnBjQXJyLmxlbmd0aDtpKysgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggdXJsQXJyLmluZGV4T2YoIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggTnBjQ0ZHLmRpY3RbIG5wY0FycltpXS5pZCBdLm5hbWUgKSApID09IC0xIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBOcGNDRkcuZGljdFsgbnBjQXJyW2ldLmlkIF0ubmFtZSApICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yKCBpID0gMDtpIDwgdXJsQXJyLmxlbmd0aDtpKysgKVxuICAgICAgICB7XG4gICAgICAgICAgICBwYXRoQXJyLnB1c2goIHsgdXJsOnVybEFycltpXSB9ICk7XG4gICAgICAgIH1cbiAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmxvYWRlcjNEQXJyKCBwYXRoQXJyLHRoaXMsdGhpcy5sb2FkM0Rjb21wbGV0ZSx0aGlzLmxvYWRwcm9ncmVzcyApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZDNEY29tcGxldGUoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9sb2FkamQgPSA5MDtcbiAgICAgICAgdGhpcy5fYWxsamQgPSAxMDtcbiAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmxvYWRHcm91cCggXCJtYWluXCIsdGhpcyx0aGlzLmxvYWRjb21wbGV0ZSx0aGlzLmxvYWRwcm9ncmVzcyxmYWxzZSApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZHByb2dyZXNzKCB2YWx1ZTpudW1iZXIgKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgbG9hZGluZ3BhbmVsOkxvYWRpbmdQYW5lbCA9IFZpZXdNYW5hZ2VyLkluc3RhbmNlLmdldFZpZXcoIExvYWRpbmdQYW5lbCApO1xuICAgICAgICBpZiggbG9hZGluZ3BhbmVsIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9sb2FkamQgKyBNYXRoLmNlaWwoIHZhbHVlLzEwMCp0aGlzLl9hbGxqZCApO1xuICAgICAgICAgICAgbG9hZGluZ3BhbmVsLnNob3dXb3JkKCB2YWx1ZSApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkY29tcGxldGUoKTp2b2lkXG4gICAge1xuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5idXR0b25Tb3VuZCA9IFwidWk6Ly9sZWN4eW5oMml6OXkyNlwiO1xuICAgICAgICBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmluaXQoKTtcbiAgICAgICAgUmVzRGF0YUNvbnRyb2wuSW5zdGFuY2UuQWRkVmlld1BhY2tCeU5hbWUoIFwibWFpblwiICk7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBMb2FkaW5nUGFuZWwgKTtcbiAgICAgICAgLy8gRllIRF9TZGsuSW5pdFNkaygpO1xuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIE1haW5QYW5lbCApO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuaWsOeUqOaIt0ZZSERfU2RrLmlzbmV3dXNlci0tLVwiLEZZSERfU2RrLmlzbmV3dXNlcik7XG5cbiAgICAgICAgbGV0IG5ld3VzZXIgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNfbmV3dXNlclwiKTtcbiAgICAgICAgaWYoRllIRF9TZGsuaXNuZXd1c2VyKXtcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSg1MDAsdGhpcywoKT0+e1xuICAgICAgICAgICAgICAgIGlmKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuV2hpdGVVc2VyKXtcbiAgICAgICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKEdpZnRWaWV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaXNfbmV3dXNlclwiLFwiMVwiKTtcbiAgICAgICAgfVxuICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuU2V0U2NlbmUoKTtcbiAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuSW5pdEVmZmVjdCgpO1xuICAgIH1cbn0iLCJpbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xuaW1wb3J0IHtMb2NhbERhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9Mb2NhbERhdGFDb250cm9sXCI7XG5pbXBvcnQge1VzZXJEYXRhSW5mb30gZnJvbSBcIi4uL0RhdGEvVXNlckRhdGFJbmZvXCI7XG5pbXBvcnQge1NraW5EYXRhfSBmcm9tIFwiLi4vRGF0YS9Ta2luRGF0YVwiO1xuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQge1NraW5QYW5lbH0gZnJvbSBcIi4uL1ZpZXcvU2tpblBhbmVsXCI7XG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xuaW1wb3J0IHsgTmV0d29ya01hbmFnZXIsIFBST1RPQ09MUyB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4vQWdlbmN5VXNlck1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEFnZW5jeVNraW4gZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbCBcbntcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5U2tpblwiO1xuICAgIFxuICAgIGxvY2FsZGF0YTphbnk7XG4gICAgcGlmdUFycjpBcnJheTxTa2luRGF0YT47XG4gICAgcGlmdURpY3Q6YW55O1xuXG4gICAgY29uc3RydWN0b3IoKSBcbiAgICB7IFxuICAgICAgICBzdXBlcigpOyBcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5pdFNlbGYoKTp2b2lkXG4gICAge1xuXG4gICAgfVxuXG4gICAgcHVibGljIGluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmxvY2FsZGF0YSA9IExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuR2V0TG9jYWxDYUNoZURhdGEoIFVzZXJEYXRhSW5mby5za2luICk7XG4gICAgICAgIHZhciBwaWZ1RGF0YTphbnk7XG4gICAgICAgIGlmKCAhdGhpcy5sb2NhbGRhdGEuaGFzT3duUHJvcGVydHkoIFwicGlmdVwiICkgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZGF0YVtcInBpZnVcIl0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBwaWZ1RGF0YSA9IHRoaXMubG9jYWxkYXRhW1wicGlmdVwiXTtcbiAgICAgICAgdGhpcy5waWZ1QXJyID0gW107XG4gICAgICAgIHRoaXMucGlmdURpY3QgPSB7fTtcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcbiAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gUm9sZUNGRy52ZWMubGVuZ3RoO1xuICAgICAgICBmb3IoIGkgPSAwO2kgPCBudW1zO2krKyApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwaWZ1dm86U2tpbkRhdGEgPSBuZXcgU2tpbkRhdGE7XG4gICAgICAgICAgICB2YXIgY2ZnOlJvbGVDRkcgPSBSb2xlQ0ZHLnZlY1tpXTtcbiAgICAgICAgICAgIHBpZnV2by5yb2xlQ0ZHID0gY2ZnO1xuICAgICAgICAgICAgdmFyIGQ6YW55ID0gcGlmdURhdGFbIGNmZy5pZCBdO1xuICAgICAgICAgICAgaWYoIGQgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBpZnV2by5zdGF0ZSA9IE51bWJlciggZC5zdGF0ZSApO1xuICAgICAgICAgICAgICAgIHBpZnV2by5oYXNudW0gPSBOdW1iZXIoIGQuaGFzbnVtICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICBwaWZ1dm8uaGFzbnVtID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCBjZmcuZ2V0U3RhdGUgPT0gMCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGlmdUFyci5wdXNoKCBwaWZ1dm8gKTtcbiAgICAgICAgICAgIHRoaXMucGlmdURpY3RbIHBpZnV2by5yb2xlQ0ZHLmlkIF0gPSBwaWZ1dm87XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHB1YmxpYyBvcGVudmlldygpOnZvaWRcbiAgICB7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggU2tpblBhbmVsICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFJvbGVTdGF0ZSggY2ZnOlJvbGVDRkcsdmFsdWU6bnVtYmVyICk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHBpZnV2bzpTa2luRGF0YSA9IHRoaXMucGlmdURpY3RbIGNmZy5pZCBdO1xuICAgICAgICBpZiggcGlmdXZvIClcbiAgICAgICAge1xuICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gMTtcbiAgICAgICAgICAgIHRoaXMuQWRkTG9jYWxTa2luRGF0YShwaWZ1dm8ucm9sZUNGRy5pZCxwaWZ1dm8uc3RhdGUscGlmdXZvLmhhc251bSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIEFkZExvY2FsU2tpbkRhdGEoIGlkOmFueSxzdGF0ZTpudW1iZXIsaGFzbnVtOm51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubG9jYWxkYXRhW1wicGlmdVwiXVtpZF0gPSB7fTtcbiAgICAgICAgdGhpcy5sb2NhbGRhdGFbXCJwaWZ1XCJdW2lkXVtcInN0YXRlXCJdID0gc3RhdGU7XG4gICAgICAgIHRoaXMubG9jYWxkYXRhW1wicGlmdVwiXVtpZF1bXCJoYXNudW1cIl0gPSBoYXNudW07XG4gICAgICAgIExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuQWRkRGF0YSggVXNlckRhdGFJbmZvLnNraW4sdGhpcy5sb2NhbGRhdGEgKTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSByZWN0OkxheWEuU3ByaXRlO1xuXG5cdFx0cHJpdmF0ZSBjcmVhdGVDYW50cmFsUmVjdCgpOiB2b2lkIHtcblx0XHRcdHRoaXMucmVjdCA9IG5ldyBMYXlhLlNwcml0ZSgpO1xuXHRcdFx0dGhpcy5yZWN0LmdyYXBoaWNzLmRyYXdSZWN0KC0xMDAsIC0xMDAsIDIwMCwgMjAwLCBcImdyYXlcIik7XG5cdFx0XHRMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMucmVjdCk7XG5cblx0XHRcdHRoaXMudXBkYXRlUmVjdFBvcygpO1xuXHRcdH1cblxuXHRcdHByaXZhdGUgdXBkYXRlUmVjdFBvcygpOiB2b2lkIHtcblx0XHRcdHRoaXMucmVjdC54ID0gTGF5YS5zdGFnZS53aWR0aCAvIDI7XG5cdFx0XHR0aGlzLnJlY3QueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC8gMjtcblx0XHR9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHVibGljIEdhaW5QaWZ1KCBfc2tpbml0ZW06U2tpbkRhdGEgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggX3NraW5pdGVtLnN0YXRlID09IDEgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLlJvbGVEYXRhLkNoYXJhY3RlcklEID0gX3NraW5pdGVtLnJvbGVDRkcuaWQ7XG4gICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoIEdhbWVTdGF0ZS51cGRhdGVTS2luVmlldyApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgc3dpdGNoKCBfc2tpbml0ZW0ucm9sZUNGRy5nZXRTdGF0ZSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOi8v6KeG6aKR6I635Y+WXG4gICAgICAgICAgICAgICAgX3NraW5pdGVtLmhhc251bSsrO1xuICAgICAgICAgICAgICAgICAgICBpZiggX3NraW5pdGVtLnJvbGVDRkcubmVlZCA8PSBfc2tpbml0ZW0uaGFzbnVtIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3NraW5pdGVtLnN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZExvY2FsU2tpbkRhdGEoX3NraW5pdGVtLnJvbGVDRkcuaWQsX3NraW5pdGVtLnN0YXRlLF9za2luaXRlbS5oYXNudW0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoIEdhbWVTdGF0ZS51cGRhdGVTS2luVmlldyApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjovL+mHkeW4gei0reS5sFxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5Sb2xlRGF0YS5Nb25leSA+PSBfc2tpbml0ZW0ucm9sZUNGRy5uZWVkIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Sb2xlRGF0YS5Nb25leSAtPSBfc2tpbml0ZW0ucm9sZUNGRy5uZWVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3NraW5pdGVtLnN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkTG9jYWxTa2luRGF0YShfc2tpbml0ZW0ucm9sZUNGRy5pZCxfc2tpbml0ZW0uc3RhdGUsX3NraW5pdGVtLmhhc251bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoIEdhbWVTdGF0ZS51cGRhdGVTS2luVmlldyApO1xuICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLotK3kubDmiJDlip9cIiApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyhcIumHkeW4geS4jei2s1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzovL+a0u+WKqOiOt+WPllxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgXG5cbiAgICBcbiAgICBwdWJsaWMgR2Fpbk5vSGF2ZVNraW4oKTpBcnJheTxTa2luRGF0YT5cbiAgICB7XG4gICAgICAgIHZhciBhcnI6QXJyYXk8U2tpbkRhdGE+ID0gW107XG4gICAgICAgIGZvciggdmFyIHMgaW4gdGhpcy5waWZ1RGljdCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCAodGhpcy5waWZ1RGljdFtzXSBhcyBTa2luRGF0YSkuc3RhdGUgPT0gMCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXJyLnB1c2goIHRoaXMucGlmdURpY3Rbc10gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cbn0iLCJpbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xuaW1wb3J0IHtTa2luRGF0YX0gZnJvbSBcIi4uL0RhdGEvU2tpbkRhdGFcIjtcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcbmltcG9ydCB7VHJpYWxQYW5lbH0gZnJvbSBcIi4uL1ZpZXcvVHJpYWxQYW5lbFwiO1xuaW1wb3J0IHtHYW1lU3RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9HYW1lU3RhdGVDb250cm9sXCI7XG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xuaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1Jlc291cmNlQ29udHJvbFwiO1xuaW1wb3J0IHtTY2VuZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xuaW1wb3J0IHsgQWdlbmN5SW5HYW1lIH0gZnJvbSBcIi4vQWdlbmN5SW5HYW1lXCI7XG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xuaW1wb3J0IEVnZ1ZpZXcgZnJvbSBcIi4uL1ZpZXcvRWdnUGFuZWxcIjtcbmltcG9ydCBFZ2dQYW5lbCBmcm9tIFwiLi4vVmlldy9FZ2dQYW5lbFwiO1xuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XG5cbmV4cG9ydCBjbGFzcyBBZ2VuY3lUcmlhbCBleHRlbmRzIEFnZW5jeUJhc2VDb250cm9sIFxue1xuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJBZ2VuY3lUcmlhbFwiO1xuXG4gICAgaXNzaGl5b25naW5nOmJvb2xlYW4gPSBmYWxzZTtcblxuICAgcHJpdmF0ZSBzcHJpdDpMYXlhLlNwcml0ZTtcbiAgICBcbiAgICBjb25zdHJ1Y3RvcigpIFxuICAgIHsgXG4gICAgICAgIHN1cGVyKCk7IFxuICAgIH1cblxuICAgIHB1YmxpYyBvcGVudmlldyggYXJyOkFycmF5PFNraW5EYXRhPiApOnZvaWRcbiAgICB7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggVHJpYWxQYW5lbCxhcnIgKTtcbiAgICB9XG5cbiAgICAvKirpgIDlh7rnlYzpnaIgKi9cbiAgICBwdWJsaWMgRXhpdFBhbmVsKCBfZGF0YTpTa2luRGF0YSApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuaXNzaGl5b25naW5nID0gX2RhdGEgPyB0cnVlOmZhbHNlO1xuICAgICAgICB0aGlzLl9zZWxlY3R2byA9IF9kYXRhO1xuICAgICAgICBpZiggX2RhdGEgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgdXJsQXJyOkFycmF5PGFueT4gPSBbXTtcbiAgICAgICAgICAgIHVybEFyci5wdXNoKCB7IHVybDpBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoIF9kYXRhLnJvbGVDRkcubmFtZSApfSApO1xuICAgICAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmxvYWRlcjNEQXJyKCB1cmxBcnIsdGhpcyx0aGlzLlNjZW5lQ3JlYXRlQ29tcGxldGUsbnVsbCx0cnVlICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBpZihBZ2VuY3lJbkdhbWUuZ2FtZW51bT4xKXtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZG9tID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgICAgICAgICBpZihQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLldoaXRlVXNlciAmJiAgcmFuZG9tPD0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5IaXRFZ2cpe1xuICAgICAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoRWdnUGFuZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmVudGVyZ2FtZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGVsc2V7XG4gICAgICAgICAgICAvLyAgICAgR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5lbnRlcmdhbWUoKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBUcmlhbFBhbmVsICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2VsZWN0dm86U2tpbkRhdGE7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTcHJpdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3ByaXQgPSBuZXcgTGF5YS5TcHJpdGUoKTtcbiAgICAgICAgdGhpcy5zcHJpdC5ncmFwaGljcy5kcmF3UmVjdCgwLCAwLCAyMDAsIDIwMCwgXCIjRDI2OTFFXCIpO1xuICAgICAgICB0aGlzLnNwcml0LnBpdm90KDEwMCwgMTAwKTtcblxuICAgICAgICB0aGlzLnNwcml0LnggPSBMYXlhLnN0YWdlLndpZHRoIC8gMjtcbiAgICAgICAgdGhpcy5zcHJpdC55ID0gTGF5YS5zdGFnZS5oZWlnaHQgLyAyO1xuXG4gICAgICAgIHRoaXMuc3ByaXQuc2l6ZSgyMDAsIDIwMCk7XG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5zcHJpdCk7XG5cbiAgICAgICAgLy8gdGhpcy5zcC5vbihJbnRlcmFjdGlvbl9DdXN0b21FdmVudC5ST1RBVEUsIHRoaXMsIHRoaXMub25Sb3RhdGUpOyAgICAvLyDkvqblkKzoh6rlrprkuYnnmoTkuovku7ZcbiAgICAgICAgLy8gdGhpcy5zcHJpdC5vbihFdmVudC5DTElDSywgdGhpcywgdGhpcy5vblNwcml0ZUNsaWNrKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU3ByaXRlQ2xpY2soZTogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdmFyIHJhbmRvbUFuZ2xlOiBudW1iZXIgPSBNYXRoLnJhbmRvbSgpICogMTgwO1xuICAgICAgICAvL+WPkemAgeiHquWumuS5ieS6i+S7tlxuICAgICAgICAvLyB0aGlzLnNwcml0LmV2ZW50KEludGVyYWN0aW9uX0N1c3RvbUV2ZW50LlJPVEFURSwgW3JhbmRvbUFuZ2xlXSk7XG4gICAgfVxuXG4gICAgLy8g6Kem5Y+R6Ieq5a6a5LmJ55qEcm90YXRl5LqL5Lu2XG4gICAgcHJpdmF0ZSBvblJvdGF0ZShuZXdBbmdsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIFR3ZWVuLnRvKHRoaXMuc3AsIHsgXCJyb3RhdGlvblwiOiBuZXdBbmdsZSB9LCAxMDAwLCBFYXNlLmVsYXN0aWNPdXQpO1xuICAgIH1cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHJpdmF0ZSBTY2VuZUNyZWF0ZUNvbXBsZXRlKCk6dm9pZFxuICAgIHtcbiAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLkNyZWF0ZVBsYXllcih0aGlzLl9zZWxlY3R2by5yb2xlQ0ZHKTtcbiAgICAgICAgaWYoQWdlbmN5SW5HYW1lLmdhbWVudW0+MSl7XG4gICAgICAgICAgICBpZihQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLldoaXRlVXNlcil7XG4gICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKEVnZ1BhbmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5lbnRlcmdhbWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5lbnRlcmdhbWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIGNyZWF0ZVRleHQoKTogdm9pZCB7XG4gICAgICAgIHZhciB0eHQ6IExheWEuVGV4dCA9IG5ldyBMYXlhLlRleHQoKTtcbiAgICAgICAgLy/nu5nmlofmnKznmoR0ZXh05bGe5oCn6LWL5YC8XG4gICAgICAgIHR4dC50ZXh0ID0gXCJMYXlhYm945piv5oCn6IO95pyA5by655qESFRNTDXlvJXmk47mioDmnK/mj5DkvpvllYbkuI7kvJjnp4DnmoTmuLjmiI/lj5HooYzllYbvvIzpnaLlkJFGbGFzaOW8gOWPkeiAheaPkOS+m0hUTUw15byA5Y+R5oqA5pyv5pa55qGI77yBXCI7XG4gICAgICAgIC8v6K6+572u5a695bqm77yM6auY5bqm6Ieq5Yqo5Yy56YWNXG4gICAgICAgIHR4dC53aWR0aCA9IDQwMDtcbiAgICAgICAgLy/oh6rliqjmjaLooYxcbiAgICAgICAgdHh0LndvcmRXcmFwID0gdHJ1ZTtcblxuICAgICAgICB0eHQuYWxpZ24gPSBcImNlbnRlclwiO1xuICAgICAgICB0eHQuZm9udFNpemUgPSA0MDtcbiAgICAgICAgdHh0LmZvbnQgPSBcIk1pY3Jvc29mdCBZYUhlaVwiO1xuICAgICAgICB0eHQuY29sb3IgPSBcIiNmZjAwMDBcIjtcbiAgICAgICAgdHh0LmJvbGQgPSB0cnVlO1xuICAgICAgICB0eHQubGVhZGluZyA9IDU7XG5cbiAgICAgICAgLy/orr7nva7mj4/ovrnlsZ7mgKdcbiAgICAgICAgdHh0LnN0cm9rZSA9IDI7XG4gICAgICAgIHR4dC5zdHJva2VDb2xvciA9IFwiI2ZmZmZmZlwiO1xuXG4gICAgICAgIHR4dC5ib3JkZXJDb2xvciA9IFwiIzAwZmYwMFwiXG5cbiAgICAgICAgdHh0LnggPSAoTGF5YS5zdGFnZS53aWR0aCAtIHR4dC50ZXh0V2lkdGgpIC8gMjtcbiAgICAgICAgdHh0LnkgPSAoTGF5YS5zdGFnZS5oZWlnaHQgLSB0eHQudGV4dEhlaWdodCkgLyAyO1xuXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodHh0KTtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cblxuICAgIFxuXG5cbiAgICBwcml2YXRlIGNyZWF0ZUlucHV0KCk6IHZvaWQge1xuICAgICAgICB2YXIgaW5wdXRUZXh0OkxheWEuSW5wdXQgPSBuZXcgTGF5YS5JbnB1dCgpO1xuXG4gICAgICAgIC8vIOenu+WKqOerr+i+k+WFpeaPkOekuuesplxuICAgICAgICBpbnB1dFRleHQucHJvbXB0ID0gXCJUeXBlIHNvbWUgd29yZC4uLlwiO1xuXG4gICAgICAgIC8v5aSa6KGM6L6T5YWlXG4gICAgICAgIGlucHV0VGV4dC5tdWx0aWxpbmUgPSB0cnVlO1xuICAgICAgICBpbnB1dFRleHQud29yZFdyYXAgPSB0cnVlO1xuXG4gICAgICAgIGlucHV0VGV4dC5zaXplKDM1MCwgMTAwKTtcbiAgICAgICAgaW5wdXRUZXh0LnggPSBMYXlhLnN0YWdlLndpZHRoIC0gaW5wdXRUZXh0LndpZHRoID4+IDE7XG4gICAgICAgIGlucHV0VGV4dC55ID0gTGF5YS5zdGFnZS5oZWlnaHQgLSBpbnB1dFRleHQuaGVpZ2h0ID4+IDE7XG4gICAgICAgIGlucHV0VGV4dC5wYWRkaW5nID0gWzIsIDIsIDIsIDJdO1xuXG4gICAgICAgIGlucHV0VGV4dC5iZ0NvbG9yID0gXCIjNjY2NjY2XCI7XG4gICAgICAgIGlucHV0VGV4dC5jb2xvciA9IFwiI2ZmZmZmZlwiO1xuICAgICAgICBpbnB1dFRleHQuZm9udFNpemUgPSAyMDtcblxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGlucHV0VGV4dCk7XG4gICAgfVxuIFxufSIsImltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcbmltcG9ydCB7IFRpbWVzVGFtcGVyIH0gZnJvbSBcIi4uL1RpbWUvVGltZXNUYW1wZXJcIjtcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcbmltcG9ydCB7V0VDSEFURVZFTlR9IGZyb20gXCIuLi9XWFNESy9XRUNIQVRFVkVOVFwiO1xuaW1wb3J0IHtBZ2VuY3lCYXNlQ29udHJvbH0gZnJvbSBcIi4vQWdlbmN5QmFzZUNvbnRyb2xcIjtcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XG5pbXBvcnQgTGV2ZWxDRkcgZnJvbSBcIi4uL0NGRy9MZXZlbENGR1wiO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xuaW1wb3J0IHsgTmV0d29ya01hbmFnZXIsIFBST1RPQ09MUyB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xuaW1wb3J0IHtVc2VySW5mb0V2ZW50fSBmcm9tIFwiLi4vRGF0YS9Vc2VySW5mb0V2ZW50XCI7XG5cblxuZXhwb3J0IGNsYXNzIEFnZW5jeVVzZXJNZXNzYWdlIGV4dGVuZHMgQWdlbmN5QmFzZUNvbnRyb2xcbntcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5VXNlck1lc3NhZ2VcIjtcblxuICAgIHByaXZhdGUgcm9sZWlzaW5pdDpib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxuICAgIFxuICAgIHByb3RlY3RlZCBpbml0U2VsZigpOnZvaWRcbiAgICB7XG4gICAgICAgXG4gICAgfSAgIFxuXG4gICAgLyoq5Yqg6YeR5biBICovXG4gICAgcHVibGljIEdvbGRVcCggX251bTpudW1iZXIgKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLlJvbGVEYXRhLk1vbmV5ICs9IF9udW07XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIGNyZWF0ZUlucHV0KCk6IHZvaWQge1xuICAgICAgICB2YXIgaW5wdXRUZXh0OkxheWEuSW5wdXQgPSBuZXcgTGF5YS5JbnB1dCgpO1xuXG4gICAgICAgIGlucHV0VGV4dC5zaXplKDM1MCwgMTAwKTtcbiAgICAgICAgaW5wdXRUZXh0LnggPSBMYXlhLnN0YWdlLndpZHRoIC0gaW5wdXRUZXh0LndpZHRoID4+IDE7XG4gICAgICAgIGlucHV0VGV4dC55ID0gTGF5YS5zdGFnZS5oZWlnaHQgLSBpbnB1dFRleHQuaGVpZ2h0ID4+IDE7XG5cbiAgICAgICAgaW5wdXRUZXh0LnRleHQgPSBcIui/meauteaWh+acrOS4jeWPr+e8lui+ke+8jOS9huWPr+WkjeWItlwiO1xuICAgICAgICBpbnB1dFRleHQuZWRpdGFibGUgPSBmYWxzZTtcblxuICAgICAgICAvLyDorr7nva7lrZfkvZPmoLflvI9cbiAgICAgICAgaW5wdXRUZXh0LmJvbGQgPSB0cnVlO1xuICAgICAgICBpbnB1dFRleHQuYmdDb2xvciA9IFwiIzY2NjY2NlwiO1xuICAgICAgICBpbnB1dFRleHQuY29sb3IgPSBcIiNmZmZmZmZcIjtcbiAgICAgICAgaW5wdXRUZXh0LmZvbnRTaXplID0gMjA7XG5cbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChpbnB1dFRleHQpO1xuICAgIH1cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5Sb2xlRGF0YS5pbml0KCk7XG4gICAgICAgIHRoaXMucm9sZWlzaW5pdCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgY3JlYXRlVGV4dCgpOkxheWEuVGV4dCB7XG4gICAgICAgIHZhciB0eHQ6TGF5YS5UZXh0ID0gbmV3IExheWEuVGV4dCgpO1xuXG4gICAgICAgIHR4dC50ZXh0ID1cbiAgICAgICAgICAgIFwiTGF5YWJveOaYr0hUTUw15byV5pOO5oqA5pyv5o+Q5L6b5ZWG5LiO5LyY56eA55qE5ri45oiP5Y+R6KGM5ZWG77yM6Z2i5ZCRQVMvSlMvVFPlvIDlj5HogIXmj5DkvptIVE1MNeW8gOWPkeaKgOacr+aWueahiO+8gVxcblwiICtcbiAgICAgICAgICAgIFwiTGF5YWJveOaYr0hUTUw15byV5pOO5oqA5pyv5o+Q5L6b5ZWG5LiO5LyY56eA55qE5ri45oiP5Y+R6KGM5ZWG77yM6Z2i5ZCRQVMvSlMvVFPlvIDlj5HogIXmj5DkvptIVE1MNeW8gOWPkeaKgOacr+aWueahiO+8gVxcblwiICtcbiAgICAgICAgICAgIFwiTGF5YWJveOaYr0hUTUw15byV5pOO5oqA5pyv5o+Q5L6b5ZWG5LiO5LyY56eA55qE5ri45oiP5Y+R6KGM5ZWG77yM6Z2i5ZCRQVMvSlMvVFPlvIDlj5HogIXmj5DkvptIVE1MNeW8gOWPkeaKgOacr+aWueahiO+8gVwiO1xuXG4gICAgICAgIHR4dC5ib3JkZXJDb2xvciA9IFwiI0ZGRkYwMFwiO1xuXG4gICAgICAgIHR4dC5zaXplKDMwMCwgNTApO1xuICAgICAgICB0eHQuZm9udFNpemUgPSAyMDtcbiAgICAgICAgdHh0LmNvbG9yID0gXCIjZmZmZmZmXCI7XG5cbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0eHQpO1xuXG4gICAgICAgIHJldHVybiB0eHQ7XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbiAgICAvKirljYfnuqcgKi9cbiAgICBwdWJsaWMgTGV2ZWxVcCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuUm9sZURhdGEuTGV2ZWxVcCgpO1xuICAgIH1cblxuICAgIFxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxuLy/phY3nva7mlofku7blkI3np7DvvJpidWlsZC54bHN444CCXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVpbGRDRkdcbntcblx0cHVibGljIG5hbWU6c3RyaW5nOy8v5bu6562R5ZCNXG5cdHB1YmxpYyBidWZmeDpudW1iZXI7Ly9idWZmeFxuXHRwdWJsaWMgYnVmZnk6bnVtYmVyOy8vYnVmZnlcblx0cHVibGljIGJ1ZmZ6Om51bWJlcjsvL2J1ZmZ6XG5cdHB1YmxpYyB0aW1lOm51bWJlcjsvL+aMgee7reaXtumXtCjnp5IpXG5cdHB1YmxpYyBzdGF0aWMgZGljdDphbnkgPSB7fTtcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8QnVpbGRDRkc+ID0gW107XG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXG5cdHtcblx0XHR2YXIgaTpudW1iZXI9MDtcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcblx0XHRcdGlmKEJ1aWxkQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcblx0XHRcdHZhciBpdGVtOkJ1aWxkQ0ZHPSBuZXcgQnVpbGRDRkcoKTtcblx0XHRcdGl0ZW0ubmFtZT1zaW5nbGVBcnJbMF07XG5cdFx0XHRpdGVtLmJ1ZmZ4PSBOdW1iZXIoc2luZ2xlQXJyWzFdKTtcblx0XHRcdGl0ZW0uYnVmZnk9IE51bWJlcihzaW5nbGVBcnJbMl0pO1xuXHRcdFx0aXRlbS5idWZmej0gTnVtYmVyKHNpbmdsZUFyclszXSk7XG5cdFx0XHRpdGVtLnRpbWU9IE51bWJlcihzaW5nbGVBcnJbNF0pO1xuXHRcdFx0QnVpbGRDRkcuZGljdFtpdGVtLm5hbWVdPWl0ZW07XG5cdFx0XHRCdWlsZENGRy52ZWMucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxuLy/phY3nva7mlofku7blkI3np7DvvJpnYW1lLnhsc3jjgIJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lQ0ZHXG57XG5cdHB1YmxpYyBpZDpudW1iZXI7Ly9pZFxuXHRwdWJsaWMgdmFsdWU6c3RyaW5nOy8v5a2X5q615YC8XG5cdHB1YmxpYyBzdGF0aWMgZGljdDphbnkgPSB7fTtcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8R2FtZUNGRz4gPSBbXTtcblx0cHVibGljIHN0YXRpYyBpbml0Q2ZnKHN0cjpzdHJpbmcpOnZvaWRcblx0e1xuXHRcdHZhciBpOm51bWJlcj0wO1xuXHRcdHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIlxcblwiKTtcblx0XHR2YXIgaTpudW1iZXI9MDtcblx0XHRmb3IoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0dmFyIHNpbmdsZVN0cjpzdHJpbmcgPSBhcnJbaV07XG5cdFx0XHR2YXIgc2luZ2xlQXJyOkFycmF5PHN0cmluZz4gPSBzaW5nbGVTdHIuc3BsaXQoXCImXCIpO1xuXHRcdFx0aWYoR2FtZUNGRy5kaWN0W3NpbmdsZUFyclswXV0pY29udGludWU7XG5cdFx0XHR2YXIgaXRlbTpHYW1lQ0ZHPSBuZXcgR2FtZUNGRygpO1xuXHRcdFx0aXRlbS5pZD0gTnVtYmVyKHNpbmdsZUFyclswXSk7XG5cdFx0XHRpdGVtLnZhbHVlPXNpbmdsZUFyclsxXTtcblx0XHRcdEdhbWVDRkcuZGljdFtpdGVtLmlkXT1pdGVtO1xuXHRcdFx0R2FtZUNGRy52ZWMucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxuLy/phY3nva7mlofku7blkI3np7DvvJpsZXZlbC54bHN444CCXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGV2ZWxDRkdcbntcblx0cHVibGljIGlkOm51bWJlcjsvL+WFs+WNoVxuXHRwdWJsaWMgcm9hZDpzdHJpbmc7Ly/lhbPljaHmqKHlnotcblx0cHVibGljIHJvbGVpbml0cG9zOmFueTsvL+eOqeWutuinkuiJsuWIneWni+ermeS9jVxuXHRwdWJsaWMgbnBjOmFueTsvL25wY1xuXHRwdWJsaWMgZmlyc3RTY2VuZXBvczpzdHJpbmc7Ly/liJ3lp4vnrKzkuIDkuKrlnLrmma/mqKHlnovnmoTkvY3nva5cblx0cHVibGljIHdpbkdvbGQ6bnVtYmVyOy8v6YCa5YWz5oiQ5Yqf6I635b6X6YeR5biBXG5cdHB1YmxpYyBmYWlsR29kOnN0cmluZzsvL+mAmuWFs+Wksei0peiOt+W+l+mHkeW4gVxuXHRwdWJsaWMgc3RhdGljIGRpY3Q6YW55ID0ge307XG5cdHB1YmxpYyBzdGF0aWMgdmVjOkFycmF5PExldmVsQ0ZHPiA9IFtdO1xuXHRwdWJsaWMgc3RhdGljIGluaXRDZmcoc3RyOnN0cmluZyk6dm9pZFxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0dmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiXFxuXCIpO1xuXHRcdHZhciBpOm51bWJlcj0wO1xuXHRcdGZvcihpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHR2YXIgc2luZ2xlU3RyOnN0cmluZyA9IGFycltpXTtcblx0XHRcdHZhciBzaW5nbGVBcnI6QXJyYXk8c3RyaW5nPiA9IHNpbmdsZVN0ci5zcGxpdChcIiZcIik7XG5cdFx0XHRpZihMZXZlbENGRy5kaWN0W3NpbmdsZUFyclswXV0pY29udGludWU7XG5cdFx0XHR2YXIgaXRlbTpMZXZlbENGRz0gbmV3IExldmVsQ0ZHKCk7XG5cdFx0XHRpdGVtLmlkPSBOdW1iZXIoc2luZ2xlQXJyWzBdKTtcblx0XHRcdGl0ZW0ucm9hZD1zaW5nbGVBcnJbMV07XG5cdFx0XHRpdGVtLnJvbGVpbml0cG9zPSBKU09OLnBhcnNlKHNpbmdsZUFyclsyXSk7XG5cdFx0XHRpdGVtLm5wYz0gSlNPTi5wYXJzZShzaW5nbGVBcnJbM10pO1xuXHRcdFx0aXRlbS5maXJzdFNjZW5lcG9zPXNpbmdsZUFycls0XTtcblx0XHRcdGl0ZW0ud2luR29sZD0gTnVtYmVyKHNpbmdsZUFycls1XSk7XG5cdFx0XHRpdGVtLmZhaWxHb2Q9c2luZ2xlQXJyWzZdO1xuXHRcdFx0TGV2ZWxDRkcuZGljdFtpdGVtLmlkXT1pdGVtO1xuXHRcdFx0TGV2ZWxDRkcudmVjLnB1c2goaXRlbSk7XG5cdFx0fVxuXHR9XG5cbn0iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy/lt6XlhbfnlJ/miJDvvIzor7fli7/kv67mlLnjgIJcbi8v6YWN572u5paH5Lu25ZCN56ew77yabG90dGVyeS54bHN444CCXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG90dGVyeUNGR1xue1xuXHRwdWJsaWMgaWQ6bnVtYmVyOy8vaWRcblx0cHVibGljIHR5cGU6bnVtYmVyOy8v5bGe5oCn57G75Z6LXG5cdHB1YmxpYyB2YWx1ZTpzdHJpbmc7Ly/nsbvlnovlgLxcblx0cHVibGljIHdlaWdodDpudW1iZXI7Ly/mnYPph41cblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xuXHRwdWJsaWMgc3RhdGljIHZlYzpBcnJheTxMb3R0ZXJ5Q0ZHPiA9IFtdO1xuXHRwdWJsaWMgc3RhdGljIGluaXRDZmcoc3RyOnN0cmluZyk6dm9pZFxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0dmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiXFxuXCIpO1xuXHRcdHZhciBpOm51bWJlcj0wO1xuXHRcdGZvcihpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHR2YXIgc2luZ2xlU3RyOnN0cmluZyA9IGFycltpXTtcblx0XHRcdHZhciBzaW5nbGVBcnI6QXJyYXk8c3RyaW5nPiA9IHNpbmdsZVN0ci5zcGxpdChcIiZcIik7XG5cdFx0XHRpZihMb3R0ZXJ5Q0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcblx0XHRcdHZhciBpdGVtOkxvdHRlcnlDRkc9IG5ldyBMb3R0ZXJ5Q0ZHKCk7XG5cdFx0XHRpdGVtLmlkPSBOdW1iZXIoc2luZ2xlQXJyWzBdKTtcblx0XHRcdGl0ZW0udHlwZT0gTnVtYmVyKHNpbmdsZUFyclsxXSk7XG5cdFx0XHRpdGVtLnZhbHVlPXNpbmdsZUFyclsyXTtcblx0XHRcdGl0ZW0ud2VpZ2h0PSBOdW1iZXIoc2luZ2xlQXJyWzNdKTtcblx0XHRcdExvdHRlcnlDRkcuZGljdFtpdGVtLmlkXT1pdGVtO1xuXHRcdFx0TG90dGVyeUNGRy52ZWMucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxuLy/phY3nva7mlofku7blkI3np7DvvJpucGMueGxzeOOAglxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5wY0NGR1xue1xuXHRwdWJsaWMgaWQ6bnVtYmVyOy8v6KeS6ImyaWRcblx0cHVibGljIG5hbWU6c3RyaW5nOy8v6KeS6Imy6LWE5rqQ5ZCNXG5cdHB1YmxpYyBzcGVlZDpudW1iZXI7Ly/op5LoibLliY3ov5vnp7vliqjpgJ/luqYo57GzL+enkilcblx0cHVibGljIGZyb250anVtcDphbnk7Ly/liY3ot7PliqDpgJ/luqZcblx0cHVibGljIGxlZnRqdW1wOmFueTsvL+W3pui3s+WKoOmAn+W6plxuXHRwdWJsaWMgcmlnaHRqdW1wOmFueTsvL+WPs+i3s+WKoOmAn+W6plxuXHRwdWJsaWMgdXBjbGltYjpudW1iZXI7Ly/niKzljYfpgJ/luqZcblx0cHVibGljIHNsaWRlY2xpbWI6YW55Oy8v5pac552A54is5qW86YCf5bqmXG5cdHB1YmxpYyBqdW1wX2xlZnQ6bnVtYmVyOy8v5ZCR5bem6Lez6LeD5p2D6YeNXG5cdHB1YmxpYyBqdW1wX3JpZ2h0Om51bWJlcjsvL+WQkeWPs+i3s+adg+mHjVxuXHRwdWJsaWMgc3RhcnRfYWhlYWQ6bnVtYmVyOy8v55u06Lez5p2D6YeNXG5cdHB1YmxpYyBkaXN0YW5jZTpudW1iZXI7Ly9ucGPotoXov4fnjqnlrrbot53nprvlgZzmraJcblx0cHVibGljIGdyYXZpdHk6bnVtYmVyOy8v6YeN5Yqb5Yqg6YCf5bqmXG5cdHB1YmxpYyBzdGF0aWMgZGljdDphbnkgPSB7fTtcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8TnBjQ0ZHPiA9IFtdO1xuXHRwdWJsaWMgc3RhdGljIGluaXRDZmcoc3RyOnN0cmluZyk6dm9pZFxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0dmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiXFxuXCIpO1xuXHRcdHZhciBpOm51bWJlcj0wO1xuXHRcdGZvcihpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHR2YXIgc2luZ2xlU3RyOnN0cmluZyA9IGFycltpXTtcblx0XHRcdHZhciBzaW5nbGVBcnI6QXJyYXk8c3RyaW5nPiA9IHNpbmdsZVN0ci5zcGxpdChcIiZcIik7XG5cdFx0XHRpZihOcGNDRkcuZGljdFtzaW5nbGVBcnJbMF1dKWNvbnRpbnVlO1xuXHRcdFx0dmFyIGl0ZW06TnBjQ0ZHPSBuZXcgTnBjQ0ZHKCk7XG5cdFx0XHRpdGVtLmlkPSBOdW1iZXIoc2luZ2xlQXJyWzBdKTtcblx0XHRcdGl0ZW0ubmFtZT1zaW5nbGVBcnJbMV07XG5cdFx0XHRpdGVtLnNwZWVkPSBOdW1iZXIoc2luZ2xlQXJyWzJdKTtcblx0XHRcdGl0ZW0uZnJvbnRqdW1wPSBKU09OLnBhcnNlKHNpbmdsZUFyclszXSk7XG5cdFx0XHRpdGVtLmxlZnRqdW1wPSBKU09OLnBhcnNlKHNpbmdsZUFycls0XSk7XG5cdFx0XHRpdGVtLnJpZ2h0anVtcD0gSlNPTi5wYXJzZShzaW5nbGVBcnJbNV0pO1xuXHRcdFx0aXRlbS51cGNsaW1iPSBOdW1iZXIoc2luZ2xlQXJyWzZdKTtcblx0XHRcdGl0ZW0uc2xpZGVjbGltYj0gSlNPTi5wYXJzZShzaW5nbGVBcnJbN10pO1xuXHRcdFx0aXRlbS5qdW1wX2xlZnQ9IE51bWJlcihzaW5nbGVBcnJbOF0pO1xuXHRcdFx0aXRlbS5qdW1wX3JpZ2h0PSBOdW1iZXIoc2luZ2xlQXJyWzldKTtcblx0XHRcdGl0ZW0uc3RhcnRfYWhlYWQ9IE51bWJlcihzaW5nbGVBcnJbMTBdKTtcblx0XHRcdGl0ZW0uZGlzdGFuY2U9IE51bWJlcihzaW5nbGVBcnJbMTFdKTtcblx0XHRcdGl0ZW0uZ3Jhdml0eT0gTnVtYmVyKHNpbmdsZUFyclsxMl0pO1xuXHRcdFx0TnBjQ0ZHLmRpY3RbaXRlbS5pZF09aXRlbTtcblx0XHRcdE5wY0NGRy52ZWMucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxuLy/phY3nva7mlofku7blkI3np7DvvJpyb2xlLnhsc3jjgIJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb2xlQ0ZHXG57XG5cdHB1YmxpYyBpZDpudW1iZXI7Ly/op5LoibJpZFxuXHRwdWJsaWMgbmFtZTpzdHJpbmc7Ly/op5LoibLotYTmupDlkI1cblx0cHVibGljIHNwZWVkOm51bWJlcjsvL+inkuiJsuWJjei/m+enu+WKqOmAn+W6pijnsbMv56eSKVxuXHRwdWJsaWMgZnJvbnRqdW1wOmFueTsvL+WJjei3s+WKoOmAn+W6plxuXHRwdWJsaWMgbGVmdGp1bXA6YW55Oy8v5bem6Lez5Yqg6YCf5bqmXG5cdHB1YmxpYyByaWdodGp1bXA6YW55Oy8v5Y+z6Lez5Yqg6YCf5bqmXG5cdHB1YmxpYyB1cGNsaW1iOm51bWJlcjsvL+eIrOWNh+mAn+W6plxuXHRwdWJsaWMgc2xpZGVjbGltYjphbnk7Ly/mlpznnYDniKzmpbzpgJ/luqZcblx0cHVibGljIGdldFN0YXRlOm51bWJlcjsvL+iOt+WPluinkuiJsuaWueW8j1xuXHRwdWJsaWMgbmVlZDpudW1iZXI7Ly/ojrflj5bop5LoibLoirHotLlcblx0cHVibGljIGljb246c3RyaW5nOy8v5Zu+5qCHaWNvblxuXHRwdWJsaWMgZ3Jhdml0eTpudW1iZXI7Ly/ph43lipvliqDpgJ/luqZcblx0cHVibGljIHJvbGVuYW1lOnN0cmluZzsvL+inkuiJsuWQjeWtl1xuXHRwdWJsaWMgc3RhdGljIGRpY3Q6YW55ID0ge307XG5cdHB1YmxpYyBzdGF0aWMgdmVjOkFycmF5PFJvbGVDRkc+ID0gW107XG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXG5cdHtcblx0XHR2YXIgaTpudW1iZXI9MDtcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcblx0XHRcdGlmKFJvbGVDRkcuZGljdFtzaW5nbGVBcnJbMF1dKWNvbnRpbnVlO1xuXHRcdFx0dmFyIGl0ZW06Um9sZUNGRz0gbmV3IFJvbGVDRkcoKTtcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xuXHRcdFx0aXRlbS5uYW1lPXNpbmdsZUFyclsxXTtcblx0XHRcdGl0ZW0uc3BlZWQ9IE51bWJlcihzaW5nbGVBcnJbMl0pO1xuXHRcdFx0aXRlbS5mcm9udGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzNdKTtcblx0XHRcdGl0ZW0ubGVmdGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzRdKTtcblx0XHRcdGl0ZW0ucmlnaHRqdW1wPSBKU09OLnBhcnNlKHNpbmdsZUFycls1XSk7XG5cdFx0XHRpdGVtLnVwY2xpbWI9IE51bWJlcihzaW5nbGVBcnJbNl0pO1xuXHRcdFx0aXRlbS5zbGlkZWNsaW1iPSBKU09OLnBhcnNlKHNpbmdsZUFycls3XSk7XG5cdFx0XHRpdGVtLmdldFN0YXRlPSBOdW1iZXIoc2luZ2xlQXJyWzhdKTtcblx0XHRcdGl0ZW0ubmVlZD0gTnVtYmVyKHNpbmdsZUFycls5XSk7XG5cdFx0XHRpdGVtLmljb249c2luZ2xlQXJyWzEwXTtcblx0XHRcdGl0ZW0uZ3Jhdml0eT0gTnVtYmVyKHNpbmdsZUFyclsxMV0pO1xuXHRcdFx0aXRlbS5yb2xlbmFtZT1zaW5nbGVBcnJbMTJdO1xuXHRcdFx0Um9sZUNGRy5kaWN0W2l0ZW0uaWRdPWl0ZW07XG5cdFx0XHRSb2xlQ0ZHLnZlYy5wdXNoKGl0ZW0pO1xuXHRcdH1cblx0fVxuXG59IiwiaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xuaW1wb3J0IHtSZWNDb25maWdzfSBmcm9tIFwiLi9SZWNDb25maWdzXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIEFzc2V0UGF0aFxue1xuICAgIHN0YXRpYyAgcmVzOiBzdHJpbmcgPSBcInJlcy9cIjtcbiAgICBzdGF0aWMgIHJlc291cmNlczpzdHJpbmcgPSBcInJlc291cmNlcy9cIjtcbiAgICAvLyBleHBvcnQgdmFyIGNvbmZpZ3M6c3RyaW5nID0gXCJjb25maWdzL1wiO1xuICAgIHN0YXRpYyAgdWk6c3RyaW5nID0gXCJ1aS9cIjtcbiAgICBzdGF0aWMgIHN1YnBhY2tzZ2V1aTpzdHJpbmcgPSBcImNoYXJhY3Rlci91aS9cIlxuICAgIHN0YXRpYyAgbXVzaWM6c3RyaW5nID0gXCJtdXNpYy9cIjtcbiAgICBzdGF0aWMgIHZlcnNpb25yYW5kb206c3RyaW5nID0gXCJcIjtcbiAgICBzdGF0aWMgIHByb3A6c3RyaW5nID0gXCJwcm9wL1wiXG4gICAgc3RhdGljICBza2luaWNvbjpzdHJpbmcgPSBcInNraW5pY29uL1wiXG5cbiAgICBzdGF0aWMgIGluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICBBc3NldFBhdGgudmVyc2lvbnJhbmRvbSA9IFwiP3Y9XCIgKyBNYXRoLnJhbmRvbSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyAgZ2V0c291bmQoIGlkOnN0cmluZyApOnN0cmluZ1xuICAgIHtcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXNvdXJjZXMgKyBBc3NldFBhdGgubXVzaWMgKyBpZCArXCIubXAzXCIgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgIGdldFJlc0NvbmZpZygpOnN0cmluZ1xuICAgIHtcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXNvdXJjZXMgICsgXCJyZXNDb25maWcuanNvblwiICk7XG4gICAgfVxuXG4gICAgc3RhdGljICBnZXRDb25maWcoIGNvbmZpZ25hbWU6c3RyaW5nICk6c3RyaW5nXG4gICAge1xuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlc291cmNlcyAgKyBjb25maWduYW1lICtcIi5iaW5cIiApO1xuICAgIH1cblxuICAgIHN0YXRpYyAgZ2V0M0RzY2VuZSggbmFtZTphbnkgKTpzdHJpbmdcbiAgICB7XG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBBc3NldFBhdGgucmVzICsgQXNzZXRQYXRoLnByb3AgKyBcIkNvbnZlbnRpb25hbC9cIiArIG5hbWUgKyBcIi5sc1wiICk7XG4gICAgfSBcblxuICAgIHN0YXRpYyAgZ2V0M0RNb2RlbCggbmFtZTphbnkgKTpzdHJpbmdcbiAgICB7XG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBBc3NldFBhdGgucmVzICsgQXNzZXRQYXRoLnByb3AgKyBcIkNvbnZlbnRpb25hbC9cIiArIG5hbWUgKyBcIi5saFwiICk7XG4gICAgfVxuXG4gICAgc3RhdGljICBnZXQzRFJvbGVNb2RlbCggbmFtZTphbnkgKTpzdHJpbmdcbiAgICB7XG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBBc3NldFBhdGgucmVzICsgXCJjaGFyYWN0ZXIvQ29udmVudGlvbmFsL1wiICsgbmFtZSArIFwiLmxoXCIgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgIGdldHJvbGVpY29uKCBpZDpzdHJpbmcgKTpzdHJpbmdcbiAgICB7XG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBBc3NldFBhdGgucmVzICArIFwic2tpbmljb24vXCIgKyBpZCArIFwiLnBuZ1wiICk7XG4gICAgfVxuXG4gICAgc3RhdGljICBnZXRWZXJpc29udXJsKCk6c3RyaW5nXG4gICAge1xuICAgICAgICBpZiggR2xvYmFsLmlzZGVidWcgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlcyArIFwidmVyc2lvbi5qc29uXCIgKSArIEFzc2V0UGF0aC52ZXJzaW9ucmFuZG9tO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBBc3NldFBhdGgucmVzICsgXCJ2ZXJzaW9uXCIgKyBHbG9iYWwucmVzY29uZmlnVmVyc2lvbiArIFwiLmpzb25cIiApO1xuICAgIH1cblxuICAgIHN0YXRpYyAgZ2V0R2FtZVZlcnNpb24oKTpzdHJpbmdcbiAgICB7XG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBcImdhbWV2ZXJzaW9uLmpzb25cIiApO1xuICAgIH1cblxuICAgIC8qKuiOt+WPluWMuemFjeS6uueJqeWktOWDj2ljb24gKi9cbiAgICBzdGF0aWMgcGlwZWlpY29uIChpZDpzdHJpbmcpOnN0cmluZ3tcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXMgICsgXCJpY29uL1wiICsgaWQgKyBcIi5wbmdcIiApO1xuICAgIH1cblxuICBcbn0gIiwiaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4vQXNzZXRQYXRoXCI7XG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIFJlY0NvbmZpZ3MgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxue1xuICAgIHByaXZhdGUgc3RhdGljIGluczpSZWNDb25maWdzO1xuXG4gICAgcHVibGljIFJlc0RpYzphbnk7XG4gICAgLyoqXG4gICAgICog5piv5ZCm5bey57uP5Yid5aeL5YyWXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpbml0ZWQ6Ym9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpSZWNDb25maWdzXG4gICAge1xuICAgICAgICBpZiggUmVjQ29uZmlncy5pbnMgPT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVjQ29uZmlncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWNDb25maWdzLmlucztcbiAgICB9XG4gICAgY29uc3RydWN0b3IoKVxuICAgIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgUmVjQ29uZmlncy5pbnMgPSB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5SZXNEaWMgPSB7fTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBsb2FkVUkoKTp2b2lkIHtcbiAgICAgICAgTGF5YS5sb2FkZXIubG9hZChbXCJyZXMvdGhyZWVEaW1lbi91aS9idXR0b24ucG5nXCJdLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIGZ1bmN0aW9uKCk6dm9pZCB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlQWN0aW9uQnV0dG9uOkxheWEuQnV0dG9uID0gTGF5YS5zdGFnZS5hZGRDaGlsZChuZXcgTGF5YS5CdXR0b24oXCJyZXMvdGhyZWVEaW1lbi91aS9idXR0b24ucG5nXCIsIFwi5q2j5bi45qih5byPXCIpKSBhcyBMYXlhLkJ1dHRvbjtcbiAgICAgICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5zaXplKDE2MCwgNDApO1xuICAgICAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLmxhYmVsQm9sZCA9IHRydWU7XG4gICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ubGFiZWxTaXplID0gMzA7XG4gICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24uc2l6ZUdyaWQgPSBcIjQsNCw0LDRcIjtcbiAgICAgICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5zY2FsZShMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbywgTGF5YS5Ccm93c2VyLnBpeGVsUmF0aW8pO1xuICAgICAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnBvcyhMYXlhLnN0YWdlLndpZHRoIC8gMiAtIGNoYW5nZUFjdGlvbkJ1dHRvbi53aWR0aCAqIExheWEuQnJvd3Nlci5waXhlbFJhdGlvIC8gMiwgTGF5YS5zdGFnZS5oZWlnaHQgLSAxMDAgKiBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyk7XG4gICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgZnVuY3Rpb24oKTp2b2lkIHtcbiAgICAgICAgICAgICAgICBpZiAoKyt0aGlzLmN1clN0YXRlSW5kZXggJSAyID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcHJpdGUzRC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lU3ByaXRlM0QuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLmxhYmVsID0gXCLnvZHmoLzmqKHlvI9cIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwcml0ZTNELmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZVNwcml0ZTNELmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ubGFiZWwgPSBcIuato+W4uOaooeW8j1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuICAgIHB1YmxpYyBpbml0UmVjKCBfcmVzOmFueSApOnZvaWRcbiAgICB7XG4gICAgICAgaWYoIF9yZXMgIT0gbnVsbCAmJiAhUmVjQ29uZmlncy5pbml0ZWQgKVxuICAgICAgIHtcbiAgICAgICAgICAgIFJlY0NvbmZpZ3MuaW5pdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBncm91cHNBcnI6QXJyYXk8YW55PiA9IF9yZXMuZ3JvdXBzO1xuICAgICAgICAgICAgdmFyIHJlc291cmNlc0FycjpBcnJheTxhbnk+ID0gX3Jlcy5yZXNvdXJjZXM7XG4gICAgICAgICAgICB2YXIgcmVzb3VyY2VzRGljdDphbnkgPSB7fTtcbiAgICAgICAgICAgIGZvciggdmFyIGl0ZW0gaW4gcmVzb3VyY2VzQXJyIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGQ6YW55ID0gcmVzb3VyY2VzQXJyW2l0ZW1dO1xuICAgICAgICAgICAgICAgIHN3aXRjaCggY2hpbGQudHlwZSApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYmluXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50eXBlID0gTGF5YS5Mb2FkZXIuQlVGRkVSO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50eXBlID0gTGF5YS5TY2VuZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHlwZSA9IExheWEuU3ByaXRlM0Q7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibG1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnR5cGUgPSBMYXlhLk1lc2hTcHJpdGUzRDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc291cmNlc0RpY3RbY2hpbGQubmFtZV0gPSBjaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciggdmFyIGdyb3VwdHlwZSBpbiBncm91cHNBcnIgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBncm91cGNoaWxkOmFueSA9IGdyb3Vwc0Fycltncm91cHR5cGVdO1xuICAgICAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IGdyb3VwY2hpbGQua2V5cy5zcGxpdCggXCIsXCIgKTtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRBcnI6QXJyYXk8YW55PiA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBjaGlkc3RyO1xuICAgICAgICAgICAgICAgIGZvciggY2hpZHN0ciBpbiBhcnIgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ckNoaWxkOnN0cmluZyA9IGFycltjaGlkc3RyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHN0ckNoaWxkICE9IFwiXCIgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXJsczpzdHJpbmcgPSByZXNvdXJjZXNEaWN0W3N0ckNoaWxkXS51cmw7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cmxzID0gdXJscy5yZXBsYWNlKFwicmVzL1wiLEFzc2V0UGF0aC5yZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRBcnIucHVzaCggeyB1cmw6R2xvYmFsLmdldFVybCh1cmxzKSwgdHlwZTpyZXNvdXJjZXNEaWN0W3N0ckNoaWxkXS50eXBlIH0gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLlJlc0RpY1tncm91cGNoaWxkLm5hbWVdID0gY2hpbGRBcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBMYXlhLmxvYWRlci5jbGVhclJlcyhBc3NldFBhdGguZ2V0UmVzQ29uZmlnKCkpO1xuICAgICAgIH1cbiAgICB9XG5cblxuXG59IiwiaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcblxuXG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBjbGFzcyBBdWRpb0NvbnRyb2wgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxue1xuICAgIHByaXZhdGUgc3RhdGljIGluczpBdWRpb0NvbnRyb2w7XG4gICAgcHJpdmF0ZSBfaXNiZ09wZW46Ym9vbGVhbiA9IHRydWU7XG4gICAgcHJpdmF0ZSBvcGVuOmJvb2xlYW4gPSB0cnVlO1xuICAgIHByaXZhdGUgX2lzQWxsT3Blbjpib29sZWFuID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9ub3dCZ05hbWU6c3RyaW5nID0gXCJcIjtcbiAgICBwcml2YXRlIF9pc1BsYXliZ2luZzpib29sZWFuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICog5aOw6Z+z5byA5YWz5byV55So57Si5byVXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc291bmRJbmRleDpudW1iZXIgPSAwO1xuXG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgQXVkaW9Db250cm9sLmlucyA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpBdWRpb0NvbnRyb2xcbiAgICB7XG4gICAgICAgIGlmKCBBdWRpb0NvbnRyb2wuaW5zID09IG51bGwgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEF1ZGlvQ29udHJvbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBdWRpb0NvbnRyb2wuaW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuYXV0b1JlbGVhc2VTb3VuZCA9IGZhbHNlO1xuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5hdXRvU3RvcE11c2ljID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGdhbWVzb3VuZE9wZW4odmFsdWU6Ym9vbGVhbilcbiAgICB7XG4gICAgICAgIHRoaXMub3BlbiA9IHZhbHVlO1xuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5zb3VuZE11dGVkID0gIXZhbHVlO1xuICAgICAgICBpZiggdmFsdWUgPT0gdHJ1ZSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmJ1dHRvblNvdW5kVm9sdW1lU2NhbGUgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmRWb2x1bWVTY2FsZSA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpn7PmlYjmmK/lkKblvIDlkK9cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IEdldFNvdW5kU3dpdGNoKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGlzYmdPcGVuKHZhbHVlOmJvb2xlYW4pXG4gICAge1xuICAgICAgICB0aGlzLl9pc2JnT3BlbiA9IHZhbHVlO1xuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5tdXNpY011dGVkID0gIXZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiDjOaZr+mfs+S5kOaYr+WQpuW8gOWQr1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNiZ09wZW4oKTpib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNiZ09wZW47XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBpc0FsbE9wZW4oIHZhbHVlOmJvb2xlYW4gKVxuICAgIHtcbiAgICAgICAgaWYoIHZhbHVlIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fc291bmRJbmRleC0tO1xuICAgICAgICAgICAgaWYoIHRoaXMuX3NvdW5kSW5kZXggPCAwIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3VuZEluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCF0aGlzLl9pc1BsYXliZ2luZyYmdGhpcy5fc291bmRJbmRleD09MCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNBbGxPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEdhbWVWb2x1bWUoIDEgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXliZ1NvdW5kKCB0aGlzLl9ub3dCZ05hbWUgKTtcbiAgICAgICAgICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5idXR0b25Tb3VuZFZvbHVtZVNjYWxlID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0FsbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2lzQWxsT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgaWYoIHRoaXMuX3NvdW5kSW5kZXggPCAwIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3VuZEluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NvdW5kSW5kZXgrKztcbiAgICAgICAgICAgIGlmKHRoaXMuX2lzUGxheWJnaW5nKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcGJnU291bmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0R2FtZVZvbHVtZSggMCApO1xuICAgICAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmRWb2x1bWVTY2FsZSA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlgZzmraLmkq3mlL7pn7PmlYhcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcEdhbWVTb3VuZCgpOnZvaWRcbiAgICB7XG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLnN0b3BBbGxTb3VuZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWBnOatouaJgOacieWjsOmfs1xuICAgICAqL1xuICAgIHB1YmxpYyBDbGVhckFsbFNPVU5EKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5zdG9wR2FtZVNvdW5kKCk7XG4gICAgICAgIHRoaXMuc3RvcGJnU291bmQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmkq3mlL7og4zmma/pn7PkuZBcbiAgICAgKiBAcGFyYW0gc291bmROYW1lIOWjsOmfs+WQjVxuICAgICAqL1xuICAgIHB1YmxpYyBwbGF5YmdTb3VuZCggc291bmROYW1lOnN0cmluZyApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX25vd0JnTmFtZSA9IHNvdW5kTmFtZTtcbiAgICAgICAgaWYoIHRoaXMuX2lzQWxsT3BlbiAmJiB0aGlzLl9ub3dCZ05hbWUgIT0gXCJcIiAmJiB0aGlzLl9zb3VuZEluZGV4PD0gMCAmJiAhdGhpcy5faXNQbGF5YmdpbmcgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9pc1BsYXliZ2luZyA9IHRydWU7XG4gICAgICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5wbGF5TXVzaWMoIEFzc2V0UGF0aC5nZXRzb3VuZCggdGhpcy5fbm93QmdOYW1lICkgKTtcbiAgICAgICAgICAgIHRoaXMuYmdTb3VuZFZvbHVtZSA9IDAuNDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWBnOatouiDjOaZr+mfs+S5kFxuICAgICAqL1xuICAgIHB1YmxpYyBzdG9wYmdTb3VuZCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2lzUGxheWJnaW5nID0gZmFsc2U7XG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLnN0b3BNdXNpYygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaJgOaciemfs+S5kOaYr+WQpuW8gOWQr1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNBbGxPcGVuKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzQWxsT3BlbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7og4zmma/pn7PkuZDpn7Pph49cbiAgICAgKiBAcGFyYW0gdmFsdWUg6Z+z6YeP6IyD5Zu05LuOIDDvvIjpnZnpn7PvvInoh7MgMe+8iOacgOWkp+mfs+mHj++8ieOAglxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgYmdTb3VuZFZvbHVtZSggdmFsdWU6bnVtYmVyIClcbiAgICB7XG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLnNldE11c2ljVm9sdW1lKCB2YWx1ZSApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmdTb3VuZFZvbHVtZSgpOm51bWJlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIExheWEuU291bmRNYW5hZ2VyLm11c2ljVm9sdW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuvue9ruiDjOaZr+mfs+S5kOmfs+mHj1xuICAgICAqIEBwYXJhbSB2YWx1ZSDpn7Pph4/ojIPlm7Tku44gMO+8iOmdmemfs++8ieiHsyAx77yI5pyA5aSn6Z+z6YeP77yJ44CCXG4gICAgICovXG4gICAgcHVibGljIHNldCBzb3VuZFZvbHVtZSggdmFsdWU6bnVtYmVyIClcbiAgICB7XG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLnNldFNvdW5kVm9sdW1lKCB2YWx1ZSApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc291bmRWb2x1bWUoKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHJldHVybiBMYXlhLlNvdW5kTWFuYWdlci5zb3VuZFZvbHVtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7miYDmnInlo7Dpn7Ppn7Pph49cbiAgICAgKiBAcGFyYW0gdmFsdWUg6Z+z6YeP6IyD5Zu05LuOIDDvvIjpnZnpn7PvvInoh7MgMe+8iOacgOWkp+mfs+mHj++8ieOAglxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRHYW1lVm9sdW1lKHZhbHVlOm51bWJlcik6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5iZ1NvdW5kVm9sdW1lID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc291bmRWb2x1bWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBcblxuICAgIC8qKlxuICAgICAqIOaSreaUvumfs+aViFxuICAgICAqIEBwYXJhbSBzb3VuZE5hbWUg6Z+z5pWI5ZCNXG4gICAgICogQHBhcmFtIGxvb3Ag5pKt5pS+5qyh5pWwXG4gICAgICovXG4gICAgcHVibGljIHBsYXlHYW1lU291bmQoIHNvdW5kTmFtZTpzdHJpbmcsIGxvb3A6bnVtYmVyID0gMSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl9pc0FsbE9wZW4gJiYgc291bmROYW1lICE9IFwiXCIgJiYgTGF5YS5Tb3VuZE1hbmFnZXIuc291bmRWb2x1bWUgIT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuU291bmRNYW5hZ2VyLnBsYXlTb3VuZCggQXNzZXRQYXRoLmdldHNvdW5kKCBzb3VuZE5hbWUgKSxsb29wICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcbn0iLCJpbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4vUmVzb3VyY2VDb250cm9sXCI7XG5pbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi9SZXNEYXRhQ29udHJvbFwiO1xuaW1wb3J0IHtTa2luSXRlbX0gZnJvbSBcIi4uL3V0aWxzL1NraW5JdGVtXCI7XG5pbXBvcnQgQ3BhRG93bnNWaWV3IGZyb20gXCIuLi9QdXNoL0NwYURvd25zVmlld1wiO1xuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4uL1B1c2gvQ3BhSXRlbVwiO1xuaW1wb3J0IEJhb0t1YW5HYW1lVmlldyBmcm9tIFwiLi4vUHVzaC9CYW9LdWFuR2FtZVZpZXdcIjtcbmltcG9ydCBTaGl3YW50dWlqaWFuVmlldyBmcm9tIFwiLi4vUHVzaC9TaGl3YW50dWlqaWFuVmlld1wiO1xuaW1wb3J0IEZyaWVuZEludml0ZVZpZXcgZnJvbSBcIi4uL1B1c2gvRnJpZW5kSW52aXRlVmlld1wiO1xuaW1wb3J0IFR1aWppYW5WaWV3IGZyb20gXCIuLi9QdXNoL1R1aWppYW5WaWV3XCI7XG5pbXBvcnQgR2lmdFZpZXcgZnJvbSBcIi4uL1ZpZXcvR2lmdFZpZXdcIjtcblxuXG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0Q29udHJvbCBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXG57XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog57uE5Lu257uR5a6aXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBDb25uZWN0Q29tcG9uZW50KCk6IHZvaWQgXG4gICAge1xuICAgICAgICAvL21haW5cbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMnB3bGsxYVwiLCBTa2luSXRlbSk7XG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MjdcIiwgQ3BhRG93bnNWaWV3KTtcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyOFwiLCBDcGFJdGVtKTtcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyOVwiLCBCYW9LdWFuR2FtZVZpZXcpO1xuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyazhjNTJhXCIsIENwYUl0ZW0pO1xuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyazhjNTJiXCIsIFNoaXdhbnR1aWppYW5WaWV3KTtcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyY1wiLCBDcGFJdGVtKTtcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMmVrc2MyMVwiLCBDcGFJdGVtKTtcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMmVrc2MyMlwiLCBDcGFJdGVtKTtcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyZVwiLCBDcGFJdGVtKTtcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMnVvdHU2aFwiLCBDcGFJdGVtKTtcbiAgICAgICAgLy8gZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMmlwNjE2bFwiLCBHaWZ0Vmlldyk7XG4gICAgICAgIC8vIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MmRcIiwgVHVpamlhblZpZXcpO1xuICAgICAgICAvLyBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgya2FscjZrXCIsRnJpZW5kSW52aXRlVmlldyk7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgbW90aW9uQ3Jvc3M6Qm9vbGVhbiA9IGZhbHNlO1xuXHRwcml2YXRlIGJsZW5kVHlwZTpudW1iZXIgPSAwO1xuXHRwcml2YXRlIG1vdGlvbkluZGV4Om51bWJlciA9IDA7XG5cdHByaXZhdGUgbW90aW9uczpBcnJheTxzdHJpbmc+ID0gW1wicnVuXCIsIFwicnVuXzJcIiwgXCJhdHRhY2tcIiwgXCJhdHRhY2tfMVwiLCBcImF0dGFja18yXCIsIFwiZGVhZFwiLCBcImlkbGVfMlwiLCBcImlkbGVfM1wiLCBcImlkbGVfNFwiLCBcImlkbGU0XCIsIFwicmVsb2FkXCIsIFwicmVwbGFjZVwiLCBcInJlcGxhY2VfMlwiLCBcInN0b3BcIl07XG5cdFxuICAgIHByaXZhdGUgc2NlbmVMb2FkZWQoc2NlbmU6TGF5YS5TY2VuZTNEKTp2b2lkIHtcbiAgICAgICAgXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoc2NlbmUpO1xuICAgICAgICB2YXIgYW5pbWF0b3I6TGF5YS5BbmltYXRvciA9IHNjZW5lLmdldENoaWxkQXQoMikuZ2V0Q29tcG9uZW50KExheWEuQW5pbWF0b3IpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5hZGRCdXR0b24oMTAwLCAxMDAsIDE2MCwgMzAsIFwi5Yqo55S76L+H5rihOuWQplwiLCAyMCwgZnVuY3Rpb24oZTpMYXlhLkV2ZW50KTp2b2lkIHtcbiAgICAgICAgICAgIHRoaXMubW90aW9uQ3Jvc3MgPSAhdGhpcy5tb3Rpb25Dcm9zcztcbiAgICAgICAgICAgIGlmICh0aGlzLm1vdGlvbkNyb3NzKVxuICAgICAgICAgICAgICAgIChlLnRhcmdldCBhcyBMYXlhLkJ1dHRvbikubGFiZWwgPSBcIuWKqOeUu+i/h+a4oTrmmK9cIjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAoZS50YXJnZXQgYXMgTGF5YS5CdXR0b24pLmxhYmVsID0gXCLliqjnlLvov4fmuKE65ZCmXCI7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5hZGRCdXR0b24oMTAwLCAxNjAsIDE2MCwgMzAsIFwi5re35ZCI5qih5byPOuWFqOi6q1wiLCAyMCwgZnVuY3Rpb24oZTpMYXlhLkV2ZW50KTp2b2lkIHtcbiAgICAgICAgICAgIHRoaXMuYmxlbmRUeXBlKys7ICAgXG4gICAgICAgICAgICAodGhpcy5ibGVuZFR5cGUgPT09IDMpICYmICh0aGlzLmJsZW5kVHlwZSA9IDApO1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmJsZW5kVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAwOiBcbiAgICAgICAgICAgICAgICAoZS50YXJnZXQgYXMgTGF5YS5CdXR0b24pLmxhYmVsID0gXCLmt7flkIjmqKHlvI865YWo6LqrXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6IFxuICAgICAgICAgICAgICAgIChlLnRhcmdldCBhcyBMYXlhLkJ1dHRvbikubGFiZWwgPSBcIua3t+WQiOaooeW8jzrkuIrouqtcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjogXG4gICAgICAgICAgICAgICAgKGUudGFyZ2V0IGFzIExheWEuQnV0dG9uKS5sYWJlbCA9IFwi5re35ZCI5qih5byPOuS4i+i6q1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYWRkQnV0dG9uKDEwMCwgMjIwLCAyNjAsIDQwLCBcIuWIh+aNouWKqOS9nDphdHRhY2tfMlwiLCAyOCwgZnVuY3Rpb24oZTpMYXlhLkV2ZW50KTp2b2lkIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5ibGVuZFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMDogXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW90aW9uQ3Jvc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0b3IuY3Jvc3NGYWRlKHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XSwgMC4yLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0b3IuY3Jvc3NGYWRlKHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XSwgMC4yLCAxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRvci5wbGF5KHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLnBsYXkodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6IFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vdGlvbkNyb3NzKVxuICAgICAgICAgICAgICAgICAgICBhbmltYXRvci5jcm9zc0ZhZGUodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAwLjIsIDApO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0b3IucGxheSh0aGlzLm1vdGlvbnNbdGhpcy5tb3Rpb25JbmRleF0sIDApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOiBcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb3Rpb25Dcm9zcylcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0b3IuY3Jvc3NGYWRlKHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XSwgMC4yLCAxKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLnBsYXkodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChlLnRhcmdldCBhcyBMYXlhLkJ1dHRvbikubGFiZWwgPSBcIuWIh+aNouWKqOS9nDpcIiArIHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XTtcbiAgICAgICAgICAgIHRoaXMubW90aW9uSW5kZXgrKztcbiAgICAgICAgICAgICh0aGlzLm1vdGlvbkluZGV4ID09PSB0aGlzLm1vdGlvbnMubGVuZ3RoKSAmJiAodGhpcy5tb3Rpb25JbmRleCA9IDApO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBhZGRCdXR0b24oeDpudW1iZXIsIHk6bnVtYmVyLCB3aWR0aDpudW1iZXIsIGhlaWdodDpudW1iZXIsIHRleHQ6c3RyaW5nLCBzaXplOm51bWJlciwgY2xpY2tGdW46RnVuY3Rpb24pOnZvaWQge1xuICAgICAgICB2YXIgdGhpc3MgPSB0aGlzO1xuICAgICAgICBMYXlhLmxvYWRlci5sb2FkKFtcInJlcy90aHJlZURpbWVuL3VpL2J1dHRvbi5wbmdcIl0sIExheWEuSGFuZGxlci5jcmVhdGUobnVsbCwgZnVuY3Rpb24oKTp2b2lkIHtcbiAgICAgICAgdmFyIGNoYW5nZUFjdGlvbkJ1dHRvbjpMYXlhLkJ1dHRvbiA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuQnV0dG9uKFwicmVzL3RocmVlRGltZW4vdWkvYnV0dG9uLnBuZ1wiLCB0ZXh0KSkgYXMgTGF5YS5CdXR0b247XG4gICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5zaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ubGFiZWxCb2xkID0gdHJ1ZTtcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLmxhYmVsU2l6ZSA9IHNpemU7XG4gICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5zaXplR3JpZCA9IFwiNCw0LDQsNFwiO1xuICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24uc2NhbGUoTGF5YS5Ccm93c2VyLnBpeGVsUmF0aW8sIExheWEuQnJvd3Nlci5waXhlbFJhdGlvKTtcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnBvcyh4LCB5KTtcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXNzLCBjbGlja0Z1bik7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgXG4gICAgLyoqXG4gICAgICog5pWw5o2u57uR5a6aXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBDb25ubmVjdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5Db25uZWN0RmFpcnlndWkoKTtcbiAgICAgICAgdGhpcy5Db25uZWN0Q29tcG9uZW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdWnmoYbmnrbnmoTnu5HlrppcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIENvbm5lY3RGYWlyeWd1aSgpOiB2b2lkIHtcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcuZ2FtZUxvYWRlck1hbmFnZXIgPSBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2U7XG4gICAgICAgIC8v54m55pWI57uR5a6aKCB1cmwg57uR5a6a57uE5ZCN77yM5Y+q5pyJ5YWs5YWx54m55pWI6ZyA6KaB57uR5a6aICkgXCJ1aTovL2ZxcGd4cjFrbDZtdzBcIjpcImVmZmVjdDFcIlxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5nYW1lRWZmZWN0RGljdCA9IHt9O1xuICAgIH1cblxuICAgIFxufSIsImltcG9ydCB7TG9jYWxEYXRhQ29udHJvbH0gZnJvbSBcIi4vTG9jYWxEYXRhQ29udHJvbFwiO1xuaW1wb3J0IHsgVGltZVV0aWxzIH0gZnJvbSBcIi4uL1RpbWUvVGltZVV0aWxzXCI7XG5pbXBvcnQge1VzZXJEYXRhSW5mb30gZnJvbSBcIi4uL0RhdGEvVXNlckRhdGFJbmZvXCI7XG5pbXBvcnQgeyBUaW1lc1RhbXBlciB9IGZyb20gXCIuLi9UaW1lL1RpbWVzVGFtcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBEYXRlQ29udHJvbHtcbiAgICBwdWJsaWMgc3RhdGljIEZyZXNoOmJvb2xlYW47XG4gICAgXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOkRhdGVDb250cm9sO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIERhdGVDb250cm9sLmlucyA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgIEluc3RhbmNlKCk6RGF0ZUNvbnRyb2xcbiAgICB7XG4gICAgICAgIGlmKCBEYXRlQ29udHJvbC5pbnMgPT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZUNvbnRyb2woKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGF0ZUNvbnRyb2wuaW5zO1xuICAgIH1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBsb2FkVUkoKTp2b2lkIHtcbiAgICAgICAgTGF5YS5sb2FkZXIubG9hZChbXCJyZXMvdGhyZWVEaW1lbi91aS9idXR0b24ucG5nXCJdLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIGZ1bmN0aW9uKCk6dm9pZCB7XG4gICAgICAgICAgICB2YXIgYnV0dG9uID0gTGF5YS5zdGFnZS5hZGRDaGlsZChuZXcgTGF5YS5CdXR0b24oXCJyZXMvdGhyZWVEaW1lbi91aS9idXR0b24ucG5nXCIsIFwi5YWz6ZetSERSXCIpKSBhcyBMYXlhLkJ1dHRvbjtcbiAgICAgICAgICAgIGJ1dHRvbi5zaXplKDIwMCwgNDApO1xuICAgICAgICAgICAgYnV0dG9uLmxhYmVsQm9sZCA9IHRydWU7XG4gICAgICAgICAgICBidXR0b24ubGFiZWxTaXplID0gMzA7XG4gICAgICAgICAgICBidXR0b24uc2l6ZUdyaWQgPSBcIjQsNCw0LDRcIjtcbiAgICAgICAgICAgIGJ1dHRvbi5zY2FsZShMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbywgTGF5YS5Ccm93c2VyLnBpeGVsUmF0aW8pO1xuICAgICAgICAgICAgYnV0dG9uLnBvcyhMYXlhLnN0YWdlLndpZHRoIC8gMiAtIGJ1dHRvbi53aWR0aCAqIExheWEuQnJvd3Nlci5waXhlbFJhdGlvIC8gMiwgTGF5YS5zdGFnZS5oZWlnaHQgLSA2MCAqIExheWEuQnJvd3Nlci5waXhlbFJhdGlvKTtcbiAgICAgICAgICAgIGJ1dHRvbi5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCBmdW5jdGlvbigpOnZvaWQge1xuICAgICAgICAgICAgICAgIHZhciBlbmFibGVIRFI6Qm9vbGVhbiA9IHRoaXMuY2FtZXJhLmVuYWJsZUhEUjtcbiAgICAgICAgICAgICAgICBpZiAoZW5hYmxlSERSKVxuICAgICAgICAgICAgICAgICAgICBidXR0b24ubGFiZWwgPSBcIuW8gOWQr0hEUlwiO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmxhYmVsID0gXCLlhbPpl61IRFJcIjtcblx0XHRcdFx0XHR0aGlzLmNhbWVyYS5lbmFibGVIRFIgPSAhZW5hYmxlSERSO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuICAgIHB1YmxpYyBTZXRTZWxmKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGxhc3RkYXk6c3RyaW5nID0gTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5nZXRzdHIoIFVzZXJEYXRhSW5mby5sYXN0RGF5IClcbiAgICAgICAgdmFyIG5vd2RheTpzdHJpbmcgPSBUaW1lVXRpbHMuZm9ybWF0WWVhck1vbnRoRGF0ZTEoIFRpbWVzVGFtcGVyLkluc3RhbmNlLnNlcnZlclRpbWUgKTtcbiAgICAgICAgaWYoIGxhc3RkYXkgIT0gbm93ZGF5IClcbiAgICAgICAge1xuICAgICAgICAgICAgTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5hZGRzdHIoIFVzZXJEYXRhSW5mby5sYXN0RGF5LG5vd2RheSApO1xuICAgICAgICAgICAgRGF0ZUNvbnRyb2wuRnJlc2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgRGF0ZUNvbnRyb2wuRnJlc2ggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBKb3lzdGlja01vZHVsZSB9IGZyb20gXCIuLi9Kb3lzdGlja01vZHVsZVwiO1xuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XG5pbXBvcnQge1NjZW5lQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvU2NlbmVDb250cm9sXCI7XG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xuaW1wb3J0IHtOcGNTY3JpcHR9IGZyb20gXCIuLi9HYW1lL05wY1NjcmlwdFwiO1xuaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xuaW1wb3J0IEdhbWVDRkcgZnJvbSBcIi4uL0NGRy9HYW1lQ0ZHXCI7XG5pbXBvcnQge0F1ZGlvQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvQXVkaW9Db250cm9sXCI7XG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XG5pbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xuaW1wb3J0IHtBZ2VuY3lUcmlhbH0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lUcmlhbFwiO1xuaW1wb3J0IHtBZ2VuY3lTa2lufSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVNraW5cIjtcbmltcG9ydCB7U2tpbkRhdGF9IGZyb20gXCIuLi9EYXRhL1NraW5EYXRhXCI7XG5pbXBvcnQgeyBEaXNQYXRjaGVyT24gfSBmcm9tIFwiLi4vdXRpbHMvRGlzUGF0Y2hlck9uXCI7XG5pbXBvcnQgeyBSZWNvcmRNYW5hZ2VyIH0gZnJvbSBcIi4uL1dYU0RLL1JlY29yZE1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIEdhbWVTdGF0ZUNvbnRyb2wgaW1wbGVtZW50cyBUaW1lckNvbnRyb2xcbntcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6R2FtZVN0YXRlQ29udHJvbDtcblxuICAgIHByaXZhdGUgX2pveXN0aWNrTW9kdWxlOkpveXN0aWNrTW9kdWxlO1xuXG4gICAgLyoqXG4gICAgICogMDrmnKrlvIDlp4vvvIwx77ya5ri45oiP5Lit77yMMu+8muaaguWBnOS4rVxuICAgICAqL1xuICAgIG5vd0dhbWVTdGF0ZTpudW1iZXIgPSAwO1xuXG4gICAgcHJpdmF0ZSBfemh1YW54aWFuZ2JlaXNodTpudW1iZXIgPSAwO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIEdhbWVTdGF0ZUNvbnRyb2wuaW5zID0gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOkdhbWVTdGF0ZUNvbnRyb2xcbiAgICB7XG4gICAgICAgIGlmKCBHYW1lU3RhdGVDb250cm9sLmlucyA9PSBudWxsIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBHYW1lU3RhdGVDb250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEdhbWVTdGF0ZUNvbnRyb2wuaW5zO1xuICAgIH0gICBcblxuICAgIHByaXZhdGUgX2h1YWRvbmdTcGVlZFg6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIF9odWFkb25nQ2xpbWJTcGVlZFg6bnVtYmVyID0gMDtcblxuICAgIHB1YmxpYyBlbmRHYW1lUGxheWVyQXJyOkFycmF5PHN0cmluZz4gPSBbXTtcblxuICAgIHB1YmxpYyBpbml0KCApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2h1YWRvbmdTcGVlZFggPSBOdW1iZXIoR2FtZUNGRy5kaWN0WzRdLnZhbHVlKTtcbiAgICAgICAgdGhpcy5faHVhZG9uZ0NsaW1iU3BlZWRYID0gTnVtYmVyKEdhbWVDRkcuZGljdFs1XS52YWx1ZSk7XG4gICAgICAgIGlmKCBHYW1lQ0ZHLmRpY3RbN10gKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl96aHVhbnhpYW5nYmVpc2h1ID0gTnVtYmVyKCBHYW1lQ0ZHLmRpY3RbN10udmFsdWUgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3podWFueGlhbmdiZWlzaHUgPSAyO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lciggR2FtZVN0YXRlLmxvc2UsdGhpcyx0aGlzLmVuZEdhbWUpO1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKCBHYW1lU3RhdGUuZW5kLHRoaXMsdGhpcy5lbmRHYW1lICk7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVTdGF0ZS5ucGNlbmQsdGhpcyx0aGlzLm5wY2VuZEdhbWVIYW5kbGVyICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBucGNlbmRHYW1lSGFuZGxlciggc3RyOnN0cmluZyApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuZW5kR2FtZVBsYXllckFyci5wdXNoKCBzdHIgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q2xpY2tQYW5lbCggcGFuZWw6ZmFpcnlndWkuR0xvYWRlciApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2pveXN0aWNrTW9kdWxlID0gbmV3IEpveXN0aWNrTW9kdWxlKHBhbmVsKTtcbiAgICAgICAgdGhpcy5fam95c3RpY2tNb2R1bGUuc2V0RXZlbnRDYWxsYmFjayggdGhpcyx0aGlzLm9uZG93bmZ1bix0aGlzLm9ubW92ZWZ1bix0aGlzLm9udXBmdW4gKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc25lZWRTaHVueWlYOmJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIF9ub3dUaW1lOm51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBvbmRvd25mdW4oKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9sYXN0QW5nbGUgPSAwO1xuICAgICAgICB0aGlzLl9ub3dUaW1lID0gTGF5YS5Ccm93c2VyLm5vdygpLzEwMDA7XG4gICAgfVxuICAgIHByaXZhdGUgX2xhc3RBbmdsZTpudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgb25tb3ZlZnVuKCBvZmZzZXRYOm51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLm5vd0dhbWVTdGF0ZSA9PSAxIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGRpc0FuZ2xlOm51bWJlciA9IHRoaXMuX2pveXN0aWNrTW9kdWxlLmFuZ2xlIC0gdGhpcy5fbGFzdEFuZ2xlO1xuICAgICAgICAgICAgdGhpcy5fbGFzdEFuZ2xlID0gdGhpcy5fam95c3RpY2tNb2R1bGUuYW5nbGU7XG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuaXNjYXJtYW5wYyApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgKFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3RbXCJucGNfMFwiXSBhcyBOcGNTY3JpcHQpLkpveShvZmZzZXRYID4gMCA/IHRoaXMuX2h1YWRvbmdTcGVlZFg6LXRoaXMuX2h1YWRvbmdTcGVlZFgsZGlzQW5nbGUqdGhpcy5femh1YW54aWFuZ2JlaXNodSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLlBsYXllclNjcmlwdC5Kb3koIG9mZnNldFggPiAwID8gdGhpcy5faHVhZG9uZ1NwZWVkWDotdGhpcy5faHVhZG9uZ1NwZWVkWCxvZmZzZXRYID4gMCA/IHRoaXMuX2h1YWRvbmdDbGltYlNwZWVkWDotdGhpcy5faHVhZG9uZ0NsaW1iU3BlZWRYLGRpc0FuZ2xlKnRoaXMuX3podWFueGlhbmdiZWlzaHUgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb251cGZ1bigpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBQcm9wTWFuYWdlci5pc2Nhcm1hbnBjIClcbiAgICAgICAge1xuICAgICAgICAgICAgKFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3RbXCJucGNfMFwiXSBhcyBOcGNTY3JpcHQpLkpveSgwLDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIHRoaXMubm93R2FtZVN0YXRlID09IDEgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFNjZW5lQ29udHJvbC5JbnN0YW5jZS5QbGF5ZXJTY3JpcHQuSm95KCAwLDAsMCApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBub3dNaW5nQ2k6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIF9udW1zOm51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBfYWxsOm51bWJlciA9IDA7XG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMubm93R2FtZVN0YXRlID09IDEgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl90aW1lID0gMDtcbiAgICAgICAgICAgIHZhciBucGNkaWN0OmFueSA9IFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3Q7XG4gICAgICAgICAgICB0aGlzLl9udW1zID0gMDtcbiAgICAgICAgICAgIHRoaXMuX2FsbCA9IDA7XG4gICAgICAgICAgICB2YXIgcztcbiAgICAgICAgICAgIHZhciBucGNzcDpOcGNTY3JpcHQ7XG4gICAgICAgICAgICBmb3IoIHMgaW4gbnBjZGljdCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbnBjc3AgPSBucGNkaWN0W3NdO1xuICAgICAgICAgICAgICAgIGlmKCBucGNzcC5nZXRBY3Rpb24oKSA9PSAxIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24ueiA8IG5wY3NwLmdldFBvc3Rpb24oKS56IClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbnVtcysrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FsbCArKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5vd01pbmdDaSA9IHRoaXMuZW5kR2FtZVBsYXllckFyci5sZW5ndGggKyAoKCB0aGlzLl9hbGwgKyAxICkgLSB0aGlzLl9udW1zKTtcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLnR4dF9taW5nY2kudGV4dCA9IFwi56ysXCIgKyB0aGlzLm5vd01pbmdDaSArIFwi5ZCNXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhcnRHYW1lKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gKFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSkuUm9sZURhdGE7XG4gICAgICAgIHZhciBhZ2VuY3lza2luOkFnZW5jeVNraW4gPSBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oIEFnZW5jeVNraW4gKTtcbiAgICAgICAgdmFyIG5vaGFzc2tpbkFycjpBcnJheTxTa2luRGF0YT4gPSBhZ2VuY3lza2luLkdhaW5Ob0hhdmVTa2luKCk7XG4gICAgICAgIGlmKCBub2hhc3NraW5BcnIubGVuZ3RoID09IDAgIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5lbnRlcmdhbWUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgICggUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lUcmlhbCApIGFzIEFnZW5jeVRyaWFsICkub3BlbnZpZXcobm9oYXNza2luQXJyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBlbnRlcmdhbWUoamlhc3U/KTp2b2lkXG4gICAge1xuICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlJlY29yZFN0YXJ0KCk7XG4gICAgICAgIHRoaXMubm93TWluZ0NpID0gMDtcbiAgICAgICAgdGhpcy5lbmRHYW1lUGxheWVyQXJyLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMubm93R2FtZVN0YXRlID0gMTtcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xuICAgICAgICB0aGlzLnVwZGF0ZSggNTAwICk7XG4gICAgICAgIGlmKGppYXN1KXtcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5zdGFydCxqaWFzdSApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUuc3RhcnQgKTtcbiAgICAgICAgfVxuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UucGxheWJnU291bmQoXCJiZ21cIik7XG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5Li755WM6Z2i54K55Ye75byA5aeL5ri45oiPLi4uXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdG9wR2FtZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubm93R2FtZVN0YXRlID0gMjtcbiAgICAgICAgdGhpcy5vbnVwZnVuKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGVuZEdhbWUoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggUHJvcE1hbmFnZXIuamlhbnRvdUFyciAmJiBQcm9wTWFuYWdlci5qaWFudG91QXJyLmxlbmd0aCA+IDAgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PExheWEuTWVzaFNwcml0ZTNEPiA9IFByb3BNYW5hZ2VyLmppYW50b3VBcnI7XG4gICAgICAgICAgICBmb3IoIHZhciBpOm51bWJlciA9YXJyLmxlbmd0aC0xO2kgPj0wO2ktLSAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFycltpXS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgYXJyLnNwbGljZSggaSwxICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgUHJvcE1hbmFnZXIuamlhbnRvdUFyci5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLm5vd0dhbWVTdGF0ZSA9IDA7XG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gUHJvcE1hbmFnZXIubnBjc2NyaXB0RGljdDtcbiAgICAgICAgaWYoIG5wY2RpY3QgKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IoIHZhciBzIGluIG5wY2RpY3QgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIChucGNkaWN0W3NdIGFzIE5wY1NjcmlwdCkuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub251cGZ1bigpO1xuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2Uuc3RvcGJnU291bmQoKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xuaW1wb3J0IHsgTGF5T1VUIH0gZnJvbSBcIi4uL3V0aWxzL0xheU9VVFwiO1xuXG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBjbGFzcyBMYXlvdXRDb250cm9sIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcbntcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6TGF5b3V0Q29udHJvbDtcbiAgICBwcml2YXRlIF91aWxheWVyWm9yZGVyOm51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBfdXB1aWxheWVyWm9yZGVyOm51bWJlciA9IDIwMDtcbiAgICBwcml2YXRlIF90aXBzbGF5ZXJab3JkZXI6bnVtYmVyID0gMTAwMDtcbiAgICBwcml2YXRlIF9ndWlkZWxheWVyWm9yZGVyOm51bWJlciA9IDYwMDtcblxuICAgIC8qKlxuICAgICAqIHVp5bGCXG4gICAgICovXG4gICAgcHJpdmF0ZSB1aUxheWVyOmZhaXJ5Z3VpLkdDb21wb25lbnQgPSBuZXcgZmFpcnlndWkuR0NvbXBvbmVudCgpO1xuICAgIFxuICAgICAvKipcbiAgICAgICog5pyA5a6a5bGCXG4gICAgICAqL1xuICAgIHB1YmxpYyB0b3BMYXllcjpmYWlyeWd1aS5HQ29tcG9uZW50ID0gbmV3IGZhaXJ5Z3VpLkdDb21wb25lbnQoKTtcbiAgICBcbiAgICAvKipcbiAgICAgKiDog4zmma/lsYIoIOaIluiAhTNE5Zy65pmv5bGCIClcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFja2dyb3VuZDpmYWlyeWd1aS5HQ29tcG9uZW50ID0gbmV3IGZhaXJ5Z3VpLkdDb21wb25lbnQoKTtcblxuICAgIFxuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIExheW91dENvbnRyb2wuaW5zID0gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOkxheW91dENvbnRyb2xcbiAgICB7XG4gICAgICAgIGlmKCBMYXlvdXRDb250cm9sLmlucyA9PSBudWxsIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRDb250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExheW91dENvbnRyb2wuaW5zO1xuICAgIH1cblxuICAgIFxuICAgIHB1YmxpYyBBZGRMYXllckJ5TmFtZSggaXRlbXZpZXc6ZmFpcnlndWkuR09iamVjdCxsYXllcjpzdHJpbmcgKTp2b2lkXG4gICAge1xuICAgICAgICBpZihsYXllciA9PSBMYXlPVVQuQkcgKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLmJhY2tncm91bmQuYWRkQ2hpbGQoIGl0ZW12aWV3ICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihsYXllciA9PSBMYXlPVVQuVUkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3VpbGF5ZXJab3JkZXIrKztcbiAgICAgICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UudWlMYXllci5hZGRDaGlsZChpdGVtdmlldyk7XG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgPSB0aGlzLl91aWxheWVyWm9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoIGxheWVyID09IExheU9VVC5VSVRvcCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3VwdWlsYXllclpvcmRlcisrO1xuICAgICAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS51aUxheWVyLmFkZENoaWxkKCBpdGVtdmlldyApO1xuICAgICAgICAgICAgaXRlbXZpZXcuc29ydGluZ09yZGVyICA9IHRoaXMuX3VwdWlsYXllclpvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKGxheWVyID09IExheU9VVC5USVApXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIEdhbWVMYXllck1hbmFnZXIuSW5zdGFuY2UudGlwc0xheWVyLmFkZENoaWxkKGl0ZW12aWV3KTtcbiAgICAgICAgICAgIHRoaXMuX3RpcHNsYXllclpvcmRlcisrO1xuICAgICAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS51aUxheWVyLmFkZENoaWxkKCBpdGVtdmlldyApO1xuICAgICAgICAgICAgaXRlbXZpZXcuc29ydGluZ09yZGVyICA9IHRoaXMuX3RpcHNsYXllclpvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKCBsYXllciA9PSBMYXlPVVQuR1VJREUgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9ndWlkZWxheWVyWm9yZGVyKys7XG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLnVpTGF5ZXIuYWRkQ2hpbGQoaXRlbXZpZXcpO1xuICAgICAgICAgICAgaXRlbXZpZXcuc29ydGluZ09yZGVyICA9IHRoaXMuX2d1aWRlbGF5ZXJab3JkZXI7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8v5Yid5aeL5YyW5bGC57qnXG5cdHB1YmxpYyBpbml0bGF5ZXIoKTp2b2lkXG5cdHtcblx0XHRHbG9iYWwuc3RhZ2UuYWRkQ2hpbGQoIGZhaXJ5Z3VpLkdSb290Lmluc3QuZGlzcGxheU9iamVjdCApO1xuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmFkZENoaWxkKCB0aGlzLmJhY2tncm91bmQgKTtcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5hZGRDaGlsZCggdGhpcy51aUxheWVyICk7XG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMudG9wTGF5ZXIgKTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBzY2VuZTpMYXlhLlNjZW5lM0Q7XG4gICAgcHJpdmF0ZSB0bXBWZWN0b3I6TGF5YS5WZWN0b3IzO1xuICAgIHByaXZhdGUgbWF0MTpMYXlhLkJsaW5uUGhvbmdNYXRlcmlhbDsgXG4gICAgcHJpdmF0ZSBtZXNoMTpMYXlhLk1lc2g7XG4gICAgcHJpdmF0ZSBtZXNoMjpMYXlhLk1lc2g7XG4gICAgcHVibGljIGFkZEhvcml6b250YWxCb3goeDpudW1iZXIsIHk6bnVtYmVyLCB6Om51bWJlcik6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGJveDpMYXlhLk1lc2hTcHJpdGUzRCA9IHRoaXMuc2NlbmUuYWRkQ2hpbGQobmV3IExheWEuTWVzaFNwcml0ZTNEKHRoaXMubWVzaDIpKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcbiAgICAgICAgYm94Lm1lc2hSZW5kZXJlci5tYXRlcmlhbCA9IHRoaXMubWF0MTtcbiAgICAgICAgYm94Lm1lc2hSZW5kZXJlci5jYXN0U2hhZG93ID0gdHJ1ZTtcbiAgICAgICAgYm94Lm1lc2hSZW5kZXJlci5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50bXBWZWN0b3Iuc2V0VmFsdWUoeCwgeSwgeik7XG4gICAgICAgIGJveC50cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLnRtcFZlY3RvcjtcbiAgICAgICAgXG4gICAgICAgIHZhciByaWdpZEJvZHk6TGF5YS5SaWdpZGJvZHkzRCA9IGJveC5hZGRDb21wb25lbnQoTGF5YS5SaWdpZGJvZHkzRCkgYXMgTGF5YS5SaWdpZGJvZHkzRDtcbiAgICAgICAgcmlnaWRCb2R5Lm1hc3MgPSAxMDtcbiAgICAgICAgcmlnaWRCb2R5LmZyaWN0aW9uID0gMS4wO1xuICAgICAgICByaWdpZEJvZHkucmVzdGl0dXRpb24gPSAwLjI7XG4gICAgICAgIHZhciBib3hTaGFwZTpMYXlhLkJveENvbGxpZGVyU2hhcGUgPSBuZXcgTGF5YS5Cb3hDb2xsaWRlclNoYXBlKDIsIDAuMzMsIDAuNSk7XG4gICAgICAgIHJpZ2lkQm9keS5jb2xsaWRlclNoYXBlID0gYm94U2hhcGU7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHVibGljIENsZWFyTGF5ZXJCeU5hbWUoIGxheWVyOnN0cmluZyApOnZvaWRcbiAgICB7XG4gICAgICAgIHN3aXRjaCggbGF5ZXIgKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIExheU9VVC5VSTpcbiAgICAgICAgICAgICAgICB0aGlzLl91aWxheWVyWm9yZGVyLS07XG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3VpbGF5ZXJab3JkZXIgPCAwIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VpbGF5ZXJab3JkZXIgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBMYXlPVVQuVUlUb3A6XG4gICAgICAgICAgICAgICAgdGhpcy5fdXB1aWxheWVyWm9yZGVyLS07XG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3VwdWlsYXllclpvcmRlciA8IDIwMCApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cHVpbGF5ZXJab3JkZXIgPSAyMDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIExheU9VVC5USVA6XG4gICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyLS07XG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RpcHNsYXllclpvcmRlciA8IDEwMDAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyID0gMTAwMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTGF5T1VULkdVSURFOlxuICAgICAgICAgICAgICAgIHRoaXMuX3RpcHNsYXllclpvcmRlci0tO1xuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90aXBzbGF5ZXJab3JkZXIgPCA2MDAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyID0gNjAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgY2FtZXJhOkxheWEuQ2FtZXJhO1xuICAgIHByaXZhdGUgbGF5YU1vbmtleTNEOkxheWEuU3ByaXRlM0Q7XG4gICAgcHJpdmF0ZSBsYXlhTW9ua2V5MkQ6TGF5YS5JbWFnZTtcbiAgICBwcml2YXRlIF9wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcbiAgICBwcml2YXRlIF9vdXRQb3MgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XG4gICAgcHJpdmF0ZSBzY2FsZURlbHRhOm51bWJlciA9IDA7XG5cbiAgICBwcml2YXRlIG9uQ29tcGxldGUoKSB7XG4gICAgICAgIC8v5Yqg6L295LiJ57u05Zyw6Z2iXG4gICAgICAgIHZhciBncmlkID0gdGhpcy5zY2VuZS5hZGRDaGlsZChMYXlhLkxvYWRlci5nZXRSZXMoXCJyZXMvdGhyZWVEaW1lbi9zdGF0aWNNb2RlbC9ncmlkL3BsYW5lLmxoXCIpKSBhcyBMYXlhLlNwcml0ZTNEO1xuICAgICAgICAvL+WKoOi9veS6jOe7tOeMtOWtkFxuICAgICAgICB0aGlzLmxheWFNb25rZXkyRCA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuSW1hZ2UoXCJyZXMvdGhyZWVEaW1lbi9tb25rZXkucG5nXCIpKSBhcyBMYXlhLkltYWdlO1xuICAgICAgICAvL+W8gOWQr+WumuaXtuWZqOW+queOr1xuICAgICAgICBMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCB0aGlzLmFuaW1hdGUpO1xuICAgIH1cblx0XHRcblx0cHJpdmF0ZSBhbmltYXRlKCkge1xuICAgICAgICAvL+WPmOaNouS9jee9rlxuICAgICAgICB0aGlzLl9wb3NpdGlvbi54ID0gTWF0aC5zaW4odGhpcy5zY2FsZURlbHRhICs9IDAuMDEpO1xuICAgICAgICAvL+iuoeeul+S9jee9rlxuICAgICAgICB0aGlzLmNhbWVyYS52aWV3cG9ydC5wcm9qZWN0KHRoaXMuX3Bvc2l0aW9uLCB0aGlzLmNhbWVyYS5wcm9qZWN0aW9uVmlld01hdHJpeCwgdGhpcy5fb3V0UG9zKTtcbiAgICAgICAgdGhpcy5sYXlhTW9ua2V5MkQucG9zKHRoaXMuX291dFBvcy54IC8gTGF5YS5zdGFnZS5jbGllbnRTY2FsZVgsIHRoaXMuX291dFBvcy55IC8gTGF5YS5zdGFnZS5jbGllbnRTY2FsZVkpO1xuICAgIH1cdFxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG59IiwiaW1wb3J0IHtwaW5ndGFpdXRpbHN9IGZyb20gXCIuLi9XWFNESy9waW5ndGFpdXRpbHNcIjtcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcbmltcG9ydCB7UGxhdGZyb21UeXBlfSBmcm9tIFwiLi4vV1hTREsvUGxhdGZyb21UeXBlXCI7XG5cbi8qXG4qIOacrOWcsOaVsOaNrue8k+WtmOeuoeeQhuWZqFxuKi9cbmV4cG9ydCBjbGFzcyBMb2NhbERhdGFDb250cm9sIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXIge1xuICAgIHByaXZhdGUgc3RhdGljIGluczogTG9jYWxEYXRhQ29udHJvbDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBMb2NhbERhdGFDb250cm9sLmlucyA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogTG9jYWxEYXRhQ29udHJvbCB7XG4gICAgICAgIGlmIChMb2NhbERhdGFDb250cm9sLmlucyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsRGF0YUNvbnRyb2woKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTG9jYWxEYXRhQ29udHJvbC5pbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQoKTogdm9pZCB7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmt7vliqDmnKzlnLDnvJPlrZjmlbDmja4gb2JqZWN0XG4gICAgICogQHBhcmFtIGtleSBcbiAgICAgKiBAcGFyYW0gdmFsdWUgXG4gICAgICovXG4gICAgcHVibGljIEFkZERhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgdGhpcy5BZGRMb2NhbERhdGEoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6I635Y+W5pys5Zyw57yT5a2Y5pWw5o2uIG9iamVjdFxuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICovXG4gICAgcHVibGljIGdldE9iaihrZXk6IHN0cmluZyk6IGFueSBcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLkdldExvY2FsQ2FDaGVEYXRhKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5re75Yqg5pys5Zyw57yT5a2Y5pWw5o2uIHN0cmluZ1xuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICogQHBhcmFtIHZhbHVlIFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRzdHIoa2V5OiBzdHJpbmcsIHZhbHVlOnN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZENhY2hlU3RyKGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRudW0oIGtleTpzdHJpbmcsdmFsdWU6bnVtYmVyICk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5hZGRDYWNoZVN0cihrZXksIHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiOt+WPluacrOWcsOe8k+WtmOaVsOaNriBzdHJpbmdcbiAgICAgKiBAcGFyYW0ga2V5IFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRzdHIoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDYWNoZXN0cihrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiOt+WPluacrOWcsOe8k+WtmOaVsOaNriBudW1iZXJcbiAgICAgKiBAcGFyYW0ga2V5IFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRudW0oIGtleTpzdHJpbmcgKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5nZXRDYWNoZXN0cihrZXkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmuIXnkIbmjIflrprmnKzlnLDnvJPlrZjmlbDmja5cbiAgICAgKiBAcGFyYW0ga2V5IFxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVDYWNoZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZXNlbGVjdENhY2hlKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5riF55CG5omA5pyJ5pys5Zyw57yT5a2Y5pWw5o2uXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyQWxsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyQWxsQ2FjaGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgQWRkTG9jYWxEYXRhKGtleSwgdmFsdWUpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0b3JhZ2VTeW5jV1goa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIEdldExvY2FsQ2FDaGVEYXRhKGtleTogc3RyaW5nKTogYW55IFxuICAgIHtcbiAgICAgICAgdmFyIG9iajphbnk7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgb2JqID0gdGhpcy5nZXRTdG9yYWdlU3luY1dYKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgb2JqID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SlNPTihrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYoICFvYmogKVxuICAgICAgICB7XG4gICAgICAgICAgICBvYmogPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDYWNoZVN0cihrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQgXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcmFnZVN5bmNXWChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2FjaGVzdHIoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIjBcIjtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0U3RvcmFnZVN5bmNXWChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc3RyID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ciA9PSBudWxsIHx8IHN0ciA9PSBcIlwiKSBcbiAgICAgICAge1xuICAgICAgICAgICAgc3RyID0gXCIwXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3Zlc2VsZWN0Q2FjaGUoa2V5OiBzdHJpbmcpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVN0b3JhZ2VXWChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBjbGVhckFsbENhY2hlKCk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU3RvcmFnZVdYKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pys5Zyw5a2Y5YKoXG4gICAgICogQHBhcmFtIGtleSBcbiAgICAgKiBAcGFyYW0gZGF0YSBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U3RvcmFnZVN5bmNXWChrZXk6c3RyaW5nLCBkYXRhOmFueSkgXG4gICAge1xuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICBpZiggd3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICB3eC5zZXRTdG9yYWdlU3luYyhrZXksIGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIOiOt+WPluacrOWcsOWtmOWCqFxuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICovXG4gICAgcHVibGljIGdldFN0b3JhZ2VTeW5jV1goa2V5OnN0cmluZyk6YW55IFxuICAgIHtcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgaWYoIHd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHd4LmdldFN0b3JhZ2VTeW5jKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5LuO5pys5Zyw57yT5a2Y5Lit56e76Zmk5oyH5a6aIGtleVxuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVN0b3JhZ2VXWChrZXk6c3RyaW5nKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gucmVtb3ZlU3RvcmFnZShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5riF55CG5a2Y5YKo5pWw5o2uXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU3RvcmFnZVdYKCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNsZWFyU3RvcmFnZVN5bmMoKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNEYXRhQ29udHJvbFwiO1xuaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1Jlc291cmNlQ29udHJvbFwiO1xuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbmltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XG5pbXBvcnQge1ZpZXdBY3Rpb259IGZyb20gXCIuLi91dGlscy9WaWV3QWN0aW9uXCI7XG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XG5pbXBvcnQge0NvbXBvbmVudEV2ZW50RGF0YX0gZnJvbSBcIi4uL0RhdGEvQ29tcG9uZW50RXZlbnREYXRhXCI7XG5pbXBvcnQge0dhbWVQb29sfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9HYW1lUG9vbFwiO1xuaW1wb3J0IHtHbG9iYWxXYWl0aW5nfSBmcm9tIFwiLi4vR2xvYmFsV2FpdGluZ1wiO1xuXG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBjbGFzcyBQYW5lbEJhc2VDb250cm9sIGV4dGVuZHMgZmFpcnlndWkuV2luZG93IHtcbiAgICBzdGF0aWMgdmlld2JnVXJsOnN0cmluZyA9IFwiXCI7XG4gICAgaXNndWlkZWluZzpib29sZWFuPWZhbHNlO1xuICAgIHByaXZhdGUgUGFja2FnZU5hbWU6IHN0cmluZyA9IFwiXCI7XG4gICAgcHJpdmF0ZSBSZXNvdXJjZXNOYW1lOiBzdHJpbmcgPSBcIlwiO1xuICAgIHByaXZhdGUgX2lzQWRkcGFja2FnZTogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9pc2NhY2hlOiBib29sZWFuID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9BY3Rpb25UeXBlOnN0cmluZyA9IFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lO1xuXG4gICAgaXRlbV9wYW5lbDogZmFpcnlndWkuR0NvbXBvbmVudDtcbiAgICBpdGVtX2JnOiBmYWlyeWd1aS5HQ29tcG9uZW50O1xuICAgIHByaXZhdGUgX2NsaWNrQmc6IGZhaXJ5Z3VpLkdMb2FkZXI7XG5cbiAgICBwcml2YXRlIF9jbGlja0JnSXNDb2xzZTogbnVtYmVyID0gMDtcblxuICAgIHB1YmxpYyB2aWV3S2V5OiBhbnk7XG4gICAgcHVibGljIGdhbWVMYXllcjpzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDkuovku7blrrnlmahcbiAgICAgKi9cbiAgICBwcml2YXRlIEV2ZW50UmVzRGljOmFueSA9IHt9O1xuICAgIC8qKlxuICAgICAqIOWFqOWxgOS6i+S7tuWuueWZqFxuICAgICAqL1xuICAgIHByaXZhdGUgRXZlbnRHbG9iYWw6YW55ID0ge307XG5cbiAgICAvKipcbiAgICAgKiDnlYzpnaLliJ3lp4vljJZcbiAgICAgKiBAcGFyYW0gcGtnTmFtZSDljIXlkI1cbiAgICAgKiBAcGFyYW0gcmVzTmFtZSDnlYzpnaLlkI1cbiAgICAgKiBAcGFyYW0gaXNBZGRwYWNrYWdlIOaYr+WQpua3u+WKoOWMhSBcbiAgICAgKiBAcGFyYW0gQWN0aW9uVHlwZSDnlYzpnaLmiZPlvIDliqjnlLvnsbvlnotcbiAgICAgKiBAcGFyYW0gY2xpY2tCZ0lzQ29sc2Ug6buR6Imy6IOM5pmvIDA65peg6IOM5pmvIDE66IOM5pmv5peg5YWz6Zet5LqL5Lu2IDI66IOM5pmv5pyJ5YWz6Zet5LqL5Lu2XG4gICAgICogQHBhcmFtIGlzY2FjaGUg5piv5ZCm5re75Yqg5Yiw57yT5a2Y5rGg77yI5aaC5piv5Li6dHJ1ZSzliJnliqDlhaXov5vnvJPlrZjmsaDlrprml7bmoLnmja7mmK/lkKblvJXnlKjmuIXnkIbjgIIg6Iul5piv5Li6ZmFsc2XvvIzliJnkuI3muIXnkIblvZPliY3nvJPlrZjvvIzlpoLoi6XmuIXnkIbvvIzor7fmiYvliqjmuIXnkIYg77yJXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGtnTmFtZTogc3RyaW5nID0gXCJcIiwgcmVzTmFtZTogc3RyaW5nID0gXCJcIiwgaXNBZGRwYWNrYWdlOiBib29sZWFuID0gZmFsc2UsIFxuICAgICAgICAgICAgICAgIEFjdGlvblR5cGU6c3RyaW5nPVZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lLCBjbGlja0JnSXNDb2xzZTpudW1iZXI9MCwgaXNjYWNoZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5faXNjYWNoZSA9IGlzY2FjaGU7XG4gICAgICAgIHRoaXMuUGFja2FnZU5hbWUgPSBwa2dOYW1lO1xuICAgICAgICB0aGlzLlJlc291cmNlc05hbWUgPSByZXNOYW1lO1xuICAgICAgICB0aGlzLl9pc0FkZHBhY2thZ2UgPSBpc0FkZHBhY2thZ2U7XG4gICAgICAgIHRoaXMuX0FjdGlvblR5cGUgPSBBY3Rpb25UeXBlO1xuICAgICAgICB0aGlzLl9jbGlja0JnSXNDb2xzZSA9IGNsaWNrQmdJc0NvbHNlO1xuICAgICAgICB0aGlzLnNob3dNb2RhbFdhaXQoKTtcbiAgICB9XG5cblxuICAgIHByb3RlY3RlZCBSZXNvbHZlVUkocGtnbmFtZTogc3RyaW5nLCByZXNuYW1lOiBzdHJpbmcsIGlzYWRkcGFja2FnZTogYm9vbGVhbixBY3Rpb25UeXBlOnN0cmluZz1WaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZSwgY2xpY2tCZ0lzQ29sc2U6bnVtYmVyPTAsIGlzY2FjaGU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuUGFja2FnZU5hbWUgPSBwa2duYW1lO1xuICAgICAgICB0aGlzLlJlc291cmNlc05hbWUgPSByZXNuYW1lO1xuICAgICAgICB0aGlzLl9BY3Rpb25UeXBlID0gQWN0aW9uVHlwZTtcbiAgICAgICAgdGhpcy5fY2xpY2tCZ0lzQ29sc2UgPSBjbGlja0JnSXNDb2xzZTtcbiAgICAgICAgUmVzRGF0YUNvbnRyb2wuSW5zdGFuY2UuQWRkVmlld1BhY2tCeU5hbWUocGtnbmFtZSwgaXNhZGRwYWNrYWdlLCBpc2NhY2hlKTtcbiAgICAgICAgdGhpcy5jb250ZW50UGFuZSA9IGZhaXJ5Z3VpLlVJUGFja2FnZS5jcmVhdGVPYmplY3QocGtnbmFtZSwgcmVzbmFtZSkuYXNDb207XG4gICAgICAgIGZvciAodmFyIHN0ciBpbiB0aGlzLmNvbnRlbnRQYW5lLl9jaGlsZHJlbikge1xuICAgICAgICAgICAgdmFyIGl0ZW06IGZhaXJ5Z3VpLkdPYmplY3QgPSB0aGlzLmNvbnRlbnRQYW5lLl9jaGlsZHJlbltzdHJdO1xuICAgICAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PSBcIml0ZW1fcGFuZWxcIikge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtcGFuZWw6IGZhaXJ5Z3VpLkdDb21wb25lbnQgPSBpdGVtIGFzIGZhaXJ5Z3VpLkdDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1wYW5lbCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzdHIxIGluIGl0ZW1wYW5lbC5fY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtcGFuZWxJdGVtOiBmYWlyeWd1aS5HT2JqZWN0ID0gaXRlbXBhbmVsLl9jaGlsZHJlbltzdHIxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbaXRlbXBhbmVsSXRlbS5uYW1lXSA9IGl0ZW1wYW5lbEl0ZW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGhpc1tpdGVtLm5hbWVdID0gaXRlbTtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fcGFuZWwgPSBpdGVtIGFzIGZhaXJ5Z3VpLkdDb21wb25lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzW2l0ZW0ubmFtZV0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U2l6ZShmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoLCBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodCk7XG4gICAgICAgIHRoaXMuY29udGVudFBhbmUuc2V0UGl2b3QoMC41LDAuNSk7XG4gICAgICAgIHRoaXMuc2V0UGl2b3QoMC41LCAwLjUpO1xuICAgICAgICB0aGlzLnNldGNsaWNrQmdJc0NvbHNlKCk7XG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcbiAgICAgICAgdGhpcy5TaG93Vmlld0FDVElPTigpO1xuICAgIH1cbiAgICBcblxuICAgIHByaXZhdGUgX2xvYWRUYXJnZXQ6YW55O1xuICAgIHByaXZhdGUgX29uTG9hZGVkSGFuZGxlcjpGdW5jdGlvbjtcbiAgICAvKipcbiAgICAgKiDliqDovb11aVxuICAgICAqIEBwYXJhbSBncm91cE5hbWUg57uE5ZCNXG4gICAgICogQHBhcmFtIHRhcmdldCAgICDkvZznlKjln59cbiAgICAgKiBAcGFyYW0gb25Mb2FkZWRIYW5kbGVyIOWKoOi9veWujOaIkOWbnuiwg+WHveaVsFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBMb2FkVmlld1VJKGdyb3VwTmFtZTogc3RyaW5nLCB0YXJnZXQ6IGFueSwgb25Mb2FkZWRIYW5kbGVyOiBGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9sb2FkVGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLl9vbkxvYWRlZEhhbmRsZXIgPSBvbkxvYWRlZEhhbmRsZXI7XG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkR3JvdXAoZ3JvdXBOYW1lLCB0aGlzLCB0aGlzLkxvYWRDb21wbGV0ZSk7XG4gICAgfVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgY3JlYXRlTGFiZWwoY29sb3I6IHN0cmluZywgc3Ryb2tlQ29sb3I6IHN0cmluZyk6TGF5YS5MYWJlbCB7XG4gICAgICAgIGNvbnN0IFNUUk9LRV9XSURUSDogbnVtYmVyID0gNDtcbiAgICAgICAgdmFyIGxhYmVsOkxheWEuTGFiZWwgPSBuZXcgTGF5YS5MYWJlbCgpO1xuICAgICAgICBsYWJlbC5mb250ID0gXCJNaWNyb3NvZnQgWWFIZWlcIjtcbiAgICAgICAgbGFiZWwudGV4dCA9IFwiU0FNUExFIERFTU9cIjtcbiAgICAgICAgbGFiZWwuZm9udFNpemUgPSAzMDtcbiAgICAgICAgbGFiZWwuY29sb3IgPSBjb2xvcjtcbiAgICAgICAgaWYgKHN0cm9rZUNvbG9yKSB7XG4gICAgICAgICAgICBsYWJlbC5zdHJva2UgPSBTVFJPS0VfV0lEVEg7XG4gICAgICAgICAgICBsYWJlbC5zdHJva2VDb2xvciA9IHN0cm9rZUNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQobGFiZWwpO1xuICAgICAgICByZXR1cm4gbGFiZWw7XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuICAgIC8qKlxuICAgICAqIOWKoOi9vei1hOa6kOaVsOe7hFxuICAgICAqIEBwYXJhbSB1cmxzIOi1hOa6kOaVsOe7hFxuICAgICAqIEBwYXJhbSB0YXJnZXQg5L2c55So5Z+fXG4gICAgICogQHBhcmFtIG9uTG9hZGVkSGFuZGxlciDliqDovb3lrozmiJDlm57osIPlh73mlbBcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbG9hZFVpYnlBcnIodXJsczogQXJyYXk8YW55PiwgdGFyZ2V0OiBhbnksIG9uTG9hZGVkSGFuZGxlcjogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgLy8gdGhpcy5zaG93TW9kYWxXYWl0KCk7XG4gICAgICAgIHRoaXMuX2xvYWRUYXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuX29uTG9hZGVkSGFuZGxlciA9IG9uTG9hZGVkSGFuZGxlcjtcbiAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLkxvYWRlcnModXJscywgdGhpcywgdGhpcy5Mb2FkQ29tcGxldGUpOyAgICBcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBjcmVhdGVSYWRpb0dyb3VwKHNraW46IHN0cmluZyk6TGF5YS4gUmFkaW9Hcm91cCB7XG4gICAgICAgIHZhciByZzpMYXlhLiBSYWRpb0dyb3VwID0gbmV3IExheWEuUmFkaW9Hcm91cCgpO1xuICAgICAgICByZy5za2luID0gc2tpbjtcblxuICAgICAgICByZy5zcGFjZSA9IDcwO1xuICAgICAgICByZy5kaXJlY3Rpb24gPSBcInZcIjtcblxuICAgICAgICByZy5sYWJlbHMgPSBcIkl0ZW0xLCBJdGVtMiwgSXRlbTNcIjtcbiAgICAgICAgcmcubGFiZWxDb2xvcnMgPSBcIiM3ODc4NzgsI2QzZDNkMywjRkZGRkZGXCI7XG4gICAgICAgIHJnLmxhYmVsU2l6ZSA9IDIwO1xuICAgICAgICByZy5sYWJlbEJvbGQgPSB0cnVlO1xuICAgICAgICByZy5sYWJlbFBhZGRpbmcgPSBcIjUsMCwwLDVcIjtcblxuICAgICAgICByZy5zZWxlY3RIYW5kbGVyID0gbmV3IExheWEuSGFuZGxlcih0aGlzLCB0aGlzLm9uU2VsZWN0Q2hhbmdlKTtcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChyZyk7XG5cbiAgICAgICAgcmV0dXJuIHJnO1xuICAgIH1cbiAgICBwcml2YXRlIG9uU2VsZWN0Q2hhbmdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLkvaDpgInmi6nkuobnrKwgXCIgKyAoaW5kZXggKyAxKSArIFwiIOmhuVwiKTtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5cbiAgICBwcml2YXRlIExvYWRDb21wbGV0ZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl9sb2FkVGFyZ2V0ICYmIHRoaXMuX29uTG9hZGVkSGFuZGxlciApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX29uTG9hZGVkSGFuZGxlci5jYWxsKCB0aGlzLl9sb2FkVGFyZ2V0ICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRWZmZWN0UGFja2FnZShwYWNrYWdlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIFJlc0RhdGFDb250cm9sLkluc3RhbmNlLkNsZWFyUGFja0J5TmFtZShwYWNrYWdlTmFtZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldHBhbmVsQ29udHJvbGxlcihuYW1lOiBzdHJpbmcpOiBmYWlyeWd1aS5Db250cm9sbGVyIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlbV9wYW5lbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbV9wYW5lbC5nZXRDb250cm9sbGVyKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIHNldHVwKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNyZWF0ZUxhYmVsKFwiI0ZGRkZGRlwiLCBudWxsKS5wb3MoMzAsIDUwKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiMwMEZGRkZcIiwgbnVsbCkucG9zKDI5MCwgNTApO1xuICAgICAgICB0aGlzLmNyZWF0ZUxhYmVsKFwiI0ZGRkYwMFwiLCBcIiNGRkZGRkZcIikucG9zKDMwLCAxMDApO1xuICAgICAgICB0aGlzLmNyZWF0ZUxhYmVsKFwiIzAwMDAwMFwiLCBcIiNGRkZGRkZcIikucG9zKDI5MCwgMTAwKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiNGRkZGRkZcIiwgXCIjMDBGRkZGXCIpLnBvcygzMCwgMTUwKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiMwMDgwRkZcIiwgXCIjMDBGRkZGXCIpLnBvcygyOTAsIDE1MCk7XG4gICAgfVxuICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICBcbiAgICBwcm90ZWN0ZWQgZ2V0cGFuZWxUcmFuc2l0aW9uKG5hbWU6IHN0cmluZyk6IGZhaXJ5Z3VpLlRyYW5zaXRpb24ge1xuICAgICAgICBpZiAodGhpcy5pdGVtX3BhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtX3BhbmVsLmdldFRyYW5zaXRpb24obmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldENoaWxkZm9ybUNvbnRlbnRQYW5lbCggbmFtZTpzdHJpbmcgKTpmYWlyeWd1aS5HT2JqZWN0XG4gICAge1xuICAgICAgICBpZih0aGlzLmNvbnRlbnRQYW5lKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRQYW5lLmdldENoaWxkKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8q55WM6Z2i5Yid5aeL5YyWKi9cbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5vbkluaXQoKTtcbiAgICAgICAgaWYgKHRoaXMuUGFja2FnZU5hbWUgIT0gXCJcIiAmJiB0aGlzLlJlc291cmNlc05hbWUgIT0gXCJcIikge1xuICAgICAgICAgICAgdGhpcy5SZXNvbHZlVUkodGhpcy5QYWNrYWdlTmFtZSwgdGhpcy5SZXNvdXJjZXNOYW1lLCB0aGlzLl9pc0FkZHBhY2thZ2UsdGhpcy5fQWN0aW9uVHlwZSx0aGlzLl9jbGlja0JnSXNDb2xzZSwgdGhpcy5faXNjYWNoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL+ino+aekHVpXG4gICAgXG5cbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXG4gICAge1xuXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcbiAgICB7XG5cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgU2hvd1ZpZXdBQ1RJT04oKTp2b2lkIFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCB0aGlzLl9BY3Rpb25UeXBlIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZTpcbiAgICAgICAgICAgICAgICB0aGlzLndpbmRvd2FubW9lbmQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfYWRkbW92ZVRvTWlkZGxlOlxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFBhbmUueCA9IGZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGg7XG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLmNvbnRlbnRQYW5lLCB7IHg6MCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLndpbmRvd2FubW9lbmQpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfYWRkbW92ZUZyb21Cb3R0b206XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50UGFuZS55ID0gZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLmNvbnRlbnRQYW5lLCB7IHk6MCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLndpbmRvd2FubW9lbmQpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfYWRkc2NhbGVNaW5Ub01heDpcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnNjYWxlWCA9IHRoaXMuY29udGVudFBhbmUuc2NhbGVZID0gMC4wMTtcbiAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMuY29udGVudFBhbmUsIHsgc2NhbGVYOjEsc2NhbGVZOjEgfSwzMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy53aW5kb3dhbm1vZW5kKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2hlY2tCb3goc2tpbjogc3RyaW5nKTpMYXlhLkNoZWNrQm94IHtcbiAgICAgICAgdmFyIGNiOkxheWEuIENoZWNrQm94ID0gbmV3IExheWEuQ2hlY2tCb3goc2tpbik7XG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoY2IpO1xuXG4gICAgICAgIGNiLmxhYmVsQ29sb3JzID0gXCJ3aGl0ZVwiO1xuICAgICAgICBjYi5sYWJlbFNpemUgPSAyMDtcbiAgICAgICAgY2IubGFiZWxGb250ID0gXCJNaWNyb3NvZnQgWWFIZWlcIjtcbiAgICAgICAgY2IubGFiZWxQYWRkaW5nID0gXCIzLDAsMCw1XCI7XG5cbiAgICAgICAgcmV0dXJuIGNiO1xuICAgIH1cbiAgICBwcml2YXRlIHVwZGF0ZUxhYmVsKGNoZWNrQm94OkxheWEuQ2hlY2tCb3gpOiB2b2lkIHtcbiAgICAgICAgY2hlY2tCb3gubGFiZWwgPSBjaGVja0JveC5zZWxlY3RlZCA/IFwi5bey6YCJ5LitXCIgOiBcIuacqumAieS4rVwiO1xuICAgIH1cbiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5cbiAgICBwcml2YXRlIHdpbmRvd2FubW9lbmQoKTp2b2lkXG4gICAge1xuICAgICAgICBMYXlhLnRpbWVyLmNhbGxMYXRlciggdGhpcyx0aGlzLm9uU2hvd1ZpZXcgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25TaG93VmlldygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbFdhaXQoKTtcbiAgICAgICAgdGhpcy5zaG93Q2xpY2tCZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd0NsaWNrQmcoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5fY2xpY2tCZyApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcuYWxwaGEgPSAwLjU1O1xuICAgICAgICAgICAgaWYoIHRoaXMuX2NsaWNrQmdJc0NvbHNlPT0yICYmICF0aGlzLmhhc0NsaWNrTGlzdGVuZXIoKSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5vbkNsaWNrKHRoaXMsIHRoaXMuQ2xpY2tFeGl0Vmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKirngrnlh7vlhbPpl63pobXpnaLmjInpkq4gKi9cbiAgICBwdWJsaWMgQ2xpY2tFeGl0VmlldygpOnZvaWRcbiAgICB7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCB0aGlzLnZpZXdLZXksdHJ1ZSApO1xuICAgIH1cblxuXG4gICAgLyrojrflj5bnrqHnkIbmlbDmja7mqKHlnZcqL1xuICAgIHB1YmxpYyBnZXRQcm94eShkOiBhbnkpOiBhbnkge1xuICAgICAgICByZXR1cm4gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKGQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOeVjOmdouWFs+mXreS6i+S7tlxuICAgICAqL1xuICAgIHB1YmxpYyBFeGl0VmlldyggQWN0aW9uVHlwZTpzdHJpbmcgPSBcIlwiICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuX2NsaWNrQmcgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9jbGlja0JnLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiggQWN0aW9uVHlwZSA9PSBcIlwiIClcbiAgICAgICAge1xuICAgICAgICAgICAgc3dpdGNoKCB0aGlzLl9BY3Rpb25UeXBlIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lOlxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdG9yeSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9hZGRtb3ZlVG9NaWRkbGU6XG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHg6ZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLmRlc3RvcnkpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfYWRkbW92ZUZyb21Cb3R0b206XG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHk6ZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQgfSwzMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5kZXN0b3J5KSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX2FkZHNjYWxlTWluVG9NYXg6XG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHNjYWxlWDowLjAxLHNjYWxlWTowLjAxIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBzd2l0Y2goIEFjdGlvblR5cGUgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdG9yeSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX3JlbW92ZXNjYWxlTWF4VG9NaW46XG4gICAgICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcywgeyBzY2FsZVg6MC4wMSxzY2FsZVk6MC4wMSB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLmRlc3RvcnkpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9yZW1vdmVtb3ZlVG9SaWdodDpcbiAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMsIHsgeDpmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gIFxuXG4gICAgcHVibGljIGdldFRyYW5zaXRpb25CeU5hbWUoaWQ6IHN0cmluZyk6IGZhaXJ5Z3VpLlRyYW5zaXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRUcmFuc2l0aW9uKGlkKTtcbiAgICB9XG5cbiAgICBcblxuICAgIC8qKuazqOWGjOS6i+S7tiAqL1xuICAgIHB1YmxpYyBkaXNwYWNoZURhdGF0cmlnZ2VyKHR5cGU6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KHR5cGUsIGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOazqOWGjOWFqOWxgOS6i+S7tlxuICAgICAqIEBwYXJhbSB0eXBlIFxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciBcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkRGF0YUV2ZW50KHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYoICF0aGlzLkV2ZW50R2xvYmFsLmhhc093blByb3BlcnR5KCB0eXBlICkgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSBHYW1lUG9vbC5HZXRJdGVtKCBDb21wb25lbnRFdmVudERhdGEuUmVzRGljVmFsdWUgKTtcbiAgICAgICAgICAgICAgICB0aGlzLkV2ZW50R2xvYmFsW3R5cGVdID0gdm87XG4gICAgICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgdm8udGhpc09iamVjdCA9IHRoaXNPYmplY3Q7XG4gICAgICAgICAgICAgICAgdm8ubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICAgICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNPYmplY3QsbGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOenu+mZpOWFqOWxgOS6i+S7tlxuICAgICAqIEBwYXJhbSB0eXBlIFxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciBcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgQ2xlYXJFdmVudERhdGEodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICBpZiggdGhpcy5FdmVudEdsb2JhbFt0eXBlXSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSB0aGlzLkV2ZW50R2xvYmFsW3R5cGVdO1xuICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzT2JqZWN0LCBsaXN0ZW5lcik7XG4gICAgICAgICAgICB2by5jbGVhcigpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuRXZlbnRHbG9iYWxbdHlwZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnp7vpmaTnu4Tku7bkuovku7ZcbiAgICAgKiBAcGFyYW0gdHlwZSDml7bpl7TnsbvlnotcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tvYmog5L2c55So5Z+fXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciDkuovku7blm57osIMgXG4gICAgICovXG4gICAgcHJvdGVjdGVkIENsZWFyRXZlbnRCeVR5cGUoIHRhcmdldDphbnksIHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24gKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGFyZ2V0ICYmIHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxDb21wb25lbnRFdmVudERhdGE+ID0gdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV07XG4gICAgICAgICAgICB2YXIgaTpudW1iZXI9MDtcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IGFyci5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhO1xuICAgICAgICAgICAgZm9yKGk7aTxudW1zO2krKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2byA9IGFycltpXTtcbiAgICAgICAgICAgICAgICBpZiggdm8gJiYgdm8udHlwZT09dHlwZSAmJiB2by50aGlzT2JqZWN0ID09IHRoaXNPYmplY3QgJiYgdm8ubGlzdGVuZXIgPT0gbGlzdGVuZXIgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm9mZiggdHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyICk7XG4gICAgICAgICAgICAgICAgICAgIHZvLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDms6jlhoznu4Tku7bkuovku7bvvIzosIPnlKjmraTmlrnms5XvvIznlYzpnaLlhbPpl63kvJroh6rliqjnp7vpmaRcbiAgICAgKiBAcGFyYW0gdHlwZSDml7bpl7TnsbvlnotcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tvYmog5L2c55So5Z+fXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciDkuovku7blm57osINcbiAgICAgKi9cbiAgICBwdWJsaWMgQWRkRXZlbnRCeVR5cGUoIHRhcmdldDphbnksIHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sYXJnczphbnk9bnVsbCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRhcmdldCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBudWxsIHx8IHRhcmdldC5uYW1lID09IFwiXCIgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRocm93IFwiYmFzZXZpZXcgYWRkTGlzdGVuZXIgdGFyZ2V0Lm5hbWUgaXMgbnVsbFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YSA9IEdhbWVQb29sLkdldEl0ZW0oIENvbXBvbmVudEV2ZW50RGF0YS5SZXNEaWNWYWx1ZSApO1xuICAgICAgICAgICAgdm8udGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XG4gICAgICAgICAgICB2by50aGlzT2JqZWN0ID0gdGhpc09iamVjdDtcbiAgICAgICAgICAgIHZvLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgICAgICAgICBpZiggIXRoaXMuRXZlbnRSZXNEaWMuaGFzT3duUHJvcGVydHkoIHRhcmdldC5uYW1lICkgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYm86Ym9vbGVhbiA9IHRoaXMuSnVkZ2VJc0hhdmVFdmVudCggdGFyZ2V0LHR5cGUgKTtcbiAgICAgICAgICAgIGlmKCAhYm8gKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRhcmdldC5vbiggdHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyLGFyZ3MgKTtcbiAgICAgICAgICAgICAgICB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXS5wdXNoKCB2byApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoq5Yik5pat5piv5ZCm5ZCr5pyJ5LqL5Lu2ICovXG4gICAgcHVibGljIEp1ZGdlSXNIYXZlRXZlbnQoIHRhcmdldDphbnksdHlwZTogc3RyaW5nICk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgdmFyIGV2ZW50QXJyOkFycmF5PENvbXBvbmVudEV2ZW50RGF0YT47XG4gICAgICAgIGV2ZW50QXJyID0gdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV07XG4gICAgICAgIHZhciBjaGlsZHZvOkNvbXBvbmVudEV2ZW50RGF0YTtcbiAgICAgICAgZm9yKCB2YXIgcyBpbiBldmVudEFyciApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNoaWxkdm8gPSBldmVudEFycltzXTtcbiAgICAgICAgICAgIGlmKCBjaGlsZHZvICYmIGNoaWxkdm8udHlwZSA9PSB0eXBlIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgXG4gICAgcHVibGljIGdldENvbUJ5SWQoaWQ6IHN0cmluZyk6IGZhaXJ5Z3VpLkdDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRDaGlsZChpZCkuYXNDb207XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbnRyb2xsZXJCeUJhbWUoaWQ6IHN0cmluZyk6IGZhaXJ5Z3VpLkNvbnRyb2xsZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRDb250cm9sbGVyKGlkKTtcbiAgICB9XG4gICAgXG5cbiAgICAvKipcbiAgICAgKiDnp7vpmaTmiYDmnInnu4Tku7bkuovku7ZcbiAgICAgKi9cbiAgICBwdWJsaWMgQ2xlYXJFdmVudCgpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKHRoaXMuRXZlbnRSZXNEaWMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBzO1xuICAgICAgICAgICAgdmFyIGRpY3Q6YW55ID0gdGhpcy5FdmVudFJlc0RpYztcbiAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8Q29tcG9uZW50RXZlbnREYXRhPjtcbiAgICAgICAgICAgIHZhciBpOm51bWJlcjtcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IDA7XG4gICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhO1xuICAgICAgICAgICAgZm9yKCBzIGluIGRpY3QgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFyciA9IGRpY3Rbc107XG4gICAgICAgICAgICAgICAgaWYoIGFyciAmJiBhcnIubGVuZ3RoID4gMCApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpPTA7XG4gICAgICAgICAgICAgICAgICAgIG51bXMgPSBhcnIubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBmb3IoIGk9bnVtcy0xO2k+PTA7aS0tIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm8gPSBhcnJbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdm8gKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2by50YXJnZXQgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm8udGFyZ2V0Lm9mZiggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKCBpLDEgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5FdmVudFJlc0RpY1tzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLkV2ZW50UmVzRGljID0ge307XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyRXZlbnQoKTp2b2lkXG4gICAge1xuXG4gICAgfVxuXG4gICAgLyog6ZSA5q+BKi9cbiAgICBwdWJsaWMgZGVzdG9yeSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhckV2ZW50KCk7XG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbFdhaXQoKTtcbiAgICAgICAgdGhpcy5DbGVhckdsb2JhbEV2ZW50KCk7XG4gICAgICAgIHRoaXMuQ2xlYXJFdmVudCgpO1xuICAgICAgICB0aGlzLl9sb2FkVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25Mb2FkZWRIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgTGF5YS5Ud2Vlbi5jbGVhclR3ZWVuKCB0aGlzICk7XG4gICAgICAgIFJlc0RhdGFDb250cm9sLkluc3RhbmNlLkNsZWFyUGFja0J5TmFtZSh0aGlzLlBhY2thZ2VOYW1lLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuUGFja2FnZU5hbWUgPSBudWxsO1xuICAgICAgICB0aGlzLlJlc291cmNlc05hbWUgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fY2xpY2tCZykge1xuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5vZmZDbGljayh0aGlzLCB0aGlzLkNsaWNrRXhpdFZpZXcpO1xuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jbGlja0JnID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdLZXkgPSBudWxsO1xuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBzZXRjbGlja0JnSXNDb2xzZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93aW5nICYmIHRoaXMuX2NsaWNrQmdJc0NvbHNlID4gMCAmJiB0aGlzLmNvbnRlbnRQYW5lKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NsaWNrQmcgJiYgUGFuZWxCYXNlQ29udHJvbC52aWV3YmdVcmwgIT0gXCJcIiApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnID0gbmV3IGZhaXJ5Z3VpLkdMb2FkZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLnRvdWNoYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5zZXRTaXplKGZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGgsIGZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLnVybCA9IFBhbmVsQmFzZUNvbnRyb2wudmlld2JnVXJsO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcuZmlsbCA9IGZhaXJ5Z3VpLkxvYWRlckZpbGxUeXBlLlNjYWxlRnJlZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLmFscGhhID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLmFkZENoaWxkQXQodGhpcy5fY2xpY2tCZywgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIOenu+mZpOaJgOacieWFqOWxgOS6i+S7tlxuICAgICAqL1xuICAgIHB1YmxpYyBDbGVhckdsb2JhbEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuRXZlbnRHbG9iYWwgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcztcbiAgICAgICAgICAgIHZhciBkaWN0OmFueSA9IHRoaXMuRXZlbnRHbG9iYWw7XG4gICAgICAgICAgICBmb3IoIHMgaW4gZGljdCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YSA9IGRpY3Rbc107XG4gICAgICAgICAgICAgICAgaWYoIHZvIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2xlYXJFdmVudERhdGEoIHZvLnR5cGUsdm8udGhpc09iamVjdCx2by5saXN0ZW5lciApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLkV2ZW50R2xvYmFsPXt9O1xuICAgIH1cbn0iLCJpbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xuaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWNcIjtcbmltcG9ydCB7Q29tcG9uZW50RXZlbnREYXRhfSBmcm9tIFwiLi4vRGF0YS9Db21wb25lbnRFdmVudERhdGFcIjtcbmltcG9ydCB7R2FtZVBvb2x9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0dhbWVQb29sXCI7XG5cbmV4cG9ydCBjbGFzcyBQYW5lbENoaWxkQ29udHJvbCBleHRlbmRzIGZhaXJ5Z3VpLkdDb21wb25lbnQgXG57XG4gICAgLyoqXG4gICAgICog5LqL5Lu25a655ZmoXG4gICAgICovXG4gICAgcHJpdmF0ZSBFdmVudFJlc0RpYzphbnkgPSB7fTtcbiAgICAvKipcbiAgICAgKiDlhajlsYDkuovku7blrrnlmahcbiAgICAgKi9cbiAgICBwcml2YXRlIEV2ZW50R2xvYmFsOmFueSA9IHt9O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOenu+mZpOaJgOaciee7hOS7tuS6i+S7tlxuICAgICAqL1xuICAgIHB1YmxpYyBDbGVhckV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYodGhpcy5FdmVudFJlc0RpYylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHM7XG4gICAgICAgICAgICB2YXIgZGljdDphbnkgPSB0aGlzLkV2ZW50UmVzRGljO1xuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxDb21wb25lbnRFdmVudERhdGE+O1xuICAgICAgICAgICAgdmFyIGk6bnVtYmVyO1xuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gMDtcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGE7XG4gICAgICAgICAgICBmb3IoIHMgaW4gZGljdCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXJyID0gZGljdFtzXTtcbiAgICAgICAgICAgICAgICBpZiggYXJyICYmIGFyci5sZW5ndGggPiAwIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGk9MDtcbiAgICAgICAgICAgICAgICAgICAgbnVtcyA9IGFyci5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGZvciggaT1udW1zLTE7aT49MDtpLS0gKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2byA9IGFycltpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2byApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHZvLnRhcmdldCApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2by50YXJnZXQub2ZmKCB2by50eXBlLHZvLnRoaXNPYmplY3Qsdm8ubGlzdGVuZXIgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm8uY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLkV2ZW50UmVzRGljW3NdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuRXZlbnRSZXNEaWMgPSB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuQ2xlYXJHbG9iYWxFdmVudCgpO1xuICAgICAgICB0aGlzLkNsZWFyRXZlbnQoKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RGcm9tWE1MKHhtbDogYW55KTogdm9pZCB7XG4gICAgICAgIHN1cGVyLmNvbnN0cnVjdEZyb21YTUwoeG1sKTtcbiAgICAgICAgZm9yICh2YXIgc3RyIGluIHRoaXMuX2NoaWxkcmVuKSB7XG4gICAgICAgICAgICB2YXIgaXRlbTogZmFpcnlndWkuR09iamVjdCA9IHRoaXMuX2NoaWxkcmVuW3N0cl07XG4gICAgICAgICAgICB0aGlzW2l0ZW0ubmFtZV0gPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Jbml0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOiB2b2lkIHtcblxuICAgIH1cblxuICAgIC8q6I635Y+W566h55CG5pWw5o2u5qih5Z2XKi9cbiAgICBwdWJsaWMgZ2V0UHJveHkoZDogYW55KTogYW55IHtcbiAgICAgICAgcmV0dXJuIFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbihkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGlzcGFjaGVEYXRhdHJpZ2dlcih0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCh0eXBlLCBkYXRhKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFzRGF0YUV2ZW50KHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gRGlzcGF0Y2hlck1hbmFnZXIuaGFzRXZlbnRMaXN0ZW5lcih0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDms6jlhozlhajlsYDkuovku7ZcbiAgICAgKiBAcGFyYW0gdHlwZSBcbiAgICAgKiBAcGFyYW0gdGhpc09iamVjdCBcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgXG4gICAgICovXG4gICAgcHJvdGVjdGVkIEFkZEV2ZW50RGF0YSh0eXBlOiBzdHJpbmcsIHRoaXNPYmplY3Q6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmKCAhdGhpcy5FdmVudEdsb2JhbC5oYXNPd25Qcm9wZXJ0eSggdHlwZSApIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YSA9IEdhbWVQb29sLkdldEl0ZW0oIENvbXBvbmVudEV2ZW50RGF0YS5SZXNEaWNWYWx1ZSApO1xuICAgICAgICAgICAgdGhpcy5FdmVudEdsb2JhbFt0eXBlXSA9IHZvO1xuICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XG4gICAgICAgICAgICB2by50aGlzT2JqZWN0ID0gdGhpc09iamVjdDtcbiAgICAgICAgICAgIHZvLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsdGhpc09iamVjdCxsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICAgICAgcHJpdmF0ZSBESUFMT0dfV0lEVEg6IG51bWJlciA9IDIyMDtcbiAgICAgICAgcHJpdmF0ZSBESUFMT0dfSEVJR0hUOiBudW1iZXIgPSAyNzU7XG4gICAgICAgIHByaXZhdGUgQ0xPU0VfQlROX1dJRFRIOiBudW1iZXIgPSA0MztcbiAgICAgICAgcHJpdmF0ZSBDTE9TRV9CVE5fUEFERElORzogbnVtYmVyID0gNTtcbiAgICAgICAgcHJpdmF0ZSBhc3NldHM6IEFycmF5PHN0cmluZz47XG5cbiAgICAgICAgcHJpdmF0ZSBvblNraW5Mb2FkQ29tcGxldGUoKTogdm9pZCB7XG4gICAgICAgICAgICB2YXIgZGlhbG9nOkxheWEuIERpYWxvZyA9IG5ldyBMYXlhLkRpYWxvZygpO1xuXG4gICAgICAgICAgICB2YXIgYmc6TGF5YS5JbWFnZSA9IG5ldyBMYXlhLkltYWdlKHRoaXMuYXNzZXRzWzBdKTtcbiAgICAgICAgICAgIGRpYWxvZy5hZGRDaGlsZChiZyk7XG4gICAgICAgICAgICB2YXIgYnV0dG9uOkxheWEuQnV0dG9uID0gbmV3IExheWEuQnV0dG9uKHRoaXMuYXNzZXRzWzFdKTtcbiAgICAgICAgICAgIC8vIGJ1dHRvbi5uYW1lID0gRGlhbG9nLkNMT1NFO1xuICAgICAgICAgICAgYnV0dG9uLnBvcyh0aGlzLkRJQUxPR19XSURUSCAtIHRoaXMuQ0xPU0VfQlROX1dJRFRIIC0gdGhpcy5DTE9TRV9CVE5fUEFERElORywgdGhpcy5DTE9TRV9CVE5fUEFERElORyk7XG4gICAgICAgICAgICBkaWFsb2cuYWRkQ2hpbGQoYnV0dG9uKTtcblxuICAgICAgICAgICAgZGlhbG9nLmRyYWdBcmVhID0gXCIwLDAsXCIgKyB0aGlzLkRJQUxPR19XSURUSCArIFwiLFwiICsgdGhpcy5ESUFMT0dfSEVJR0hUO1xuICAgICAgICAgICAgZGlhbG9nLnNob3coKTtcbiAgICAgICAgfVxuICAgIFxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5cbiAgICAvKipcbiAgICAgKiDnp7vpmaTlhajlsYDkuovku7ZcbiAgICAgKiBAcGFyYW0gdHlwZSBcbiAgICAgKiBAcGFyYW0gdGhpc09iamVjdCBcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlbW92ZURhdGFFdmVudCh0eXBlOiBzdHJpbmcsIHRoaXNPYmplY3Q6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmKCB0aGlzLkV2ZW50R2xvYmFsW3R5cGVdIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YSA9IHRoaXMuRXZlbnRHbG9iYWxbdHlwZV07XG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNPYmplY3QsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIHZvLmNsZWFyKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5FdmVudEdsb2JhbFt0eXBlXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOazqOWGjOe7hOS7tuS6i+S7tu+8jOiwg+eUqOatpOaWueazle+8jOeVjOmdouWFs+mXreS8muiHquWKqOenu+mZpFxuICAgICAqIEBwYXJhbSB0eXBlIOaXtumXtOexu+Wei1xuICAgICAqIEBwYXJhbSBjYWxsYmFja29iaiDkvZznlKjln59cbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyIOS6i+S7tuWbnuiwg1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBBZGRFdmVudEJ5VHlwZSggdGFyZ2V0OmFueSwgdHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbixhcmdzOmFueT1udWxsKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGFyZ2V0IClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIHRhcmdldC5uYW1lID09IG51bGwgfHwgdGFyZ2V0Lm5hbWUgPT0gXCJcIiApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgXCJjaGlsZGJhc2V2aWV3IGFkZExpc3RlbmVyIHRhcmdldC5uYW1lIGlzIG51bGxcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSBHYW1lUG9vbC5HZXRJdGVtKCBDb21wb25lbnRFdmVudERhdGEuUmVzRGljVmFsdWUgKTtcbiAgICAgICAgICAgIHZvLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICAgIHZvLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgdm8udGhpc09iamVjdCA9IHRoaXNPYmplY3Q7XG4gICAgICAgICAgICB2by5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgICAgICAgICAgaWYoICF0aGlzLkV2ZW50UmVzRGljLmhhc093blByb3BlcnR5KCB0YXJnZXQubmFtZSApIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGJvOmJvb2xlYW4gPSB0aGlzLkp1ZGdlSXNIYXZlRXZlbnQoIHRhcmdldCx0eXBlICk7XG4gICAgICAgICAgICBpZiggIWJvIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQub24oIHR5cGUsdGhpc09iamVjdCxsaXN0ZW5lcixhcmdzICk7XG4gICAgICAgICAgICAgICAgdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV0ucHVzaCggdm8gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBKdWRnZUlzSGF2ZUV2ZW50KCB0YXJnZXQ6YW55LHR5cGU6IHN0cmluZyApOmJvb2xlYW5cbiAgICB7XG4gICAgICAgIHZhciBldmVudEFycjpBcnJheTxDb21wb25lbnRFdmVudERhdGE+O1xuICAgICAgICBldmVudEFyciA9IHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdO1xuICAgICAgICB2YXIgY2hpbGR2bzpDb21wb25lbnRFdmVudERhdGE7XG4gICAgICAgIGZvciggdmFyIHMgaW4gZXZlbnRBcnIgKVxuICAgICAgICB7XG4gICAgICAgICAgICBjaGlsZHZvID0gZXZlbnRBcnJbc107XG4gICAgICAgICAgICBpZiggY2hpbGR2byAmJiBjaGlsZHZvLnR5cGUgPT0gdHlwZSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOenu+mZpOe7hOS7tuS6i+S7tlxuICAgICAqIEBwYXJhbSB0eXBlIOaXtumXtOexu+Wei1xuICAgICAqIEBwYXJhbSBjYWxsYmFja29iaiDkvZznlKjln59cbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyIOS6i+S7tuWbnuiwgyBcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgQ2xlYXJFdmVudEJ5VHlwZSggdGFyZ2V0OmFueSwgdHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbiApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0YXJnZXQgJiYgdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV0gKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PENvbXBvbmVudEV2ZW50RGF0YT4gPSB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXTtcbiAgICAgICAgICAgIHZhciBpOm51bWJlcj0wO1xuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGE7XG4gICAgICAgICAgICBmb3IoaTtpPG51bXM7aSsrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZvID0gYXJyW2ldO1xuICAgICAgICAgICAgICAgIGlmKCB2byAmJiB2by50eXBlPT10eXBlICYmIHZvLnRoaXNPYmplY3QgPT0gdGhpc09iamVjdCAmJiB2by5saXN0ZW5lciA9PSBsaXN0ZW5lciApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQub2ZmKCB0eXBlLHRoaXNPYmplY3QsbGlzdGVuZXIgKTtcbiAgICAgICAgICAgICAgICAgICAgdm8uY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZSggaSwxICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOenu+mZpOaJgOacieWFqOWxgOS6i+S7tlxuICAgICAqL1xuICAgIHB1YmxpYyBDbGVhckdsb2JhbEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuRXZlbnRHbG9iYWwgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcztcbiAgICAgICAgICAgIHZhciBkaWN0OmFueSA9IHRoaXMuRXZlbnRHbG9iYWw7XG4gICAgICAgICAgICBmb3IoIHMgaW4gZGljdCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YSA9IGRpY3Rbc107XG4gICAgICAgICAgICAgICAgaWYoIHZvIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRGF0YUV2ZW50KCB2by50eXBlLHZvLnRoaXNPYmplY3Qsdm8ubGlzdGVuZXIgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5FdmVudEdsb2JhbD17fTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIHBsYWNlSFNjcm9sbGVyKCk6IHZvaWQge1xuICAgICAgICB2YXIgaHM6TGF5YS5IU2Nyb2xsQmFyID0gbmV3IExheWEuSFNjcm9sbEJhcigpO1xuICAgICAgICBocy5za2luID0gXCJyZXMvdWkvaHNjcm9sbC5wbmdcIjtcbiAgICAgICAgaHMud2lkdGggPSAzMDA7XG4gICAgICAgIGhzLnBvcyg1MCwgMTcwKTtcblxuICAgICAgICBocy5taW4gPSAwO1xuICAgICAgICBocy5tYXggPSAxMDA7XG5cbiAgICAgICAgaHMuY2hhbmdlSGFuZGxlciA9IG5ldyBMYXlhLkhhbmRsZXIodGhpcywgdGhpcy5vbkNoYW5nZSk7XG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoaHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGxhY2VWU2Nyb2xsZXIoKTogdm9pZCB7XG4gICAgICAgIHZhciB2czpMYXlhLlZTY3JvbGxCYXIgPSBuZXcgTGF5YS5WU2Nyb2xsQmFyKCk7XG4gICAgICAgIHZzLnNraW4gPSBcInJlcy91aS92c2Nyb2xsLnBuZ1wiO1xuICAgICAgICB2cy5oZWlnaHQgPSAzMDA7XG4gICAgICAgIHZzLnBvcyg0MDAsIDUwKTtcblxuICAgICAgICB2cy5taW4gPSAwO1xuICAgICAgICB2cy5tYXggPSAxMDA7XG4gICAgICAgIHZzLmNoYW5nZUhhbmRsZXIgPSBuZXcgTGF5YS5IYW5kbGVyKHRoaXMsIHRoaXMub25DaGFuZ2UpO1xuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHZzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2hhbmdlKHZhbHVlOiBOdW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLmu5rliqjmnaHnmoTkvY3nva7vvJogdmFsdWU9XCIgKyB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgXG59IiwiaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuL1Jlc291cmNlQ29udHJvbFwiO1xuaW1wb3J0IHtMb2NhbERhdGF9IGZyb20gXCIuLi9EYXRhL0xvY2FsRGF0YVwiO1xuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xuaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XG5pbXBvcnQgVGFiID0gTGF5YS5UYWI7XG4vKlxuKiDotYTmupDnrqHnkIblmag7XG4qL1xuZXhwb3J0IGNsYXNzIFJlc0RhdGFDb250cm9sIGltcGxlbWVudHMgVGltZXJDb250cm9sXG57XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlJlc0RhdGFDb250cm9sO1xuXG4gICAgXG4gICAgLyoqXG4gICAgICog5LiN57yT5a2Y55qE5YyF5pWw5o2u77yIIOmihOmYsueVjOmdouS4iueahOeKtuaAgeiuvue9rumUmeivryDvvIlcbiAgICAgKi9cbiAgICBwcml2YXRlIE5vTGl2ZURhdGE6YW55O1xuXG4gICBcblxuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIFJlc0RhdGFDb250cm9sLmlucyA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpSZXNEYXRhQ29udHJvbFxuICAgIHtcbiAgICAgICAgaWYoIFJlc0RhdGFDb250cm9sLmlucyA9PSBudWxsIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNEYXRhQ29udHJvbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZXNEYXRhQ29udHJvbC5pbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5re75Yqg5YyFXG4gICAgICogQHBhcmFtIHBhdGgg6Lev5b6E77yIIOS6i+S+i++8mnJlcy91aS8g77yJXG4gICAgICogQHBhcmFtIHBrZ25hbWUg5YyF5ZCNXG4gICAgICogQHBhcmFtIGlzYWRkcGFja2FnZSDmmK/lkKbmt7vliqAgXG4gICAgICogQHBhcmFtIGlzQ2FjaGUg5piv5ZCm57yT5a2YXG4gICAgICovXG4gICAgcHVibGljIEFkZFBhY2tCeU5hbWUocGF0aDpzdHJpbmcscGtnbmFtZTpzdHJpbmcsaXNhZGRwYWNrYWdlOmJvb2xlYW4gPSB0cnVlLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBpc2FkZHBhY2thZ2UgKVxuICAgICAgICB7XG4gICAgICAgICAgICBmYWlyeWd1aS5VSVBhY2thZ2UuYWRkUGFja2FnZShwYXRoICsgcGtnbmFtZSxwa2duYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLkFkZExvY2FsTGl2ZURhdGEoIHBrZ25hbWUsaXNDYWNoZSApO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgR2FtZVBvb2wuTWFyayggTG9jYWxEYXRhLlJlc0RpY1ZhbHVlLExvY2FsRGF0YSApO1xuICAgICAgICB0aGlzLnVybFJlcyA9IHt9O1xuICAgICAgICB0aGlzLnBhY2thZ2VSZXMgPSB7fTtcbiAgICAgICAgdGhpcy5Ob0xpdmVEYXRhID0geyBcImxvYWRpbmdcIjp0cnVlLFwibWFpblwiOnRydWUsXCJ1aWNvbXBvbmVudFwiOnRydWV9O1xuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KHRoaXMpO1xuICAgIH1cblxuICAgICAvKipcbiAgICAgKiDmuIXnkIbotYTmupDnvJPlrZgoQXJyYXkpXG4gICAgICogQHBhcmFtIHVybHMg6LWE5rqQ5pWw57uEXG4gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIOWMheWQjVxuICAgICAqL1xuICAgIHB1YmxpYyBSZW1vdmVSZXNvdXJjZXMoIHVybHM6QXJyYXk8YW55PixwYWNrYWdlTmFtZTpzdHJpbmcgPSBcIlwiICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHBhY2thZ2VOYW1lICE9IFwiXCIgKVxuICAgICAgICB7XG4gICAgICAgICAgICBmYWlyeWd1aS5VSVBhY2thZ2UucmVtb3ZlUGFja2FnZSggcGFja2FnZU5hbWUgKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IoIHZhciBzIGluIHVybHMgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLlJlbW92ZVJlc291cmNlc0J5dXJsKCB1cmxzW3NdLnVybCx0cnVlICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBwbGFjZUhTbGlkZXIoKTogdm9pZCB7XG4gICAgICAgIHZhciBoczpMYXlhLkhTbGlkZXIgPSBuZXcgTGF5YS5IU2xpZGVyKCk7XG4gICAgICAgIGhzLnNraW4gPSBcInJlcy91aS9oc2xpZGVyLnBuZ1wiO1xuXG4gICAgICAgIGhzLndpZHRoID0gMzAwO1xuICAgICAgICBocy5wb3MoNTAsIDE3MCk7XG4gICAgICAgIGhzLm1pbiA9IDA7XG4gICAgICAgIGhzLm1heCA9IDEwMDtcbiAgICAgICAgaHMudmFsdWUgPSA1MDtcbiAgICAgICAgaHMudGljayA9IDE7XG5cbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChocyk7XG4gICAgfVxuICAgIHByaXZhdGUgcGxhY2VWU2xpZGVyKCk6IHZvaWQge1xuICAgICAgICB2YXIgdnM6TGF5YS5WU2xpZGVyID0gbmV3IExheWEuVlNsaWRlcigpO1xuXG4gICAgICAgIHZzLnNraW4gPSBcInJlcy91aS92c2xpZGVyLnBuZ1wiO1xuXG4gICAgICAgIHZzLmhlaWdodCA9IDMwMDtcbiAgICAgICAgdnMucG9zKDQwMCwgNTApO1xuICAgICAgICB2cy5taW4gPSAwO1xuICAgICAgICB2cy5tYXggPSAxMDA7XG4gICAgICAgIHZzLnZhbHVlID0gNTA7XG4gICAgICAgIHZzLnRpY2sgPSAxO1xuICAgICAgIFxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHZzKTtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX3RpbWUgKz0gZHQ7XG4gICAgICAgIGlmKCB0aGlzLl90aW1lID4gdGhpcy5DaGVja0ludGVydmFsICkgLy8x5YiG6ZKf5qOA5p+l5LiA5qyhXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UucnVubmluZyApIC8v5aaC5p6c5b2T5YmN5Zyo5Yqg6L295Lit77yM5bu25pe2MeenkuajgOa1i1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWUtPTEwMDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5SZWZyZXNoR3JvdXBSZXMoKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWUgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5riF55CG6LWE5rqQ57yT5a2YKHVybClcbiAgICAgKiBAcGFyYW0gdXJsIOimgea4heeQhueahOi1hOa6kHVybFxuICAgICAqIEBwYXJhbSBpc0NsZWFyIOWvueS6jue8k+WtmOaxoOS4reeahOaVsOaNru+8jOW9k+W8leeUqOS4ujDml7bvvIzmmK/lkKbnm7TmjqXlvLrliLbmuIXpmaTvvIgg5aaC5p6c5Li6ZmFsc2Us5YiZ562J5b6F57yT5a2Y5a6a5pe25Yi35paw5pe25YCZ5YaN5Y675Yik5patIO+8iVxuICAgICAqL1xuICAgIHB1YmxpYyBSZW1vdmVSZXNvdXJjZXNCeXVybCggdXJsOnN0cmluZyxpc0NsZWFyOmJvb2xlYW4gPSBmYWxzZSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKHRoaXMudXJsUmVzLmhhc093blByb3BlcnR5KHVybCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCBpc0NsZWFyIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5jbGVhclJlcyh1cmwpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnVybFJlc1t1cmxdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudXJsUmVzW3VybF0tLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEubG9hZGVyLmNsZWFyUmVzKHVybCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDljIXotYTmupDmsaBcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhY2thZ2VSZXM6YW55O1xuXG5cbiAgICBcblxuICAgIHByaXZhdGUgQ2xlYXJMaXZlRGF0YUJ5UGFja05hbWUoIHBrZ05hbWU6c3RyaW5nICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMucGFja2FnZVJlc1sgcGtnTmFtZSBdIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHZvOkxvY2FsRGF0YSA9IHRoaXMucGFja2FnZVJlc1sgcGtnTmFtZSBdO1xuICAgICAgICAgICAgdm8uY2xlYXIoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBhY2thZ2VSZXNbIHBrZ05hbWUgXTtcbiAgICAgICAgfVxuICAgIH1cblxuIFxuICAgIHByaXZhdGUgQ2xlYXJJbnRlcnZhbDpudW1iZXIgPSA1MDAwMDtcblxuICAgIHByaXZhdGUgQ2hlY2tJbnRlcnZhbDpudW1iZXIgPSAyMDAwMDtcbiAgICAgLyoqXG4gICAgICogdXJs6LWE5rqQ5rGgXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cmxSZXM6YW55O1xuXG4gICAgLyoqXG4gICAgICog5re75YqgdWnljIVcbiAgICAgKiBAcGFyYW0gcGtnbmFtZSDljIXlkI1cbiAgICAgKiBAcGFyYW0gaXNhZGRwYWNrYWdlIOaYr+WQpuWIm+W7unVpcGFja2FnZVxuICAgICAqIEBwYXJhbSBpc0NhY2hlIOaYr+WQpua3u+WKoOWIsOe7hOe8k+WtmOS4re+8iCDlpoLmnpzmt7vliqDvvIzliJnlj4LkuI7lrprml7bmuIXnkIbnmoTpgLvovpEs5bi46am76LWE5rqQ6K+35Yu/6K6+572u5Li6dHVyZSDvvIlcbiAgICAgKi9cbiAgICBwdWJsaWMgQWRkVmlld1BhY2tCeU5hbWUocGtnbmFtZTpzdHJpbmcsaXNhZGRwYWNrYWdlOmJvb2xlYW4gPSB0cnVlLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBpc2FkZHBhY2thZ2UgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggcGtnbmFtZSA9PSBcIm1haW5cIiApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZmFpcnlndWkuVUlQYWNrYWdlLmFkZFBhY2thZ2UoQXNzZXRQYXRoLnJlcyArIEFzc2V0UGF0aC5zdWJwYWNrc2dldWkgKyBwa2duYW1lLHBrZ25hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5hZGRQYWNrYWdlKEFzc2V0UGF0aC5yZXNvdXJjZXMgKyBBc3NldFBhdGgudWkgKyBwa2duYW1lLHBrZ25hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5BZGRMb2NhbExpdmVEYXRhKCBwa2duYW1lLGlzQ2FjaGUgKTtcbiAgICB9XG5cbiAgICBcblxuICAgIC8qKlxuICAgICAqIOenu+mZpOWMhVxuICAgICAqIEBwYXJhbSBwa2duYW1lIOWMheWQjVxuICAgICAqIEBwYXJhbSBpc2NsZWFyIOaYr+WQpuW8uuWItua4hemZpO+8iCDlpoLmnpzkuLpmYWxzZeWImeetieW+heWumuaXtuWZqOWIpOaWrea4heeQhu+8jOWmguaenOS4unRydWXliJnlvLrliLbmuIXpmaQg77yJXG4gICAgICovXG4gICAgcHVibGljIENsZWFyUGFja0J5TmFtZShwa2duYW1lOnN0cmluZyxpc2NsZWFyOmJvb2xlYW4gPSBmYWxzZSk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHBrZ25hbWUgPT0gXCJcIiB8fCBwa2duYW1lID09IG51bGwgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYoIGlzY2xlYXIgKVxuICAgICAgICB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5yZW1vdmVQYWNrYWdlKCBwa2duYW1lICk7XG4gICAgICAgICAgICBpZiggdGhpcy5wYWNrYWdlUmVzLmhhc093blByb3BlcnR5KCBwa2duYW1lICkgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBhY2thZ2VSZXNbcGtnbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggdGhpcy5wYWNrYWdlUmVzLmhhc093blByb3BlcnR5KCBwa2duYW1lICkgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciB2bzpMb2NhbERhdGEgPSB0aGlzLnBhY2thZ2VSZXNbIHBrZ25hbWUgXTtcbiAgICAgICAgICAgICAgICBpZiggdm8gKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdm8ucmVmLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBSZWZyZXNoR3JvdXBSZXMoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgbm93VGltZTpudW1iZXIgPSBMYXlhLkJyb3dzZXIubm93KCk7XG4gICAgICAgIHZhciBzO1xuICAgICAgICBpZiggdGhpcy5wYWNrYWdlUmVzIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHZvOkxvY2FsRGF0YTtcbiAgICAgICAgICAgIGZvciggcyBpbiB0aGlzLnBhY2thZ2VSZXMgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZvID0gdGhpcy5wYWNrYWdlUmVzW3NdO1xuICAgICAgICAgICAgICAgIGlmKCB2by5yZWYgPD0gMCAmJiAobm93VGltZSAtIHZvLnRpbWUpID4gdGhpcy5DbGVhckludGVydmFsIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2xlYXJQYWNrQnlOYW1lKCB2by5wYWNrYWdlTmFtZSx0cnVlICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2xlYXJMaXZlRGF0YUJ5UGFja05hbWUoIHZvLnBhY2thZ2VOYW1lICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8v5riF55CG5Zu+54mH57yT5a2YXG4gICAgICAgIGlmKCB0aGlzLnVybFJlcyApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZXVybFBvb2w6YW55ID0gdGhpcy51cmxSZXM7XG4gICAgICAgICAgICBmb3IoIHMgaW4gcmVzb3VyY2V1cmxQb29sIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggcmVzb3VyY2V1cmxQb29sW3NdIDw9IDAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5SZW1vdmVSZXNvdXJjZXNCeXVybCggcyx0cnVlICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIHNraW5zOiBBcnJheTxzdHJpbmc+ID0gW1wicmVzL3VpL3RhYjEucG5nXCIsIFwicmVzL3VpL3RhYjIucG5nXCJdO1xuICAgIHByaXZhdGUgb25Ta2luTG9hZGVkKCk6IHZvaWQge1xuICAgICAgICB2YXIgdGFiQTogVGFiID0gdGhpcy5jcmVhdGVUYWIodGhpcy5za2luc1swXSk7XG4gICAgICAgIHRhYkEucG9zKDQwLCAxMjApO1xuICAgICAgICB0YWJBLmxhYmVsQ29sb3JzID0gXCIjMDAwMDAwLCNkM2QzZDMsIzMzMzMzM1wiO1xuXG4gICAgICAgIHZhciB0YWJCOiBUYWIgPSB0aGlzLmNyZWF0ZVRhYih0aGlzLnNraW5zWzFdKTtcbiAgICAgICAgdGFiQi5wb3MoNDAsIDIyMCk7XG4gICAgICAgIHRhYkIubGFiZWxDb2xvcnMgPSBcIiNGRkZGRkYsIzhGQjI5OSwjRkZGRkZGXCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUYWIoc2tpbjogc3RyaW5nKTogVGFiIHtcbiAgICAgICAgdmFyIHRhYjogVGFiID0gbmV3IFRhYigpO1xuICAgICAgICB0YWIuc2tpbiA9IHNraW47XG5cbiAgICAgICAgdGFiLmxhYmVsQm9sZCA9IHRydWU7XG4gICAgICAgIHRhYi5sYWJlbFNpemUgPSAyMDtcbiAgICAgICAgdGFiLmxhYmVsU3Ryb2tlQ29sb3IgPSBcIiMwMDAwMDBcIjtcblxuICAgICAgICB0YWIubGFiZWxzID0gXCJUYWIgQ29udHJvbCAxLFRhYiBDb250cm9sIDIsVGFiIENvbnRyb2wgM1wiO1xuICAgICAgICB0YWIubGFiZWxQYWRkaW5nID0gXCIwLDAsMCwwXCI7XG5cbiAgICAgICAgdGFiLnNlbGVjdGVkSW5kZXggPSAxO1xuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRhYik7XG5cbiAgICAgICAgcmV0dXJuIHRhYjtcbiAgICB9XG4gICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5cbiAgICAvKipcbiAgICAgKiDojrflj5blt7Lnu4/liqDovb3ov4fnmoTmlbDmja5cbiAgICAgKiBAcGFyYW0gdXJsIOi1hOa6kHVybFxuICAgICAqIEBwYXJhbSBpc0NhY2hlIOaYr+WQpuWtmOWCqOWcqOe8k+WtmOaxoOS4re+8jOm7mOiupOS4unRydWVcbiAgICAgKi9cbiAgICBwdWJsaWMgR2FpblJlc291cmNlcyggdXJsOnN0cmluZyxpc0NhY2hlOmJvb2xlYW4gPSB0cnVlICk6YW55XG4gICAge1xuICAgICAgICBpZiggaXNDYWNoZSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKHRoaXMudXJsUmVzW3VybF0gPT0gbnVsbClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVybFJlc1t1cmxdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXJsUmVzW3VybF0rKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTGF5YS5sb2FkZXIuZ2V0UmVzKHVybCk7XG4gICAgfVxuXG4gICAgXG5cblxuICAgIHByaXZhdGUgQWRkTG9jYWxMaXZlRGF0YSggcGtnbmFtZTpzdHJpbmcsaXNDYWNoZTpib29sZWFuICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIGlzQ2FjaGUgJiYgIXRoaXMuTm9MaXZlRGF0YS5oYXNPd25Qcm9wZXJ0eSggcGtnbmFtZSApIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHZvOkxvY2FsRGF0YTtcbiAgICAgICAgICAgIGlmKCAhdGhpcy5wYWNrYWdlUmVzLmhhc093blByb3BlcnR5KCBwa2duYW1lICkgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZvID0gR2FtZVBvb2wuR2V0SXRlbSggTG9jYWxEYXRhLlJlc0RpY1ZhbHVlICk7XG4gICAgICAgICAgICAgICAgdm8ucGFja2FnZU5hbWUgPSBwa2duYW1lO1xuICAgICAgICAgICAgICAgIHRoaXMucGFja2FnZVJlc1sgcGtnbmFtZSBdID0gdm87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdm8gPSB0aGlzLnBhY2thZ2VSZXNbcGtnbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2by5yZWYrKztcbiAgICAgICAgICAgIHZvLnRpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgIFxufSIsIi8qXG4qIG5hbWU7XG4qL1xuaW1wb3J0IEhhbmRsZXIgPSBMYXlhLkhhbmRsZXI7XG5pbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi9SZXNEYXRhQ29udHJvbFwiO1xuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbmltcG9ydCB7UmVjQ29uZmlnc30gZnJvbSBcIi4uL0NvbmZpZy9SZWNDb25maWdzXCI7XG5leHBvcnQgY2xhc3MgUmVzb3VyY2VDb250cm9sIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcbntcbiAgICBwcml2YXRlIF9jb25maWdzOiBBcnJheTxhbnk+O1xuICAgIHByaXZhdGUgX29uQ29uZmlnQ29tcGxldGU6IEZ1bmN0aW9uO1xuICAgIHByaXZhdGUgX29uQ29uZmlnUHJvZ3Jlc3M6IEZ1bmN0aW9uOyBcbiAgICBwcml2YXRlIF9vbkNvbmZpZ0NvbXBsZXRlVGFyZ2V0OiBhbnk7XG4gICAgcHJpdmF0ZSBfZ3JvdXBzOiBhbnk7XG4gICAgcHJpdmF0ZSBfZ3JvdXBJbmRleDogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgcnVubmluZzpCb29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbm93TG9hZERhdGE6YW55O1xuICAgIFxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlJlc291cmNlQ29udHJvbDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoKSBcblx0e1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuaW5zID0gdGhpcztcblx0fVxuXHRcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBSZXNvdXJjZUNvbnRyb2xcblx0e1xuICAgICAgICBpZihSZXNvdXJjZUNvbnRyb2wuaW5zID09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlc291cmNlQ29udHJvbC5pbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9jb25maWdzID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICAgICAgdGhpcy5fZ3JvdXBzID0ge307XG4gICAgICAgIExheWEubG9hZGVyLnJldHJ5TnVtID0gNDtcbiAgICAgICAgTGF5YS5sb2FkZXIub24oTGF5YS5FdmVudC5FUlJPUiwgdGhpcywgdGhpcy5vbkVycm9yKTtcbiAgICAgICAgTGF5YS5sb2FkZXIub24oXCJlcnJvcnNNc2dcIiwgdGhpcywgdGhpcy5lcnJvcnNNc2doYW5kbGVyKTtcbiAgICAgICAgTGF5YS5sb2FkZXIub24oXCJnYW1lZXJyb3JzTXNnXCIsIHRoaXMsIHRoaXMuZ2FtZWVycm9yc01zZ2hhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Mb2FkQ29uZmlnQ29tcGxldGUoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5fb25Db25maWdDb21wbGV0ZVRhcmdldCAhPSBudWxsICYmIHRoaXMuX29uQ29uZmlnQ29tcGxldGUgIT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ29uZmlnQ29tcGxldGUuY2FsbCggdGhpcy5fb25Db25maWdDb21wbGV0ZVRhcmdldCApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlcnJvcnNNc2doYW5kbGVyKCBtc2c6c3RyaW5nICk6dm9pZFxuICAgIHtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggXCJsb2FkZmFpbEV2ZW50XCIsbXNnICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnYW1lZXJyb3JzTXNnaGFuZGxlciggbXNnOnN0cmluZyApOnZvaWRcbiAgICB7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFwiZ2FtZXNlcnJvc0V2ZW50XCIsbXNnICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yqg6L296LWE5rqQ57uEXG4gICAgICogQHBhcmFtIGdyb3VwTmFtZSDnu4TlkI1cbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQg5L2c55So5Z+fXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIOWujOaIkOS6i+S7tlxuICAgICAqIEBwYXJhbSBvblJlc291cmNlUHJvZ3Jlc3MgICDliqDovb3ov5vluqbkuovku7ZcbiAgICAgKiBAcGFyYW0gaXNTaG93ICAgICAgICAgICAgICAg5piv5ZCm5pi+56S65Yqg6L2954q25oCBXG4gICAgICovXG4gICAgcHVibGljIGxvYWRHcm91cChncm91cE5hbWU6c3RyaW5nLG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzU2hvdzpCb29sZWFuID0gdHJ1ZSxhcmdzOmFueT1udWxsKVxuICAgIHtcbiAgICAgICAgLy8gRGVidWdlci5sb2coZ3JvdXBOYW1lKTtcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xuICAgICAgICBkYXRhLnVybHMgPSBSZWNDb25maWdzLkluc3RhbmNlLlJlc0RpY1sgZ3JvdXBOYW1lIF07XG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xuICAgICAgICBkYXRhLmFyZ3M9YXJncztcbiAgICAgICAgZGF0YS50eXBlID0gXCJncm91cFwiO1xuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIyRFwiO1xuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliqDovb3ljZXkuKrotYTmupBcbiAgICAgKiBAcGFyYW0gdXJsIOi1hOa6kHVybFxuICAgICAqIEBwYXJhbSB0eXBlIOi1hOa6kOexu+Wei1xuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCDkvZznlKjln59cbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUg5a6M5oiQ5LqL5Lu2XG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyDliqDovb3ov5vluqbkuovku7ZcbiAgICAgKiBAcGFyYW0gaXNTaG93IOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxuICAgICAqL1xuICAgIHB1YmxpYyBMb2FkZXIoIHVybDphbnksIHR5cGU6c3RyaW5nLG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzU2hvdzpCb29sZWFuID0gdHJ1ZSxhcmdzOmFueT1udWxsICk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xuICAgICAgICBkYXRhLnVybHMgPSBbe3VybDp1cmwsdHlwZTp0eXBlfV07XG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xuICAgICAgICBkYXRhLmFyZ3M9YXJncztcbiAgICAgICAgZGF0YS50eXBlID0gXCJzaW5nbGVcIjtcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiMkRcIjtcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yqg6L295pWw57uE6LWE5rqQXG4gICAgICogQHBhcmFtIHVybHMgXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IFxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSBcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIFxuICAgICAqIEBwYXJhbSBpc1Nob3cgXG4gICAgICovXG4gICAgcHVibGljIExvYWRlcnMoIHVybHM6QXJyYXk8YW55Piwgb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsaXNTaG93OkJvb2xlYW4gPSB0cnVlLGFyZ3M6YW55PW51bGwgKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XG4gICAgICAgIGRhdGEudXJscyA9IHVybHM7XG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xuICAgICAgICBkYXRhLnR5cGUgPSBcImFyclwiO1xuICAgICAgICBkYXRhLmFyZ3M9YXJncztcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiMkRcIjtcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KaB5Yqg6L2955qE5oC75pWw6YePXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbG9hZE51bTpudW1iZXIgPSAwO1xuICAgIC8qKlxuICAgICAqIOW3sue7j+WKoOi9veeahOaVsOmHj1xuICAgICAqL1xuICAgIHByaXZhdGUgX2xvYWRlZE51bTpudW1iZXIgPSAwO1xuXG4gICAgcHJpdmF0ZSBfcHJlbG9hZE51bTpudW1iZXIgPSAwO1xuXG4gICAgcHJpdmF0ZSBfY3V0Om51bWJlciA9IDA7XG5cbiAgICBwcml2YXRlIF9ub3dMb2FkQXJyOkFycmF5PGFueT4gPSBudWxsO1xuICAgIC8qKlxuICAgICAqIOWKoOi9vei1hOa6kOaVsOe7hO+8jOatpOWKoOi9veaWueazleS8muWNleS4quWKoOi9veaVsOe7hOWGheeahOi1hOa6kO+8jOeUqOS6juaYvuekuuS4pOS4qui/m+W6puadoe+8iCDkuIDkuKrmgLvov5vluqbmnaHvvIzkuIDkuKrljZXkuKrotYTmupDov5vluqbmnaEg77yJXG4gICAgICogQHBhcmFtIHVybHMgXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IFxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSBcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIFxuICAgICAqIEBwYXJhbSBpc1Nob3cgXG4gICAgICovXG4gICAgcHVibGljIGxvYWRlckFycih1cmxzOkFycmF5PGFueT4sIG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGN1dDpudW1iZXIgPSAzKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XG4gICAgICAgIGRhdGEudXJscyA9IHVybHM7XG4gICAgICAgIGRhdGEuaXNTaG93ID0gZmFsc2U7XG4gICAgICAgIGRhdGEudHlwZSA9IFwibG9hZGVyQXJyXCI7XG4gICAgICAgIGRhdGEuY3V0ID0gY3V0O1xuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIyRFwiO1xuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcbiAgICAgICAgdGhpcy5zdGFydExvYWQxKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydExvYWQxKCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoICF0aGlzLnJ1bm5pbmcgJiYgdGhpcy5fY29uZmlncy5sZW5ndGggPiAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fbm93TG9hZERhdGEgPSB0aGlzLl9jb25maWdzLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLl9ub3dMb2FkQXJyID0gKHRoaXMuX25vd0xvYWREYXRhLnVybHMgYXMgQXJyYXk8YW55PikuY29uY2F0KCkucmV2ZXJzZSgpO1xuICAgICAgICAgICAgdGhpcy5fbG9hZE51bSA9IHRoaXMuX25vd0xvYWRBcnIubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkTnVtID0wO1xuICAgICAgICAgICAgdGhpcy5fcHJlbG9hZE51bSA9IHRoaXMuX2xvYWRlZE51bTtcbiAgICAgICAgICAgIHRoaXMuX2N1dCA9IE51bWJlcih0aGlzLl9ub3dMb2FkRGF0YS5jdXQpO1xuICAgICAgICAgICAgdGhpcy5sb2FkU3RhcnQxKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRTdGFydDEoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5ydW5uaW5nIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkQXJyICYmIHRoaXMuX25vd0xvYWRBcnIubGVuZ3RoID4gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgbmVlZEFycjpBcnJheTxhbnk+O1xuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0xvYWRBcnIubGVuZ3RoID4gdGhpcy5fY3V0IClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuZWVkQXJyID0gdGhpcy5fbm93TG9hZEFyci5zcGxpY2UoIDAsdGhpcy5fY3V0ICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmVlZEFyciA9IHRoaXMuX25vd0xvYWRBcnIuc3BsaWNlKCAwICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jdXQgPSBuZWVkQXJyLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuX3ByZWxvYWROdW0gPSB0aGlzLl9sb2FkZWROdW07XG4gICAgICAgICAgICB0aGlzLm9uTG9hZGluZ0FyciggMCApO1xuICAgICAgICAgICAgdmFyIHJlc291c2VUeXBlOnN0cmluZyA9IHRoaXMuX25vd0xvYWREYXRhLnJlc291c2VUeXBlO1xuICAgICAgICAgICAgaWYocmVzb3VzZVR5cGUgPT0gXCIyRFwifHxyZXNvdXNlVHlwZT09bnVsbClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKG5lZWRBcnIsIEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkQ29tcGxldGVBcnIpLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkaW5nQXJyLG51bGwsIGZhbHNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIuY3JlYXRlKG5lZWRBcnIsIEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkQ29tcGxldGVBcnIpLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkaW5nQXJyLG51bGwsIGZhbHNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0TG9hZDEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Mb2FkaW5nQXJyKHZhbHVlOm51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2xvYWRlZE51bSA9IHRoaXMuX3ByZWxvYWROdW0gKyB2YWx1ZSp0aGlzLl9jdXQ7XG4gICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBhbGx2YWx1ZTpudW1iZXIgPSBNYXRoLmNlaWwoKHRoaXMuX2xvYWRlZE51bSAvIHRoaXMuX2xvYWROdW0gKSoxMDApO1xuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0xvYWREYXRhLnByb2dyZXNzICE9IG51bGwgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLnByb2dyZXNzLmNhbGwoIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlVGFyZ2V0LGFsbHZhbHVlLE1hdGguZmxvb3IodmFsdWUqMTAwKSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkxvYWRDb21wbGV0ZUFycigpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMub25Mb2FkaW5nQXJyKCAxICk7XG4gICAgICAgIHRoaXMuX2xvYWRlZE51bSA9IHRoaXMuX3ByZWxvYWROdW0gKyB0aGlzLl9jdXQ7XG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICBpZiggdGhpcy5fbG9hZGVkTnVtID09IHRoaXMuX2xvYWROdW0gKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEgJiYgdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGUgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlLmNhbGwodGhpcy5fbm93TG9hZERhdGEuY29tcGxldGVUYXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIExheWEudGltZXIuY2FsbExhdGVyKCB0aGlzLCB0aGlzLmxvYWRTdGFydDEgKTtcbiAgICAgICAgLy8gdGhpcy5sb2FkU3RhcnQxKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkU3RhcnQoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5ydW5uaW5nIHx8IHRoaXMuX2NvbmZpZ3MubGVuZ3RoID09IDAgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbm93TG9hZERhdGEgPSB0aGlzLl9jb25maWdzWzBdO1xuICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSB0aGlzLl9ub3dMb2FkRGF0YS51cmxzO1xuICAgICAgICB2YXIgaXNTaG93OmJvb2xlYW4gPSB0aGlzLl9ub3dMb2FkRGF0YS5pc1Nob3c7XG4gICAgICAgIGlmKCBpc1Nob3cgKVxuICAgICAgICB7XG4gICAgICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LnNob3dNb2RhbFdhaXQoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzb3VzZVR5cGU6c3RyaW5nID0gdGhpcy5fbm93TG9hZERhdGEucmVzb3VzZVR5cGU7XG4gICAgICAgIGlmKCBhcnIgIT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKHJlc291c2VUeXBlID09IFwiMkRcInx8cmVzb3VzZVR5cGU9PW51bGwpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIubG9hZChhcnIsSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRDb21wbGV0ZSksSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRpbmcsIG51bGwsIGZhbHNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIuY3JlYXRlKGFycixIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZENvbXBsZXRlKSxIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZGluZywgbnVsbCwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOWKoOi9vei/m+W6puS+puWQrOWZqFxuICAgIHByaXZhdGUgb25Mb2FkaW5nKHByb2dyZXNzOiBudW1iZXIpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuX25vd0xvYWREYXRhIClcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvZ3Jlc3MgPSBNYXRoLmNlaWwoIE51bWJlcihwcm9ncmVzcyAqIDEwMCkgKTtcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YS5wcm9ncmVzcyAhPSBudWxsIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YS5wcm9ncmVzcy5jYWxsKCB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZVRhcmdldCxwcm9ncmVzcyApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkxvYWRDb21wbGV0ZShhcmdzOmFueT1udWxsKTp2b2lkXG4gICAge1xuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XG4gICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YSAmJiB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKHRoaXMuX25vd0xvYWREYXRhLmFyZ3Mpe1xuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlLmNhbGwodGhpcy5fbm93TG9hZERhdGEuY29tcGxldGVUYXJnZXQsdGhpcy5fbm93TG9hZERhdGEuYXJncyk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZS5jYWxsKHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlVGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbm93TG9hZERhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLl9jb25maWdzLnNoaWZ0KCk7XG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkVycm9yKGVycjogU3RyaW5nKTp2b2lkXG4gICAge1xuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yqg6L29M0TljZXkuKrotYTmupBcbiAgICAgKiBAcGFyYW0gdXJsIOi1hOa6kHVybFxuICAgICAqIEBwYXJhbSB0eXBlIOi1hOa6kOexu+Wei1xuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCDkvZznlKjln59cbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUg5a6M5oiQ5LqL5Lu2XG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyDliqDovb3ov5vluqbkuovku7ZcbiAgICAgKiBAcGFyYW0gaXNTaG93IOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxuICAgICAqL1xuICAgIHB1YmxpYyBMb2FkZXIzRCggdXJsOmFueSwgdHlwZTphbnksb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsaXNTaG93OkJvb2xlYW4gPSB0cnVlICk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xuICAgICAgICBkYXRhLnVybHMgPSBbe3VybDp1cmwsdHlwZTp0eXBlfV07XG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xuICAgICAgICBkYXRhLnR5cGUgPSBcInNpbmdsZVwiO1xuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIzRFwiO1xuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliqDovb0zROi1hOa6kOe7hFxuICAgICAqIEBwYXJhbSBncm91cE5hbWUg57uE5ZCNXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IOS9nOeUqOWfn1xuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSDlrozmiJDkuovku7ZcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzICAg5Yqg6L296L+b5bqm5LqL5Lu2XG4gICAgICogQHBhcmFtIGlzU2hvdyAgICAgICAgICAgICAgIOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxuICAgICAqL1xuICAgIHB1YmxpYyBsb2FkR3JvdXAzRChncm91cE5hbWU6c3RyaW5nLG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzU2hvdzpCb29sZWFuID0gdHJ1ZSxhcmdzOmFueT1udWxsKVxuICAgIHtcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xuICAgICAgICBkYXRhLnVybHMgPSBSZWNDb25maWdzLkluc3RhbmNlLlJlc0RpY1sgZ3JvdXBOYW1lIF07XG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xuICAgICAgICBkYXRhLmFyZ3M9YXJncztcbiAgICAgICAgZGF0YS50eXBlID0gXCJncm91cFwiO1xuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIzRFwiO1xuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliqDovb3otYTmupDmlbDnu4TvvIzmraTliqDovb3mlrnms5XkvJrljZXkuKrliqDovb3mlbDnu4TlhoXnmoTotYTmupDvvIznlKjkuo7mmL7npLrkuKTkuKrov5vluqbmnaHvvIgg5LiA5Liq5oC76L+b5bqm5p2h77yM5LiA5Liq5Y2V5Liq6LWE5rqQ6L+b5bqm5p2hIO+8iVxuICAgICAqIEBwYXJhbSB1cmxzIFxuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCBcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUgXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyBcbiAgICAgKiBAcGFyYW0gaXNTaG93IFxuICAgICAqL1xuICAgIHB1YmxpYyBsb2FkZXIzREFycih1cmxzOkFycmF5PGFueT4sIG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzc2hvdzpib29sZWFuID0gZmFsc2UsYXJnczphbnk9bnVsbCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xuICAgICAgICBkYXRhLnVybHMgPSB1cmxzO1xuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzc2hvdztcbiAgICAgICAgZGF0YS5hcmdzPWFyZ3M7XG4gICAgICAgIGRhdGEudHlwZSA9IFwibG9hZGVyQXJyXCI7XG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjNEXCI7XG4gICAgICAgIHRoaXMuX2NvbmZpZ3MucHVzaCggZGF0YSApO1xuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWKoOi9veeJueaViFxuICAgICAqIEBwYXJhbSBncm91cE5hbWUgXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IFxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSBcbiAgICAgKiBAcGFyYW0gYXJncyBcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZEVmZmVjdCggZ3JvdXBOYW1lOnN0cmluZyxvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sYXJnczphbnk9bnVsbCApOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciB1cmxzOkFycmF5PGFueT4gPSBSZWNDb25maWdzLkluc3RhbmNlLlJlc0RpY1sgZ3JvdXBOYW1lIF07XG4gICAgICAgIGlmKCB1cmxzICYmIHVybHMubGVuZ3RoID4gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEubG9hZGVyLmxvYWQodXJscyxIYW5kbGVyLmNyZWF0ZSggb25SZXNvdXJjZUxvYWRUYXJnZXQsUmVzb3VyY2VMb2FkQ29tcGxldGUsW2FyZ3NdICkpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IExheW91dENvbnRyb2wgfSBmcm9tIFwiLi9MYXlvdXRDb250cm9sXCI7XG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xuaW1wb3J0IHtDYW1lcmFNYW5hZ2VyfSBmcm9tIFwiLi4vR2FtZS9DYW1lcmFNYW5hZ2VyXCI7XG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xuaW1wb3J0IHtQbGF5ZXJ9IGZyb20gXCIuLi9HYW1lL1BsYXllclwiO1xuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XG5pbXBvcnQgTGV2ZWxDRkcgZnJvbSBcIi4uL0NGRy9MZXZlbENGR1wiO1xuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xuaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWNcIjtcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XG5pbXBvcnQgTnBjQ0ZHIGZyb20gXCIuLi9DRkcvTnBjQ0ZHXCI7XG5pbXBvcnQge05wY1NjcmlwdH0gZnJvbSBcIi4uL0dhbWUvTnBjU2NyaXB0XCI7XG5pbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4vUmVzb3VyY2VDb250cm9sXCI7XG5pbXBvcnQgR2FtZUNGRyBmcm9tIFwiLi4vQ0ZHL0dhbWVDRkdcIjtcbmltcG9ydCB7Q2hhcmFjdGVyU3RhdGV9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclN0YXRlXCI7XG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcbmltcG9ydCB7Q2hhcmFjdGVyUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvQ2hhcmFjdGVyUG9vbFwiO1xuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQgeyBMYXlPVVQgfSBmcm9tIFwiLi4vdXRpbHMvTGF5T1VUXCI7XG5cblxuaW1wb3J0IFNwcml0ZSA9IExheWEuU3ByaXRlO1xuaW1wb3J0IFN0YWdlID0gTGF5YS5TdGFnZTtcbmltcG9ydCBFdmVudCA9IExheWEuRXZlbnQ7XG5pbXBvcnQgQnJvd3NlciA9IExheWEuQnJvd3NlcjtcbmltcG9ydCBXZWJHTCA9IExheWEuV2ViR0w7XG5leHBvcnQgY2xhc3MgU2NlbmVDb250cm9sXG57XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlNjZW5lQ29udHJvbDtcblxuICAgIHByaXZhdGUgX2luaXRQb3NZOm51bWJlciA9IDE7XG5cbiAgICBwdWJsaWMgY2FtZXJhU2NyaXB0OkNhbWVyYU1hbmFnZXI7XG4gICAgcHVibGljIFBsYXllclNjcmlwdDpQbGF5ZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBTY2VuZUNvbnRyb2wuaW5zID0gdGhpcztcbiAgICB9XG5cbiAgICAvKuS9v+eUqOeVjOmdouaYvuekuu+8jDDvvJrnoLjom4ssMTrlrp3nrrEqL1xuICAgIHN0YXRpYyBFZ2dHR3JvdXA6bnVtYmVyPTA7XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlNjZW5lQ29udHJvbFxuICAgIHtcbiAgICAgICAgaWYoIFNjZW5lQ29udHJvbC5pbnMgPT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2NlbmVDb250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNjZW5lQ29udHJvbC5pbnM7XG4gICAgfVxuXG4gICAgLy/liJvlu7rkuLvop5JcbiAgICBwdWJsaWMgQ3JlYXRlUGxheWVyKCByb2xlY2ZnOlJvbGVDRkcgKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgaXNjcmVhdGU6Ym9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBpZiggIVByb3BNYW5hZ2VyLm1haW5Sb2xlIClcbiAgICAgICAge1xuICAgICAgICAgICAgaXNjcmVhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoIFByb3BNYW5hZ2VyLm1haW5Sb2xlLm5hbWUgIT0gXCJDaGFyYWN0ZXJcIiArIHJvbGVjZmcubmFtZSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlzY3JlYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuQ2xlYXJNb21lbnRDaGFyYWN0ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiggaXNjcmVhdGUgKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoUm9sZURhdGEucm9sZUNmZy5uYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcbiAgICAgICAgICAgIC8vIFByb3BNYW5hZ2VyLm1haW5Sb2xlID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShzcCwgUHJvcE1hbmFnZXIuc2NlbmUzRCwgZmFsc2UsbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKSkgYXMgTGF5YS5TcHJpdGUzRDtcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLm1haW5Sb2xlID0gQ2hhcmFjdGVyUG9vbC5BZGRDaGFyYWN0ZXIoIHJvbGVjZmcubmFtZSxQbGF5ZXIsUHJvcE1hbmFnZXIuc2NlbmUzRCApO1xuICAgICAgICAgICAgUHJvcE1hbmFnZXIubWFpblJvbGUubmFtZSA9IFwiQ2hhcmFjdGVyXCIgKyByb2xlY2ZnLm5hbWU7XG4gICAgICAgICAgICB0aGlzLlBsYXllclNjcmlwdCA9IFByb3BNYW5hZ2VyLm1haW5Sb2xlLmdldENvbXBvbmVudCggUGxheWVyICk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIHRoaXMubWFpblJvbGVTY3JpcHQucmVzb3VzZU5hbWUgPSBSb2xlRGF0YS5yb2xlQ2ZnLm5hbWU7XG4gICAgICAgICAgICAvLyBpZiggIClcbiAgICAgICAgICAgIC8vIHRoaXMubWFpblJvbGVTY3JpcHQgPSBQcm9wTWFuYWdlci5tYWluUm9sZS5hZGRDb21wb25lbnQoIE1haW5SQW9sZVNjcmlwdCApO1xuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFnZW5jeXVzZXJtZXNzYWdlOkFnZW5jeVVzZXJNZXNzYWdlID0gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApO1xuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSBhZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcbiAgICAgICAgdmFyIGluZm86YW55ID0gUm9sZURhdGEubGV2ZWxjZmcucm9sZWluaXRwb3M7XG4gICAgICAgIHZhciBjaGlkYXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoaW5mby5vZmZzZXRQb3MpO1xuICAgICAgICB2YXIgb2Zmc2V0UG9zOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoIE51bWJlciggY2hpZGFyclswXSksTnVtYmVyKCBjaGlkYXJyWzFdKSxOdW1iZXIoIGNoaWRhcnJbMl0pICk7XG4gICAgICAgIHZhciBwb3NWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcbiAgICAgICAgdmFyIHNlbGVjdFZlYzpMYXlhLlZlY3RvcjM7XG4gICAgICAgIGlmKCBpbmZvLmluaXRidWlsZCA9PSBcInN0YXJ0cGFuZWxcIiApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBvc1ZlYy54ID0gUHJvcE1hbmFnZXIuc3RhcnRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24ueCArIG9mZnNldFBvcy54O1xuICAgICAgICAgICAgcG9zVmVjLnkgPSBQcm9wTWFuYWdlci5zdGFydFBsYW5lLnRyYW5zZm9ybS5wb3NpdGlvbi55ICsgb2Zmc2V0UG9zLnk7XG4gICAgICAgICAgICBwb3NWZWMueiA9IFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnogKyBvZmZzZXRQb3MuejtcbiAgICAgICAgICAgIHNlbGVjdFZlYyA9ICggUHJvcE1hbmFnZXIuc3RhcnRQbGFuZS5nZXRDaGlsZEJ5TmFtZSggXCJjaGlsZF9wb3NcIiApIGFzIExheWEuU3ByaXRlM0QgKS50cmFuc2Zvcm0ucG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgY2hpbGRwb3M6TGF5YS5WZWN0b3IzID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggUm9sZURhdGEubGV2ZWxtYXBBcnJbMF0saW5mby5pbml0YnVpbGQgKTtcbiAgICAgICAgICAgIHBvc1ZlYy54ID0gY2hpbGRwb3MueCArIG9mZnNldFBvcy54O1xuICAgICAgICAgICAgcG9zVmVjLnkgPSBjaGlsZHBvcy55ICsgb2Zmc2V0UG9zLnk7XG4gICAgICAgICAgICBwb3NWZWMueiA9IGNoaWxkcG9zLnogKyBvZmZzZXRQb3MuejtcbiAgICAgICAgICAgIHNlbGVjdFZlYyA9IGNoaWxkcG9zO1xuICAgICAgICB9XG4gICAgICAgIFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHBvc1ZlYztcbiAgICAgICAgdGhpcy5jYW1lcmFTY3JpcHQuU2V0Q2FtZXJhUG9zaXRpb24oUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5QbGF5ZXJTY3JpcHQuc2V0bm93U2VsZWN0VmVjKCBzZWxlY3RWZWMgKTtcbiAgICAgICAgdGhpcy5QbGF5ZXJTY3JpcHQubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuc3RhbmQ7XG4gICAgICAgIHRoaXMuUGxheWVyU2NyaXB0LlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc3RhbmQgKTtcblxuICAgICAgICAvLyB2YXIgVUlQb3MgPSBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb247XG4gICAgICAgIC8vIHZhciBOQU1FVUkgPSBuZXcgTGF5YS5UZXh0KCk7XG5cbiAgICAgICAgLy8gTkFNRVVJLnRleHQgPSBcIuiHquW3sVwiO1xuICAgICAgICAvLyBOQU1FVUkuZm9udFNpemUgPSA2MDtcbiAgICAgICAgLy8gTkFNRVVJLmNvbG9yID0gXCIjZmZmZmZmXCI7XG4gICAgICAgIC8vIE5BTUVVSS5zY2FsZVggPSAwLjU7XG4gICAgICAgIC8vIE5BTUVVSS5zY2FsZVkgPSAwLjU7XG4gICAgICAgIC8vIE5BTUVVSS5hbGlnbiA9IFwiY2VudGVyXCI7XG4gICAgICAgIC8vIE5BTUVVSS52YWxpZ24gPSBcIm1pZGRsZVwiO1xuICAgICAgICAvLyBMYXlhLnN0YWdlLmFkZENoaWxkKE5BTUVVSSk7XG4gICAgICAgIC8vIExheWEudGltZXIuZnJhbWVMb29wKDEsIHRoaXMsICgpID0+IHtcbiAgICAgICAgLy8gICAgIGxldCBTY3JlZW5Qb3MgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XG4gICAgICAgIC8vICAgICBQcm9wTWFuYWdlci5jYXJtYS53b3JsZFRvVmlld3BvcnRQb2ludChVSVBvcywgU2NyZWVuUG9zKTtcbiAgICAgICAgLy8gICAgIE5BTUVVSS5wb3MoU2NyZWVuUG9zLngsIFNjcmVlblBvcy55KTtcbiAgICAgICAgLy8gfSlcbiAgICB9XG4gICAgLy/liJvlu7pucGNcbiAgICBwcml2YXRlIGNyZWF0ZU5wYyggKTp2b2lkXG4gICAge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0TnBjLS0tXCIpO1xuICAgICAgICB0aGlzLkNsZWFyTnBjKCk7XG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGE7XG4gICAgICAgIHZhciBhcnI6QXJyYXk8YW55PiA9IFJvbGVEYXRhLmxldmVsY2ZnLm5wYztcbiAgICAgICAgdmFyIGNoaWxkZGljdDphbnk7XG4gICAgICAgIHZhciBpbmRleDpudW1iZXIgPSAwO1xuICAgICAgICBQcm9wTWFuYWdlci5ucGNudW0gPSBhcnIubGVuZ3RoO1xuICAgICAgICBmb3IoIHZhciBzIGluIGFyciApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNoaWxkZGljdCA9IGFycltzXTtcbiAgICAgICAgICAgIHZhciBzZWxlY3RWZWM6TGF5YS5WZWN0b3IzID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBucGNjZmc6TnBjQ0ZHID0gTnBjQ0ZHLmRpY3RbIGNoaWxkZGljdC5pZCBdO1xuICAgICAgICAgICAgdmFyIHNwOkxheWEuU3ByaXRlM0QgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKG5wY2NmZy5uYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcbiAgICAgICAgICAgIHZhciBjaGlkYXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoY2hpbGRkaWN0Lm9mZnNldFBvcyk7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0UG9zOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoIE51bWJlciggY2hpZGFyclswXSksTnVtYmVyKCBjaGlkYXJyWzFdKSxOdW1iZXIoIGNoaWRhcnJbMl0pICk7XG4gICAgICAgICAgICB2YXIgcG9zVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XG4gICAgICAgICAgICBpZiggY2hpbGRkaWN0LnNjZW5lID09IFwic3RhcnRwYW5lbFwiIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwb3NWZWMueCA9IFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnggKyBvZmZzZXRQb3MueDtcbiAgICAgICAgICAgICAgICBwb3NWZWMueSA9IFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnkgKyAxICsgb2Zmc2V0UG9zLnk7XG4gICAgICAgICAgICAgICAgcG9zVmVjLnogPSBQcm9wTWFuYWdlci5zdGFydFBsYW5lLnRyYW5zZm9ybS5wb3NpdGlvbi56ICsgb2Zmc2V0UG9zLno7XG4gICAgICAgICAgICAgICAgc2VsZWN0VmVjID0gKCBQcm9wTWFuYWdlci5zdGFydFBsYW5lLmdldENoaWxkQnlOYW1lKCBcImNoaWxkX3Bvc1wiICkgYXMgTGF5YS5TcHJpdGUzRCApLnRyYW5zZm9ybS5wb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRwb3M6TGF5YS5WZWN0b3IzID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZShjaGlsZGRpY3Quc2NlbmUgLGNoaWxkZGljdC5pbml0YnVpbGQgKTtcbiAgICAgICAgICAgICAgICBwb3NWZWMueCA9IGNoaWxkcG9zLnggKyBvZmZzZXRQb3MueDtcbiAgICAgICAgICAgICAgICBwb3NWZWMueSA9IGNoaWxkcG9zLnkgKyBvZmZzZXRQb3MueTtcbiAgICAgICAgICAgICAgICBwb3NWZWMueiA9IGNoaWxkcG9zLnogKyBvZmZzZXRQb3MuejtcbiAgICAgICAgICAgICAgICBzZWxlY3RWZWMgPSBjaGlsZHBvcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5wY3NwOkxheWEuU3ByaXRlM0QgPSBDaGFyYWN0ZXJQb29sLkFkZENoYXJhY3RlciggbnBjY2ZnLm5hbWUsTnBjU2NyaXB0LFByb3BNYW5hZ2VyLnNjZW5lM0QgKTtcbiAgICAgICAgICAgIG5wY3NwLm5hbWUgPSBcIm5wY19cIiArIGluZGV4O1xuICAgICAgICAgICAgbnBjc3AudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zVmVjO1xuICAgICAgICAgICAgdmFyIG5wY3NjcmlwdDpOcGNTY3JpcHQgPSBucGNzcC5nZXRDb21wb25lbnQoIE5wY1NjcmlwdCApO1xuICAgICAgICAgICAgbnBjc2NyaXB0LnNldG5vd1NlbGVjdFZlYyggc2VsZWN0VmVjICk7XG4gICAgICAgICAgICBucGNzY3JpcHQubnBjaW5mbyggbnBjY2ZnICk7XG4gICAgICAgICAgICBQcm9wTWFuYWdlci5ucGNEaWN0WyBucGNzcC5uYW1lIF0gPSBucGNzcDtcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3RbbnBjc3AubmFtZV0gPSBucGNzY3JpcHQ7XG4gICAgICAgICAgICBucGNzY3JpcHQuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5zdGFuZCApO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIC8vIHRoaXMuU2hvd1VJKG5wY3NwKTtcbiAgICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXROcGMyLS0tXCIpO1xuICAgICAgICBcbiAgICB9XG5cbiAgICBpbmRleCA9IDA7XG4gICAgU2hvd1VJKF9zcHJpdGU6TGF5YS5TcHJpdGUzRCl7XG4gICAgICAgIHZhciBVSVBvcyA9IF9zcHJpdGUudHJhbnNmb3JtLnBvc2l0aW9uO1xuICAgICAgICB2YXIgTkFNRVVJID0gbmV3IExheWEuVGV4dCgpO1xuICAgICAgICBsZXQgcmFuZG9tID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCgxLDMwKTtcbiAgICAgICBcbiAgICAgICAgTkFNRVVJLnRleHQgPSBcIm5wY19cIisgdGhpcy5pbmRleDtcbiAgICAgICAgTkFNRVVJLmZvbnRTaXplID0gNjA7XG4gICAgICAgIE5BTUVVSS5jb2xvciA9IFwiI2ZmZmZmZlwiO1xuICAgICAgICBOQU1FVUkuc2NhbGVYID0gMC41O1xuICAgICAgICBOQU1FVUkuc2NhbGVZID0gMC41O1xuICAgICAgICBOQU1FVUkuYWxpZ24gPSBcImNlbnRlclwiO1xuICAgICAgICBOQU1FVUkudmFsaWduID0gXCJtaWRkbGVcIjtcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChOQU1FVUkpO1xuICAgICAgICBMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgU2NyZWVuUG9zID0gbmV3IExheWEuVmVjdG9yMygpO1xuICAgICAgICAgICAgUHJvcE1hbmFnZXIuY2FybWEud29ybGRUb1ZpZXdwb3J0UG9pbnQoVUlQb3MsIFNjcmVlblBvcyk7XG4gICAgICAgICAgICBOQU1FVUkucG9zKFNjcmVlblBvcy54LCBTY3JlZW5Qb3MueSsyMCk7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICB9XG4gICAgXG5cbiAgICBwdWJsaWMgU2hvd1RoZUdhbWVTY2VuZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciBwYXRoQXJyOkFycmF5PGFueT4gPSBbXTtcbiAgICAgICAgdmFyIHVybEFycjpBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICAgIHRoaXMuY2FtZXJhU2NyaXB0LmlzY2FuZm9sbG93ID0gdHJ1ZTtcbiAgICAgICAgdmFyIHJvbGVEYXRhOlJvbGVEYXRhID0gKCBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5Sb2xlRGF0YTtcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gcm9sZURhdGEubGV2ZWxtYXBBcnI7XG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XG4gICAgICAgIGZvciggaSA9IDA7aSA8IGFyci5sZW5ndGg7aSsrIClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIHVybEFyci5pbmRleE9mKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggYXJyW2ldICkgKSA9PSAtMSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBhcnJbaV0gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5wY0FycjpBcnJheTxhbnk+ID0gcm9sZURhdGEubGV2ZWxjZmcubnBjO1xuICAgICAgICBmb3IoIGkgPSAwO2kgPCBucGNBcnIubGVuZ3RoO2krKyApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCB1cmxBcnIuaW5kZXhPZiggQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBOcGNDRkcuZGljdFsgbnBjQXJyW2ldLmlkIF0ubmFtZSApICkgPT0gLTEgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoIE5wY0NGRy5kaWN0WyBucGNBcnJbaV0uaWQgXS5uYW1lICkgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IoIGkgPSAwO2kgPCB1cmxBcnIubGVuZ3RoO2krKyApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBhdGhBcnIucHVzaCggeyB1cmw6dXJsQXJyW2ldIH0gKTtcbiAgICAgICAgfVxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLlNjZW5lQ3JlYXRDb21wbGV0ZSxudWxsLHRydWUgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIFNjZW5lQ3JlYXRDb21wbGV0ZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuUmVmcmVzaFRlcnJhaW4oKTtcbiAgICAgICAgdmFyIGFnZW5jeXVzZXJtZXNzYWdlOkFnZW5jeVVzZXJNZXNzYWdlID0gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApO1xuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSBhZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcbiAgICAgICAgdGhpcy5DcmVhdGVQbGF5ZXIoIFJvbGVEYXRhLnJvbGVDZmcgKTtcbiAgICAgICAgdGhpcy5jcmVhdGVOcGMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIExpc3Rlbk9uRXZlbnQoKTp2b2lkXG4gICAge1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKCBHYW1lU3RhdGUuc3RhcnQsdGhpcyx0aGlzLkVudGVyR2FtZSApOyBcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lciggR2FtZVN0YXRlLmp1bXAsdGhpcyx0aGlzLkp1bXAgKTtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lciggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZCx0aGlzLHRoaXMuUmVmcmVzaENoYXJhY3Rlck1vZGVsICk7XG4gICAgfVxuXG4gICBcblxuICAgIHByaXZhdGUgQ2hhcmFjdGVyTG9hZEVuZCggdXJsOnN0cmluZyApOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGE7XG4gICAgICAgIGlmKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggUm9sZURhdGEucm9sZUNmZy5uYW1lICkgPT0gdXJsIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5DcmVhdGVQbGF5ZXIoIFJvbGVEYXRhLnJvbGVDZmcgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgSnVtcCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuUGxheWVyU2NyaXB0LlRlc3RKdW1wKCk7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBzZXR1cCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jcmVhdGVTcHJpdGUoKTtcblxuICAgICAgICBMYXlhLnN0YWdlLm9uKEV2ZW50Lk1PVVNFX1VQLCB0aGlzLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgIExheWEuc3RhZ2Uub24oRXZlbnQuTU9VU0VfT1VULCB0aGlzLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzcDogU3ByaXRlO1xuICAgIHByaXZhdGUgcHJlUmFkaWFuOiBudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgY3JlYXRlU3ByaXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNwID0gbmV3IFNwcml0ZSgpO1xuICAgICAgICB2YXIgdzogbnVtYmVyID0gMjAwLCBoOiBudW1iZXIgPSAzMDA7XG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1JlY3QoMCwgMCwgdywgaCwgXCIjRkY3RjUwXCIpO1xuICAgICAgICB0aGlzLnNwLnNpemUodywgaCk7XG4gICAgICAgIHRoaXMuc3AucGl2b3QodyAvIDIsIGggLyAyKTtcbiAgICAgICAgdGhpcy5zcC5wb3MoTGF5YS5zdGFnZS53aWR0aCAvIDIsIExheWEuc3RhZ2UuaGVpZ2h0IC8gMik7XG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5zcCk7XG5cbiAgICAgICAgdGhpcy5zcC5vbihFdmVudC5NT1VTRV9ET1dOLCB0aGlzLCB0aGlzLm9uTW91c2VEb3duKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTW91c2VEb3duKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHZhciB0b3VjaGVzOiBBcnJheTxhbnk+ID0gZS50b3VjaGVzO1xuXG4gICAgICAgIGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgIHRoaXMucHJlUmFkaWFuID0gTWF0aC5hdGFuMihcbiAgICAgICAgICAgICAgICB0b3VjaGVzWzBdLnN0YWdlWSAtIHRvdWNoZXNbMV0uc3RhZ2VZLFxuICAgICAgICAgICAgICAgIHRvdWNoZXNbMF0uc3RhZ2VYIC0gdG91Y2hlc1sxXS5zdGFnZVgpO1xuXG4gICAgICAgICAgICBMYXlhLnN0YWdlLm9uKEV2ZW50Lk1PVVNFX01PVkUsIHRoaXMsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk1vdXNlTW92ZShlOiBFdmVudCk6IHZvaWQge1xuICAgICAgICB2YXIgdG91Y2hlczogQXJyYXk8YW55PiA9IGUudG91Y2hlcztcbiAgICAgICAgaWYgKHRvdWNoZXMgJiYgdG91Y2hlcy5sZW5ndGggPT0gMilcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIG5vd1JhZGlhbjogbnVtYmVyID0gTWF0aC5hdGFuMihcbiAgICAgICAgICAgICAgICB0b3VjaGVzWzBdLnN0YWdlWSAtIHRvdWNoZXNbMV0uc3RhZ2VZLFxuICAgICAgICAgICAgICAgIHRvdWNoZXNbMF0uc3RhZ2VYIC0gdG91Y2hlc1sxXS5zdGFnZVgpO1xuXG4gICAgICAgICAgICB0aGlzLnNwLnJvdGF0aW9uICs9IDE4MCAvIE1hdGguUEkgKiAobm93UmFkaWFuIC0gdGhpcy5wcmVSYWRpYW4pO1xuXG4gICAgICAgICAgICB0aGlzLnByZVJhZGlhbiA9IG5vd1JhZGlhbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Nb3VzZVVwKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIExheWEuc3RhZ2Uub2ZmKEV2ZW50Lk1PVVNFX01PVkUsIHRoaXMsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgIH1cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5cbiAgICBwcml2YXRlIEVudGVyR2FtZShqaWFzdT8pOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuUGxheWVyU2NyaXB0LnN0YXJ0UnVuKGppYXN1KTtcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gUHJvcE1hbmFnZXIubnBjc2NyaXB0RGljdDtcbiAgICAgICAgZm9yKCB2YXIgcyBpbiBucGNkaWN0IClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIG5wY3NjcmlwdDpOcGNTY3JpcHQgPSBucGNkaWN0W3NdO1xuICAgICAgICAgICAgbnBjc2NyaXB0LnN0YXJ0UnVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIENsZWFyTW9tZW50Q2hhcmFjdGVyKCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIFByb3BNYW5hZ2VyLm1haW5Sb2xlICYmIHRoaXMuUGxheWVyU2NyaXB0IClcbiAgICAgICAge1xuICAgICAgICAgICAgQ2hhcmFjdGVyUG9vbC5DbGVhckNoYXJhY3RlciggUHJvcE1hbmFnZXIubWFpblJvbGUsdGhpcy5QbGF5ZXJTY3JpcHQucmVzb3VzZU5hbWUsdGhpcy5QbGF5ZXJTY3JpcHQgKTtcbiAgICAgICAgICAgIHRoaXMuUGxheWVyU2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLm1haW5Sb2xlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBTZXRTY2VuZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciBiYWNrZ3JvdW5kUGFyZW50OkxheWEuU3ByaXRlID0gTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5iYWNrZ3JvdW5kLmRpc3BsYXlPYmplY3Q7XG4gICAgICAgIHZhciBzY2VuZWJnOmZhaXJ5Z3VpLkdDb21wb25lbnQgPSBmYWlyeWd1aS5VSVBhY2thZ2UuY3JlYXRlT2JqZWN0KCBcIm1haW5cIixcImdhbWJnXCIgKSBhcyBmYWlyeWd1aS5HQ29tcG9uZW50O1xuICAgICAgICBzY2VuZWJnLnNldFNpemUoZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCwgZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQpO1xuICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLmJhY2tncm91bmQuYWRkQ2hpbGQoIHNjZW5lYmcgKTtcbiAgICAgICAgLy8gVWlNYW5hZ2VyLmluc3RhbmNlLmFkZCggR2FtZUJnVmlldyxudWxsLExheWVyTm90aWZ5LkxBWUVSX0JBQ0tHUk9VTkQgKTtcblxuICAgICAgICAvL+a3u+WKoDNE5Zy65pmvXG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QgPSBiYWNrZ3JvdW5kUGFyZW50LmFkZENoaWxkKG5ldyBMYXlhLlNjZW5lM0QoKSkgYXMgTGF5YS5TY2VuZTNEO1xuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELnBoeXNpY3NTaW11bGF0aW9uLmNvbnRpbnVvdXNDb2xsaXNpb25EZXRlY3Rpb24gPSB0cnVlO1xuXG4gICAgICAgIC8v5re75Yqg54Wn55u45py6XG4gICAgICAgIFByb3BNYW5hZ2VyLmNhcm1hID0gKFByb3BNYW5hZ2VyLnNjZW5lM0QuYWRkQ2hpbGQobmV3IExheWEuQ2FtZXJhKDAsIDAuMSwgNzApKSkgYXMgTGF5YS5DYW1lcmE7XG4gICAgICAgIHRoaXMuY2FtZXJhU2NyaXB0ID0gUHJvcE1hbmFnZXIuY2FybWEuYWRkQ29tcG9uZW50KCBDYW1lcmFNYW5hZ2VyICk7XG5cbiAgICAgICAgUHJvcE1hbmFnZXIuY2FybWEuY2xlYXJGbGFnID0gTGF5YS5CYXNlQ2FtZXJhLkNMRUFSRkxBR19ERVBUSE9OTFk7XG4gICAgICAgIFxuICAgICAgICAvL+a3u+WKoOaWueWQkeWFiVxuICAgICAgICB2YXIgZGlyZWN0aW9uTGlnaHQ6IExheWEuRGlyZWN0aW9uTGlnaHQgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNETW9kZWwoXCJEaXJlY3Rpb25hbExpZ2h0XCIpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0Oy8vUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5EaXJlY3Rpb25MaWdodCgpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0O1xuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmFkZENoaWxkKCBkaXJlY3Rpb25MaWdodCApO1xuICAgICAgICAvLyBkaXJlY3Rpb25MaWdodC50cmFuc2Zvcm0ud29ybGRNYXRyaXguc2V0Rm9yd2FyZChuZXcgTGF5YS5WZWN0b3IzKDEsIC0xLCAwKSk7XG5cbiAgICAgICAgLy8gdmFyIGRpcmVjdGlvbkxpZ2h0OiBMYXlhLkRpcmVjdGlvbkxpZ2h0ID0gUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5EaXJlY3Rpb25MaWdodCgpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0O1xuICAgICAgICAvLyBkaXJlY3Rpb25MaWdodC5jb2xvciA9IG5ldyBMYXlhLlZlY3RvcjMoMSwxLDEpO1xuICAgICAgICAvLyBkaXJlY3Rpb25MaWdodC5pbnRlbnNpdHkgPSAwLjU7XG4gICAgICAgIC8vIGRpcmVjdGlvbkxpZ2h0LnRyYW5zZm9ybS53b3JsZE1hdHJpeC5zZXRGb3J3YXJkKG5ldyBMYXlhLlZlY3RvcjMoMSwgLTEsIDApKTtcblxuICAgICAgICBQcm9wTWFuYWdlci5zdGFydFBsYW5lID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKEFzc2V0UGF0aC5nZXQzRE1vZGVsKFwic3RhcnRwYW5lbFwiKSk7XG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuYWRkQ2hpbGQoUHJvcE1hbmFnZXIuc3RhcnRQbGFuZSk7XG5cbiAgICAgICAgUHJvcE1hbmFnZXIuZW5kUGxhbmUgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNETW9kZWwoXCJlbmRwYW5lbFwiKSk7XG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuYWRkQ2hpbGQoUHJvcE1hbmFnZXIuZW5kUGxhbmUpO1xuXG4gICAgICAgIC8vIFByb3BNYW5hZ2VyLmJnc3ByaXRlM2QgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNETW9kZWwoXCJkaXN0YW50dmlld1wiKSk7XG4gICAgICAgIC8vIFByb3BNYW5hZ2VyLnNjZW5lM0QuYWRkQ2hpbGQoUHJvcE1hbmFnZXIuYmdzcHJpdGUzZCk7XG5cbiAgICAgICAgLy/pm77ljJbku6PnoIFcbiAgICAgICAgUHJvcE1hbmFnZXIuc2NlbmUzRC5lbmFibGVGb2cgPSB0cnVlO1xuICAgICAgICAvL+iuvue9rumbvuWMlueahOminOiJslxuICAgICAgICB2YXIgZm9nQXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIEdhbWVDRkcuZGljdFsyXS52YWx1ZSApO1xuICAgICAgICBpZiggR2FtZUNGRy5kaWN0WzhdIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHd1Y29sb3I6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggR2FtZUNGRy5kaWN0WzhdLnZhbHVlICk7XG4gICAgICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmZvZ0NvbG9yID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIod3Vjb2xvclswXSksTnVtYmVyKHd1Y29sb3JbMV0pLE51bWJlcih3dWNvbG9yWzJdKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmZvZ0NvbG9yID0gbmV3IExheWEuVmVjdG9yMygwLDAsMC42KTtcbiAgICAgICAgfVxuICAgICAgICAvL+iuvue9rumbvuWMlueahOi1t+Wni+S9jee9ru+8jOebuOWvueS6juebuOacuueahOi3neemu1xuICAgICAgICB2YXIgdmFsdWVBcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggR2FtZUNGRy5kaWN0WzNdLnZhbHVlICk7XG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuZm9nU3RhcnQgPSBOdW1iZXIoIHZhbHVlQXJyWzBdICk7XG4gICAgICAgIC8v6K6+572u6Zu+5YyW5pyA5rWT5aSE55qE6Led56a744CCXG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuZm9nUmFuZ2UgPSBOdW1iZXIoIHZhbHVlQXJyWzFdICk7XG4gICAgICAgIHRoaXMuU2hvd1RoZUdhbWVTY2VuZSgpO1xuICAgICAgICB0aGlzLkxpc3Rlbk9uRXZlbnQoKTtcbiAgICAgICAgXG4gICAgfVxuXG5cbiAgICAvKirmuIXpmaTmiYDmnIlOUEMgKi9cbiAgICBwcml2YXRlIENsZWFyTnBjKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gUHJvcE1hbmFnZXIubnBjRGljdDtcbiAgICAgICAgdmFyIHM7XG4gICAgICAgIGZvciggcyBpbiBucGNkaWN0IClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHNwOkxheWEuTWVzaFNwcml0ZTNEID0gbnBjZGljdFtzXTtcbiAgICAgICAgICAgIHZhciBucGNzY3JpcHQ6TnBjU2NyaXB0ID0gUHJvcE1hbmFnZXIubnBjc2NyaXB0RGljdFtzXTtcbiAgICAgICAgICAgIHZhciByZXNvdXNlbmFtZTpzdHJpbmcgPSBucGNzY3JpcHQucmVzb3VzZU5hbWU7XG4gICAgICAgICAgICBDaGFyYWN0ZXJQb29sLkNsZWFyQ2hhcmFjdGVyKCBzcCxyZXNvdXNlbmFtZSxucGNzY3JpcHQpO1xuICAgICAgICAgICAgZGVsZXRlIFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3Rbc107XG4gICAgICAgICAgICBkZWxldGUgbnBjZGljdFtzXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgUGF0dGVybiggbWFwU3ByaXRlM0Q6TGF5YS5TcHJpdGUzRCApOnZvaWRcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUGF0dGVybjEtLS0tXCIpO1xuICAgICAgICBpZiggUHJvcE1hbmFnZXIucGF0dGVybkRpY3RbIG1hcFNwcml0ZTNELm5hbWUgXSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlbGV0ZSBQcm9wTWFuYWdlci5wYXR0ZXJuRGljdFsgbWFwU3ByaXRlM0QubmFtZSBdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBCbG9ja3NTcHJpdGU6TGF5YS5TcHJpdGUzRCA9IG1hcFNwcml0ZTNELmdldENoaWxkQnlOYW1lKCBcIkJsb2Nrc1wiICkgYXMgTGF5YS5TcHJpdGUzRDtcbiAgICAgICAgXG4gICAgICAgIHZhciBjaGlkZGljdDphbnkgPSB7fTtcbiAgICAgICAgdmFyIGNoaWRzcDpMYXlhLlNwcml0ZTNEO1xuICAgICAgICB2YXIgYnVpbGRTcDpMYXlhLk1lc2hTcHJpdGUzRDtcbiAgICAgICAgdmFyIGluZGV4Om51bWJlciA9IDA7XG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfYWxsX1wiICsgaW5kZXggKSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJ1aWxkU3AgPSBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfYWxsX1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcbiAgICAgICAgICAgIGNoaWRzcCA9IGJ1aWxkU3AuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2FsbF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2Zyb250X1wiICsgaW5kZXggKSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJ1aWxkU3AgPSBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xuICAgICAgICAgICAgY2hpZGRpY3RbIFwiYnVpbGRfZnJvbnRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9sZWZ0X1wiICsgaW5kZXggKSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJ1aWxkU3AgPSBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfbGVmdF9cIiArIGluZGV4ICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9sZWZ0X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfcmlnaHRfXCIgKyBpbmRleCApIClcbiAgICAgICAge1xuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9yaWdodF9cIiArIGluZGV4ICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9yaWdodF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2Zyb250bGVmdF9cIiArIGluZGV4ICkgKVxuICAgICAgICB7XG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2Zyb250bGVmdF9cIiArIGluZGV4ICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9mcm9udGxlZnRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udHJpZ2h0X1wiICsgaW5kZXggKSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJ1aWxkU3AgPSBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRyaWdodF9cIiArIGluZGV4ICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9mcm9udHJpZ2h0X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfbGVmdHJpZ2h0X1wiICsgaW5kZXggKSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJ1aWxkU3AgPSBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfbGVmdHJpZ2h0X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcbiAgICAgICAgICAgIGNoaWRzcCA9IGJ1aWxkU3AuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2xlZnRyaWdodF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXg9MDtcbiAgICAgICAgdmFyIFByb3BzOkxheWEuU3ByaXRlM0QgPSBtYXBTcHJpdGUzRC5nZXRDaGlsZEJ5TmFtZSggXCJQcm9wc1wiICkgYXMgTGF5YS5TcHJpdGUzRDtcbiAgICAgICAgd2hpbGUoIFByb3BzLmdldENoaWxkQnlOYW1lKCBcIlNjYWZmb2xkaW5nX1wiICsgaW5kZXggKSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNoaWRzcCA9IFByb3BzLmdldENoaWxkQnlOYW1lKCBcIlNjYWZmb2xkaW5nX1wiICsgaW5kZXggKS5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xuICAgICAgICAgICAgY2hpZGRpY3RbIFwiU2NhZmZvbGRpbmdfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXg9MDtcbiAgICAgICAgd2hpbGUoIFByb3BzLmdldENoaWxkQnlOYW1lKCBcImdyaWxsaW5nX1wiICsgaW5kZXggKSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNoaWRzcCA9IFByb3BzLmdldENoaWxkQnlOYW1lKCBcImdyaWxsaW5nX1wiICsgaW5kZXggKS5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xuICAgICAgICAgICAgY2hpZGRpY3RbIFwiZ3JpbGxpbmdfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICB2YXIganVtcGNoaWxkU3A6TGF5YS5NZXNoU3ByaXRlM0Q7XG4gICAgICAgIHZhciBpc2NyZWF0ZWp0OmJvb2xlYW4gPSAoUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlKS5Sb2xlRGF0YS5MZXZlbElEIDwgMyA/IHRydWU6ZmFsc2U7XG4gICAgICAgIHdoaWxlKCBQcm9wcy5nZXRDaGlsZEJ5TmFtZSggXCJKdW1wQm9vc3RfXCIgKyBpbmRleCApIClcbiAgICAgICAge1xuICAgICAgICAgICAganVtcGNoaWxkU3AgPSBQcm9wcy5nZXRDaGlsZEJ5TmFtZSggXCJKdW1wQm9vc3RfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xuICAgICAgICAgICAgaWYoIGlzY3JlYXRlanQgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBwb3M6TGF5YS5WZWN0b3IzID0ganVtcGNoaWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgcG9zLnkgKz0gMztcbiAgICAgICAgICAgICAgICB2YXIgamlhbnRvdTpMYXlhLk1lc2hTcHJpdGUzRCA9IExheWEuU3ByaXRlM0QuaW5zdGFudGlhdGUoIExheWEubG9hZGVyLmdldFJlcyggQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBcIkFycm93XCIgKSApLFByb3BNYW5hZ2VyLnNjZW5lM0QsZmFsc2UsXG4gICAgICAgICAgICAgICAgcG9zICApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLmppYW50b3VBcnIucHVzaCggamlhbnRvdSApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBQcm9wTWFuYWdlci5wYXR0ZXJuRGljdFsgbWFwU3ByaXRlM0QubmFtZSBdID0gY2hpZGRpY3Q7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJQYXR0ZXJuMi0tLS1cIik7XG4gICAgfVxuICAgIFxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgb25TcHJpdGVDbGljayhlOiBFdmVudCk6IHZvaWQge1xuICAgICAgICB2YXIgcmFuZG9tQW5nbGU6IG51bWJlciA9IE1hdGgucmFuZG9tKCkgKiAxODA7XG4gICAgICAgIC8v5Y+R6YCB6Ieq5a6a5LmJ5LqL5Lu2XG4gICAgICAgIC8vIHRoaXMuc3AuZXZlbnQoSW50ZXJhY3Rpb25fQ3VzdG9tRXZlbnQuUk9UQVRFLCBbcmFuZG9tQW5nbGVdKTtcbiAgICB9XG5cbiAgICAvLyDop6blj5Hoh6rlrprkuYnnmoRyb3RhdGXkuovku7ZcbiAgICBwcml2YXRlIG9uUm90YXRlKG5ld0FuZ2xlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMuc3AsIHsgXCJyb3RhdGlvblwiOiBuZXdBbmdsZSB9LCAxMDAwLExheWEuRWFzZS5lbGFzdGljT3V0KTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8gXG5cbiAgICBwcml2YXRlIFJlZnJlc2hDaGFyYWN0ZXJNb2RlbCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGE7XG4gICAgICAgIHZhciBwYXRoQXJyOkFycmF5PGFueT4gPSBbXTtcbiAgICAgICAgcGF0aEFyci5wdXNoKCB7dXJsOkFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggUm9sZURhdGEucm9sZUNmZy5uYW1lICkgfSApO1xuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLkNoYXJhY3RlckxvYWRFbmQsbnVsbCx0cnVlLEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBSb2xlRGF0YS5yb2xlQ2ZnLm5hbWUgKSApO1xuICAgIH1cblxuICAgIC8qKioqKioqKirmm7TmlrDlnLDlvaIgKi9cbiAgICBwdWJsaWMgUmVmcmVzaFRlcnJhaW4oICApOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGE7XG4gICAgICAgIHZhciBub3dsZXZlbGNmZzpMZXZlbENGRyA9IFJvbGVEYXRhLmxldmVsY2ZnO1xuICAgICAgICB2YXIgbWFwQXJyOkFycmF5PHN0cmluZz4gPSBSb2xlRGF0YS5sZXZlbG1hcEFycjtcbiAgICAgICAgdmFyIG1hcFNwcml0ZTNEOkxheWEuU3ByaXRlM0Q7XG4gICAgICAgIHZhciBtYXBuYW1lOnN0cmluZztcbiAgICAgICAgdmFyIF9sYXN0bWFwU3ByaXRlM0Q6TGF5YS5TcHJpdGUzRDtcblxuICAgICAgICBmb3IoIHZhciBzIGluIFByb3BNYW5hZ2VyLm5vd21hcERpY3QgKVxuICAgICAgICB7XG4gICAgICAgICAgICAoUHJvcE1hbmFnZXIubm93bWFwRGljdFtzXSBhcyBMYXlhLk1lc2hTcHJpdGUzRCkuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IoIHZhciBpOm51bWJlciA9IDA7aSA8IG1hcEFyci5sZW5ndGg7aSsrIClcbiAgICAgICAge1xuICAgICAgICAgICAgbWFwbmFtZSA9IG1hcEFycltpXTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWFwbmFtZTEtLS0tXCIsbWFwbmFtZSk7XG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIubm93bWFwRGljdFsgbWFwbmFtZSBdIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtYXBTcHJpdGUzRCA9IFByb3BNYW5hZ2VyLm5vd21hcERpY3RbIG1hcG5hbWUgXTtcbiAgICAgICAgICAgICAgICBtYXBTcHJpdGUzRC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWFwbmFtZTItLS0tXCIsbWFwbmFtZSk7XG4gICAgICAgICAgICAgICAgdmFyIHNwOkxheWEuU3ByaXRlM0QgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNETW9kZWwobWFwbmFtZSkpIGFzIExheWEuU3ByaXRlM0Q7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJtYXBuYW1lMy0tLS1cIixtYXBuYW1lKTtcbiAgICAgICAgICAgICAgICBtYXBTcHJpdGUzRCA9IExheWEuU3ByaXRlM0QuaW5zdGFudGlhdGUoc3AsIFByb3BNYW5hZ2VyLnNjZW5lM0QsIGZhbHNlLG51bGwpIGFzIExheWEuU3ByaXRlM0Q7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJtYXBuYW1lNC0tLS1cIixtYXBuYW1lKTtcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5ub3dtYXBEaWN0WyBtYXBuYW1lIF0gPSBtYXBTcHJpdGUzRDtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm1hcG5hbWU1LS0tLVwiLG1hcG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIGkgPT0gMCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKCBub3dsZXZlbGNmZy5maXJzdFNjZW5lcG9zICk7XG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QudHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggTnVtYmVyKCBhcnJbMF0pLE51bWJlciggYXJyWzFdKSxOdW1iZXIoIGFyclsyXSApICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGVuZFBvczpMYXlhLlZlY3RvcjMgPSAoX2xhc3RtYXBTcHJpdGUzRC5nZXRDaGlsZEJ5TmFtZSggXCJFTkRcIiApIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5wb3NpdGlvbi5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIGVuZFBvcy54ID0gMDtcbiAgICAgICAgICAgICAgICBlbmRQb3MueSA9IDA7XG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QudHJhbnNmb3JtLnBvc2l0aW9uID0gZW5kUG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5QYXR0ZXJuKCBtYXBTcHJpdGUzRCApO1xuICAgICAgICAgICAgX2xhc3RtYXBTcHJpdGUzRCA9IG1hcFNwcml0ZTNEO1xuICAgICAgICAgICAgdmFyIGVuZFBvczE6TGF5YS5WZWN0b3IzID0gKG1hcFNwcml0ZTNELmdldENoaWxkQnlOYW1lKCBcIkVORFwiICkgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XG4gICAgICAgICAgICBlbmRQb3MxLnogKz0gTnVtYmVyKEdhbWVDRkcuZGljdFs2XS52YWx1ZSk7XG4gICAgICAgICAgICBQcm9wTWFuYWdlci5lbmRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24gPSBlbmRQb3MxO1xuICAgICAgICAgICAgUHJvcE1hbmFnZXIuZ2FtZXdpblBvc1ogPSBlbmRQb3MxLno7XG4gICAgICAgICAgICBQcm9wTWFuYWdlci5nYW1ld2luUG9zWiAtPSAyO1xuICAgICAgICAgICAgLy8gUHJvcE1hbmFnZXIuYmdzcHJpdGUzZC50cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCAwLC0yMCwtNDAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgXG5cblxufSIsImltcG9ydCB7R2FtZVBvb2x9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0dhbWVQb29sXCI7XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRFdmVudERhdGFcbntcbiAgICBzdGF0aWMgUmVzRGljVmFsdWU6c3RyaW5nID0gXCJDb21wb25lbnRFdmVudERhdGFcIjtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIGxvZ2dlcjogVGV4dDtcbiAgICBwcml2YXRlIGtleURvd25MaXN0OiBBcnJheTxib29sZWFuPjtcblxuXG4gICAgdGFyZ2V0OmFueTtcbiAgICB0eXBlOnN0cmluZztcbiAgICB0aGlzT2JqZWN0OmFueTtcbiAgICBsaXN0ZW5lcjpGdW5jdGlvbjtcblxuICAgIHByaXZhdGUgbGlzdGVuS2V5Ym9hcmQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V5RG93bkxpc3QgPSBbXTtcblxuICAgICAgICAvL+a3u+WKoOmUruebmOaMieS4i+S6i+S7tizkuIDnm7TmjInnnYDmn5DmjInplK7liJnkvJrkuI3mlq3op6blj5FcbiAgICAgICAgTGF5YS5zdGFnZS5vbihMYXlhLkV2ZW50LktFWV9ET1dOLCB0aGlzLCB0aGlzLm9uS2V5RG93bik7XG4gICAgICAgIC8v5re75Yqg6ZSu55uY5oqs6LW35LqL5Lu2XG4gICAgICAgIExheWEuc3RhZ2Uub24oTGF5YS5FdmVudC5LRVlfVVAsIHRoaXMsIHRoaXMub25LZXlVcCk7XG4gICAgfVxuXG4gICAgLyoq6ZSu55uY5oyJ5LiL5aSE55CGKi9cbiAgICBwcml2YXRlIG9uS2V5RG93bihlOiBFdmVudCk6IHZvaWQge1xuICAgICAgICB2YXIga2V5Q29kZTogbnVtYmVyID0gZVtcImtleUNvZGVcIl07XG4gICAgICAgIHRoaXMua2V5RG93bkxpc3Rba2V5Q29kZV0gPSB0cnVlO1xuICAgIH1cblxuICAgIFxuICAgIHB1YmxpYyBjbGVhcigpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy50eXBlPW51bGw7XG4gICAgICAgIHRoaXMudGhpc09iamVjdD1udWxsO1xuICAgICAgICB0aGlzLmxpc3RlbmVyPW51bGw7XG4gICAgICAgIEdhbWVQb29sLlJlbW92ZUl0ZW0oIENvbXBvbmVudEV2ZW50RGF0YS5SZXNEaWNWYWx1ZSx0aGlzICk7XG4gICAgfVxuXG4gICAgLyoq6ZSu55uY5oqs6LW35aSE55CGKi9cbiAgICBwcml2YXRlIG9uS2V5VXAoZTogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIHRoaXMua2V5RG93bkxpc3RbZVtcImtleUNvZGVcIl1dO1xuICAgIH1cblxufSIsIlxuLypcbiogbmFtZTtcbiovXG5leHBvcnQgY2xhc3MgRGF0YUluZm9CYXNlIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcbntcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICAvKioqKioqKioqKirmt7fmt4YqKioqKioqKiogKi9cbiAgICBzaG93QXBlKCkge1xuXHRcdGNvbnN0IFxuXHRcdFx0bW9ua2V5MVBhdGggPSBcIi4vcmVzL2FwZXMvbW9ua2V5MS5wbmdcIixcblx0XHRcdG1vbmtleTJQYXRoID0gXCIuL3Jlcy9hcGVzL21vbmtleTIucG5nXCI7XG5cblx0XHQvLyDmlrnms5Ux77ya5L2/55SobG9hZEltYWdlXG5cdFx0bGV0IGFwZSA9IG5ldyBMYXlhLlNwcml0ZSgpO1xuXHRcdExheWEuc3RhZ2UuYWRkQ2hpbGQoYXBlKTtcblx0XHRhcGUubG9hZEltYWdlKG1vbmtleTFQYXRoKTtcblxuXHRcdC8vIOaWueazlTLvvJrkvb/nlKhkcmF3VGV4dHVyZVxuXHRcdExheWEubG9hZGVyLmxvYWQobW9ua2V5MlBhdGgsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgZnVuY3Rpb24oKSB7XG5cdFx0XHRsZXQgbW9ua2V5MiA9IExheWEubG9hZGVyLmdldFJlcyhtb25rZXkyUGF0aCk7XG5cdFx0XHRsZXQgYXBlMiA9IG5ldyBMYXlhLlNwcml0ZSgpO1xuXHRcdFx0TGF5YS5zdGFnZS5hZGRDaGlsZChhcGUyKTtcblx0XHRcdGFwZTIuZ3JhcGhpY3MuZHJhd1RleHR1cmUobW9ua2V5MiwgMTAwLCAwKTtcblx0XHR9KSk7XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIFxuXG4gICAgcHVibGljIERhdGFJbmZvKCBkYXRhOmFueSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBkYXRhIClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKCB2YXIgcyBpbiBkYXRhIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbWQ6YW55ID0gdGhpc1tzXTtcbiAgICAgICAgICAgICAgICBpZiggaXRlbWQgIT0gbnVsbCApIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzXSA9IGRhdGFbc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVsc2VcbiAgICAgICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAgICAgLy8gICAgIERlYnVnZXIubG9nKCBcIlZPOuacquWumuS5ieWxnuaApy1cIiArIHMgKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKioqKioqKioq5re35reGICovXG4gICAgcHJpdmF0ZSBjcmVhdGVCdXR0b24oc2tpbjogc3RyaW5nLG5hbWU6c3RyaW5nLGNiOkZ1bmN0aW9uLGluZGV4Om51bWJlcik6TGF5YS5CdXR0b24ge1xuICAgICAgICB2YXIgYnRuOkxheWEuQnV0dG9uID0gbmV3IExheWEuQnV0dG9uKHNraW4sbmFtZSk7XG4gICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChidG4pO1xuICAgICAgICBidG4ub24oTGF5YS5FdmVudC5DTElDSyx0aGlzLGNiKTtcbiAgICAgICAgYnRuLnNpemUoMTQ3LDU1KTtcbiAgICAgICAgYnRuLm5hbWUgPSBuYW1lO1xuICAgICAgICBidG4ucmlnaHQgPSAxMDtcbiAgICAgICAgYnRuLnRvcCA9IGluZGV4ICogKGJ0bi5oZWlnaHQgKyAxMCk7XG5cdFx0cmV0dXJuIGJ0bjtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqICovXG5cbiAgICBwdWJsaWMgZGlzcGF0Y2hFdmVudCh0eXBlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuZXZlbnQodHlwZSwgZGF0YSk7XG4gICAgfVxuXG4gICAgXG4gICAgXG59IiwiaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcbmltcG9ydCBTcHJpdGUgPSBMYXlhLlNwcml0ZTtcbmltcG9ydCBFdmVudCA9IExheWEuRXZlbnQ7XG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBjbGFzcyBMb2NhbERhdGEgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxueyAgIFxuICAgIHN0YXRpYyBSZXNEaWNWYWx1ZTpzdHJpbmcgPSBcIkxvY2FsRGF0YVwiO1xuXG4gICAgcHJpdmF0ZSBsb2dnZXI6TGF5YS5UZXh0O1xuICAgIC8qKlxuICAgICAqIOW8leeUqOasoeaVsFxuICAgICAqL1xuICAgIHJlZjpudW1iZXIgPSAwO1xuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb3JhbFJlY3QoKTogdm9pZCB7XG4gICAgICAgIHZhciBjb3JhbFJlY3Q6IFNwcml0ZSA9IG5ldyBTcHJpdGUoKTtcbiAgICAgICAgY29yYWxSZWN0LmdyYXBoaWNzLmRyYXdSZWN0KDAsIDAsIExheWEuc3RhZ2Uud2lkdGgsIExheWEuc3RhZ2UuaGVpZ2h0IC8gMiwgXCIjRkY3RjUwXCIpO1xuXG4gICAgICAgIC8v6K6+572u5ZCN56ewXG4gICAgICAgIGNvcmFsUmVjdC5uYW1lID0gXCLnj4rnkZroibLlrrnlmahcIjtcbiAgICAgICAgY29yYWxSZWN0LnNpemUoTGF5YS5zdGFnZS53aWR0aCwgTGF5YS5zdGFnZS5oZWlnaHQgLyAyKTtcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChjb3JhbFJlY3QpO1xuXG4gICAgICAgIGNvcmFsUmVjdC5vbihFdmVudC5NT1VTRV9ET1dOLCB0aGlzLCB0aGlzLm9uRG93bik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVEZWVwU2t5Ymx1ZVJlY3QoKTogdm9pZCB7XG4gICAgICAgIHZhciBkZWVwU2t5Ymx1ZVJlY3Q6IFNwcml0ZSA9IG5ldyBTcHJpdGUoKTtcbiAgICAgICAgZGVlcFNreWJsdWVSZWN0LmdyYXBoaWNzLmRyYXdSZWN0KDAsIDAsIDEwMCwgMTAwLCBcIiMwMEJGRkZcIik7XG4gICAgICAgIC8v6K6+572u5ZCN56ewXG4gICAgICAgIGRlZXBTa3libHVlUmVjdC5uYW1lID0gXCLlpKnok53oibLnn6nlvaJcIjtcbiAgICAgICAgLy/orr7nva7lrr3pq5jvvIjopoHmjqXmlLbpvKDmoIfkuovku7blv4Xpobvorr7nva7lrr3pq5jvvIzlkKbliJnkuI3kvJrooqvlkb3kuK3vvIkgIFxuICAgICAgICBkZWVwU2t5Ymx1ZVJlY3Quc2l6ZSgxMDAsIDEwMCk7XG4gICAgICAgIGRlZXBTa3libHVlUmVjdC5wb3MoMTAsIDEwKTtcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChkZWVwU2t5Ymx1ZVJlY3QpO1xuXG4gICAgICAgIGRlZXBTa3libHVlUmVjdC5vbihFdmVudC5NT1VTRV9ET1dOLCB0aGlzLCB0aGlzLm9uRG93bik7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIOacgOWQjuS4gOasoeiiq+W8leeUqOeahOaXtumXtFxuICAgICAqL1xuICAgIHRpbWU6bnVtYmVyID0gMDtcblxuICAgIC8qKlxuICAgICAqIOWMheWQjVxuICAgICAqL1xuICAgIHBhY2thZ2VOYW1lOnN0cmluZyA9IFwiXCI7XG5cbiAgICBwdWJsaWMgY2xlYXIoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLnJlZiA9IDA7XG4gICAgICAgIHRoaXMudGltZSA9IDA7XG4gICAgICAgIHRoaXMucGFja2FnZU5hbWUgPSBcIlwiO1xuICAgICAgICBHYW1lUG9vbC5SZW1vdmVJdGVtKCBMb2NhbERhdGEuUmVzRGljVmFsdWUsdGhpcyApO1xuICAgIH1cblxuICAgIC8qKuS+puWQrOWkhOeQhuaWueazlSovXG5cdFx0cHJpdmF0ZSBvbkRvd24oZTogRXZlbnQpOiB2b2lkIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRleHQgKz0gXCLngrnlh7sgLSBcIiArIGUudGFyZ2V0Lm5hbWUgKyBcIlxcblwiO1xuXHRcdH1cbn0iLCJpbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xuaW1wb3J0IHtVc2VySW5mb0V2ZW50fSBmcm9tIFwiLi4vRGF0YS9Vc2VySW5mb0V2ZW50XCI7XG5pbXBvcnQge0xvY2FsRGF0YUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0xvY2FsRGF0YUNvbnRyb2xcIjtcbmltcG9ydCB7VXNlckRhdGFJbmZvfSBmcm9tIFwiLi4vRGF0YS9Vc2VyRGF0YUluZm9cIjtcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi9DRkcvUm9sZUNGR1wiO1xuaW1wb3J0IExldmVsQ0ZHIGZyb20gXCIuLi9DRkcvTGV2ZWxDRkdcIjtcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcbmltcG9ydCB7IERhdGFJbmZvQmFzZSB9IGZyb20gXCIuL0RhdGFJbmZvQmFzZVwiO1xuXG5cbmltcG9ydCBFdmVudERhdGEgPSBMYXlhLkV2ZW50RGF0YTtcblx0aW1wb3J0IFNrZWxldG9uICA9IExheWEuU2tlbGV0b247XG5cdGltcG9ydCBUZW1wbGV0ICAgPSBMYXlhLlRlbXBsZXQ7XG5cdGltcG9ydCBTcHJpdGUgICAgPSBMYXlhLlNwcml0ZTtcblx0aW1wb3J0IEV2ZW50ICAgICA9IExheWEuRXZlbnQ7XG5cdGltcG9ydCBCcm93c2VyICAgPSBMYXlhLkJyb3dzZXI7XG5cdGltcG9ydCBIYW5kbGVyICAgPSBMYXlhLkhhbmRsZXI7XG5cdGltcG9ydCBTdGF0ICAgICAgPSBMYXlhLlN0YXQ7XG5cdGltcG9ydCBUd2VlbiAgICAgPSBMYXlhLlR3ZWVuO1xuICAgIGltcG9ydCBXZWJHTCAgICAgPSBMYXlhLldlYkdMO1xuICAgIFxuZXhwb3J0IGNsYXNzIFJvbGVEYXRhIGV4dGVuZHMgRGF0YUluZm9CYXNlIFxue1xuICAgIHByaXZhdGUgc3RhdGljIGluczpSb2xlRGF0YTtcbiAgICAvKipcbiAgICAgKiDph5HluIFcbiAgICAgKi9cbiAgICBwcml2YXRlIF9Hb2xkOm51bWJlcj0wO1xuXG4gICAgcHJpdmF0ZSBfcm9sZWlkOm51bWJlciA9IDA7XG4gICAgcHVibGljIHJvbGVDZmc6Um9sZUNGRztcblxuICAgIHByaXZhdGUgX2xldmVpZDpudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBsZXZlbGNmZzpMZXZlbENGRztcbiAgICBwdWJsaWMgbGV2ZWxtYXBBcnI6QXJyYXk8c3RyaW5nPjtcblxuICAgIFxuICAgIGNvbnN0cnVjdG9yKCkgXG4gICAgeyBcbiAgICAgICAgc3VwZXIoKTsgXG4gICAgICAgIFJvbGVEYXRhLmlucyA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogUm9sZURhdGEge1xuICAgICAgICBpZiAoUm9sZURhdGEuaW5zID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUm9sZURhdGEoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUm9sZURhdGEuaW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgbGV0IGxvY2FsZGF0YWNvbnRyb2w6TG9jYWxEYXRhQ29udHJvbCA9IExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2U7XG4gICAgICAgIC8vIHZhciBub3dHb2xkOm51bWJlciA9IE51bWJlcihQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkdldFVzZXIoQWNjb3VudFVzZXIubW9uZXkpKTtcbiAgICAgICAgLy8gdGhpcy5Hb2xkID0gbm93R29sZDtcbiAgICAgICAgdGhpcy5Nb25leSA9IGxvY2FsZGF0YWNvbnRyb2wuZ2V0bnVtKCBVc2VyRGF0YUluZm8uZ29sZCApO1xuICAgICAgICB0aGlzLl9yb2xlaWQgPSBsb2NhbGRhdGFjb250cm9sLmdldG51bSggVXNlckRhdGFJbmZvLnJvbGVpZCApO1xuICAgICAgICBpZiggdGhpcy5DaGFyYWN0ZXJJRCA9PSAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5DaGFyYWN0ZXJJRCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLkluaXRDaGFyYWN0ZXJJbmZvKCk7XG4gICAgICAgIH1cbiAgICAgICBcbiAgICAgICAgdGhpcy5fbGV2ZWlkID0gbG9jYWxkYXRhY29udHJvbC5nZXRudW0oIFVzZXJEYXRhSW5mby5sZXZlbGlkICk7XG4gICAgICAgIGlmKCB0aGlzLl9sZXZlaWQgPT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2xldmVpZCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5SZWZyZXNoTGV2ZWwoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5vd2xldmVsKCk6bnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROb3dTZXJ2ZXJMZXZlbCgpOm51bWJlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xldmVpZDtcbiAgICB9XG5cbiAgICBMZXZlbFVwKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5fbGV2ZWlkKys7XG4gICAgICAgIExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuYWRkc3RyKCBVc2VyRGF0YUluZm8ubGV2ZWxpZCx0aGlzLl9sZXZlaWQudG9TdHJpbmcoKSApO1xuICAgICAgICB0aGlzLlJlZnJlc2hMZXZlbCgpO1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHB1YmxpYyBzdGFydEZ1bigpOnZvaWRcblx0XHR7XG5cdFx0XHR0aGlzLm1BbmlQYXRoID0gXCJyZXMvc3BpbmUvc3BpbmVSZXM2L2FsaWVuLnNrXCI7XG5cdFx0XHR0aGlzLm1GYWN0b3J5ID0gbmV3IFRlbXBsZXQoKTtcblx0XHRcdHRoaXMubUZhY3Rvcnkub24oRXZlbnQuQ09NUExFVEUsIHRoaXMsIHRoaXMucGFyc2VDb21wbGV0ZSk7XG5cdFx0XHR0aGlzLm1GYWN0b3J5Lm9uKEV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLm9uRXJyb3IpO1xuXHRcdFx0dGhpcy5tRmFjdG9yeS5sb2FkQW5pKHRoaXMubUFuaVBhdGgpO1xuXHRcdH1cblx0XHRwcml2YXRlIG9uRXJyb3IoKTp2b2lkXG5cdFx0e1xuXHRcdFx0Y29uc29sZS5sb2coXCJlcnJvclwiKTtcblx0XHR9XG5cdFx0XG5cdFx0cHJpdmF0ZSBwYXJzZUNvbXBsZXRlKCk6dm9pZCB7XG5cdFx0XHQvL+WIm+W7uuaooeW8j+S4ujHvvIzlj6/ku6XlkK/nlKjmjaLoo4Vcblx0XHRcdHRoaXMubUFybWF0dXJlID0gdGhpcy5tRmFjdG9yeS5idWlsZEFybWF0dXJlKDEpO1xuXHRcdFx0dGhpcy5tQXJtYXR1cmUueCA9IHRoaXMubVN0YXJ0WDtcblx0XHRcdHRoaXMubUFybWF0dXJlLnkgPSB0aGlzLm1TdGFydFk7XG5cdFx0XHR0aGlzLm1Bcm1hdHVyZS5zY2FsZSgwLjUsIDAuNSk7XG5cdFx0XHRMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMubUFybWF0dXJlKTtcblx0XHRcdHRoaXMubUFybWF0dXJlLm9uKEV2ZW50LkxBQkVMLCB0aGlzLCB0aGlzLm9uRXZlbnQpO1xuXHRcdFx0dGhpcy5wbGF5KCk7XG4gICAgICAgIH1cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHJpdmF0ZSBSZWZyZXNoTGV2ZWwoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgbHYgPSB0aGlzLl9sZXZlaWQ7XG4gICAgICAgIHZhciBub3djZmdsdjpudW1iZXIgPSAwO1xuICAgICAgICB2YXIgYWxsbnVtczpudW1iZXIgPSBMZXZlbENGRy52ZWMubGVuZ3RoO1xuICAgICAgICBpZiggbHYgPiBhbGxudW1zIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHZhbHVlOm51bWJlciA9IChsdi1hbGxudW1zKSUoIGFsbG51bXMtMiApO1xuICAgICAgICAgICAgaWYoICB2YWx1ZSA9PSAwIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBub3djZmdsdiA9IGFsbG51bXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbm93Y2ZnbHYgPSB2YWx1ZSArIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBub3djZmdsdiA9IGx2O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGV2ZWxjZmcgPSBMZXZlbENGRy5kaWN0WyBub3djZmdsdiBdO1xuICAgICAgICB0aGlzLmxldmVsbWFwQXJyID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKHRoaXMubGV2ZWxjZmcucm9hZCk7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFVzZXJJbmZvRXZlbnQudXNlcmluZm9FdmVudF9sZXZlbGlkICk7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgICAgICBwcml2YXRlIG1BbmlQYXRoOnN0cmluZztcblx0XHRwcml2YXRlIG1TdGFydFg6bnVtYmVyID0gNDAwO1xuXHRcdHByaXZhdGUgbVN0YXJ0WTpudW1iZXIgPSA1MDA7XG5cdFx0cHJpdmF0ZSBtRmFjdG9yeTpUZW1wbGV0O1xuXHRcdHByaXZhdGUgbUFjdGlvbkluZGV4Om51bWJlciA9IDA7XG5cdFx0cHJpdmF0ZSBtQ3VyckluZGV4Om51bWJlciA9IDA7XG5cdFx0cHJpdmF0ZSBtQXJtYXR1cmU6U2tlbGV0b247XG5cdFx0cHJpdmF0ZSBtQ3VyclNraW5JbmRleDpudW1iZXIgPSAwO1xuXHRcdHByaXZhdGUgbUZhY3RvcnkyOlRlbXBsZXQ7XG5cdFx0cHJpdmF0ZSBtTGFiZWxTcHJpdGU6U3ByaXRlO1xuXG4gICAgcHJpdmF0ZSBwbGF5KCk6dm9pZFxuXHRcdHtcblx0XHRcdHRoaXMubUN1cnJJbmRleCsrO1xuXHRcdFx0aWYgKHRoaXMubUN1cnJJbmRleCA+PSB0aGlzLm1Bcm1hdHVyZS5nZXRBbmltTnVtKCkpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMubUN1cnJJbmRleCA9IDA7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLm1Bcm1hdHVyZS5wbGF5KHRoaXMubUN1cnJJbmRleCxmYWxzZSk7XG5cdFx0XHRcblx0XHR9XG5cdFx0XG5cdFx0cHJpdmF0ZSBvbkV2ZW50KGUpOnZvaWRcblx0XHR7XG5cdFx0XHRMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMubUxhYmVsU3ByaXRlKTtcblx0XHRcdHRoaXMubUxhYmVsU3ByaXRlLnggPSB0aGlzLm1TdGFydFg7XG5cdFx0XHR0aGlzLm1MYWJlbFNwcml0ZS55ID0gdGhpcy5tU3RhcnRZO1xuXHRcdFx0dGhpcy5tTGFiZWxTcHJpdGUuZ3JhcGhpY3MuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuXG5cbiAgICBtb3Zlc3BlZWQ6bnVtYmVyID0gMDtcbiAgICBmcm9udGp1bXA6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcbiAgICBsZWZ0anVtcDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xuICAgIHJpZ2h0anVtcDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xuICAgIHVwY2xpbWI6bnVtYmVyID0gMDtcbiAgICBzbGlkZWNsaW1iOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XG4gICAgcHJpdmF0ZSBJbml0Q2hhcmFjdGVySW5mbygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMucm9sZUNmZyA9IFJvbGVDRkcuZGljdFsgdGhpcy5fcm9sZWlkIF07XG4gICAgICAgIHRoaXMubW92ZXNwZWVkID0gdGhpcy5yb2xlQ2ZnLnNwZWVkO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5mcm9udGp1bXAgPSB0aGlzLnJvbGVDZmcuZnJvbnRqdW1wO1xuICAgICAgICB0aGlzLmxlZnRqdW1wID0gdGhpcy5yb2xlQ2ZnLmxlZnRqdW1wO1xuICAgICAgICB0aGlzLnJpZ2h0anVtcCA9IHRoaXMucm9sZUNmZy5yaWdodGp1bXA7XG4gICAgICAgIHRoaXMudXBjbGltYiA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnVwY2xpbWIgKTtcbiAgICAgICAgdGhpcy5zbGlkZWNsaW1iID0gdGhpcy5yb2xlQ2ZnLnNsaWRlY2xpbWI7XG5cbiAgICAgICAgLy8gdGhpcy5mcm9udGp1bXAueCA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLmZyb250anVtcC54ICk7XG4gICAgICAgIC8vIHRoaXMuZnJvbnRqdW1wLnkgPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5mcm9udGp1bXAueSApO1xuICAgICAgICAvLyB0aGlzLmZyb250anVtcC56ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuZnJvbnRqdW1wLnogKTtcbiAgICAgICAgXG4gICAgICAgIC8vIHRoaXMubGVmdGp1bXAueCA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLmxlZnRqdW1wLnggKTtcbiAgICAgICAgLy8gdGhpcy5sZWZ0anVtcC55ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcubGVmdGp1bXAueSApO1xuICAgICAgICAvLyB0aGlzLmxlZnRqdW1wLnogPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5sZWZ0anVtcC56ICk7XG4gICAgICAgIFxuICAgICAgICAvLyB0aGlzLnJpZ2h0anVtcC54ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcucmlnaHRqdW1wLnggKTtcbiAgICAgICAgLy8gdGhpcy5yaWdodGp1bXAueSA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnJpZ2h0anVtcC55ICk7XG4gICAgICAgIC8vIHRoaXMucmlnaHRqdW1wLnogPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5yaWdodGp1bXAueiApO1xuXG4gICAgICAgIC8vIHRoaXMuc2xpZGVjbGltYi54ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuc2xpZGVjbGltYi54ICk7XG4gICAgICAgIC8vIHRoaXMuc2xpZGVjbGltYi55ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuc2xpZGVjbGltYi55ICk7XG4gICAgICAgIC8vIHRoaXMuc2xpZGVjbGltYi56ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuc2xpZGVjbGltYi56ICk7XG4gICAgfVxuXG4gICAgLy8gcHVibGljIHNldCBsZXZlaWQoIHZhbHVlOm51bWJlciApXG4gICAgLy8ge1xuICAgIC8vICAgICBpZiggdGhpcy5fbGV2ZWlkICE9IHZhbHVlIClcbiAgICAvLyAgICAge1xuICAgIC8vICAgICAgICAgdGhpcy5fbGV2ZWlkID0gdmFsdWU7XG4gICAgLy8gICAgICAgICB0aGlzLmxldmVsY2ZnID0gTGV2ZWxDRkcuZGljdFsgdGhpcy5fbGV2ZWlkIF07XG4gICAgLy8gICAgICAgICB0aGlzLmxldmVsbWFwQXJyID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKHRoaXMubGV2ZWxjZmcucm9hZCk7XG4gICAgLy8gICAgICAgICBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRzdHIoIFVzZXJEYXRhSW5mby5sZXZlbGlkLHRoaXMuX2xldmVpZC50b1N0cmluZygpICk7XG4gICAgLy8gICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkICk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBwdWJsaWMgZ2V0IExldmVsSUQoKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZXZlaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBDaGFyYWN0ZXJJRCggdmFsdWU6bnVtYmVyIClcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl9yb2xlaWQgIT0gdmFsdWUgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9yb2xlaWQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuSW5pdENoYXJhY3RlckluZm8oKTtcbiAgICAgICAgICAgIExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuYWRkc3RyKCBVc2VyRGF0YUluZm8ucm9sZWlkLHRoaXMuX3JvbGVpZC50b1N0cmluZygpICk7XG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IENoYXJhY3RlcklEKCk6bnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9sZWlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgTW9uZXkoIHZhbHVlOm51bWJlciApXG4gICAge1xuICAgICAgICBpZiggdGhpcy5fR29sZCAhPSB2YWx1ZSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX0dvbGQgPSB2YWx1ZTtcbiAgICAgICAgICAgIExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuYWRkc3RyKCBVc2VyRGF0YUluZm8uZ29sZCx0aGlzLl9Hb2xkLnRvU3RyaW5nKCkgKTtcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFVzZXJJbmZvRXZlbnQuVXNlckluZm9FdmVudF91cGRhdGVVc2VyRGF0YSApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBNb25leSgpOm51bWJlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX0dvbGQ7XG4gICAgfVxuXG59IiwiaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XG5cbmV4cG9ydCBjbGFzcyBTa2luRGF0YVxue1xuICAgIHJvbGVDRkc6Um9sZUNGRztcbiAgICAvKipcbiAgICAgKiAwOuacquaLpeacie+8jDHvvJrlt7Lnu4/mi6XmnIlcbiAgICAgKi9cbiAgICBzdGF0ZTpudW1iZXIgPSAwO1xuXG4gICAgaGFzbnVtOm51bWJlciA9IDA7XG4gICAgXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBjcmVhdGVUZXh0KCk6IHZvaWQge1xuICAgICAgICB2YXIgdHh0OkxheWEuVGV4dCA9IG5ldyBMYXlhLlRleHQoKTtcblxuICAgICAgICB0eHQudGV4dCA9IFwiTGF5YWJveOaYr0hUTUw15byV5pOO5oqA5pyv5o+Q5L6b5ZWG5LiO5LyY56eA55qE5ri45oiP5Y+R6KGM5ZWG77yM6Z2i5ZCRQVMvSlMvVFPlvIDlj5HogIXmj5DkvptIVE1MNeW8gOWPkeaKgOacr+aWueahiO+8gVwiO1xuXG4gICAgICAgIHR4dC53aWR0aCA9IDMwMDtcblxuICAgICAgICB0eHQuZm9udFNpemUgPSA0MDtcbiAgICAgICAgdHh0LmNvbG9yID0gXCIjZmZmZmZmXCI7XG5cbiAgICAgICAgLy/orr7nva7mlofmnKzkuLrlpJrooYzmlofmnKxcbiAgICAgICAgdHh0LndvcmRXcmFwID0gdHJ1ZTtcblxuICAgICAgICB0eHQueCA9IExheWEuc3RhZ2Uud2lkdGggLSB0eHQudGV4dFdpZHRoID4+IDE7XG4gICAgICAgIHR4dC55ID0gTGF5YS5zdGFnZS5oZWlnaHQgLSB0eHQudGV4dEhlaWdodCA+PiAxO1xuXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodHh0KTtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5cbiAgICBcbn0iLCJpbXBvcnQgRXZlbnQgPSBMYXlhLkV2ZW50O1xuZXhwb3J0IGNsYXNzIFVzZXJEYXRhSW5mb1xueyAgIFxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgXG4gICAgLyoqXG4gICAgICog6K6w5b2V5LiK5qyh56a75byA5pe26Ze0XG4gICAgICovXG4gICAgc3RhdGljIGxhc3R0aW1lOnN0cmluZyA9IFwibGFzdHRpbWVcIjtcblxuICAgIFxuICAgIHN0YXRpYyBjYXBsYXN0Zmx1c2h0aW1lOnN0cmluZyA9IFwiY2FwdGltZVwiO1xuICAgIHN0YXRpYyBjYXBzdG9yYWdlYXBwaWRzOnN0cmluZyA9IFwiY2FwYXBwaWRzXCI7XG4gICAgc3RhdGljIGhhc2dldGFwcGlkczpzdHJpbmcgPSBcImhhc2dldGFwcGlkc1wiO1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIG9uQ2FsbExhdGVyKCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZyhcIm9uQ2FsbExhdGVyIHRyaWdnZXJlZFwiKTtcblxuICAgICAgICB2YXIgdGV4dDpMYXlhLlRleHQgPSBuZXcgTGF5YS5UZXh0KCk7XG4gICAgICAgIHRleHQuZm9udCA9IFwiU2ltSGVpXCI7XG4gICAgICAgIHRleHQuZm9udFNpemUgPSAzMDtcbiAgICAgICAgdGV4dC5jb2xvciA9IFwiI0ZGRkZGRlwiO1xuICAgICAgICB0ZXh0LnRleHQgPSBcIuaJk+W8gOaOp+WItuWPsOWPr+ingeivpeWHveaVsOS7heinpuWPkeS6huS4gOasoVwiO1xuICAgICAgICB0ZXh0LnNpemUoTGF5YS5zdGFnZS53aWR0aCwgTGF5YS5zdGFnZS5oZWlnaHQpO1xuICAgICAgICB0ZXh0LndvcmRXcmFwID0gdHJ1ZTtcbiAgICAgICAgdGV4dC52YWxpZ24gPSBcIm1pZGRsZVwiO1xuICAgICAgICB0ZXh0LmFsaWduID0gXCJjZW50ZXJcIjtcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0ZXh0KTtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuXG4gICAgLyoqXG4gICAgICog6KeS6Imy5L+h5oGvXG4gICAgICovXG4gICAgc3RhdGljIHJvbGVEYXRhOnN0cmluZyA9IFwicm9sZURhdGFcIjtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgc3RhdGljIGdvbGQ6c3RyaW5nID0gXCJnb2xkXCI7XG4gICAgc3RhdGljIHJvbGVpZDpzdHJpbmcgPSBcInJvbGVpZFwiO1xuICAgIHN0YXRpYyBsZXZlbGlkOnN0cmluZyA9IFwibGV2ZWxpZFwiO1xuXG4gICAgLyoqXG4gICAgICog55qu6IKkXG4gICAgICovXG4gICAgc3RhdGljIHNraW46c3RyaW5nID0gXCJza2luXCI7XG5cbiAgICBzdGF0aWMgbGFzdERheTpzdHJpbmcgPSBcImxhc3REYXlcIjtcblxuICAgIHN0YXRpYyBub3dkYXlTaGFyZTpzdHJpbmcgPSBcImRheXNoYXJlXCI7XG5cbiAgICBzdGF0aWMgbm93ZGF5VmlkZW86c3RyaW5nID0gXCJkYXl2aWRlb1wiO1xuXG4gICAgXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgYnV0dG9uMTpMYXlhLlNwcml0ZTtcbiAgICBwcml2YXRlIGJ1dHRvbjI6TGF5YS5TcHJpdGU7XG4gICAgcHJpdmF0ZSBvbkRlY3JlYXNlQWxwaGExKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIC8v56e76Zmk6byg5qCH5Y2V5Ye75LqL5Lu2XG4gICAgICAgIHRoaXMuYnV0dG9uMS5vZmYoRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub25EZWNyZWFzZUFscGhhMSk7XG4gICAgICAgIC8v5a6a5pe25omn6KGM5LiA5qyhKOmXtOmalOaXtumXtClcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDMwMDAsIHRoaXMsIHRoaXMub25Db21wbGV0ZTEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25EZWNyZWFzZUFscGhhMihlOiBFdmVudCk6IHZvaWQge1xuICAgICAgICAvL+enu+mZpOm8oOagh+WNleWHu+S6i+S7tlxuICAgICAgICB0aGlzLmJ1dHRvbjIub2ZmKEV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9uRGVjcmVhc2VBbHBoYTIpO1xuICAgICAgICAvL+WumuaXtuaJp+ihjOS4gOasoSjln7rkuo7luKfnjocpXG4gICAgICAgIExheWEudGltZXIuZnJhbWVPbmNlKDYwLCB0aGlzLCB0aGlzLm9uQ29tcGxldGUyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ29tcGxldGUxKCk6IHZvaWQge1xuICAgICAgICAvL3NwQnRuMeeahOmAj+aYjuW6puWHj+WwkTAuNVxuICAgICAgICB0aGlzLmJ1dHRvbjEuYWxwaGEgLT0gMC41O1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Db21wbGV0ZTIoKTogdm9pZCB7XG4gICAgICAgIC8vc3BCdG4y55qE6YCP5piO5bqm5YeP5bCRMC41XG4gICAgICAgIHRoaXMuYnV0dG9uMi5hbHBoYSAtPSAwLjU7XG4gICAgfVxufSIsImV4cG9ydCBjbGFzcyBVc2VySW5mb0V2ZW50IFxue1xuICAgIHN0YXRpYyBVc2VySW5mb0V2ZW50X3VwZGF0ZVVzZXJEYXRhOnN0cmluZyA9IFwiVXNlckluZm9FdmVudF91cGRhdGVVc2VyRGF0YVwiO1xuXG4gICAgc3RhdGljIHVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkOnN0cmluZyA9IFwidXNlcmluZm9FdmVudF91cGRhdGVyb2xlaWRcIjtcblxuICAgIHN0YXRpYyB1c2VyaW5mb0V2ZW50X2xldmVsaWQ6c3RyaW5nID0gXCJ1c2VyaW5mb0V2ZW50X2xldmVsaWRcIjtcblxuICAgIHN0YXRpYyB1cGRhdGVQbGF5ZXJJbmZvOnN0cmluZyA9IFwiVXNlckluZm9FdmVudF91cGRhdGVQbGF5ZXJJbmZvXCI7XG59IiwiaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4vR2xvYmFsXCI7XG5pbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XG5pbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5cbmltcG9ydCB7Q29tcG9uZW50RXZlbnREYXRhfSBmcm9tIFwiLi9EYXRhL0NvbXBvbmVudEV2ZW50RGF0YVwiO1xuaW1wb3J0IHtSZWNDb25maWdzfSBmcm9tIFwiLi9Db25maWcvUmVjQ29uZmlnc1wiO1xuaW1wb3J0IHsgVGltZXNUYW1wZXIgfSBmcm9tIFwiLi9UaW1lL1RpbWVzVGFtcGVyXCI7XG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi9Db25maWcvQXNzZXRQYXRoXCI7XG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4vVGltZS9UaW1lclNlcnZpY2VcIjtcbmltcG9ydCB7R2xvYmFsV2FpdGluZ30gZnJvbSBcIi4vR2xvYmFsV2FpdGluZ1wiO1xuaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcbmltcG9ydCB7R2FtZVBvb2x9IGZyb20gXCIuL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcbmltcG9ydCB7IExheW91dENvbnRyb2wgfSBmcm9tIFwiLi9Db250cm9sL0xheW91dENvbnRyb2xcIjtcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4vVmlldy9WaWV3TWFuYWdlclwiO1xuaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuL0NvbnRyb2wvUmVzb3VyY2VDb250cm9sXCI7XG5pbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi9Db250cm9sL1Jlc0RhdGFDb250cm9sXCI7XG5pbXBvcnQge0F1ZGlvQ29udHJvbH0gZnJvbSBcIi4vQ29udHJvbC9BdWRpb0NvbnRyb2xcIjtcbmltcG9ydCB7IENvbm5lY3RDb250cm9sIH0gZnJvbSBcIi4vQ29udHJvbC9Db25uZWN0Q29udHJvbFwiO1xuaW1wb3J0IHtwaW5ndGFpdXRpbHN9IGZyb20gXCIuL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xuaW1wb3J0IHtBZ2VuY3lMb2dpbn0gZnJvbSBcIi4vQWdlbmN5L0FnZW5jeUxvZ2luXCI7XG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi9BZ2VuY3kvQWdlbmN5VXNlck1lc3NhZ2VcIjtcbmltcG9ydCB7QWdlbmN5TWFpbn0gZnJvbSBcIi4vQWdlbmN5L0FnZW5jeU1haW5cIjtcbmltcG9ydCB7QWdlbmN5SW5HYW1lfSBmcm9tIFwiLi9BZ2VuY3kvQWdlbmN5SW5HYW1lXCI7XG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuL0FnZW5jeS9BZ2VuY3lTa2luXCI7XG5pbXBvcnQge0FnZW5jeVRyaWFsfSBmcm9tIFwiLi9BZ2VuY3kvQWdlbmN5VHJpYWxcIjtcbmltcG9ydCB7QWdlbmN5TG90dGVyeX0gZnJvbSBcIi4vQWdlbmN5L0FnZW5jeUxvdHRlcnlcIjtcblxuLypcbiogbmFtZTtcbiovXG5leHBvcnQgY2xhc3MgR2FtZUNvbnRlbnRzIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcbntcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDliJ3lp4vljJbmuLjmiI9cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdEdhbWUoKTp2b2lkXG4gICAge1xuICAgICAgICBSZWNDb25maWdzLkluc3RhbmNlLmluaXQoKTtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuaW5pdCgpO1xuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuaW5pdCgpO1xuICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLmluaXRsYXllcigpO1xuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5pbml0KCk7XG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5pbml0KCk7XG4gICAgICAgIFJlc0RhdGFDb250cm9sLkluc3RhbmNlLmluaXQoKTtcbiAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLmluaXQoKTtcbiAgICAgICAgQ29ubmVjdENvbnRyb2wuQ29ubm5lY3QoKTtcbiAgICAgICAgVGltZXNUYW1wZXIuSW5zdGFuY2UuaW5pdCgpO1xuICAgICAgICBwaW5ndGFpdXRpbHMuSW5zdGFuY2UuaW5pdCgpO1xuICAgICAgICB0aGlzLmluaXRQb29sT2JqZWN0KCk7XG4gICAgICAgIHRoaXMuaW5pdFByb3h5KCk7XG4gICAgICAgIHRoaXMuaW5pdG1hcFZpZXcoKTtcbiAgICAgICAgdGhpcy5iZWdpbkxvYWRIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yid5aeL5YyW5a+56LGh5rGgXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbml0UG9vbE9iamVjdCgpOnZvaWRcbiAgICB7XG4gICAgICAgIEdhbWVQb29sLk1hcmsoIENvbXBvbmVudEV2ZW50RGF0YS5SZXNEaWNWYWx1ZSxDb21wb25lbnRFdmVudERhdGEgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliJ3lp4vljJbmqKHlnZfku6PnkIbnsbtcbiAgICAgKi9cbiAgICBwcml2YXRlIGluaXRQcm94eSgpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciBtdmNwb29sOlBhbmVsUmVzRGljID0gUGFuZWxSZXNEaWMuSW5zdGFuY2U7XG4gICAgICAgIG12Y3Bvb2wuQWdlbmN5QWRkKCBBZ2VuY3lMb2dpbiApO1xuICAgICAgICBtdmNwb29sLkFnZW5jeUFkZCggQWdlbmN5VXNlck1lc3NhZ2UgKTtcbiAgICAgICAgbXZjcG9vbC5BZ2VuY3lBZGQoIEFnZW5jeU1haW4gKTtcbiAgICAgICAgbXZjcG9vbC5BZ2VuY3lBZGQoIEFnZW5jeUluR2FtZSApO1xuICAgICAgICBtdmNwb29sLkFnZW5jeUFkZCggQWdlbmN5U2tpbiApO1xuICAgICAgICBtdmNwb29sLkFnZW5jeUFkZChBZ2VuY3lUcmlhbCApO1xuICAgICAgICBtdmNwb29sLkFnZW5jeUFkZCggQWdlbmN5TG90dGVyeSApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdG1hcFZpZXcoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgbXZjcG9vbDpQYW5lbFJlc0RpYyA9IFBhbmVsUmVzRGljLkluc3RhbmNlO1xuICAgICAgICAvLyBtdmNwb29sLm1hcFZpZXcoIE1hcFZpZXdUeXBlLkRhaWx5cmV3YXJkVmlldyxEYWlseXJld2FyZFZpZXcgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJlZ2luTG9hZEhhbmRsZXIoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgcGF0aGFycjpBcnJheTxhbnk+ID0gW107XG4gICAgICAgIHBhdGhhcnIucHVzaCggeyB1cmw6QXNzZXRQYXRoLmdldFJlc0NvbmZpZygpLCB0eXBlOiBMYXlhLkxvYWRlci5KU09OIH0gKTtcbiAgICAgICAgcGF0aGFyci5wdXNoKCB7IHVybDpBc3NldFBhdGguZ2V0R2FtZVZlcnNpb24oKSwgdHlwZTogTGF5YS5Mb2FkZXIuSlNPTiB9ICk7XG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5Mb2FkZXJzKCBwYXRoYXJyLHRoaXMsdGhpcy5yZWNsb2FkQ29tcGxldGUgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlY2xvYWRDb21wbGV0ZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciBnYW1ldmVyc2lvbjphbnkgPSBSZXNEYXRhQ29udHJvbC5JbnN0YW5jZS5HYWluUmVzb3VyY2VzKCBBc3NldFBhdGguZ2V0R2FtZVZlcnNpb24oKSxmYWxzZSApO1xuICAgICAgICBpZiggZ2FtZXZlcnNpb24gKVxuICAgICAgICB7XG4gICAgICAgICAgICBHbG9iYWwuZ2FtZVZlcnNpb24gPSBnYW1ldmVyc2lvbi52ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgR2xvYmFsLmdhbWVWZXJzaW9uID0gXCIxLjAuMFwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25maWdyZXM6YW55ID0gUmVzRGF0YUNvbnRyb2wuSW5zdGFuY2UuR2FpblJlc291cmNlcyggQXNzZXRQYXRoLmdldFJlc0NvbmZpZygpLGZhbHNlICk7XG4gICAgICAgIFJlY0NvbmZpZ3MuSW5zdGFuY2UuaW5pdFJlYyggY29uZmlncmVzICk7XG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkR3JvdXAoXCJsb2FkaW5nXCIsdGhpcyx0aGlzLm9uUHJlTG9hZGVkLHRoaXMub25QcmVwcm9ncmVzcyApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25QcmVwcm9ncmVzcyh2YWx1ZTpudW1iZXIpOnZvaWRcbiAgICB7XG4gICAgICAgIFxuICAgIH1cblxuICAgIHByaXZhdGUgb25QcmVMb2FkZWQoKTp2b2lkXG4gICAge1xuICAgICAgICBSZXNEYXRhQ29udHJvbC5JbnN0YW5jZS5BZGRWaWV3UGFja0J5TmFtZSggXCJsb2FkaW5nXCIsdHJ1ZSxmYWxzZSApO1xuICAgICAgICB2YXIgZ2xvYmFsd2FpdHVybDpzdHJpbmcgPSBmYWlyeWd1aS5VSVBhY2thZ2UuZ2V0SXRlbVVSTChcImxvYWRpbmdcIixcImdsb2JhbFdhaXRpbmdcIik7XG4gICAgICAgIFBhbmVsQmFzZUNvbnRyb2wudmlld2JnVXJsID0gZmFpcnlndWkuVUlQYWNrYWdlLmdldEl0ZW1VUkwoXCJsb2FkaW5nXCIsXCJpbWdfYmxhY2tcIik7XG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihnbG9iYWx3YWl0dXJsLCBHbG9iYWxXYWl0aW5nKTtcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcuZ2xvYmFsTW9kYWxXYWl0aW5nID0gZ2xvYmFsd2FpdHVybDtcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcud2luZG93TW9kYWxXYWl0aW5nID0gZ2xvYmFsd2FpdHVybDtcbiAgICAgICAgLy8gQ1BBVXRpbHMuaW5pdCgpO1xuICAgICAgICB0aGlzLkxvZ2luKCk7XG4gICAgfVxuXG4gICAgcHVibGljIExvZ2luKCk6dm9pZFxuICAgIHtcbiAgICAgICAgKFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5TG9naW4gKSBhcyBBZ2VuY3lMb2dpbikuTG9naW4oKTtcbiAgICB9XG59IiwiaW1wb3J0IHtTY2VuZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcbmltcG9ydCB7UmVzRGF0YUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1Jlc0RhdGFDb250cm9sXCI7XG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xuaW1wb3J0IEdhbWVDRkcgZnJvbSBcIi4uL0NGRy9HYW1lQ0ZHXCI7XG5cbmltcG9ydCBTcHJpdGUgPSBMYXlhLlNwcml0ZTtcblx0aW1wb3J0IFN0YWdlID0gTGF5YS5TdGFnZTtcblx0aW1wb3J0IE1hcExheWVyID0gTGF5YS5NYXBMYXllcjtcblx0aW1wb3J0IFRpbGVkTWFwID0gTGF5YS5UaWxlZE1hcDtcblx0aW1wb3J0IFBvaW50ID0gTGF5YS5Qb2ludDtcblx0aW1wb3J0IFJlY3RhbmdsZSA9IExheWEuUmVjdGFuZ2xlO1xuXHRpbXBvcnQgSGFuZGxlciA9IExheWEuSGFuZGxlcjtcbiAgICBpbXBvcnQgV2ViR0wgPSBMYXlhLldlYkdMO1xuICAgIFxuXG5leHBvcnQgY2xhc3MgQ2FtZXJhTWFuYWdlciBleHRlbmRzIExheWEuU2NyaXB0M0RcbntcbiAgICBwcm90ZWN0ZWQgY2FtZXJhOiBMYXlhLkNhbWVyYTtcbiAgICBwcml2YXRlIF90cmFuc2Zvcm06TGF5YS5UcmFuc2Zvcm0zRDtcbiAgICBwcml2YXRlIF9kaXNWZWN0b3I6TGF5YS5WZWN0b3IzO1xuICAgIHByaXZhdGUgX3RvVmVjOkxheWEuVmVjdG9yMztcbiAgICBwdWJsaWMgaXNjYW5mb2xsb3c6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkF3YWtlKCk6dm9pZHtcbiAgICAgICAgLy/ojrflj5bohJrmnKzmiYDlsZ7lr7nosaFcbiAgICAgICAgdGhpcy5jYW1lcmEgPSB0aGlzLm93bmVyIGFzIExheWEuQ2FtZXJhO1xuICAgICAgICB0aGlzLl90b1ZlYyA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcbiAgICAgICAgdGhpcy5jYW1lcmEuZmllbGRPZlZpZXcgPSA5MDtcbiAgICB9XG5cbiAgICBcblxuICAgIHB1YmxpYyBvblN0YXJ0KCk6dm9pZHtcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5jYW1lcmEudHJhbnNmb3JtO1xuICAgICAgICAvL+aXi+i9rOaRhOWDj+acuuinkuW6plxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucm90YXRlKG5ldyBMYXlhLlZlY3RvcjMoIDAsIDAsIDApLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIC8vIHRoaXMuY2FtZXJhLmNsZWFyQ29sb3IgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgdGlsZWRNYXA6IFRpbGVkTWFwO1xuXHRcdHByaXZhdGUgbGF5ZXI6IE1hcExheWVyO1xuXHRcdHByaXZhdGUgc3ByaXRlOiBTcHJpdGU7XG4gICAgcHJpdmF0ZSBjcmVhdGVNYXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGlsZWRNYXAgPSBuZXcgVGlsZWRNYXAoKTtcbiAgICAgICAgdGhpcy50aWxlZE1hcC5jcmVhdGVNYXAoXCJyZXMvdGlsZWRNYXAvaXNvbWV0cmljX2dyYXNzX2FuZF93YXRlci5qc29uXCIsIG5ldyBSZWN0YW5nbGUoMCwgMCwgTGF5YS5zdGFnZS53aWR0aCwgTGF5YS5zdGFnZS5oZWlnaHQpLCBIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm1hcExvYWRlZCksIG51bGwsIG5ldyBQb2ludCgxNjAwLCA4MDApKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU3RhZ2VDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdmFyIHA6IFBvaW50ID0gbmV3IFBvaW50KDAsIDApO1xuICAgICAgICB0aGlzLmxheWVyLmdldFRpbGVQb3NpdGlvbkJ5U2NyZWVuUG9zKExheWEuc3RhZ2UubW91c2VYLCBMYXlhLnN0YWdlLm1vdXNlWSwgcCk7XG4gICAgICAgIHRoaXMubGF5ZXIuZ2V0U2NyZWVuUG9zaXRpb25CeVRpbGVQb3MoTWF0aC5mbG9vcihwLngpLCBNYXRoLmZsb29yKHAueSksIHApO1xuICAgICAgICB0aGlzLnNwcml0ZS5wb3MocC54LCBwLnkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFwTG9hZGVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxheWVyID0gdGhpcy50aWxlZE1hcC5nZXRMYXllckJ5SW5kZXgoMCk7XG5cbiAgICAgICAgdmFyIHJhZGl1c1g6IG51bWJlciA9IDMyO1xuICAgICAgICB2YXIgcmFkaXVzWTogbnVtYmVyID0gTWF0aC50YW4oMTgwIC8gTWF0aC5QSSAqIDMwKSAqIHJhZGl1c1g7XG4gICAgICAgIHZhciBjb2xvcjogc3RyaW5nID0gXCIjRkY3RjUwXCI7XG5cbiAgICAgICAgdGhpcy5zcHJpdGUgPSBuZXcgU3ByaXRlKCk7XG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKDAsIDAsIC1yYWRpdXNYLCByYWRpdXNZLCBjb2xvcik7XG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKDAsIDAsIHJhZGl1c1gsIHJhZGl1c1ksIGNvbG9yKTtcbiAgICAgICAgdGhpcy5zcHJpdGUuZ3JhcGhpY3MuZHJhd0xpbmUoLXJhZGl1c1gsIHJhZGl1c1ksIDAsIHJhZGl1c1kgKiAyLCBjb2xvcik7XG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKHJhZGl1c1gsIHJhZGl1c1ksIDAsIHJhZGl1c1kgKiAyLCBjb2xvcik7XG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5zcHJpdGUpO1xuICAgIH1cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuICAgIHByaXZhdGUgX3VwdmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoIDAsMSwwICk7XG4gICAgcHJpdmF0ZSBfaW5kZXg6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIF9zbGVycFZhbHVlOm51bWJlciA9IDg7XG4gICAgcHJpdmF0ZSBfbG9va2F0VmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XG4gICAgcHVibGljIG9uVXBkYXRlKCk6IHZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLmlzY2FuZm9sbG93IClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmlzY2FybWFucGMgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5ucGNEaWN0W1wibnBjXzBcIl0gKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5WZWN0b3IzLmFkZCggUHJvcE1hbmFnZXIubnBjRGljdFtcIm5wY18wXCJdLnRyYW5zZm9ybS5wb3NpdGlvbix0aGlzLl9kaXNWZWN0b3IsdGhpcy5fdG9WZWMgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy5fdG9WZWM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54ID0gUHJvcE1hbmFnZXIubnBjRGljdFtcIm5wY18wXCJdLnRyYW5zZm9ybS5wb3NpdGlvbi54O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLmxvb2tBdCggUHJvcE1hbmFnZXIubnBjRGljdFtcIm5wY18wXCJdLnRyYW5zZm9ybS5wb3NpdGlvbix0aGlzLl91cHZlYyApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIubWFpblJvbGUgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5WZWN0b3IzLmFkZCggUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLHRoaXMuX2Rpc1ZlY3Rvcix0aGlzLl90b1ZlYyApO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90b1ZlYy54ID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLng7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX3RvVmVjO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24sdGhpcy5fdXB2ZWMgKTtcblxuICAgICAgICAgICAgICAgICAgICBMYXlhLlZlY3RvcjMubGVycCggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLHRoaXMuX3RvVmVjLDE2LzEwMDAgKiB0aGlzLl9zbGVycFZhbHVlLHRoaXMuX3RvVmVjICk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuX3RvVmVjLnogPSBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24ueit0aGlzLl9kaXNWZWN0b3IuejtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdG9WZWMueSA9IFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi55ICsgdGhpcy5fZGlzVmVjdG9yLnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX3RvVmVjO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb29rYXRWZWMueCA9IHRoaXMuX3RvVmVjLng7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvb2thdFZlYy55ID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvb2thdFZlYy56ID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLno7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5sb29rQXQoIHRoaXMuX2xvb2thdFZlYyx0aGlzLl91cHZlYyApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBHYW1lRW5kUm90YXRlKHRhcmdldFBvczpMYXlhLlZlY3RvcjMsIHNwZWVkOkxheWEuVmVjdG9yMyApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuaXNjYW5mb2xsb3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSggc3BlZWQsZmFsc2UgKTtcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtLmxvb2tBdCggdGFyZ2V0UG9zLHRoaXMuX3VwdmVjICk7XG4gICAgfVxuXG5cblxuICAgIHB1YmxpYyBTZXRDYW1lcmFQb3NpdGlvbiggdmVjOkxheWEuVmVjdG9yMyApOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciB2YWx1ZUFycjpBcnJheTxzdHJpbmc+ID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKCBHYW1lQ0ZHLmRpY3RbMV0udmFsdWUgKTtcbiAgICAgICAgdGhpcy5fZGlzVmVjdG9yID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIoIHZhbHVlQXJyWzBdICksTnVtYmVyKCB2YWx1ZUFyclsxXSApLE51bWJlciggdmFsdWVBcnJbMl0gKSk7XG4gICAgICAgIExheWEuVmVjdG9yMy5hZGQodmVjICx0aGlzLl9kaXNWZWN0b3IsdGhpcy5fdG9WZWMgKTtcbiAgICAgICAgdGhpcy5jYW1lcmEudHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy5fdG9WZWM7XG4gICAgICAgIHRoaXMuY2FtZXJhLnRyYW5zZm9ybS5wb3NpdGlvbi54ID0gdmVjLng7XG4gICAgICAgIC8vIHRoaXMuY2FtZXJhLnRyYW5zZm9ybS5sb29rQXQoIHZlYyxuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApICk7XG4gICAgfVxuXG59IiwiaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcbmltcG9ydCB7Q2hhcmFjdGVyU3RhdGV9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclN0YXRlXCI7XG5pbXBvcnQge1JvbGVEYXRhfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xuaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWNcIjtcbmltcG9ydCB7QWdlbmN5VXNlck1lc3NhZ2V9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VXNlck1lc3NhZ2VcIjtcbmltcG9ydCBCdWlsZENGRyBmcm9tIFwiLi4vQ0ZHL0J1aWxkQ0ZHXCI7XG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XG5pbXBvcnQge0NhbWVyYU1hbmFnZXJ9IGZyb20gXCIuL0NhbWVyYU1hbmFnZXJcIjtcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xuaW1wb3J0IE5wY0NGRyBmcm9tIFwiLi4vQ0ZHL05wY0NGR1wiO1xuXG5leHBvcnQgY2xhc3MgTnBjU2NyaXB0IGV4dGVuZHMgTGF5YS5TY3JpcHQzRCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxue1xuICAgIHByaXZhdGUgX3RyYW5zZm9ybTpMYXlhLlRyYW5zZm9ybTNEO1xuICAgIHByaXZhdGUgX2lzY2FuTW92ZTpib29sZWFuO1xuICAgIHByaXZhdGUgX3NwZWVkTW92ZVYzOkxheWEuVmVjdG9yMztcblxuICAgIHByaXZhdGUgX25vd0FjdGlvbjpzdHJpbmcgPSBcIlwiO1xuXG4gICAgcHJpdmF0ZSBfYW5pbWF0b3I6TGF5YS5BbmltYXRvcjtcblxuICAgIHJlc291c2VOYW1lOnN0cmluZyA9IFwiXCI7XG5cbiAgICBwcml2YXRlIF9zaGFuZ3BhVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XG5cbiAgICAvKirmmK/lkKblj5HnlJ/norDmkp4gKi9cbiAgICBwcml2YXRlIGhhdmVDb2xsaXNpb246Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX1RhcmdldENvbGxpc2lvbjpzdHJpbmcgPSBcIlwiO1xuICAgIHByaXZhdGUgX25vcm1hbGl6ZVZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xuICAgIFxuICAgIHByaXZhdGUgX25vd3NlbGVjdFZlYzpMYXlhLlZlY3RvcjM7XG5cbiAgICBwcml2YXRlIHN0YXlidWlsZDpzdHJpbmcgPSBcIlwiO1xuICAgIFxuICAgIHByaXZhdGUgc3RheXNjZW5lOnN0cmluZyA9IFwiXCI7XG4gICAgLyoqXG4gICAgICogMDrmnKrplIHvvIwx77ya6ZSB5bem6L6577yMMu+8mumUgeWPs+i+uVxuICAgICAqL1xuICAgIHByaXZhdGUgX2xvY2t4c3RhdGU6bnVtYmVyID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQXdha2UoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fYW5pbWF0b3IgPSAodGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEKS5nZXRDb21wb25lbnQoIExheWEuQW5pbWF0b3IgKTtcbiAgICAgICAgUHJvcE1hbmFnZXIuc2V0QW5pbWF0b3IoIHRoaXMuX2FuaW1hdG9yICk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU3RhcnQoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMgPSBuZXcgTGF5YS5WZWN0b3IzKCAwLDAsMCApO1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSAodGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm07XG4gICAgICAgIHZhciBzcDpMYXlhLlNwcml0ZTNEID0gdGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEO1xuICAgICAgICAoc3AuZ2V0Q2hpbGRCeU5hbWUoXCJsZWZ0dHJhaWxcIikgYXMgTGF5YS5UcmFpbFNwcml0ZTNEKS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgKHNwLmdldENoaWxkQnlOYW1lKFwicmlnaHR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0QgKS5hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0UG9zVmVjOkxheWEuVmVjdG9yMztcbiAgICAvKipcbiAgICAgKiDnirbmgIHvvIww77ya562J5b6F54q25oCB77yMMe+8muW8gOWni+eKtuaAge+8jDLvvJrlrozmiJDnirbmgIFcbiAgICAgKi9cbiAgICBwcml2YXRlIF9ub3dSb2xlU3RhdGU6bnVtYmVyID0gMDtcblxuICAgIHB1YmxpYyBzdGFydFJ1bigpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl9ub3dOcGNpbmZvLmdyYXZpdHkgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLkdyYXZpdHlfZyA9IHRoaXMuX25vd05wY2luZm8uZ3Jhdml0eTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuR3Jhdml0eV9nID0gMTA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hlY2t0aW1lID0gNTAwO1xuICAgICAgICB0aGlzLl9ub3dSb2xlU3RhdGUgPSAxO1xuICAgICAgICB0aGlzLl9lbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSAwO1xuICAgICAgICB0aGlzLl9pbml0UG9zVmVjID0gdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XG4gICAgICAgIHRoaXMuc3RheWJ1aWxkID0gXCJcIjtcbiAgICAgICAgdGhpcy5zdGF5c2NlbmUgPSBcIlwiO1xuICAgICAgICB0aGlzLl9ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5zdGFuZDtcbiAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzLnggPSAwO1xuICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy55ID0gMDtcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueiA9IC10aGlzLm1vdmVzcGVlZDtcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gdHJ1ZTtcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX25vd05wY2luZm86TnBjQ0ZHO1xuXG4gICAgbW92ZXNwZWVkOm51bWJlciA9IDA7XG4gICAgZnJvbnRqdW1wc3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcbiAgICBsZWZ0anVtcHNwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XG4gICAgcmlnaHRqdW1wc3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcbiAgICBjbGltYnNwZWVkOm51bWJlciA9IDA7XG4gICAgc2lkZWNsaW1ic3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcblxuICAgIHB1YmxpYyBucGNpbmZvKCBjZmc6TnBjQ0ZHICk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5fbm93TnBjaW5mbyA9IGNmZztcbiAgICAgICAgdGhpcy5tb3Zlc3BlZWQgPSB0aGlzLl9ub3dOcGNpbmZvLnNwZWVkO1xuICAgICAgICB0aGlzLmNsaW1ic3BlZWQgPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8udXBjbGltYiApO1xuICAgICAgICB0aGlzLmZyb250anVtcHNwZWVkID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIodGhpcy5fbm93TnBjaW5mby5mcm9udGp1bXAueCksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmZyb250anVtcC55KSxOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uZnJvbnRqdW1wLnopKVxuICAgICAgICB0aGlzLmxlZnRqdW1wc3BlZWQgPSBuZXcgTGF5YS5WZWN0b3IzKE51bWJlcih0aGlzLl9ub3dOcGNpbmZvLmxlZnRqdW1wLngpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5sZWZ0anVtcC55KSxOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ubGVmdGp1bXAueikpXG4gICAgICAgIHRoaXMucmlnaHRqdW1wc3BlZWQgPSBuZXcgTGF5YS5WZWN0b3IzKE51bWJlcih0aGlzLl9ub3dOcGNpbmZvLnJpZ2h0anVtcC54KSxOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ucmlnaHRqdW1wLnkpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5yaWdodGp1bXAueikpXG4gICAgICAgIHRoaXMuc2lkZWNsaW1ic3BlZWQgPSBuZXcgTGF5YS5WZWN0b3IzKE51bWJlcih0aGlzLl9ub3dOcGNpbmZvLnNsaWRlY2xpbWIueCksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnNsaWRlY2xpbWIueSksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnNsaWRlY2xpbWIueikpXG4gICAgICAgIFxuICAgICAgICAvLyB0aGlzLmZyb250anVtcC54ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmZyb250anVtcC54ICk7XG4gICAgICAgIC8vIHRoaXMuZnJvbnRqdW1wLnkgPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uZnJvbnRqdW1wLnkgKTtcbiAgICAgICAgLy8gdGhpcy5mcm9udGp1bXAueiA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5mcm9udGp1bXAueiApO1xuXG4gICAgICAgIC8vIHRoaXMubGVmdGp1bXAueCA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5sZWZ0anVtcC54ICk7XG4gICAgICAgIC8vIHRoaXMubGVmdGp1bXAueSA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5sZWZ0anVtcC55ICk7XG4gICAgICAgIC8vIHRoaXMubGVmdGp1bXAueiA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5sZWZ0anVtcC56ICk7XG4gICAgICAgIFxuICAgICAgICAvLyB0aGlzLnJpZ2h0anVtcC54ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnJpZ2h0anVtcC54ICk7XG4gICAgICAgIC8vIHRoaXMucmlnaHRqdW1wLnkgPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ucmlnaHRqdW1wLnkgKTtcbiAgICAgICAgLy8gdGhpcy5yaWdodGp1bXAueiA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5yaWdodGp1bXAueiApO1xuXG4gICAgICAgIC8vIHRoaXMudXBjbGltYiA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby51cGNsaW1iICk7XG5cbiAgICAgICAgLy8gdGhpcy5zbGlkZWNsaW1iLnggPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uc2xpZGVjbGltYi54ICk7XG4gICAgICAgIC8vIHRoaXMuc2xpZGVjbGltYi55ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnNsaWRlY2xpbWIueSApO1xuICAgICAgICAvLyB0aGlzLnNsaWRlY2xpbWIueiA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5zbGlkZWNsaW1iLnogKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICog5byA5aeL56Kw5pKe5pe25omn6KGMXG4gICAgICovXG4gICAgcHVibGljIG9uQ29sbGlzaW9uRW50ZXIoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIHtcbiAgICAgICAgaWYoIGNvbGxpc2lvbiAmJiBjb2xsaXNpb24uY29udGFjdHMgJiYgY29sbGlzaW9uLmNvbnRhY3RzLmxlbmd0aCA+IDAgJiYgY29sbGlzaW9uLm90aGVyIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlKCBjb250YWN0UG9pbnQubm9ybWFsLGNvbGxpc2lvbi5vdGhlci5vd25lcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcblxuICAgIHB1YmxpYyBzZXRub3dTZWxlY3RWZWMoIHBvczpMYXlhLlZlY3RvcjMgKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBwb3M7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbG9ja2J5QnVpbGRuYW1lOnN0cmluZyA9IFwiXCI7XG4gICAgLyoqXG4gICAgICogMDrmnKrooqvplIHvvIwx77ya6ZSB5a6a5bem6L6577yMMu+8mumUgeWumuWPs+i+ue+8jFxuICAgICAqL1xuICAgIHByaXZhdGUgX2xvY2tzdGF0ZTpudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgQ2FsY3VsYXRlKCBub3JtYWw6TGF5YS5WZWN0b3IzLHRhcmdldDpMYXlhLk5vZGUgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGFyZ2V0Lm5hbWUgPT0gXCJTbGlkZXJCb29zdFwiIHx8IHRhcmdldC5uYW1lLmluZGV4T2YoIFwibnBjXCIgKSAhPSAtMSB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcInJvbGVcIiApICE9IC0xIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX1RhcmdldENvbGxpc2lvbiA9IHRhcmdldC5uYW1lO1xuICAgICAgICB2YXIgbjpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xuICAgICAgICBMYXlhLlZlY3RvcjMubm9ybWFsaXplKG5vcm1hbCx0aGlzLl9ub3JtYWxpemVWZWMpO1xuICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcIlNjYWZmb2xkaW5nXCIgKSAhPSAtMSB8fFxuICAgICAgICB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xICkgLy/norDliLDlu7rnrZHvvIzliKTmlq3mmK/kuIrniKzvvIzlt6bniKzov5jmmK/lj7PniKxcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF5YnVpbGQgPSB0aGlzLl9UYXJnZXRDb2xsaXNpb247XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF5c2NlbmUgPSB0YXJnZXQucGFyZW50LnBhcmVudC5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50LnBhcmVudC5uYW1lLHRhcmdldC5wYXJlbnQubmFtZSApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWUsdGhpcy5fVGFyZ2V0Q29sbGlzaW9uICk7XG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ID09IC0xICkgLy/kuIrniKxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93c2VsZWN0VmVjICYmIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55ID4gKHRoaXMuX25vd3NlbGVjdFZlYy55IC0gMC4xKSAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLngsdGhpcy5fbm93c2VsZWN0VmVjLnksdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy55ID09IDEgfHx0aGlzLl9ub3JtYWxpemVWZWMueSA9PSAtMSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueCA9PSAtMSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cCApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQ7ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy54ID09IDEgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5ydW4gKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1idXAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodDsgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ICE9IDEgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwYmxvY2s7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwicGFuZWxfanVtcFwiICkgIT0gLTEgKSAvL+WKoOmAn+adv+i3s+i3g1xuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wO1xuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd0FjdGlvbiApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKFwicGFuZWxfZG93bnNsaXBcIikgIT0gLTEgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmRvd25tb3ZlO1xuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd0FjdGlvbiApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImJveF9Cb2FyZFwiICkgIT0gLTEgJiYgdGhpcy5ub3dBY3Rpb24gIT0gQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmUgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnogPT0gLTEgKSAvL+S4iueIrFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiYm94X3NpZGVqdW1wXCIgKSAhPSAtMSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuc2lkZXNwZWVkdXA7XG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiYm94X1N1cm1vdW50XCIgKSAhPSAtMSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY3Jvc3M7XG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDtcbiAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiDmjIHnu63norDmkp7ml7bmiafooYxcbiAgICAgKi9cbiAgICBwdWJsaWMgIG9uQ29sbGlzaW9uU3RheShjb2xsaXNpb246TGF5YS5Db2xsaXNpb24pOnZvaWQgXG4gICAge1xuICAgICAgICAvLyBEZWJ1Z2VyLmxvZyggXCLnorDmkp7kuK1cIiApO1xuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmhhdmVDb2xsaXNpb24gPSB0cnVlO1xuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBjb2xsaXNpb24ub3RoZXIub3duZXI7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0bmFtZTpzdHJpbmcgPSB0YXJnZXQubmFtZTtcbiAgICAgICAgICAgIGlmKCB0YXJnZXRuYW1lICE9IFwiU2xpZGVyQm9vc3RcIiAmJiB0YXJnZXRuYW1lLmluZGV4T2YoIFwibnBjXCIgKSA9PSAtMSAmJiB0YXJnZXRuYW1lLmluZGV4T2YoIFwicm9sZVwiICkgPT0gLTEgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX1RhcmdldENvbGxpc2lvbiA9IHRhcmdldG5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcIlNjYWZmb2xkaW5nXCIgKSAhPSAtMSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEgKSAvL+eisOWIsOW7uuetke+8jOWIpOaWreaYr+S4iueIrO+8jOW3pueIrOi/mOaYr+WPs+eIrFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF5YnVpbGQgPSB0aGlzLl9UYXJnZXRDb2xsaXNpb247XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RheXNjZW5lID0gdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQucGFyZW50Lm5hbWUgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0aGlzLl9UYXJnZXRDb2xsaXNpb24gKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOe7k+adn+eisOaSnuaXtuaJp+ihjFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbGxpc2lvbkV4aXQoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIFxuICAgIHtcbiAgICAgICAgdGhpcy5oYXZlQ29sbGlzaW9uID0gZmFsc2U7XG4gICAgICAgIGlmKCBjb2xsaXNpb24gJiYgY29sbGlzaW9uLmNvbnRhY3RzICYmIGNvbGxpc2lvbi5jb250YWN0cy5sZW5ndGggPiAwICYmIGNvbGxpc2lvbi5vdGhlciApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQ6TGF5YS5Db250YWN0UG9pbnQgPSBjb2xsaXNpb24uY29udGFjdHNbMF07XG4gICAgICAgICAgICB0aGlzLkNoZWNrRW5kKCBjb250YWN0UG9pbnQubm9ybWFsLGNvbGxpc2lvbi5vdGhlci5vd25lciApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBDaGVja0VuZCggbm9ybWFsOkxheWEuVmVjdG9yMyx0YXJnZXQ6TGF5YS5Ob2RlICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRhcmdldC5uYW1lID09IFwiU2xpZGVyQm9vc3RcIiB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcIm5wY1wiICkgIT0gLTEgfHwgdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJyb2xlXCIgKSAhPSAtMSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiggdGhpcy5IYXZlRm9yY2VKdW1wIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5IYXZlRm9yY2VKdW1wID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYoIHRoaXMuX2xvY2t4c3RhdGUgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uICE9IHRhcmdldC5uYW1lIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmKCB0YXJnZXQubmFtZS5pbmRleE9mKCBcInBhbmVsX2p1bXBcIiApICE9IC0xIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCggdGhpcy5ub3dBY3Rpb24gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXA6XG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXBibG9jazpcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiYm94X0JvYXJkXCIgKSAhPSAtMSApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkp1bXBBY3Rpb24oIHRoaXMuX2NoYW5nZU1vdmVYICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQ6XG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdDpcbiAgICAgICAgICAgICAgICB0aGlzLkp1bXBBY3Rpb24oIHRoaXMuX2NoYW5nZU1vdmVYICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucnVuOlxuICAgICAgICAgICAgICAgIHRoaXMuSnVtcEFjdGlvbiggdGhpcy5fY2hhbmdlTW92ZVggKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5Nb3ZlWDpcbiAgICAgICAgICAgIHRoaXMuSnVtcEFjdGlvbiggdGhpcy5fc3BlZWRNb3ZlVjMueCApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIEp1bXBBY3Rpb24oIHZhbHVlOm51bWJlcixpc3F1YW56aG9uZzpib29sZWFuID0gZmFsc2UgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdmFsdWUgPiAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiggdmFsdWUgPCAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCBpc3F1YW56aG9uZyApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSApIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFsbHZhbHVlOm51bWJlciA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGRpcjpzdHJpbmcgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwibGVmdHJpZ2h0XCIgKSAhPSAtMSApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbHZhbHVlID0gdGhpcy5fbm93TnBjaW5mby5qdW1wX2xlZnQgKyB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCxhbGx2YWx1ZSApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjaW5mby5qdW1wX2xlZnQgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwicmlnaHRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJmcm9udHJpZ2h0XCIgKSAhPSAtMSApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbHZhbHVlID0gdGhpcy5fbm93TnBjaW5mby5zdGFydF9haGVhZCArIHRoaXMuX25vd05wY2luZm8uanVtcF9yaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLGFsbHZhbHVlICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8PSB0aGlzLl9ub3dOcGNpbmZvLnN0YXJ0X2FoZWFkIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcImZyb250XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJyaWdodFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImZyb250bGVmdFwiICkgIT0gLTEgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY2luZm8uc3RhcnRfYWhlYWQgKyB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfbGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLGFsbHZhbHVlICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8PSB0aGlzLl9ub3dOcGNpbmZvLnN0YXJ0X2FoZWFkIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcImZyb250XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJsZWZ0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwicmlnaHRcIiApICE9IC0xIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJyaWdodFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImxlZnRcIiApICE9IC0xIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJsZWZ0XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiZnJvbnRcIiApICE9IC0xIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsdmFsdWUgPSB0aGlzLl9ub3dOcGNpbmZvLnN0YXJ0X2FoZWFkICsgdGhpcy5fbm93TnBjaW5mby5qdW1wX2xlZnQgKyB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCxhbGx2YWx1ZSApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjaW5mby5zdGFydF9haGVhZCApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggc29ydCA8PSB0aGlzLl9ub3dOcGNpbmZvLnN0YXJ0X2FoZWFkICsgdGhpcy5fbm93TnBjaW5mby5qdW1wX2xlZnQgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwicmlnaHRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHNlbGVjdGRpciApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmcm9udFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBMYXN0QWN0aW9uOnN0cmluZyA9IFwiXCI7XG4gICAgcHJpdmF0ZSBfbW92ZVRpbWU6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIF9jaGl4dVRpbWU6bnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgX2lzQWN0aW9uTnVtczpib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaXNuZWVkYWN0aW9ubnVtOm51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBfbmVlZGFjdGlvbnRpbWU6bnVtYmVyID0gMDtcblxuICAgIHB1YmxpYyBzZXQgbm93QWN0aW9uKCB2YWx1ZTpzdHJpbmcgKVxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuX25vd1JvbGVTdGF0ZSA9PSAxIClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0FjdGlvbiAhPSB2YWx1ZSB8fCB0aGlzLkxhc3RBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXB8fHRoaXMuTGFzdEFjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuTGFzdEFjdGlvbiA9IHRoaXMuX25vd0FjdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dBY3Rpb24gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XG4gICAgICAgICAgICAgICAgc3dpdGNoKCB0aGlzLl9ub3dBY3Rpb24gKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zdGFuZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnN0YW5kICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnJ1bjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLkxhc3RBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcCB8fCB0aGlzLkxhc3RBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQgfHx0aGlzLkxhc3RBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0IClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8IDUwIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5sYW5kMSApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUubGFuZDIgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmp1bXAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMuZnJvbnRqdW1wc3BlZWQueDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLmZyb250anVtcHNwZWVkLnk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5mcm9udGp1bXBzcGVlZC56O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkID0gdGhpcy5sZWZ0anVtcHNwZWVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMubGVmdGp1bXBzcGVlZC54O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMubGVmdGp1bXBzcGVlZC55O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMubGVmdGp1bXBzcGVlZC56O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUubGVmdGp1bXAgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQgPSB0aGlzLnJpZ2h0anVtcHNwZWVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMucmlnaHRqdW1wc3BlZWQueDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLnJpZ2h0anVtcHNwZWVkLnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5yaWdodGp1bXBzcGVlZC56O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucmlnaHRqdW1wICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJwYW5lbF9qdW1wXCIgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLkxhc3RBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXAgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLmp1bXBTcGVlZC56KmJ1aWxkY2ZnLmJ1ZmZ6O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPCA1MCApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMSApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDIgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmU6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcInBhbmVsX2Rvd25zbGlwXCIgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hpeHVUaW1lID0gYnVpbGRjZmcudGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmh1YWNoYW4gKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY3Jvc3M6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcImJveF9TdXJtb3VudFwiIF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZng7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnkrMC41O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZno7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGl4dVRpbWUgPSBidWlsZGNmZy50aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuaHVyZGxlICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cGJsb2NrOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5jbGltYnNwZWVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5jbGltYndhbGwgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQgPSBuZXcgTGF5YS5WZWN0b3IzKDAsdGhpcy5zaWRlY2xpbWJzcGVlZC55LHRoaXMuc2lkZWNsaW1ic3BlZWQueilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuc2lkZWNsaW1ic3BlZWQueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLnNpZGVjbGltYnNwZWVkLno7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW53YWxsbGVmdCApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQgPSBuZXcgTGF5YS5WZWN0b3IzKDAsdGhpcy5zaWRlY2xpbWJzcGVlZC55LHRoaXMuc2lkZWNsaW1ic3BlZWQueilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuc2lkZWNsaW1ic3BlZWQueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLnNpZGVjbGltYnNwZWVkLno7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW53YWxscmlnaHQgKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuQ2xpbWJNb3Rpb246XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25lZWRhY3Rpb250aW1lID0gMC4zO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmNsaW1iZW5kICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbm93QWN0aW9uKCk6c3RyaW5nXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm93QWN0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgX21vdmVWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcbiAgICBwcml2YXRlIGp1bXBTcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xuICAgIHByaXZhdGUganVtcEhpZ2h0Om51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBfZGlzeTpudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBHcmF2aXR5X2c6bnVtYmVyPTEwOy8v6YeN5Yqb5Yqg6YCf5bqmXG4gICAgcHJpdmF0ZSBfY2hlY2t0aW1lOm51bWJlciA9IDA7XG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuX25vd1JvbGVTdGF0ZSA9PSAxIClcbiAgICAgICAge1xuICAgICAgICAgICAgZHQgPSAxNjtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrdGltZSArPSBkdDtcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5pc2Nhcm1hbnBjIClcbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGVja3RpbWUgPj0gNTAwIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrdGltZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dOcGNpbmZvICYmIFByb3BNYW5hZ2VyLm1haW5Sb2xlIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICsgdGhpcy5fbm93TnBjaW5mby5kaXN0YW5jZSA8IFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi56IClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIHRoaXMuX2lzY2FuTW92ZSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGRpc3RpbWU6bnVtYmVyID0gZHQvMTAwMDtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSArPSBkaXN0aW1lO1xuICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5ub3dBY3Rpb24gKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5ydW46Ly/ot5HliqhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSBkaXN0aW1lICogdGhpcy5fc3BlZWRNb3ZlVjMuejtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDAgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMSApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAyIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXA6Ly/niKzljYdcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSBkaXN0aW1lICogdGhpcy5qdW1wU3BlZWQueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDEgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2xvY2tzdGF0ZSA9PSAyIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9zaGFuZ3BhVmVjIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX3NoYW5ncGFWZWMueSApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd3NlbGVjdFZlYyApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9ub3dzZWxlY3RWZWMueSApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXBibG9jazpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSBkaXN0aW1lICogdGhpcy5qdW1wU3BlZWQueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9zaGFuZ3BhVmVjIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX3NoYW5ncGFWZWMueSApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9ub3dzZWxlY3RWZWMueSApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcDovL+i3s+i3g1xuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXByaWdodDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3kgPSB0aGlzLmp1bXBTcGVlZC55IC0gdGhpcy5HcmF2aXR5X2cqZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9kaXN5O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueCAqIGRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3kgPSB0aGlzLmp1bXBTcGVlZC55IC0gdGhpcy5HcmF2aXR5X2cqZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9kaXN5O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueCAqIGRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IGRpc3RpbWUgKiB0aGlzLmp1bXBTcGVlZC55O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueSpkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuTW92ZVg6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSBkaXN0aW1lICogdGhpcy5fc3BlZWRNb3ZlVjMuejtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX3NwZWVkTW92ZVYzLngqZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX21vdmVUaW1lID4gMC4xIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmU6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLmp1bXBTcGVlZC54O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX2NoaXh1VGltZSApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnNpZGVzcGVlZHVwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbW92ZVRpbWUgPiB0aGlzLl9jaGl4dVRpbWUgJiYgdGhpcy5MYXN0QWN0aW9uPT1DaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQgfHwgdGhpcy5MYXN0QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gdGhpcy5MYXN0QWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNyb3NzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLkdyYXZpdHlfZypkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC54ICogZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuX2Rpc3kqZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuQ2xpbWJNb3Rpb246XG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9ub3dzZWxlY3RWZWMpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55IDwgdGhpcy5fbm93c2VsZWN0VmVjLnkgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gKDEvMC4zKSpkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgJiYgKHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biB8fCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZSApICYmICF0aGlzLmhhdmVDb2xsaXNpb24gKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56IDw9IHRoaXMuX25vd3NlbGVjdFZlYy56IClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA8IFByb3BNYW5hZ2VyLmRpZVBvc1kgKS8v6KeS6Imy5q275LqhXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5zdGF5c2NlbmUgPT0gXCJcIiB8fCB0aGlzLnN0YXlidWlsZCA9PSBcIlwiIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy5faW5pdFBvc1ZlYy5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGhpcy5zdGF5c2NlbmUsdGhpcy5zdGF5YnVpbGQgKS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPCBQcm9wTWFuYWdlci5nYW1ld2luUG9zWiApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLldpbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiggdGhpcy5faXNBY3Rpb25OdW1zIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8v5aaC5p6c5b2T5YmN5pKt5pS+c3RhdGXlt7Lnu4/mkq3mlL7lrozkuobkuIDmrKFcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA+IDAgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9hbmltYXRvci5nZXRDdXJyZW50QW5pbWF0b3JQbGF5U3RhdGUoKS5ub3JtYWxpemVkVGltZSA+PSB0aGlzLl9pc25lZWRhY3Rpb25udW0pXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCB0aGlzLl9ub3dBY3Rpb25OYW1lIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5sZWZ0anVtcDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5yaWdodGp1bXA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuaGlnaGp1bXAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odXJkbGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5za3kgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuaHVhY2hhbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmVuZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCx0aGlzLl9ub3dzZWxlY3RWZWMueSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5sYW5kMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5sYW5kMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25lZWRhY3Rpb250aW1lICE9IDAgJiYgdGhpcy5fbW92ZVRpbWUgPiB0aGlzLl9uZWVkYWN0aW9udGltZSApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fbm93QWN0aW9uTmFtZSApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGVmdGp1bXA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucmlnaHRqdW1wOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuaHVyZGxlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5ICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmh1YWNoYW46XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLngsdGhpcy5fbm93c2VsZWN0VmVjLnksdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fZW5kaW5nIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXN0aW1lOm51bWJlciA9IGR0LzEwMDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lICs9IGRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+PSB0aGlzLl9lbmRhbm1vdGltZSApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR2FtZU92ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueCA9IHRoaXMuX2VuZEFubW9TcGVlZC54ICogZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueSA9IHRoaXMuX2VuZEFubW9TcGVlZC55ICogZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueiA9IHRoaXMuX2VuZEFubW9TcGVlZC56ICogZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICggUHJvcE1hbmFnZXIuY2FybWEuZ2V0Q29tcG9uZW50KCBDYW1lcmFNYW5hZ2VyICkgYXMgQ2FtZXJhTWFuYWdlciApLkdhbWVFbmRSb3RhdGUoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiwgdGhpcy5fZW5kQW5tb1NwZWVkMSApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBHYW1lT3ZlcigpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2VuZGluZyA9IGZhbHNlO1xuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5lbmQgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9lbmRpbmc6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2VuZEFubW9TcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XG4gICAgcHJpdmF0ZSBfZW5kYW5tb3RpbWU6bnVtYmVyID0gMTtcbiAgICBwcml2YXRlIF9lbmRBbm1vU3BlZWQxOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XG4gICAgcHJpdmF0ZSBXaW4oKTp2b2lkXG4gICAge1xuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XG4gICAgICAgIHRoaXMuX25vd1JvbGVTdGF0ZSA9IDI7XG4gICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5za3kgKTtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLm5wY2VuZCx0aGlzLm93bmVyLm5hbWUgKTtcbiAgICB9XG4gICAgcHVibGljIHN0b3AoKTp2b2lkXG4gICAge1xuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XG4gICAgfVxuICAgIHB1YmxpYyBkZXN0cm95KCk6dm9pZFxuICAgIHtcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hhbmdlTW92ZVg6bnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgSGF2ZUZvcmNlSnVtcDpib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHF1YXRlcm5pb246TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjsgXG4gICAgcHVibGljIEpveSggdmFsdWU6bnVtYmVyLGFuZ2xlOm51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5ydW4gfHwgdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cCB8fCBDaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQgfHwgQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCAmJiB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKSAvL+W8uuWItui3s+i3g1xuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLkhhdmVGb3JjZUp1bXAgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodCAmJiB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLkhhdmVGb3JjZUp1bXAgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcbiAgICAgICAgfVxuICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcCB8fFxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQgfHxcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmp1bXByaWdodCB8fFxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXAgKVxuICAgICAgICAgICAgYW5nbGUgPSAtYW5nbGUgKiBNYXRoLlBJLzE4MDtcbiAgICAgICAgICAgIExheWEuUXVhdGVybmlvbi5jcmVhdGVGcm9tQXhpc0FuZ2xlKCBuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApLGFuZ2xlLHRoaXMucXVhdGVybmlvbiApO1xuICAgICAgICAgICAgTGF5YS5WZWN0b3IzLnRyYW5zZm9ybVF1YXQoIHRoaXMuanVtcFNwZWVkLHRoaXMucXVhdGVybmlvbix0aGlzLmp1bXBTcGVlZCApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX25vd0FjdGlvbk5hbWU6c3RyaW5nO1xuICAgIHB1YmxpYyBQbGF5QW5pbWF0b3IoIGFjdGlvbk5hbWU6c3RyaW5nICk6dm9pZFxuICAgIHtcbiAgICAgICAgLy8gdGhpcy5fbm93QWN0aW9uTmFtZSA9IGFjdGlvbk5hbWU7XG4gICAgICAgIHZhciBfYWN0aW9ubmFtZSA9IHRoaXMuVHJhbnNpdGlvbkFjdGlvbk5hbWUoYWN0aW9uTmFtZSk7XG4gICAgICAgIHRoaXMuX25vd0FjdGlvbk5hbWUgPSBhY3Rpb25OYW1lO1xuICAgICAgICBpZiggdGhpcy5fYW5pbWF0b3IgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggdGhpcy5fbm93QWN0aW9uTmFtZSA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmVuZCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0b3Iuc3BlZWQgPSAxLjU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0b3Iuc3BlZWQgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYW5pbWF0b3IucGxheShfYWN0aW9ubmFtZSwwLDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoq6L2s5o2i5Yqo5L2c5ZCN56ewICovXG4gICAgVHJhbnNpdGlvbkFjdGlvbk5hbWUoX2FjdGlvbm5hbWU6c3RyaW5nKTpzdHJpbmd7XG4gICAgICAgIHN3aXRjaCAoX2FjdGlvbm5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJyb2xsb3ZlcjFcIjpcbiAgICAgICAgICAgIHJldHVybiBcImNlZmFuMVwiXG4gICAgICAgICAgICBjYXNlIFwicm9sbG92ZXIyXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJjZWZhbjJcIlxuICAgICAgICAgICAgY2FzZSBcInJ1bndhbGxsZWZ0XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJwYW9xaWFuZ2xlZnRcIlxuICAgICAgICAgICAgY2FzZSBcInJpZ2h0anVtcFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwicmlnaHRqdW1wXCJcbiAgICAgICAgICAgIGNhc2UgXCJydW53YWxscmlnaHRcIjpcbiAgICAgICAgICAgIHJldHVybiBcInBhb3FpYW5ncmlnaHRcIlxuICAgICAgICAgICAgY2FzZSBcImxlZnRqdW1wXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJsZWZ0anVtcFwiXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJ3YWxsXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJwYXFpYW5nXCJcbiAgICAgICAgICAgIGNhc2UgXCJjbGltYmVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiY2xpbWJlbmRcIlxuICAgICAgICAgICAgY2FzZSBcInN0YW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJzdGFuZFwiXG4gICAgICAgICAgICBjYXNlIFwic2t5XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJrb25nemhvbmdcIlxuICAgICAgICAgICAgY2FzZSBcImxhbmQxXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJsdW9kaTFcIlxuICAgICAgICAgICAgY2FzZSBcImxhbmQyXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJsdW9kaTJcIlxuICAgICAgICAgICAgY2FzZSBcImhpZ2hqdW1wMVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZGF0aWFvMVwiXG4gICAgICAgICAgICBjYXNlIFwiaGlnaGp1bXAyXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJkYXRpYW8yXCJcbiAgICAgICAgICAgIGNhc2UgXCJydW5cIjpcbiAgICAgICAgICAgIHJldHVybiBcInJ1blwiXG4gICAgICAgICAgICBjYXNlIFwianVtcFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwianVtcFwiXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJ1cFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiQ2xpbWJcIlxuICAgICAgICAgICAgY2FzZSBcImZhbGxkb3duXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJGcmVlZmFsbGluZ1wiXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJsZWZ0XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJsZWZ0X2NsaW1iXCJcbiAgICAgICAgICAgIGNhc2UgXCJjbGltYnJpZ2h0XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJyaWdodF9jbGltYlwiXG4gICAgICAgICAgICBjYXNlIFwianVtcHJpZ2h0XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJyaWdodF9qdW1wXCJcbiAgICAgICAgICAgIGNhc2UgXCJqdW1wbGVmdFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwibGVmdF9qdW1wXCJcbiAgICAgICAgICAgIGNhc2UgXCJDbGltYk1vdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiUGxheVBhbG91QWN0aW9uXCJcbiAgICAgICAgICAgIGNhc2UgXCJodWFjaGFuXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJodWFjaGFuXCJcbiAgICAgICAgICAgIGNhc2UgXCJodXJkbGVcIjpcbiAgICAgICAgICAgIHJldHVybiBcImt1YWxhblwiXG4gICAgICAgICAgICBjYXNlIFwic3BlZWR1cGp1bXBcIjpcbiAgICAgICAgICAgIHJldHVybiBcImppYXN1SnVtcFwiXG4gICAgICAgICAgICBjYXNlIFwiTW92ZVhcIjpcbiAgICAgICAgICAgIHJldHVybiBcInhzaHVueWlcIlxuICAgICAgICAgICAgY2FzZSBcImRvd25tb3ZlXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJkb3duU2xpZGVcIlxuICAgICAgICAgICAgY2FzZSBcInNpZGVzcGVlZHVwXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJzbGlkZWppYXN1XCJcbiAgICAgICAgICAgIGNhc2UgXCJjcm9zc1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwic3VybW91bnRcIlxuICAgICAgICAgICAgY2FzZSBcImNsaW1idXBibG9ja1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwibG9ja2NsaW1iXCJcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHVibGljIFRlc3RKdW1wKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xuICAgIH1cblxuXG4gICAgcHVibGljIGdldFBvc3Rpb24oKTpMYXlhLlZlY3RvcjNcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFjdGlvbigpOm51bWJlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vd1JvbGVTdGF0ZTtcbiAgICB9XG5cbiAgIFxufSIsImltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XG5pbXBvcnQge0NoYXJhY3RlclN0YXRlfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZVwiO1xuaW1wb3J0IHtSb2xlRGF0YX0gZnJvbSBcIi4uL0RhdGEvUm9sZURhdGFcIjtcbmltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVVzZXJNZXNzYWdlXCI7XG5pbXBvcnQgQnVpbGRDRkcgZnJvbSBcIi4uL0NGRy9CdWlsZENGR1wiO1xuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xuaW1wb3J0IHtDYW1lcmFNYW5hZ2VyfSBmcm9tIFwiLi9DYW1lcmFNYW5hZ2VyXCI7XG5pbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcbmltcG9ydCB7R2FtZVN0YXRlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvR2FtZVN0YXRlQ29udHJvbFwiO1xuaW1wb3J0IHtBdWRpb0NvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0F1ZGlvQ29udHJvbFwiO1xuaW1wb3J0IHtXWEdhbWVQbGF0Zm9ybX0gZnJvbSBcIi4uL1dYU0RLL1dYR2FtZVBsYXRmb3JtXCI7XG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcblxuZXhwb3J0IGNsYXNzIFBsYXllciBleHRlbmRzIExheWEuU2NyaXB0M0QgaW1wbGVtZW50cyBUaW1lckNvbnRyb2xcbntcbiAgICBwdWJsaWMgX3RyYW5zZm9ybTpMYXlhLlRyYW5zZm9ybTNEO1xuICAgIHB1YmxpYyBfaXNjYW5Nb3ZlOmJvb2xlYW47XG4gICAgcHVibGljIF9zcGVlZE1vdmVWMzpMYXlhLlZlY3RvcjM7XG5cbiAgICBwcml2YXRlIF9pc0FjdGlvbk51bXM6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2lzbmVlZGFjdGlvbm51bTpudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgX25lZWRhY3Rpb250aW1lOm51bWJlciA9IDA7XG4gICAgXG4gICAgcHJpdmF0ZSBfbm93QWN0aW9uU3RhdGU6c3RyaW5nID0gXCJcIjtcblxuICAgIHB1YmxpYyBfUm9sZURhdGE6Um9sZURhdGE7XG5cbiAgICBwcml2YXRlIF9hbmltYXRvcjpMYXlhLkFuaW1hdG9yO1xuICAgIHByaXZhdGUgX211bHRpcGxlOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoIDEsMSwxICk7XG5cbiAgICBwcml2YXRlIExlZnRUcmlhbDpMYXlhLlRyYWlsU3ByaXRlM0Q7XG4gICAgcHJpdmF0ZSBSaWdodFRyaWFsOkxheWEuVHJhaWxTcHJpdGUzRDtcblxuICAgIHByaXZhdGUgTGFzdEFjdGlvblN0YXRlOnN0cmluZyA9IFwiXCI7XG4gICAgcHJpdmF0ZSBfbW92ZVRpbWU6bnVtYmVyID0gMDtcblxuICAgIC8qKlxuICAgICAqIOWKoOmAn2J1ZmZ2ZWNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9sYXN0amlhc3VTdGF0ZTpzdHJpbmcgPSBcIlwiO1xuICAgIHByaXZhdGUgYnVmZl9zcGVlZHVwdGltZTpudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgY2Fuc2hha2U6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgc2hha2V0aW1lOm51bWJlciA9IDA7XG4gICAgcHVibGljIGRvdWJsZXNwZWVkdXA6Ym9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcmVzb3VzZU5hbWU6c3RyaW5nID0gXCJcIjtcblxuICAgIHByaXZhdGUgc3RhdGljIGluczpQbGF5ZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBQbGF5ZXIuaW5zID0gdGhpcztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpQbGF5ZXJ7XG4gICAgICAgIGlmKFBsYXllci5pbnMgPT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBsYXllcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQbGF5ZXIuaW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkF3YWtlKClcbiAgICB7XG4gICAgICAgIHRoaXMuX2FuaW1hdG9yID0gKHRoaXMub3duZXIgYXMgTGF5YS5TcHJpdGUzRCkuZ2V0Q29tcG9uZW50KCBMYXlhLkFuaW1hdG9yICk7XG4gICAgICAgIFByb3BNYW5hZ2VyLnNldEFuaW1hdG9yKCB0aGlzLl9hbmltYXRvciApO1xuICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMyA9IG5ldyBMYXlhLlZlY3RvcjMoIDAsMCwwICk7XG4gICAgICAgIHZhciBzcDpMYXlhLlNwcml0ZTNEID0gdGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEO1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSBzcC50cmFuc2Zvcm07XG4gICAgICAgIHRoaXMuX1JvbGVEYXRhID0gKFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSkuUm9sZURhdGE7XG4gICAgICAgICggc3AuZ2V0Q29tcG9uZW50KCBMYXlhLlJpZ2lkYm9keTNEICkgYXMgTGF5YS5SaWdpZGJvZHkzRCApLmNjZE1vdGlvblRocmVzaG9sZCA9IDAuMDAxO1xuICAgICAgICB0aGlzLkxlZnRUcmlhbCA9IHNwLmdldENoaWxkQnlOYW1lKFwibGVmdHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRDtcbiAgICAgICAgdGhpcy5SaWdodFRyaWFsID0gc3AuZ2V0Q2hpbGRCeU5hbWUoXCJyaWdodHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRDtcbiAgICB9XG5cbiAgICBwdWJsaWMgX2luaXRQb3NWZWM6TGF5YS5WZWN0b3IzO1xuICAgIHB1YmxpYyBzdGFydFJ1bihqaWFzdT8pOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl9Sb2xlRGF0YS5yb2xlQ2ZnLmdyYXZpdHkgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmcgPSB0aGlzLl9Sb2xlRGF0YS5yb2xlQ2ZnLmdyYXZpdHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmcgPSAxMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tdWx0aXBsZS54ID0gMTtcbiAgICAgICAgdGhpcy5fbXVsdGlwbGUueSA9IDE7XG4gICAgICAgIHRoaXMuX211bHRpcGxlLnogPSAxO1xuICAgICAgICB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPSAwO1xuICAgICAgICB0aGlzLmRvdWJsZXNwZWVkdXAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbGFzdGppYXN1U3RhdGUgPSBcIlwiO1xuICAgICAgICB0aGlzLl9lbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSAwO1xuICAgICAgICB0aGlzLl9pbml0UG9zVmVjID0gdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi546p5a6255qE5Yid5aeL5L2N572uLS0tLVwiLHRoaXMuX2luaXRQb3NWZWMpO1xuICAgICAgICB0aGlzLl9ub3didWlsZG5hbWUgPSBcIlwiO1xuICAgICAgICB0aGlzLl9ub3dzY2VuZW5hbWUgPSBcIlwiO1xuICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueCA9IDA7XG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzLnkgPSAwO1xuICAgICAgICBpZihqaWFzdSl7XG4gICAgICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy56ID0gLXRoaXMuX1JvbGVEYXRhLm1vdmVzcGVlZCoyO1xuICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKDMwMDAsdGhpcywoKT0+e1xuICAgICAgICAgICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzLnogPSAtdGhpcy5fUm9sZURhdGEubW92ZXNwZWVkO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueiA9IC10aGlzLl9Sb2xlRGF0YS5tb3Zlc3BlZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gdHJ1ZTtcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xuICAgIH1cbiAgICBcblxuICAgIHByaXZhdGUgX2lzQ29sbGluZzpib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbm93Q29sbFRhcmdldE5hbWU6c3RyaW5nID0gXCJcIjtcbiAgICBwcml2YXRlIF9ub3JtYWxpemVWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcbiAgICBwcml2YXRlIF9ub3dzZWxlY3RWZWM6TGF5YS5WZWN0b3IzO1xuICAgIHB1YmxpYyBfbm93YnVpbGRuYW1lOnN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIF9ub3dzY2VuZW5hbWU6c3RyaW5nID0gXCJcIjtcblxuICAgIC8vIHByaXZhdGUgcHpkaWN0OmFueSA9IHt9O1xuICAgIC8vIHByaXZhdGUgcHphcnI6QXJyYXk8YW55PiA9IFtdO1xuICAgIC8qKlxuICAgICAqIOW8gOWni+eisOaSnuaXtuaJp+ihjFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbGxpc2lvbkVudGVyKGNvbGxpc2lvbjpMYXlhLkNvbGxpc2lvbik6dm9pZCB7XG4gICAgICAgIGlmKCBjb2xsaXNpb24gJiYgY29sbGlzaW9uLmNvbnRhY3RzICYmIGNvbGxpc2lvbi5jb250YWN0cy5sZW5ndGggPiAwICYmIGNvbGxpc2lvbi5vdGhlciApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQ6TGF5YS5Db250YWN0UG9pbnQgPSBjb2xsaXNpb24uY29udGFjdHNbMF07XG4gICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZSggY29udGFjdFBvaW50Lm5vcm1hbCxjb2xsaXNpb24ub3RoZXIub3duZXIsY29udGFjdFBvaW50LnBvc2l0aW9uT25CKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaMgee7reeisOaSnuaXtuaJp+ihjFxuICAgICAqL1xuICAgIHB1YmxpYyAgb25Db2xsaXNpb25TdGF5KGNvbGxpc2lvbjpMYXlhLkNvbGxpc2lvbik6dm9pZCBcbiAgICB7XG4gICAgICAgIC8vIERlYnVnZXIubG9nKCBcIueisOaSnuS4rVwiICk7XG4gICAgICAgIGlmKCBjb2xsaXNpb24gJiYgY29sbGlzaW9uLmNvbnRhY3RzICYmIGNvbGxpc2lvbi5jb250YWN0cy5sZW5ndGggPiAwICYmIGNvbGxpc2lvbi5vdGhlciApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2lzQ29sbGluZyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgY29udGFjdFBvaW50OkxheWEuQ29udGFjdFBvaW50ID0gY29sbGlzaW9uLmNvbnRhY3RzWzBdO1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGNvbGxpc2lvbi5vdGhlci5vd25lcjtcbiAgICAgICAgICAgIHZhciB0YXJnZXRuYW1lOnN0cmluZyA9IHRhcmdldC5uYW1lO1xuICAgICAgICAgICAgaWYoIHRhcmdldG5hbWUgIT0gXCJTbGlkZXJCb29zdFwiICYmIHRhcmdldG5hbWUuaW5kZXhPZiggXCJucGNcIiApID09IC0xICApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgPSB0YXJnZXRuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiU2NhZmZvbGRpbmdcIiApICE9IC0xIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xICkgLy/norDliLDlu7rnrZHvvIzliKTmlq3mmK/kuIrniKzvvIzlt6bniKzov5jmmK/lj7PniKxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93YnVpbGRuYW1lID0gdGhpcy5fbm93Q29sbFRhcmdldE5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3NjZW5lbmFtZSA9IHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQucGFyZW50Lm5hbWUgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSApO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgIH1cbiAgICAvKipcbiAgICAgKiDnu5PmnZ/norDmkp7ml7bmiafooYxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db2xsaXNpb25FeGl0KGNvbGxpc2lvbjpMYXlhLkNvbGxpc2lvbik6dm9pZCBcbiAgICB7XG4gICAgICAgIHRoaXMuX2lzQ29sbGluZyA9IGZhbHNlO1xuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgY29udGFjdFBvaW50OkxheWEuQ29udGFjdFBvaW50ID0gY29sbGlzaW9uLmNvbnRhY3RzWzBdO1xuICAgICAgICAgICAgdGhpcy5DaGVja0VuZCggY29udGFjdFBvaW50Lm5vcm1hbCxjb2xsaXNpb24ub3RoZXIub3duZXIgKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoq5qOA5rWL57uT5p2f56Kw5pKeICovXG4gICAgcHJpdmF0ZSBDaGVja0VuZCggbm9ybWFsOkxheWEuVmVjdG9yMyx0YXJnZXQ6TGF5YS5Ob2RlICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRhcmdldC5uYW1lID09IFwiU2xpZGVyQm9vc3RcIiB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcIm5wY1wiICkgIT0gLTEgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYoIHRoaXMuaXNmb3JjZUp1bXAgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmlzZm9yY2VKdW1wID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYoIHRoaXMuX2xvY2t4c3RhdGUgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgIT0gdGFyZ2V0Lm5hbWUgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYoIHRhcmdldC5uYW1lLmluZGV4T2YoIFwicGFuZWxfanVtcFwiICkgIT0gLTEgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoKCB0aGlzLm5vd0FjdGlvbiApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDpcbiAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cGJsb2NrOlxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJveF9Cb2FyZFwiICkgIT0gLTEgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5KdW1wQWN0aW9uKCB0aGlzLl9jaGFuZ2VNb3ZlWCApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OlxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQ6XG4gICAgICAgICAgICAgICAgdGhpcy5KdW1wQWN0aW9uKCB0aGlzLl9jaGFuZ2VNb3ZlWCApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnJ1bjpcbiAgICAgICAgICAgICAgICB0aGlzLkp1bXBBY3Rpb24oIHRoaXMuX2NoYW5nZU1vdmVYICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuTW92ZVg6XG4gICAgICAgICAgICB0aGlzLkp1bXBBY3Rpb24oIHRoaXMuX3NwZWVkTW92ZVYzLnggKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIDA65pyq6ZSB77yMMe+8mumUgeW3pui+ue+8jDLvvJrplIHlj7PovrlcbiAgICAgKi9cbiAgICBwcml2YXRlIF9sb2NreHN0YXRlOm51bWJlciA9IDA7XG5cbiAgICBwdWJsaWMgc2V0bm93U2VsZWN0VmVjKCBwb3M6TGF5YS5WZWN0b3IzICk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gcG9zO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2xvY2tieUJ1aWxkbmFtZTpzdHJpbmcgPSBcIlwiO1xuICAgIC8qKlxuICAgICAqIDA65pyq6KKr6ZSB77yMMe+8mumUgeWumuW3pui+ue+8jDLvvJrplIHlrprlj7PovrnvvIxcbiAgICAgKi9cbiAgICBwcml2YXRlIF9sb2Nrc3RhdGU6bnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgX3NoYW5ncGFWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcblxuICAgIC8qKuiuoeeul+eisOaSniAqL1xuICAgIHByaXZhdGUgQ2FsY3VsYXRlKCBub3JtYWw6TGF5YS5WZWN0b3IzLHRhcmdldDpMYXlhLk5vZGUsY29sbHBvaW50OkxheWEuVmVjdG9yMyApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBcIlNsaWRlckJvb3N0XCIgfHwgdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJucGNcIiApICE9IC0xIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lID0gdGFyZ2V0Lm5hbWU7XG4gICAgICAgIHZhciBuOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XG4gICAgICAgIExheWEuVmVjdG9yMy5ub3JtYWxpemUobm9ybWFsLHRoaXMuX25vcm1hbGl6ZVZlYyk7XG4gICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSB8fCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcIlNjYWZmb2xkaW5nXCIgKSAhPSAtMSB8fCBcbiAgICAgICAgICAgIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSkgLy/norDliLDlu7rnrZHvvIzliKTmlq3mmK/kuIrniKzvvIzlt6bniKzov5jmmK/lj7PniKxcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3didWlsZG5hbWUgPSB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dzY2VuZW5hbWUgPSB0YXJnZXQucGFyZW50LnBhcmVudC5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQucGFyZW50Lm5hbWUsdGFyZ2V0LnBhcmVudC5uYW1lICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSApO1xuICAgICAgICAgICAgfSAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnogPT0gLTEgKSAvL+S4iueIrFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgJiYgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgPiAodGhpcy5fbm93c2VsZWN0VmVjLnkgLSAwLjIpIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1idXA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueSA9PSAxIHx8dGhpcy5fbm9ybWFsaXplVmVjLnkgPT0gLTEgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnggPT0gLTEgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5ydW4gKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1idXAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OyAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueCA9PSAxIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUucnVuIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQ7ICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueiAhPSAxIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cGJsb2NrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwicGFuZWxfanVtcFwiICkgIT0gLTEgKSAvL+WKoOmAn+adv+i3s+i3g1xuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoXCJwYW5lbF9kb3duc2xpcFwiKSAhPSAtMSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfQm9hcmRcIiApICE9IC0xICYmIHRoaXMubm93QWN0aW9uICE9IENoYXJhY3RlclN0YXRlLmRvd25tb3ZlIClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ID09IC0xICkgLy/kuIrniKxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1idXA7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYm94X3NpZGVqdW1wXCIgKSAhPSAtMSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuc2lkZXNwZWVkdXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfU3VybW91bnRcIiApICE9IC0xIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jcm9zcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1idXA7XG4gICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcblxuICAgIHByaXZhdGUgSnVtcEFjdGlvbiggdmFsdWU6bnVtYmVyICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHZhbHVlID4gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0O1xuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd0FjdGlvbiApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoIHZhbHVlIDwgMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHByaXZhdGUgX1N0YXRlTmFtZTpzdHJpbmc7XG4gICAgcHVibGljIFBsYXlBbmltYXRvciggYWN0aW9uTmFtZTpzdHJpbmcgKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgX2FjdGlvbm5hbWUgPSB0aGlzLlRyYW5zaXRpb25BY3Rpb25OYW1lKGFjdGlvbk5hbWUpO1xuICAgICAgICB0aGlzLl9TdGF0ZU5hbWUgPSBhY3Rpb25OYW1lO1xuICAgICAgICBpZiggdGhpcy5fYW5pbWF0b3IgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggdGhpcy5fU3RhdGVOYW1lID09IENoYXJhY3RlclN0YXRlLmNsaW1iZW5kIHx8IHRoaXMuX1N0YXRlTmFtZSA9PSBDaGFyYWN0ZXJTdGF0ZS5sYW5kMSB8fCB0aGlzLl9TdGF0ZU5hbWUgPT0gQ2hhcmFjdGVyU3RhdGUubGFuZDIgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnNwZWVkID0gMS41O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnNwZWVkID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnBsYXkoX2FjdGlvbm5hbWUsMCwwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKui9rOaNouWKqOS9nOWQjeensCAqL1xuICAgIFRyYW5zaXRpb25BY3Rpb25OYW1lKF9hY3Rpb25uYW1lOnN0cmluZyk6c3RyaW5ne1xuICAgICAgICBzd2l0Y2ggKF9hY3Rpb25uYW1lKSB7XG4gICAgICAgICAgICBjYXNlIFwicm9sbG92ZXIxXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJjZWZhbjFcIlxuICAgICAgICAgICAgY2FzZSBcInJvbGxvdmVyMlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiY2VmYW4yXCJcbiAgICAgICAgICAgIGNhc2UgXCJydW53YWxsbGVmdFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwicGFvcWlhbmdsZWZ0XCJcbiAgICAgICAgICAgIGNhc2UgXCJyaWdodGp1bXBcIjpcbiAgICAgICAgICAgIHJldHVybiBcInJpZ2h0anVtcFwiXG4gICAgICAgICAgICBjYXNlIFwicnVud2FsbHJpZ2h0XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJwYW9xaWFuZ3JpZ2h0XCJcbiAgICAgICAgICAgIGNhc2UgXCJsZWZ0anVtcFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwibGVmdGp1bXBcIlxuICAgICAgICAgICAgY2FzZSBcImNsaW1id2FsbFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwicGFxaWFuZ1wiXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBcImNsaW1iZW5kXCJcbiAgICAgICAgICAgIGNhc2UgXCJzdGFuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwic3RhbmRcIlxuICAgICAgICAgICAgY2FzZSBcInNreVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwia29uZ3pob25nXCJcbiAgICAgICAgICAgIGNhc2UgXCJsYW5kMVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwibHVvZGkxXCJcbiAgICAgICAgICAgIGNhc2UgXCJsYW5kMlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwibHVvZGkyXCJcbiAgICAgICAgICAgIGNhc2UgXCJoaWdoanVtcDFcIjpcbiAgICAgICAgICAgIHJldHVybiBcImRhdGlhbzFcIlxuICAgICAgICAgICAgY2FzZSBcImhpZ2hqdW1wMlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZGF0aWFvMlwiXG4gICAgICAgICAgICBjYXNlIFwicnVuXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJydW5cIlxuICAgICAgICAgICAgY2FzZSBcImp1bXBcIjpcbiAgICAgICAgICAgIHJldHVybiBcImp1bXBcIlxuICAgICAgICAgICAgY2FzZSBcImNsaW1idXBcIjpcbiAgICAgICAgICAgIHJldHVybiBcIkNsaW1iXCJcbiAgICAgICAgICAgIGNhc2UgXCJmYWxsZG93blwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiRnJlZWZhbGxpbmdcIlxuICAgICAgICAgICAgY2FzZSBcImNsaW1ibGVmdFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwibGVmdF9jbGltYlwiXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJyaWdodFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwicmlnaHRfY2xpbWJcIlxuICAgICAgICAgICAgY2FzZSBcImp1bXByaWdodFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwicmlnaHRfanVtcFwiXG4gICAgICAgICAgICBjYXNlIFwianVtcGxlZnRcIjpcbiAgICAgICAgICAgIHJldHVybiBcImxlZnRfanVtcFwiXG4gICAgICAgICAgICBjYXNlIFwiQ2xpbWJNb3Rpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBcIlBsYXlQYWxvdUFjdGlvblwiXG4gICAgICAgICAgICBjYXNlIFwiaHVhY2hhblwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiaHVhY2hhblwiXG4gICAgICAgICAgICBjYXNlIFwiaHVyZGxlXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJrdWFsYW5cIlxuICAgICAgICAgICAgY2FzZSBcInNwZWVkdXBqdW1wXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJqaWFzdUp1bXBcIlxuICAgICAgICAgICAgY2FzZSBcIk1vdmVYXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJ4c2h1bnlpXCJcbiAgICAgICAgICAgIGNhc2UgXCJkb3dubW92ZVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZG93blNsaWRlXCJcbiAgICAgICAgICAgIGNhc2UgXCJzaWRlc3BlZWR1cFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwic2xpZGVqaWFzdVwiXG4gICAgICAgICAgICBjYXNlIFwiY3Jvc3NcIjpcbiAgICAgICAgICAgIHJldHVybiBcInN1cm1vdW50XCJcbiAgICAgICAgICAgIGNhc2UgXCJjbGltYnVwYmxvY2tcIjpcbiAgICAgICAgICAgIHJldHVybiBcImxvY2tjbGltYlwiXG4gICAgICAgIH1cblxuICAgIH1cblxuXG4gICAgcHVibGljIHNldCBub3dBY3Rpb24oIHZhbHVlOnN0cmluZyApXG4gICAge1xuICAgICAgICBpZiggdGhpcy5fbm93QWN0aW9uU3RhdGUgIT0gdmFsdWUgfHwgdGhpcy5MYXN0QWN0aW9uU3RhdGUgPT0gQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXAgfHwgdGhpcy5fbm93QWN0aW9uU3RhdGUgPT0gQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXAgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLkxhc3RBY3Rpb25TdGF0ZSA9IHRoaXMuX25vd0FjdGlvblN0YXRlO1xuICAgICAgICAgICAgdGhpcy5fbm93QWN0aW9uU3RhdGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lID0gMDtcbiAgICAgICAgICAgIHRoaXMuY2Fuc2hha2UgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuQ2hhbmdlVHJpYWwoIHRydWUgKTtcbiAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fbm93QWN0aW9uU3RhdGUgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuc3RhbmQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc3RhbmQgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnJ1bjpcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuTGFzdEFjdGlvblN0YXRlID09IENoYXJhY3RlclN0YXRlLmp1bXAgfHwgdGhpcy5MYXN0QWN0aW9uU3RhdGUgPT0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQgfHx0aGlzLkxhc3RBY3Rpb25TdGF0ZSA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsMTAwICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8IDUwIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUubGFuZDEgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUubGFuZDIgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuanVtcCApO1xuICAgICAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5TZXRFZmZlY3RDb2xvciggXCJjb2xvcl93aGl0ZVwiLCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMuX1JvbGVEYXRhLmZyb250anVtcC54O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fUm9sZURhdGEuZnJvbnRqdW1wLnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9Sb2xlRGF0YS5mcm9udGp1bXAuejtcbiAgICAgICAgICAgICAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLnBsYXlHYW1lU291bmQoXCJ0aWFvXCIpO1xuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS52aWJyYXRlU2hvcnQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0OlxuICAgICAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5TZXRFZmZlY3RDb2xvciggXCJjb2xvcl93aGl0ZVwiLCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMuX1JvbGVEYXRhLmxlZnRqdW1wLng7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9Sb2xlRGF0YS5sZWZ0anVtcC55O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fUm9sZURhdGEubGVmdGp1bXAuejtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmxlZnRqdW1wICk7XG4gICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5R2FtZVNvdW5kKFwidGlhb1wiKTtcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudmlicmF0ZVNob3J0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ6XG4gICAgICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLkluc3RhbmNlLlNldEVmZmVjdENvbG9yKCBcImNvbG9yX3doaXRlXCIsIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5fUm9sZURhdGEucmlnaHRqdW1wLng7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9Sb2xlRGF0YS5yaWdodGp1bXAueTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX1JvbGVEYXRhLnJpZ2h0anVtcC56O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucmlnaHRqdW1wICk7XG4gICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5R2FtZVNvdW5kKFwidGlhb1wiKTtcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudmlicmF0ZVNob3J0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcDpcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJwYW5lbF9qdW1wXCIgXTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuYnVmZl9zcGVlZHVwdGltZSA+IDAgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS54ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnkgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueiA9IGJ1aWxkY2ZnLmJ1ZmZ6ICogYnVpbGRjZmcuYnVmZno7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvdWJsZXNwZWVkdXAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS55ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnogPSBidWlsZGNmZy5idWZmejtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPSBidWlsZGNmZy50aW1lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZnggKiB0aGlzLl9tdWx0aXBsZS54O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6ICogdGhpcy5fbXVsdGlwbGUuejtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPCA1MCApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDEgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDIgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UucGxheUdhbWVTb3VuZChcInRpYW9cIik7XG4gICAgICAgICAgICAgICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy5wbGF5c3BlZWRTb3VuZCApO1xuICAgICAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMCx0aGlzLHRoaXMucGxheXNwZWVkU291bmQgKTtcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudmlicmF0ZVNob3J0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZTpcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJwYW5lbF9kb3duc2xpcFwiIF07XG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPiAwIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS55ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnogPSBidWlsZGNmZy5idWZmeiAqIGJ1aWxkY2ZnLmJ1ZmZ6O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3VibGVzcGVlZHVwID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnggPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS56ID0gYnVpbGRjZmcuYnVmZno7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmX3NwZWVkdXB0aW1lID0gYnVpbGRjZmcudGltZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4ICogdGhpcy5fbXVsdGlwbGUueDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5ICogdGhpcy5fbXVsdGlwbGUueTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZnogKiB0aGlzLl9tdWx0aXBsZS56O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuaHVhY2hhbiApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlzcGVlZFNvdW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnZpYnJhdGVTaG9ydCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuc2lkZXNwZWVkdXA6XG4gICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwiYm94X3NpZGVqdW1wXCIgXTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuYnVmZl9zcGVlZHVwdGltZSA+IDAgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS54ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnkgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueiA9IGJ1aWxkY2ZnLmJ1ZmZ6ICogYnVpbGRjZmcuYnVmZno7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvdWJsZXNwZWVkdXAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS55ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnogPSBidWlsZGNmZy5idWZmejtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPSBidWlsZGNmZy50aW1lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZnggKiB0aGlzLl9tdWx0aXBsZS54O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnkgKiB0aGlzLl9tdWx0aXBsZS55O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fc3BlZWRNb3ZlVjMueipidWlsZGNmZy5idWZmeiAqIHRoaXMuX211bHRpcGxlLno7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlzcGVlZFNvdW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnZpYnJhdGVTaG9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jcm9zczpcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJib3hfU3VybW91bnRcIiBdO1xuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5idWZmX3NwZWVkdXB0aW1lID4gMCApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnggPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS56ID0gYnVpbGRjZmcuYnVmZnogKiBidWlsZGNmZy5idWZmejtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG91Ymxlc3BlZWR1cCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS55ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnogPSBidWlsZGNmZy5idWZmejtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPSBidWlsZGNmZy50aW1lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZnggKiB0aGlzLl9tdWx0aXBsZS54O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gKGJ1aWxkY2ZnLmJ1ZmZ5KzAuNSkgKiB0aGlzLl9tdWx0aXBsZS55O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fc3BlZWRNb3ZlVjMueipidWlsZGNmZy5idWZmeiAqIHRoaXMuX211bHRpcGxlLno7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5odXJkbGUgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXA6XG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwYmxvY2s6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fUm9sZURhdGEudXBjbGltYjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuY2xpbWJ3YWxsICk7XG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnZpYnJhdGVTaG9ydCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnNoYWtlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFrZXRpbWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkNoYW5nZVRyaWFsKCBmYWxzZSApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX1JvbGVEYXRhLnNsaWRlY2xpbWIueTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX1JvbGVEYXRhLnNsaWRlY2xpbWIuejtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW53YWxsbGVmdCApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkNoYW5nZVRyaWFsKCBmYWxzZSApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9Sb2xlRGF0YS5zbGlkZWNsaW1iLnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9Sb2xlRGF0YS5zbGlkZWNsaW1iLno7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVud2FsbHJpZ2h0ICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2hhbmdlVHJpYWwoIGZhbHNlICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmVlZGFjdGlvbnRpbWUgPSAwLjM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmNsaW1iZW5kICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHBsYXlzcGVlZFNvdW5kKCk6dm9pZFxuICAgIHtcbiAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLnBsYXlHYW1lU291bmQoXCJzcGVlZHVwXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbm93QWN0aW9uKCk6c3RyaW5nXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm93QWN0aW9uU3RhdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBDaGFuZ2VUcmlhbCggYm86Ym9vbGVhbiApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLkxlZnRUcmlhbCAmJiB0aGlzLlJpZ2h0VHJpYWwgJiYgdGhpcy5MZWZ0VHJpYWwuYWN0aXZlICE9IGJvIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5MZWZ0VHJpYWwuYWN0aXZlID0gYm87XG4gICAgICAgICAgICB0aGlzLlJpZ2h0VHJpYWwuYWN0aXZlID0gYm87XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgSm95KCB2YWx1ZTpudW1iZXIsdmFsdWUxOm51bWJlcixhbmdsZTpudW1iZXIgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUucnVuIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwIHx8IENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCB8fCBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0IClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSB2YWx1ZTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCAmJiB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKSAvL+W8uuWItui3s+i3g1xuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmlzZm9yY2VKdW1wID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQgJiYgdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5pc2ZvcmNlSnVtcCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wIHx8XG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdCB8fFxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0IHx8XG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGFuZ2xlID0gLWFuZ2xlICogTWF0aC5QSS8xODA7XG4gICAgICAgICAgICBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSggbmV3IExheWEuVmVjdG9yMyggMCwxLDAgKSxhbmdsZSx0aGlzLnF1YXRlcm5pb24gKTtcbiAgICAgICAgICAgIHZhciBqdW1wejpudW1iZXIgPSB0aGlzLmp1bXBTcGVlZC56O1xuICAgICAgICAgICAgTGF5YS5WZWN0b3IzLnRyYW5zZm9ybVF1YXQoIHRoaXMuanVtcFNwZWVkLHRoaXMucXVhdGVybmlvbix0aGlzLmp1bXBTcGVlZCApO1xuICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IGp1bXB6O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIF9tb3ZlVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XG4gICAgcHJpdmF0ZSBqdW1wU3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcbiAgICBwcml2YXRlIGp1bXBIaWdodDpudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgX2Rpc3k6bnVtYmVyID0gMDtcbiAgICBwdWJsaWMgZzpudW1iZXI9MTA7Ly/ph43lipvliqDpgJ/luqZcblxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIGR0ID0gMTY7XG4gICAgICAgIGlmKCB0aGlzLl9pc2Nhbk1vdmUgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBkdC8xMDAwO1xuICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcbiAgICAgICAgICAgIHN3aXRjaCggdGhpcy5ub3dBY3Rpb24gKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucnVuOi8v6LeR5YqoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IGRpc3RpbWUgKiAodGhpcy5fc3BlZWRNb3ZlVjMueiAqIHRoaXMuX211bHRpcGxlLnopO1xuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAwIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMSApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMiApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXA6Ly/niKzljYdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDEgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9sb2Nrc3RhdGUgPT0gMiApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fc2hhbmdwYVZlYyApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fc2hhbmdwYVZlYy55IClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd3NlbGVjdFZlYyApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fbm93c2VsZWN0VmVjLnkgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuQ2xpbWJNb3Rpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwYmxvY2s6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IGRpc3RpbWUgKiB0aGlzLmp1bXBTcGVlZC55O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3NoYW5ncGFWZWMgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX3NoYW5ncGFWZWMueSApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fbm93c2VsZWN0VmVjLnkgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOi8v6Lez6LeDXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDpcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXByaWdodDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXN5ID0gdGhpcy5qdW1wU3BlZWQueSAtIHRoaXMuZypkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fZGlzeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueCAqIGRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuX2Rpc3kqZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OlxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuanVtcFNwZWVkLnkqZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuTW92ZVg6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IGRpc3RpbWUgKiB0aGlzLl9zcGVlZE1vdmVWMy56O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9zcGVlZE1vdmVWMy54KmRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbW92ZVRpbWUgPiAwLjEgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuanVtcFNwZWVkLng7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuc2lkZXNwZWVkdXA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5idWZmX3NwZWVkdXB0aW1lIDw9IDAgJiYgdGhpcy5MYXN0QWN0aW9uU3RhdGU9PUNoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCB8fCB0aGlzLkxhc3RBY3Rpb25TdGF0ZSA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0IClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSB0aGlzLkxhc3RBY3Rpb25TdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY3Jvc3M6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3kgPSB0aGlzLmp1bXBTcGVlZC55IC0gdGhpcy5nKmRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9kaXN5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC54ICogZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5fZGlzeSpkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uOlxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9ub3dzZWxlY3RWZWMpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA8IHRoaXMuX25vd3NlbGVjdFZlYy55IClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9ICgxLzAuMykqZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiggdGhpcy5fbm93c2VsZWN0VmVjICYmICh0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5ydW4gfHwgdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmUgKSAmJiAhdGhpcy5faXNDb2xsaW5nIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPD0gdGhpcy5fbm93c2VsZWN0VmVjLnogKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgPCBQcm9wTWFuYWdlci5kaWVQb3NZIC0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5EaWVEaXN0YW5jZSApLy/op5LoibLmrbvkuqFcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93c2NlbmVuYW1lID09IFwiXCIgfHwgdGhpcy5fbm93YnVpbGRuYW1lID09IFwiXCIgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoR2FtZVN0YXRlLmZ1aHVvY2lzaHU+MCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJldml2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkxvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZihHYW1lU3RhdGUuZnVodW9jaXNodT4wKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmV2aXZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuc3RhbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPCBQcm9wTWFuYWdlci5nYW1ld2luUG9zWiApLy/liLDovr7nu4jngrlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLldpbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLnByb19qaW5kdS52YWx1ZSA9ICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiAvIFByb3BNYW5hZ2VyLmdhbWV3aW5Qb3NaICogMTAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIHRoaXMuX2lzQWN0aW9uTnVtcyApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA+IDAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fYW5pbWF0b3IuZ2V0Q3VycmVudEFuaW1hdG9yUGxheVN0YXRlKCkubm9ybWFsaXplZFRpbWUgPj0gdGhpcy5faXNuZWVkYWN0aW9ubnVtKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX1N0YXRlTmFtZSApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGVmdGp1bXA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5yaWdodGp1bXA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odXJkbGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmh1YWNoYW46XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmVuZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLngsdGhpcy5fbm93c2VsZWN0VmVjLnksdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmxhbmQxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGFuZDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVuICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odWFjaGFuOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbmVlZGFjdGlvbnRpbWUgIT0gMCAmJiB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX25lZWRhY3Rpb250aW1lIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fU3RhdGVOYW1lIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5sZWZ0anVtcDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucmlnaHRqdW1wOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5ICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmh1cmRsZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5ICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuaHVhY2hhbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPiAwIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgLT0gZGlzdGltZTtcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5TcGVlZFVwRWZmZWN0KCBcImppYXN1bGl6aVwiLHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiApO1xuICAgICAgICAgICAgICAgIGlmKCB0aGlzLmRvdWJsZXNwZWVkdXAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuU3BlZWRVcEVmZmVjdDEoIFwiamlhc3VsaXppXCIsdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnggPSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnkgPSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnogPSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuZG91Ymxlc3BlZWR1cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLkluc3RhbmNlLkNsb3NlU3BlZWRVcEVmZmVjdCggKTtcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5DbG9zZVNwZWVkVXBFZmZlY3QxKCApO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIHRoaXMuY2Fuc2hha2UgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hha2V0aW1lKz0gZGlzdGltZTtcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5zaGFrZXRpbWUgPj0gMC41IClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hha2V0aW1lID0gMDtcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudmlicmF0ZVNob3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCB0aGlzLl9lbmRpbmcgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBkaXN0aW1lOm51bWJlciA9IGR0LzEwMDA7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbW92ZVRpbWUgPj0gdGhpcy5fZW5kYW5tb3RpbWUgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5HYW1lT3ZlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQxLnggPSB0aGlzLl9lbmRBbm1vU3BlZWQueCAqIGRpc3RpbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueSA9IHRoaXMuX2VuZEFubW9TcGVlZC55ICogZGlzdGltZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkMS56ID0gdGhpcy5fZW5kQW5tb1NwZWVkLnogKiBkaXN0aW1lO1xuICAgICAgICAgICAgICAgICAgICAoIFByb3BNYW5hZ2VyLmNhcm1hLmdldENvbXBvbmVudCggQ2FtZXJhTWFuYWdlciApIGFzIENhbWVyYU1hbmFnZXIgKS5HYW1lRW5kUm90YXRlKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24sIHRoaXMuX2VuZEFubW9TcGVlZDEgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgIFxuICAgIHByaXZhdGUgX2VuZGluZzpib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZW5kQW5tb1NwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcbiAgICBwcml2YXRlIF9lbmRhbm1vdGltZTpudW1iZXIgPSAxO1xuICAgIHByaXZhdGUgX2VuZEFubW9TcGVlZDE6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcbiAgICBwcml2YXRlIFdpbigpOnZvaWRcbiAgICB7XG4gICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5R2FtZVNvdW5kKFwib3ZlclwiKTtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLmVuZCApO1xuICAgICAgICB2YXIgY2FybWFUcmFuczpMYXlhLlRyYW5zZm9ybTNEID0gUHJvcE1hbmFnZXIuY2FybWEudHJhbnNmb3JtO1xuICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQueiA9ICh0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiAtIDIgLSBjYXJtYVRyYW5zLnBvc2l0aW9uLnopL3RoaXMuX2VuZGFubW90aW1lO1xuICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQueSA9ICh0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSAtIGNhcm1hVHJhbnMucG9zaXRpb24ueSkvdGhpcy5fZW5kYW5tb3RpbWU7XG4gICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZC54ID0gKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCArIDMgLSBjYXJtYVRyYW5zLnBvc2l0aW9uLnggKSAvIHRoaXMuX2VuZGFubW90aW1lO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fbW92ZVRpbWUgPSAwO1xuICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnNreSApO1xuICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5HYW1lT3ZlckVmZmVjZiggXCJ5YW5odWFcIix0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24sR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5lbmRHYW1lUGxheWVyQXJyLmxlbmd0aCA9PSAwP3RydWU6ZmFsc2UgKTtcbiAgICB9XG5cbiAgICAvKirlh7rnjrDlpI3mtLvnlYzpnaIgKi9cbiAgICBwcml2YXRlIFJldml2ZSgpOnZvaWR7XG4gICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5R2FtZVNvdW5kKFwib3ZlclwiKTtcbiAgICAgICAgR2FtZVN0YXRlLmlzZGllID0gdHJ1ZTtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLnJldml2ZSApO1xuICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnN0YW5kICk7XG4gICAgICAgIC8vIHRoaXMuX2VuZGluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBMb3NlKCk6dm9pZHtcbiAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLnBsYXlHYW1lU291bmQoXCJvdmVyXCIpO1xuICAgICAgICBHYW1lU3RhdGUuaXNkaWUgPSB0cnVlO1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUubG9zZSApO1xuICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnN0YW5kICk7XG4gICAgICAgIHRoaXMuX2VuZGluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBHYW1lT3ZlcigpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2VuZGluZyA9IGZhbHNlO1xuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hhbmdlTW92ZVg6bnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgaXNmb3JjZUp1bXA6Ym9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBxdWF0ZXJuaW9uOkxheWEuUXVhdGVybmlvbiA9IG5ldyBMYXlhLlF1YXRlcm5pb247IFxuICAgIFxuXG4gICAgcHVibGljIFRlc3RKdW1wKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXN0cm95KCk6dm9pZFxuICAgIHtcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHVibGljIFhNb3ZlKCBzdGF0ZTpudW1iZXIgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUucnVuIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgPSAwO1xuICAgICAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueCA9IHN0YXRlICogMjA7XG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLk1vdmVYO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXG4gICAge1xuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XG4gICAgfVxuXG4gICAgXG5cbiAgICBcbn0iLCJcbmV4cG9ydCBjbGFzcyBHbG9iYWwge1xuICAgIHN0YXRpYyAgc3RhZ2U6IExheWEuU3RhZ2U7XG4gICAgc3RhdGljICBodHRwdXJsID0gXCJcIjtcbiAgICBzdGF0aWMgIHJlc291cmNlaHR0dHA6c3RyaW5nID0gXCJcIjtcblxuICAgIHN0YXRpYyAgY2RudXJsOnN0cmluZyA9IFwiaHR0cHM6Ly93eGdhbWUuNTF5b3lveW8uY29tL1wiO1xuICAgIFxuICAgIC8qKlxuICAgICAqIOi1hOa6kOWQjue8gOeJiOacrOWPt1xuICAgICAqL1xuICAgIHN0YXRpYyAgdmVyc2lvbnM6c3RyaW5nID0gXCJcIjsvL1wiP3Y9MS4wLjdcIjtcblxuICAgIHN0YXRpYyAgaW5pdFdpZHRoOm51bWJlciA9IDcyMDsgXG5cbiAgICBzdGF0aWMgIGluaXRIZWlnaHQ6bnVtYmVyID0gMTI4MDsgXG4gICAgLyoqXG4gICAgICog6LWE5rqQ54mI5pys5Y+3XG4gICAgICovXG4gICAgc3RhdGljICByZXNjb25maWdWZXJzaW9uOnN0cmluZyA9IFwiXCI7XG4gICAgLyoqXG4gICAgICog5b2T5YmN5bmz5Y+wXG4gICAgICovXG4gICAgc3RhdGljICBub3dwbGF0ZnJvbTpzdHJpbmcgPSBcIlwiO1xuXG4gICAgLyoqXG4gICAgICog5b2T5YmN5ri45oiPYXBwaWRcbiAgICAgKi9cbiAgICBzdGF0aWMgIGFwcGlkOnN0cmluZyA9IFwid3g0NmY0NjI2OTMyZTVmNDhiXCI7IFxuXG4gICAgLyoqXG4gICAgICog5ri45oiP54mI5pys5Y+3XG4gICAgICovXG4gICAgc3RhdGljICBnYW1lVmVyc2lvbjpzdHJpbmcgPSBcIjEuMC4wXCI7XG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKbosIPor5XniYjmnKxcbiAgICAgKi9cbiAgICBzdGF0aWMgIGlzZGVidWc6Ym9vbGVhbiA9IGZhbHNlO1xuXG4gICAgc3RhdGljICBBcHBLZXlJRDpudW1iZXIgPSAwO1xuICAgIHN0YXRpYyAgTWVtYmVySUQ6bnVtYmVyID0gMDtcblxuXG4gICAgc3RhdGljICBjdXJIZWlnaHQoKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHJldHVybiBMYXlhLnN0YWdlLmhlaWdodDtcbiAgICB9XG5cbiAgICBzdGF0aWMgIGN1cldpZHRoKCk6bnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gTGF5YS5zdGFnZS53aWR0aDtcbiAgICB9XG5cbiAgICBzdGF0aWMgIHNldFZhcnMoKTp2b2lkXG4gICAge1xuICAgICAgICBHbG9iYWwuc3RhZ2UgPSBMYXlhLnN0YWdlO1xuICAgICAgICBHbG9iYWwuc2V0aHR0cHVybCgpO1xuICAgIH1cblxuICAgIHN0YXRpYyAgZ2V0VXJsKCB1cmw6c3RyaW5nICk6c3RyaW5nXG4gICAge1xuICAgICAgICBpZih1cmwuaW5kZXhPZihcInd4bG9jYWxcIik9PS0xKVxuICAgICAgICB7IFxuICAgICAgICAgICAgcmV0dXJuIEdsb2JhbC5yZXNvdXJjZWh0dHRwICsgdXJsICsgR2xvYmFsLnZlcnNpb25zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgc3RhdGljICBzZXRodHRwdXJsKCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIEdsb2JhbC5pc2RlYnVnIClcbiAgICAgICAge1xuICAgICAgICAgICAgR2xvYmFsLmh0dHB1cmwgPSBcImh0dHBzOi8vd3hnYW1lZGV2LjUxeW95b3lvLmNvbS9cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIEdsb2JhbC5odHRwdXJsID0gXCJodHRwczovL21pbnBvcnQuNTF5b3lveW8uY29tL1wiO1xuICAgICAgICB9XG4gICAgfVxufSIsIlxuZXhwb3J0ICBjbGFzcyBHbG9iYWxXYWl0aW5nIGV4dGVuZHMgZmFpcnlndWkuR0NvbXBvbmVudFxue1xuICAgIGltZ18wOmZhaXJ5Z3VpLkdJbWFnZTtcbiAgICBwcml2YXRlIF9pc2ZvcmNlaGlkZTpib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxuICAgIFxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RGcm9tWE1MKHhtbDphbnkpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuc2V0U2l6ZShmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoLGZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0KTtcbiAgICAgICAgc3VwZXIuY29uc3RydWN0RnJvbVhNTCh4bWwpO1xuICAgICAgICB0aGlzLmltZ18wID0gdGhpcy5nZXRDaGlsZChcImltZ18wXCIpLmFzSW1hZ2U7XG4gICAgICAgIHRoaXMuaW1nXzAudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uKExheWEuRXZlbnQuRElTUExBWSx0aGlzLHRoaXMub25BZGRlZFRvU3RhZ2UpO1xuICAgICAgICB0aGlzLm9uKCBMYXlhLkV2ZW50LlVORElTUExBWSx0aGlzLHRoaXMub25SZW1vdmVGcm9tU3RhZ2UpOyAgICAgICAgICAgIFxuICAgIH1cblxuICAgIHByaXZhdGUgX2xhc3RUaW1lOm51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBvbkFkZGVkVG9TdGFnZSgpOnZvaWQge1xuICAgICAgICB0aGlzLl9sYXN0VGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoMSwgdGhpcywgdGhpcy5vblRpbWVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGltZXIoKTp2b2lkIHtcbiAgICAgICAgaWYodGhpcy5pbWdfMClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIG5vd3RpbWU6bnVtYmVyID0gTGF5YS5Ccm93c2VyLm5vdygpO1xuICAgICAgICAgICAgdmFyIGRpc3RpbWU6bnVtYmVyID0gbm93dGltZS10aGlzLl9sYXN0VGltZTtcbiAgICAgICAgICAgIGlmKCBkaXN0aW1lIC8xMDAwID49IDAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKCAhdGhpcy5faXNmb3JjZWhpZGUgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWdfMC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGk6bnVtYmVyID0gdGhpcy5pbWdfMC5yb3RhdGlvbjtcbiAgICAgICAgICAgICAgICBpICs9IDEwO1xuICAgICAgICAgICAgICAgIGlmKGkgPiAzNjApXG4gICAgICAgICAgICAgICAgICAgIGkgPSBpICUgMzYwO1xuICAgICAgICAgICAgICAgIHRoaXMuaW1nXzAucm90YXRpb24gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1nXzAudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhpZGVpbWcoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9pc2ZvcmNlaGlkZSA9IHRydWU7XG4gICAgICAgIGlmKCB0aGlzLmltZ18wIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5pbWdfMC52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBvblJlbW92ZUZyb21TdGFnZSgpOnZvaWQge1xuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKHRoaXMsIHRoaXMub25UaW1lcik7XG4gICAgfVxufSIsIlxuZXhwb3J0IGNsYXNzIEpveXN0aWNrTW9kdWxlIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXIge1xuICAgIHByaXZhdGUgX0luaXRYOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfSW5pdFk6IG51bWJlcjtcbiAgICBwcml2YXRlIF9zdGFydFN0YWdlWDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3N0YXJ0U3RhZ2VZOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbGFzdFN0YWdlWDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2xhc3RTdGFnZVk6IG51bWJlcjtcbiAgICBwcml2YXRlIF9idXR0b246TGF5YS5Qb2ludDtcbiAgICBwcml2YXRlIHRvdWNoSWQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF9jdXJQb3M6IExheWEuUG9pbnQ7XG4gICAgLy8gcHJpdmF0ZSBfY2VudGVyOmZhaXJ5Z3VpLkdJbWFnZTtcbiAgICBcbiAgICBwdWJsaWMgc3RhdGljIEpveXN0aWNrTW92aW5nOiBzdHJpbmcgPSBcIkpveXN0aWNrTW92aW5nXCI7XG4gICAgcHVibGljIHN0YXRpYyBKb3lzdGlja1VwOiBzdHJpbmcgPSBcIkpveXN0aWNrVXBcIjtcblxuICAgIHB1YmxpYyByYWRpdXM6IG51bWJlcjtcbiAgICBwcml2YXRlIF9jbGlja3BhbmVsOmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgcHVibGljIGRpczpudW1iZXIgPSAwOyBcbiAgICBwdWJsaWMgZGVncmVlOm51bWJlciA9IDA7XG4gICAgcHVibGljIGFuZ2xlOm51bWJlciA9IDA7XG5cbiAgICBwdWJsaWMgb2ZmeDpudW1iZXIgPSAwO1xuXG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY2xpY2twYW5lbDpmYWlyeWd1aS5HTG9hZGVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX2NsaWNrcGFuZWwgPSBjbGlja3BhbmVsO1xuICAgICAgICB0aGlzLl9idXR0b24gPSBuZXcgTGF5YS5Qb2ludCgpO1xuICAgICAgICB0aGlzLnRvdWNoSWQgPSAtMTtcbiAgICAgICAgdGhpcy5yYWRpdXMgPSA0MDA7XG4gICAgICAgIHRoaXMuX2N1clBvcyA9IG5ldyBMYXlhLlBvaW50KCk7XG4gICAgICAgIHRoaXMuX2NsaWNrcGFuZWwub24oTGF5YS5FdmVudC5NT1VTRV9ET1dOLHRoaXMsIHRoaXMub25Ub3VjaERvd24pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2lzY2FuQ0JhY2s6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgb25Ub3VjaERvd24oZXZ0OiBMYXlhLkV2ZW50KSB7XG4gICAgICAgIGlmKHRoaXMudG91Y2hJZCA9PSAtMSkgey8vRmlyc3QgdG91Y2hcbiAgICAgICAgICAgIHRoaXMudG91Y2hJZCA9IGV2dC50b3VjaElkO1xuICAgICAgICAgICAgdGhpcy5vZmZ4ID0gMDtcbiAgICAgICAgICAgIHRoaXMuX2lzY2FuQ0JhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuZ2xvYmFsVG9Mb2NhbChMYXlhLnN0YWdlLm1vdXNlWCwgTGF5YS5zdGFnZS5tb3VzZVksdGhpcy5fY3VyUG9zKTtcbiAgICAgICAgICAgIHZhciBieDogbnVtYmVyID0gdGhpcy5fY3VyUG9zLng7XG4gICAgICAgICAgICB2YXIgYnk6IG51bWJlciA9IHRoaXMuX2N1clBvcy55O1xuICAgICAgICAgICAgdGhpcy5fbGFzdFN0YWdlWCA9IGJ4O1xuICAgICAgICAgICAgdGhpcy5fbGFzdFN0YWdlWSA9IGJ5O1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRTdGFnZVggPSBieDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U3RhZ2VZID0gYnk7XG4gICAgICAgICAgICB0aGlzLl9idXR0b24ueCA9IGJ4O1xuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLnkgPSBieTtcbiAgICAgICAgICAgIGlmKCB0aGlzLl9jYWxsb2JqICYmIHRoaXMuX2Rvd25DYWxsYmFjayApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZG93bkNhbGxiYWNrLmNhbGwoIHRoaXMuX2NhbGxvYmogKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2NsaWNrcGFuZWwub24oTGF5YS5FdmVudC5NT1VTRV9NT1ZFLHRoaXMsdGhpcy5PblRvdWNoTW92ZSk7XG4gICAgICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9uKExheWEuRXZlbnQuTU9VU0VfVVAsdGhpcyx0aGlzLk9uVG91Y2hVcCk7XG4gICAgICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9uKCBMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMuT25Ub3VjaFVwICk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHByaXZhdGUgX2NhbGxvYmo6YW55O1xuICAgIHByaXZhdGUgX21vdmVjYWxsYmFjazpGdW5jdGlvbjtcbiAgICBwcml2YXRlIF91cGRhdGVjYWxsYmFjazpGdW5jdGlvbjtcbiAgICBwcml2YXRlIF9kb3duQ2FsbGJhY2s6RnVuY3Rpb247XG4gICAgcHVibGljIHNldEV2ZW50Q2FsbGJhY2soIGNhbGxvYmo6YW55LGRvd25DYWxsYmFjayxtb3ZlY2FsbGJhY2s6RnVuY3Rpb24sdXBjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2NhbGxvYmogPSBjYWxsb2JqO1xuICAgICAgICB0aGlzLl9kb3duQ2FsbGJhY2sgPSBkb3duQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMuX21vdmVjYWxsYmFjayA9IG1vdmVjYWxsYmFjaztcbiAgICAgICAgdGhpcy5fdXBkYXRlY2FsbGJhY2sgPSB1cGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHB1YmxpYyBUcmlnZ2VyKGV2dDogTGF5YS5FdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hEb3duKGV2dCk7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIHRpbGVkTWFwOkxheWEuVGlsZWRNYXA7XG5cdFx0cHJpdmF0ZSBtTGFzdE1vdXNlWDogbnVtYmVyID0gMDtcblx0XHRwcml2YXRlIG1MYXN0TW91c2VZOiBudW1iZXIgPSAwO1xuXHRcdHByaXZhdGUgbVg6IG51bWJlciA9IDA7XG5cdFx0cHJpdmF0ZSBtWTogbnVtYmVyID0gMDtcbiAgICBcdC8v5Yib5bu65Zyw5Zu+XG5cdFx0cHJpdmF0ZSBjcmVhdGVNYXAoKSB7XG5cdFx0XHQvL+WIm+W7uuWcsOWbvuWvueixoVxuXHRcdFx0dGhpcy50aWxlZE1hcCA9IG5ldyBMYXlhLlRpbGVkTWFwKCk7XG5cblx0XHRcdHRoaXMubVggPSB0aGlzLm1ZID0gMDtcblx0XHRcdC8v5Yib5bu65Zyw5Zu+77yM6YCC5b2T55qE5pe25YCZ6LCD55SoZGVzdG9yeemUgOavgeWcsOWbvlxuXHRcdFx0dGhpcy50aWxlZE1hcC5jcmVhdGVNYXAoXCJyZXMvdGlsZWRNYXAvZGVzZXJ0Lmpzb25cIiwgbmV3IExheWEuUmVjdGFuZ2xlKDAsIDAsIExheWEuQnJvd3Nlci53aWR0aCwgTGF5YS5Ccm93c2VyLmhlaWdodCksIG5ldyBMYXlhLkhhbmRsZXIodGhpcywgdGhpcy5jb21wbGV0ZUhhbmRsZXIpKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICog5Zyw5Zu+5Yqg6L295a6M5oiQ55qE5Zue6LCDXG5cdFx0ICovXG5cdFx0cHJpdmF0ZSBjb21wbGV0ZUhhbmRsZXIoKTogdm9pZCB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIuWcsOWbvuWIm+W7uuWujOaIkFwiKTtcblx0XHRcdGNvbnNvbGUubG9nKFwiQ2xpZW50VzpcIiArIExheWEuQnJvd3Nlci5jbGllbnRXaWR0aCArIFwiIENsaWVudEg6XCIgKyBMYXlhLkJyb3dzZXIuY2xpZW50SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cblxuXG4gICBcblxuICAgIHByaXZhdGUgT25Ub3VjaFVwKGV2dDpMYXlhLkV2ZW50PW51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYodGhpcy50b3VjaElkICE9IC0xICYmIGV2dC50b3VjaElkID09IHRoaXMudG91Y2hJZCkge1xuICAgICAgICAgICAgdGhpcy50b3VjaHVwKCk7XG4gICAgICAgICAgICBpZiggdGhpcy5fY2FsbG9iaiAmJiB0aGlzLl91cGRhdGVjYWxsYmFjayApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlY2FsbGJhY2suY2FsbCggdGhpcy5fY2FsbG9iaiApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaWFjYW5DYWxsYmFjazpib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHRvdWNodXAoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9pc2NhbkNCYWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG91Y2hJZCA9IC0xO1xuICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9mZihMYXlhLkV2ZW50Lk1PVVNFX01PVkUsdGhpcyx0aGlzLk9uVG91Y2hNb3ZlKTtcbiAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vZmYoTGF5YS5FdmVudC5NT1VTRV9VUCx0aGlzLHRoaXMuT25Ub3VjaFVwKTtcbiAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vZmYoIExheWEuRXZlbnQuTU9VU0VfT1VULHRoaXMsdGhpcy5PblRvdWNoVXAgKTtcbiAgICAgICAgdGhpcy5faWFjYW5DYWxsYmFjayA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlZ3JlZSA9IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBPblRvdWNoTW92ZShldnQ6IExheWEuRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYodGhpcy50b3VjaElkICE9IC0xICYmIGV2dC50b3VjaElkID09IHRoaXMudG91Y2hJZCkge1xuICAgICAgICAgICAgdmFyIGJ4OiBudW1iZXIgPSBMYXlhLnN0YWdlLm1vdXNlWDtcbiAgICAgICAgICAgIHZhciBieTogbnVtYmVyID0gTGF5YS5zdGFnZS5tb3VzZVk7XG4gICAgICAgICAgICB2YXIgbW92ZVg6IG51bWJlciA9IGJ4IC0gdGhpcy5fbGFzdFN0YWdlWDtcbiAgICAgICAgICAgIHZhciBtb3ZlWTogbnVtYmVyID0gYnkgLSB0aGlzLl9sYXN0U3RhZ2VZO1xuICAgICAgICAgICAgdGhpcy5fbGFzdFN0YWdlWCA9IGJ4O1xuICAgICAgICAgICAgdGhpcy5fbGFzdFN0YWdlWSA9IGJ5O1xuICAgICAgICAgICAgdmFyIGJ1dHRvblg6IG51bWJlciA9IHRoaXMuX2J1dHRvbi54ICsgbW92ZVg7XG4gICAgICAgICAgICB2YXIgYnV0dG9uWTogbnVtYmVyID0gdGhpcy5fYnV0dG9uLnkgKyBtb3ZlWTtcblxuICAgICAgICAgICAgdmFyIG9mZnNldFg6IG51bWJlciA9IGJ1dHRvblggLSB0aGlzLl9zdGFydFN0YWdlWDtcbiAgICAgICAgICAgIHZhciBvZmZzZXRZOiBudW1iZXIgPSBidXR0b25ZIC0gdGhpcy5fc3RhcnRTdGFnZVk7XG4gICAgICAgICAgICB2YXIgZGlzWDpudW1iZXIgPSAwO1xuICAgICAgICAgICAgaWYoIG1vdmVYID49IDIgfHwgbW92ZVggPD0gLTIgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzY2FuQ0JhY2sgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzY2FuQ0JhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub2ZmeCA9IG1vdmVYO1xuICAgICAgICAgICAgaWYoIG9mZnNldFggPT0gMCAmJiBvZmZzZXRZID09IDAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCBvZmZzZXRYID4gMCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoIG9mZnNldFggPiB0aGlzLnJhZGl1cyApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkaXNYID0gdGhpcy5yYWRpdXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5nbGUgPSA5MDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzWCA9IHRoaXMucmFkaXVzIC0gb2Zmc2V0WDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmdsZSA9IDkwIC0gZGlzWC90aGlzLnJhZGl1cyAqIDkwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoIG9mZnNldFggPT0gMCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbmdsZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoIC1vZmZzZXRYID4gdGhpcy5yYWRpdXMgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzWCA9IHRoaXMucmFkaXVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuZ2xlID0gLTkwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkaXNYID0gdGhpcy5yYWRpdXMgKyBvZmZzZXRYO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuZ2xlID0gLSg5MC1kaXNYL3RoaXMucmFkaXVzICogOTApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByYWQ6IG51bWJlciA9IE1hdGguYXRhbjIob2Zmc2V0WSxvZmZzZXRYKTtcbiAgICAgICAgICAgIHRoaXMuZGVncmVlID0gcmFkO1xuICAgICAgICAgICAgdmFyIG1heFg6IG51bWJlciA9IHRoaXMucmFkaXVzICogTWF0aC5jb3MocmFkKTtcbiAgICAgICAgICAgIHZhciBtYXhZOiBudW1iZXIgPSB0aGlzLnJhZGl1cyAqIE1hdGguc2luKHJhZCk7XG4gICAgICAgICAgICBpZihNYXRoLmFicyhvZmZzZXRYKSA+IE1hdGguYWJzKG1heFgpKVxuICAgICAgICAgICAgICAgIG9mZnNldFggPSBtYXhYO1xuICAgICAgICAgICAgaWYoTWF0aC5hYnMob2Zmc2V0WSkgPiBNYXRoLmFicyhtYXhZKSlcbiAgICAgICAgICAgICAgICBvZmZzZXRZID0gbWF4WTtcbiAgICAgICAgICAgIGJ1dHRvblggPSB0aGlzLl9zdGFydFN0YWdlWCArIG9mZnNldFg7XG4gICAgICAgICAgICBidXR0b25ZID0gdGhpcy5fc3RhcnRTdGFnZVkgKyBvZmZzZXRZO1xuICAgICAgICAgICAgaWYoYnV0dG9uWCA8IDApXG4gICAgICAgICAgICAgICAgYnV0dG9uWCA9IDA7XG4gICAgICAgICAgICBpZihidXR0b25ZID4gZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQpXG4gICAgICAgICAgICAgICAgYnV0dG9uWSA9IGZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLnggPSBidXR0b25YO1xuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLnkgPSBidXR0b25ZO1xuICAgICAgICAgICAgdGhpcy5kaXMgPSBNYXRoLnNxcnQoIG9mZnNldFgqb2Zmc2V0WCArIG9mZnNldFkqb2Zmc2V0WSApO1xuICAgICAgICAgICAgdGhpcy5faWFjYW5DYWxsYmFjayA9IHRydWU7XG4gICAgICAgICAgICBpZiggdGhpcy5faXNjYW5DQmFjayAmJiB0aGlzLl9jYWxsb2JqICYmIHRoaXMuX21vdmVjYWxsYmFjayAmJiB0aGlzLl9pYWNhbkNhbGxiYWNrIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlY2FsbGJhY2suY2FsbCggdGhpcy5fY2FsbG9iaix0aGlzLm9mZnggKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vZmYoTGF5YS5FdmVudC5NT1VTRV9ET1dOLHRoaXMsIHRoaXMub25Ub3VjaERvd24pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuL0dsb2JhbFwiO1xuaW1wb3J0IFN0YWdlID0gTGF5YS5TdGFnZTtcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuL0NvbmZpZy9Bc3NldFBhdGhcIjtcbmltcG9ydCB7IEdhbWVDb250ZW50cyB9IGZyb20gXCIuL0dhbWVDb250ZW50c1wiO1xuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi9XWFNESy9TZGtcIjtcbmNsYXNzIE1haW4ge1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHQvL+agueaNrklEReiuvue9ruWIneWni+WMluW8leaTjlx0XHRcbiAgICAgICAgLy8gTGF5YS5pbml0KEdsb2JhbC5pbml0V2lkdGgsIEdsb2JhbC5pbml0SGVpZ2h0LCBMYXlhW1wiV2ViR0xcIl0pO1xuICAgICAgICBMYXlhM0QuaW5pdChHbG9iYWwuaW5pdFdpZHRoLCBHbG9iYWwuaW5pdEhlaWdodCk7XG5cdFx0TGF5YS5zdGFnZS5zY2FsZU1vZGUgPSBTdGFnZS5TQ0FMRV9GSVhFRF9XSURUSDtcbiAgICAgICAgTGF5YS5zdGFnZS5hbGlnbkggPSBTdGFnZS5BTElHTl9DRU5URVI7XG4gICAgICAgIExheWEuc3RhZ2UuYWxpZ25WID0gU3RhZ2UuQUxJR05fVE9QO1xuICAgICAgICBMYXlhLnN0YWdlLnNjcmVlbk1vZGUgPSBTdGFnZS5TQ1JFRU5fVkVSVElDQUw7XG5cdFx0TGF5YS5zdGFnZS5iZ0NvbG9yID0gXCIjNTRCOUY2XCI7XG4gICAgICAgIC8vIExheWEuU3RhdC5zaG93KCk7XG4gICAgICAgIExheWEuYWxlcnRHbG9iYWxFcnJvciA9IHRydWU7XG4gICAgICAgIHdpbmRvd1snQ29uZmlnM0QnXSAmJiAod2luZG93WydDb25maWczRCddW1wiX2RlZmF1bHRcIl1bXCJfZGVmYXVsdFBoeXNpY3NNZW1vcnlcIl0gPSAxMjgpO1xuICAgICAgICBpZihMYXlhLkJyb3dzZXIud2luZG93LnR0KVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBXeEFwaS5XeEluaXQoKTtcbiAgICAgICAgICAgIFd4QXBpLkNoZWNrV1hVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBMYXlhLnN0YWdlLm9uKFwicmVzaXplXCIsIHRoaXMsIHRoaXMub25SZXNpemUpO1xuXHR9XG5cblx0cHJpdmF0ZSBvblJlc2l6ZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIExheWEuc3RhZ2Uub2ZmKFwicmVzaXplXCIsIHRoaXMsIHRoaXMub25SZXNpemUpO1xuICAgICAgICBHbG9iYWwuc2V0VmFycygpOyBcbiAgICAgICAgQXNzZXRQYXRoLmluaXQoKTsgIFxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5wYWNrYWdlRmlsZUV4dGVuc2lvbiA9IFwiYmluXCI7XG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLnRleHR1cmVMaW5lYXJTYW1wbGluZyA9IHRydWU7XG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmRlZmF1bHRGb250ID0gXCLpu5HkvZNcIjtcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcudmVyc2lvbnM9R2xvYmFsLnZlcnNpb25zO1xuICAgICAgICB2YXIgZ2FtZUNvbnRlbnQ6R2FtZUNvbnRlbnRzID0gbmV3IEdhbWVDb250ZW50cygpO1xuICAgICAgICBnYW1lQ29udGVudC5pbml0R2FtZSgpO1xuICAgICAgICBcbiAgICB9XG59XG4vL+a/gOa0u+WQr+WKqOexu1xubmV3IE1haW4oKTtcbiIsImltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi9Qcm9wTWFuYWdlclwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhcmFjdGVyUG9vbFxue1xuICAgIHN0YXRpYyByb2xlZGljdDphbnkgPSB7fTtcblxuICAgIHB1YmxpYyBzdGF0aWMgQWRkQ2hhcmFjdGVyKCByZXNvdWNlTmFtZTpzdHJpbmcsY2xhczphbnkscGFyZW50OmFueSApOkxheWEuU3ByaXRlM0RcbiAgICB7XG4gICAgICAgIHZhciBza2lubmVkbWVzaDpMYXlhLlNwcml0ZTNEO1xuICAgICAgICB2YXIgYXJyOkFycmF5PExheWEuU3ByaXRlM0Q+ID0gQ2hhcmFjdGVyUG9vbC5yb2xlZGljdFtyZXNvdWNlTmFtZV07XG4gICAgICAgIGlmKCBhcnIgJiYgYXJyLmxlbmd0aCA+IDAgKVxuICAgICAgICB7XG4gICAgICAgICAgICBza2lubmVkbWVzaCA9IGFyci5zaGlmdCgpO1xuICAgICAgICAgICAgc2tpbm5lZG1lc2guYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhcmVudC5hZGRDaGlsZCggc2tpbm5lZG1lc2ggKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBzcDpMYXlhLlNwcml0ZTNEID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbChyZXNvdWNlTmFtZSkpIGFzIExheWEuU3ByaXRlM0Q7XG4gICAgICAgICAgICBza2lubmVkbWVzaCA9IExheWEuU3ByaXRlM0QuaW5zdGFudGlhdGUoc3AscGFyZW50LCBmYWxzZSxuZXcgTGF5YS5WZWN0b3IzKCAwLDAsMCApKSBhcyBMYXlhLlNwcml0ZTNEO1xuICAgICAgICB9XG4gICAgICAgIGlmKGNsYXMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBjbGE6YW55ID0gc2tpbm5lZG1lc2guYWRkQ29tcG9uZW50KCBjbGFzICk7XG4gICAgICAgICAgICBjbGEucmVzb3VzZU5hbWUgPSByZXNvdWNlTmFtZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX291dDpMYXlhLlF1YXRlcm5pb24gPSBuZXcgTGF5YS5RdWF0ZXJuaW9uO1xuICAgICAgICBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSggbmV3IExheWEuVmVjdG9yMyggMCwxLDAgKSwxODAqTWF0aC5QSS8xODAsX291dCApO1xuICAgICAgICBza2lubmVkbWVzaC50cmFuc2Zvcm0ucm90YXRpb24gPSBfb3V0O1xuICAgICAgICByZXR1cm4gc2tpbm5lZG1lc2g7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBDbGVhckNoYXJhY3Rlciggc3A6TGF5YS5TcHJpdGUzRCxyZXNvdWNlTmFtZTpzdHJpbmcsY2xhOkxheWEuU2NyaXB0M0QgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggIUNoYXJhY3RlclBvb2wucm9sZWRpY3RbcmVzb3VjZU5hbWVdIClcbiAgICAgICAge1xuICAgICAgICAgICAgQ2hhcmFjdGVyUG9vbC5yb2xlZGljdFtyZXNvdWNlTmFtZV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZihjbGEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNsYS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgc3AuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHNwLnJlbW92ZVNlbGYoKTtcbiAgICAgICAgQ2hhcmFjdGVyUG9vbC5yb2xlZGljdFtyZXNvdWNlTmFtZV0ucHVzaCggc3AgKTtcbiAgICB9XG59IiwiZXhwb3J0IGNsYXNzIENoYXJhY3RlclN0YXRlXG57XG5cbiAgICAvKirkvqfnv7sgIGNlZmFuMSAqL1xuICAgIHN0YXRpYyByb2xsb3ZlcjE6c3RyaW5nID0gXCJyb2xsb3ZlcjFcIjtcbiAgICAvKirkvqfnv7sgIGNlZmFuMiAqL1xuICAgIHN0YXRpYyByb2xsb3ZlcjI6c3RyaW5nID0gXCJyb2xsb3ZlcjJcIjtcbiAgICAvKirot5Hlopnlt6YgIHBhb3FpYW5nbGVmdCAqL1xuICAgIHN0YXRpYyBydW53YWxsbGVmdDpzdHJpbmcgPSBcInJ1bndhbGxsZWZ0XCI7XG4gICAgLyoq5Y+z6LezICByaWdodGp1bXAgKi9cbiAgICBzdGF0aWMgcmlnaHRqdW1wOnN0cmluZyA9IFwicmlnaHRqdW1wXCI7XG4gICAgLyoq6LeR5aKZ5Y+zICBwYW9xaWFuZ3JpZ2h0ICovXG4gICAgc3RhdGljIHJ1bndhbGxyaWdodDpzdHJpbmcgPSBcInJ1bndhbGxyaWdodFwiO1xuICAgIC8qKuW3pui3syAgbGVmdGp1bXAqL1xuICAgIHN0YXRpYyBsZWZ0anVtcDpzdHJpbmcgPSBcImxlZnRqdW1wXCI7XG4gICAgLyoq54is5aKZICBwYXFpYW5nICovXG4gICAgc3RhdGljIGNsaW1id2FsbDpzdHJpbmcgPSBcImNsaW1id2FsbFwiO1xuICAgIC8qKiDvvJ8gICBjbGltYmVuZCAqL1xuICAgIHN0YXRpYyBjbGltYmVuZDpzdHJpbmcgPSBcImNsaW1iZW5kXCI7XG4gICAgLyoq56uZ56uLICBzdGFuZCovXG4gICAgc3RhdGljIHN0YW5kOnN0cmluZyA9IFwic3RhbmRcIjtcbiAgICAvKirnqbrkuK0gIGtvbmd6aG9uZyAqL1xuICAgIHN0YXRpYyBza3k6c3RyaW5nID0gXCJza3lcIjtcbiAgICAvKirokL3lnLAgIGx1b2RpMSAqL1xuICAgIHN0YXRpYyBsYW5kMTpzdHJpbmcgPSBcImxhbmQxXCI7XG4gICAgLyoq6JC95ZywICBsdW9kaTIgKi9cbiAgICBzdGF0aWMgbGFuZDI6c3RyaW5nID0gXCJsYW5kMlwiO1xuICAgIC8qKuWkp+i3syAgZGF0aWFvMSAqL1xuICAgIHN0YXRpYyBoaWdoanVtcDE6c3RyaW5nID0gXCJoaWdoanVtcDFcIjtcbiAgICAvKirlpKfot7MgIGRhdGlhbzIgKi9cbiAgICBzdGF0aWMgaGlnaGp1bXAyOnN0cmluZyA9IFwiaGlnaGp1bXAyXCI7XG4gICAgXG4gICAgXG4gICAgLyoq6LeR5YqoIHJ1biAqL1xuICAgIHN0YXRpYyBydW46c3RyaW5nID0gXCJydW5cIjtcbiAgICAvKirot7Pot4MganVtcCovXG4gICAgc3RhdGljIGp1bXA6c3RyaW5nID0gXCJqdW1wXCI7XG4gICAgLyoq54is5Y2HICBDbGltYiAqL1xuICAgIHN0YXRpYyBjbGltYnVwOnN0cmluZyA9IFwiY2xpbWJ1cFwiO1xuICAgIC8qKuiHqueUseiQveS9kyBGcmVlZmFsbGluZyAqL1xuICAgIHN0YXRpYyBmYWxsZG93bjpzdHJpbmcgPSBcImZhbGxkb3duXCI7XG4gICAgLyoq5bem54isICBsZWZ0X2NsaW1iICovXG4gICAgc3RhdGljIGNsaW1ibGVmdDpzdHJpbmcgPSBcImNsaW1ibGVmdFwiO1xuICAgIC8qKuWPs+eIrCAgcmlnaHRfY2xpbWIqL1xuICAgIHN0YXRpYyBjbGltYnJpZ2h0OnN0cmluZyA9IFwiY2xpbWJyaWdodFwiO1xuICAgIC8qKuWPs+i3syByaWdodF9qdW1wICovXG4gICAgc3RhdGljIGp1bXByaWdodDpzdHJpbmcgPSBcImp1bXByaWdodFwiO1xuICAgIC8qKuW3pui3syBsZWZ0X2p1bXAgKi9cbiAgICBzdGF0aWMganVtcGxlZnQ6c3RyaW5nID0gXCJqdW1wbGVmdFwiO1xuICAgIC8qKiBQbGF5UGFsb3VBY3Rpb24qL1xuICAgIHN0YXRpYyBDbGltYk1vdGlvbjpzdHJpbmcgPSBcIkNsaW1iTW90aW9uXCI7XG5cbiAgICAvKiog77yfICBodWFjaGFuICovXG4gICAgc3RhdGljIGh1YWNoYW46c3RyaW5nID0gXCJodWFjaGFuXCI7XG4gICAgLyoq6Leo5qCPICBrdWFsYW4gKi9cbiAgICBzdGF0aWMgaHVyZGxlOnN0cmluZyA9IFwiaHVyZGxlXCI7XG5cblxuICAgIC8qKlxuICAgICAqIOWKoOmAn+adv+i3s+i3gyBqaWFzdUp1bXBcbiAgICAgKi9cbiAgICBzdGF0aWMgc3BlZWR1cGp1bXA6c3RyaW5nID0gXCJzcGVlZHVwanVtcFwiO1xuXG4gICAgLyoqXG4gICAgICogeOaWueWQkeeerOenuyAgeHNodW55aVxuICAgICAqL1xuICAgIHN0YXRpYyBNb3ZlWDpzdHJpbmcgPSBcIk1vdmVYXCI7XG5cbiAgICAvKipcbiAgICAgKiDkuIvmu5HkvY3np7sgZG93blNsaWRlXG4gICAgICovXG4gICAgc3RhdGljIGRvd25tb3ZlOnN0cmluZyA9IFwiZG93bm1vdmVcIjtcblxuICAgIC8qKlxuICAgICAqIOS+p+mdouWKoOmAnyAgc2xpZGVqaWFzdVxuICAgICAqL1xuICAgIHN0YXRpYyBzaWRlc3BlZWR1cDpzdHJpbmcgPSBcInNpZGVzcGVlZHVwXCI7XG5cbiAgICAvKipcbiAgICAgKiDnv7votoogIHN1cm1vdW50XG4gICAgICovXG4gICAgc3RhdGljIGNyb3NzOnN0cmluZyA9IFwiY3Jvc3NcIjtcblxuICAgIC8qKlxuICAgICAqIOmUgeWumueIrOWNhyAgbG9ja2NsaW1iXG4gICAgICovXG4gICAgc3RhdGljIGNsaW1idXBibG9jazpzdHJpbmcgPSBcImNsaW1idXBibG9ja1wiO1xufSIsIi8qXG4qIOWvueixoeaxoOexu1xuKi9cbmltcG9ydCBBbmltYXRpb24gPSBMYXlhLkFuaW1hdGlvbjtcblx0aW1wb3J0IFN0YWdlID0gTGF5YS5TdGFnZTtcblx0aW1wb3J0IFJlY3RhbmdsZSA9IExheWEuUmVjdGFuZ2xlO1xuXHRpbXBvcnQgTG9hZGVyID0gTGF5YS5Mb2FkZXI7XG5cdGltcG9ydCBCcm93c2VyID0gTGF5YS5Ccm93c2VyO1xuICAgIGltcG9ydCBXZWJHTCA9IExheWEuV2ViR0w7XG4gICAgXG5cbmV4cG9ydCBjbGFzcyBHYW1lUG9vbCBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXG57XG4gICAgcHJpdmF0ZSBzdGF0aWMgc3ByaXRlM0RBcnJheTphbnkgPSB7fTtcbiAgICBwcml2YXRlIHN0YXRpYyBjb250YWluOmFueT17fTtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgQW5pQ29uZlBhdGg6IHN0cmluZyA9IFwicmVzL2ZpZ2h0ZXIvZmlnaHRlci5qc29uXCI7XG5cbiAgICBcblxuICAgIHB1YmxpYyBzdGF0aWMgUmVtb3ZlSXRlbSgga2V5OnN0cmluZywgb2JqOmFueSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBHYW1lUG9vbC5jb250YWluW2tleV0gKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gR2FtZVBvb2wuY29udGFpbltrZXldLmluZGV4T2YoIG9iaiApO1xuICAgICAgICAgICAgaWYoaW5kZXggPT0gLTEpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgR2FtZVBvb2wuY29udGFpbltrZXldLnB1c2goIG9iaiApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBHZXRJdGVtKCBrZXk6c3RyaW5nLC4uLmFyZ3M6YW55W10gKTphbnlcbiAgICB7XG4gICAgICAgIGlmKCBHYW1lUG9vbC5jb250YWluW2tleV0gKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSBHYW1lUG9vbC5jb250YWluW2tleV07XG4gICAgICAgICAgICBpZiggYXJyLmxlbmd0aCA9PTAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBjYWxzc29iajphbnkgPSBHYW1lUG9vbC5zcHJpdGUzREFycmF5W2tleV07XG4gICAgICAgICAgICAgICAgdmFyIHZvOmFueSA9IG5ldyBjYWxzc29iaigpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2bztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBHYW1lUG9vbC5jb250YWluW2tleV0uc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCBcIuatpGtleeWAvOWvueW6lOeahOexu+acquiiq+azqOWGjFwiICk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBbmltYXRpb24oKTogdm9pZCB7XG4gICAgICAgIHZhciBhbmk6IEFuaW1hdGlvbiA9IG5ldyBBbmltYXRpb24oKTtcbiAgICAgICAgYW5pLmxvYWRBdGxhcyh0aGlzLkFuaUNvbmZQYXRoKTsgLy8g5Yqg6L295Zu+6ZuG5Yqo55S7XG4gICAgICAgIGFuaS5pbnRlcnZhbCA9IDMwOyAvLyDorr7nva7mkq3mlL7pl7TpmpTvvIjljZXkvY3vvJrmr6vnp5LvvIlcbiAgICAgICAgYW5pLmluZGV4ID0gMTsgLy8g5b2T5YmN5pKt5pS+57Si5byVXG4gICAgICAgIGFuaS5wbGF5KCk7IC8vIOaSreaUvuWbvumbhuWKqOeUu1xuXG4gICAgICAgIC8vIOiOt+WPluWKqOeUu+eahOi+ueeVjOS/oeaBr1xuICAgICAgICB2YXIgYm91bmRzOiBSZWN0YW5nbGUgPSBhbmkuZ2V0R3JhcGhpY0JvdW5kcygpO1xuICAgICAgICBhbmkucGl2b3QoYm91bmRzLndpZHRoIC8gMiwgYm91bmRzLmhlaWdodCAvIDIpO1xuXG4gICAgICAgIGFuaS5wb3MoTGF5YS5zdGFnZS53aWR0aCAvIDIsIExheWEuc3RhZ2UuaGVpZ2h0IC8gMik7XG5cbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChhbmkpO1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbiAgICBwdWJsaWMgc3RhdGljIEdldEl0ZW1GYWlyeUdVSSggdXJsOnN0cmluZyApOmFueVxuICAgIHtcbiAgICAgICAgaWYoICFHYW1lUG9vbC5jb250YWluW3VybF0gKVxuICAgICAgICB7XG4gICAgICAgICAgICBHYW1lUG9vbC5jb250YWluW3VybF0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSBHYW1lUG9vbC5jb250YWluW3VybF07XG4gICAgICAgIGlmKCBhcnIubGVuZ3RoID09MCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciB2bzphbnkgPSBmYWlyeWd1aS5VSVBhY2thZ2UuY3JlYXRlT2JqZWN0RnJvbVVSTCggdXJsICk7XG4gICAgICAgICAgICByZXR1cm4gdm87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEdhbWVQb29sLmNvbnRhaW5bdXJsXS5zaGlmdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgTWFyaygga2V5OnN0cmluZywgY2xhc3Nhcmc6YW55ICk6dm9pZFxuICAgIHtcbiAgICAgICAgR2FtZVBvb2wuc3ByaXRlM0RBcnJheVtrZXldID0gY2xhc3Nhcmc7XG4gICAgICAgIEdhbWVQb29sLmNvbnRhaW5ba2V5XSA9IFtdO1xuICAgIH1cblxuICAgIFxufSIsImltcG9ydCB7U2luZ2xldG9ufSBmcm9tIFwiLi4vdXRpbHMvU2luZ2xldG9uXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIFBhbmVsUmVzRGljIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcbntcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6UGFuZWxSZXNEaWM7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfbWFwdmlld0RpY3Q6YW55PXt9O1xuXG5cdGNvbnN0cnVjdG9yKCkgXG5cdHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgUGFuZWxSZXNEaWMuaW5zID0gdGhpcztcblx0fVxuXHRcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBQYW5lbFJlc0RpY1xuXHR7XG4gICAgICAgIGlmKFBhbmVsUmVzRGljLmlucyA9PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhbmVsUmVzRGljKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhbmVsUmVzRGljLmlucztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFZpZXcoIHZpZXdrZXk6c3RyaW5nICk6YW55XG4gICAge1xuICAgICAgICBpZiggIVBhbmVsUmVzRGljLl9tYXB2aWV3RGljdFt2aWV3a2V5XSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IFwiZXJyMCDmnKrnu5HlrprnmoR2aWV3a2V5OlwiICsgdmlld2tleTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUGFuZWxSZXNEaWMuX21hcHZpZXdEaWN0W3ZpZXdrZXldO1xuICAgIH1cbiAgICBcbiAgICBcbiAgICBwdWJsaWMgZ2V0U2luZ2xlVG9uKHJlZjphbnkpOmFueVxuXHR7XG4gICAgICAgIHJldHVybiBTaW5nbGV0b24uSW5zdGFuY2UocmVmKTtcbiAgICB9XG4gICAgXG4gICAgXG5cbiAgICBwdWJsaWMgbWFwVmlldyggdmlld2tleTpzdHJpbmcscmVmOmFueSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCAhUGFuZWxSZXNEaWMuX21hcHZpZXdEaWN0W3ZpZXdrZXldIClcbiAgICAgICAge1xuICAgICAgICAgICAgUGFuZWxSZXNEaWMuX21hcHZpZXdEaWN0W3ZpZXdrZXldID0gcmVmO1xuICAgICAgICAgICAgcmVmLmtleSA9IHZpZXdrZXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcblxuICAgIHB1YmxpYyBBZ2VuY3lBZGQocmVmOmFueSk6dm9pZFxuXHR7XG4gICAgICAgIFNpbmdsZXRvbi5jcmVhdGUocmVmKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgQWdlbmN5Q2xlYXIocmVmOmFueSk6dm9pZFxuXHR7XG4gICAgICAgIFNpbmdsZXRvbi5yZW1vdmUocmVmKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIFByb3BNYW5hZ2VyXG57XG4gICAgc3RhdGljIHNjZW5lM0Q6TGF5YS5TY2VuZTNEO1xuICAgIHN0YXRpYyBzdGFydFBsYW5lOkxheWEuTWVzaFNwcml0ZTNEO1xuICAgIHN0YXRpYyBjYXJtYTpMYXlhLkNhbWVyYTtcbiAgICBzdGF0aWMgbWFpblJvbGU6TGF5YS5TcHJpdGUzRDtcbiAgICBzdGF0aWMgbm93bWFwRGljdDphbnkgPSB7fTtcbiAgICBzdGF0aWMgZGllUG9zWTpudW1iZXIgPSAwO1xuICAgIHN0YXRpYyBlbmRQbGFuZTpMYXlhLk1lc2hTcHJpdGUzRDtcblxuICAgIHN0YXRpYyBnYW1ld2luUG9zWjpudW1iZXIgPSAwO1xuXG4gICAgc3RhdGljIHBhdHRlcm5EaWN0OmFueSA9IHt9O1xuXG4gICAgc3RhdGljIG5wY0RpY3Q6YW55ID0ge307XG4gICAgc3RhdGljIG5wY3NjcmlwdERpY3Q6YW55ID0ge307XG4gICAgc3RhdGljIG5wY251bTpudW1iZXIgPSAwO1xuXG4gICAgc3RhdGljIGlzY2FybWFucGM6Ym9vbGVhbiA9IGZhbHNlO1xuXG4gICAgc3RhdGljIHByb19qaW5kdTpmYWlyeWd1aS5HUHJvZ3Jlc3NCYXI7XG5cbiAgICBzdGF0aWMgdHh0X21pbmdjaTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuXG4gICAgc3RhdGljIGxpemlEaWN0OmFueSA9IHt9O1xuXG4gICAgc3RhdGljIGppYW50b3VBcnI6QXJyYXk8TGF5YS5NZXNoU3ByaXRlM0Q+PVtdO1xuXG4gICAgLy8gc3RhdGljIGJnc3ByaXRlM2Q6TGF5YS5NZXNoU3ByaXRlM0Q7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6UHJvcE1hbmFnZXI7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgUHJvcE1hbmFnZXIuaW5zID0gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlByb3BNYW5hZ2VyXG4gICAge1xuICAgICAgICBpZiggUHJvcE1hbmFnZXIuaW5zID09IG51bGwgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BNYW5hZ2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb3BNYW5hZ2VyLmlucztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UG9zVmVjYnlTY2VuZSggc2NlbmVOYW1lOnN0cmluZyxidWlsZG5hbWU6c3RyaW5nICk6TGF5YS5WZWN0b3IzXG4gICAge1xuICAgICAgICBpZiggUHJvcE1hbmFnZXIucGF0dGVybkRpY3RbIHNjZW5lTmFtZSBdIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIFByb3BNYW5hZ2VyLnBhdHRlcm5EaWN0WyBzY2VuZU5hbWUgXVtidWlsZG5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIC8qKlxuICAgIC8vICAqIOWIpOaWreaYr+WQpueIrOWIsOmhtuerr1xuICAgIC8vICAqL1xuICAgIC8vIHN0YXRpYyBjaGVja2lzQ2xpbWJUb3AoIHNjZW5lTmFtZTpzdHJpbmcsYnVpbGRuYW1lOnN0cmluZywgcG9zOkxheWEuVmVjdG9yMyApOmJvb2xlYW5cbiAgICAvLyB7XG4gICAgLy8gICAgIHZhciB2ZWM6TGF5YS5WZWN0b3IzID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggc2NlbmVOYW1lLGJ1aWxkbmFtZSApO1xuICAgIC8vICAgICBpZiggdmVjICYmIE1hdGguYWJzKHZlYy55IC0gcG9zLnkpIDwgMS41IClcbiAgICAvLyAgICAge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIH1cblxuICAgIHN0YXRpYyBhY3Rpb25udW1zOm51bWJlciA9IDU3NTtcblxuICAgIHN0YXRpYyBhY3Rpb25EaWN0OmFueSA9IHsgXG4gICAgICAgIFwiY2xpbWJlbmRcIjp7IHM6NTUwLGU6NTc1LGlzbG9vcGluZzpmYWxzZSB9LFxuICAgICAgICBcInN0YW5kXCI6eyBzOjAsZTo4MCxpc2xvb3Bpbmc6dHJ1ZSB9LFxuICAgICAgICBcInJ1blwiOnsgczo5MCxlOjEwNixpc2xvb3Bpbmc6dHJ1ZSB9LFxuICAgICAgICBcImp1bXBcIjp7IHM6MTEwLGU6MTMyLGlzbG9vcGluZzp0cnVlIH0sXG4gICAgICAgIFwia29uZ3pob25nXCI6eyBzOjEzMixlOjE0NSxpc2xvb3Bpbmc6dHJ1ZSB9LFxuICAgICAgICBcImx1b2RpMVwiOnsgczoxNDUsZToxNjAsaXNsb29waW5nOnRydWUgfSxcbiAgICAgICAgXCJsdW9kaTJcIjp7IHM6MTcwLGU6MjAyLGlzbG9vcGluZzp0cnVlIH0sXG4gICAgICAgIFwiZGF0aWFvMVwiOnsgczoyMTAsZToyMzUsaXNsb29waW5nOnRydWUgfSxcbiAgICAgICAgXCJkYXRpYW8yXCI6eyBzOjI0MCxlOjI3Myxpc2xvb3Bpbmc6dHJ1ZSB9LFxuICAgICAgICBcImh1YWNoYW5cIjp7IHM6MjgwLGU6MzEwLGlzbG9vcGluZzp0cnVlIH0sXG4gICAgICAgIFwia3VhbGFuXCI6eyBzOjMxMCxlOjM0Nixpc2xvb3Bpbmc6dHJ1ZSB9LFxuICAgICAgICBcImNlZmFuMVwiOnsgczozNTAsZTozOTEsaXNsb29waW5nOnRydWUgfSxcbiAgICAgICAgXCJjZWZhbjJcIjp7IHM6NDAwLGU6NDM0LGlzbG9vcGluZzp0cnVlIH0sXG4gICAgICAgIFwicGFvcWlhbmdsZWZ0XCI6eyBzOjQ0MCxpc2xvb3Bpbmc6dHJ1ZSxlOjQ1NiB9LFxuICAgICAgICBcInJpZ2h0anVtcFwiOnsgczo0NjAsZTo0NzcsaXNsb29waW5nOnRydWUgfSxcbiAgICAgICAgXCJwYW9xaWFuZ3JpZ2h0XCI6eyBzOjQ4MCxlOjQ5Nixpc2xvb3Bpbmc6dHJ1ZSB9LFxuICAgICAgICBcImxlZnRqdW1wXCI6eyBzOjUwMCxlOjUxNyxpc2xvb3Bpbmc6dHJ1ZSB9LFxuICAgICAgICBcInBhcWlhbmdcIjp7IHM6NTIwLGU6NTQyLGlzbG9vcGluZzp0cnVlIH1cbiAgICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYW5pbWF0b3IgXG4gICAgICogQHBhcmFtIGFuaW1hdG9yRGljdCBcbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0QW5pbWF0b3IoIGFuaW1hdG9yOkxheWEuQW5pbWF0b3IgKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgY2hpZGRpY3Q6YW55O1xuICAgICAgICBmb3IoIHZhciBzIGluIFByb3BNYW5hZ2VyLmFjdGlvbkRpY3QgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggIWFuaW1hdG9yLmdldENvbnRyb2xsZXJMYXllciggKS5nZXRBbmltYXRvclN0YXRlKCBzICkgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNoaWRkaWN0ID0gUHJvcE1hbmFnZXIuYWN0aW9uRGljdFtzXTtcbiAgICAgICAgICAgICAgICAvL+WIm+W7uuS4gOS4quWKqOeUu+WKqOS9nOeKtuaAgVxuICAgICAgICAgICAgICAgIHZhciBzdGF0ZTEgPSBuZXcgTGF5YS5BbmltYXRvclN0YXRlKCk7XG4gICAgICAgICAgICAgICAgLy/orr7nva7liqjkvZznirbmgIHnmoTlkI3np7BcbiAgICAgICAgICAgICAgICBzdGF0ZTEubmFtZSA9IHM7XG4gICAgICAgICAgICAgICAgLy/orr7nva7liqjkvZznirbmgIHmkq3mlL7nmoTotbflp4vml7bpl7TvvIjotbflp4vml7bpl7TkuI7nu5PmnZ/ml7bpl7TnmoTorr7nva7kuLowLTHnmoTnmb7liIbmr5TmlbDlgLzvvIkgIOimgeaIquWPlueahOaXtumXtOeCuSAvIOWKqOeUu+eahOaAu+aXtumVv1xuICAgICAgICAgICAgICAgIHN0YXRlMS5jbGlwU3RhcnQgPSBjaGlkZGljdC5zL1Byb3BNYW5hZ2VyLmFjdGlvbm51bXM7XG4gICAgICAgICAgICAgICAgLy/orr7nva7liqjkvZznirbmgIHmkq3mlL7nmoTnu5PmnZ/ml7bpl7RcbiAgICAgICAgICAgICAgICBzdGF0ZTEuY2xpcEVuZCA9IGNoaWRkaWN0LmUvUHJvcE1hbmFnZXIuYWN0aW9ubnVtcztcbiAgICAgICAgICAgICAgICAvL+W+l+WIsOm7mOiupOWKqOeUu+i1i+WAvOe7mUNsaXDvvIhnZXREZWZhdWx0U3RhdGXpu5jorqTliqjnlLvkuLpVbml0eeS4rWFuaW1hdGlvbueahOaVsOe7hOmhuuW6jzDkuIvmoIfnmoTliqjnlLvvvIlcbiAgICAgICAgICAgICAgICBzdGF0ZTEuY2xpcCA9IGFuaW1hdG9yLmdldERlZmF1bHRTdGF0ZSgpLmNsaXA7XG4gICAgICAgICAgICAgICAgLy/liqjnlLvmkq3mlL7mmK/lkKblvqrnjq9cbiAgICAgICAgICAgICAgICBzdGF0ZTEuY2xpcC5pc2xvb3BpbmcgPSBjaGlkZGljdC5pc2xvb3Bpbmc7XG4gICAgICAgICAgICAgICAgLy/mt7vliqDliqjnlLvnirbmgIHliLDliqjnlLvnu4Tku7bph4xcbiAgICAgICAgICAgICAgICBhbmltYXRvci5hZGRTdGF0ZShzdGF0ZTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIEluaXRFZmZlY3QoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgbGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRCA9IFByb3BNYW5hZ2VyLmdldGxpemlieU5hbWUoIFwic3BlZWR1cGVmZmVjdFwiICk7XG4gICAgICAgIGxpemkucGFydGljbGVTeXN0ZW0ucGxheSgpO1xuICAgICAgICBsaXppLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB2YXIgbGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRCA9IFByb3BNYW5hZ2VyLmdldGxpemlieU5hbWUoIFwiY29sb3Jfd2hpdGVcIiApO1xuICAgICAgICBsaXppLnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcbiAgICAgICAgbGl6aS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdmFyIGxpemk6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0QgPSBQcm9wTWFuYWdlci5nZXRsaXppYnlOYW1lKCBcImNvbG9yX3llbGxvd1wiICk7XG4gICAgICAgIGxpemkucGFydGljbGVTeXN0ZW0ucGxheSgpO1xuICAgICAgICBsaXppLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RhbnNlbGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcbiAgICBwdWJsaWMgU2V0RWZmZWN0Q29sb3IoIG5hbWU6c3RyaW5nLHBvczpMYXlhLlZlY3RvcjMgKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgY2xvc2V0aW1lOm51bWJlciA9IDA7XG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy5FZmZlY3RFbmQgKTtcbiAgICAgICAgdGhpcy5FZmZlY3RFbmRDb2xvcigpO1xuICAgICAgICBpZiggbmFtZSA9PSBcImNvbG9yX3doaXRlXCIgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xuICAgICAgICAgICAgaWYoIHNvcnQgPiA1MCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZSA9IFwiY29sb3JfeWVsbG93XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2xvc2V0aW1lID0gNTAwO1xuICAgICAgICB0aGlzLl90YW5zZWxpemkgPSBQcm9wTWFuYWdlci5nZXRsaXppYnlOYW1lKCBuYW1lICk7XG4gICAgICAgIHRoaXMuX3RhbnNlbGl6aS50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3M7XG4gICAgICAgIHRoaXMuX3RhbnNlbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XG4gICAgICAgIGlmKCBjbG9zZXRpbWUgIT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSggY2xvc2V0aW1lLHRoaXMsdGhpcy5FZmZlY3RFbmRDb2xvciApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBFZmZlY3RFbmRDb2xvcigpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl90YW5zZWxpemkgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl90YW5zZWxpemkucGFydGljbGVTeXN0ZW0uc3RvcCgpO1xuICAgICAgICAgICAgdGhpcy5fdGFuc2VsaXppLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZW5nYW1lbGl6aTQ6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0Q7XG4gICAgcHJpdmF0ZSBfb3V0UVVhdGVybmlvbjQ6TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjtcbiAgICBwdWJsaWMgU3BlZWRVcEVmZmVjdDEobmFtZTpzdHJpbmcscG9zOkxheWEuVmVjdG9yMyk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoICF0aGlzLl9lbmdhbWVsaXppNCB8fCAodGhpcy5fZW5nYW1lbGl6aTQgJiYgIXRoaXMuX2VuZ2FtZWxpemk0LmFjdGl2ZSApIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQgPSBQcm9wTWFuYWdlci5nZXRsaXppYnlOYW1lKCBcInNwZWVkdXBlZmZlY3RcIiApO1xuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQucGFydGljbGVTeXN0ZW0ubG9vcGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppNC50cmFuc2Zvcm0uc2NhbGUgPSBuZXcgTGF5YS5WZWN0b3IzKCAyMCwyMCwyMCApO1xuICAgICAgICAgICAgTGF5YS5RdWF0ZXJuaW9uLmNyZWF0ZUZyb21BeGlzQW5nbGUoIG5ldyBMYXlhLlZlY3RvcjMoIDEsMCwwICksLTUwLHRoaXMuX291dFFVYXRlcm5pb240ICk7XG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppNC50cmFuc2Zvcm0ucm90YXRpb24gPSB0aGlzLl9vdXRRVWF0ZXJuaW9uNDtcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemk0LnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbHpwb3M6TGF5YS5WZWN0b3IzID0gcG9zLmNsb25lKCk7XG4gICAgICAgIGx6cG9zLnkgKz0gNTtcbiAgICAgICAgbHpwb3MueiAtPSAxMDtcbiAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQudHJhbnNmb3JtLnBvc2l0aW9uID0gbHpwb3M7XG4gICAgfVxuXG4gICAgcHVibGljIENsb3NlU3BlZWRVcEVmZmVjdDEoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5fZW5nYW1lbGl6aTQgJiYgdGhpcy5fZW5nYW1lbGl6aTQuYWN0aXZlIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9lbmdhbWVsaXppMzpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcbiAgICBwcml2YXRlIF9vdXRRVWF0ZXJuaW9uOkxheWEuUXVhdGVybmlvbiA9IG5ldyBMYXlhLlF1YXRlcm5pb247XG4gICAgcHVibGljIFNwZWVkVXBFZmZlY3QobmFtZTpzdHJpbmcscG9zOkxheWEuVmVjdG9yMyk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoICF0aGlzLl9lbmdhbWVsaXppMyB8fCAodGhpcy5fZW5nYW1lbGl6aTMgJiYgIXRoaXMuX2VuZ2FtZWxpemkzLmFjdGl2ZSApIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMgPSBQcm9wTWFuYWdlci5nZXRsaXppYnlOYW1lKCBcInNwZWVkdXBlZmZlY3RcIiApO1xuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMucGFydGljbGVTeXN0ZW0ubG9vcGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMy50cmFuc2Zvcm0uc2NhbGUgPSBuZXcgTGF5YS5WZWN0b3IzKCAyMCwyMCwyMCApO1xuICAgICAgICAgICAgTGF5YS5RdWF0ZXJuaW9uLmNyZWF0ZUZyb21BeGlzQW5nbGUoIG5ldyBMYXlhLlZlY3RvcjMoIDEsMCwwICksLTUwLHRoaXMuX291dFFVYXRlcm5pb24gKTtcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkzLnRyYW5zZm9ybS5yb3RhdGlvbiA9IHRoaXMuX291dFFVYXRlcm5pb247XG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMy5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGx6cG9zOkxheWEuVmVjdG9yMyA9IHBvcy5jbG9uZSgpO1xuICAgICAgICBsenBvcy55ICs9IDU7XG4gICAgICAgIHRoaXMuX2VuZ2FtZWxpemkzLnRyYW5zZm9ybS5wb3NpdGlvbiA9IGx6cG9zO1xuICAgIH1cblxuICAgIHB1YmxpYyBDbG9zZVNwZWVkVXBFZmZlY3QoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5fZW5nYW1lbGl6aTMgJiYgdGhpcy5fZW5nYW1lbGl6aTMuYWN0aXZlIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9lbmdhbWVsaXppMTpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcbiAgICBwcml2YXRlIF9lbmdhbWVsaXppMjpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcbiAgICBwdWJsaWMgR2FtZU92ZXJFZmZlY2YobmFtZTpzdHJpbmcscG9zOkxheWEuVmVjdG9yMyxpc3dpbjpib29sZWFuKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9lbmdhbWVsaXppMSA9IFByb3BNYW5hZ2VyLmdldGxpemlieU5hbWUoIFwiZmlyZXdvcmtzXCIgKTtcbiAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTEudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zO1xuICAgICAgICB0aGlzLl9lbmdhbWVsaXppMS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XG4gICAgICAgIGlmKGlzd2luKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMiA9IFByb3BNYW5hZ2VyLmdldGxpemlieU5hbWUoIFwid2lubGluZVwiICk7XG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMi50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3M7XG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMi5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgQ2xvc2VHYW1lT3ZlckVmZmVjdCgpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKHRoaXMuX2VuZ2FtZWxpemkxKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMS5wYXJ0aWNsZVN5c3RlbS5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLl9lbmdhbWVsaXppMilcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTIucGFydGljbGVTeXN0ZW0uc3RvcCgpO1xuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTIuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwdWJsaWMgc2V0bGl6aVBsYXkoIG5hbWU6c3RyaW5nLHBvczpMYXlhLlZlY3RvcjMgKTp2b2lkXG4gICAgLy8ge1xuICAgIC8vICAgICB2YXIgY2xvc2V0aW1lOm51bWJlciA9IDA7XG4gICAgLy8gICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy5saXppZW5kICk7XG4gICAgLy8gICAgIHN3aXRjaCggbmFtZSApXG4gICAgLy8gICAgIHtcbiAgICAvLyAgICAgICAgIGNhc2UgXCJ0YW5zZV9iYWlcIjpcbiAgICAvLyAgICAgICAgICAgICBpZiggbmFtZSA9PSBcInRhbnNlX2JhaVwiIClcbiAgICAvLyAgICAgICAgICAgICB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsMTAwICk7XG4gICAgLy8gICAgICAgICAgICAgICAgIGlmKCBzb3J0ID4gNTAgKVxuICAgIC8vICAgICAgICAgICAgICAgICB7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBuYW1lID0gXCJ0YW5zZV9odWFuZ1wiO1xuICAgIC8vICAgICAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgICAgIGNsb3NldGltZSA9IDUwMDtcbiAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcImppYXN1bGl6aVwiOlxuICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwid2luX3hpYW5cIjpcbiAgICAvLyAgICAgICAgICAgICBjbG9zZXRpbWUgPSAwO1xuICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwieWFuaHVhXCI6XG4gICAgLy8gICAgICAgICAgICAgY2xvc2V0aW1lID0gMDtcbiAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHZhciBsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEID0gUHJvcE1hbmFnZXIuZ2V0bGl6aWJ5TmFtZSggbmFtZSApO1xuICAgIC8vICAgICBsaXppLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHBvcztcbiAgICAvLyAgICAgbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XG4gICAgLy8gICAgIGlmKCBjbG9zZXRpbWUgIT0gMCApXG4gICAgLy8gICAgIHtcbiAgICAvLyAgICAgICAgIExheWEudGltZXIub25jZSggY2xvc2V0aW1lLHRoaXMsdGhpcy5saXppZW5kLFtsaXppXSApO1xuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgcHJpdmF0ZSBFZmZlY3RFbmQobGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIGxpemkgKVxuICAgICAgICB7XG4gICAgICAgICAgICBsaXppLnBhcnRpY2xlU3lzdGVtLnN0b3AoKTtcbiAgICAgICAgICAgIGxpemkuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0bGl6aWJ5TmFtZSggbmFtZTpzdHJpbmcgKTpMYXlhLlNodXJpS2VuUGFydGljbGUzRFxuICAgIHtcbiAgICAgICAgdmFyIGxpemlzcDpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcbiAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmxpemlEaWN0W25hbWVdIClcbiAgICAgICAge1xuICAgICAgICAgICAgbGl6aXNwID0gUHJvcE1hbmFnZXIubGl6aURpY3RbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBsaXppc3AgPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKExheWEuTG9hZGVyLmdldFJlcyhBc3NldFBhdGguZ2V0M0RNb2RlbChuYW1lKSkpIGFzIExheWEuU2h1cmlLZW5QYXJ0aWNsZTNEO1xuICAgICAgICAgICAgUHJvcE1hbmFnZXIubGl6aURpY3RbbmFtZV0gPSBsaXppc3A7XG4gICAgICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmFkZENoaWxkKCBsaXppc3AgKTtcbiAgICAgICAgfVxuICAgICAgICBsaXppc3AuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGxpemlzcDtcbiAgICB9XG59IiwiaW1wb3J0IHtQYW5lbENoaWxkQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2xcIjtcbmltcG9ydCBDcGFFdmVudCBmcm9tIFwiLi9DcGFFdmVudFwiO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XG5pbXBvcnQgeyBSZWNvbW1lbmQgfSBmcm9tIFwiLi9SZWNvbW1lbmRWaWV3XCI7XG5pbXBvcnQgQ3BhSXRlbSBmcm9tIFwiLi9DcGFJdGVtXCI7XG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhb0t1YW5HYW1lVmlldyBleHRlbmRzIFBhbmVsQ2hpbGRDb250cm9sIGltcGxlbWVudHMgVGltZXJDb250cm9sXG57XG4gICAgY19zdGF0ZTpmYWlyeWd1aS5Db250cm9sbGVyO1xuICAgIGl0ZW1fMDpDcGFJdGVtO1xuICAgIGl0ZW1fMTpDcGFJdGVtO1xuICAgIGl0ZW1fMjpDcGFJdGVtO1xuICAgIGl0ZW1fMzpDcGFJdGVtO1xuICAgIHQwOmZhaXJ5Z3VpLlRyYW5zaXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxuXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRWaWV3KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyKCBcImNfc3RhdGVcIiApO1xuICAgICAgICB0aGlzLnQwID0gdGhpcy5nZXRUcmFuc2l0aW9uKCBcInQwXCIgKTtcbiAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLnm5HlkKzkupLmjqjkuovku7YtLS1CYW9rdWFuR2FtZTBcIik7XG4gICAgICAgIHRoaXMuQWRkRXZlbnREYXRhKCBDcGFFdmVudC5ZUUhvbWVEYXRhLHRoaXMsdGhpcy55cWhvbWVkYXRhSGFuZGxlciApO1xuICAgIH1cblxuICAgIHByaXZhdGUgeXFob21lZGF0YUhhbmRsZXIoKTp2b2lkXG4gICAge1xuICAgICAgICBjb25zb2xlLmxvZyhcIuebkeWQrOS6kuaOqOS6i+S7ti0tLUJhb2t1YW5HYW1lMVwiKTtcbiAgICAgICAgdGhpcy5SZWZyZXNoQktZWCgpO1xuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl9pc3RhcnQgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl90aW1lICs9IGR0O1xuICAgICAgICAgICAgaWYoIHRoaXMuX3RpbWUgPj0gNTAwMCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGltZSA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5SZWZyZXNoQktZWCggdHJ1ZSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAga2V5ID0gMDtcbiAgICBwcml2YXRlIF9pc3RhcnQ6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIFJlZnJlc2hCS1lYKCBpc2FubW86Ym9vbGVhbiA9IGZhbHNlICkgIFxuICAgIHtcbiAgICAgICAgaWYgKCFQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnJlY29tbWVuZCkgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuebkeWQrOS6kuaOqOS6i+S7ti0tLUJhb2t1YW5HYW1lMlwiKTtcbiAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAxO1xuICAgICAgICB2YXIgZGF0YXMgPSBSZWNvbW1lbmQuY2Fpbml4aWh1YW5EYXRhO1xuICAgICAgICB2YXIgaXRlbTpDcGFJdGVtO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmtleSArIGkgPj0gZGF0YXMubGVuZ3RoIC0gMSkgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmtleSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY3VyZGF0YSA9IGRhdGFzW3RoaXMua2V5ICsgaV07ICBcbiAgICAgICAgICAgIGl0ZW0gPSB0aGlzW1wiaXRlbV9cIitpXTtcbiAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIGN1cmRhdGEsdHJ1ZSApO1xuICAgICAgICAgICAgaWYgKGN1cmRhdGEgPT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleSArPSA0O1xuICAgICAgICBpZiAodGhpcy5rZXkgPj0gZGF0YXMubGVuZ3RoIC0gMSkgIHtcbiAgICAgICAgICAgIHRoaXMua2V5ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc3RhcnQgPSB0cnVlO1xuICAgICAgICBpZiggaXNhbm1vIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy50MC5wbGF5KCBudWxsLDEgKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcbmltcG9ydCBDcGFJdGVtIGZyb20gXCIuL0NwYUl0ZW1cIjtcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcbmltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQgeyBHYW1lU3RhdGUgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XG5pbXBvcnQgeyBDb21wbGV0ZVBhbmVsIH0gZnJvbSBcIi4uL1ZpZXcvQ29tcGxldGVQYW5lbFwiO1xuaW1wb3J0IHsgUm9sZURhdGEgfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hvdXRpUGFuVmlldyBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2wgaW1wbGVtZW50cyBUaW1lckNvbnRyb2xcbntcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQ2hvdXRpUGFuVmlld1wiO1xuICAgIGJ0bl9yZXR1cm46ZmFpcnlndWkuR0J1dHRvbjtcbiAgICBsaXN0XzA6ZmFpcnlndWkuR0xpc3Q7XG4gICAgbGlzdF8xOmZhaXJ5Z3VpLkdMaXN0O1xuICAgIGJ0bl9qaXh1Z2FtZTpmYWlyeWd1aS5HQnV0dG9uO1xuICAgIHByaXZhdGUgX25vd0xpc3QwOlJlY29tbWVuZEl0ZW1bXTtcbiAgICBwcml2YXRlIF9ub3dMaXN0MTpSZWNvbW1lbmRJdGVtW107XG4gICAgcHJpdmF0ZSBfaXNTdGFydDpib29sZWFuO1xuICAgIHByaXZhdGUgX2lzY2FubW92ZTpib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaXNkb3duOmJvb2xlYW47XG4gICAgXG5cbiAgICBwcml2YXRlIGlzZW5kOm51bWJlciA9IDA7XG5cbiAgICBjb25zdHJ1Y3RvcihlbmQ/KSBcbiAgICB7IFxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJjaG91dGlwYW5WaWV3XCIgKTsgXG4gICAgICAgIHRoaXMuaXNlbmQgPSBlbmQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xuICAgICAgICB0aGlzLmxpc3RfMC5pdGVtUmVuZGVyZXIgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKCB0aGlzLHRoaXMuaXRlbXJlbmRlcmxpc3QsbnVsbCxmYWxzZSApO1xuICAgICAgICB0aGlzLmxpc3RfMS5zZXRWaXJ0dWFsKCk7XG4gICAgICAgIHRoaXMubGlzdF8xLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdDEsbnVsbCxmYWxzZSApO1xuXG4gICAgICAgIHRoaXMuX25vd0xpc3QwID0gUmVjb21tZW5kLmdkeXhEYXRhO1xuICAgICAgICB0aGlzLl9ub3dMaXN0MSA9IFJlY29tbWVuZC5nZHl4RGF0YTtcbiAgICAgICAgdGhpcy5saXN0XzAubnVtSXRlbXMgPSB0aGlzLl9ub3dMaXN0MC5sZW5ndGg7XG4gICAgICAgIHRoaXMubGlzdF8xLm51bUl0ZW1zID0gdGhpcy5fbm93TGlzdDEubGVuZ3RoO1xuICAgICAgICB0aGlzLl9pc1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl9yZXR1cm4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl9qaXh1Z2FtZSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmNsb3NlZnVuICk7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8xLExheWEuRXZlbnQuTU9VU0VfRE9XTix0aGlzLHRoaXMuZG93bmNsaWNrICk7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8xLExheWEuRXZlbnQuTU9VU0VfVVAsdGhpcyx0aGlzLnVwY2xpY2sgKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzEsTGF5YS5FdmVudC5NT1VTRV9PVVQsdGhpcyx0aGlzLnVwY2xpY2sgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGl0ZW1yZW5kZXJsaXN0KCBpbmRleDpudW1iZXIsaXRlbTpDcGFJdGVtICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIGluZGV4IDwgdGhpcy5fbm93TGlzdDAubGVuZ3RoIClcbiAgICAgICAge1xuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93TGlzdDBbaW5kZXhdICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGl0ZW1yZW5kZXJsaXN0MSggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBpbmRleCA8IHRoaXMuX25vd0xpc3QxLmxlbmd0aCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIHRoaXMuX25vd0xpc3QxW2luZGV4XSApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkb3duY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9pc2Rvd24gPSB0cnVlO1xuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSBmYWxzZTtcbiAgICAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xuICAgIH1cblxuICAgIHByaXZhdGUgdGltZW91dENhbGxiYWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5faXNkb3duIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5faXNkb3duID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IHRoaXMubGlzdF8xLnNjcm9sbFBhbmUucGVyY1k7XG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMDAsdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbW92ZXRpbWU6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIF9mbHVzaHRpbWU6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGRpcjpib29sZWFuID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9ub3d2YWx1ZTpudW1iZXIgPSAwO1xuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl9pc1N0YXJ0IClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIHRoaXMubGlzdF8xLnNjcm9sbFBhbmUgJiYgdGhpcy5fbm93TGlzdDEgJiYgdGhpcy5faXNjYW5tb3ZlIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5kaXIgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgKz0gMC4wMDE7XG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA+PSAxIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSAtPSAwLjAwMTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3ZhbHVlIDw9IDAgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0XzEuc2Nyb2xsUGFuZS5zZXRQZXJjWSggdGhpcy5fbm93dmFsdWUgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25jbG9zZWZ1bigpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLmlzZW5kID09IDEpe1xuICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIENob3V0aVBhblZpZXcgKTtcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5sb3NlICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiggdGhpcy5pc2VuZCA9PSAyKXtcbiAgICAgICAgICAgbGV0IGdvbGQgPSAgUm9sZURhdGEuSW5zdGFuY2UubGV2ZWxjZmcud2luR29sZDtcbiAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoQ2hvdXRpUGFuVmlldyk7XG4gICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZChDb21wbGV0ZVBhbmVsLGdvbGQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggQ2hvdXRpUGFuVmlldyApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXG4gICAge1xuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XG4gICAgICAgIHN1cGVyLmRlc3RvcnkoKTtcbiAgICB9XG4gICAgXG59IiwiaW1wb3J0IHtQYW5lbENoaWxkQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2xcIjtcbmltcG9ydCBDcGFFdmVudCBmcm9tIFwiLi9DcGFFdmVudFwiO1xuaW1wb3J0IHsgUmVjb21tZW5kLCBSZWNvbW1lbmRJdGVtIH0gZnJvbSBcIi4vUmVjb21tZW5kVmlld1wiO1xuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4vQ3BhSXRlbVwiO1xuaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xuLy8gaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi90dGFkXCI7XG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3BhRG93bnNWaWV3IGV4dGVuZHMgUGFuZWxDaGlsZENvbnRyb2wgaW1wbGVtZW50cyBUaW1lckNvbnRyb2xcbntcbiAgICBjX3N0YXRlOmZhaXJ5Z3VpLkNvbnRyb2xsZXI7XG4gICAgbGlzdF8wOmZhaXJ5Z3VpLkdMaXN0O1xuICAgIHByaXZhdGUgX25vd0xpc3Q6UmVjb21tZW5kSXRlbVtdO1xuICAgIHByaXZhdGUgX2lzU3RhcnQ6Ym9vbGVhbjtcbiAgICBwcml2YXRlIF9pc2Nhbm1vdmU6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2lzZG93bjpib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XG5cbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxuICAgIHtcblxuICAgICAgICB0aGlzLmNfc3RhdGUgPSB0aGlzLmdldENvbnRyb2xsZXIoIFwiY19zdGF0ZVwiICk7XG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5pbml0VmlldygpO1xuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xuXG5cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRWaWV3KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xuICAgICAgICB0aGlzLmxpc3RfMC5pdGVtUmVuZGVyZXIgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKCB0aGlzLHRoaXMuaXRlbXJlbmRlcmxpc3QsbnVsbCxmYWxzZSApO1xuICAgICAgICB0aGlzLl9pc1N0YXJ0ID0gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5BZGRFdmVudERhdGEoIENwYUV2ZW50LllRSG9tZURhdGEsdGhpcyx0aGlzLnlxaG9tZWRhdGFIYW5kbGVyICk7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfRE9XTix0aGlzLHRoaXMuZG93bmNsaWNrICk7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfVVAsdGhpcyx0aGlzLnVwY2xpY2sgKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9PVVQsdGhpcyx0aGlzLnVwY2xpY2sgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRvd25jbGljaygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2lzZG93biA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IGZhbHNlO1xuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XG5cbiAgICAgICAgLy8gdHRhZC5DcmVhdGVNb3JlR2FtZUJ0bigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdGltZW91dENhbGxiYWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5faXNkb3duIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5faXNkb3duID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IHRoaXMubGlzdF8wLnNjcm9sbFBhbmUucGVyY1g7XG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMDAsdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbW92ZXRpbWU6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIF9mbHVzaHRpbWU6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGRpcjpib29sZWFuID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9ub3d2YWx1ZTpudW1iZXIgPSAwO1xuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl9pc1N0YXJ0IClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUgJiYgdGhpcy5fbm93TGlzdCAmJiB0aGlzLl9pc2Nhbm1vdmUgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKCB0aGlzLmRpciApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSArPSAwLjAwMTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3ZhbHVlID49IDEgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlIC09IDAuMDAxO1xuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPD0gMCApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RfMC5zY3JvbGxQYW5lLnNldFBlcmNYKCB0aGlzLl9ub3d2YWx1ZSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdCggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBpbmRleCA8IHRoaXMuX25vd0xpc3QubGVuZ3RoIClcbiAgICAgICAge1xuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93TGlzdFtpbmRleF0sdHJ1ZSApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB5cWhvbWVkYXRhSGFuZGxlcigpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcbiAgICAgICAgdGhpcy5fbm93TGlzdCA9IFJlY29tbWVuZC5jYWluaXhpaHVhbkRhdGE7XG4gICAgICAgIHRoaXMubGlzdF8wLm51bUl0ZW1zID0gdGhpcy5fbm93TGlzdC5sZW5ndGg7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuX25vd0xpc3QubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNTdGFydCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IHRydWU7XG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQodGhpcyk7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB9XG5cbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBDcGFFdmVudFxue1xuICAgIHN0YXRpYyBZUUhvbWVEYXRhOnN0cmluZyA9IFwiQ3BhRXZlbnRfWVFIb21lRGF0YVwiO1xufSIsImltcG9ydCB7UGFuZWxDaGlsZENvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQ2hpbGRDb250cm9sXCI7XG5pbXBvcnQgeyBSZWNvbW1lbmRJdGVtLCBSZWNvbW1lbmQgfSBmcm9tIFwiLi9SZWNvbW1lbmRWaWV3XCI7XG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQgQ2hvdXRpUGFuVmlldyBmcm9tIFwiLi9DaG91dGlQYW5WaWV3XCI7XG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcbmltcG9ydCB7IEZZSERfU2RrIH0gZnJvbSBcIi4uL1dYU0RLL0ZZSERfU2RrXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENwYUl0ZW0gZXh0ZW5kcyBQYW5lbENoaWxkQ29udHJvbCBcbntcbiAgICBpbWdfdGlwOmZhaXJ5Z3VpLkdJbWFnZTtcbiAgICBsb2FkX2ljb246ZmFpcnlndWkuR0xvYWRlcjtcbiAgICB0eHRfd29yZDpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgIHR4dF93b3JkMTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgIHByaXZhdGUgX3ZvOlJlY29tbWVuZEl0ZW07XG4gICAgcHJpdmF0ZSBpc3BlbmNob3V0aXBhbjpib29sZWFuID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cbiAgICBcbiAgICBwdWJsaWMgb25Jbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJjYXBJdGVtXCI7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25idG5jbGljayApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25idG5jbGljaygpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl92byApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBkYXRhOlJlY29tbWVuZEl0ZW0gPSB0aGlzLl92bztcbiAgICAgICAgICAgIEZZSERfU2RrLlNob3dIdVR1aUp1bXAoZGF0YSx0aGlzLmlzcGVuY2hvdXRpcGFuKTtcbiAgICAgICAgICAgIC8vIHZhciBhcHBpZCA9IGRhdGEudG9fYXBwaWQ7XG4gICAgICAgICAgICAvLyB2YXIgcGF0aCA9IGRhdGEuanVtcF9wYXRoO1xuICAgICAgICAgICAgLy8gbGV0IHBhcmFtID0ge1wiYXBwSWRcIjphcHBpZC50b1N0cmluZygpLFwicGF0aFwiOnBhdGgudG9TdHJpbmcoKX07XG4gICAgICAgICAgICAvLyBpZihMYXlhLkJyb3dzZXIub25Nb2JpbGUpXG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5uYXZpZ2F0ZVRvTWluaVByb2dyYW0oXG4gICAgICAgICAgICAvLyAgICAge1xuICAgICAgICAgICAgLy8gICAgICAgICBhcHBJZDphcHBpZC50b1N0cmluZygpLFxuICAgICAgICAgICAgLy8gICAgICAgICBwYXRoOnBhdGgudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIC8vICAgICAgICAgc3VjY2VzczpyZXM9PlxuICAgICAgICAgICAgLy8gICAgICAgICB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIui3s+i9rOWIsOa4uOaIj+WkseaIkOWKn1wiLFwiMVwiKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vICAgICAgICAgZmFpbDpyZXM9PlxuICAgICAgICAgICAgLy8gICAgICAgICB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBpZiggdGhpcy5pc3BlbmNob3V0aXBhbiApXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3ICk7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzaG93RGF0YSggZGF0YTpSZWNvbW1lbmRJdGVtLGlzb3BlbmNob3V0aXBhbjpib29sZWFuID0gZmFsc2UgKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmlzcGVuY2hvdXRpcGFuID0gaXNvcGVuY2hvdXRpcGFuO1xuICAgICAgICB0aGlzLl92byA9IGRhdGE7XG4gICAgICAgIGlmKCBkYXRhIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5sb2FkX2ljb24udXJsID0gZGF0YS5pY29uO1xuICAgICAgICAgICAgaWYoIHRoaXMudHh0X3dvcmQgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudHh0X3dvcmQudGV4dCA9IGRhdGEudG9nYW1lX25hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiggdGhpcy5pbWdfdGlwIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltZ190aXAudmlzaWJsZSA9IE1hdGgucmFuZG9tKCkgPiAwLjU/dHJ1ZTpmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCB0aGlzLnR4dF93b3JkMSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy50eHRfd29yZDEudGV4dCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoMjM1NDcwLDE1NjE0MzApLnRvU3RyaW5nKCkgKyBcIuS6uueOqVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH1cbn0iLCJpbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xuaW1wb3J0IENwYUV2ZW50IGZyb20gXCIuL0NwYUV2ZW50XCI7XG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xuXG5leHBvcnQgY2xhc3MgcmVjb21tZW5kUGFuXG57XG4gICAgY29uc3RydWN0b3IoZGF0YTpPYmplY3QpXG4gICAge1xuICAgICAgICB0aGlzLmdhbWVfZmxnID0gZGF0YVtcImdhbWVfZmxnXCJdO1xuICAgICAgICB0aGlzLmdhbWVfaWQgPSBkYXRhW1wiZ2FtZV9pZFwiXTtcbiAgICAgICAgdGhpcy5nYW1lX25hbWUgPSBkYXRhW1wiZ2FtZV9uYW1lXCJdO1xuICAgICAgICB0aGlzLmlkID0gZGF0YVtcImlkXCJdO1xuICAgICAgICB0aGlzLmxvY2F0aW9uX2ZsZyA9IGRhdGFbXCJsb2NhdGlvbl9mbGdcIl07XG4gICAgICAgIHRoaXMubG9jYXRpb25faWQgPSBkYXRhW1wibG9jYXRpb25faWRcIl07XG4gICAgICAgIHRoaXMubG9jYXRpb25fbmFtZSA9IGRhdGFbXCJsb2NhdGlvbl9uYW1lXCJdO1xuICAgICAgICB0aGlzLm1hdHRlcl90eXBlID0gZGF0YVtcIm1hdHRlcl90eXBlXCJdO1xuICAgIH1cbiAgICBnYW1lX2ZsZzpzdHJpbmc7XG4gICAgZ2FtZV9pZDpudW1iZXI7XG4gICAgZ2FtZV9uYW1lOnN0cmluZztcbiAgICBpZDpzdHJpbmc7XG4gICAgbG9jYXRpb25fZmxnOnN0cmluZztcbiAgICBsb2NhdGlvbl9pZDpudW1iZXI7XG4gICAgbG9jYXRpb25fbmFtZTpzdHJpbmc7XG4gICAgbWF0dGVyX3R5cGU6c3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmVjb21tZW5kXG57XG4gICAgY29uc3RydWN0b3IoKVxuICAgIHtcbiAgICAgICAgUmVjb21tZW5kLkluaXREYXRhKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldGRhdGEgPSBmYWxzZTtcbiAgICBzdGF0aWMgSW5pdERhdGEoKVxuICAgIHtcbiAgICAgICAgUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YSA9IFJlY29tbWVuZC5HZXRDYWlOaVhpYUh1YW5EYXRhcygpO1xuICAgICAgICBSZWNvbW1lbmQuamllc3VhbkRhdGEgPSBSZWNvbW1lbmQuR2V0SkllU3VhbkRhdGFzKCk7XG4gICAgICAgIFJlY29tbWVuZC5nZHl4RGF0YSA9IFJlY29tbWVuZC5HZXRHRFlYRGF0YXMoKTtcbiAgICAgICAgUmVjb21tZW5kLmJhb2t1YW55b3V4aURhdGEgPSBSZWNvbW1lbmQuR2V0QmFvS3VhbllvdVhpRGF0YXMoKTtcbiAgICAgICAgUmVjb21tZW5kLm1vcmVEYXRhID0gUmVjb21tZW5kLkdldE1vcmVEYXRhcygpO1xuICAgICAgICBmb3IodmFyIGtleSBpbiBGWUhEX1Nkay5wdXNoRGF0YSlcbiAgICAgICAge1xuICAgICAgICAgICAgUmVjb21tZW5kLnJlY29tbWVuZERpY1tGWUhEX1Nkay5wdXNoRGF0YVtrZXldLmxvY2F0aW9uX2ZsZ10gID0gbmV3IHJlY29tbWVuZFBhbihGWUhEX1Nkay5wdXNoRGF0YVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICBSZWNvbW1lbmQuZ2V0ZGF0YSA9IHRydWU7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIENwYUV2ZW50LllRSG9tZURhdGEgKTtcbiAgICAgICAgY29uc29sZS5sb2coXCLkupLmjqjmlbDmja7liJ3lp4vljJZyZWNvbW1lbmQtLS0tLS0tLS0tLS0tLVwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVjb21tZW5kRGljID0ge307XG4gICAgc3RhdGljIGNhaW5peGlodWFuRGF0YTpSZWNvbW1lbmRJdGVtW10gPSBbXTtcbiAgICBzdGF0aWMgYmFva3VhbnlvdXhpRGF0YTpSZWNvbW1lbmRJdGVtW10gPSBbXTtcbiAgICBzdGF0aWMgZ2R5eERhdGE6UmVjb21tZW5kSXRlbVtdID0gW107XG4gICAgc3RhdGljIGppZXN1YW5EYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xuICAgIHN0YXRpYyBtb3JlRGF0YTpSZWNvbW1lbmRJdGVtW10gPSBbXTtcblxuXG4gICAgc3RhdGljIEdldFNTRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cbiAgICB7XG4gICAgICAgIHZhciBpdGVtczpSZWNvbW1lbmRJdGVtW10gPSBbXTtcbiAgICAgICAgaWYoIUZZSERfU2RrLnB1c2hEYXRhKXJldHVybiBpdGVtcztcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgRllIRF9TZGsucHVzaERhdGEubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShGWUhEX1Nkay5wdXNoRGF0YVtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBzdGF0aWMgR2V0Q2FpTmlYaWFIdWFuRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cbiAgICB7XG4gICAgICAgIHZhciBpdGVtczpSZWNvbW1lbmRJdGVtW10gPSBbXTtcbiAgICAgICAgaWYoIUZZSERfU2RrLnB1c2hEYXRhKXJldHVybiBpdGVtcztcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgRllIRF9TZGsucHVzaERhdGEubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShGWUhEX1Nkay5wdXNoRGF0YVtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG4gICAgc3RhdGljIEdldE1vcmVEYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxuICAgIHtcbiAgICAgICAgdmFyIGl0ZW1zOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xuICAgICAgICBpZighRllIRF9TZGsucHVzaERhdGEpcmV0dXJuIGl0ZW1zO1xuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBGWUhEX1Nkay5wdXNoRGF0YS5sZW5ndGg7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKEZZSERfU2RrLnB1c2hEYXRhW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHN0YXRpYyBHZXRCYW9LdWFuWW91WGlEYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxuICAgIHtcbiAgICAgICAgdmFyIGl0ZW1zOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xuICAgICAgICBpZighRllIRF9TZGsucHVzaERhdGEpcmV0dXJuIGl0ZW1zO1xuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBGWUhEX1Nkay5wdXNoRGF0YS5sZW5ndGg7aSsrKVxuICAgICAgICB7IFxuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShGWUhEX1Nkay5wdXNoRGF0YVtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBzdGF0aWMgR2V0SkllU3VhbkRhdGFzKCk6UmVjb21tZW5kSXRlbVtdXG4gICAge1xuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XG4gICAgICAgIGlmKCFGWUhEX1Nkay5wdXNoRGF0YSlyZXR1cm4gaXRlbXM7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IEZZSERfU2RrLnB1c2hEYXRhLmxlbmd0aDtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3IFJlY29tbWVuZEl0ZW0oRllIRF9TZGsucHVzaERhdGFbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgc3RhdGljIEdldEdEWVhEYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxuICAgIHtcbiAgICAgICAgdmFyIGl0ZW1zOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xuICAgICAgICBpZighRllIRF9TZGsucHVzaERhdGEpcmV0dXJuIGl0ZW1zO1xuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBGWUhEX1Nkay5wdXNoRGF0YS5sZW5ndGg7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKEZZSERfU2RrLnB1c2hEYXRhW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlY29tbWVuZEl0ZW1cbntcbiAgICBjb25zdHJ1Y3RvcihEYXRhOk9iamVjdClcbiAgICB7XG4gICAgICAgIHRoaXMuaWNvbiA9IERhdGFbXCJpY29uXCJdO1xuICAgICAgICB0aGlzLnRvX2FwcGlkID0gRGF0YVtcInRvX2FwcGlkXCJdO1xuICAgICAgICB0aGlzLnRvZ2FtZV9uYW1lID0gRGF0YVtcInRvZ2FtZV9uYW1lXCJdO1xuICAgICAgICB0aGlzLmp1bXBfcGF0aCA9IERhdGFbXCJqdW1wX3BhdGhcIl07XG4gICAgICAgIHRoaXMuanVtcF90eXBlID0gRGF0YVtcImp1bXBfdHlwZVwiXTtcbiAgICAgICAgdGhpcy5wYW5lbCA9IERhdGFbXCJwYW5lbFwiXTtcbiAgICAgICAgdGhpcy5xcmNvZGUgPSBEYXRhW1wicXJjb2RlXCJdO1xuICAgIH1cbiAgICBpY29uOnN0cmluZztcbiAgICB0b19hcHBpZDpzdHJpbmc7XG4gICAgdG9nYW1lX25hbWU6c3RyaW5nO1xuICAgIGp1bXBfcGF0aDpzdHJpbmc7XG4gICAganVtcF90eXBlOm51bWJlcjtcbiAgICBwYW5lbDpudW1iZXI7XG4gICAgcXJjb2RlOnN0cmluZztcbn1cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWNvbW1lbmRWaWV3XG57XG4gICAgXG4gICAgY29uc3RydWN0b3IoKSB7IFxuICAgICAgICBcbiAgICAgfVxufSIsImltcG9ydCB7UGFuZWxDaGlsZENvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQ2hpbGRDb250cm9sXCI7XG5pbXBvcnQgeyBSZWNvbW1lbmRJdGVtLCBSZWNvbW1lbmQgfSBmcm9tIFwiLi9SZWNvbW1lbmRWaWV3XCI7XG5pbXBvcnQgQ3BhSXRlbSBmcm9tIFwiLi9DcGFJdGVtXCI7XG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XG4vLyBpbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL3R0YWRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hpd2FudHVpamlhblZpZXcgZXh0ZW5kcyBQYW5lbENoaWxkQ29udHJvbCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxue1xuICAgIFxuICAgIGxpc3RfMDpmYWlyeWd1aS5HTGlzdDtcbiAgICBwcml2YXRlIF9ub3dsaXN0OlJlY29tbWVuZEl0ZW1bXTtcbiAgICBwcml2YXRlIF9pc1N0YXJ0OmJvb2xlYW47XG4gICAgcHJpdmF0ZSBfaXNjYW5tb3ZlOmJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIF9pc2Rvd246Ym9vbGVhbjtcbiAgICBjb25zdHJ1Y3RvcigpIFxuICAgIHsgXG4gICAgICAgIHN1cGVyKCk7IFxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0VmlldygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubGlzdF8wLnNldFZpcnR1YWwoKTtcbiAgICAgICAgdGhpcy5saXN0XzAuaXRlbVJlbmRlcmVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSggdGhpcyx0aGlzLml0ZW1yZW5kZXJsaXN0LG51bGwsZmFsc2UgKTtcbiAgICAgICAgdGhpcy5fbm93bGlzdCA9IFJlY29tbWVuZC5qaWVzdWFuRGF0YTtcbiAgICAgICAgaWYoIHRoaXMuX25vd2xpc3QubGVuZ3RoID4gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubGlzdF8wLm51bUl0ZW1zID0gdGhpcy5fbm93bGlzdC5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgdGhpcy5fbm93bGlzdC5sZW5ndGg7aSsrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5faXNTdGFydCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfRE9XTix0aGlzLHRoaXMuZG93bmNsaWNrICk7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfVVAsdGhpcyx0aGlzLnVwY2xpY2sgKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9PVVQsdGhpcyx0aGlzLnVwY2xpY2sgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRvd25jbGljaygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2lzZG93biA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IGZhbHNlO1xuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XG5cbiAgICAgICAgLy8gdHRhZC5DcmVhdGVNb3JlR2FtZUJ0bigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdGltZW91dENhbGxiYWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5faXNkb3duIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5faXNkb3duID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IHRoaXMubGlzdF8wLnNjcm9sbFBhbmUucGVyY1k7XG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMDAsdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdCggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBpbmRleCA8IHRoaXMuX25vd2xpc3QubGVuZ3RoIClcbiAgICAgICAge1xuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93bGlzdFtpbmRleF0sdHJ1ZSApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbW92ZXRpbWU6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIF9mbHVzaHRpbWU6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGRpcjpib29sZWFuID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9ub3d2YWx1ZTpudW1iZXIgPSAwO1xuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl9pc1N0YXJ0IClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUgJiYgdGhpcy5fbm93bGlzdCAmJiB0aGlzLl9ub3dsaXN0Lmxlbmd0aCA+IDAgJiYgdGhpcy5faXNjYW5tb3ZlIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5kaXIgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgKz0gMC4wMDE7XG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA+PSAxIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSAtPSAwLjAwMTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3ZhbHVlIDw9IDAgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0XzAuc2Nyb2xsUGFuZS5zZXRQZXJjWSggdGhpcy5fbm93dmFsdWUgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gZmFsc2U7XG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBcbn0iLCJpbXBvcnQgQ3BhSXRlbSBmcm9tIFwiLi9DcGFJdGVtXCI7XG5pbXBvcnQgeyBSZWNvbW1lbmRJdGVtLCBSZWNvbW1lbmQgfSBmcm9tIFwiLi9SZWNvbW1lbmRWaWV3XCI7XG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQgeyBQYW5lbEJhc2VDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHVpamlhblZpZXcgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sIFxue1xuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJUdWlqaWFuVmlld1wiO1xuICAgIGJ0bl9jbG9zZTpmYWlyeWd1aS5HTG9hZGVyO1xuICAgIGxpc3RfMTpmYWlyeWd1aS5HTGlzdDtcbiAgICBsaXN0XzI6ZmFpcnlndWkuR0xpc3Q7XG4gICAgcHJpdmF0ZSBfbm93bGlzdDE6UmVjb21tZW5kSXRlbVtdO1xuICAgIHByaXZhdGUgX25vd2xpc3QyOlJlY29tbWVuZEl0ZW1bXTtcbiAgICBwcml2YXRlIG1vcmU6ZmFpcnlndWkuR0xvYWRlcjtcblxuICAgIGNvbnN0cnVjdG9yKCkgXG4gICAgeyBcbiAgICAgICAgc3VwZXIoIFwibWFpblwiLFwidHVpamlhblZpZXdcIiApOyBcbiAgICB9XG4gICAgXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5saXN0XzEuc2V0VmlydHVhbCgpO1xuICAgICAgICB0aGlzLmxpc3RfMS5pdGVtUmVuZGVyZXIgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKCB0aGlzLHRoaXMuaXRlbXJlbmRlcmxpc3QxLG51bGwsZmFsc2UgKTtcbiAgICAgICAgdGhpcy5saXN0XzIuc2V0VmlydHVhbCgpO1xuICAgICAgICB0aGlzLmxpc3RfMi5pdGVtUmVuZGVyZXIgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdDIsbnVsbCxmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5fbm93bGlzdDEgPSBSZWNvbW1lbmQuZ2R5eERhdGE7XG4gICAgICAgIHRoaXMuX25vd2xpc3QyID0gUmVjb21tZW5kLmdkeXhEYXRhO1xuICAgICAgICB0aGlzLmxpc3RfMS5udW1JdGVtcyA9IDc7XG4gICAgICAgIHRoaXMubGlzdF8yLm51bUl0ZW1zID0gdGhpcy5fbm93bGlzdDIubGVuZ3RoO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl9jbG9zZSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmNsb3NlZnVuICk7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubW9yZSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5KdW1wQXBwICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdDEoIGluZGV4Om51bWJlcixpdGVtOkNwYUl0ZW0gKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggaW5kZXggPCA3IClcbiAgICAgICAge1xuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93bGlzdDFbaW5kZXhdICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdDIoIGluZGV4Om51bWJlcixpdGVtOkNwYUl0ZW0gKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggaW5kZXggPCB0aGlzLl9ub3dsaXN0Mi5sZW5ndGggKVxuICAgICAgICB7XG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dsaXN0MltpbmRleF0gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25jbG9zZWZ1bigpOnZvaWRcbiAgICB7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBUdWlqaWFuVmlldyApO1xuICAgIH1cblxuICAgIC8v6ZqP5py66Lez6L2s5ri45oiPXG4gICAgcHJpdmF0ZSBKdW1wQXBwKCk6dm9pZHtcbiAgICAgICAgbGV0IHJhbiA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoMCx0aGlzLl9ub3dsaXN0MS5sZW5ndGgtMSk7XG4gICAgICAgIEZZSERfU2RrLlNob3dIdVR1aUp1bXAodGhpcy5fbm93bGlzdDFbcmFuXSxmYWxzZSk7XG4gICAgfVxufSIsImV4cG9ydCBjbGFzcyBUaW1lVXRpbHMge1xuXG4gICAgLyoqXG4gICAgICog5pyIL+aXpSDlsI/ml7Y65YiG6ZKfXG4gICAgICogQHBhcmFtIHZhbHVlIFxuICAgICAqL1xuICAgIHN0YXRpYyAgZm9ybWF0RGF0YSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSAqIDEwMDApO1xuICAgICAgICBzdHIgPSB0aGlzLmdldFR3byhkYXRlLmdldE1vbnRoKCkgKyAxKSArIFwiL1wiICsgdGhpcy5nZXRUd28oZGF0ZS5nZXREYXRlKCkpICsgXCIgXCIgKyB0aGlzLmdldFR3byhkYXRlLmdldEhvdXJzKCkpICsgXCI6XCIgKyB0aGlzLmdldFR3byhkYXRlLmdldE1pbnV0ZXMoKSk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pyIL+aXpVxuICAgICAqIEBwYXJhbSB2YWx1ZSBcbiAgICAgKi9cbiAgICBzdGF0aWMgIGZvcm1hdERhdGExKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XG4gICAgICAgIHN0ciA9IChkYXRlLmdldE1vbnRoKCkgKyAxKSArIFwi5pyIXCIgKyBkYXRlLmdldERhdGUoKSArIFwi5pelXCI7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5bm05pyI5pelXG4gICAgICogQHBhcmFtIHZhbHVlIFxuICAgICAqL1xuICAgIHN0YXRpYyAgZm9ybWF0WWVhck1vbnRoRGF0ZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSAqIDEwMDApO1xuICAgICAgICBzdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIi5cIiArIChkYXRlLmdldE1vbnRoKCkgKyAxKSArIFwiLlwiICsgZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5bm0LeaciC3ml6VcbiAgICAgKiBAcGFyYW0gdmFsdWUgXG4gICAgICovXG4gICAgc3RhdGljICBmb3JtYXRZZWFyTW9udGhEYXRlMSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSAqIDEwMDApO1xuICAgICAgICB2YXIgbW9udGg6IHN0cmluZyA9IChkYXRlLmdldE1vbnRoKCkgKyAxKSA+PSAxMCA/IChkYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpIDogXCIwXCIgKyAoZGF0ZS5nZXRNb250aCgpICsgMSk7XG4gICAgICAgIHZhciBkYXRlczogc3RyaW5nID0gZGF0ZS5nZXREYXRlKCkgPj0gMTAgPyBkYXRlLmdldERhdGUoKS50b1N0cmluZygpIDogXCIwXCIgKyBkYXRlLmdldERhdGUoKTtcbiAgICAgICAgc3RyID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCItXCIgKyBtb250aCArIFwiLVwiICsgZGF0ZXM7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgIExYYW5kSlhUaW1lVHlwZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgc3RyID0gXCIw56eSXCI7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCA2MCkge1xuICAgICAgICAgICAgc3RyID0gTWF0aC5mbG9vcih2YWx1ZSkgKyBcIuenklwiO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgNjAgKiA2MCkge1xuICAgICAgICAgICAgc3RyID0gTWF0aC5mbG9vcih2YWx1ZSAvIDYwKSArIFwi5YiG6ZKfXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaG91cjogbnVtYmVyO1xuICAgICAgICAgICAgaG91ciA9IE1hdGguZmxvb3IodmFsdWUgLyA2MCAvIDYwKTtcbiAgICAgICAgICAgIHN0ciA9IGhvdXIgKyBcIuWwj+aXtlwiO1xuICAgICAgICAgICAgc3RyICs9IE1hdGguZmxvb3IoKHZhbHVlIC0gaG91ciAqIDYwICogNjApIC8gNjApICsgXCLliIbpkp9cIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOagvOW8j+WMluaXtumXtFxuICAgICAqIEBwYXJhbSB0aW1lIOenklxuICAgICAqIEByZXR1cm4g6L+U5ZueMjQ6NTk6NTlcbiAgICAgKi9cbiAgICBzdGF0aWMgIGZvcm1hdFRpbWUodGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyAzNjAwKTtcbiAgICAgICAgaWYoIGhvdXJzID4gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHN0ciArPSBob3VycyA+PSAxMCA/IChob3VycyArIFwiOlwiKSA6IChcIjBcIiArIGhvdXJzICsgXCI6XCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgMzYwMCkgLyA2MCk7XG4gICAgICAgIHN0ciArPSBtaW51dGVzID49IDEwID8gKG1pbnV0ZXMgKyBcIjpcIikgOiAoXCIwXCIgKyBtaW51dGVzICsgXCI6XCIpO1xuICAgICAgICB2YXIgc2Vjb25kOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSA2MCk7XG4gICAgICAgIHN0ciArPSBzZWNvbmQgPj0gMTAgPyAoc2Vjb25kICsgXCJcIikgOiAoXCIwXCIgKyBzZWNvbmQpO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOagvOW8j+WMluaXtumXtFxuICAgICAqIEBwYXJhbSB0aW1lIOenklxuICAgICAqIEByZXR1cm4g6L+U5ZueMjTlsI/ml7Y1OeWIhjU556eSIFxuICAgICAqL1xuICAgIHN0YXRpYyAgZm9ybWF0VGltZTEodGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyAzNjAwKTtcbiAgICAgICAgaWYoIGhvdXJzID4gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHN0ciArPSBob3VycyArIFwi5bCP5pe2XCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSAzNjAwKSAvIDYwKTtcbiAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhumSn1wiO1xuICAgICAgICB2YXIgc2Vjb25kOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSA2MCk7XG4gICAgICAgIHN0ciArPSBzZWNvbmQgKyBcIuenklwiO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOagvOW8j+WMluaXtumXtFxuICAgICAqIEBwYXJhbSB0aW1lIOenklxuICAgICAqIEByZXR1cm4g6L+U5ZueMeWwj+aXtjI05YiGMTDnp5JcbiAgICAgKi9cbiAgICBzdGF0aWMgIGZvcm1hdFRpbWU1KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XG4gICAgICAgIGlmKCBob3VycyA+IDAgKVxuICAgICAgICB7XG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgMzYwMCkgLyA2MCk7XG4gICAgICAgIGlmKG1pbnV0ZXM+MClcbiAgICAgICAge1xuICAgICAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhlwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIDYwKTtcbiAgICAgICAgc3RyICs9IHNlY29uZCArIFwi56eSXCI7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5qC85byP5YyW5pe26Ze0XG4gICAgICogQHBhcmFtIHRpbWUg56eSXG4gICAgICogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhjU556eSXG4gICAgICovXG4gICAgc3RhdGljICBmb3JtYXRUaW1lMih0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgZGF5OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyA4NjQwMCk7XG4gICAgICAgIGlmKGRheT4wKXtcbiAgICAgICAgICAgIHN0ciArPSBkYXkgKyBcIuWkqVwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XG4gICAgICAgIGlmKGhvdXJzPjApe1xuICAgICAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDM2MDApIC8gNjApO1xuICAgICAgICBpZihtaW51dGVzPjApe1xuICAgICAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhumSn1wiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IE1hdGguY2VpbCh0aW1lICUgNjApO1xuICAgICAgICBzdHIgKz0gc2Vjb25kICsgXCLnp5JcIjtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmoLzlvI/ljJbml7bpl7RcbiAgICAgKiBAcGFyYW0gdGltZSDnp5JcbiAgICAgKiBAcmV0dXJuIOi/lOWbnjHlpKkyNOWwj+aXtu+8iCDlj6rkv53nlZnkuKTkuKog77yJXG4gICAgICovXG4gICAgc3RhdGljICBmb3JtYXRUaW1lNih0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcbiAgICAgICAgdmFyIGRheTogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gODY0MDApO1xuICAgICAgICBpZiAoZGF5PjApe1xuICAgICAgICAgICAgc3RyICs9IGRheSArIFwi5aSpXCI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDg2NDAwKSAvIDM2MDApO1xuICAgICAgICBpZiAoaG91cnM+MCl7XG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPCAyKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDM2MDApIC8gNjApO1xuICAgICAgICAgICAgaWYobWludXRlcz4wKXtcbiAgICAgICAgICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiGXCI7XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPCAyKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgc2Vjb25kOiBudW1iZXIgPSBNYXRoLmNlaWwodGltZSAlIDYwKTtcbiAgICAgICAgICAgIHN0ciArPSBzZWNvbmQgKyBcIuenklwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqXG4gKiDmoLzlvI/ljJbml7bpl7RcbiAqIEBwYXJhbSB0aW1lIOenklxuICogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhlxuICovXG5zdGF0aWMgIGZvcm1hdFRpbWUzKHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHZhciBkYXk6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDg2NDAwKTtcbiAgICAgICAgc3RyICs9IGRheSArIFwi5aSpXCI7XG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgODY0MDAgLyAzNjAwKTtcbiAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcblxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDg2NDAwICUgMzYwMCkgLyA2MCk7XG4gICAgICAgIHN0ciArPSBtaW51dGVzICsgXCLliIZcIjtcblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKlxuKiDmoLzlvI/ljJbml7bpl7RcbiogQHBhcmFtIHRpbWUg56eSXG4qIEByZXR1cm4g6L+U5ZueMeWkqTI05bCP5pe2NTnliIZcbiovXG5zdGF0aWMgIGZvcm1hdFRpbWU0KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIGlmICh0aW1lID4gODY0MDApIHtcbiAgICAgICAgICAgIHZhciBkYXk6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDg2NDAwKTtcbiAgICAgICAgICAgIHN0ciArPSBkYXkgKyBcIuWkqVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lID4gMzYwMCkge1xuICAgICAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSA4NjQwMCAvIDM2MDApO1xuICAgICAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZSA+IDYwKSB7XG4gICAgICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDg2NDAwICUgMzYwMCkgLyA2MCk7XG4gICAgICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiG6ZKfXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgICAgICAvKipcbiog5qC85byP5YyW5pe26Ze0XG4qIEBwYXJhbSB0aW1lIOenklxuKiBAcmV0dXJuIOi/lOWbnjHlpKkyNOWwj+aXtjU55YiGXG4qL1xuc3RhdGljICBmb3JtYXRUaW1lNEFycih0aW1lOiBudW1iZXIpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgdmFyIGFyclRpbWU6QXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICAvLyBpZiAodGltZSA+PSA4NjQwMCkge1xuICAgICAgICAvLyAgICAgdmFyIGRheTogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gODY0MDApO1xuICAgICAgICAvLyAgICAgYXJyVGltZS51bnNoaWZ0KFN0cmluZyhkYXkpKTtcbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAodGltZSA+PSAzNjAwKSB7XG4gICAgICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIDg2NDAwIC8gMzYwMCk7XG4gICAgICAgICAgICBhcnJUaW1lLnVuc2hpZnQoU3RyaW5nKGhvdXJzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWUgPj0gNjApIHtcbiAgICAgICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgODY0MDAgJSAzNjAwKSAvIDYwKTtcbiAgICAgICAgICAgIGFyclRpbWUudW5zaGlmdChTdHJpbmcobWludXRlcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFyclRpbWU7XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgIGdldFR3byh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICBzdHIgPSBcIjBcIiArIHN0cjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaXpeacn+i9rOaXtumXtOaIs1xuICAgICAqIEBwYXJhbSBzdHIgMjAxOC0xLTEgXG4gICAgICovXG4gICAgc3RhdGljICBkYXRldG9UaW1lKHN0cjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIERhdGUucGFyc2Uoc3RyKSAvIDEwMDA7XG4gICAgfVxufSIsImltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBjbGFzcyBUaW1lclNlcnZpY2UgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxue1xuICAgIHByaXZhdGUgc3RhdGljIGluczpUaW1lclNlcnZpY2U7XG4gICAgcHJpdmF0ZSBfdGltZVNjYWxlOm51bWJlciA9IDE7XG5cbiAgICBwcml2YXRlIF91bnNjYWxhYmxlTGlzdDpBcnJheTxUaW1lckNvbnRyb2w+ID0gW107XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgVGltZXJTZXJ2aWNlLmlucyA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpUaW1lclNlcnZpY2VcbiAgICB7XG4gICAgICAgIGlmKCBUaW1lclNlcnZpY2UuaW5zID09IG51bGwgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVyU2VydmljZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaW1lclNlcnZpY2UuaW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoIDEsIHRoaXMsIHRoaXMub25UaW1lciApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICBcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcCgpOnZvaWRcbiAgICB7XG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsIHRoaXMub25UaW1lciApO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWNvdmVyKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIExheWEudGltZXIuZnJhbWVMb29wKCAxLCB0aGlzLCB0aGlzLm9uVGltZXIgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGltZXIoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xuICAgICAgICBmb3IoaT0wOyBpPHRoaXMuX3Vuc2NhbGFibGVMaXN0Lmxlbmd0aDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl91bnNjYWxhYmxlTGlzdFtpXS51cGRhdGUoTGF5YS50aW1lci5kZWx0YSAqIHRoaXMuX3RpbWVTY2FsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzVXBkYXRhVGFyZ2V0KCB1cGRhdGVUYXJnZXQ6VGltZXJDb250cm9sICk6Qm9vbGVhblxuICAgIHtcbiAgICAgICAgdmFyIGluZGV4Om51bWJlcjtcbiAgICAgICAgaW5kZXggPSB0aGlzLl91bnNjYWxhYmxlTGlzdC5pbmRleE9mKHVwZGF0ZVRhcmdldCk7XG4gICAgICAgIGlmKCBpbmRleCAhPSAtMSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkVXBkYXRlVGFyZ2V0KHVwZGF0ZVRhcmdldDpUaW1lckNvbnRyb2wpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciBpbmRleDpudW1iZXI7XG4gICAgICAgIGluZGV4ID0gdGhpcy5fdW5zY2FsYWJsZUxpc3QuaW5kZXhPZih1cGRhdGVUYXJnZXQpO1xuICAgICAgICBpZihpbmRleD09LTEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3Vuc2NhbGFibGVMaXN0LnB1c2godXBkYXRlVGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVVcGRhdGVUYXJnZXQodXBkYXRlVGFyZ2V0OlRpbWVyQ29udHJvbCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGluZGV4Om51bWJlciA9IHRoaXMuX3Vuc2NhbGFibGVMaXN0LmluZGV4T2YodXBkYXRlVGFyZ2V0KTtcbiAgICAgICAgaWYoaW5kZXghPS0xKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl91bnNjYWxhYmxlTGlzdC5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRpbWVTY2FsZSgpOm51bWJlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVTY2FsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHRpbWVTY2FsZSh2YWx1ZTpudW1iZXIpXG4gICAge1xuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IGlzTmFOKHZhbHVlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFsdWUgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RpbWVTY2FsZSA9IHZhbHVlO1xuICAgIH1cbn0iLCJpbXBvcnQge1VzZXJEYXRhSW5mb30gZnJvbSBcIi4uL0RhdGEvVXNlckRhdGFJbmZvXCI7XG5pbXBvcnQge0xvY2FsRGF0YUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0xvY2FsRGF0YUNvbnRyb2xcIjtcbmltcG9ydCB7cGluZ3RhaXV0aWxzfSBmcm9tIFwiLi4vV1hTREsvcGluZ3RhaXV0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBUaW1lc1RhbXBlciBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxue1xuXHRwdWJsaWMgbGFzdGdhbWVUaW1lOm51bWJlciA9IDA7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcigpIFxuXHR7XG5cblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIGluczogVGltZXNUYW1wZXI7XG5cblx0cHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogVGltZXNUYW1wZXIge1xuICAgICAgICBpZiAoVGltZXNUYW1wZXIuaW5zID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGltZXNUYW1wZXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVGltZXNUYW1wZXIuaW5zO1xuICAgIH1cblxuXHRwdWJsaWMgaW5pdCggKTp2b2lkXG5cdHtcblx0XHR0aGlzLmxhc3RnYW1lVGltZSA9IExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuZ2V0bnVtKCBVc2VyRGF0YUluZm8ubGFzdHRpbWUgKTtcblx0XHRMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCB0aGlzLnVwZGF0ZSApO1xuXHR9XG5cblx0LyoqXG5cdCAqIOWQjOatpeacjeWKoeWZqOaXtumXtCjnp5IpXG5cdCAqL1xuXHRwcml2YXRlIF9zZXJ2ZXJUaW1lOiBudW1iZXIgPSAwO1xuXG5cdHByaXZhdGUgaXNjYW46Ym9vbGVhbiA9IGZhbHNlO1xuXHRwcml2YXRlIF9vbmxpbmVkaXN0aW1lOm51bWJlciA9IDA7XG5cdFxuXHRwdWJsaWMgdXBkYXRlU2VydmljZVRpbWUoc2VydmVyVGltZTogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy5fc2VydmVyVGltZSA9IE51bWJlcihzZXJ2ZXJUaW1lKTtcblx0XHR0aGlzLmlzY2FuID0gdHJ1ZTtcblx0XHR0aGlzLl9vbmxpbmVkaXN0aW1lID0gdGhpcy5fc2VydmVyVGltZTtcblx0XHRMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLmxhc3R0aW1lLHRoaXMuX3NlcnZlclRpbWUudG9TdHJpbmcoKSApO1xuXHR9XG5cblx0cHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF9vbmxpbmV0aW1lOm51bWJlciA9IDA7XG5cdHB1YmxpYyB1cGRhdGUoKTogdm9pZCBcblx0e1xuXHRcdGlmKCB0aGlzLmlzY2FuIClcblx0XHR7XG5cdFx0XHR0aGlzLl90aW1lICs9IExheWEudGltZXIuZGVsdGE7XG5cdFx0XHR0aGlzLl9vbmxpbmV0aW1lICs9IExheWEudGltZXIuZGVsdGE7XG5cdFx0XHR0aGlzLl9zZXJ2ZXJUaW1lICs9IExheWEudGltZXIuZGVsdGEgLyAxMDAwO1xuXHRcdFx0aWYoIHRoaXMuX3RpbWUgPj0gMzAwMDAgKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLl90aW1lID0gMDtcblx0XHRcdFx0TG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5hZGRzdHIoIFVzZXJEYXRhSW5mby5sYXN0dGltZSx0aGlzLl9zZXJ2ZXJUaW1lLnRvU3RyaW5nKCkgKTtcblx0XHRcdH1cblx0XHRcdGlmKCB0aGlzLl9vbmxpbmV0aW1lID49IDkwMDAwIClcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5fb25saW5ldGltZSA9IDA7XG5cdFx0XHRcdHRoaXMuc2VuZG9ubGluZVRvbmdqaSgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZW5kb25saW5lVG9uZ2ppKCk6dm9pZFxuXHR7XG5cdFx0dmFyIGRpc3RpbWU6bnVtYmVyID0gdGhpcy5zZXJ2ZXJUaW1lIC0gdGhpcy5fb25saW5lZGlzdGltZTtcblx0XHRpZiggZGlzdGltZSA+IDAgKVxuXHRcdHtcblx0XHRcdHRoaXMuX29ubGluZWRpc3RpbWUgPSB0aGlzLnNlcnZlclRpbWU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIOacjeWKoeWZqOaXtumXtCAoIOenkiApIFxuXHQgKiBAcmV0dXJuIFxuXHQgKiBcblx0ICovXG5cdHB1YmxpYyBnZXQgc2VydmVyVGltZSgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLl9zZXJ2ZXJUaW1lO1xuXHR9XG5cbn0iLCJpbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcbmltcG9ydCB7Vmlld0FjdGlvbn0gZnJvbSBcIi4uL3V0aWxzL1ZpZXdBY3Rpb25cIjtcbmltcG9ydCB7R2FtZVN0YXRlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvR2FtZVN0YXRlQ29udHJvbFwiO1xuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xuaW1wb3J0IHtBZ2VuY3lJbkdhbWV9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5SW5HYW1lXCI7XG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50LCBBY2NvdW50VXNlciB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XG5pbXBvcnQgeyBQUk9UT0NPTFMsIE5ldHdvcmtNYW5hZ2VyIH0gZnJvbSBcIi4uL1dYU0RLL05ldHdvcmtNYW5hZ2VyXCI7XG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4uL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xuaW1wb3J0IHtHdWFuZ0dhb30gZnJvbSBcIi4uL1dYU0RLL0d1YW5nR2FvXCI7XG5pbXBvcnQgeyBHYW1lU3RhdGUgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vR2FtZS9QbGF5ZXJcIjtcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XG5pbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xuaW1wb3J0IHtDaGFyYWN0ZXJTdGF0ZX0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvQ2hhcmFjdGVyU3RhdGVcIjtcbmltcG9ydCB7IFNoYXJlVXRpbCB9IGZyb20gXCIuLi9XWFNESy9TaGFyZVV0aWxcIjtcbmltcG9ydCB7IFJlY29yZE1hbmFnZXIgfSBmcm9tIFwiLi4vV1hTREsvUmVjb3JkTWFuYWdlclwiO1xuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi9XWFNESy90dGFkXCI7XG4vLyBpbXBvcnQgQ2hvdXRpUGFuVmlldyBmcm9tIFwiLi4vUHVzaC9DaG91dGlQYW5WaWV3XCI7XG5leHBvcnQgY2xhc3MgQ29tcGxldGVQYW5lbCBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2wgXG57XG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkNvbXBsZXRlUGFuZWxcIjtcblxuICAgIEJ0bkJveDpmYWlyeWd1aS5HR3JvdXA7XG4gICAgY19zdGF0ZTpmYWlyeWd1aS5Db250cm9sbGVyO1xuICAgIHR4dF9nb2xkOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgYnRuXzA6ZmFpcnlndWkuR0J1dHRvbjtcbiAgICBidG5fMTpmYWlyeWd1aS5HQnV0dG9uO1xuICAgIHRpbWVudW06ZmFpcnlndWkuR1RleHRGaWVsZDtcbiAgICBUaWFuSmlhQW5pOmZhaXJ5Z3VpLlRyYW5zaXRpb247XG4gICAgQmF0dGxlQnRuOmZhaXJ5Z3VpLkdCdXR0b247XG5cbiAgICB0aWFuamlhOmZhaXJ5Z3VpLkdMb2FkZXI7XG5cblxuICAgIGdldGdvbGQ6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIF9nYW1lUHJveHk6QWdlbmN5SW5HYW1lO1xuICAgIFxuICAgIGNvbnN0cnVjdG9yKCBnb2xkOm51bWJlciApIFxuICAgIHsgXG4gICAgICAgIHN1cGVyKCBcIm1haW5cIixcImdhbWVyZXN1bHRcIixmYWxzZSxWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZSwxICk7IFxuICAgICAgICB0aGlzLmdldGdvbGQgPSBnb2xkO1xuICAgIH1cbiAgICBcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBsb2FkU2NlbmUoKTp2b2lkIHtcblx0XHRMYXlhLlNjZW5lM0QubG9hZChcInJlcy90aHJlZURpbWVuL3NjZW5lL1BhcnRpY2xlU2NlbmUvRXhhbXBsZV8wMS5sc1wiLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIGZ1bmN0aW9uKHNjZW5lOkxheWEuU2NlbmUzRCkge1xuXHRcdFx0dGhpcy5zY2VuZSA9IExheWEuc3RhZ2UuYWRkQ2hpbGRBdChzY2VuZSwgMCk7XG5cdFx0XHR2YXIgY2FtZXJhOkxheWEuQ2FtZXJhID0gdGhpcy5zY2VuZS5hZGRDaGlsZChuZXcgTGF5YS5DYW1lcmEoMCwgMC4xLCAxMDApKTtcblx0XHRcdGNhbWVyYS50cmFuc2Zvcm0udHJhbnNsYXRlKG5ldyBMYXlhLlZlY3RvcjMoMCwgMSwgMCkpO1xuXHRcdH0pKTtcblx0fVxuXHRwcml2YXRlIGdhcmJhZ2VDb2xsZWN0aW9uKCk6dm9pZCB7XG5cdFx0dGhpcy5zY2VuZS5kZXN0cm95KCk7Ly/plIDmr4HlnLrmma9cblx0XHR0aGlzLnNjZW5lID0gbnVsbDtcblx0XHRMYXlhLlJlc291cmNlLmRlc3Ryb3lVbnVzZWRSZXNvdXJjZXMoKTsvL+mUgOavgeaXoOeUqOi1hOa6kCjmsqHmnInooqvlnLrmma/moJHlvJXnlKgs5bm25LiU5rKh5pyJ5Yqg6LWE5rqQ6ZSB55qEKVxuICAgIH1cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbiAgICBwcml2YXRlIGJ0bjFjbGljaygpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCB0aGlzLmdldGdvbGQgKTtcbiAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkxldmVsVXAoICApO1xuICAgICAgICAgICAgdGhpcy5fZ2FtZVByb3h5LnJldHVybm1haW52aWV3KHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPT0gMSlcbiAgICAgICAge1xuICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCB0aGlzLmdldGdvbGQgKTtcbiAgICAgICAgICAgIHRoaXMuX2dhbWVQcm94eS5yZXR1cm5tYWludmlldyggKTtcbiAgICAgICAgICAgIC8vIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ2hvdXRpUGFuVmlldyApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPT0gMil7XG4gICAgICAgICAgICAvLyBTaGFyZVV0aWwuc2hhcmVJbWFnZShcIuWIhuS6q+Wkjea0uy0tLS1cIix0aGlzLnNoYXJlcmV2aXZlLFwiMVwiKVxuICAgICAgICAgICAgdGhpcy5zaGFyZXJldml2ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ29tcGxldGUoKTogdm9pZCB7XG4gICAgICAgIExheWEuU3ByaXRlM0QubG9hZChcInJlcy90aHJlZURpbWVuL3NraW5Nb2RlbC9MYXlhTW9ua2V5L0xheWFNb25rZXkubGhcIiwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBmdW5jdGlvbihsYXlhTW9ua2V5M0Q6TGF5YS5TcHJpdGUzRCk6dm9pZCB7XG4gICAgICAgICAgICB0aGlzLmxheWFNb25rZXkzRCA9IGxheWFNb25rZXkzRDtcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuYWRkQ2hpbGQobGF5YU1vbmtleTNEKTtcbiAgICAgICAgICAgIHRoaXMubGF5YU1vbmtleTJEID0gTGF5YS5zdGFnZS5hZGRDaGlsZChuZXcgTGF5YS5JbWFnZShcInJlcy90aHJlZURpbWVuL21vbmtleS5wbmdcIikpIGFzIExheWEuSW1hZ2U7XG4gICAgICAgICAgICBMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCB0aGlzLmFuaW1hdGUpO1xuICAgICAgICB9KSlcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIHNjZW5lOkxheWEuU2NlbmUzRDtcbiAgICBwcml2YXRlIGNhbWVyYTpMYXlhLkNhbWVyYTtcbiAgICBwcml2YXRlIGxheWFNb25rZXkzRDpMYXlhLlNwcml0ZTNEO1xuICAgIHByaXZhdGUgbGF5YU1vbmtleTJEOkxheWEuSW1hZ2U7XG4gICAgcHJpdmF0ZSBfcG9zaXRpb246TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMygpO1xuICAgIHByaXZhdGUgX291dFBvczpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XG4gICAgcHJpdmF0ZSBzY2FsZURlbHRhOm51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBzY2FsZTpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKDAuMSwwLjEsMC4xKTtcbiAgICBwcml2YXRlIGFuaW1hdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uLnggPSBNYXRoLnNpbih0aGlzLnNjYWxlRGVsdGEgKz0gMC4wMSk7XG4gICAgICAgIHRoaXMubGF5YU1vbmtleTNELnRyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX3Bvc2l0aW9uO1xuICAgICAgICB0aGlzLmxheWFNb25rZXkzRC50cmFuc2Zvcm0uc2NhbGUgPSB0aGlzLnNjYWxlO1xuICAgICAgICAvL+i9rOaNouWdkOagh1xuICAgICAgICB0aGlzLmNhbWVyYS52aWV3cG9ydC5wcm9qZWN0KHRoaXMubGF5YU1vbmtleTNELnRyYW5zZm9ybS5wb3NpdGlvbiwgdGhpcy5jYW1lcmEucHJvamVjdGlvblZpZXdNYXRyaXgsIHRoaXMuX291dFBvcyk7XG4gICAgICAgIC8v6LWL5YC857uZMkRcbiAgICAgICAgdGhpcy5sYXlhTW9ua2V5MkQucG9zKHRoaXMuX291dFBvcy54IC8gTGF5YS5zdGFnZS5jbGllbnRTY2FsZVgsIHRoaXMuX291dFBvcy55IC8gTGF5YS5zdGFnZS5jbGllbnRTY2FsZVkpO1xuICAgIH1cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIFxuXG4gICAgcHJpdmF0ZSBidG4wY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucGxheXZpZGVvY2FsbGJhY2soKTtcbiAgICAgICAgICAgIC8vIHBpbmd0YWl1dGlscy5JbnN0YW5jZS5wbGF5VmlkZW8oIFwiXCIsdGhpcyx0aGlzLnBsYXl2aWRlb2NhbGxiYWNrICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZih0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAxKVxuICAgICAgICB7XG4gICAgICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5Hb2xkVXAoIHRoaXMuZ2V0Z29sZCApO1xuICAgICAgICAgICAgdGhpcy5fZ2FtZVByb3h5LnJldHVybm1haW52aWV3KCApO1xuICAgICAgICAgICAgLy8gVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3ICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZih0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAyKXtcbiAgICAgICAgICAgIHRoaXMuY291bnQgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIHBpbmd0YWl1dGlscy5JbnN0YW5jZS5wbGF5VmlkZW8oXCJcIix0aGlzLHRoaXMucGxheXZpZGVvcmV2aXZlKTtcbiAgICAgICAgICAgIHRoaXMucGxheXZpZGVvcmV2aXZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKirnnIvop4bpopHlpI3mtLvmiJDlip8gKi9cbiAgICBwcml2YXRlIHBsYXl2aWRlb3Jldml2ZSgpOnZvaWR7XG4gICAgICAgIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcbiAgICAgICAgICAgIGlmKGlzTG9hZCl7XG4gICAgICAgICAgICAgICAgLy8gVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKENob3V0aVBhblZpZXcpO1xuICAgICAgICAgICAgICAgIEdhbWVTdGF0ZS5mdWh1b2Npc2h1IC0tO1xuICAgICAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBDb21wbGV0ZVBhbmVsICk7XG4gICAgICAgICAgICAgICAgR2FtZVN0YXRlLmlzZGllID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl9pc2Nhbk1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIFBsYXllci5JbnN0YW5jZS5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xuICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XG4gICAgICAgICAgICAgICAgaWYgKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lID09IFwiXCIgfHwgUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUgPT0gXCJcIikgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLnjqnlrrbkvY3nva4tLS0tXCIsUGxheWVyLkluc3RhbmNlLl9pbml0UG9zVmVjKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLnjqnlrrbpgJ/luqZfbW92ZVZlY1wiLFBsYXllci5JbnN0YW5jZS5fbW92ZVZlYyk7XG4gICAgICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMygwLDEsMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlvZPliY3lnLrmma/lkI3lrZctLS1cIixQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5bu6562R5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW7uuetkeeJqeS9jee9ri0tLS1cIixQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lLCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUsIFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3NwZWVkTW92ZVYzLnogPSAtUGxheWVyLkluc3RhbmNlLl9Sb2xlRGF0YS5tb3Zlc3BlZWQqMjtcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMzAwMCx0aGlzLCgpPT57XG4gICAgICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fc3BlZWRNb3ZlVjMueiA9IC1QbGF5ZXIuSW5zdGFuY2UuX1JvbGVEYXRhLm1vdmVzcGVlZDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpXG4gICAgfVxuICAgIC8qKuWIhuS6q+Wkjea0u+aIkOWKnyAqL1xuICAgIHByaXZhdGUgc2hhcmVyZXZpdmUoKXtcbiAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5TaGFyZVZpZGVvKChpc0xvYWQpPT57XG4gICAgICAgICAgICAgaWYoaXNMb2FkKXtcbiAgICAgICAgICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlJlY29yZFN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgR2FtZVN0YXRlLmZ1aHVvY2lzaHUgLS07XG4gICAgICAgICAgICAgICAgLy8gR2FtZVN0YXRlLnJlY29yZHNjcmVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggQ29tcGxldGVQYW5lbCApO1xuICAgICAgICAgICAgICAgIEdhbWVTdGF0ZS5pc2RpZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5faXNjYW5Nb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBQbGF5ZXIuSW5zdGFuY2UuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcbiAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2Uubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xuICAgICAgICAgICAgICAgIGlmIChQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSA9PSBcIlwiIHx8IFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lID09IFwiXCIpICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi546p5a625L2N572uLS0tLVwiLFBsYXllci5JbnN0YW5jZS5faW5pdFBvc1ZlYyk7XG4gICAgICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMygwLDEsMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlvZPliY3lnLrmma/lkI3lrZctLS1cIixQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5bu6562R5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW7uuetkeeJqeS9jee9ri0tLS1cIixQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lLCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUsIFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyhcIuWkjea0u+WKoOmAn+aIkOWKn1wiKTtcbiAgICAgICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl9zcGVlZE1vdmVWMy56ID0gLVBsYXllci5JbnN0YW5jZS5fUm9sZURhdGEubW92ZXNwZWVkKjI7XG4gICAgICAgICAgICAgICAgICAgIExheWEudGltZXIub25jZSgzMDAwLHRoaXMsKCk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fc3BlZWRNb3ZlVjMueiA9IC1QbGF5ZXIuSW5zdGFuY2UuX1JvbGVEYXRhLm1vdmVzcGVlZDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IHRydWU7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAvLyBpZihfc3VjY2Vzcyl7XG4gICAgICAgIC8vICAgICAvLyBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoQ2hvdXRpUGFuVmlldyk7XG4gICAgICAgIC8vICAgICAgICAgR2FtZVN0YXRlLmZ1aHVvY2lzaHUgLS07XG4gICAgICAgIC8vICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIENvbXBsZXRlUGFuZWwgKTtcbiAgICAgICAgLy8gICAgICAgICBHYW1lU3RhdGUuaXNkaWUgPSBmYWxzZTtcbiAgICAgICAgLy8gICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX2lzY2FuTW92ZSA9IHRydWU7XG4gICAgICAgIC8vICAgICAgICAgLy8gUGxheWVyLkluc3RhbmNlLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVuICk7XG4gICAgICAgIC8vICAgICAgICAgUGxheWVyLkluc3RhbmNlLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcbiAgICAgICAgLy8gICAgICAgICBpZiAoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUgPT0gXCJcIiB8fCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSA9PSBcIlwiKSAge1xuICAgICAgICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIueOqeWutuS9jee9ri0tLS1cIixQbGF5ZXIuSW5zdGFuY2UuX2luaXRQb3NWZWMpO1xuICAgICAgICAvLyAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IFBsYXllci5JbnN0YW5jZS5faW5pdFBvc1ZlYy5jbG9uZSgpXG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgIGVsc2UgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCLlvZPliY3lnLrmma/lkI3lrZctLS1cIixQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSk7XG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5bu6562R5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpO1xuICAgICAgICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW7uuetkeeJqeS9jee9ri0tLS1cIixQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lLCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSkpO1xuICAgICAgICAvLyAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUsIFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKS5jbG9uZSgpO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICAgICAgLy8gR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyhcIuWkjea0u+WKoOmAn+aIkOWKn1wiKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl9zcGVlZE1vdmVWMy56ID0gLVBsYXllci5JbnN0YW5jZS5fUm9sZURhdGEubW92ZXNwZWVkKjI7XG4gICAgICAgIC8vICAgICAgICAgICAgIExheWEudGltZXIub25jZSgzMDAwLHRoaXMsKCk9PntcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fc3BlZWRNb3ZlVjMueiA9IC1QbGF5ZXIuSW5zdGFuY2UuX1JvbGVEYXRhLm1vdmVzcGVlZDtcbiAgICAgICAgLy8gICAgICAgICAgICAgfSlcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBlbHNle1xuICAgICAgICAvLyAgICAgdGhpcy5jb3VudCA9IHRydWU7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHBsYXl2aWRlb2NhbGxiYWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5TaGFyZVZpZGVvKChpc0xvYWQ9PntcbiAgICAgICAgICAgIGlmKGlzTG9hZCl7XG4gICAgICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCB0aGlzLmdldGdvbGQqMyApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dhbWVQcm94eS5yZXR1cm5tYWludmlldyh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpXG4gICAgICAgIC8vIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcbiAgICAgICAgLy8gICAgIGlmKGlzTG9hZCl7XG4gICAgICAgIC8vICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCB0aGlzLmdldGdvbGQqMyApO1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuX2dhbWVQcm94eS5yZXR1cm5tYWludmlldyh0cnVlKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSkpXG4gICAgfVxuXG4gICAgXG5cbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcbiAgICB7XG4gICAgICAgIExheWEudGltZXIuY2xlYXIodGhpcyx0aGlzLkNvdW50VGltZSk7XG4gICAgICAgIC8vIExheWEudGltZXIuY2xlYXIodGhpcyx0aGlzLnBsYXlhbmltYXRvcik7XG4gICAgICAgIC8vIEd1YW5nR2FvLkNsZWFyKCk7XG4gICAgICAgIHR0YWQuQ2xlYXIoKTtcbiAgICAgICAgc3VwZXIuZGVzdG9yeSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMudGlhbmppYS52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuVGlhbkppYUFuaSA9IHRoaXMuZ2V0VHJhbnNpdGlvbkJ5TmFtZShcInRpYW5qaWFhbmlcIik7XG4gICAgICAgIHRoaXMuVGlhbkppYUFuaS5zdG9wKCk7XG4gICAgICAgIC8vIExheWEudGltZXIubG9vcCgyMDAwLHRoaXMsdGhpcy5wbGF5YW5pbWF0b3IpO1xuICAgICAgICB0aGlzLmNvdW50ID0gdHJ1ZTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuX2dhbWVQcm94eSA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeUluR2FtZSApO1xuICAgICAgICB0aGlzLmNfc3RhdGUgPSB0aGlzLmdldENvbnRyb2xsZXJCeUJhbWUoIFwiY19zdGF0ZVwiICk7XG4gICAgICAgIHRoaXMudHh0X2dvbGQudGV4dCA9IHRoaXMuZ2V0Z29sZC50b1N0cmluZygpO1xuXG4gICAgICAgIGlmKEdhbWVTdGF0ZS5yZWNvcmRzY3JlZSl7XG4gICAgICAgICAgICB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHRoaXMuQmF0dGxlQnRuLnZpc2libGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoaXMuQmF0dGxlQnRuLnZpc2libGUgPSAhR2FtZVN0YXRlLnJlY29yZHNjcmVlO1xuICAgICAgICBpZighR2FtZVN0YXRlLmlzZGllKXsvL+eOqeWutuacquatu+S6oeeahOeKtuaAgVxuICAgICAgICAgICAgaWYoIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2UuZW5kR2FtZVBsYXllckFyci5sZW5ndGggPT0gMCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgaWYoR2FtZVN0YXRlLmZ1aHVvY2lzaHU+MCl7XG4gICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAyO1xuICAgICAgICAgICAgICAgIExheWEudGltZXIubG9vcCgxMDAwLHRoaXMsdGhpcy5Db3VudFRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgR3VhbmdHYW8uQ2hlYXRCYW5uZXIodGhpcy5idG5fMSk7XG4gICAgfVxuICAgIHBsYXlhbmltYXRvcigpe1xuICAgICAgICB0aGlzLlRpYW5KaWFBbmkucGxheShudWxsLDEpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl8wLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bjBjbGljayApO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl8xLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bjFjbGljayApO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLkJhdHRsZUJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5TaGFyZUJhdHRsZSk7XG4gICAgfVxuXG4gICAgIHRpbWUgPSA5O1xuICAgICBjb3VudCA9IGZhbHNlO1xuICAgICBmdWh1byA9IGZhbHNlO1xuICAgICAvL+WAkuiuoeaXtlxuICAgICBDb3VudFRpbWUoKVxuICAgICB7XG4gICAgICAgICBpZih0aGlzLmNvdW50ICYmIHRoaXMudGltZSA+IDApXG4gICAgICAgICB7XG4gICAgICAgICAgICAgdGhpcy50aW1lIC09IDE7XG4gICAgICAgICAgICAgdGhpcy50aW1lbnVtLnRleHQgPSB0aGlzLnRpbWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICBpZih0aGlzLnRpbWUgPCAxKVxuICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKHRoaXMsdGhpcy5Db3VudFRpbWUpO1xuICAgICAgICAgICAgICAgIEdhbWVTdGF0ZS5mdWh1b2Npc2h1LS07XG4gICAgICAgICAgICAgICAgLy8gTGF5YS50aW1lci5jbGVhcih0aGlzLHRoaXMucGxheWFuaW1hdG9yKTtcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZShDb21wbGV0ZVBhbmVsKTtcbiAgICAgICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUubG9zZSApO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgfVxuXG4gICAgIC8v5b2V5bGP5YiG5LqrXG4gICAgIFNoYXJlQmF0dGxlKCl7XG4gICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlNoYXJlVmlkZW8oKGlzTG9hZCk9PntcbiAgICAgICAgICAgIGlmKGlzTG9hZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5CYXR0bGVCdG4udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfSlcbiAgICAgICAgLy8gIFJlY29yZE1hbmFnZXIuSW5zdGFuY2UuU2hhcmVWaWRlbygoaXNMb2FkPT57XG4gICAgICAgIC8vICAgICAgaWYoaXNMb2FkKXtcbiAgICAgICAgLy8gICAgICAgICAgdGhpcy5CYXR0bGVCdG4udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAvLyAgICAgIH1cbiAgICAgICAgLy8gIH0pKVxuXG4gICAgIH1cbn0iLCJpbXBvcnQgeyBQYW5lbEJhc2VDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7IFRpbWVyU2VydmljZSB9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgeyBHdWFuZ0dhbyB9IGZyb20gXCIuLi9XWFNESy9HdWFuZ0dhb1wiO1xyXG5pbXBvcnQgeyBWaWV3QWN0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL1ZpZXdBY3Rpb25cIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBBZ2VuY3lJbkdhbWUgfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeUluR2FtZVwiO1xyXG5pbXBvcnQgeyBBZ2VuY3lMb3R0ZXJ5IH0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lMb3R0ZXJ5XCI7XHJcbmltcG9ydCBMb3R0ZXJ5Q0ZHIGZyb20gXCIuLi9DRkcvTG90dGVyeUNGR1wiO1xyXG5pbXBvcnQgeyBTY2VuZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9TY2VuZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgR2FtZVN0YXRlQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi9XWFNESy90dGFkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZ2dQYW5lbCBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2wgaW1wbGVtZW50cyBUaW1lckNvbnRyb2xcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkVnZ1BhbmVsXCI7XHJcblxyXG4gICAgbG9hZF9jbGljazpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgcHJvXzA6ZmFpcnlndWkuR1Byb2dyZXNzQmFyO1xyXG4gICAgYnRuXzE6ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIGJ0bl9jbG9zZTpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgaGl0YW5pOmZhaXJ5Z3VpLlRyYW5zaXRpb247XHJcbiAgICBnZXRyZXdhcmRidG46ZmFpcnlndWkuR0J1dHRvbjtcclxuXHJcbiAgICBwcml2YXRlIF9pc0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pc1Nob3dCYW5uZXIgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2Jhbm5lclZhbCA9IDAuNTtcclxuICAgIHByaXZhdGUgX21heENsaWNrQ250ID0gMTg7XHJcbiAgICBwcml2YXRlIF9jbGlja0NudCA9IDA7XHJcbiAgICBwcml2YXRlIF9pbnRlcnZhbCA9IDEwMDtcclxuICAgIHByaXZhdGUgX2RlY3JlbWVudCA9IDE7XHJcblxyXG4gICAgbjY6ZmFpcnlndWkuR0dyb3VwO1xyXG4gICAgQ2hlc3Q6ZmFpcnlndWkuR0dyb3VwO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJlZ2d2aWV3XCIsZmFsc2UsVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmUsMSApOyBcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5oaXRhbmkgPSB0aGlzLmdldFRyYW5zaXRpb25CeU5hbWUoIFwiaGl0YW5pXCIgKTtcclxuICAgICAgICB0aGlzLnByb18wLnZhbHVlID0gMTtcclxuICAgICAgICB0aGlzLl9iYW5uZXJWYWwgPSBHYW1lVXRpbHMucmFuZFJhbmdlZmxvYXQoMC4yLCAwLjQpO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICAvLyBHdWFuZ0dhby5DaGVhdEJhbm5lcih0aGlzLmJ0bl8xKTtcclxuICAgICAgICAvLyBHdWFuZ0dhby5DbGVhcigpOy8vaFtcImRlZmF1bHRcIl0uQ2xlYXIoKXJbXCJkZWZhdWx0XCJdXHJcbiAgICAgICAgdHRhZC5DbGVhcigpO1xyXG4gICAgICAgIHZhciBzY2VuZWhlaWdodCA9IExheWEuc3RhZ2UuaGVpZ2h0O1xyXG4gICAgICAgIHRoaXMuYnRuXzEueT1zY2VuZWhlaWdodC10aGlzLmJ0bl8xLmhlaWdodC0xNTtcclxuICAgICAgICB0aGlzLmdldHJld2FyZGJ0bi55ID0gdGhpcy5idG5fMS55O1xyXG4gICAgICAgIHRoaXMuZ2V0cmV3YXJkYnRuLnZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYoU2NlbmVDb250cm9sLkVnZ0dHcm91cD09MClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubjYudmlzaWJsZT10cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiYW5uZXJjYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl8xLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLnFpYW9EYSApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYnRuX2Nsb3NlLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyxFZ2dQYW5lbC5vbmNsb3NlZnVuICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5nZXRyZXdhcmRidG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLEVnZ1BhbmVsLlZpZGVvR2V0UmV3YXJkICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3RpbWUgKz0gZHQ7XHJcbiAgICAgICAgaWYoIHRoaXMuX3RpbWUgPj0gdGhpcy5faW50ZXJ2YWwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuRGFvamlzaGkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgRGFvamlzaGkoKSB7XHJcbiAgICAgICAgbGV0IHB2ID0gdGhpcy5wcm9fMC52YWx1ZTtcclxuICAgICAgICBwdiAtPSB0aGlzLl9kZWNyZW1lbnQ7XHJcbiAgICAgICAgaWYgKHB2IDw9IDApIHB2ID0gMTtcclxuICAgICAgICB0aGlzLnByb18wLnZhbHVlID0gcHY7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tDbnQgPSBNYXRoLmNlaWwocHYgKnRoaXMuX21heENsaWNrQ250IC8xMDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcWlhb0RhKCkgXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NvbXBsZXRlKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuaGl0YW5pIT1udWxsJiYgIXRoaXMuaGl0YW5pLnBsYXlpbmcgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpdGFuaS5wbGF5KCBudWxsLDEgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9jbGlja0NudCsrO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fY2xpY2tDbnQgPiB0aGlzLl9tYXhDbGlja0NudCkgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0NudCA9IHRoaXMuX21heENsaWNrQ250O1xyXG4gICAgICAgICAgICBsZXQgcHYgPSB0aGlzLl9jbGlja0NudCAvIHRoaXMuX21heENsaWNrQ250O1xyXG4gICAgICAgICAgICBpZiggcHYgPiAxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcHYgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucHJvXzAudmFsdWUgPSBwdioxMDA7XHJcbiAgICAgICAgICAgIGlmIChwdiA+PSB0aGlzLl9iYW5uZXJWYWwgJiYgIXRoaXMuX2lzU2hvd0Jhbm5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNTaG93QmFubmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0cmV3YXJkYnRuLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gR3VhbmdHYW8uT3BlbkJhbm5lcigpO1xyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKCAyMDAwLHRoaXMsKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldHJld2FyZGJ0bi52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9ICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHB2ID49IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgRWdnUGFuZWwuZ2V0cmV3YXJkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldHJld2FyZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAvLyB2YXIgenBwcm94eTpBZ2VuY3lMb3R0ZXJ5ID0gdGhpcy5nZXRQcm94eSggQWdlbmN5TG90dGVyeSApIGFzIEFnZW5jeUxvdHRlcnk7XHJcbiAgICAgICAgLy8gdmFyIGluZGV4ID0gKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lMb3R0ZXJ5ICkgYXMgQWdlbmN5TG90dGVyeSApLkdldFJld2FyZCgpO1xyXG4gICAgICAgIC8vIHZhciBzZWxlY3RjZmc6TG90dGVyeUNGRyA9IExvdHRlcnlDRkcudmVjWyBpbmRleCBdO1xyXG4gICAgICAgIC8vIHpwcHJveHkuZ2V0cmV3YXJkKCBzZWxlY3RjZmcgKTtcclxuICAgICAgICAvLyBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLojrflvpflvIDlsYDliqDpgJ9cIiApO1xyXG4gICAgICAgIEVnZ1BhbmVsLm9uY2xvc2VmdW4oKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+eci+inhumikeW+l+WlluWKsVxyXG4gIHN0YXRpYyBWaWRlb0dldFJld2FyZCgpe1xyXG4gICAgICAgIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcclxuICAgICAgICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi6I635b6X5byA5bGA5Yqg6YCfXCIgKTtcclxuICAgICAgICAgICAgICAgIEVnZ1BhbmVsLm9uY2xvc2VmdW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgRWdnUGFuZWwub25jbG9zZWZ1bigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGhpZGViYW5uZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gUGxhdGZvcm1Ub29sLmdldEluc3RhbmNlKCkuaGlkZUJhbm5lcihcIkVnZ1ZpZXdcIik7XHJcbiAgICAgICAgR3VhbmdHYW8uaGlkZWJhbm5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBFZ2dQYW5lbCApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIC8vIFBsYXRmb3JtVG9vbC5nZXRJbnN0YW5jZSgpLmhpZGVCYW5uZXIoXCJFZ2dWaWV3XCIpO1xyXG4gICAgICAgIC8vIEd1YW5nR2FvLmhpZGViYW5uZXIoKTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgc3VwZXIuZGVzdG9yeSgpO1xyXG4gICAgICAgIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2UuZW50ZXJnYW1lKHRydWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBcclxufSIsImltcG9ydCB7IFBhbmVsQmFzZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEd1YW5nR2FvIH0gZnJvbSBcIi4uL1dYU0RLL0d1YW5nR2FvXCI7XHJcbmltcG9ydCB7IFZpZXdBY3Rpb24gfSBmcm9tIFwiLi4vdXRpbHMvVmlld0FjdGlvblwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuL1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEFnZW5jeUluR2FtZSB9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5SW5HYW1lXCI7XHJcbmltcG9ydCB7IEFnZW5jeUxvdHRlcnkgfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeUxvdHRlcnlcIjtcclxuaW1wb3J0IExvdHRlcnlDRkcgZnJvbSBcIi4uL0NGRy9Mb3R0ZXJ5Q0ZHXCI7XHJcbmltcG9ydCB7IFNjZW5lQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHYW1lU3RhdGVDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvR2FtZVN0YXRlQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uL1dYU0RLL1Nka1wiO1xyXG5pbXBvcnQgeyBBZ2VuY3lVc2VyTWVzc2FnZSB9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VXNlck1lc3NhZ2VcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IEdhbWVTdGF0ZSB9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IHsgUHJvcE1hbmFnZXIgfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBDb21wbGV0ZVBhbmVsIH0gZnJvbSBcIi4vQ29tcGxldGVQYW5lbFwiO1xyXG5pbXBvcnQgeyBBZ2VuY3lUcmlhbCB9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VHJpYWxcIjtcclxuaW1wb3J0IHsgUm9sZURhdGEgfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xyXG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL1dYU0RLL3R0YWRcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdpZnRWaWV3IGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkdpZnRWaWV3XCI7XHJcblxyXG4gICAgcHJpdmF0ZSBjbGlja2FuaTpmYWlyeWd1aS5UcmFuc2l0aW9uO1xyXG4gICAgcHJpdmF0ZSBqaW5kdTpmYWlyeWd1aS5HUHJvZ3Jlc3NCYXI7XHJcbiAgICBwcml2YXRlIGJ0bmJveDpmYWlyeWd1aS5HR3JvdXA7XHJcbiAgICBwcml2YXRlIGFubml1OmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBwcml2YXRlIHNob3U6ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIHByaXZhdGUga3VhaXN1ZGlhbmppOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBwcml2YXRlIGRpOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRyZXdhcmRidG46ZmFpcnlndWkuR0J1dHRvbjtcclxuXHJcbiAgICBwcml2YXRlIGl0ZW06ZmFpcnlndWkuR0NvbXBvbmVudDtcclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfaXNDb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfaXNTaG93QmFubmVyID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9iYW5uZXJWYWwgPSAwLjU7XHJcbiAgICBwcml2YXRlIF9tYXhDbGlja0NudCA9IDE4O1xyXG4gICAgcHJpdmF0ZSBfY2xpY2tDbnQgPSAwO1xyXG4gICAgcHJpdmF0ZSBfaW50ZXJ2YWwgPSAxMDA7XHJcbiAgICBwcml2YXRlIF9kZWNyZW1lbnQgPSAxO1xyXG5cclxuICAgIG42OmZhaXJ5Z3VpLkdHcm91cDtcclxuICAgIENoZXN0OmZhaXJ5Z3VpLkdHcm91cDtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoIFwibWFpblwiLFwiZ2lmdGNoZWF0dmlld1wiICk7IFxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFubml1ID0gdGhpcy5pdGVtLmFzQ29tLmdldENoaWxkQXQoMikgYXMgZmFpcnlndWkuR0xvYWRlcjtcclxuICAgICAgICB0aGlzLmt1YWlzdWRpYW5qaSA9IHRoaXMuaXRlbS5hc0NvbS5nZXRDaGlsZEF0KDApIGFzIGZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICAgICAgdGhpcy5zaG91ID0gdGhpcy5pdGVtLmFzQ29tLmdldENoaWxkQXQoMykgYXMgZmFpcnlndWkuR0xvYWRlcjtcclxuICAgICAgICB0aGlzLmRpID0gdGhpcy5pdGVtLmFzQ29tLmdldENoaWxkQXQoMSkgYXMgZmFpcnlndWkuR0xvYWRlcjtcclxuICAgICAgICB0aGlzLmdldHJld2FyZGJ0biA9IHRoaXMuaXRlbS5hc0NvbS5nZXRDaGlsZEF0KDQpIGFzIGZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICAgICAgdGhpcy5nZXRyZXdhcmRidG4udmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmNsaWNrYW5pID0gdGhpcy5pdGVtLmdldFRyYW5zaXRpb24oIFwiY2xpY2tidG5hbmlcIiApO1xyXG4gICAgICAgIHRoaXMuamluZHUudmFsdWUgPSAxO1xyXG4gICAgICAgIHRoaXMuX2Jhbm5lclZhbCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VmbG9hdCgwLjIsIDAuNCk7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIC8vIEd1YW5nR2FvLkNsZWFyKCk7XHJcbiAgICAgICAgdHRhZC5DbGVhcigpO1xyXG4gICAgICAgIExheWEudGltZXIubG9vcCgyMDAwLHRoaXMsdGhpcy5wbGF5QW5pbWF0b3IpO1xyXG4gICAgICAgIC8vIHZhciBzY2VuZWhlaWdodCA9IExheWEuc3RhZ2UuaGVpZ2h0O1xyXG4gICAgICAgIC8vIHRoaXMuYnRuYm94Lnk9c2NlbmVoZWlnaHQtdGhpcy5idG5ib3gueS0xNTtcclxuICAgIH1cclxuXHJcbiAgICBwbGF5QW5pbWF0b3IoKXtcclxuICAgICAgICB0aGlzLmNsaWNrYW5pLnBsYXkobnVsbCwxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYW5uaXUsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMucWlhb0RhICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5nZXRyZXdhcmRidG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuVmlkZW9HZXRSZXdhcmQgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF90aW1lOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fdGltZSArPSBkdDtcclxuICAgICAgICBpZiggdGhpcy5fdGltZSA+PSB0aGlzLl9pbnRlcnZhbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lID0gMDtcclxuICAgICAgICAgICAgdGhpcy5EYW9qaXNoaSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBEYW9qaXNoaSgpIHtcclxuICAgICAgICBsZXQgcHYgPSB0aGlzLmppbmR1LnZhbHVlO1xyXG4gICAgICAgIHB2IC09IHRoaXMuX2RlY3JlbWVudDtcclxuICAgICAgICBpZiAocHYgPD0gMCkgcHYgPSAxO1xyXG4gICAgICAgIHRoaXMuamluZHUudmFsdWUgPSBwdjtcclxuICAgICAgICB0aGlzLl9jbGlja0NudCA9IE1hdGguY2VpbChwdiAqdGhpcy5fbWF4Q2xpY2tDbnQgLzEwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBxaWFvRGEoKSBcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLnNob3UudmlzaWJsZSl7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMua3VhaXN1ZGlhbmppLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgTGF5YS50aW1lci5jbGVhcih0aGlzLHRoaXMucGxheUFuaW1hdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NvbXBsZXRlKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQ250Kys7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jbGlja0NudCA+IHRoaXMuX21heENsaWNrQ250KSBcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQ250ID0gdGhpcy5fbWF4Q2xpY2tDbnQ7XHJcbiAgICAgICAgICAgIGxldCBwdiA9IHRoaXMuX2NsaWNrQ250IC8gdGhpcy5fbWF4Q2xpY2tDbnQ7XHJcbiAgICAgICAgICAgIGlmKCBwdiA+IDEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwdiA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5qaW5kdS52YWx1ZSA9IHB2KjEwMDtcclxuICAgICAgICAgICAgaWYgKHB2ID49IHRoaXMuX2Jhbm5lclZhbCAmJiAhdGhpcy5faXNTaG93QmFubmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1Nob3dCYW5uZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRyZXdhcmRidG4udmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMDAsdGhpcywoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0cmV3YXJkYnRuLnZpc2libGUgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwdiA+PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0NvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIEdpZnRWaWV3LmdldHJld2FyZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRyZXdhcmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgUm9sZURhdGEuSW5zdGFuY2UuTW9uZXkgKz0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5DaGVhdFJld2FyZDtcclxuICAgICAgICAvLyAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5Hb2xkVXAoIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuQ2hlYXRSZXdhcmQgKTtcclxuICAgICAgICAvLyB2YXIgaW5kZXggPSAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeUxvdHRlcnkgKSBhcyBBZ2VuY3lMb3R0ZXJ5ICkuR2V0UmV3YXJkKCk7XHJcbiAgICAgICAgLy8gdmFyIHNlbGVjdGNmZzpMb3R0ZXJ5Q0ZHID0gTG90dGVyeUNGRy52ZWNbIGluZGV4IF07XHJcbiAgICAgICAgLy8genBwcm94eS5nZXRyZXdhcmQoIHNlbGVjdGNmZyApO1xyXG4gICAgICAgIC8vIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuiOt+W+l1wiK1BsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuQ2hlYXRSZXdhcmQrXCLph5HluIFcIiApO1xyXG4gICAgICAgIEdpZnRWaWV3Lm9uY2xvc2VmdW4oKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+eci+inhumikeW+l+WlluWKsVxyXG4gICAgVmlkZW9HZXRSZXdhcmQoKXtcclxuICAgICAgICB0dGFkLlNob3dWaWRlbygoaXNMb2FkPT57XHJcbiAgICAgICAgICAgIGlmKGlzTG9hZCl7XHJcbiAgICAgICAgICAgICAgICBSb2xlRGF0YS5JbnN0YW5jZS5Nb25leSArPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkNoZWF0UmV3YXJkO1xyXG4gICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLojrflvpdcIitQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkNoZWF0UmV3YXJkK1wi6YeR5biBXCIgKTtcclxuICAgICAgICAgICAgICAgIEdpZnRWaWV3Lm9uY2xvc2VmdW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgR2lmdFZpZXcub25jbG9zZWZ1bigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoaWRlYmFubmVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEd1YW5nR2FvLmhpZGViYW5uZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgb25jbG9zZWZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggR2lmdFZpZXcgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBHdWFuZ0dhby5oaWRlYmFubmVyKCk7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRlc3RvcnkoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgXHJcbn0iLCJpbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xuXG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBjbGFzcyBXb3JkVGlwc1BhbmVsIGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbFxue1xuICAgIHB1YmxpYyBzdGF0aWMga2V5OnN0cmluZyA9IFwiV29yZFRpcHNQYW5lbFwiO1xuICAgIHRleHRfd29yZDpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgIHQxOmZhaXJ5Z3VpLlRyYW5zaXRpb247XG4gICAgcHVibGljIG5vd3dvcmQ6c3RyaW5nID0gXCJcIjtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlciggXCJsb2FkaW5nXCIsXCJ3b3JkVGlwc1wiICk7XG4gICAgfSAgIFxuXG4gICAgXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBzaG93VGV4dCgpOiB2b2lkIHtcbiAgICAgICAgdmFyIHRleHQ6TGF5YS4gVGV4dCA9IG5ldyBMYXlhLlRleHQoKTtcblxuICAgICAgICB0ZXh0LnRleHQgPSBcIk9yaWVudGF0aW9uLVBvcnRyYWl0XCI7XG4gICAgICAgIHRleHQuY29sb3IgPSBcImdyYXlcIjtcbiAgICAgICAgdGV4dC5mb250ID0gXCJJbXBhY3RcIjtcbiAgICAgICAgdGV4dC5mb250U2l6ZSA9IDUwO1xuXG4gICAgICAgIHRleHQueCA9IExheWEuc3RhZ2Uud2lkdGggLSB0ZXh0LndpZHRoID4+IDE7XG4gICAgICAgIHRleHQueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC0gdGV4dC5oZWlnaHQgPj4gMTtcblxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRleHQpO1xuICAgIH1cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuXG4gICAgcHVibGljIHNob3dXb3JkKCB3b3JkOnN0cmluZyApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubm93d29yZCA9IHdvcmQ7XG4gICAgICAgIHRoaXMudGV4dF93b3JkLnRleHQgPSB3b3JkO1xuICAgICAgICB0aGlzLnQxLnBsYXkoIExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsIHRoaXMucGxheUVuZENhbGxiYWNrICksMSApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICBzdXBlci5vbkluaXQoKTtcbiAgICAgICAgdGhpcy50MSA9IHRoaXMuZ2V0cGFuZWxUcmFuc2l0aW9uKFwidDFcIik7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXHRwcml2YXRlIHJlY3Q6TGF5YS4gU3ByaXRlO1xuICAgIHByaXZhdGUgY3JlYXRlQ2FudHJhbFJlY3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVjdCA9IG5ldyBMYXlhLlNwcml0ZSgpO1xuICAgICAgICB0aGlzLnJlY3QuZ3JhcGhpY3MuZHJhd1JlY3QoLTEwMCwgLTEwMCwgMjAwLCAyMDAsIFwiZ3JheVwiKTtcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLnJlY3QpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlUmVjdFBvcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUmVjdFBvcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWN0LnggPSBMYXlhLnN0YWdlLndpZHRoIC8gMjtcbiAgICAgICAgdGhpcy5yZWN0LnkgPSBMYXlhLnN0YWdlLmhlaWdodCAvIDI7XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuICAgIHByaXZhdGUgcGxheUVuZENhbGxiYWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLnJlbW92ZXNlbGVjdCx0aGlzICk7XG4gICAgfVxufSIsImltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xuXG5leHBvcnQgY2xhc3MgTG9hZGluZ1BhbmVsIGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbFxue1xuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJMb2FkaW5nUGFuZWxcIjtcbiAgICBwcm86ZmFpcnlndWkuR1Byb2dyZXNzQmFyO1xuICAgIGNvbnN0cnVjdG9yKCkgXG4gICAgeyBcbiAgICAgICAgc3VwZXIoXCJsb2FkaW5nXCIsXCJsb2FkaW5nXCIpOyBcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XG4gICAgfVxuXG4gICAgXG4gICAgcHVibGljIHNob3dXb3JkKCB2YWx1ZTpudW1iZXIgKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLnByby52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Cb3lDbGljayhlOkxheWEuRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy/ngrnlh7vlkI7lsI/kurrkvJrmlL7lpKfnvKnlsI9cbiAgICAgICAgdmFyIGJveTpMYXlhLiBTcHJpdGUgPSBlLnRhcmdldDtcbiAgICAgICAgaWYgKGJveS5zY2FsZVggPT09IDEpIHtcbiAgICAgICAgICAgIGJveS5zY2FsZSgxLjIsIDEuMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib3kuc2NhbGUoMSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVHh0Q2xpY2soZTogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy/ngrnlh7vlkI7liIfmjaLpgILphY3mqKHlvI9cbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICBcbiAgICB9XG5cbiAgIFxuXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmNsZWFyRXZlbnQoKTtcbiAgICAgICAgc3VwZXIuZGVzdG9yeSgpO1xuICAgIH1cbn0iLCJpbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcbmltcG9ydCB7Vmlld0FjdGlvbn0gZnJvbSBcIi4uL3V0aWxzL1ZpZXdBY3Rpb25cIjtcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcbmltcG9ydCB7cGluZ3RhaXV0aWxzfSBmcm9tIFwiLi4vV1hTREsvcGluZ3RhaXV0aWxzXCI7XG5pbXBvcnQgTG90dGVyeUNGRyBmcm9tIFwiLi4vQ0ZHL0xvdHRlcnlDRkdcIjtcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XG5pbXBvcnQgUm9sZUNGRyBmcm9tIFwiLi4vQ0ZHL1JvbGVDRkdcIjtcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcbmltcG9ydCB7QWdlbmN5TG90dGVyeX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lMb3R0ZXJ5XCI7XG5pbXBvcnQge0d1YW5nR2FvfSBmcm9tIFwiLi4vV1hTREsvR3VhbmdHYW9cIjtcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vV1hTREsvdHRhZFwiO1xuXG5leHBvcnQgY2xhc3MgTG90dGVyeVBhbmVsIGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBcbntcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiTG90dGVyeVBhbmVsXCI7XG5cbiAgICBiYWNrYnRuOmZhaXJ5Z3VpLkdCdXR0b247XG4gICAgbG90dGVyeWJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xuICAgIGljb25fMDpmYWlyeWd1aS5HTG9hZGVyO1xuICAgIHR4dF8wOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgaWNvbl8xOmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgdHh0XzE6ZmFpcnlndWkuR1RleHRGaWVsZDtcbiAgICBpY29uXzI6ZmFpcnlndWkuR0xvYWRlcjtcbiAgICB0eHRfMjpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgIGljb25fMzpmYWlyeWd1aS5HTG9hZGVyO1xuICAgIHR4dF8zOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgaWNvbl80OmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgdHh0XzQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcbiAgICBpY29uXzU6ZmFpcnlndWkuR0xvYWRlcjtcbiAgICB0eHRfNTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgIGljb25fNjpmYWlyeWd1aS5HTG9hZGVyO1xuICAgIHR4dF82OmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgaWNvbl83OmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgdHh0Xzc6ZmFpcnlndWkuR1RleHRGaWVsZDtcblxuICAgIHByaXZhdGUgYWdlbmN5bG90dGVyeTpBZ2VuY3lMb3R0ZXJ5O1xuICAgIFxuICAgIGNvbnN0cnVjdG9yKCkgXG4gICAgeyBcbiAgICAgICAgc3VwZXIoIFwibWFpblwiLFwiTG90dGVyeVZpZXdcIixmYWxzZSxWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZSwxICk7IFxuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBsb2dnZXI6TGF5YS5UZXh0O1xuICAgIHByaXZhdGUgc2hvd0xvZ2dlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBuZXcgTGF5YS5UZXh0KCk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZm9udFNpemUgPSAzMDtcbiAgICAgICAgdGhpcy5sb2dnZXIuY29sb3IgPSBcIiNGRkZGRkZcIjtcbiAgICAgICAgdGhpcy5sb2dnZXIuYWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgdGhpcy5sb2dnZXIudmFsaWduID0gJ21pZGRsZSc7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuc2l6ZShMYXlhLnN0YWdlLndpZHRoLCBMYXlhLnN0YWdlLmhlaWdodCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLnRleHQgPSBcIuetieW+heWTjeW6lC4uLlxcblwiO1xuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMubG9nZ2VyKTtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuXG4gICAgcHJpdmF0ZSBvbkh0dHBSZXF1ZXN0RXJyb3IoZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJhY2tidG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxvdHRlcnlidG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuY2hvdWppYW5nY2xpY2sgKTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgX3R3ZWVPYmplY3Q6YW55O1xuICAgIHByaXZhdGUgX25vd2dldEluZGV4Om51bWJlcjtcbiAgICBwcml2YXRlIF9wcmVJbmRleDpudW1iZXI7XG4gICAgcHJpdmF0ZSB0dzogbGF5YS51dGlscy5Ud2VlbjtcbiAgICBcblxuICAgIHByaXZhdGUgcGxheUNvbXBsdGUoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy50dyApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudHcuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMudHcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmFja2J0bi5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb3R0ZXJ5YnRuLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFnZW5jeWxvdHRlcnkuZ2V0cmV3YXJkKCB0aGlzLl9zZWxlY3RjZmcgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uY2xvc2VmdW4oKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy50dyApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudHcuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMudHcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIEd1YW5nR2FvLkNsZWFyKCk7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBMb3R0ZXJ5UGFuZWwgKTtcbiAgICB9XG5cblxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuYWdlbmN5bG90dGVyeSA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeUxvdHRlcnkgKTtcbiAgICAgICAgdmFyIHZlYzpBcnJheTxMb3R0ZXJ5Q0ZHPiA9IExvdHRlcnlDRkcudmVjO1xuICAgICAgICBmb3IoIHZhciBpOm51bWJlciA9IDA7aSA8IHZlYy5sZW5ndGg7aSsrIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGNmZzpMb3R0ZXJ5Q0ZHID0gdmVjW2ldO1xuICAgICAgICAgICAgaWYoIGNmZy50eXBlID09IDEgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXNbXCJpY29uX1wiK2ldLnVybCA9IGZhaXJ5Z3VpLlVJUGFja2FnZS5nZXRJdGVtVVJMKCBcIm1haW5cIixcImltZ19nb2xkXCIgKTtcbiAgICAgICAgICAgICAgICB0aGlzW1widHh0X1wiK2ldLnRleHQgPSBcIlhcIiArIGNmZy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgcm9sZWNmZzpSb2xlQ0ZHID0gUm9sZUNGRy5kaWN0W2NmZy52YWx1ZV07XG4gICAgICAgICAgICAgICAgdGhpc1tcImljb25fXCIraV0udXJsID0gQXNzZXRQYXRoLmdldHJvbGVpY29uKCByb2xlY2ZnLmljb24gKTtcbiAgICAgICAgICAgICAgICB0aGlzW1widHh0X1wiK2ldLnRleHQgPSByb2xlY2ZnLnJvbGVuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEd1YW5nR2FvLkNoZWF0QmFubmVyKHRoaXMubG90dGVyeWJ0bik7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIG9uU29ja2V0Q2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiU29ja2V0IGNsb3NlZFwiKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBvbk1lc3NhZ2VSZXZlaXZlZChtZXNzYWdlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJNZXNzYWdlIGZyb20gc2VydmVyOlwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuXG5cbiAgICBwcml2YXRlIGNob3VqaWFuZ2NsaWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy52aWRlb2NhbGxiYWNrKCk7XG4gICAgICAgIC8vIHBpbmd0YWl1dGlscy5JbnN0YW5jZS5wbGF5VmlkZW8oIFwiXCIsdGhpcyx0aGlzLnZpZGVvY2FsbGJhY2sgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZWxlY3RjZmc6TG90dGVyeUNGRztcbiAgICBwcml2YXRlIHZpZGVvY2FsbGJhY2soKTp2b2lkXG4gICAge1xuICAgICAgICB0dGFkLlNob3dWaWRlbygoaXNMb2FkPT57XG4gICAgICAgICAgICBpZihpc0xvYWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRQbGF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhcnRQbGF5KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5hZ2VuY3lsb3R0ZXJ5LkdldFJld2FyZCgpO1xuICAgICAgICB0aGlzLl9zZWxlY3RjZmcgPSBMb3R0ZXJ5Q0ZHLnZlY1sgaW5kZXggXTtcbiAgICAgICAgdGhpcy5iYWNrYnRuLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb3R0ZXJ5YnRuLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbm93Z2V0SW5kZXggPSBpbmRleDtcbiAgICAgICAgdmFyIGFuZ2xlOm51bWJlciA9IDM2MCAqIDYgKyAodGhpcy5fbm93Z2V0SW5kZXgpKiA0NSAtIDE1O1xuICAgICAgICBpZiggdGhpcy5pdGVtX3BhbmVsLnJvdGF0aW9uID09IDAgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl90d2VlT2JqZWN0ID0geyB2YWx1ZTowIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl90d2VlT2JqZWN0ID0geyB2YWx1ZTp0aGlzLl9wcmVJbmRleCAqIDQ1IC0gMTUgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wcmVJbmRleCA9IHRoaXMuX25vd2dldEluZGV4O1xuICAgICAgICB0aGlzLnR3ID0gbGF5YS51dGlscy5Ud2Vlbi50byh0aGlzLl90d2VlT2JqZWN0LCB7IHZhbHVlOmFuZ2xlIH0sIDMwMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsTGF5YS5IYW5kbGVyLmNyZWF0ZSggdGhpcyx0aGlzLnBsYXlDb21wbHRlICkpO1xuICAgICAgICB0aGlzLnR3LnVwZGF0ZSA9IExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZTpudW1iZXIgPSB0aGlzLl90d2VlT2JqZWN0LnZhbHVlICUgMzYwO1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9wYW5lbC5yb3RhdGlvbiA9ICB2YWx1ZTtcbiAgICAgICAgICAgIH0sIG51bGwsIGZhbHNlKTtcbiAgICB9XG4gICAgXG59IiwiaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XG5pbXBvcnQge0dhbWVTdGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcbmltcG9ydCB7QWdlbmN5VXNlck1lc3NhZ2V9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VXNlck1lc3NhZ2VcIjtcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcbmltcG9ydCB7QWdlbmN5U2tpbn0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lTa2luXCI7XG5pbXBvcnQge0FnZW5jeUluR2FtZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lJbkdhbWVcIjtcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcbmltcG9ydCB7QWdlbmN5TG90dGVyeX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lMb3R0ZXJ5XCI7XG5pbXBvcnQgQ2hvdXRpUGFuVmlldyBmcm9tIFwiLi4vUHVzaC9DaG91dGlQYW5WaWV3XCI7XG5pbXBvcnQgVHVpamlhblZpZXcgZnJvbSBcIi4uL1B1c2gvVHVpamlhblZpZXdcIjtcbmltcG9ydCB7IEZZSERfU2RrIH0gZnJvbSBcIi4uL1dYU0RLL0ZZSERfU2RrXCI7XG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL1dYU0RLL3R0YWRcIjtcblxuZXhwb3J0IGNsYXNzIE1haW5QYW5lbCBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2xcbntcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiTWFpblBhbmVsXCI7XG5cbiAgICBjX3N0YXRlOmZhaXJ5Z3VpLkNvbnRyb2xsZXI7XG4gICAgbG9hZF9jbGlja3BhbmVsOmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgbG9hZF9zdGFydDpmYWlyeWd1aS5HTG9hZGVyO1xuICAgIHR4dF9sdjpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgIHByb19kaXM6ZmFpcnlndWkuR1Byb2dyZXNzQmFyO1xuICAgIHR4dF9taW5nY2k6ZmFpcnlndWkuR1RleHRGaWVsZDtcbiAgICB0eHRfZ29sZDpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgIFNraW5CdG46ZmFpcnlndWkuR0J1dHRvbjtcbiAgICBNb3JlR2FtZUJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xuICAgIEV4aXRCdG46ZmFpcnlndWkuR0J1dHRvbjtcbiAgICBMb3R0ZXJ5QnRuOmZhaXJ5Z3VpLkdCdXR0b247XG4gICAgU2V0QnRuOmZhaXJ5Z3VpLkdCdXR0b247XG5cbiAgICBNb3JlRnVuQnRuU2NhbGU6ZmFpcnlndWkuVHJhbnNpdGlvbjtcblxuICAgIC8v5pu05aSa5aW9546p5oyJ6ZKuXG4gICAgTW9yZUZ1bkJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xuXG4gICAgLy/nmq7ogqTmjInpkq7liqjmlYhcbiAgICBTa2luQW5pOmZhaXJ5Z3VpLlRyYW5zaXRpb247XG4gICAgLy/mm7TlpJrlpb3njqnmjInpkq7liqjmlYhcbiAgICBNb3JlQW5pOmZhaXJ5Z3VpLlRyYW5zaXRpb247XG4gICAgLy/mir3lpZbmjInpkq7liqjmlYhcbiAgICBMb3R0ZXJ5QW5pOmZhaXJ5Z3VpLlRyYW5zaXRpb247XG5cbiAgICBwcml2YXRlIGFnZW5jeXVzZXJtZXNzYWdlOkFnZW5jeVVzZXJNZXNzYWdlO1xuXG4gICAgY29uc3RydWN0b3IoKSBcbiAgICB7IFxuICAgICAgICBzdXBlcihcIm1haW5cIixcIm1haW52aWV3XCIpOyBcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVVzZXJEYXRhSGFuZGxlcigpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMudHh0X2dvbGQudGV4dCA9IHRoaXMuYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGEuTW9uZXkudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJldHVybm1haW5IYW5kbGVyKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gdGhpcy5hZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcbiAgICAgICAgLy8gaWYoIFJvbGVEYXRhLm5vd2xldmVsIDw9IDIgKVxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gZWxzZVxuICAgICAgICAvLyB7XG4gICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDE7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgICAvLyDkuIDlj6rlh6Tlh7DnmoTliIbovqjnjofmmK81NTAgKiA0MDBcbiAgICAgcHJpdmF0ZSBwaG9lbml4V2lkdGg6IG51bWJlciA9IDU1MDtcbiAgICAgcHJpdmF0ZSBwaG9lbml4SGVpZ2h0OiBudW1iZXIgPSA0MDA7XG5cbiAgICAgcHJpdmF0ZSBiZ0NvbG9yVHdlZW5lcjpMYXlhLlR3ZWVuID0gbmV3IExheWEuVHdlZW4oKTtcbiAgICAgcHJpdmF0ZSBncmFkaWVudEludGVydmFsOiBudW1iZXIgPSAyMDAwO1xuICAgICBwcml2YXRlIGJnQ29sb3JDaGFubmVsczogYW55ID0geyByOiA5OSwgZzogMCwgYjogMHhGRiB9O1xuICAgIHByaXZhdGUgY3JlYXRlUGhvZW5peGVzKCk6IHZvaWQge1xuICAgICAgICB2YXIgc2NhbGVGYWN0b3I6IG51bWJlciA9IE1hdGgubWluKFxuICAgICAgICAgICAgTGF5YS5zdGFnZS53aWR0aCAvICh0aGlzLnBob2VuaXhXaWR0aCAqIDIpLFxuICAgICAgICAgICAgTGF5YS5zdGFnZS5oZWlnaHQgLyB0aGlzLnBob2VuaXhIZWlnaHQpO1xuXG4gICAgICAgIC8vIOWKoOS6hua3t+WQiOaooeW8j+eahOWHpOWHsFxuICAgICAgICB2YXIgYmxlbmRlZFBob2VuaXg6TGF5YS5BbmltYXRpb24gXG4gICAgICAgIGJsZW5kZWRQaG9lbml4LmJsZW5kTW9kZSA9IFwibGlnaHRlclwiO1xuICAgICAgICBibGVuZGVkUGhvZW5peC5zY2FsZShzY2FsZUZhY3Rvciwgc2NhbGVGYWN0b3IpO1xuICAgICAgICBibGVuZGVkUGhvZW5peC55ID0gKExheWEuc3RhZ2UuaGVpZ2h0IC0gdGhpcy5waG9lbml4SGVpZ2h0ICogc2NhbGVGYWN0b3IpIC8gMjtcblxuICAgICAgICAvLyDmraPluLjmqKHlvI/nmoTlh6Tlh7BcbiAgICAgICAgdmFyIG5vcm1hbFBob2VuaXg6TGF5YS5BbmltYXRpb247XG4gICAgICAgIG5vcm1hbFBob2VuaXguc2NhbGUoc2NhbGVGYWN0b3IsIHNjYWxlRmFjdG9yKTtcbiAgICAgICAgbm9ybWFsUGhvZW5peC54ID0gdGhpcy5waG9lbml4V2lkdGggKiBzY2FsZUZhY3RvcjtcbiAgICAgICAgbm9ybWFsUGhvZW5peC55ID0gKExheWEuc3RhZ2UuaGVpZ2h0IC0gdGhpcy5waG9lbml4SGVpZ2h0ICogc2NhbGVGYWN0b3IpIC8gMjtcbiAgICB9XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgXG5cbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLkV4aXRCdG4udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLk1vcmVGdW5CdG4udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLk1vcmVHYW1lQnRuLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdHRhZC5TaG93YmFubmVyKCk7XG4gICAgICAgIC8vIExheWEudGltZXIub25jZSg1MDAsdGhpcywoKT0+e1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJtYWlu55WM6Z2i55m95ZCN5Y2VLS0tLVwiLEZZSERfU2RrLmlzd2hpdGUpO1xuICAgICAgICAvLyAgICAgaWYoRllIRF9TZGsuaXN3aGl0ZSl7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5FeGl0QnRuLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgZWxzZXtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLkV4aXRCdG4udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9KVxuICAgICAgICB0aGlzLk1vcmVGdW5CdG5TY2FsZSA9IHRoaXMuZ2V0VHJhbnNpdGlvbkJ5TmFtZShcIm1vcmVmdW5idG5zY2FsZVwiKTtcbiAgICAgICAgXG4gICAgICAgIExheWEudGltZXIubG9vcCgxMDAwLHRoaXMsdGhpcy5wbGF5YW5pbWF0b3IyKTtcbiAgICAgICAgdGhpcy5Ta2luQW5pID0gdGhpcy5Ta2luQnRuLmdldFRyYW5zaXRpb24oXCJza2luYW5pXCIpO1xuICAgICAgICB0aGlzLkxvdHRlcnlBbmkgPSB0aGlzLkxvdHRlcnlCdG4uZ2V0VHJhbnNpdGlvbihcImxvdHRlcnlhbmlcIik7XG4gICAgICAgIHRoaXMuTW9yZUFuaSA9IHRoaXMuTW9yZUdhbWVCdG4uZ2V0VHJhbnNpdGlvbihcIm1vcmVhbmlcIik7XG4gICAgICAgIExheWEudGltZXIubG9vcCgzMDAwLHRoaXMsdGhpcy5wbGF5YW5pbWF0b3IpO1xuXG4gICAgICAgIHRoaXMuYWdlbmN5dXNlcm1lc3NhZ2UgPSB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApO1xuICAgICAgICBQcm9wTWFuYWdlci5wcm9famluZHUgPSB0aGlzLnByb19kaXM7XG4gICAgICAgIFByb3BNYW5hZ2VyLnR4dF9taW5nY2kgPSB0aGlzLnR4dF9taW5nY2k7XG4gICAgICAgIHRoaXMuY19zdGF0ZSA9IHRoaXMuZ2V0Q29udHJvbGxlckJ5QmFtZSggXCJjX3N0YXRlXCIgKTtcbiAgICAgICAgR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5zZXRDbGlja1BhbmVsKCB0aGlzLmxvYWRfY2xpY2twYW5lbCApO1xuICAgICAgICB0aGlzLnJldHVybm1haW5IYW5kbGVyKCk7XG4gICAgICAgIHRoaXMudXBkYXRlVXNlckRhdGFIYW5kbGVyKCk7XG4gICAgfVxuICAgIHBsYXlhbmltYXRvcigpe1xuICAgICAgICB0aGlzLlNraW5BbmkucGxheShudWxsLDEpO1xuICAgICAgICB0aGlzLkxvdHRlcnlBbmkucGxheShudWxsLDEpO1xuICAgICAgICB0aGlzLk1vcmVBbmkucGxheShudWxsLDEpO1xuICAgIH1cbiAgICBwbGF5YW5pbWF0b3IyKCl7XG4gICAgICAgIHRoaXMuTW9yZUZ1bkJ0blNjYWxlLnBsYXkobnVsbCwxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNob3VqaWFuZ2NsaWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdHRhZC5DbGVhcigpO1xuICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeUxvdHRlcnkgKSBhcyBBZ2VuY3lMb3R0ZXJ5ICkub3BlblZpZXcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHR1aWppYW5jbGljaygpOnZvaWRcbiAgICB7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggVHVpamlhblZpZXcgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNraW5jbGljaygpOnZvaWRcbiAgICB7XG4gICAgICAgIHR0YWQuQ2xlYXIoKTtcbiAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lTa2luICkgYXMgQWdlbmN5U2tpbiApLm9wZW52aWV3KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtb3JlY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICAvLyBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcbiAgICAgICAgdHRhZC5DcmVhdGVNb3JlR2FtZUJ0bigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYnRuY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICB0dGFkLkNsZWFyKCk7XG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMjtcbiAgICAgICAgdGhpcy50eHRfbHYudGV4dCA9IHRoaXMuYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGEuZ2V0Tm93U2VydmVyTGV2ZWwoKS50b1N0cmluZygpO1xuICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeUluR2FtZSApIGFzIEFnZW5jeUluR2FtZSApLnN0YXJ0R2FtZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Y2xpY2soKTp2b2lke1xuICAgICAgICBcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSB0aWxlZE1hcDpMYXlhLlRpbGVkTWFwO1xuICAgIHByaXZhdGUgbGF5ZXI6TGF5YS5NYXBMYXllcjtcbiAgICBwcml2YXRlIHNwcml0ZTpMYXlhLlNwcml0ZTtcbiAgICBwcml2YXRlIG1hcExvYWRlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXllciA9IHRoaXMudGlsZWRNYXAuZ2V0TGF5ZXJCeUluZGV4KDApO1xuXG4gICAgICAgIHZhciByYWRpdXNYOiBudW1iZXIgPSAzMjtcbiAgICAgICAgdmFyIHJhZGl1c1k6IG51bWJlciA9IE1hdGgudGFuKDE4MCAvIE1hdGguUEkgKiAzMCkgKiByYWRpdXNYO1xuICAgICAgICB2YXIgY29sb3I6IHN0cmluZyA9IFwiI0ZGN0Y1MFwiO1xuICAgICAgICB0aGlzLnNwcml0ZSA9IG5ldyBMYXlhLlNwcml0ZSgpO1xuICAgICAgICB0aGlzLnNwcml0ZS5ncmFwaGljcy5kcmF3TGluZSgwLCAwLCAtcmFkaXVzWCwgcmFkaXVzWSwgY29sb3IpO1xuICAgICAgICB0aGlzLnNwcml0ZS5ncmFwaGljcy5kcmF3TGluZSgwLCAwLCByYWRpdXNYLCByYWRpdXNZLCBjb2xvcik7XG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKC1yYWRpdXNYLCByYWRpdXNZLCAwLCByYWRpdXNZICogMiwgY29sb3IpO1xuICAgICAgICB0aGlzLnNwcml0ZS5ncmFwaGljcy5kcmF3TGluZShyYWRpdXNYLCByYWRpdXNZLCAwLCByYWRpdXNZICogMiwgY29sb3IpO1xuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMuc3ByaXRlKTtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubG9hZF9zdGFydCxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5idG5jbGljayApO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLlNraW5CdG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuc2tpbmNsaWNrICk7XG4gICAgICAgIC8vIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuTW9yZUdhbWVCdG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMubW9yZWNsaWNrICk7XG4gICAgICAgIC8vIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuTW9yZUZ1bkJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5tb3JlY2xpY2sgKTtcbiAgICAgICAgLy8gdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5FeGl0QnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLnR1aWppYW5jbGljayApO1xuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggR2FtZVN0YXRlLnJldHVybk1haW5WaWV3LHRoaXMsdGhpcy5yZXR1cm5tYWluSGFuZGxlciApO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLkxvdHRlcnlCdG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuY2hvdWppYW5nY2xpY2sgKTtcbiAgICAgICAgdGhpcy5hZGREYXRhRXZlbnQoIFVzZXJJbmZvRXZlbnQuVXNlckluZm9FdmVudF91cGRhdGVVc2VyRGF0YSx0aGlzLHRoaXMudXBkYXRlVXNlckRhdGFIYW5kbGVyICk7XG4gICAgfVxuXG4gICAgXG5cbn0iLCJpbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcbmltcG9ydCB7Vmlld0FjdGlvbn0gZnJvbSBcIi4uL3V0aWxzL1ZpZXdBY3Rpb25cIjtcbmltcG9ydCB7QWdlbmN5U2tpbn0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lTa2luXCI7XG5pbXBvcnQge1NraW5JdGVtfSBmcm9tIFwiLi4vdXRpbHMvU2tpbkl0ZW1cIjtcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XG5pbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUmVzb3VyY2VDb250cm9sXCI7XG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcbmltcG9ydCB7Q2hhcmFjdGVyU3RhdGV9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclN0YXRlXCI7XG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQge0NoYXJhY3RlclBvb2x9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclBvb2xcIjtcbmltcG9ydCB7UGxheWVyfSBmcm9tIFwiLi4vR2FtZS9QbGF5ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNraW5QYW5lbCBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2wgXG57XG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIlNraW5QYW5lbFwiO1xuICAgIGNfdGl0bGU6ZmFpcnlndWkuQ29udHJvbGxlcjtcbiAgICBsaXN0XzA6ZmFpcnlndWkuR0xpc3Q7XG4gICAgYnRuX2Nsb3NlOmZhaXJ5Z3VpLkdCdXR0b247XG4gICAgcHJpdmF0ZSBfdWkzRFNjZW5lOkxheWEuU2NlbmUzRDtcbiAgICBwcml2YXRlIF91aWNhcm1hM0Q6TGF5YS5DYW1lcmE7XG4gICAgLy8gcHJpdmF0ZSBfdWlsaWdodDpMYXlhLkRpcmVjdGlvbkxpZ2h0O1xuICAgIHByaXZhdGUgYWdlbmN5c2tpbjpBZ2VuY3lTa2luO1xuICAgIHByaXZhdGUgX3JvbGVtbzpMYXlhLlNwcml0ZTNEO1xuICAgIHByaXZhdGUgX2lzZGVzdG9yeXM6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIGNvbnN0cnVjdG9yKCkgXG4gICAgeyBcbiAgICAgICAgc3VwZXIoIFwibWFpblwiLFwic2tpbnZpZXdcIixmYWxzZSxWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZSwwICk7IFxuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2lzZGVzdG9yeXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jX3RpdGxlID0gdGhpcy5nZXRDb250cm9sbGVyQnlCYW1lKCBcImNfdGl0bGVcIiApO1xuICAgICAgICB0aGlzLmFnZW5jeXNraW4gPSB0aGlzLmdldFByb3h5KCBBZ2VuY3lTa2luICk7XG4gICAgICAgIHRoaXMubGlzdF8wLnNldFZpcnR1YWwoKTtcbiAgICAgICAgdGhpcy5saXN0XzAuaXRlbVJlbmRlcmVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSggdGhpcyx0aGlzLml0ZW1saXN0cmVuZGVyLG51bGwsZmFsc2UgKTtcbiAgICAgICAgdGhpcy5jX3RpdGxlLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgICB0aGlzLm9uY2hhbmdlKCk7XG4gICAgICAgIC8v5re75YqgM0TlnLrmma9cbiAgICAgICAgdGhpcy5fdWkzRFNjZW5lID0gdGhpcy5kaXNwbGF5T2JqZWN0LmFkZENoaWxkQXQobmV3IExheWEuU2NlbmUzRCgpLDApIGFzIExheWEuU2NlbmUzRDtcbiAgICAgICAgLy/mt7vliqDnhafnm7jmnLpcbiAgICAgICAgdGhpcy5fdWljYXJtYTNEID0gKHRoaXMuX3VpM0RTY2VuZS5hZGRDaGlsZChuZXcgTGF5YS5DYW1lcmEoMCwgMC4xLCA4MCkpKSBhcyBMYXlhLkNhbWVyYTtcbiAgICAgICAgLy8gdGhpcy5fdWljYXJtYTNELmNsZWFyQ29sb3IgPSBudWxsO1xuICAgICAgICB0aGlzLl91aWNhcm1hM0Qudmlld3BvcnQgPSBuZXcgTGF5YS5WaWV3cG9ydCh0aGlzLngsdGhpcy55LHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO1xuICAgICAgICB0aGlzLl91aWNhcm1hM0QudHJhbnNmb3JtLnRyYW5zbGF0ZShuZXcgTGF5YS5WZWN0b3IzKDAsMS4yLDUpLGZhbHNlKTtcblxuICAgICAgICAvLyAvL+a3u+WKoOaWueWQkeWFiVxuICAgICAgICAvLyB0aGlzLl91aWxpZ2h0ID0gUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5EaXJlY3Rpb25MaWdodCgpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0O1xuICAgICAgICAvLyB0aGlzLl91aWxpZ2h0LmNvbG9yID0gbmV3IExheWEuVmVjdG9yMygwLjYsMC42LDAuNik7XG4gICAgICAgIC8vIHRoaXMuX3VpbGlnaHQudHJhbnNmb3JtLndvcmxkTWF0cml4LnNldEZvcndhcmQobmV3IExheWEuVmVjdG9yMygxLCAtMSwgMCkpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlcm9sZUhhbmRsZXIoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fY2xvc2UsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmNfdGl0bGUsZmFpcnlndWkuRXZlbnRzLlNUQVRFX0NIQU5HRUQsdGhpcyx0aGlzLm9uY2hhbmdlICk7XG4gICAgICAgIHRoaXMuYWRkRGF0YUV2ZW50KCBHYW1lU3RhdGUudXBkYXRlU0tpblZpZXcsdGhpcyx0aGlzLm9uY2hhbmdlICk7XG4gICAgICAgIHRoaXMuYWRkRGF0YUV2ZW50KCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkLHRoaXMsdGhpcy51cGRhdGVyb2xlSGFuZGxlciApO1xuICAgIH1cblxuICAgIFxuXG4gICAgcHJpdmF0ZSBDbGVhckNoYXJhY3RlcigpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl9yb2xlbW8gKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgc2NyaXB0OlBsYXllciA9IHRoaXMuX3JvbGVtby5nZXRDb21wb25lbnQoIFBsYXllciApIGFzIFBsYXllcjtcbiAgICAgICAgICAgIENoYXJhY3RlclBvb2wuQ2xlYXJDaGFyYWN0ZXIoIHRoaXMuX3JvbGVtbyxzY3JpcHQucmVzb3VzZU5hbWUsc2NyaXB0ICk7XG4gICAgICAgICAgICB0aGlzLl9yb2xlbW8gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbmNsb3NlZnVuKCk6dm9pZFxuICAgIHtcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIFNraW5QYW5lbCApO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5faXNkZXN0b3J5cyA9IHRydWU7XG4gICAgICAgIHRoaXMuQ2xlYXJDaGFyYWN0ZXIoKTtcbiAgICAgICAgaWYoIHRoaXMuX3VpY2FybWEzRCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3VpY2FybWEzRC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl91aWNhcm1hM0QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmKCB0aGlzLl91aTNEU2NlbmUgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl91aTNEU2NlbmUuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fdWkzRFNjZW5lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbmNoYW5nZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLmNfdGl0bGUuc2VsZWN0ZWRJbmRleCA9PSAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5saXN0XzAubnVtSXRlbXMgPSB0aGlzLmFnZW5jeXNraW4ucGlmdUFyci5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGl0ZW1saXN0cmVuZGVyKCBpbmRleDpudW1iZXIsaXRlbTpTa2luSXRlbSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLmNfdGl0bGUuc2VsZWN0ZWRJbmRleCA9PSAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIGluZGV4IDwgdGhpcy5hZ2VuY3lza2luLnBpZnVBcnIubGVuZ3RoIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLmFnZW5jeXNraW4ucGlmdUFycltpbmRleF0gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlcm9sZUhhbmRsZXIoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSB0aGlzLmFnZW5jeXNraW4uUm9sZURhdGE7XG4gICAgICAgIHRoaXMuQ2xlYXJDaGFyYWN0ZXIoKTtcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xuICAgICAgICBwYXRoQXJyLnB1c2goIHsgdXJsOkFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggUm9sZURhdGEucm9sZUNmZy5uYW1lICl9ICk7XG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkZXIzREFyciggcGF0aEFycix0aGlzLHRoaXMubG9hZGNvbXBsZXRlLG51bGwsdHJ1ZSxSb2xlRGF0YS5yb2xlQ2ZnLm5hbWUgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9vdXQ6TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjtcbiAgICBwcml2YXRlIGxvYWRjb21wbGV0ZSggcmVzb3VzZW5hbWU6c3RyaW5nICk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gdGhpcy5hZ2VuY3lza2luLlJvbGVEYXRhO1xuICAgICAgICBpZiggIXRoaXMuX2lzZGVzdG9yeXMgJiYgdGhpcy5fdWkzRFNjZW5lICYmIHJlc291c2VuYW1lID09IFJvbGVEYXRhLnJvbGVDZmcubmFtZSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3JvbGVtbyA9IENoYXJhY3RlclBvb2wuQWRkQ2hhcmFjdGVyKCByZXNvdXNlbmFtZSxQbGF5ZXIsdGhpcy5fdWkzRFNjZW5lICk7XG4gICAgICAgICAgICB0aGlzLl9yb2xlbW8udHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggMCwyLDAgKTtcbiAgICAgICAgICAgIExheWEuUXVhdGVybmlvbi5jcmVhdGVGcm9tQXhpc0FuZ2xlKCBuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApLC0xMzUqMTgwL01hdGguUEksdGhpcy5fb3V0ICk7XG4gICAgICAgICAgICB0aGlzLl9yb2xlbW8udHJhbnNmb3JtLnJvdGF0aW9uID0gdGhpcy5fb3V0O1xuICAgICAgICAgICAgKCB0aGlzLl9yb2xlbW8uZ2V0Q29tcG9uZW50KCBQbGF5ZXIgKSBhcyBQbGF5ZXIgKS5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnN0YW5kICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgIFxuXG59IiwiaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4uL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xuaW1wb3J0IHtWaWV3QWN0aW9ufSBmcm9tIFwiLi4vdXRpbHMvVmlld0FjdGlvblwiO1xuaW1wb3J0IHtTa2luRGF0YX0gZnJvbSBcIi4uL0RhdGEvU2tpbkRhdGFcIjtcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XG5pbXBvcnQge0FnZW5jeVRyaWFsfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVRyaWFsXCI7XG5pbXBvcnQge0d1YW5nR2FvfSBmcm9tIFwiLi4vV1hTREsvR3VhbmdHYW9cIjtcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vV1hTREsvdHRhZFwiO1xuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBUcmlhbFBhbmVsIGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBcbntcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiVHJpYWxQYW5lbFwiO1xuXG5cbiAgICBsb2FkX2ljb246ZmFpcnlndWkuR0xvYWRlcjtcbiAgICBidG5fdmlkZW86ZmFpcnlndWkuR0J1dHRvbjtcbiAgICBidG5fY2xvc2U6ZmFpcnlndWkuR0xvYWRlcjtcblxuICAgIHNraW5hcnI6QXJyYXk8U2tpbkRhdGE+O1xuICAgIHByaXZhdGUgX3NlbGVjdHZvOlNraW5EYXRhO1xuICAgIHByaXZhdGUgYWdlbmN5dHJpYWw6QWdlbmN5VHJpYWw7XG5cbiAgICBjb25zdHJ1Y3RvciggYXJyOkFycmF5PFNraW5EYXRhPiApIFxuICAgIHsgXG4gICAgICAgIHN1cGVyKFwibWFpblwiLFwic2hpeW9uZ1ZpZXdcIixmYWxzZSxWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZSwxKTsgXG4gICAgICAgIHRoaXMuc2tpbmFyciA9IGFycjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5hZ2VuY3l0cmlhbCA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeVRyaWFsICk7XG4gICAgICAgIHZhciBpbmRleDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLHRoaXMuc2tpbmFyci5sZW5ndGgtMSApO1xuICAgICAgICB0aGlzLl9zZWxlY3R2byA9IHRoaXMuc2tpbmFyclsgaW5kZXggXTtcbiAgICAgICAgdGhpcy5sb2FkX2ljb24udXJsID0gQXNzZXRQYXRoLmdldHJvbGVpY29uKCB0aGlzLl9zZWxlY3R2by5yb2xlQ0ZHLmljb24gKTtcbiAgICAgICAgLy8gcGluZ3RhaXV0aWxzLkluc3RhbmNlLmNyZWF0ZUJhbm5lciggXCJTaGlZb25nVmlld1wiICk7XG4gICAgICAgIEd1YW5nR2FvLkNoZWF0QmFubmVyKHRoaXMuYnRuX2Nsb3NlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fY2xvc2UsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl92aWRlbyxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy52aWRlb2Z1biApO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlkZW9mdW4oKTp2b2lkXG4gICAge1xuICAgICAgICAvLyBwaW5ndGFpdXRpbHMuSW5zdGFuY2UucGxheVZpZGVvKCBcIlwiLHRoaXMsdGhpcy52aWRlb2NhbGxiYWNrICk7XG4gICAgICAgIHRoaXMudmlkZW9jYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlkZW9jYWxsYmFjaygpOnZvaWRcbiAgICB7XG4gICAgICAgIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcbiAgICAgICAgICAgIGlmKGlzTG9hZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5hZ2VuY3l0cmlhbC5FeGl0UGFuZWwoIHRoaXMuX3NlbGVjdHZvICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKVxuICAgIH1cblxuICAgIHByaXZhdGUgb25jbG9zZWZ1bigpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuYWdlbmN5dHJpYWwuRXhpdFBhbmVsKCBudWxsICk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXG4gICAge1xuICAgICAgICAvLyBHdWFuZ0dhby5DbGVhcigpO1xuICAgICAgICB0dGFkLkNsZWFyKCk7XG4gICAgICAgIHN1cGVyLmRlc3RvcnkoKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgTGF5T1VUIH0gZnJvbSBcIi4uL3V0aWxzL0xheU9VVFwiO1xuaW1wb3J0IHsgTGF5b3V0Q29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL0xheW91dENvbnRyb2xcIjtcbmltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xuXG5cbi8qKlxuICpcbiAqIEBhdXRob3IgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgVmlld01hbmFnZXIgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxue1xuICAgIFxuICAgIHByaXZhdGUgc3RhdGljIGluczogVmlld01hbmFnZXI7XG4gICAgLyoqXG4gICAgICog5bey5rOo5YaM55qEVUlcbiAgICAgKi9cbiAgICBwcml2YXRlIF92aWV3czogYW55O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcigpIFxuXHR7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIFZpZXdNYW5hZ2VyLmlucyA9IHRoaXM7XG5cdH1cblx0XG5cdHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6Vmlld01hbmFnZXJcblx0e1xuXHQgICAgaWYoIFZpZXdNYW5hZ2VyLmlucyA9PSBudWxsIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3TWFuYWdlcigpOyAgICBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVmlld01hbmFnZXIuaW5zO1xuXHR9XG5cbiAgICBwdWJsaWMgaW5pdCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX3ZpZXdzID0ge307XG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXRFdmVudCgpOnZvaWRcbiAgICB7XG4gICAgfVxuXHRcbiAgICAvKipcbiAgICAgKiAgdmlldyDop4blm77lr7nosaHnsbtcbiAgICAgKiAgZGF0YSDnu5HlrprmlbDmja4g77yIIGRhdGEg5aaC5p6c5LiN5Li656m677yM5Luj6KGo5p6E6YCg5Ye95pWw5Lyg5Y+CIO+8iVxuICAgICAqICBsYXllciDlsYLnuqdcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkKCB2aWV3OmFueSxkYXRhOmFueSA9IG51bGwsbGF5ZXI6IHN0cmluZyA9IExheU9VVC5VSSApOmFueVxuXHR7XG4gICAgICAgIGlmKCB2aWV3LmtleSA9PSBudWxsIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmlldyBoYXZlIG5vIGtleVwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHlwZTogc3RyaW5nID0gdmlldy5rZXk7XG4gICAgICAgIGlmKHRoaXMuX3ZpZXdzW3R5cGVdKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgaXRlbXZpZXc6ZmFpcnlndWkuR0NvbXBvbmVudCA9IHRoaXMuX3ZpZXdzW3R5cGVdO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW12aWV3O1xuICAgICAgICB9XG4gICAgICAgIHZhciBkOiBhbnk7XG4gICAgICAgIGlmKGRhdGEgIT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGQgPSBuZXcgdmlldyhkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGQgPSBuZXcgdmlldygpO1xuICAgICAgICB9XG4gICAgICAgIGQudmlld0tleSA9IHZpZXc7XG4gICAgICAgIGQuZ2FtZUxheWVyID0gbGF5ZXI7XG4gICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UuQWRkTGF5ZXJCeU5hbWUoIGQsbGF5ZXIgKTtcbiAgICAgICAgdGhpcy5fdmlld3NbdHlwZV0gPSBkO1xuICAgICAgICByZXR1cm4gZDtcblx0fVxuICAgIFxuICAgIC8qKlxuICAgICAqIOWFs+mXreeVjOmdolxuICAgICAqIEBwYXJhbSB2aWV3IOeVjOmdoiBcbiAgICAgKiBAcGFyYW0gaXNiZ2Nsb3NlIOaYr+WQpuaYr+eCueWHu+iDjOaZr+WFs+mXreeahOeKtuaAgSBcbiAgICAgKiBAcGFyYW0gaXNwbGF5QW5tbyDmmK/lkKbmkq3mlL7lhbPpl63liqjnlLvvvIgg5Li76KaB55So5LqO5by65Yi25YWz6ZetIO+8iVxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZSggdmlldzogYW55LGlzYmdjbG9zZTpib29sZWFuPWZhbHNlLGlzcGxheUFubW86Ym9vbGVhbj10cnVlICk6dm9pZFxuXHR7XG4gICAgICAgIHZhciB0eXBlOiBzdHJpbmcgPSB2aWV3LmtleTtcbiAgICAgICAgdmFyIGl0ZW06IFBhbmVsQmFzZUNvbnRyb2wgPSB0aGlzLl92aWV3c1t0eXBlXTtcbiAgICAgICAgaWYoIWl0ZW0pIFxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5DbGVhckxheWVyQnlOYW1lKCBpdGVtLmdhbWVMYXllciApO1xuICAgICAgICBpZihpc3BsYXlBbm1vKVxuICAgICAgICB7XG4gICAgICAgICAgICBpdGVtLkV4aXRWaWV3KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBpdGVtLmRlc3RvcnkoKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5fdmlld3NbdHlwZV07XG5cdH1cblxuICAgIHB1YmxpYyBvbnJlc2l6ZSggdzpudW1iZXIsaDpudW1iZXIgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5fdmlld3MgIT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBpdGVtdmlldzpQYW5lbEJhc2VDb250cm9sO1xuICAgICAgICAgICAgZm9yKCB2YXIgaXRlbSBpbiB0aGlzLl92aWV3cyApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaXRlbXZpZXcgPSB0aGlzLl92aWV3c1tpdGVtXTtcbiAgICAgICAgICAgICAgICBpdGVtdmlldy5zZXRTaXplKCB3LGggKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblx0XG4gICAgcHVibGljIGdldFZpZXcoIHZpZXc6IGFueSApOmFueVxuXHR7XG4gICAgICAgIHZhciB0eXBlOiBzdHJpbmcgPSB2aWV3LmtleTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdzW3R5cGVdO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBSZWNvbW1lbmQgfSBmcm9tIFwiLi4vUHVzaC9SZWNvbW1lbmRWaWV3XCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IENob3V0aVBhblZpZXcgZnJvbSBcIi4uL1B1c2gvQ2hvdXRpUGFuVmlld1wiO1xyXG5cclxuLy8gaW1wb3J0IHsgTWFpbiB9IGZyb20gXCIuLi9NYWluXCI7XHJcbi8vIGltcG9ydCBMaXN0SXRlbSBmcm9tIFwiLi4vR2FtZVRvb2xzL0xpc3RJdGVtXCI7XHJcbi8vIGltcG9ydCB7IFBhbmVsTWFuYWdlciwgUGFuZWxUeXBlIH0gZnJvbSBcIi4uL1ZpZXcvUGFuZWxNYW5hZ2VyXCI7XHJcbi8vIGltcG9ydCBHdWFuZ0dhbyBmcm9tIFwiLi9HdWFuZ0dhb1wiO1xyXG4vLyBpbXBvcnQgeyBXWFNESyB9IGZyb20gXCIuL1dYU0RLXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRllIRF9TZGsge1xyXG4gICAgcHVibGljIHN0YXRpYyBBZF9DbGlja1R5cGUgPSB7XHJcbiAgICAgICAgVmlkZW86IFwidmlkZW9fY2xpY2tcIixcclxuICAgICAgICBXYXRjaDogXCJ3YXRjaFwiLFxyXG4gICAgICAgIFNoYXJlOiBcInNoYXJlXCIsXHJcbiAgICAgICAgQmFubmVyOiBcImJhbm5lclwiLFxyXG4gICAgICAgIFB1c2g6IFwicHVzaFwiLFxyXG4gICAgICAgIFB1c2hDbGljazpcImljb25fY2xpY2tcIlxyXG4gICAgfVxyXG5cclxuICAgIC8v5piv5ZCm5Li655m95ZCN5Y2V55So5oi3XHJcbiAgICBwdWJsaWMgc3RhdGljIGlzd2hpdGU6Ym9vbGVhbjtcclxuICAgIC8v5piv5ZCm5Li65paw55So5oi3XHJcbiAgICBwdWJsaWMgc3RhdGljIGlzbmV3dXNlcjpib29sZWFuO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcHVzaERhdGEgPSBbXTtcclxuICAgIHByaXZhdGUgc3RhdGljIG9wZW5pZDogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNIYXZlRGF0ZSA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd0FkID0gXCJTaG93QWRcIjtcclxuICAgIC8v5Yid5aeL5YyWc2RrXHJcbiAgICBwdWJsaWMgc3RhdGljIEluaXRTZGsoKSB7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLnN0YXJ0U2RrKCk7XHJcbiAgICAgICAgRllIRF9TZGsuVXNlckluZm9BdXRoKCk7XHJcbiAgICAgICAgLy8gbGV0IHdoaXRlID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImlzX3doaXRlXCIpO1xyXG4gICAgICAgIC8vIGlmKHdoaXRlKXtcclxuICAgICAgICAvLyAgICAgRllIRF9TZGsuaXN3aGl0ZSA9IHRydWU7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGVsc2V7XHJcbiAgICAgICAgLy8gICAgIEZZSERfU2RrLmdldFdoaXRlQ29uZmlnKCk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyBsZXQgbmV3dXNlciA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJpc19uZXd1c2VyXCIpO1xyXG4gICAgICAgIC8vIGlmKCFuZXd1c2VyKXtcclxuICAgICAgICAvLyAgICAgRllIRF9TZGsuaXNuZXd1c2VyID0gdHJ1ZTtcclxuICAgICAgICAvLyAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImlzX25ld3VzZXJcIixcIjFcIik7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGVsc2V7XHJcbiAgICAgICAgLy8gICAgIEZZSERfU2RrLmlzbmV3dXNlciA9IGZhbHNlO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBGWUhEX1Nkay5QdXNoRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v55So5oi35o6I5p2DXHJcbiAgICBwdWJsaWMgc3RhdGljIFVzZXJJbmZvQXV0aCgpIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5nZXRGeWhkVXNlckluZm8obnVsbCwgZmFsc2UsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5peg5o6I5p2D5Zue6LCDOlwiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQudXNlcikge1xyXG4gICAgICAgICAgICAgICAgRllIRF9TZGsub3BlbmlkID0gZGF0YS5yZXN1bHQudXNlci5vcGVuaWQ7XHJcbiAgICAgICAgICAgICAgICBGWUhEX1Nkay5BdXRoSW5mbygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHN0YXRpYyBBdXRoSW5mbygpIHtcclxuICAgICAgICB2YXIgYXJncyA9IHtcclxuICAgICAgICAgICAgb3BlbmlkOiBGWUhEX1Nkay5vcGVuaWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5sb2dpbkRhdGEoYXJncywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmjojmnYPkuIrmiqXlm57osIM6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgICAgIEZZSERfU2RrLlZhbHVlVXNlcigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVVc2VyKCkge1xyXG4gICAgICAgIHZhciBhcmdzID0ge1xyXG4gICAgICAgICAgICBvcGVuaWQ6IEZZSERfU2RrLm9wZW5pZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLnZhbHVldXNlcihhcmdzLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuacieaViOeUqOaIt+S4iuaKpTpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAgIFxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0V2hpdGVDb25maWcoKXtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkud2hpdGVDb25maWcoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgRllIRF9TZGsuaXN3aGl0ZSA9IGUuZGF0YS5pc193aGl0ZTtcclxuICAgICAgICAgICAgaWYoRllIRF9TZGsuaXN3aGl0ZSl7XHJcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaXNfd2hpdGVcIixcIjFcIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIueZveWQjeWNlS0tLVwiLGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2V0SHVUdWlMaXN0KGxpc3Q6IExheWEuTGlzdCwgc2Nyb2w6IG51bWJlciA9IDEsIHR5cGU6IHN0cmluZyA9IFwiXCIpIHsgLy9zY3JvbCAxOuerlueahCAgMuaoqueahFxyXG4gICAgICAgIGxldCBhcnIgPSB0aGlzLnB1c2hEYXRhO1xyXG4gICAgICAgIGlmICghYXJyIHx8IGFyci5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG4gICAgICAgIGxpc3Quc2VsZWN0RW5hYmxlID0gZmFsc2U7XHJcbiAgICAgICAgc2Nyb2wgPT0gMSA/IGxpc3QudlNjcm9sbEJhclNraW4gPSBcIlwiIDogbGlzdC5oU2Nyb2xsQmFyU2tpbiA9IFwiXCI7XHJcbiAgICAgICAgbGlzdC5yZW5kZXJIYW5kbGVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLnVwZGF0ZUl0ZW0sIFt0eXBlXSwgZmFsc2UpO1xyXG4gICAgICAgIGxpc3QuYXJyYXkgPSBhcnI7XHJcbiAgICAgICAgbGlzdC5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHN0YXRpYyB1cGRhdGVJdGVtKHR5cGU6IHN0cmluZywgY2VsbDogTGF5YS5Cb3gsIGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICAvLyB2YXIgYWRpdGVtID0gY2VsbC5nZXRDb21wb25lbnQoTGlzdEl0ZW0pIGFzIExpc3RJdGVtO1xyXG4gICAgICAgIC8vIGFkaXRlbS5SZWZyZXNoKHR5cGUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL+eCueWHu+S6i+S7tuS4iuaKpVxyXG4gICAgcHVibGljIHN0YXRpYyBDbGlja0FkKGFkX3R5cGU6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql57G75Z6LLS0tXCIsYWRfdHlwZSk7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcclxuICAgICAgICB2YXIgcGFyYW0gPSB7XHJcbiAgICAgICAgICAgIGFkX3R5cGU6IGFkX3R5cGUsXHJcbiAgICAgICAgICAgIC8v5q2k5aSE5re75Yqgb3BlbmlkXHJcbiAgICAgICAgICAgIG9wZW5pZDpGWUhEX1Nkay5vcGVuaWRcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLngrnlh7vlj4LmlbA6XCIgKyBwYXJhbSk7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLmFkdmVydGlzZW1lbnQocGFyYW0sIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi54K55Ye757uT5p6cOlwiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgLy/kupLmjqjkv6Hmga9cclxuICAgIHB1YmxpYyBzdGF0aWMgUHVzaERhdGEoKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcInB1c2hkYXRhLS1cIixNYWluLldYKTtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG4gICAgICAgIHZhciBwYXJhbSA9IHt9O1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5zaGFyZVJlY29tbWVuZChwYXJhbSwgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLng63pl6jmuLjmiI/mlbDmja4tLVwiLGRhdGEpXHJcbiAgICAgICAgICAgIGlmIChkYXRhLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgIEZZSERfU2RrLnB1c2hEYXRhID0gZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgRllIRF9TZGsucHVzaERhdGEuc29ydChGWUhEX1Nkay5MaXN0U29ydCk7XHJcbiAgICAgICAgICAgICAgICBGWUhEX1Nkay5pc0hhdmVEYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8v5q2k5aSE5rS+5Y+R5LqL5Lu277yM5bGV56S65LqS5o6oXHJcbiAgICAgICAgICAgICAgICAvL0V2ZW50TWFuYWdlci5ldmVudChGWUhEX1Nkay5TaG93QWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6I635Y+W5LqS5o6o5L+h5oGvOlwiICsgSlNPTi5zdHJpbmdpZnkoRllIRF9TZGsucHVzaERhdGEpKTtcclxuICAgICAgICAgICAgbmV3IFJlY29tbWVuZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBTaG93SHVUdWlKdW1wKGRhdGEsb3Blbikge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGRhdGEuanVtcF90eXBlID09IDIpIC8v5LqM57u056CB6Lez6L2s5pa55rOVXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnByZXZpZXdJbWFnZSh7IGN1cnJlbnQ6IGRhdGEucXJjb2RlLCB1cmxzOiBbZGF0YS5xcmNvZGVdIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhLmp1bXBfdHlwZSA9PSAxKSAvL+ebtOi3s+aWueazlVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5uYXZpZ2F0ZVRvTWluaVByb2dyYW0oe1xyXG4gICAgICAgICAgICAgICAgYXBwSWQ6IGRhdGEudG9fYXBwaWQsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiBkYXRhLmp1bXBfcGF0aCxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5omT5byA5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrmiqXmiJDlip86XCIgKyBKU09OLnN0cmluZ2lmeShyZXMpKTtcclxuICAgICAgICAgICAgICAgICAgICBGWUhEX1Nkay5QdXNoQ2xpY2soZGF0YS50b19hcHBpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbChyZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKG9wZW4pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGRhdGEuanVtcF90eXBlID09IDApLy/lubPlj7Dot7Povazmlrnms5VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gubmF2aWdhdGVUb01pbmlQcm9ncmFtKHtcclxuICAgICAgICAgICAgICAgIGFwcElkOiBkYXRhLnBsYXRmb3JtX2FwcGlkLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogZGF0YS5qdW1wX3BhdGgsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOaJk+W8gOaIkOWKn1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql5oiQ5YqfOlwiICsgSlNPTi5zdHJpbmdpZnkocmVzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgRllIRF9TZGsuUHVzaENsaWNrKGRhdGEudG9fYXBwaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGZhaWwocmVzKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihvcGVuKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8v5LqS5o6o54K55Ye7XHJcbiAgICBwdWJsaWMgc3RhdGljIFB1c2hDbGljayh0b19hcHBpZCkge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XHJcbiAgICAgICAgdmFyIHBhcmFtID0ge1xyXG4gICAgICAgICAgICBvcGVuaWQ6IEZZSERfU2RrLm9wZW5pZCxcclxuICAgICAgICAgICAgdG9fYXBwaWQ6IHRvX2FwcGlkLFxyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkuc2hhcmVQbGF5KHBhcmFtLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIueCueWHu+S4iuaKpee7k+aenDpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBMaXN0U29ydChhLCBiKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAoTnVtYmVyKGFbXCJwYW5lbFwiXSkgPCBOdW1iZXIoYltcInBhbmVsXCJdKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChOdW1iZXIoYVtcInBhbmVsXCJdKSA9PSBOdW1iZXIoYltcInBhbmVsXCJdKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE51bWJlcihhW1wicGFuZWxcIl0pID4gTnVtYmVyKGJbXCJwYW5lbFwiXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuL1Nka1wiO1xuaW1wb3J0IHsgU2hhcmVVdGlsIH0gZnJvbSBcIi4vU2hhcmVVdGlsXCI7XG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4vUGxheWVyQWNjb3VudFwiO1xuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi9GWUhEX1Nka1wiO1xuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuL3R0YWRcIjtcblxuZXhwb3J0IGNsYXNzIFd4R2FtZUl0ZW1cbntcbiAgICBhcHBOYW1lSGlkZGVuOmJvb2xlYW4gPSBmYWxzZTtcbiAgICBjb2xvcjpzdHJpbmcgPSBcIkM5M0IzQkZGXCI7XG4gICAgc2l6ZTpudW1iZXIgPSAxMDA7XG4gICAgYm9yZGVyV2lkdGg6bnVtYmVyID0gNTA7XG4gICAgYm9yZGVyQ29sb3I6c3RyaW5nID0gXCJBMUEwQTBGRlwiO1xuICAgIGxlZnQ6bnVtYmVyO1xuICAgIHRvcDpudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBHdWFuZ0dhbyBcbntcblxuICAgIHByaXZhdGUgc3RhdGljIGZzYWFzZmFmc3NmYTtcblxuICAgIHByaXZhdGUgc3RhdGljIGN1cmJhbm5lcjtcblxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHZpZGVsQWRVbml0SWQgPSBcImFkdW5pdC0wYzY4NzA4NGM5MDhlZTg5XCI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYmFubmVyQWRVbml0SWQgPSBcImFkdW5pdC04YzJkNTg2MTM1ZmE2ZDRmXCI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWZzZnNhYWZzZnNhOiBib29sZWFuID0gZmFsc2U7XG4gICAgLy/op4blsY/lub/lkYrmmK/lkKbliqDovb3miJDlip9cbiAgICBwcml2YXRlIHN0YXRpYyBhc2Zhc2ZzYWZmc2E6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHN0YXRpYyBnZXQgaGFzYmFubmVyKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgaWYoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5iYW5uZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBoYXN2aWRlbygpOmJvb2xlYW5cbiAgICB7XG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbiAmJiBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnZpZGVvKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgdmlkZW9udW0gPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkdldEdsb2JlXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8v6aKE5YWI5Yqg6L296KeG5bGP5bm/5ZGKXG4gICAgcHVibGljIHN0YXRpYyBJbml0VmlkZW8oKVxuICAgIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4gfHwgIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEudmlkZW8pIHJldHVybjtcblxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmJhbm5lckFkVW5pdElkKTtcblxuICAgICAgICAvL3ZlZGlvXG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVSZXdhcmRlZFZpZGVvQWQoeyBhZFVuaXRJZDogdGhpcy52aWRlbEFkVW5pdElkIH0pO1xuXG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLm9uTG9hZCgoKSA9PiBcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ+a/gOWKseinhumikSDlub/lkYrliqDovb3miJDlip8nKTtcbiAgICAgICAgICAgIHRoaXMuYXNmYXNmc2FmZnNhID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub25FcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmv4DlirHop4blsY/liqDovb3lpLHotKU6XCIgKyBlcnIpO1xuICAgICAgICAgICAgdGhpcy5hc2Zhc2ZzYWZmc2EgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZnNmc2FhZnNmc2EgPSB0cnVlO1xuICAgIH1cblxuICAgIC8v55yL6KeG6aKRXG4gICAgcHVibGljIHN0YXRpYyBTaG93VmlkZW8oY2FsbGJhY2s6IEZ1bmN0aW9uKSBcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmhhc3ZpZGVvKSBcbiAgICAgICAge1xuICAgICAgICAgICAgaWYodGhpcy5hc2Zhc2ZzYWZmc2EpXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2hvd1ZpZGVvQWQ6XCIgKyB0aGlzLmFzZmFzZnNhZmZzYSk7XG5cbiAgICAgICAgICAgIHRoaXMuU2V0VmlkZW9DYWxsQmFjayhjYWxsYmFjayk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLnNob3coKS5jYXRjaChlcnIgPT4gXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5sb2FkKCkudGhlbigoKSA9PiBcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TZXRWaWRlb0NhbGxCYWNrKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIC8vIFNoYXJlVXRpbC5zaGFyZUltYWdlKFwi6KeG6aKR5rKh5pyJ5YiG5LqrXCIsIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgLy8gICAgICwgXCIxXCIpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFxuICAgICAgICB9IFxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGZhbHNlKTtcbiAgICAgICAgICAgIC8vIFNoYXJlVXRpbC5zaGFyZUltYWdlKFwi6KeG6aKR5rKh5pyJ5YiG5LqrXCIsIGNhbGxiYWNrXG4gICAgICAgICAgICAvLyAgICAgICAgICwgXCIxXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgU2V0VmlkZW9DYWxsQmFjayhjYWxsYmFjazpGdW5jdGlvbilcbiAgICB7XG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLm9mZkNsb3NlKCk7XG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLm9uQ2xvc2UocmVzID0+IFxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIua/gOWKseinhumikeWFs+mXrTpcIityZXMuaXNFbmRlZCk7XG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5pc0VuZGVkIHx8IHJlcyA9PT0gdW5kZWZpbmVkKSB7Y2FsbGJhY2sgJiYgY2FsbGJhY2sodHJ1ZSl9XG4gICAgICAgICAgICBlbHNlIHsgY2FsbGJhY2sgJiYgY2FsbGJhY2soZmFsc2UpIH1cbiAgICAgICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLm9mZkNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBjYW5zaG93YmFubmVyID0gdHJ1ZTtcbiAgICAvL+aJk+W8gGJhbm5lclxuICAgIHB1YmxpYyBzdGF0aWMgT3BlbkJhbm5lcihnYXA6IG51bWJlciA9IDAsY2FsbFZhY2s6IEZ1bmN0aW9uID0gbnVsbCwgaXN3YWl0OiBib29sZWFuID0gZmFsc2UpIFxuICAgIHtcbiAgICAgICAgLy8gaWYgKCF0aGlzLmhhc2Jhbm5lcilcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgY2FsbFZhY2sobnVsbCk7XG4gICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgIC8vIH0gXG5cbiAgICAgICAgaWYoIUxheWEuQnJvd3Nlci5vbldlaVhpbilcbiAgICAgICAge1xuICAgICAgICAgICAgY2FsbFZhY2sobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbnNob3diYW5uZXIgPSB0cnVlO1xuICAgICAgICBcbiAgICAgICAgdmFyIGlkZCA9IHRoaXMuYmFubmVyQWRVbml0SWQ7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWRVbml0SWQ6XCIraWRkKTtcbiAgICAgICAgbGV0IG5ld0Jhbm5lciA9IExheWEuQnJvd3Nlci53aW5kb3cud3guY3JlYXRlQmFubmVyQWQoe1xuICAgICAgICAgICAgYWRVbml0SWQ6IGlkZCxcbiAgICAgICAgICAgIHN0eWxlOiBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICB3aWR0aDogNDYwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBuZXdCYW5uZXIub25FcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgIGNhbGxWYWNrKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgbmV3QmFubmVyLm9uTG9hZCgoKSA9PiBcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lciA9IG5ld0Jhbm5lcjtcbiAgICAgICAgICAgIHZhciBoaWdodDogbnVtYmVyID0gdGhpcy5HZXRSZWFsSGlnaHQoZ2FwKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxWYWNrICE9IG51bGwpIFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhbGxWYWNrKGhpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMuY2Fuc2hvd2Jhbm5lciAmJiAhaXN3YWl0KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnNob3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgR2V0UmVhbEhpZ2h0KGdhcClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmN1cmJhbm5lcikgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBpbmZvID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUud2lkdGggPSBpbmZvLndpbmRvd1dpZHRoO1xuXG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zdHlsZS50b3AgPSBpbmZvLndpbmRvd0hlaWdodCAtIHRoaXMuY3VyYmFubmVyLnN0eWxlLnJlYWxIZWlnaHQgLSBnYXA7XG4gICAgICAgICAgICByZXR1cm4gTGF5YS5zdGFnZS5oZWlnaHQgLyBpbmZvLndpbmRvd0hlaWdodCAqIHRoaXMuY3VyYmFubmVyLnN0eWxlLnJlYWxIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL2NsZWFyXG4gICAgc3RhdGljIENsZWFyKClcbiAgICB7XG4gICAgICAgIEd1YW5nR2FvLmNsZWFyVHdlZW4oKTtcbiAgICAgICAgTGF5YS50aW1lci5jbGVhckFsbCh0aGlzKTtcbiAgICAgICAgTGF5YS5Ud2Vlbi5jbGVhckFsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jYW5zaG93YmFubmVyID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmN1cmJhbm5lcikgdGhpcy5jdXJiYW5uZXIuaGlkZSgpO1xuXG4gICAgICAgIC8vIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XG4gICAgICAgIC8vIGlmICh0aGlzLmN1cmJhbm5lcikgdGhpcy5jdXJiYW5uZXIuaGlkZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGlkZWJhbm5lcigpIFxuICAgIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5oaWRlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2hvd2Jhbm5lcigpIFxuICAgIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5zaG93KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgY2FuY2hlYXQoKTpib29sZWFuXG5cdHtcbiAgICAgICAgaWYoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5jaGVhdCl7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmKCFQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLmNoZWF0KVxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImNoZWF0OmZhbHNlLT4gQ3VyQWNjb3VudERhdGEuY2hlYXQgIT0gMVwiKTtcbiAgICAgICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gfVxuXHRcdC8vIHZhciBjaGVja3NjZW5jZSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuY2hlY2tzY2VuY2U7XG4gICAgICAgIC8vIGlmIChjaGVja3NjZW5jZSA9PSBmYWxzZSlcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJjaGVhdDp0cnVlLT4gXCIgKyBXeEFwaS5zY2VuZVZhbHVlKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGlmIChXeEFwaS5zY2VuZVZhbHVlID09IFwiMTAzN1wiIHx8IFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDU4XCJ8fCBXeEFwaS5zY2VuZVZhbHVlID09IFwiMTA2N1wiIHx8IFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDk1XCIpIFxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImNoZWF0OnRydWUtPiBcIiArIFd4QXBpLnNjZW5lVmFsdWUpO1xuICAgICAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVhdDpmYWxzZS0+IFwiICsgV3hBcGkuc2NlbmVWYWx1ZSk7XG4gICAgICAgIC8vIHJldHVybiBmYWxzZTtcbiAgICB9XG5cblxuICAgIHN0YXRpYyBiYW5uZXJoaWd0ID0gMDtcbiAgICBwdWJsaWMgc3RhdGljIFNldFBvc0Jhbm5lcihidG46TGF5YS5VSUNvbXBvbmVudCxjb21wbGV0ZTpGdW5jdGlvbilcbiAgICB7XG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vblBDKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb21wbGV0ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW5mbyA9IExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhpbmZvKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhidG4pO1xuICAgICAgICAvL2NvbnNvbGUubG9nKGJ0bi55LExheWEuc3RhZ2UuaGVpZ2h0LGluZm8ud2luZG93SGVpZ2h0KTtcbiAgICAgICAgdmFyIHJlc2hpZ2h0ID0gYnRuLnkgKiBpbmZvLndpbmRvd0hlaWdodCAvIExheWEuc3RhZ2UuaGVpZ2h0O1xuXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJyZXNoaWdodFwiLHJlc2hpZ2h0KTtcblxuICAgICAgICB2YXIgaWRkID0gdGhpcy5iYW5uZXJBZFVuaXRJZDtcbiAgICAgICAgY29uc29sZS5sb2coXCJhZFVuaXRJZDpcIitpZGQpO1xuICAgICAgICBpZiAodGhpcy5jdXJiYW5uZXIpIHRoaXMuY3VyYmFubmVyLmRlc3Ryb3koKTtcbiAgICAgICAgbGV0IG5ld0Jhbm5lciA9IExheWEuQnJvd3Nlci53aW5kb3cud3guY3JlYXRlQmFubmVyQWQoe1xuICAgICAgICAgICAgYWRVbml0SWQ6IGlkZCxcbiAgICAgICAgICAgIHN0eWxlOiBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICB3aWR0aDogNzIwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBuZXdCYW5uZXIub25FcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgIGNvbXBsZXRlKGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBuZXdCYW5uZXIub25Mb2FkKCgpID0+IFxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lciA9IG5ld0Jhbm5lcjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUudG9wID0gcmVzaGlnaHQ7XG5cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJ0b3BcIix0aGlzLmFzZ2FnYXNzZ2Euc3R5bGUudG9wKTtcbiAgICAgICAgICAgIGlmKHRoaXMuY3VyYmFubmVyKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmFubmVyIHNob3dcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc2hvdygpO1xuICAgICAgICAgICAgICAgIExheWEudGltZXIub25jZSgyMzAwLHRoaXMsKCk9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUudG9wID0gaW5mby53aW5kb3dIZWlnaHQgLSBHdWFuZ0dhby5iYW5uZXJoaWd0O1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbmV3QmFubmVyLm9uUmVzaXplKChyZXMpPT5cbiAgICAgICAge1xuICAgICAgICAgICAgR3VhbmdHYW8uYmFubmVyaGlndCA9IHJlcy5oZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zdHlsZS53aWR0aCA9IGluZm8ud2luZG93V2lkdGg7XG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zdHlsZS50b3AgPSByZXNoaWdodDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHR3ZWVuOkxheWEuVHdlZW47XG4gICAgLy/mjInpkq7or6/lr7xcbiAgICBzdGF0aWMgQ2hlYXRCYW5uZXIoYnRuOmZhaXJ5Z3VpLkdPYmplY3QsY29tcGxldGU6RnVuY3Rpb24gPSBudWxsLGdhcCA9IDApXG4gICAge1xuICAgICAgICB0dGFkLlNob3diYW5uZXIoKTtcbiAgICAgICAgLy8gaWYoIUd1YW5nR2FvLmNhbmNoZWF0KVxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImlnbm9yZWNoZWF0XCIpO1xuICAgICAgICAvLyAgICAgR3VhbmdHYW8uT3BlbkJhbm5lcigwLChoZWlnaHQpID0+XG4gICAgICAgIC8vICAgICB7XG4gICAgICAgIC8vICAgICAgICAgaWYoaGVpZ2h0ID09IG51bGwpXG4gICAgICAgIC8vICAgICAgICAge1xuICAgICAgICBcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBlbHNlXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICAgIGJ0bi55ID0gTGF5YS5zdGFnZS5oZWlnaHQtYnRuLmhlaWdodCAtIDEwMDtcbiAgICAgICAgLy8gICAgIEd1YW5nR2FvLk9wZW5CYW5uZXIoZ2FwLChoZWlnaHQpID0+IFxuICAgICAgICAvLyAgICAge1xuICAgICAgICAvLyAgICAgICAgIGlmKGhlaWdodCA9PSBudWxsKVxuICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICAgICAgZWxzZVxuICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCJjaGVhdHN0YXJ0XCIsXCJib3R0b206MTAwXCIpO1xuICAgICAgICAvLyAgICAgICAgICAgICAvLyBidG4ubW91c2VFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIC8vICAgICAgICAgICAgIHZhciBlbmQ9TGF5YS5zdGFnZS5oZWlnaHQtaGVpZ2h0LWJ0bi5oZWlnaHQgLSA4MDtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCJ5OlwiICsgZW5kKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuY2hlYXR0aW1lKjEwMDAsdGhpcywoKT0+XG4gICAgICAgIC8vICAgICAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIGJ0bi5tb3VzZUVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5zaG93YmFubmVyKCk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBHdWFuZ0dhby5jbGVhclR3ZWVuKCk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgR3VhbmdHYW8udHdlZW4gPSBMYXlhLlR3ZWVuLnRvKGJ0bix7eTplbmR9LDIwMCxudWxsLExheWEuSGFuZGxlci5jcmVhdGUodGhpcywoKT0+XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgaWYoY29tcGxldGUgIT0gbnVsbClcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgIC8vICAgICAgICAgICAgIH0pXG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfSx0cnVlKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJUd2VlbigpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBHdWFuZ0dhby50d2VlbiApXG4gICAgICAgIHtcbiAgICAgICAgICAgIEd1YW5nR2FvLnR3ZWVuLmNsZWFyKCk7XG4gICAgICAgICAgICBHdWFuZ0dhby50d2VlbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXdhcmRlZFZpZGVvQWQ7XG4gICAgcHJpdmF0ZSBfZ2FtZUJhbm5lcjtcbiAgICBwcml2YXRlIF9vblZpZGVvQ2xvc2U6IEZ1bmN0aW9uO1xuICAgIHByaXZhdGUgX29uTG9hZFZpZGVvOiBGdW5jdGlvbjtcblxuICAgIHByaXZhdGUgaXNWaWRlb0xvYWRDb20gPSBmYWxzZTtcbiAgIHB1YmxpYyAgbG9hZFZpZGVvKGNiPzogRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHsgaWYgKGNiKSBjYih0cnVlKTsgcmV0dXJuIH07XG5cbiAgICAgICAgdGhpcy5fb25Mb2FkVmlkZW8gPSBjYjtcbiAgICAgICAgaWYgKCF0aGlzLl9yZXdhcmRlZFZpZGVvQWQpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IEd1YW5nR2FvLnZpZGVsQWRVbml0SWQ7XG4gICAgICAgICAgICB0aGlzLl9yZXdhcmRlZFZpZGVvQWQgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZVJld2FyZGVkVmlkZW9BZCh7IGFkVW5pdElkOiBpbmRleCB9KTtcblxuICAgICAgICAgICAgdmFyIGlzYyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fcmV3YXJkZWRWaWRlb0FkLm9uTG9hZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJbTE9HXSDmv4DlirHop4bpopHlub/lkYrliqDovb3miJDlip9cIik7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1ZpZGVvTG9hZENvbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzYykgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlzYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkVmlkZW8gJiYgdGhpcy5fb25Mb2FkVmlkZW8odHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkVmlkZW8gPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9yZXdhcmRlZFZpZGVvQWQub25FcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW0xPR10g5r+A5Yqx6KeG6aKR5bm/5ZGK5Yqg6L295aSx6LSlXCIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1ZpZGVvTG9hZENvbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvICYmIHRoaXMuX29uTG9hZFZpZGVvKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRWaWRlbyA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3Jld2FyZGVkVmlkZW9BZC5vbkNsb3NlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXMgfHwgcmVzLmlzRW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25WaWRlb0Nsb3NlICYmIHRoaXMuX29uVmlkZW9DbG9zZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25WaWRlb0Nsb3NlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uVmlkZW9DbG9zZSAmJiB0aGlzLl9vblZpZGVvQ2xvc2UoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblZpZGVvQ2xvc2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaWRlb0xvYWRDb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRWaWRlbyAmJiB0aGlzLl9vbkxvYWRWaWRlbyh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRWaWRlbyA9IG51bGw7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRWaWRlbyAmJiB0aGlzLl9vbkxvYWRWaWRlbyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkVmlkZW8gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd1ZpZGVvKGNiPzogRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHsgaWYgKGNiKSBjYih0cnVlKTsgcmV0dXJuIH07XG4gICAgICAgIHRoaXMuX29uVmlkZW9DbG9zZSA9IGNiO1xuICAgICAgICB0aGlzLl9yZXdhcmRlZFZpZGVvQWQuc2hvdygpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZXdhcmRlZFZpZGVvQWQubG9hZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jld2FyZGVkVmlkZW9BZC5zaG93KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufSIsImltcG9ydCBTdGFnZSA9IExheWEuU3RhZ2U7XG5pbXBvcnQgV2ViR0wgPSBMYXlhLldlYkdMO1xuaW1wb3J0IEV2ZW50ID0gTGF5YS5FdmVudDtcbmltcG9ydCBIdHRwUmVxdWVzdCA9IExheWEuSHR0cFJlcXVlc3Q7XG5pbXBvcnQgVGV4dCA9IExheWEuVGV4dDtcbmltcG9ydCBCcm93c2VyID0gTGF5YS5Ccm93c2VyO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuL1BsYXllckFjY291bnRcIjtcbmltcG9ydCB7IE1haW5Db25maWcgfSBmcm9tIFwiLi4vTWFpbkNvbmZpZ1wiO1xuaW1wb3J0IHsgU2hhcmVVdGlsIH0gZnJvbSBcIi4vU2hhcmVVdGlsXCI7XG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuL1Nka1wiO1xuaW1wb3J0IHsgVGltZXNUYW1wZXIgfSBmcm9tIFwiLi4vVGltZS9UaW1lc1RhbXBlclwiO1xuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xuXG4vLyBjb25zdCBQUk9UT0NPTF9VUkw6c3RyaW5nID0gXCJodHRwczovL3BpcGVsaW5lYXBpLnh3eGdhbWUuY29tL1wiO1xuY29uc3QgUFJPVE9DT0xfVVJMOnN0cmluZyA9IFwiaHR0cHM6Ly9wYXJrb3VycmFjZXRvdXRpYW8yYXBpLnh3eGdhbWUuY29tL1wiO1xuXG5leHBvcnQgY2xhc3MgUFJPVE9DT0xTIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgTG9naW5cdFx0XHRcdD0gXCJ1c2VyL2xvZ2luXCI7XHRcdFx0XHQvLyBub3QgdG9rZW5cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2FtZSAgICAgICAgICAgICAgICAgPSBcImdhbWUvc3RhcnRcIjtcbiAgICBwdWJsaWMgc3RhdGljIGVuZCAgICAgICAgICAgICAgICAgID0gXCJnYW1lL3BsYXlcIjtcblxuICAgIHB1YmxpYyBzdGF0aWMgU2lnbiAgICAgICAgICAgICAgPSBcInNpZ24vc2lnblwiO1xuXG4gICAgLy8gcHVibGljIHN0YXRpYyBFcXVpcEhlcm8gICAgICAgICAgID0gXCJ0aGVtZS9lcXVpcEhlcm9cIjtcbiAgICAvLyBwdWJsaWMgc3RhdGljIEJ1eUhlcm8gICAgICAgICAgICAgPSBcInRoZW1lL2J1eUhlcm9cIjtcbiAgICAvLyBwdWJsaWMgc3RhdGljIEVxdWlwSGF0ICAgICAgICAgICA9IFwidGhlbWUvZXF1aXBIYXRcIjtcbiAgICAvLyBwdWJsaWMgc3RhdGljIEJ1eUhhdCAgICAgICAgICAgICA9IFwidGhlbWUvYnV5SGF0XCI7XG4gICAgLy8gcHVibGljIHN0YXRpYyBCdXlEYW5jZSAgICAgICAgICAgICA9IFwidGhlbWUvYnV5RGFuY2VcIjtcbiAgICAvLyBwdWJsaWMgc3RhdGljIEVxdWlwRGFuY2UgICAgICAgICAgID0gXCJ0aGVtZS9lcXVpcERhbmNlXCI7XG5cbiAgICBwdWJsaWMgc3RhdGljIEJ1eT1cInRoZW1lL2J1eVwiO1xuICAgIHB1YmxpYyBzdGF0aWMgRXF1aXA9XCJ0aGVtZS9lcXVpcFwiO1xuICAgIHB1YmxpYyBzdGF0aWMgc2hhcmUgICAgICAgICAgICAgICAgPSBcImZpc3Npb24vc2hhcmVcIjtcbiAgICBwdWJsaWMgc3RhdGljIHZkICAgICAgICAgICAgICAgICAgID0gXCJmaXNzaW9uL3ZkXCI7XG4gICAgcHVibGljIHN0YXRpYyByZXZpdmFsICAgICAgICAgICAgICA9IFwiZ2FtZS9yZXZpdmFsXCI7XG4gICAgcHVibGljIHN0YXRpYyBmaXNzaW9uICAgICAgICAgICA9IFwidGhlbWUvZmlzc2lvblwiO1xuICAgIHB1YmxpYyBzdGF0aWMgdGhlbWVmaXNzaW9uICAgICAgICAgID1cInRoZW1lL2Zpc3Npb25cIjtcbiAgICBwdWJsaWMgc3RhdGljIHRyZWFzdXJlICAgICAgID0gXCJ0cmVhc3VyZS9jbGlja1wiO1xuXG4gICAgcHVibGljIHN0YXRpYyBDb25maWcgICAgICAgICAgICA9IFwiY29uZmlnL3RhYmxlXCI7XG4gICAgcHVibGljIHN0YXRpYyBMb3R0ZXJ5PVwibG90dGVyeS9sb3R0ZXJ5XCI7XG4gICAgcHVibGljIHN0YXRpYyBHZXRBY2hpZXZlPVwiYWNoaWV2ZW1lbnQvZ2V0UmV3YXJkc1wiO1xuXG4gICAgcHVibGljIHN0YXRpYyB1c2Vyc3luYyA9IFwidXNlci9zeW5jXCI7XG59O1xuXG5leHBvcnQgY2xhc3MgTmV0d29ya01hbmFnZXJcbntcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTpOZXR3b3JrTWFuYWdlcjtcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpXG4gICAge1xuICAgICAgICBpZihOZXR3b3JrTWFuYWdlci5pbnN0YW5jZSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIE5ldHdvcmtNYW5hZ2VyLmluc3RhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOZXR3b3JrTWFuYWdlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKVxuICAgIHtcbiAgICAgICAgTmV0d29ya01hbmFnZXIuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIC8vI3JlZ2lvbiDnmbvlhaVcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBsb2dpbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBwdWJsaWMgbG9naW4ocHJvZ3Jlc3NjYjpMYXlhLkhhbmRsZXIsIGNvbXBsZXRlY2I6TGF5YS5IYW5kbGVyLCBlcnJvcmNiOkxheWEuSGFuZGxlcik6IHZvaWRcbiAgICB7XG4gICAgICAgIHZhciB1c2VySW5mb3IgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50O1xuICAgICAgICB2YXIgdmVyID0gR2xvYmFsLmdhbWVWZXJzaW9uO1xuXG4gICAgICAgIGxldCBhcmdzOnN0cmluZyA9IGBjb2RlPSR7dXNlckluZm9yLkNvZGV9Jm5pY2tuYW1lPSR7dXNlckluZm9yLk5pY2tOYW1lfSZhdmF0YXI9JHt1c2VySW5mb3IuQXZhdGFyfSZnZW5kZXI9JHt1c2VySW5mb3IuR2VuZGVyfSZjb3VudHJ5PSR7dXNlckluZm9yLkNvdW50cnl9JnByb3ZpbmNlPSR7dXNlckluZm9yLlByb3ZpbmNlfSZjaXR5PSR7dXNlckluZm9yLkNpdHl9JiBkZXZpY2U9JHt1c2VySW5mb3IuRGV2aWNlfSQmc2hhcmVfaWQ9JHt1c2VySW5mb3IuU2hhcmVJZH0mc2NlbmU9JHt1c2VySW5mb3IuU2NlbmV9JnY9JHt2ZXJ9YDtcbiAgICAgICAgXG4gICAgICAgIGxldCBodHRwUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdCgpO1xuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LlBST0dSRVNTLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RQcm9ncmVzcywgW3Byb2dyZXNzY2IsIGh0dHBSZXF1ZXN0XSk7XG4gICAgICAgIGh0dHBSZXF1ZXN0Lm9uY2UoRXZlbnQuQ09NUExFVEUsIHRoaXMsIHRoaXMub25Mb2dpblJlcXVlc3RDb21wbGV0ZSwgW2NvbXBsZXRlY2IsIGh0dHBSZXF1ZXN0XSk7XG4gICAgICAgIGh0dHBSZXF1ZXN0Lm9uY2UoRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMub25IdHRwUmVxdWVzdEVycm9yLCBbZXJyb3JjYiwgaHR0cFJlcXVlc3RdKTtcbiAgICAgICAgaHR0cFJlcXVlc3Quc2VuZChQUk9UT0NPTF9VUkwrUFJPVE9DT0xTLkxvZ2luICwgYXJncywgXCJwb3N0XCIsIFwidGV4dFwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RQcm9ncmVzcyhwcm9ncmVzc2NiOkxheWEuSGFuZGxlcixodHRwUmVxdWVzdDpIdHRwUmVxdWVzdClcbiAgICB7XG4gICAgICAgIGlmKHByb2dyZXNzY2IpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSHR0cFJlcXVlc3RQcm9ncmVzczouLi5cIik7XG4gICAgICAgICAgICBwcm9ncmVzc2NiLnJ1bigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkxvZ2luUmVxdWVzdENvbXBsZXRlKGNvbXBsZXRlY2I6TGF5YS5IYW5kbGVyLGh0dHBSZXF1ZXN0Okh0dHBSZXF1ZXN0KVxuICAgIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIueZu+W9leaVsOaNru+8mlwiLCBodHRwUmVxdWVzdC5kYXRhKTtcbiAgICAgICAgbGV0IGRhdGE6IEpTT04gPSBKU09OLnBhcnNlKGh0dHBSZXF1ZXN0LmRhdGEpO1xuXHRcdFx0aWYgKGRhdGFbXCJjb2RlXCJdICE9IFwiMFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLnmbvlvZXlvILluLjplJnor6/vvIHplJnor6/kv6Hmga/vvJpcIiwgaHR0cFJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLnmbvlvZXlvILluLjplJnor6/vvIHplJnor6/kv6Hmga/vvJo9IFwiICsgZGF0YVtcImNvZGVcIl0sXCJodHRwUmVxdWVzdC5kYXRcIik7XG5cdFx0XHRcdC8vY29tcGxldGVjYi5ydW5XaXRoKGRhdGEpO1xuXHRcdFx0XHRyZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQbGF5ZXJBY2NvdW50LlNlcnZlclRpbWUgPSBkYXRhW1widFwiXTtcbiAgICAgICAgICAgIFRpbWVzVGFtcGVyLkluc3RhbmNlLnVwZGF0ZVNlcnZpY2VUaW1lKCBOdW1iZXIoZGF0YVtcInRcIl0pICk7XG4gICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIueZu+W9leato+W8j+aIkOWKn1wiKTtcbiAgICAgICAgICAgIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuU2V0QWNjb3VudERhdGEoZGF0YSxjb21wbGV0ZWNiKTtcbiAgICAgICAgICAgIC8vIFNoYXJlVXRpbC5TaGFyZU1lc3NhZ2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RFcnJvcihlcnJvcmNiOkxheWEuSGFuZGxlcixodHRwUmVxdWVzdDpIdHRwUmVxdWVzdClcbiAgICB7XG4gICAgICAgIGlmIChlcnJvcmNiICE9IG51bGwpIHtcbiAgICAgICAgICAgIGVycm9yY2IucnVuV2l0aChodHRwUmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCJFcnJvciEgSHR0cCByZXF1ZXN0IGVycm9yLi4gXCIgLFwiaHR0cFJlcXVlc3QuZGF0XCIpO1xuICAgICAgICBXeEFwaS5TaG93TG9hZGluZyhcIui/nuaOpee9kee7nOWksei0pS4uLlwiKTtcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDgwMDAsdGhpcywoKT0+e1d4QXBpLkhpZGVMb2FkaW5nKCk7fSlcbiAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciEgSHR0cCByZXF1ZXN0IGVycm9yLi4uXCIgKyBodHRwUmVxdWVzdC5kYXRhKTtcbiAgICB9XG4gICAgLy8jZW5kcmVnaW9uXG4gICAgXG5cbiAgICAvKlxuICAgICog6YCa55SoSHR0cCBQb3N05Y2P6K6u5Y+R6YCBXG4gICAgKiBwcm90b2NvbCBcdFx05a+55bqU4oCcUFJPVE9DT0xT4oCd5a2X5YW45Lit5Y2P6K6u5ZCN56ewXG4gICAgKiBoYXNUb2tlblx0XHTmmK/lkKbkvb/nlKh0b2tlbu+8jOebruWJjeWPquaciWxvZ2lu5Y2P6K6u5LiN6ZyA6KaBdG9rZW7vvIzlhbbku5bpg73pnIDopoF0b2tlbu+8jOaJgOS7peatpOWkhOiHquWKqOe7hOWQiFxuICAgICogcGFyYW1cdFx0XHTlj4LmlbDliJfooajvvIxrZXnmmK/lrZfmrrXlkI3vvIx2YWzmmK/lgLzvvIzlgLzpnIDopoHlhYjovaxzdHJpbmdcbiAgICAqIGNvbXBsZXRlY2JcdOWNj+iuruWPkemAgeaIkOWKn+Wbnuiwg+WHveaVsFxuICAgICogZXJyb3JjYlx0XHTljY/orq7lj5HpgIHlpLHotKXlm57osIPlh73mlbBcbiAgICAqIHJldHVyblx0XHTov5Tlm57lgLzkuLp2b2lkXG4gICAgKi9cbiAgICBwdWJsaWMgSHR0cFBvc3RSZXF1ZXN0KHByb3RvY29sOnN0cmluZywgcGFyYW06QXJyYXk8e1trZXk6c3RyaW5nXTpzdHJpbmd9PiwgY29tcGxldGVjYjpMYXlhLkhhbmRsZXIsIGVycm9yY2I6TGF5YS5IYW5kbGVyLCBoYXNUb2tlbjpib29sZWFuID0gdHJ1ZSk6dm9pZCBcbiAgICB7XG4gICAgICAgIGxldCBhcmdzOnN0cmluZyA9IFwiXCI7XG4gICAgICAgIGxldCB1cmw6c3RyaW5nID0gUFJPVE9DT0xfVVJMICsgcHJvdG9jb2w7XG4gICAgICAgIC8vIGNoZWNoayBhZGQgdG9rZW5cbiAgICAgICAgdmFyIGFjY291bnQgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50O1xuICAgICAgICB2YXIgYWNjb3VudGRhdGEgPSBhY2NvdW50LkN1ckFjY291bnREYXRhO1xuICAgICAgICBpZiAoaGFzVG9rZW4gPT0gdHJ1ZSkgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGFyZ3MgPSBgdG9rZW49JHthY2NvdW50ZGF0YS5tX3Rva2VufSZgO1xuICAgICAgICB9XG5cbiAgICAgICAgV3hBcGkuU2hvd0xvYWRpbmcoXCLov57mjqXnvZHnu5zkuK0uLi5cIik7XG4gICAgICAgIGlmIChwcm90b2NvbCA9PSBQUk9UT0NPTFMuZ2FtZSB8fCBwcm90b2NvbCA9PSBQUk9UT0NPTFMuZW5kIHx8IHByb3RvY29sID09IFBST1RPQ09MUy5maXNzaW9uIHx8IHByb3RvY29sID09IFBST1RPQ09MUy52ZHx8XG4gICAgICAgICAgICBwcm90b2NvbD09UFJPVE9DT0xTLnRoZW1lZmlzc2lvbnx8cHJvdG9jb2w9PVBST1RPQ09MUy5Mb3R0ZXJ5IHx8IHByb3RvY29sID09IFBST1RPQ09MUy51c2Vyc3luYylcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IHN0ciAgPSBcImFiY2RlZmdoaWpraW1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OVwiO1xuICAgICAgICAgICAgbGV0IGNvZGUgPSBcIntcIjtcbiAgICAgICAgICAgIGxldCBtYXNrID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtYXNrICs9IHN0cltNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogMTAwKSAlIHN0ci5sZW5ndGhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gcGFyYW1baV0pIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZSArPSBgXFxcIiR7a2V5fVxcXCI6XFxcIiR7cGFyYW1baV1ba2V5XX1cXFwiYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBwYXJhbS5sZW5ndGggLSAxKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGUgKz0gXCIsXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGUgKz0gXCJ9XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJncyArPSBcIl9yPVwiICsgbWFzayArIHRoaXMuYmFzZTY0RW5jb2RlKGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW0ubGVuZ3RoOyBpKyspIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHBhcmFtW2ldKSBcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbDpzdHJpbmcgPSBwYXJhbVtpXVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyArPSBgJHtrZXl9PSR7dmFsfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHBhcmFtLmxlbmd0aCAtIDEpIFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gXCImXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGh0dHBSZXF1ZXN0ID0gbmV3IEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGh0dHBSZXF1ZXN0Lm9uY2UoRXZlbnQuQ09NUExFVEUsIHRoaXMsIHRoaXMub25IdHRwUmVxdWVzdENvbXBsZXRlLCBbY29tcGxldGVjYiwgZXJyb3JjYiwgaHR0cFJlcXVlc3RdKTtcbiAgICAgICAgaHR0cFJlcXVlc3Qub25jZShFdmVudC5FUlJPUiwgdGhpcywgdGhpcy5vbkh0dHBSZXF1ZXN0RXJyb3IsIFtlcnJvcmNiLCBodHRwUmVxdWVzdF0pO1xuICAgICAgICBodHRwUmVxdWVzdC5zZW5kKHVybCwgYXJncywgXCJwb3N0XCIsIFwidGV4dFwiKTtcbiAgICB9XG4gICAgICAgIFxuICAgIHByaXZhdGUgb25IdHRwUmVxdWVzdENvbXBsZXRlKHN1Y2NlZWRjYjpMYXlhLkhhbmRsZXIsIGZhaWx1cmVjYjpMYXlhLkhhbmRsZXIsIGh0dHBSZXF1ZXN0Okh0dHBSZXF1ZXN0KTp2b2lkIFxuICAgIHtcbiAgICAgICAgV3hBcGkuSGlkZUxvYWRpbmcoKTtcbiAgICAgICAgbGV0IGRhdGE6IEpTT04gPSBKU09OLnBhcnNlKGh0dHBSZXF1ZXN0LmRhdGEpO1xuICAgICAgICBpZiAoZGF0YVtcImNvZGVcIl0gPT0gMClcbiAgICAgICAge1xuICAgICAgICAgICAgUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5TZXRBY2NvdW50RGF0YShkYXRhLG51bGwpO1xuICAgICAgICAgICAgaWYgKHN1Y2NlZWRjYiAhPSBudWxsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN1Y2NlZWRjYi5ydW5XaXRoKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKGZhaWx1cmVjYiAhPSBudWxsKSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmYWlsdXJlY2IucnVuV2l0aChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciEgSHR0cCByZXF1ZXN0IGNvbXBsZXRlIGVycm9yLCBjb2RlOiBcIiArIGRhdGFbXCJjb2RlXCJdICsgXCIgbWVzc2FnZTogXCIgKyBkYXRhW1wibWVzc2FnZVwiXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGJhc2U2NEVuY29kZSAoc3RyKTpzdHJpbmcge1xuICAgICAgICB2YXIgYzEsIGMyLCBjMztcbiAgICAgICAgdmFyIGJhc2U2NEVuY29kZUNoYXJzID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7XG4gICAgICAgIHZhciBpID0gMCwgbGVuID0gc3RyLmxlbmd0aCwgc3RyaW5nID0gJyc7XG4gICAgICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICAgICAgYzEgPSBzdHIuY2hhckNvZGVBdChpKyspICYgMHhmZjtcbiAgICAgICAgICBpZiAoaSA9PSBsZW4pIHtcbiAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoYzEgPj4gMik7XG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KChjMSAmIDB4MykgPDwgNCk7XG4gICAgICAgICAgICBzdHJpbmcgKz0gXCI9PVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcbiAgICAgICAgICBpZiAoaSA9PSBsZW4pIHtcbiAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoYzEgPj4gMik7XG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KCgoYzEgJiAweDMpIDw8IDQpIHwgKChjMiAmIDB4RjApID4+IDQpKTtcbiAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoKGMyICYgMHhGKSA8PCAyKTtcbiAgICAgICAgICAgIHN0cmluZyArPSBcIj1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjMyA9IHN0ci5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdChjMSA+PiAyKTtcbiAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KCgoYzEgJiAweDMpIDw8IDQpIHwgKChjMiAmIDB4RjApID4+IDQpKTtcbiAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KCgoYzIgJiAweEYpIDw8IDIpIHwgKChjMyAmIDB4QzApID4+IDYpKTtcbiAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMzICYgMHgzRilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxufSIsImV4cG9ydCBjbGFzcyBQbGF0ZnJvbVR5cGVcbiB7XG4gICAgLyoqXG4gICAgICog55S16ISRXG4gICAgICovXG4gICAgc3RhdGljIHBjOnN0cmluZyA9IFwicGNcIjtcbiAgICAvKipcbiAgICAgKiDlvq7kv6HlsI/muLjmiI9cbiAgICAgKi9cbiAgICBzdGF0aWMgd3g6c3RyaW5nID0gXCJ3eFwiO1xuXG4gICAgLyoqXG4gICAgICogcXHlsI/muLjmiI9cbiAgICAgKi9cbiAgICBzdGF0aWMgcXE6c3RyaW5nID0gXCJxcVwiO1xuXG4gICAgLyoqXG4gICAgICog5oqW6Z+zXG4gICAgICovXG4gICAgc3RhdGljIHR0OnN0cmluZyA9IFwidHRcIjtcbn0iLCJpbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcbmltcG9ydCB7RGljdGlvbmFyeX0gZnJvbSBcIi4uL3V0aWxzL0RpY3Rpb25hcnlcIjtcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi9OZXR3b3JrTWFuYWdlclwiO1xuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbmltcG9ydCB7VXNlckluZm9FdmVudH0gZnJvbSBcIi4uL0RhdGEvVXNlckluZm9FdmVudFwiO1xuXG5cbmV4cG9ydCBlbnVtIHJlcXVpcmV0eXBlIHtcbiAgICDns7vnu5/otaDpgIEgPSAxLCDph5HluIHotK3kubAgPSAyLCDop4LnnIvop4bpopEgPSAzLCDliIbkuqsgPSA0LCDnrb7liLAgPSA1LCDmtLvliqggPSA2LCDpgJrov4flhbPljaEgPSA3LCDntK/orqHnmbvpmYYgPSA4LCDpgoDor7fkurrmlbDovr7liLAgPSA5LCDnoJbnn7PotK3kubAgPSAxMFxufVxuXG5leHBvcnQgZW51bSBBY2NvdW50Q29uZmlnIHtcbiAgICBjcm9wLHRoaW5ncywgbGFuZCwgZ2xvYmFsLCBlbnRpdHksIHNpZ24sIHJld2FyZHMsIGFjaGlldmVtZW50LCBpbnZpdGUsIG1pc3Npb24sIHRyZWFzdXJlX2NsaWNrLCB0aGVtZSwgbG90dGVyeVxufVxuXG5leHBvcnQgZW51bSBBY2NvdW50VXNlciB7XG4gICAgbW9uZXksIGRpYW1vbmQsIHVzZXJfaWQsIGdhbWVfdGltZXMsIGdldF90aGVtZXMsIHZpZGVvX3RpbWVzLCBlcXVpcF90aGVtZXMsIGxhc3RfYWN0aW9uX3RpbWUsIGxhc3RfZmF2b3JpdGVfdGltZSwgcHJvZ3Jlc3NfdGhlbWVzLCByZXZpdmFsLCBzdGFnZSx2bW9uZXlcbn1cblxuZXhwb3J0IGVudW0gaGVyb0F0dHIge1xuICAgIGlkLCBuYW1lLCBxdWFsaXR5LCBpY29uLCBwcmVmYWIsIHJlcXVpcmVfbnVtLCByZXF1aXJlX3R5cGVcbn1cblxuZXhwb3J0IGVudW0gc2lnbmRhdGEge1xuICAgIHNpZ25fZGF5cywgc2lnbl90aW1lXG59XG5cbmV4cG9ydCBlbnVtIGVudGl0eSB7XG4gICAgaWQsIG5hbWUsIGVudGl0eV9pZCwgaWNvblxufVxuXG5leHBvcnQgZW51bSBza2luYXR0ciB7XG4gICAgZWZmZWN0VmFsdWVfMSxcbiAgICBlZmZlY3RWYWx1ZV8yLFxuICAgIGVmZmVjdFZhbHVlXzMsXG4gICAgZWZmZWN0VmFsdWVfNFxufVxuXG5leHBvcnQgY2xhc3MgQWNjb3VudERhdGEge1xuICAgIGNvbnN0cnVjdG9yKF90b2tlbjogc3RyaW5nLCBfY29uZmlnOiBPYmplY3QsIF9hcHBTZXR0aW5nOiBPYmplY3QsIF91c2VyOiBPYmplY3QsIF91c2VyYmFzZTogT2JqZWN0LCBfdXNlSW52aXRlOiBPYmplY3QgPSBudWxsLCBfdXNlcl9zdGFnZTogT2JqZWN0ID0gbnVsbCwgX3VzZXJfc2lnbiwgX3VzZXJfYWNoaWV2ZW1lbnQsIF9sb3R0ZXJ5LF91c2VfbGFuZF90YXNrLF91c2VyX3ZpZGVvKSB7XG4gICAgICAgIHRoaXMubV90b2tlbiA9IF90b2tlbjtcbiAgICAgICAgdGhpcy5tX2FwcF9zZXR0aW5nID0gX2FwcFNldHRpbmc7XG4gICAgICAgIHRoaXMubV91c2VyID0gX3VzZXI7XG4gICAgICAgIHRoaXMubV91c2VyX2Jhc2UgPSBfdXNlcmJhc2U7XG4gICAgICAgIHRoaXMubV9zaWduID0gX3VzZXJfc2lnbjtcbiAgICAgICAgdGhpcy5tX3Rhc2sgPSBfdXNlcl9hY2hpZXZlbWVudDtcbiAgICAgICAgdGhpcy5sb3R0ZXJ5ID0gX2xvdHRlcnk7XG4gICAgICAgIHRoaXMubV91c2VfbGFuZF90YXNrID0gX3VzZV9sYW5kX3Rhc2s7XG4gICAgICAgIHRoaXMubV91c2VyX3ZpZGVvID0gX3VzZXJfdmlkZW87XG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5tX3VzZXJbXCJ1c2VyX2lkXCJdO1xuICAgICAgICB0aGlzLm9wZW5pZCA9IHRoaXMubV91c2VyX2Jhc2VbXCJvcGVuaWRcIl07XG4gICAgICAgIGNvbnNvbGUubG9nKFwidXNlcl9pZDpcIiArIHRoaXMudXNlcklkKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIm9wZW5faWQ6XCIrdGhpcy5vcGVuaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBtX3Rva2VuOiBzdHJpbmc7XG4gICAgcHVibGljIG1fY29uZmlnczogT2JqZWN0O1xuICAgIHB1YmxpYyBtX2FwcF9zZXR0aW5nOiBPYmplY3Q7XG4gICAgcHVibGljIG1fdXNlcjogT2JqZWN0O1xuICAgIHB1YmxpYyBtX3VzZXJfYmFzZTogT2JqZWN0O1xuICAgIHB1YmxpYyBtX3NpZ246IE9iamVjdDtcbiAgICBwdWJsaWMgbV90YXNrOiBPYmplY3Q7XG4gICAgcHVibGljIG1fdXNlX2xhbmRfdGFzazphbnk7XG4gICAgcHVibGljIG1fdXNlcl92aWRlbzpPYmplY3Q7XG4gICAgcHVibGljIG9wZW5pZDogc3RyaW5nID0gXCJcIjtcbiAgICBwcml2YXRlIHVzZXJJZDogc3RyaW5nID0gXCJcIjtcbiAgICBwdWJsaWMgbG90dGVyeTogYW55O1xuICAgIHB1YmxpYyByb2FkY29uZmlnOiB7IFtrZXk6IG51bWJlcl06IGFueSB9ID0ge307XG4gICAgcHVibGljIG1fUmV3YXJkRGljOiBPYmplY3QgPSB7fTtcbiAgICBwdWJsaWMgbV9FbnRpdHlEaWM6IHsgW2tleTogbnVtYmVyXTogYW55IH0gPSB7fTtcbiAgICBwdWJsaWMgbV9BY2hpZXZlbWVudERpYzogT2JqZWN0ID0ge307XG4gICAgLy8gcHVibGljIG1fc2tpbkRpYzpEaWN0aW9uYXJ5PG51bWJlcixTa2luRGF0YT4gPSBuZXcgRGljdGlvbmFyeSgpO1xuXG4gICAgLy/ojrflj5bnjqnlrrbokL3lhaXnqbrkuK3mrbvkuqHot53nprtcbiAgICBwdWJsaWMgZ2V0IERpZURpc3RhbmNlKCk6bnVtYmVye1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImRpZWRpc3RhbmNlXCJdKTtcbiAgICB9XG4gICAgLy/ojrflj5blvIDlsYDnoLjom4vlh6DnjodcbiAgICBwdWJsaWMgZ2V0IEhpdEVnZygpOm51bWJlcntcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJoaXRlZ2dcIl0pO1xuICAgIH1cbiAgICAvL+iOt+WPlue7k+eul+WQjueguOibi+WHuueOsOWHoOeOh1xuICAgIHB1YmxpYyBnZXQgRW5kQ2hlYXQoKTpudW1iZXJ7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiZW5kY2hlYXRcIl0pO1xuICAgIH1cbiAgICAvL+iOt+WPluivr+inpuWlluWKsemHkeW4geaVsFxuICAgIHB1YmxpYyBnZXQgQ2hlYXRSZXdhcmQoKTpudW1iZXJ7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiY2hlYXRyZXdhcmRcIl0pO1xuICAgIH1cbiAgICAvL+eZveWQjeWNleeUqOaIt1xuICAgIHB1YmxpYyBnZXQgV2hpdGVVc2VyKCk6Ym9vbGVhbntcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcIldoaXRlVXNlclwiXSA9PSBcIjFcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvdHRlcnl0aW1lKCk6bnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubG90dGVyeVtcImRheV92aWRlb190aW1lc1wiXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaGFyZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYXJlXCJdID09IFwiMVwiO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2hhcmVjb250ZW50KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJzaGFyZWNvbnRlbnRcIl07XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgU2hhcmVJbWFnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiU2hhcmVJbWFnZVwiXTtcbiAgICB9XG4gICAgcHVibGljIGdldCBjaGVhdHRpbWUoKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiY2hlYXR0aW1lXCJdKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBiYW5uZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJiYW5uZXJcIl0gPT0gXCIxXCI7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdmlkZW8oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJ2aWRlb1wiXSA9PSBcIjFcIjtcbiAgICB9XG4gICAgcHVibGljIGdldCBCdG5DYW5Nb3ZlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiQnRuQ2FuTW92ZVwiXSA9PSBcIjFcIjtcbiAgICB9XG4gICAgcHVibGljIGdldCBjaGVja3NjZW5jZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImNoZWNrc2NlbmNlXCJdID09IFwiMVwiO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhbm5lcl9kaXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJiYW5uZXJfZGlzXCJdKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBiYW5uZXJNb3ZlVGltZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lck1vdmVUaW1lXCJdKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBjcmVhdGVCYW5uZXJUaW1lcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImNyZWF0ZUJhbm5lclRpbWVzXCJdKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBiYW5uZXJNb3ZlUHJvcCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lck1vdmVQcm9wXCJdKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBpc1NoYXJlVGhlblZpZGVvKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiaXNTaGFyZVRoZW5WaWRlb1wiXSA9PSBcIjFcIjtcbiAgICB9XG4gICAgcHVibGljIGdldCBpc1Nob3dIdWlUdWkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJpc1Nob3dIdWlUdWlcIl0gPT0gXCIxXCI7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgc3RhcnRfc3ByaW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wic3RhcnRfc3ByaW50XCJdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IElzVmlkZW9Nb2RlbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcIklzVmlkZW9Nb2RlbFwiXSA9PSBcIjFcIjtcbiAgICB9XG4gICAgcHVibGljIGdldCB2aWRlb01vZGVsTnVtKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1widmlkZW9Nb2RlbE51bVwiXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgVmlkZW9Nb2RlbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJWaWRlb01vZGVsVGl0bGVcIl07XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZmFpbGNvdW50KCk6bnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImZhaWxjb3VudFwiXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgc3BtaW5zcGVlZCgpOm51bWJlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJzcG1pbnNwZWVkXCJdKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBiZ20oKTpib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiYmdtXCJdID09IFwiMVwiO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2FtZXJhaGlnaHQoKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiY2FtZXJhaGlnaHRcIl0pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGN0bmZpbGVuYW1lKCk6c3RyaW5nXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiY3RuZmlsZW5hbWVcIl07XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgY2hlYXQoKTpib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiY2hlYXRcIl0gPT0gXCIxXCI7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgc2hha2VzdGFnZSgpOmJvb2xlYW5cbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJzaGFrZXN0YWdlXCJdICYmIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYWtlc3RhZ2VcIl0gPT0gXCIxXCI7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgc3RhZ2Vjb25maWdjZG4oKTpib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wic3RhZ2Vjb25maWdjZG5cIl0gPT0gXCIxXCI7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgcGxheWVyc3BlZWQoKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wicGxheWVyc3BlZWRcIl0pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHZpZGVsQWRVbml0SWQoKTpzdHJpbmdcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJ2aWRlbEFkVW5pdElkXCJdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhbm5lckFkVW5pdElkKCk6c3RyaW5nXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiYmFubmVyQWRVbml0SWRcIl07XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdHJpKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInRyaVwiXSA9PSBcIjFcIjtcbiAgICB9XG4gICAgcHVibGljIGdldCByZWNvbW1lbmQoKTpib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wicmVjb21tZW5kXCJdID09IFwiMVwiO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJlY29tbWVuZGZsZygpOnN0cmluZ1xuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInJlY29tbWVuZGZsZ1wiXTtcbiAgICB9XG4gICAgcHVibGljIGdldCBlZ2coKTpib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiZWdnXCJdID09IFwiMVwiO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGVnZ3JhdGUoKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiZWdncmF0ZVwiXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgVXNlSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlcklkO1xuICAgIH1cblxuICAgIHB1YmxpYyBHZXRDb25maWcoX3R5cGU6IEFjY291bnRDb25maWcpOiBhbnkge1xuICAgICAgICB2YXIgdHlwZSA9IEFjY291bnRDb25maWdbX3R5cGVdO1xuICAgICAgICByZXR1cm4gdGhpcy5tX2NvbmZpZ3NbdHlwZV07XG4gICAgfVxuXG4gICAgcHVibGljIEdldFVzZXIoX3R5cGU6IEFjY291bnRVc2VyKSB7XG4gICAgICAgIHZhciB0eXBlID0gQWNjb3VudFVzZXJbX3R5cGVdO1xuICAgICAgICByZXR1cm4gdGhpcy5tX3VzZXJbdHlwZV07XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgR2V0VmlkZW9Ub3RhbCgpXG4gICAge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV91c2VyX3ZpZGVvW1widG90YWxcIl0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBHZXRTaWduKF9kYXRhdHlwZTogc2lnbmRhdGEpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBzaWduZGF0YVtfZGF0YXR5cGVdO1xuICAgICAgICByZXR1cm4gdGhpcy5tX3NpZ25bdHlwZV07XG4gICAgfVxuXG4gICAgcHVibGljIEdldFJld2FyZENvbmZpZyhfcmV3YXJkaWQ6IG51bWJlcik6IGFueSB7XG4gICAgICAgIHZhciByZXdhcmQgPSB0aGlzLm1fUmV3YXJkRGljW19yZXdhcmRpZF07XG4gICAgICAgIHJldHVybiByZXdhcmQ7XG4gICAgfVxuXG4gICAgcHVibGljIEdldEVudGl0eShfaWQ6IHN0cmluZywgYXR0cjogZW50aXR5KSB7XG4gICAgICAgIGlmKCF0aGlzLm1fRW50aXR5RGljW19pZF0pcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLm1fRW50aXR5RGljW19pZF1bZW50aXR5W2F0dHJdXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIEdldFJld2FyZERpYygpIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcucmV3YXJkcyk7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMubV9SZXdhcmREaWNbY29uZmlnW2tleV0uaWRdID0gY29uZmlnW2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgR2V0RW50aXR5RGljKCkge1xuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5HZXRDb25maWcoQWNjb3VudENvbmZpZy5lbnRpdHkpO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICB0aGlzLm1fRW50aXR5RGljW2NvbmZpZ1trZXldLmVudGl0eV9pZF0gPSBjb25maWdba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgR2V0VGhlbWVCeUlkKF9pZDogbnVtYmVyKTogYW55IHtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLkdldENvbmZpZyhBY2NvdW50Q29uZmlnLnRoZW1lKTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkYXRhW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pZCA9PSBfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIEdldFNraW5BdHRyKF9pZDogbnVtYmVyKSAge1xuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5HZXRDb25maWcoQWNjb3VudENvbmZpZy50aGVtZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZmlnLmxlbmd0aDsgaSsrKSAge1xuICAgICAgICAgICAgaWYgKGNvbmZpZ1tpXS5pZCA9PSBfaWQpICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBHZXRBY2hpZXZlbWVudERhdGEoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZXRDb25maWcoQWNjb3VudENvbmZpZy5hY2hpZXZlbWVudCk7XG4gICAgICAgIHZhciBkaWMgPSB7fTtcblxuICAgICAgICBmb3IgKHZhciBrZXkxIGluIGRhdGEpIHtcbiAgICAgICAgICAgIHZhciB0eXBlMSA9IGRhdGFba2V5MV0udHlwZTtcbiAgICAgICAgICAgIC8vdmFyIG9iaiA9IHt9O1xuXG4gICAgICAgICAgICBpZiAoZGljW3R5cGUxXSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGtleTIgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciB0eXBlMiA9IGRhdGFba2V5Ml0udHlwZTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlMSA9PSB0eXBlMikge1xuICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRhdGFba2V5Ml0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGljW3R5cGUxXSA9IGFycmF5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubV9BY2hpZXZlbWVudERpYyA9IGRpYztcbiAgICB9XG5cbiAgICBIYXNUaGVtZShfaWQ6bnVtYmVyKTpib29sZWFuXG4gICAge1xuICAgICAgICB2YXIgaGFzID0gZmFsc2U7XG4gICAgICAgIHZhciBnZXR0aGVtZXMgPSB0aGlzLkdldFVzZXIoQWNjb3VudFVzZXIuZ2V0X3RoZW1lcyk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBnZXR0aGVtZXMubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoZ2V0dGhlbWVzW2ldID09IF9pZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBoYXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXM7XG4gICAgfVxuXG4gICAgR2V0U2tpbkRpYyhfY29uZmlnOmFueSlcbiAgICB7XG4gICAgICAgIFxuICAgIH1cblxuICAgIHB1YmxpYyBHZXRIZXJvUHJvZ3Jlc3MoX2lkOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5tX3VzZXJbXCJwcm9ncmVzc19oZXJvZXNcIl07XG4gICAgICAgIHZhciBwcm9ncmVzcyA9IGNvbmZpZ1tfaWRdID8gY29uZmlnW19pZF0gOiAwO1xuICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gICAgfVxuXG4gICAgcHVibGljIEdldEhhdFByb2dyZXNzKF9pZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMubV91c2VyW1wicHJvZ3Jlc3NfaGF0c1wiXTtcbiAgICAgICAgdmFyIHByb2dyZXNzID0gY29uZmlnW19pZF0gPyBjb25maWdbX2lkXSA6IDA7XG4gICAgICAgIHJldHVybiBwcm9ncmVzcztcbiAgICB9XG5cbiAgICBwdWJsaWMgR2V0Q2JQcm9ncmVzcyhfaWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm1fdXNlcltcInByb2dyZXNzX2RhbmNlc1wiXTtcbiAgICAgICAgdmFyIHByb2dyZXNzID0gY29uZmlnW19pZF0gPyBjb25maWdbX2lkXSA6IDA7XG4gICAgICAgIHJldHVybiBwcm9ncmVzcztcbiAgICB9XG5cbiAgICBwdWJsaWMgSGFzTW90b3IoX2lkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLkdldFVzZXIoQWNjb3VudFVzZXIuZ2V0X3RoZW1lcyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGhkID0gZGF0YVtpXTtcbiAgICAgICAgICAgIGlmIChfaWQgPT0gaGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8v6I635Y+W55qu6IKk55qE6L+b5bqmXG4gICAgcHVibGljIEdldE1vdG9yUHJvZ3Jlc3MoX2lkOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5tX3VzZXJbXCJwcm9ncmVzc190aGVtZXNcIl07XG4gICAgICAgIHZhciBwcm9ncmVzcyA9IGNvbmZpZ1tfaWRdID8gY29uZmlnW19pZF0gOiAwO1xuICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gICAgfVxuXG4gICAgcHVibGljIEdldFNldmVyQ29uZmlnKF9jb25maWc6IGFueSkge1xuICAgICAgICB0aGlzLm1fY29uZmlncyA9IF9jb25maWc7XG4gICAgICAgIHRoaXMuR2V0U2tpbkRpYyh0aGlzLm1fY29uZmlncyk7XG4gICAgICAgIHRoaXMuR2V0UmV3YXJkRGljKCk7XG4gICAgICAgIHRoaXMuR2V0RW50aXR5RGljKCk7XG4gICAgICAgIC8vIHRoaXMuR2V0QWNoaWV2ZW1lbnREYXRhKCk7XG4gICAgICAgIGxldCBfZ2xvYmU9X2NvbmZpZ1tcImdsb2JhbFwiXTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IF9nbG9iZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBfZ2xvYmVbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQua2V5ID09IFwidGlsaXJlY1wiKSB7XG4gICAgICAgICAgICAgICAgUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC50aWxpcmVjPSBOdW1iZXIoZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgVXBkYXRlU2tpbkRpYygpXG4gICAge1xuICAgICAgICB0aGlzLkdldFNraW5EaWModGhpcy5tX2NvbmZpZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBHZXRHbG9iZShfa2V5OnN0cmluZylcbiAgICB7XG4gICAgICAgIHZhciBnbG9iZSA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcuZ2xvYmFsKTtcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gZ2xvYmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBvYmogPSBnbG9iZVtrZXldO1xuICAgICAgICAgICAgdmFyIGtrayA9IG9ialtcImtleVwiXTtcbiAgICAgICAgICAgIGlmKGtrayA9PSBfa2V5KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9ialtcInZhbHVlXCJdO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXJBY2NvdW50IHtcbiAgICBjb25zdHJ1Y3RvcihfY29kZTogc3RyaW5nLCBfbmlja25hbWU6IHN0cmluZywgX2F2YXRhcjogc3RyaW5nLCBfZ2VuZGVyOiBudW1iZXIsIF9jb3VudHJ5OiBzdHJpbmcsIF9wcm92aW5jZTogc3RyaW5nLCBfY2l0eTogc3RyaW5nLCBfZGV2aWNlOiBzdHJpbmcsIF9zaGFyZWlkOiBzdHJpbmcsIF9zY2VuY2U6IHN0cmluZywgX3Zlcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9jYWxUaW1lID0gTGF5YS50aW1lci5jdXJyVGltZXI7XG5cbiAgICAgICAgdGhpcy5Db2RlID0gX2NvZGU7XG4gICAgICAgIHRoaXMuTmlja05hbWUgPSBfbmlja25hbWU7XG4gICAgICAgIHRoaXMuQXZhdGFyID0gX2F2YXRhcjtcbiAgICAgICAgdGhpcy5HZW5kZXIgPSBfZ2VuZGVyO1xuICAgICAgICB0aGlzLkNvdW50cnkgPSBfY291bnRyeTtcbiAgICAgICAgdGhpcy5Qcm92aW5jZSA9IF9wcm92aW5jZTtcbiAgICAgICAgdGhpcy5DaXR5ID0gX2NpdHk7XG4gICAgICAgIHRoaXMuRGV2aWNlID0gX2RldmljZTtcbiAgICAgICAgdGhpcy5TaGFyZUlkID0gX3NoYXJlaWQ7XG4gICAgICAgIHRoaXMuU2NlbmUgPSBfc2NlbmNlO1xuICAgICAgICB0aGlzLnZlciA9IF92ZXI7XG4gICAgICAgIHRoaXMuSXNUZXN0ID0gZmFsc2U7XG5cbiAgICAgICAgUGxheWVyQWNjb3VudC5pbnN0YW5jZSA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFBsYXllckFjY291bnQ7XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBDdXJyZW50QWNjb3VudCgpIHtcbiAgICAgICAgaWYgKFBsYXllckFjY291bnQuaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLnlJ/miJDmnKzlnLDmtYvor5XotKblj7cuLi5cIik7XG4gICAgICAgICAgICByZXR1cm4gUGxheWVyQWNjb3VudC5UZXN0QWNjb3VudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUGxheWVyQWNjb3VudC5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IFRlc3RBY2NvdW50KCkge1xuICAgICAgICB2YXIgY29kZSA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJsb2NhbGNvZGVcIik7XG4gICAgICAgIGlmKCFjb2RlKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB2YXIgcmFuZG9tID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCgxMDAwMCw5OTk5OSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvZGUgPSBcInhqX1wiICsgdGltZSArIHJhbmRvbTtcbiAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJsb2NhbGNvZGVcIixjb2RlKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRpbWUscmFuZG9tKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5paw55So5oi3XCIsY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiAgeeUqOaIt1wiLGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjdXJhY2NvdW50ID0gbmV3IFBsYXllckFjY291bnQoY29kZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIGN1cmFjY291bnQuSXNUZXN0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGN1cmFjY291bnQ7XG4gICAgfVxuXG4gICAgcHVibGljIENvZGU6IHN0cmluZztcbiAgICBwdWJsaWMgTmlja05hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgQXZhdGFyOiBzdHJpbmc7XG4gICAgcHVibGljIEdlbmRlcjogbnVtYmVyO1xuICAgIHB1YmxpYyBDb3VudHJ5OiBzdHJpbmc7XG4gICAgcHVibGljIFByb3ZpbmNlOiBzdHJpbmc7XG4gICAgcHVibGljIENpdHk6IHN0cmluZztcbiAgICBwdWJsaWMgRGV2aWNlOiBzdHJpbmc7XG4gICAgcHVibGljIFNoYXJlSWQ6IHN0cmluZztcbiAgICBwdWJsaWMgU2NlbmU6IHN0cmluZztcbiAgICBwdWJsaWMgdmVyOiBzdHJpbmc7XG4gICAgcHVibGljIHN0YXRpYyBTZXJ2ZXJUaW1lOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBsb2NhbFRpbWU7XG4gICAgc3RhdGljIGxvY2FsY29maWdrZXkgPSBcIm1jb25maWdcIjtcblxuICAgIHB1YmxpYyBJc1Rlc3QgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBDdXJBY2NvdW50RGF0YTogQWNjb3VudERhdGE7XG5cbiAgICBwdWJsaWMgdGlsaXJlYzpudW1iZXI7XG5cbiAgICBwdWJsaWMgbm93Q29uZmlnOmFueTtcblxuICAgIHB1YmxpYyBTZXRBY2NvdW50RGF0YShkYXRhLGNvbXBsZXRlY2I6TGF5YS5IYW5kbGVyKSB7XG4gICAgICAgIHZhciB0b2tlbiA9IGRhdGFbXCJ0b2tlblwiXTtcbiAgICAgICAgdmFyIGNvbmZpZ3MgPSBkYXRhW1wiY29uZmlnc1wiXTtcbiAgICAgICAgdmFyIGFwcF9zZXR0aW5nID0gZGF0YVtcImFwcF9zZXR0aW5nXCJdO1xuICAgICAgICB2YXIgdXNlciA9IGRhdGFbXCJ1c2VyXCJdO1xuICAgICAgICB2YXIgdXNlcl9iYXNlID0gZGF0YVtcInVzZXJfYmFzZVwiXTtcbiAgICAgICAgdmFyIHVzZXJfc2lnbiA9IGRhdGFbXCJ1c2VyX3NpZ25cIl07XG4gICAgICAgIHZhciB1c2VyX2FjaGlldmVtZW50ID0gZGF0YVtcInVzZXJfYWNoaWV2ZW1lbnRcIl07XG4gICAgICAgIHZhciB1c2VyX2xvdHRlcnkgPSBkYXRhW1widXNlcl9sb3R0ZXJ5XCJdO1xuICAgICAgICB2YXIgdXNlcl9sYW5kX3Rhc2sgPSBkYXRhW1widXNlcl9sYW5kX3Rhc2tcIl07XG4gICAgICAgIHZhciB1c2VyX3ZpZGVvID0gZGF0YVtcInVzZXJfdmlkZW9cIl07XG4gICAgICAgIGlmICh0aGlzLkN1ckFjY291bnREYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5byA5aeL6I635Y+WY29uZmln5pWw5o2uXCIpO1xuICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YSA9IG5ldyBBY2NvdW50RGF0YSh0b2tlbiwgY29uZmlncywgYXBwX3NldHRpbmcsIHVzZXIsIHVzZXJfYmFzZSwgbnVsbCwgbnVsbCwgdXNlcl9zaWduLCB1c2VyX2FjaGlldmVtZW50LCB1c2VyX2xvdHRlcnksdXNlcl9sYW5kX3Rhc2ssdXNlcl92aWRlbyk7XG4gICAgICAgICAgICB0aGlzLkNoZWNrTG9jYWxDb25maWcoZGF0YS50YWJsZV92ZXJzaW9uLCAoX2NvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEuR2V0U2V2ZXJDb25maWcoX2NvbmZpZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3dDb25maWcgPSBfY29uZmlnO1xuICAgICAgICAgICAgICAgIGlmKGNvbXBsZXRlY2IgIT0gbnVsbClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlY2IucnVuV2l0aChkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb25maWdzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX2NvbmZpZ3MgPSBjb25maWdzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFwcF9zZXR0aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX2FwcF9zZXR0aW5nID0gYXBwX3NldHRpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV91c2VyID0gdXNlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1c2VyX2Jhc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fdXNlcl9iYXNlID0gdXNlcl9iYXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVzZXJfc2lnbikge1xuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV9zaWduID0gdXNlcl9zaWduO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVzZXJfYWNoaWV2ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fdGFzayA9IHVzZXJfYWNoaWV2ZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXNlcl9sb3R0ZXJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5sb3R0ZXJ5ID0gdXNlcl9sb3R0ZXJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodXNlcl9sYW5kX3Rhc2spXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3VzZV9sYW5kX3Rhc2sgPSB1c2VyX2xhbmRfdGFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHVzZXJfdmlkZW8pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3VzZXJfdmlkZW8gPSB1c2VyX3ZpZGVvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFVzZXJJbmZvRXZlbnQudXBkYXRlUGxheWVySW5mbyApO1xuICAgIH1cblxuICAgIHByaXZhdGUgQ2hlY2tMb2NhbENvbmZpZyhfdmVyOiBzdHJpbmcsIGNiOiBGdW5jdGlvbikge1xuICAgICAgICB2YXIgY3VyY29uZmlnID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SlNPTihQbGF5ZXJBY2NvdW50LmxvY2FsY29maWdrZXkpO1xuICAgICAgICBpZiAoY3VyY29uZmlnKSB7XG4gICAgICAgICAgICAvL0xheWEuTG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oUGxheWVyQWNjb3VudC5sb2NhbGNvZmlna2V5KTtcbiAgICAgICAgICAgIGlmIChjdXJjb25maWcudmVyID09IF92ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInNldmVy6YWN572u5piv5pyA5paw55qELi4uXCIsIF92ZXIpO1xuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5oiQ5YqfXCIpO1xuICAgICAgICAgICAgICAgIGNiKGN1cmNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBOZXR3b3JrTWFuYWdlci5JbnN0YW5jZS5IdHRwUG9zdFJlcXVlc3QoUFJPVE9DT0xTLkNvbmZpZywgbnVsbCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbmZpZ3MudmVyID0gX3ZlcjtcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihQbGF5ZXJBY2NvdW50LmxvY2FsY29maWdrZXksIGRhdGEuY29uZmlncyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2V2ZXLphY3nva7mm7TmlrDlrozmiJAuLi5cIiwgX3Zlcik7XG4gICAgICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5oiQ5YqfXCIpO1xuICAgICAgICAgICAgICAgICAgICBjYihkYXRhLmNvbmZpZ3MpO1xuICAgICAgICAgICAgICAgIH0pLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6YWN572u6I635Y+W5aSx6LSlXCIgKyBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCJjb25maWfmjqXlj6Pojrflj5blpLHotKVcIik7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTmV0d29ya01hbmFnZXIuSW5zdGFuY2UuSHR0cFBvc3RSZXF1ZXN0KFBST1RPQ09MUy5Db25maWcsIG51bGwsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhLmNvbmZpZ3MudmVyID0gX3ZlcjtcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRKU09OKFBsYXllckFjY291bnQubG9jYWxjb2ZpZ2tleSwgZGF0YS5jb25maWdzKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInNldmVy5L+d5a2Y6YWN572u5a6M5oiQLi4uXCIsIF92ZXIpO1xuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5oiQ5YqfXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNiKGRhdGEuY29uZmlncyk7XG5cbiAgICAgICAgICAgIH0pLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLphY3nva7ojrflj5blpLHotKVcIiArIGRhdGEpO1xuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5aSx6LSlXCIpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBTZXJ2ZXJUaW1lKCk6IG51bWJlciB7XG4gICAgICAgIGxldCB0aW1lID0gTGF5YS50aW1lci5jdXJyVGltZXI7XG4gICAgICAgIGxldCBzdGltZSA9IFBsYXllckFjY291bnQuU2VydmVyVGltZSArIE1hdGguY2VpbCgodGltZSAtIHRoaXMubG9jYWxUaW1lKSAvIDEwMDApO1xuICAgICAgICByZXR1cm4gc3RpbWU7XG4gICAgfVxufSIsIlxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29yZE1hbmFnZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6UmVjb3JkTWFuYWdlcjtcclxuICAgIGNvbnN0cnVjdG9yKClcclxuICAgIHtcclxuICAgICAgICBSZWNvcmRNYW5hZ2VyLmluc3RhbmNlID0gdGhpcztcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm5ldyByZWNvcmRcIik7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlJlY29yZE1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZihSZWNvcmRNYW5hZ2VyLmluc3RhbmNlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlY29yZE1hbmFnZXIuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjdXJtYW5hZ2VyID0gbmV3IFJlY29yZE1hbmFnZXIoKTtcclxuICAgICAgICAgICAgY3VybWFuYWdlci5Pbk5ldygpO1xyXG4gICAgICAgICAgICByZXR1cm4gY3VybWFuYWdlcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgUmVjb3JkU3RhcnQoKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiUmVjb3JkU3RhcnRcIik7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQuc3RhcnQoe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogNjAsXHJcbiAgICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgUmVjb3JkU3RvcCgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJSZWNvcmRTdG9wXCIpO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLnN0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wbGV0ZXBhdGg6c3RyaW5nO1xyXG5cclxuICAgIFNoYXJlVmlkZW8oX2NiOkZ1bmN0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQuc2hhcmVBcHBNZXNzYWdlKHtcclxuICAgICAgICAgICAgY2hhbm5lbDogXCJ2aWRlb1wiLFxyXG4gICAgICAgICAgICBxdWVyeTogXCJcIixcclxuICAgICAgICAgICAgdGVtcGxhdGVJZDogXCIxMWNkMmFrMTYwZjRrMTlhNmdcIiwgLy8g5pu/5o2i5oiQ6YCa6L+H5a6h5qC455qE5YiG5LqrSURcclxuICAgICAgICAgICAgdGl0bGU6IFwi6LWi5b6X5LqG5oiR77yM6K6k5L2g5YGa5aSn5ZOl5Y+I5aaC5L2VXCIsXHJcbiAgICAgICAgICAgIGRlc2M6IFwi6LWi5b6X5LqG5oiR77yM6K6k5L2g5YGa5aSn5ZOl5Y+I5aaC5L2VXCIsXHJcbiAgICAgICAgICAgIGV4dHJhOiB7XHJcbiAgICAgICAgICAgICAgdmlkZW9QYXRoOiB0aGlzLmNvbXBsZXRlcGF0aCwgLy8g5Y+v55So5b2V5bGP5b6X5Yiw55qE5pys5Zyw5paH5Lu26Lev5b6EXHJcbiAgICAgICAgICAgICAgdmlkZW9Ub3BpY3M6IFtcIui1ouW+l+S6huaIke+8jOiupOS9oOWBmuWkp+WTpeWPiOWmguS9lVwiXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdWNjZXNzKCkge1xyXG4gICAgICAgICAgICAgICAgX2NiICYmIF9jYih0cnVlKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWIhuS6q+inhumikeaIkOWKn1wiKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmFpbChlKSB7XHJcbiAgICAgICAgICAgICAgICBfY2IgJiYgX2NiKGZhbHNlKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWIhuS6q+inhumikeWksei0pVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVjb3JkOmFueTtcclxuICAgIE9uTmV3KClcclxuICAgIHtcclxuICAgICAgICBpZighTGF5YS5Ccm93c2VyLm9uTW9iaWxlKXJldHVybjtcclxuICAgICAgICB0aGlzLnJlY29yZCA9IExheWEuQnJvd3Nlci53aW5kb3cudHQuZ2V0R2FtZVJlY29yZGVyTWFuYWdlcigpO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLm9uU3RhcnQocmVzID0+IHtcclxuICAgICAgICAgICAgLy8g5b2V5bGP5byA5aeLXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMucmVjb3JkLm9uU3RvcChyZXMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlcGF0aCA9IHJlcy52aWRlb1BhdGg7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcy52aWRlb1BhdGgpO1xyXG4gICAgICAgICAgfSlcclxuICAgIH1cclxuXHJcblxyXG59IiwiXG5cblxuXG5leHBvcnQgZW51bSBzeXN0ZW10eXBlIHtcbiAgICBpb3MsIGFuZHJvaWQsIG90aGVyXG59XG5cbmV4cG9ydCBjbGFzcyBXeEFwaVxue1xuICAgIHB1YmxpYyBzdGF0aWMgcmVjb3JkQWxkRXZlbnQoa2V5OnN0cmluZyx2YWx1ZTpzdHJpbmc9XCJcIik6dm9pZFxuICAgIHtcbiAgICAgICAgLy8gaWYoTGF5YS5Ccm93c2VyLndpbmRvdyAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4KVxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFNlbmRFdmVudChrZXkse2tleTp2YWx1ZX0pO1xuICAgICAgICAvLyB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5LqL5Lu2OiBcIixrZXkpO1xuICAgIH1cbiAgICBzdGF0aWMgbmV3YWNjb3VudCA9IGZhbHNlO1xuICAgIHN0YXRpYyBzY2VuZVZhbHVlID0gXCJcIjtcbiAgICBzdGF0aWMgc2hhcmVPcGVuSWQgPSBcIlwiO1xuICAgIHN0YXRpYyBxdWVyeWNoYW5uZWwgPSBcIlwiO1xuICAgIHN0YXRpYyByZWZlcnJlckluZm9hcHBJZCA9IFwiXCI7XG4gICAgc3RhdGljIFdYTG9naW4oY2I6IEZ1bmN0aW9uKSBcbiAgICB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5sb2dpbih7XG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY29kZTpcIixyZXMuY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIGNiKHJlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6I635Y+W55So5oi355m75b2V5oCB5aSx6LSl77yBJyArIHJlcy5lcnJNc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAocmVzKSB7IGNvbnNvbGUubG9nKFwid3gubG9naW46IGZhaWxlZCwgcmVzPVwiICsgcmVzKTsgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgV3hJbml0KCkgXG4gICAge1xuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xuXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1NoYXJlTWVudShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoU2hhcmVUaWNrZXQ6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5vblNob3coKG9wdGlvbikgPT4gXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG9wdGlvbik7XG4gICAgICAgICAgICB0aGlzLnNoYXJlT3BlbklkID0gb3B0aW9uLnF1ZXJ5LnVzZXJJZDtcbiAgICAgICAgICAgIHRoaXMucXVlcnljaGFubmVsID0gb3B0aW9uLnF1ZXJ5LmNoYW5uZWw7XG4gICAgICAgICAgICBpZihvcHRpb24ucmVmZXJyZXJJbmZvKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmZXJyZXJJbmZvYXBwSWQgPSBvcHRpb24ucmVmZXJyZXJJbmZvLmFwcElkO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25TaG93IGFwcElkIGlzOlwiLCBvcHRpb24ucmVmZXJyZXJJbmZvLmFwcElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2NlbmVWYWx1ZSA9IG9wdGlvbi5zY2VuZTtcbiAgICAgICAgICAgIHZhciBzY2VuZSA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzY2VuZVwiKTtcbiAgICAgICAgICAgIGlmIChzY2VuZSkgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZVZhbHVlID0gc2NlbmU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLor7vlj5bphY3nva7lnLrmma/lgLw6XCIgKyBzY2VuZSk7XG4gICAgICAgICAgICB9ICBcbiAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuesrOS4gOasoeaLieWPluWcuuaZr+WAvDpcIiArIHRoaXMuc2NlbmVWYWx1ZSk7XG4gICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwic2NlbmVcIiwgdGhpcy5zY2VuZVZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvL+aYvuekuuWKoOi9veS/oeaBr1xuICAgIHByaXZhdGUgc3RhdGljIGlzU2hvd2luZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBzdGF0aWMgU2hvd0xvYWRpbmcodGl0bGU6IHN0cmluZyA9IFwi5Yqg6L295LitLi4uXCIpIFxuICAgIHtcbiAgICAgICAgLy8gaWYgKHRoaXMuaXNTaG93aW5nKSByZXR1cm47XG4gICAgICAgIC8vIHRoaXMuaXNTaG93aW5nID0gdHJ1ZTtcbiAgICAgICAgLy8gKExheWEuQnJvd3Nlci5vbk1pbmlHYW1lKSAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dMb2FkaW5nKHsgdGl0bGU6IHRpdGxlLCBtYXNrOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgSGlkZUxvYWRpbmcoKSBcbiAgICB7XG4gICAgICAgIC8vIHRoaXMuaXNTaG93aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIChMYXlhLkJyb3dzZXIub25NaW5pR2FtZSkgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5oaWRlTG9hZGluZygpO1xuICAgIH1cblxuICAgIHN0YXRpYyBhbGRTZW5kT3BlbmlkKF9vcGVuaWQ6c3RyaW5nKVxuICAgIHtcbiAgICAgICAgLy8gaWYoTGF5YS5Ccm93c2VyLm9uTWluaUdhbWUpXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiYWxkU2VuZE9wZW5pZFwiLF9vcGVuaWQpO1xuICAgICAgICAvLyAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTZW5kT3BlbmlkKF9vcGVuaWQpO1xuICAgICAgICAvLyB9XG4gICAgfVxuICAgIFxuICAgIC8v5qOA5rWL5pu05pawXG4gICAgc3RhdGljIENoZWNrV1hVcGRhdGUoKSBcbiAgICB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZU1hbmFnZXIgPSBMYXlhLkJyb3dzZXIud2luZG93LnR0LmdldFVwZGF0ZU1hbmFnZXIoKTtcblxuICAgICAgICB1cGRhdGVNYW5hZ2VyLm9uQ2hlY2tGb3JVcGRhdGUoKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnIDmlrDniYjmnKw6XCIgKyByZXMuaGFzVXBkYXRlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZVJlYWR5KCgpID0+IHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQuc2hvd01vZGFsKHtcbiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+abtOaWsOaPkOekuicsXG4gICAgICAgICAgICAgICAgY29udGVudDogJ+aWsOeJiOacrOW3sue7j+WHhuWkh+Wlve+8jOaYr+WQpumHjeWQr+W6lOeUqO+8nycsXG4gICAgICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5hcHBseVVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmFpbChyZXM/KSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIuYXBwbHlVcGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGxldmVsU3RhcnQoc3RhZ2VJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCLlvIDlp4vorrDlvZXlhbPljaE6XCIgKyBzdGFnZUlkKTtcbiAgICAgICAgLy8gaWYgKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eCkge1xuICAgICAgICAvLyAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblN0YXJ0KFxuICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VJZDogc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgIHVzZXJJZDogdXNlcklkIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgKTtcbiAgICAgICAgLy8gICAgIGlmKFd4QXBpLm5ld2FjY291bnQpXG4gICAgICAgIC8vICAgICB7XG4gICAgICAgIC8vICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblN0YXJ0KFxuICAgICAgICAvLyAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBzdGFnZUlkOiBcIuaWsOeUqOaItzpcIiArIHN0YWdlSWQsICAgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHVzZXJJZDogdXNlcklkIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgIC8vICAgICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICApOyBcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHN0YXRpYyBsZXZlbFJ1bm5pbmcoc3RhZ2VJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsdXNlcmV2aXZlOnN0cmluZylcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi6K6w5b2V5YWz5Y2h5LitOlwiICsgc3RhZ2VJZCk7XG4gICAgICAgIC8vIGlmKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eClcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblJ1bm5pbmcoe1xuICAgICAgICAvLyAgICAgICAgIHN0YWdlSWQgICA6IHN0YWdlSWQsICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICBzdGFnZU5hbWUgOiBzdGFnZU5hbWUsICAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgdXNlcklkICAgIDogdXNlcklkLCAvL+eUqOaIt0lEIOWPr+mAiVxuICAgICAgICAvLyAgICAgICAgIGV2ZW50ICAgICA6IFwicmV2aXZlXCIsICAvL+S9v+eUqOmBk+WFtyAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgIHBhcmFtcyAgICA6IHtcbiAgICAgICAgLy8gICAgICAgICAgIGl0ZW1OYW1lICA6IFwi5L2/55So5aSN5rS7XCIsLy/kvb/nlKjpgZPlhbflkI3np7Ag6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICBpdGVtQ291bnQgOiAxLCAgIC8v5L2/55So6YGT5YW35pWw6YePICDlj6/pgIlcbiAgICAgICAgLy8gICAgICAgICAgIGRlc2MgICAgICA6IHVzZXJldml2ZSAvL+S9v+eUqOmBk+WFt+aPj+i/sFxuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgfSk7XG4gICAgICAgIC8vICAgICAgIGlmKFd4QXBpLm5ld2FjY291bnQpXG4gICAgICAgIC8vICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uUnVubmluZyh7XG4gICAgICAgIC8vICAgICAgICAgICAgIHN0YWdlSWQgICA6XCLmlrDnlKjmiLc6XCIgKyAgc3RhZ2VJZCwgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgICBzdGFnZU5hbWUgOiBzdGFnZU5hbWUsICAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgIHVzZXJJZCAgICA6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcbiAgICAgICAgLy8gICAgICAgICAgICAgZXZlbnQgICAgIDogXCJyZXZpdmVcIiwgIC8v5L2/55So6YGT5YW3ICDlhbPljaHov5vooYzkuK3vvIznlKjmiLfop6blj5HnmoTmk43kvZwgICAg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgIHBhcmFtcyAgICA6IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICBpdGVtTmFtZSAgOiBcIuS9v+eUqOWkjea0u1wiLC8v5L2/55So6YGT5YW35ZCN56ewIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgICAgIGl0ZW1Db3VudCA6IDEsICAgLy/kvb/nlKjpgZPlhbfmlbDph48gIOWPr+mAiVxuICAgICAgICAvLyAgICAgICAgICAgICAgIGRlc2MgICAgICA6IHVzZXJldml2ZSAvL+S9v+eUqOmBk+WFt+aPj+i/sFxuICAgICAgICAvLyAgICAgICAgICAgICB9XG4gICAgICAgIC8vICAgICAgICAgICB9KVxuICAgICAgICAvLyAgICAgICB9XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgbGV2ZWxTdWNjZXNzKHN0YWdlSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCBcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi6K6w5b2V5YWz5Y2hOuWujOaIkFwiICsgc3RhZ2VJZCk7XG4gICAgICAgIC8vIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcbiAgICAgICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgIC8vICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICBzdGFnZUlkOiBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgdXNlcklkOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgIC8vICAgICAgICAgICAgIGV2ZW50OiBcImNvbXBsZXRlXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFyYW1zOlxuICAgICAgICAvLyAgICAgICAgICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5YWz5Y2h5a6M5oiQXCIgICAvL+aPj+i/sFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgLy8gICAgICk7XG4gICAgICAgIC8vICAgICBpZihXeEFwaS5uZXdhY2NvdW50KVxuICAgICAgICAvLyAgICAge1xuICAgICAgICAvLyAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgIC8vICAgICAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHN0YWdlSWQ6XCLmlrDnlKjmiLc6XCIgKyBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50OiBcImNvbXBsZXRlXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHBhcmFtczpcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5YWz5Y2h5a6M5oiQXCIgICAvL+aPj+i/sFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgLy8gICAgICAgICApO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgc3RhdGljIGxldmVsRmFpbChzdGFnZUlkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgc2NvcmU6IHN0cmluZywgY2FybmFtZTogc3RyaW5nKTogdm9pZCBcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi6K6w5b2V5YWz5Y2hOuWksei0pVwiICsgc3RhZ2VJZCk7XG4gICAgICAgIC8vIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcbiAgICAgICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgIC8vICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICBzdGFnZUlkOiBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgdXNlcklkOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgIC8vICAgICAgICAgICAgIGV2ZW50OiBcImZhaWxcIiwgICAvL+WFs+WNoeWujOaIkCAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgICBwYXJhbXM6XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZGVzYzogXCLlpLHotKVcIixcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBzY29yZTogc2NvcmUsLy/mj4/ov7BcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBjYXI6IGNhcm5hbWUvL+aPj+i/sFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICk7XG4gICAgICAgIC8vICAgICBpZihXeEFwaS5uZXdhY2NvdW50KVxuICAgICAgICAvLyAgICAge1xuICAgICAgICAvLyAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgIC8vICAgICAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHN0YWdlSWQ6XCLmlrDnlKjmiLc6XCIgKyBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50OiBcImZhaWxcIiwgICAvL+WFs+WNoeWujOaIkCAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgcGFyYW1zOlxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogXCLlpLHotKVcIixcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmU6IHNjb3JlLC8v5o+P6L+wXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNhcjogY2FybmFtZS8v5o+P6L+wXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgICAgICB9XG4gICAgICAgIC8vICAgICAgICAgKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHN0YXRpYyBPblNob3coY2I6IEZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLndpbmRvdy50dCkgcmV0dXJuO1xuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0Lm9uU2hvdyhjYik7XG4gICAgfVxuXG4gICAgc3RhdGljIE9mZlNob3coY2I6IEZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQub2ZmU2hvdyhjYik7XG4gICAgfVxuXG4gICAgc3RhdGljIENhblNoYWtlID0gdHJ1ZTtcblxuICAgIHByaXZhdGUgc3RhdGljIHNoYWtlKCk6IHZvaWQgXG4gICAge1xuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnZpYnJhdGVTaG9ydCh7fSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2hha2VMb25nKCk6IHZvaWQgXG4gICAge1xuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnZpYnJhdGVMb25nKHt9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIFNoYWtlKF9zaG9ydCA9IHRydWUpIFxuICAgIHtcbiAgICAgICAgaWYoTGF5YS5Ccm93c2VyLndpbmRvdy50dCAmJiBXeEFwaS5DYW5TaGFrZSkgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKF9zaG9ydCkgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFrZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWtlTG9uZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKCFfc2hvcnQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc3RhZ2VTaGFrZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIOaYr+WQpumch+WKqOS4rSAqL1xuICAgIHN0YXRpYyBpc1NoYWtlOmJvb2xlYW47XG4gICAgc3RhdGljIHRpbWVzID0gMS4zO1xuICAgIHN0YXRpYyBudW06bnVtYmVyID0gMDtcbiAgICBzdGF0aWMgb2Zmc2V0QXJyID0gWzAsIDBdO1xuICAgIHN0YXRpYyBvZmZzZXQgPSAxNDtcbiAgICBzdGF0aWMgY2Fuc2hha2VzdGFnZSA9IGZhbHNlO1xuXG4gICAgc3RhdGljIHN0YWdlU2hha2UoY2FsbEJhY2s6RnVuY3Rpb24gPSBudWxsLHNwZWVkOm51bWJlciA9IDMyKTp2b2lkXG4gICAge1xuICAgICAgICBpZih0aGlzLmlzU2hha2UgfHwgIXRoaXMuY2Fuc2hha2VzdGFnZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzU2hha2UgPSB0cnVlO1xuXG4gICAgICAgIHZhciBwb2ludDpMYXlhLlZlY3RvcjIgPSBuZXcgTGF5YS5WZWN0b3IyKExheWEuc3RhZ2UueCwgTGF5YS5zdGFnZS55KTtcbiAgICAgICAgTGF5YS5zdGFnZS50aW1lckxvb3Aoc3BlZWQsIHRoaXMsIHRoaXMuc2hha2VPYmplY3QsW3BvaW50LGNhbGxCYWNrXSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNoYWtlT2JqZWN0KF9wb2ludDpMYXlhLlZlY3RvcjIsX2NhbGxCYWNrKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgY291bnQ6bnVtYmVyID0gKHRoaXMubnVtKyspICUgNDtcbiAgICAgICAgdGhpcy5vZmZzZXRBcnJbdGhpcy5udW0gJSAyXSA9IGNvdW50IDwgMiA/IDAgOiB0aGlzLm9mZnNldDtcbiAgICAgICAgTGF5YS5zdGFnZS54ID0gdGhpcy5vZmZzZXRBcnJbMF0gKyBfcG9pbnQueDtcbiAgICAgICAgTGF5YS5zdGFnZS55ID0gdGhpcy5vZmZzZXRBcnJbMV0gKyBfcG9pbnQueTtcblxuICAgICAgICBpZih0aGlzLm51bSA+ICh0aGlzLnRpbWVzICogNCArIDEpKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLnN0YWdlLmNsZWFyVGltZXIodGhpcywgdGhpcy5zaGFrZU9iamVjdCk7XG4gICAgICAgICAgICBMYXlhLnN0YWdlLnBvcygwLDApO1xuICAgICAgICAgICAgdGhpcy5udW0gPSAwO1xuICAgICAgICAgICAgdGhpcy5pc1NoYWtlID0gZmFsc2U7XG4gICAgICAgICAgICBpZihfY2FsbEJhY2sgIT0gbnVsbClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBfY2FsbEJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd1R4dCh0ZXh0OiBzdHJpbmcpIFxuICAgIHtcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cudHQpIFxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnNob3dUb2FzdCh7IHRpdGxlOiB0ZXh0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgU3lzdGVtRnJvbSgpOiBzeXN0ZW10eXBlIFxuICAgIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybiBzeXN0ZW10eXBlLm90aGVyO1xuXG4gICAgICAgIGxldCBpbmZvID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgICAgICB2YXIgc3lzdGVtOiBzdHJpbmcgPSBpbmZvLnN5c3RlbTtcbiAgICAgICAgdmFyIElPUyA9IHN5c3RlbS5pbmRleE9mKFwiaU9TXCIpICE9IC0xO1xuICAgICAgICB2YXIgQW5kcm9pZCA9IHN5c3RlbS5pbmRleE9mKFwiQW5kcm9pZFwiKSAhPSAtMTtcblxuICAgICAgICBpZiAoSU9TKSB7XG4gICAgICAgICAgICByZXR1cm4gc3lzdGVtdHlwZS5pb3M7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQW5kcm9pZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN5c3RlbXR5cGUuYW5kcm9pZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzeXN0ZW10eXBlLm90aGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBJc0xvbmdTY3JlZW5TeXN0ZW0oKTpib29sZWFuXG4gICAge1xuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgc3lzdGVtSW5mbyA9IExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcbiAgICAgICAgbGV0IHBsYXRmb3JtTW9kZWwgPSBcImlweFwiO1xuICAgICAgICBpZiAoc3lzdGVtSW5mbyAhPSBudWxsKSB7XG4gICAgICAgIHZhciBtb2RlbCA9IHN5c3RlbUluZm8ubW9kZWw7XG4gICAgICAgIHBsYXRmb3JtTW9kZWwgPSBgJHtzeXN0ZW1JbmZvLmJyYW5kfV8ke21vZGVsfV8ke3N5c3RlbUluZm8uc3lzdGVtfV93eCR7c3lzdGVtSW5mby52ZXJzaW9ufV9TREtWZXIke3N5c3RlbUluZm8uU0RLVmVyc2lvbn1gO1xuICAgICAgICBjb25zb2xlLmxvZyhcInBsYXRmb3JtTW9kZWw6XCIgKyBwbGF0Zm9ybU1vZGVsKTtcbiAgICAgICAgcmV0dXJuICAhKG1vZGVsLmluZGV4T2YoXCJYXCIpIDwgMCkgfHxcbiAgICAgICAgKChtb2RlbC5pbmRleE9mKFwib3Bwb1wiKSA+PSAwIHx8IG1vZGVsLmluZGV4T2YoXCJPUFBPXCIpID49IDApICYmIChtb2RlbC5pbmRleE9mKFwiUjE1XCIpID49IDAgfHwgbW9kZWwuaW5kZXhPZihcInIxNVwiKSA+PSAwKSkgfHxcbiAgICAgICAgc3lzdGVtSW5mby5zdGF0dXNCYXJIZWlnaHQgPiAyMCB8fFxuICAgICAgICAobW9kZWwuaW5kZXhPZihcIk5vdGVcIikgPj0gMCAmJiAobW9kZWwuaW5kZXhPZihcIjdcIikgPj0gMCB8fCBtb2RlbC5pbmRleE9mKFwiOFwiKSA+PSAwKSkgfHxcbiAgICAgICAgKChtb2RlbC5pbmRleE9mKFwiaVBob25lXCIpID49IDApICYmIChtb2RlbC5pbmRleE9mKFwiMTFcIikgPj0gMCkpXG59XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3cml0ZVN0YWdlKHN0YWdlOiBudW1iZXIpXG4gICAge1xuICAgICAgICB2YXIga3ZEYXRhTGlzdCA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB2YXIgbXlWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIFwid3hnYW1lXCI6IFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwic3RhZ2VcIjogc3RhZ2UsXG4gICAgICAgICAgICAgICAgXCJ1cGRhdGVfdGltZVwiOiBkYXRlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGt2RGF0YUxpc3QucHVzaCh7a2V5Olwic3RhZ2VcIiwgdmFsdWU6IG15VmFsdWV9KTtcbiAgICAgIFxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zZXRVc2VyQ2xvdWRTdG9yYWdlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgS1ZEYXRhTGlzdDoga3ZEYXRhTGlzdCxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzczogcj0+XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5Lyg5YiG5pWw5oiQ5YqfXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBjcFZlcnNpb25HcmVhdGVyT3JFcXVhbCh2MTogc3RyaW5nLCB2Mjogc3RyaW5nKSBcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbTE9HXeWfuuehgOW6k+eJiOacrOWPtyBjdXJWZXI6JHt2MX0gdGFyZ1Zlcjoke3YyfWApO1xuICAgICAgICBsZXQgdjFBcnIgPSB2MS5zcGxpdChcIi5cIik7XG4gICAgICAgIGxldCB2MkFyciA9IHYyLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgbGV0IGxlbiA9IHYxQXJyLmxlbmd0aDtcbiAgICAgICAgaWYgKHYyQXJyLmxlbmd0aCA8IGxlbikge1xuICAgICAgICAgICAgbGVuID0gdjJBcnIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2ZXIxID0gTnVtYmVyKHYxQXJyW2ldKTtcbiAgICAgICAgICAgIGxldCB2ZXIyID0gTnVtYmVyKHYyQXJyW2ldKTtcbiAgICAgICAgICAgIGlmICh2ZXIxID4gdmVyMikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmVyMSA8IHZlcjIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHYxQXJyLmxlbmd0aCA+PSB2MkFyci5sZW5ndGg7XG4gICAgfVxufSIsImltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQge1NvY2tldE5vZmlmeX0gZnJvbSBcIi4uL1dYU0RLL1NvY2tldE5vZmlmeVwiO1xuXG5leHBvcnQgY2xhc3MgU2VydmVyU29ja2V0XG57XG4gICAgcHJpdmF0ZSBzb2NrOiBMYXlhLlNvY2tldDtcblxuICAgIHByaXZhdGUgc3RhdGljIGluczogU2VydmVyU29ja2V0O1xuXG4gICAgLyoqXG4gICAgICogMTroh6rliqjmlq3nur/vvIwy77ya5Li75Yqo5pat57q/XG4gICAgICovXG4gICAgcHJpdmF0ZSBfb2ZmbGluZXN0YXRlOm51bWJlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiDmlq3nur/ph43ov57mrKHmlbBcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jb25uZXROdW1zOm51bWJlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBzb2NrZXTov57mjqXkuK1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBTZXJ2ZXJTb2NrZXQuaW5zID0gdGhpcztcbiAgICB9XG4gICAgcHJpdmF0ZSBfc29ja2V0Y29ubmV0aW5nOmJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFNlcnZlclNvY2tldCB7XG4gICAgICAgIGlmIChTZXJ2ZXJTb2NrZXQuaW5zID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyU29ja2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNlcnZlclNvY2tldC5pbnM7XG4gICAgfVxuXG4gICAgLy/ov57mjqXmnI3liqHlmahcbiAgICBwdWJsaWMgY29ubmVjdFNlcnZlcihnYW1lSG9zdDpzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fc29ja2V0Y29ubmV0aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZW1vdmVTb2NrZXQoKTtcbiAgICAgICAgaWYgKCF0aGlzLnNvY2sgfHwgIXRoaXMuc29jay5jb25uZWN0ZWQpIFxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm9wZW53YWl0cGFuZWwoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zb2NrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrID0gbmV3IExheWEuU29ja2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrLm9uKExheWEuRXZlbnQuT1BFTiwgdGhpcywgdGhpcy5vblNvY2tldE9wZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuc29jay5vbihMYXlhLkV2ZW50Lk1FU1NBR0UsIHRoaXMsIHRoaXMub25SZWNlaXZlTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrLm9uKExheWEuRXZlbnQuQ0xPU0UsIHRoaXMsIHRoaXMub25Tb2NrZXRDbG9zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrLm9uKExheWEuRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMuaW9FcnJvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc29jay5jb25uZWN0QnlVcmwoZ2FtZUhvc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29ubmVjdCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuc29jayAmJiB0aGlzLnNvY2suY29ubmVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpb0Vycm8oZTogYW55ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zb2NrZXRjb25uZXRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY29ubmV0TnVtcysrO1xuICAgICAgICB0aGlzLmNsb3Nld2FpdHBhbmVsKCk7XG4gICAgICAgIHRoaXMucmVtb3ZlU29ja2V0KCk7XG4gICAgICAgIHRoaXMuX29mZmxpbmVzdGF0ZT0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlU29ja2V0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5fc29ja2V0Y29ubmV0aW5nID0gZmFsc2U7XG4gICAgICAgIGlmKHRoaXMuc29jaylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50Lk9QRU4sIHRoaXMsIHRoaXMub25Tb2NrZXRPcGVuKTtcbiAgICAgICAgICAgIHRoaXMuc29jay5vZmYoTGF5YS5FdmVudC5NRVNTQUdFLCB0aGlzLCB0aGlzLm9uUmVjZWl2ZU1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50LkNMT1NFLCB0aGlzLCB0aGlzLm9uU29ja2V0Q2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLmlvRXJybyk7XG4gICAgICAgICAgICB0aGlzLnNvY2suY2xlYW5Tb2NrZXQoKTtcbiAgICAgICAgICAgIHRoaXMuc29jay5jbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5zb2NrID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaJi+WKqOWFs+mXrea4uOaIj3NvY2tldFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2xzZVNvY2tldCggb2ZmbGluZXN0YXRlOm51bWJlciA9IDEgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5pc0Nvbm5lY3QoKSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2V3YWl0cGFuZWwoKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU29ja2V0KCk7XG4gICAgICAgICAgICBpZiggb2ZmbGluZXN0YXRlICE9IC0xIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZsaW5lc3RhdGU9IG9mZmxpbmVzdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFNvY2tldE5vZmlmeS5TT0NLRVRfQ0xPU0UgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Tb2NrZXRDbG9zZShlOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3NvY2tldGNvbm5ldGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNsb3Nld2FpdHBhbmVsKCk7XG4gICAgICAgIHRoaXMuX29mZmxpbmVzdGF0ZT0xO1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBTb2NrZXROb2ZpZnkuU09DS0VUX0NMT1NFICk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGNsb3Nld2FpdHBhbmVsKCk6IHZvaWQgXG4gICAge1xuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvcGVud2FpdHBhbmVsKCk6IHZvaWQgXG4gICAge1xuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LnNob3dNb2RhbFdhaXQoKTtcbiAgICB9XG5cblxuICAgIC8v6L+e5o6l5oiQ5Yqf6L+U5ZueXG4gICAgcHJpdmF0ZSBvblNvY2tldE9wZW4oZXZlbnQ6IGFueSA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY29ubmV0TnVtcyA9IDA7XG4gICAgICAgIHRoaXMuY2xvc2V3YWl0cGFuZWwoKTtcbiAgICAgICAgdGhpcy5fb2ZmbGluZXN0YXRlID0gMDtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudChTb2NrZXROb2ZpZnkuU09DS0VUX0NPTk5FQ1RfU1VDQ0VFRCwgbnVsbCwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8v5ZCR5pyN5Yqh56uv5Y+R6YCB5raI5oGvXG4gICAgcHVibGljIHNlbmRNZXNzYWdlKGFjdDogc3RyaW5nLCBkYXRhOiBhbnksIGlzU2hvd1dhaXQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmKCB0aGlzLnNvY2sgJiYgdGhpcy5zb2NrLmNvbm5lY3RlZCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCBpc1Nob3dXYWl0IClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW53YWl0cGFuZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCAhZGF0YSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YT17fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEuQUNUSU9OID0gYWN0O1xuICAgICAgICAgICAgdGhpcy5zb2NrLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL+a2iOaBr+i/lOWbnuWQju+8jOS8muW5v+aSreWHuuWOu1xuICAgIC8vR2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCLkvaDlj5HpgIHnmoRjbWTlkI3np7BcIiznm5HlkKzmlrnms5UsdGhpcylcbiAgICBwcml2YXRlIG9uUmVjZWl2ZU1lc3NhZ2UobXNnOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgICAgIHZhciBzb2NrZXRkYXRhOiBhbnkgPSBKU09OLnBhcnNlKG1zZyk7XG5cbiAgICB9XG59IiwiZXhwb3J0IGNsYXNzIFNvY2tldE5vZmlmeVxueyAgIFxuICAgIC8qKlxuICAgICAqIHNvY2tldOi/nuaOpeaIkOWKn1xuICAgICAqL1xuICAgIHN0YXRpYyBTT0NLRVRfQ09OTkVDVF9TVUNDRUVEOnN0cmluZyA9IFwiU09DS0VUX0NPTk5FQ1RfU1VDQ0VFRFwiO1xuXG4gICAgLyoqXG4gICAgICogc29ja2V05YWz6ZetXG4gICAgICovXG4gICAgc3RhdGljIFNPQ0tFVF9DTE9TRTpzdHJpbmcgPSBcIlNPQ0tFVF9DTE9TRVwiO1xuXG4gICAgLyoqXG4gICAgICog5ri45oiP6YeN5paw6L+e5o6lXG4gICAgICovXG4gICAgc3RhdGljIEdhbWVfYWdhaW5Db25uZXRTb2NrZXQ6c3RyaW5nID0gXCJHYW1lX2FnYWluQ29ubmV0U29ja2V0XCI7XG59IiwiZXhwb3J0IGNsYXNzIFdFQ0hBVEVWRU5UIFxue1xuICAgIFxuXG4gICAgIC8qKlxuICAgICAqIOa4uOaIj+i/m+WFpeWQjuWPsOS6i+S7tlxuICAgICAqL1xuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9vbmhpZGU6c3RyaW5nID0gXCJXRUNIQVRFVkVOVF9vbmhpZGVcIjtcblxuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9vbkF1ZGlvSW50ZXJydXB0aW9uRW5kOnN0cmluZyA9IFwiV0VDSEFURVZFTlRfb25BdWRpb0ludGVycnVwdGlvbkVuZFwiO1xuXG4gICAgc3RhdGljIFdFQ0hBVEVWRU5UX2xvc2Vmb2N1czpzdHJpbmcgPSBcIldFQ0hBVEVWRU5UX2xvc2Vmb2N1c1wiO1xuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9nZXRmb2N1czpzdHJpbmcgPSBcIldFQ0hBVEVWRU5UX2dldGZvY3VzXCI7XG5cbiAgICBzdGF0aWMgV0VDSEFURVZFTlRfdXBkYXRlVmlkZW9OdW1zOnN0cmluZyA9IFwiV0VDSEFURVZFTlRfdXBkYXRlVmlkZW9OdW1zXCI7XG5cbiAgICAvKipcbiAgICAgKiDnlKjmiLfmiZPngrlcbiAgICAgKi9cbiAgICBzdGF0aWMgbWVzc2FnZV85ODkxMDAyOnN0cmluZyA9IFwiOTg5MTAwMlwiO1xuXG4gICAgLyoqXG4gICAgICog6I635Y+W5ZCO5Y+w5pWw5o2uXG4gICAgICovXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTEwMTpzdHJpbmcgPSBcIjk4OTExMDFcIjtcblxuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9sb2dpblN1Y2NlZWQ6c3RyaW5nID0gXCJXRUNIQVRFVkVOVF9sb2dpblN1Y2NlZWRcIjtcbiAgICAvKipcbiAgICAgKiDmuLjmiI/ku47lkI7lj7DmgaLlpI3mmL7npLrkuovku7ZcbiAgICAgKi9cbiAgICBzdGF0aWMgV0VDSEFURVZFTlRfb25zaG93OnN0cmluZyA9IFwiV0VDSEFURVZFTlRfb25zaG93XCI7XG5cbiAgIFxuXG4gICAgLyoqXG4gICAgICog5LuO5pS26JeP5oiW6ICF5rWu56qX6L+b5YWl5ri45oiPXG4gICAgICovXG4gICAgc3RhdGljIFdFQ0hBVEVWRU5UX2Zyb21zY29yZms6c3RyaW5nID0gXCJXRUNIQVRFVkVOVF9mcm9tc2NvcmZrXCI7XG5cbiAgICAvKipcbiAgICAgKiDnmbvlvZVcbiAgICAgKi9cbiAgICBzdGF0aWMgbWVzc2FnZV85ODkxMDAxOnN0cmluZyA9IFwiOTg5MTAwMVwiO1xuICAgIC8qKlxuICAgICAqIOW5v+WRiueCueWHu1xuICAgICAqL1xuICAgIHN0YXRpYyBtZXNzYWdlXzk4OTExMDI6c3RyaW5nID0gXCI5ODkxMTAyXCI7XG4gICAgLyoqXG4gICAgICog54K55Ye756Gu5a6a6Lez6L2s5Yiw5aSW6YOo5ri45oiPXG4gICAgICovXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTEwMzpzdHJpbmcgPSBcIjk4OTExMDNcIjtcbn0iLCJpbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XG5pbXBvcnQge1NlcnZlckh0dHBzfSBmcm9tIFwiLi4vV1hTREsvU2VydmVySHR0cHNcIjtcbmltcG9ydCB7V0VDSEFURVZFTlR9IGZyb20gXCIuLi9XWFNESy9XRUNIQVRFVkVOVFwiO1xuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xuaW1wb3J0IHtEYXRlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvRGF0ZUNvbnRyb2xcIjtcbmltcG9ydCB7TG9jYWxEYXRhQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvTG9jYWxEYXRhQ29udHJvbFwiO1xuaW1wb3J0IHtVc2VyRGF0YUluZm99IGZyb20gXCIuLi9EYXRhL1VzZXJEYXRhSW5mb1wiO1xuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbmltcG9ydCB7QXVkaW9Db250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9BdWRpb0NvbnRyb2xcIjtcbmltcG9ydCB7IExheW91dENvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9MYXlvdXRDb250cm9sXCI7XG5pbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4uL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xuXG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCAgY2xhc3MgV1hHYW1lUGxhdGZvcm1cbntcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6V1hHYW1lUGxhdGZvcm07XG5cbiAgICBzdGF0aWMgY29kZTpzdHJpbmc7XG4gICAgc3RhdGljIG5pY2tOYW1lOnN0cmluZztcbiAgICBzdGF0aWMgUXVEYW9JRDpzdHJpbmcgPSBcIlwiOy8v5b6u5L+h5bm/5ZGKSURcblxuICAgIHN0YXRpYyBpc1Nob3dpbmc6Ym9vbGVhbj10cnVlO1xuICAgIC8qKlxuICAgICAqIOaOiOadg+eKtuaAgSAwOuacquWIpOaWre+8jDHvvJrlt7LmjojmnYNcbiAgICAgKi9cbiAgICBzdGF0aWMgYWNjcmVkaXRzdGF0ZTpudW1iZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICog5b2T5aSp5YiG5Lqr5qyh5pWwXG4gICAgICovXG4gICAgc3RhdGljIGRheVNoYXJlTnVtOm51bWJlciA9IDA7XG4gICAgLyoqXG4gICAgICog5b2T5aSp55yL6KeG6aKR5qyh5pWwXG4gICAgICovXG4gICAgc3RhdGljIGRheVZpZGVvTnVtOm51bWJlciA9IDA7XG4gICAgLyoqXG4gICAgICog5Yik5pat5YiG5Lqr5piv5ZCm5oiQ5Yqf5pe26Ze06Ze06ZqUXG4gICAgICovXG4gICAgc3RhdGljIFNoYXJlVGltZTpudW1iZXIgPSAwO1xuICAgIC8qKlxuICAgICAqIOavj+aXpeacgOWkp+eci+inhumikeasoeaVsO+8iOaIkOWKn+e0r+WKoOS4gOasoe+8iVxuICAgICAqL1xuICAgIHN0YXRpYyBWaWRlb051bTpudW1iZXIgPSAwO1xuICAgIC8qKlxuICAgICAqIOeci+inhumikeWGt+WNtOaXtumXtFxuICAgICAqL1xuICAgIHN0YXRpYyBWaWRlb1RpbWU6bnVtYmVyID0gMDtcblxuICAgIC8qKlxuICAgICAqIDjlpb3kvY1jcGHlj6/lvLnlh7rml7bpl7Tpl7TpmpQo56eSKVxuICAgICAqL1xuICAgIHN0YXRpYyBqaWxpd2VpdGltZTpudW1iZXIgPSAxMDA7XG4gICAgLyoqXG4gICAgICog5YiG5Lqr5Yeg5qyh5YiH5o2i5Yiw6KeG6aKRXG4gICAgICovXG4gICAgc3RhdGljIFNoYXJldG9WaWRlbzpudW1iZXIgPSAxO1xuXG4gICAgLyoqXG4gICAgICog6KeG6aKR5Yeg5qyh5YiH5o2i5Yiw5YiG5LqrXG4gICAgICovXG4gICAgc3RhdGljIFZpZGVvdG9TaGFyZTpudW1iZXIgPSAxO1xuXG4gICAgLyoqXG4gICAgICog5YiG5Lqr5pWw5o2u5a655ZmoXG4gICAgICovXG4gICAgc3RhdGljIFNoYXJlRGljdDphbnkgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIOeUqOaIt+adpea6kGlkXG4gICAgICovXG4gICAgc3RhdGljIGZyb21zY2VuZTpudW1iZXIgPSAwO1xuXG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0uaW5zID0gdGhpcztcblxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6V1hHYW1lUGxhdGZvcm1cbiAgICB7XG4gICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5pbnMgPT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgV1hHYW1lUGxhdGZvcm0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV1hHYW1lUGxhdGZvcm0uaW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5zaG93U2hhcmVNZW51KHt3aXRoU2hhcmVUaWNrZXQ6dHJ1ZX0pO1xuICAgICAgICB0aGlzLm9uQXVkaW9JbnRlcnJ1cHRpb25CZWdpbigpO1xuICAgICAgICB0aGlzLm9uQXVkaW9JbnRlcnJ1cHRpb25FbmQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdFNoYXJlRGlhbiggZGF0YTpBcnJheTxhbnk+ICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGl0ZW1kOmFueTtcbiAgICAgICAgICAgIGZvciggdmFyIHMgaW4gZGF0YSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaXRlbWQgPSBkYXRhW3NdO1xuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLlNoYXJlRGljdFtpdGVtZC5rZXldID0gaXRlbWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZmlyc3RkOmFueSA9IGRhdGFbMF07XG4gICAgICAgICAgICB0aGlzLm9uU2hhcmVBcHBNZXNzYWdlKGZpcnN0ZC50aWxlLEdsb2JhbC5jZG51cmwgKyBmaXJzdGQuaW1nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpbml0RGF0YSgpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBEYXRlQ29udHJvbC5GcmVzaCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtPTA7XG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bT0wO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXlTaGFyZUluZm8oKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGF5VmlkZW9JbmZvKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlTaGFyZU51bT1Mb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmdldG51bShVc2VyRGF0YUluZm8ubm93ZGF5U2hhcmUpO1xuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW09TG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5nZXRudW0oVXNlckRhdGFJbmZvLm5vd2RheVZpZGVvKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5a2Y5YKo5b2T5aSp5YiG5Lqr55qE5L+h5oGvXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZURheVNoYXJlSW5mbygpOnZvaWRcbiAgICB7XG4gICAgICAgIExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuYWRkc3RyKCBVc2VyRGF0YUluZm8ubm93ZGF5U2hhcmUsV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW0udG9TdHJpbmcoKSApO1xuXG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZURheVZpZGVvSW5mbygpOnZvaWRcbiAgICB7XG4gICAgICAgIExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuYWRkc3RyKCBVc2VyRGF0YUluZm8ubm93ZGF5VmlkZW8sV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0udG9TdHJpbmcoKSApO1xuXG4gICAgfVxuXG4gICAgcHVibGljIHVzZXJpbmZvYnV0dG9uO1xuICAgIHN0YXRpYyBsb2dpbkNhbGxvYmo6YW55O1xuICAgIHN0YXRpYyBsb2dpbnN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbjtcbiAgICBzdGF0aWMgbG9naW5wcm9ncmVzc0NhbGxiYWNrOkZ1bmN0aW9uO1xuICAgIHB1YmxpYyBjcmVhdGVVc2VyQW5kTG9naW4oIGNhbGxvYmo6YW55LHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbixwcm9ncmVzc0NhbGxiYWNrOkZ1bmN0aW9uID1udWxsLCBmYWlsY2FsbGJhY2s6RnVuY3Rpb249bnVsbCApOnZvaWRcbiAgICB7XG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiA9IGNhbGxvYmo7XG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxvZ2luc3VjY2VlZGNhbGxiYWNrID0gc3VjY2VlZGNhbGxiYWNrO1xuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5sb2dpbnByb2dyZXNzQ2FsbGJhY2sgPSBwcm9ncmVzc0NhbGxiYWNrO1xuICAgICAgICB2YXIgd3g6YW55ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgaWYoIHd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGxvZ2luX2luZm86YW55ID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuZ2V0TGF1bmNoT3B0aW9uc1N5bmMoKTtcbiAgICAgICAgICAgIGlmKGxvZ2luX2luZm8pXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICBsZXQgcXVlcnkgPWxvZ2luX2luZm8ucXVlcnk7XG4gICAgICAgICAgICAgICAgaWYocXVlcnkgJiYgcXVlcnkuQ2hhbklEKXtcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uUXVEYW9JRCA9IHF1ZXJ5LkNoYW5JRDtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVmZXJyZXJJbmZvID0gbG9naW5faW5mby5yZWZlcnJlckluZm87XG4gICAgICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLlF1RGFvSUQgPT0gXCJcIiAmJiByZWZlcnJlckluZm8gJiYgcmVmZXJyZXJJbmZvLmFwcElkIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLlF1RGFvSUQgPSByZWZlcnJlckluZm8uYXBwSWQ7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoIGxvZ2luX2luZm8uc2NlbmUgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZnJvbXNjZW5lID0gTnVtYmVyKCBsb2dpbl9pbmZvLnNjZW5lICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHN5c3RlbXJlcyA9IHd4LmdldFN5c3RlbUluZm9TeW5jKCk7XG4gICAgICAgICAgICB2YXIgdmVyc2lvbiA9IHN5c3RlbXJlcy5TREtWZXJzaW9uO1xuICAgICAgICAgICAgaWYgKHd4LmdldFVwZGF0ZU1hbmFnZXIpIFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciB1cGRhdGVNYW5hZ2VyID0gd3guZ2V0VXBkYXRlTWFuYWdlcigpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIub25DaGVja0ZvclVwZGF0ZShmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOivt+axguWujOaWsOeJiOacrOS/oeaBr+eahOWbnuiwg1xuXG4gICAgICAgICAgICAgICAgICAgIGlmKCByZXMuaGFzVXBkYXRlPT10cnVlIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZVJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dNb2RhbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5pu05paw5o+Q56S6JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogJ+aWsOeJiOacrOW3sue7j+WHhuWkh+Wlve+8jOaYr+WQpumHjeWQr+W6lOeUqO+8nycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuY29uZmlybSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaWsOeahOeJiOacrOW3sue7j+S4i+i9veWlve+8jOiwg+eUqCBhcHBseVVwZGF0ZSDlupTnlKjmlrDniYjmnKzlubbph43lkK9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVNYW5hZ2VyLmFwcGx5VXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmV4aXRHYW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVNYW5hZ2VyLm9uVXBkYXRlRmFpbGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmlrDniYjmnKzkuIvovb3lpLHotKVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5leGl0R2FtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiggV1hHYW1lUGxhdGZvcm0ubG9naW5DYWxsb2JqICYmIFdYR2FtZVBsYXRmb3JtLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjayApXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrLmNhbGwoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiwxMCApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0ubG9naW4oY2FsbG9iaixzdWNjZWVkY2FsbGJhY2ssZmFpbGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gaWYoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiAmJiBXWEdhbWVQbGF0Zm9ybS5sb2dpbnByb2dyZXNzQ2FsbGJhY2sgKVxuICAgICAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrLmNhbGwoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiwxMCApO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xuICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0ubG9naW4oY2FsbG9iaixzdWNjZWVkY2FsbGJhY2ssZmFpbGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVzZXJpbmZvY2FsbG9iajphbnk7XG4gICAgdXNlcmluZm9zdWNjYWxsYmFjazpGdW5jdGlvbjtcbiAgICB1c2VyaW5mb2ZhaWxjYWxsYmFjazpGdW5jdGlvbjtcbiAgICBwdWJsaWMgY3JlYXRlVXNlckluZm9CdXR0b24oICBjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMudXNlcmluZm9jYWxsb2JqID0gY2FsbG9iajtcbiAgICAgICAgdGhpcy51c2VyaW5mb3N1Y2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMudXNlcmluZm9mYWlsY2FsbGJhY2sgPSBmYWlsY2FsbGJhY2s7XG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XG4gICAgICAgIGxldCByZXMgPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgICAgICBpZiggcmVzIClcbiAgICAgICAge1xuXG4gICAgICAgICAgICB2YXIgcG9zeDpudW1iZXIgPSAocmVzLndpbmRvd1dpZHRoLTE1MSkvMjtcbiAgICAgICAgICAgIHZhciBwb3N5Om51bWJlciA9IHJlcy53aW5kb3dIZWlnaHQtMTcyIC0gNDA7XG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS51c2VyaW5mb2J1dHRvbiA9IHd4LmNyZWF0ZVVzZXJJbmZvQnV0dG9uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgICAgICAgICAgaW1hZ2U6J3d4bG9jYWwvbG9naW4ucG5nJyxcbiAgICAgICAgICAgICAgICBzdHlsZTpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IHBvc3gsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogcG9zeSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE1MSxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA3MlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudXNlcmluZm9idXR0b24ub25UYXAoIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnVzZXJpbmZvQnV0dG9uQ2xpY2sgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreaYr+WQpuW3sue7j+aOiOadg1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRhY2NyZWRpdCggY2FsbG9iajphbnksYWNjcmVkaXRDYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5hY2NyZWRpdHN0YXRlID09IDAgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICAgICAgaWYoIHd4IClcbiAgICAgICAgICAgIHsgICBcbiAgICAgICAgICAgICAgICB3eC5nZXRTZXR0aW5nKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyAocmVzKSBcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1kID0gcmVzLmF1dGhTZXR0aW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGl0ZW1kLmhhc093blByb3BlcnR5KCBcInNjb3BlLnVzZXJJbmZvXCIgKSAmJiBpdGVtZFtcInNjb3BlLnVzZXJJbmZvXCJdID09IHRydWUgKSAvL+W3sue7j+aOiOadg+i/h1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFjY3JlZGl0Q2FsbGJhY2smJmNhbGxvYmopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosdHJ1ZSApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhY2NyZWRpdENhbGxiYWNrJiZjYWxsb2JqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjcmVkaXRDYWxsYmFjay5jYWxsKCBjYWxsb2JqLGZhbHNlICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3JlZGl0Q2FsbGJhY2suY2FsbCggY2FsbG9iaix0cnVlICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosdHJ1ZSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHVzZXJpbmZvQnV0dG9uQ2xpY2soIHJlczphbnkgKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xuXG4gICAgICAgIGlmKCByZXMgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgZXJyTXNnOnN0cmluZyA9IHJlcy5lcnJNc2c7XG4gICAgICAgICAgICBpZiggZXJyTXNnID09IFwiZ2V0VXNlckluZm86b2tcIiApXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5hY2NyZWRpdHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLmNsb3NldXNlcmluZm9iVXR0b24oKTtcbiAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLmdldFVzZXJJbmZvKCBmYWxzZSx3eHBsYXRmb3JtLnVzZXJpbmZvY2FsbG9iaix3eHBsYXRmb3JtLnVzZXJpbmZvc3VjY2FsbGJhY2ssd3hwbGF0Zm9ybS51c2VyaW5mb2ZhaWxjYWxsYmFjayApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgaWYoIHd4cGxhdGZvcm0udXNlcmluZm9jYWxsb2JqICYmIHd4cGxhdGZvcm0udXNlcmluZm9mYWlsY2FsbGJhY2sgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS51c2VyaW5mb2ZhaWxjYWxsYmFjay5jYWxsKCB3eHBsYXRmb3JtLnVzZXJpbmZvY2FsbG9iaiApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZXVzZXJpbmZvYlV0dG9uKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcbiAgICAgICAgaWYod3hwbGF0Zm9ybS51c2VyaW5mb2J1dHRvbilcbiAgICAgICAge1xuICAgICAgICAgICAgd3hwbGF0Zm9ybS51c2VyaW5mb2J1dHRvbi5vZmZUYXAod3hwbGF0Zm9ybS51c2VyaW5mb0J1dHRvbkNsaWNrKTtcbiAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9idXR0b24uZGVzdHJveSgpO1xuICAgICAgICAgICAgd3hwbGF0Zm9ybS51c2VyaW5mb2J1dHRvbj1udWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFVzZXJJbmZvKCBpc2xvZ2luOmJvb2xlYW4sY2FsbG9iajphbnksY2FsbGJhY2s6RnVuY3Rpb24sZmFpbGNhbGxiYWNrOkZ1bmN0aW9uICk6dm9pZFxuICAgIHtcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XG4gICAgICAgIHZhciB3eHBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XG4gICAgICAgIGlmKCB3eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHd4LmdldFVzZXJJbmZvKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXNlckluZm8gPSByZXMudXNlckluZm87XG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLm5pY2tOYW1lID0gdXNlckluZm8ubmlja05hbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmKCBpc2xvZ2luIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbihjYWxsb2JqLGNhbGxiYWNrLGZhaWxjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsbG9iaiAmJiBjYWxsYmFjayApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCggY2FsbG9iaixXWEdhbWVQbGF0Zm9ybS5uaWNrTmFtZSApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOeZu+W9lVxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxuICAgICAqIEBwYXJhbSBzdWNjZWVkY2FsbGJhY2sgXG4gICAgICogQHBhcmFtIGZhaWxDYWxsYmFjayBcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9naW4oIGNhbGxvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciB3eHBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5sb2dpbih7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKCByZXMgKSBcbiAgICAgICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uY29kZSA9IHJlcy5jb2RlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbWQ6YW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEICE9IFwiXCIgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtZC5DaGFuSUQgPSBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1kLkNvZGUgPSBXWEdhbWVQbGF0Zm9ybS5jb2RlO1xuICAgICAgICAgICAgICAgICAgICBpdGVtZC5BcHBJRCA9IEdsb2JhbC5hcHBpZDtcbiAgICAgICAgICAgICAgICAgICAgaXRlbWQuVmVyc2lvbiA9IEdsb2JhbC5nYW1lVmVyc2lvbjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZhaWw6ZnVuY3Rpb24ocmVzKXtcblxuICAgICAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLmxvZ2luKCBjYWxsb2JqLGNhbGxiYWNrLGZhaWxjYWxsYmFjayApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvZ2luU3VjY2VlZENhbGxiYWNrKCBkYXRhOmFueSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmogJiYgV1hHYW1lUGxhdGZvcm0ubG9naW5zdWNjZWVkY2FsbGJhY2sgKVxuICAgICAgICB7XG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5sb2dpbnN1Y2NlZWRjYWxsYmFjay5jYWxsKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmosZGF0YSApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgX3N1YmNhbGxvYmo6YW55O1xuICAgIHB1YmxpYyBfc3ViY2FsbGJhY2s6RnVuY3Rpb247XG4gICAgcHVibGljIF91cGRhdGVjYWxsYmFjazpGdW5jdGlvbjtcbiAgICBwdWJsaWMgX3N1YmZhaWxjYWxsYmFjazpGdW5jdGlvbjtcbiAgICBwdWJsaWMgbG9hZFN1YnBhY2thZ2UoIG5hbWU6c3RyaW5nLHN1YmNhbGxvYmo6YW55LHN1YmNhbGxiYWNrOkZ1bmN0aW9uLHVwZGF0ZWNhbGxiYWNrOkZ1bmN0aW9uLHN1YmZhaWxjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fc3ViY2FsbG9iaiA9IHN1YmNhbGxvYmo7XG4gICAgICAgICAgICB0aGlzLl9zdWJjYWxsYmFjayA9IHN1YmNhbGxiYWNrO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlY2FsbGJhY2sgPSB1cGRhdGVjYWxsYmFjaztcbiAgICAgICAgICAgIHRoaXMuX3N1YmZhaWxjYWxsYmFjayA9IHN1YmZhaWxjYWxsYmFjaztcbiAgICAgICAgICAgIHZhciB3eDphbnkgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICAgICAgaWYoIHd4LmxvYWRTdWJwYWNrYWdlIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkVGFzayA9IHd4LmxvYWRTdWJwYWNrYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTpuYW1lLFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIhuWMheWKoOi9veaIkOWKn+WQjumAmui/hyBzdWNjZXNzIOWbnuiwg1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3hnYW1lUGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbGJhY2sgJiYgd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLl9zdWJjYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbG9iaiApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmYWlsOiBmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIhuWMheWKoOi9veWksei0pemAmui/hyBmYWlsIOWbnuiwg1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHd4Z2FtZVBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0uX3N1YmZhaWxjYWxsYmFjayAmJiB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbG9iaiApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3hnYW1lUGxhdGZvcm0uX3N1YmZhaWxjYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbG9iaiApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7ICBcbiAgICAgICAgICAgICAgICBpZihsb2FkVGFzay5vblByb2dyZXNzVXBkYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgbG9hZFRhc2sub25Qcm9ncmVzc1VwZGF0ZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHd4Z2FtZVBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0uX3VwZGF0ZWNhbGxiYWNrICYmIHd4Z2FtZVBsYXRmb3JtLl9zdWJjYWxsb2JqIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS5fdXBkYXRlY2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmoscmVzLnByb2dyZXNzICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKCBzdWJjYWxsb2JqICYmIHN1YmNhbGxiYWNrIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN1YmNhbGxiYWNrLmNhbGwoIHN1YmNhbGxvYmogKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggc3ViY2FsbG9iaiAmJiBzdWJjYWxsYmFjayApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3ViY2FsbGJhY2suY2FsbCggc3ViY2FsbG9iaiApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6I635Y+W6L2s5Y+R6K+m57uG5L+h5oGvXG4gICAgICogQHBhcmFtIG9iaiBcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxuICAgICAqIEBwYXJhbSBmYWlsQ2FsbGJhY2sgXG4gICAgICovXG4gICAgcHVibGljIGdldFNoYXJlSW5mbyggb2JqOmFueSxjYWxsb2JqOmFueSwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwgKVxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFNoYXJlSW5mbyh7XG4gICAgICAgICAgICAgICAgc2hhcmVUaWNrZXQ6b2JqLnNoYXJlVGlja2V0LFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXMpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZWVkY2FsbGJhY2suY2FsbCggY2FsbG9iaixyZXMgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog55uR5ZCs55So5oi354K55Ye75Y+z5LiK6KeS6I+c5Y2V55qE4oCc6L2s5Y+R4oCd5oyJ6ZKu5pe26Kem5Y+R55qE5LqL5Lu2XG4gICAgICogQHBhcmFtIHRpdGxlIFxuICAgICAqIEBwYXJhbSBpbWFnZVVybCBcbiAgICAgKi9cbiAgICBwdWJsaWMgb25TaGFyZUFwcE1lc3NhZ2UoIHRpdGxlOnN0cmluZyxpbWFnZVVybDpzdHJpbmcgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25TaGFyZUFwcE1lc3NhZ2UoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZVVybDppbWFnZVVybFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDkuLvliqjmi4notbfovazlj5HvvIzov5vlhaXpgInmi6npgJrorq/lvZXnlYzpnaLjgIJcbiAgICAgKiBAcGFyYW0gdGl0bGUgXG4gICAgICogQHBhcmFtIGltYWdlVXJsIFxuICAgICAqL1xuICAgIHB1YmxpYyBzaGFyZUFwcE1lc3NhZ2UoIGQ6YW55ICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNoYXJlQXBwTWVzc2FnZShkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaYvuekuuW9k+WJjemhtemdoueahOi9rOWPkeaMiemSrlxuICAgICAqIEBwYXJhbSBvYmogXG4gICAgICovXG4gICAgcHVibGljIHNob3dTaGFyZU1lbnUoIG9iajphbnkgPSBudWxsICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dTaGFyZU1lbnUob2JqKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOabtOaWsOi9rOWPkeWxnuaAp1xuICAgICAqIEBwYXJhbSBvYmogXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVNoYXJlTWVudSggb2JqOmFueSA9IG51bGwgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gudXBkYXRlU2hhcmVNZW51KG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmmL7npLrlvZPliY3pobXpnaLnmoTovazlj5HmjInpkq5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvd01lbnUoKSBcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93U2hhcmVNZW51KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmnKzlnLDlrZjlgqhcbiAgICAgKiBAcGFyYW0ga2V5IFxuICAgICAqIEBwYXJhbSBkYXRhIFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTdG9yYWdlU3luYyhrZXk6c3RyaW5nLCBkYXRhOmFueSkgXG4gICAge1xuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICBpZiggd3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICB3eC5zZXRTdG9yYWdlU3luYyhrZXksIGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIOiOt+WPluacrOWcsOWtmOWCqFxuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICovXG4gICAgcHVibGljIGdldFN0b3JhZ2VTeW5jKGtleTpzdHJpbmcpOmFueSBcbiAgICB7XG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XG4gICAgICAgIGlmKCB3eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB3eC5nZXRTdG9yYWdlU3luYyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRVc2VyQ2xvdWRTdG9yYWdlKG9iaixjYWxsb2JqOmFueT1udWxsLCBzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsQ2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsKSBcbiAgICB7XG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XG4gICAgICAgIGlmKCB3eCAmJiB3eC5zZXRVc2VyQ2xvdWRTdG9yYWdlIClcbiAgICAgICAge1xuICAgICAgICAgICAgd3guc2V0VXNlckNsb3VkU3RvcmFnZSh7XG4gICAgICAgICAgICAgICAgS1ZEYXRhTGlzdDogb2JqLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoc3VjY2VlZGNhbGxiYWNrKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZWVkY2FsbGJhY2suY2FsbCggY2FsbG9iaixyZXMgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgICAgICBpZihmYWlsQ2FsbGJhY2spXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxDYWxsYmFjay5jYWxsKCBjYWxsb2JqICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaYvuekuua2iOaBr+aPkOekuuahhlxuICAgICAqIEBwYXJhbSB3b3JkIFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2FzdCh3b3JkOnN0cmluZyk6dm9pZCBcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93VG9hc3QoeyB0aXRsZTogd29yZCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWQkeW8gOaUvuaVsOaNruWfn+WPkemAgea2iOaBr1xuICAgICAqIEBwYXJhbSBvYmogXG4gICAgICovXG4gICAgcHVibGljIHBvc3RNZXNzYWdlKHN0cjpzdHJpbmcsZGF0YTphbnk9bnVsbCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgaWYoIHd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB3eC5nZXRPcGVuRGF0YUNvbnRleHQoKTtcbiAgICAgICAgICAgIGNvbnRleHQucG9zdE1lc3NhZ2UoeyBhY3Rpb246IHN0cixkYXRhOmRhdGEgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliJvlu7rkuIDkuKogSW5uZXJBdWRpb0NvbnRleHQg5a6e5L6LXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUlubmVyQXVkaW9Db250ZXh0KCk6YW55XG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZUlubmVyQXVkaW9Db250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6I635Y+W57O757uf5L+h5oGvXG4gICAgICovXG4gICAgcHVibGljIGdldFN5c3RlbUluZm9TeW5jKCk6YW55XG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6aKE6KeI5Zu+54mH77yM6LCD55So5LmL5ZCO5Lya5Zyo5paw5omT5byA55qE6aG16Z2i5Lit5YWo5bGP6aKE6KeI5Lyg5YWl55qE5Zu+54mH77yM6aKE6KeI55qE6L+H56iL5Lit55So5oi35Y+v5Lul6L+b6KGM5L+d5a2Y5Zu+54mH44CB5Y+R6YCB57uZ5pyL5Y+L562J5pON5L2cXG4gICAgICogQHBhcmFtIG9iaiBcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmlld0ltYWdlKG9iaikgXG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gucHJldmlld0ltYWdlKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnm5HlkKzlsI/muLjmiI/pmpDol4/liLDlkI7lj7Dkuovku7bjgILplIHlsY/jgIHmjIkgSE9NRSDplK7pgIDliLDmoYzpnaLjgIHmmL7npLrlnKjogYrlpKnpobbpg6jnrYnmk43kvZzkvJrop6blj5HmraTkuovku7bjgIJcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkhpZGUoY2FsbG9iajphbnksIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbik6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uSGlkZShmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uaXNTaG93aW5nPWZhbHNlO1xuICAgICAgICAgICAgICAgIGlmKHN1Y2NlZWRjYWxsYmFjayYmY2FsbG9iailcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2NlZWRjYWxsYmFjay5jYWxsKGNhbGxvYmosIHJlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOi/lOWbnuWwj+eoi+W6j+WQr+WKqOWPguaVsFxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxuICAgICAqIEBwYXJhbSBzdWNjZWVkY2FsbGJhY2sgXG4gICAgICovXG4gICAgcHVibGljIGdldExhdW5jaE9wdGlvbnNTeW5jKCk6YW55XG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldExhdW5jaE9wdGlvbnNTeW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOmakOiXj+a2iOaBr+aPkOekuuahhlxuICAgICAqIEBwYXJhbSBvYmogXG4gICAgICovXG4gICAgcHVibGljIGhpZGVUb2FzdChvYmopOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5oaWRlVG9hc3Qob2JqKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaYvuekuuaooeaAgeWvueivneahhlxuICAgICAqIEBwYXJhbSBvYmogXG4gICAgICovXG4gICAgcHVibGljIHNob3dNb2RhbChvYmopOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93TW9kYWwob2JqKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIFxuXG4gICAgLyoqXG4gICAgICog5riF55CG5a2Y5YKo5pWw5o2uXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU3RvcmFnZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jbGVhclN0b3JhZ2VTeW5jKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDkvb/miYvmnLrlj5HnlJ/ovoPnn63ml7bpl7TnmoTmjK/liqjvvIgxNSBtc++8iVxuICAgICAqIEBwYXJhbSBvYmogXG4gICAgICovXG4gICAgcHVibGljIHZpYnJhdGVTaG9ydCgpIFxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnZpYnJhdGVTaG9ydCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5LuO5pys5Zyw57yT5a2Y5Lit56e76Zmk5oyH5a6aIGtleVxuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVN0b3JhZ2Uoa2V5OnN0cmluZyk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnJlbW92ZVN0b3JhZ2Uoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkF1ZGlvSW50ZXJydXB0aW9uQmVnaW4oKTp2b2lke1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApe1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5vbkF1ZGlvSW50ZXJydXB0aW9uQmVnaW4oZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAvLyBTb3VuZHNzTWFuYWdlci5JbnN0YW5jZS5wbGF5YmdTb3VuZChcImJnbVwiKTtcbiAgICAgICAgICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UuQ2xlYXJBbGxTT1VORCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25BdWRpb0ludGVycnVwdGlvbkVuZCgpOnZvaWR7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4ICl7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uQXVkaW9JbnRlcnJ1cHRpb25FbmQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICB2YXIgd3hnYW1lcGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB3eGdhbWVwbGF0Zm9ybSx3eGdhbWVwbGF0Zm9ybS5vbkF1ZGlvRW5kQ2FsbGJhY2sgKTtcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDUwMCx3eGdhbWVwbGF0Zm9ybSx3eGdhbWVwbGF0Zm9ybS5vbkF1ZGlvRW5kQ2FsbGJhY2sgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uQXVkaW9FbmRDYWxsYmFjaygpOnZvaWRcbiAgICB7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX29uQXVkaW9JbnRlcnJ1cHRpb25FbmQgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpgIDlh7rmuLjmiI9cbiAgICAgKi9cbiAgICBwdWJsaWMgZXhpdEdhbWUoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICBpZiggd3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICB3eC5leGl0TWluaVByb2dyYW0oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaJk+W8gOWuouacjeWvueivneahhlxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuQ3VzdG9tZXJTZXJ2aWNlKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgaWYgKHd4KVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgdmVyc2lvbiA9IHd4LmdldFN5c3RlbUluZm9TeW5jKCkuU0RLVmVyc2lvbjtcbiAgICAgICAgICAgIGlmKCBHYW1lVXRpbHMuY29tcGFyZVZlcnNpb24odmVyc2lvbiwgJzIuMC4zJykgPj0gMCAmJiB3eC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ29udmVyc2F0aW9uIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3eC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ29udmVyc2F0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2VDYXJkOnRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlSW1nOlwiaHR0cHM6Ly9yZXNvdXJjZS41MXlveW95by5jb20vcmVzL3d4c2VuZG1lc3NhZ2VpbWcvc21pLmpwZ1wiXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gQWxlcnRVdGlscy5zaG93V29yZFRpcHMoXCLlvZPliY3lvq7kv6HniYjmnKzkuI3mlK/mjIFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnm5HlkKzlhoXlrZjkuI3otrPlkYroraZcbiAgICAgKi9cbiAgICBwdWJsaWMgb25NZW1vcnlXYXJuaW5nKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgaWYoIHd4ICYmIHd4Lm9uTWVtb3J5V2FybmluZyApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHd4Lm9uTWVtb3J5V2FybmluZyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uRXJyb3IoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICBpZiggd3ggJiYgd3gub25FcnJvciApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHd4Lm9uRXJyb3IoZnVuY3Rpb24oIHJlcyApe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKipvbkVycm9yXCIscmVzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgbm93U2hhcmVpbmRleDpudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBub3dzaGFyZU9iajphbnk7XG4gICAgcHVibGljIG5vd3NoYXJlc3VjY2VlZGZ1bjpGdW5jdGlvbjtcbiAgICBwdWJsaWMgbm93c2hhcmVmYWlsZnVuOkZ1bmN0aW9uO1xuICAgIHB1YmxpYyBub3dzaGFyZWluZm86YW55O1xuICAgIHB1YmxpYyBzdGFydFNoYXJlVGltZTpudW1iZXI7XG4gICAgcHVibGljIGlzU2hhcmVpbmc6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHN0YXRpYyBjYWxsYmFja2ZhaWxzdGF0ZTpudW1iZXIgPSAwO1xuICAgIC8qKlxuICAgICAqIOW8gOWni+WIhuS6q1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGFydFNoYXJlQXBwKGtleTpzdHJpbmcsY2FsbG9iajphbnk9bnVsbCxzdWNjZWVkQ2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsQ2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsKTp2b2lkXG4gICAge1xuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5ub3dTaGFyZWluZGV4PTA7XG4gICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5TaGFyZURpY3Rba2V5XSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcmVBcHAoIFdYR2FtZVBsYXRmb3JtLlNoYXJlRGljdFtrZXldLGNhbGxvYmosc3VjY2VlZENhbGxiYWNrLGZhaWxDYWxsYmFjayApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaGFyZUFwcChpbmZvOmFueSxjYWxsb2JqOmFueSwgc3VjY2VzczogRnVuY3Rpb24sZmFpbENhbGxiYWNrOkZ1bmN0aW9uKSBcbiAgICB7XG4gICAgICAgIHRoaXMubm93c2hhcmVPYmogPSBjYWxsb2JqO1xuICAgICAgICB0aGlzLm5vd3NoYXJlaW5mbyA9IGluZm87XG4gICAgICAgIHRoaXMubm93c2hhcmVzdWNjZWVkZnVuID0gc3VjY2VzcztcbiAgICAgICAgdGhpcy5ub3dzaGFyZWZhaWxmdW4gPSBmYWlsQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMuc3RhcnRTaGFyZVRpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XG4gICAgICAgIHRoaXMuaXNTaGFyZWluZyA9IHRydWU7XG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmNhbGxiYWNrZmFpbHN0YXRlID0gMDtcbiAgICAgICAgdGhpcy5zaGFyZUFwcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdGl0bGU6aW5mby50aWxlLGltYWdlVXJsOkdsb2JhbC5jZG51cmwgKyBpbmZvLmltZyxxdWVyeTpcIlwiLFxuICAgICAgICAgICAgc3VjY2VzczpmdW5jdGlvbiAocmVzKVxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChyZXMpe1xuICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoXCLmgqjlj5bmtojkuobliIbkuqtcIik7XG4gICAgICAgICAgICAgICAgaWYgKGZhaWxDYWxsYmFjayAmJiBjYWxsb2JqICkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmYWlsQ2FsbGJhY2suY2FsbChjYWxsb2JqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmNhbGxiYWNrZmFpbHN0YXRlID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG4gICAgICAgIFxuXG4gICAgcHVibGljIHNob3dvYmo6YW55O1xuICAgIHB1YmxpYyBzaG93Q2FsbGJhY2s6RnVuY3Rpb247XG4gICAgLyoqXG4gICAgICog55uR5ZCs5bCP5ri45oiP5Zue5Yiw5YmN5Y+w55qE5LqL5Lu2XG4gICAgICogQHBhcmFtIGNhbGxvYmogXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcbiAgICAgKiBAcGFyYW0gZmFpbENhbGxiYWNrIFxuICAgICAqL1xuICAgIHB1YmxpYyBvblNob3coY2FsbG9iajphbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCkgXG4gICAge1xuICAgICAgICB0aGlzLnNob3dvYmogPSBjYWxsb2JqO1xuICAgICAgICB0aGlzLnNob3dDYWxsYmFjayA9IHN1Y2NlZWRjYWxsYmFjaztcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgaWYoIHd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgd3gub25TaG93KGZ1bmN0aW9uIChyZXMpIFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmlzU2hvd2luZz10cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYoIHJlcyAmJiByZXMuc2NlbmUgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZnJvbXNjZW5lID0gTnVtYmVyKCByZXMuc2NlbmUgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5mcmFtZU9uY2UoIDEsV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UsV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uub25TaG93U3VjY2VlZCApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25TaG93U3VjY2VlZCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciB3eGdhbWVwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xuICAgICAgICBpZiggd3hnYW1lcGxhdGZvcm0uc2hvd29iaiAmJiB3eGdhbWVwbGF0Zm9ybS5zaG93Q2FsbGJhY2sgKVxuICAgICAgICB7XG4gICAgICAgICAgICB3eGdhbWVwbGF0Zm9ybS5zaG93Q2FsbGJhY2suY2FsbCggd3hnYW1lcGxhdGZvcm0uc2hvd29iaiApO1xuICAgICAgICB9XG4gICAgICAgIGlmKCB3eGdhbWVwbGF0Zm9ybS5pc1NoYXJlaW5nICkgLy/lpoLmnpzmmK/liIbkuqvnirbmgIFcbiAgICAgICAge1xuICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0uaXNTaGFyZWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGlzU2hhcmVTdWNjZWVkOmJvb2xlYW49ZmFsc2U7XG4gICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uY2FsbGJhY2tmYWlsc3RhdGU9PTAgKSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgbm93VGltZTpudW1iZXIgPUxheWEuQnJvd3Nlci5ub3coKTtcbiAgICAgICAgICAgICAgICB2YXIgZGlzVGltZTpudW1iZXIgPShub3dUaW1lIC0gd3hnYW1lcGxhdGZvcm0uc3RhcnRTaGFyZVRpbWUpLzEwMDA7XG4gICAgICAgICAgICAgICAgaWYoIGRpc1RpbWU+PVdYR2FtZVBsYXRmb3JtLlNoYXJlVGltZSB8fCBXWEdhbWVQbGF0Zm9ybS5ub3dTaGFyZWluZGV4ID49IDMgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaXNTaGFyZVN1Y2NlZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmNhbGxiYWNrZmFpbHN0YXRlPTA7XG4gICAgICAgICAgICBpZiggaXNTaGFyZVN1Y2NlZWQgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtKys7XG4gICAgICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0udXBkYXRlRGF5U2hhcmVJbmZvKCk7XG4gICAgICAgICAgICAgICAgaWYoIHd4Z2FtZXBsYXRmb3JtLm5vd3NoYXJlT2JqICYmIHd4Z2FtZXBsYXRmb3JtLm5vd3NoYXJlc3VjY2VlZGZ1biApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZXN1Y2NlZWRmdW4uY2FsbCggd3hnYW1lcGxhdGZvcm0ubm93c2hhcmVPYmogKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0ubm93U2hhcmVpbmRleCsrO1xuICAgICAgICAgICAgICAgIHd4Z2FtZXBsYXRmb3JtLnNob3dNb2RhbChcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIuaPkOekulwiLCBjb250ZW50OiBcIuivt+avj+asoeWIhuS6q+WIsOS4jeWQjOe+pCzmmK/lkKbph43mlrDliIbkuqvvvJ9cIiwgc2hvd0NhbmNlbDogdHJ1ZSwgY2FuY2VsVGV4dDogJ+WPlua2iCcsIGNvbmZpcm1UZXh0OiAn56Gu5a6aJyxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlcylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuY29uZmlybSkgXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uuc2hhcmVBcHAoIHd4cGxhdGZvcm0ubm93c2hhcmVpbmZvLHd4cGxhdGZvcm0ubm93c2hhcmVPYmosd3hwbGF0Zm9ybS5ub3dzaGFyZXN1Y2NlZWRmdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0ubm93c2hhcmVmYWlsZnVuICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggd3hwbGF0Zm9ybS5ub3dzaGFyZWZhaWxmdW4gJiYgd3hwbGF0Zm9ybS5ub3dzaGFyZU9iaiApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLm5vd3NoYXJlZmFpbGZ1bi5jYWxsKCB3eHBsYXRmb3JtLm5vd3NoYXJlT2JqICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKCkgXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTpmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgbGFzdFZpZGVvVGltZTpudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgdmlkZW9BZDtcbiAgICBwdWJsaWMgdmlkZW9jYWxsb2JqOmFueTtcbiAgICBwdWJsaWMgdmlkZW9zdWNjZWVkQ2FsbGJhY2s6RnVuY3Rpb247XG4gICAgcHJpdmF0ZSB2aWRlb2ZhaWxDYWxsYmFjazpGdW5jdGlvbjtcbiAgICBwdWJsaWMgbm93dmlkZW9rZXk6c3RyaW5nO1xuICAgICAvKipcbiAgICAgKiDop4bpopHmmK/lkKblnKjmkq3mlL7kuK1cbiAgICAgKi9cbiAgICBzdGF0aWMgdmlkZW9wbGF5aW5nOmJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHN0YXRpYyBpc3RvbmdqaVZpZGVvTnVtOmJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICog55yL6KeG6aKR6aKG5aWW5YqxXG4gICAgICogQHBhcmFtIGNhbGxvYmogXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcbiAgICAgKi9cbiAgICBwdWJsaWMgcGxheVZpZGVvKCBrZXk6c3RyaW5nLCBjYWxsb2JqOmFueT1udWxsLCBzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsQ2FsbGJhY2s6RnVuY3Rpb249bnVsbCxpc3RvbmdqaU51bTpib29sZWFuID0gdHJ1ZSApXG4gICAge1xuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICBpZiggd3ggJiYgd3guY3JlYXRlUmV3YXJkZWRWaWRlb0FkIClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoICFXWEdhbWVQbGF0Zm9ybS52aWRlb3BsYXlpbmcgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciB0aW1lOm51bWJlciA9IHRoaXMubG9ja1ZpZGVvTGVmdFRpbWUoKTtcbiAgICAgICAgICAgICAgICBpZiggdGltZSA+IDAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLlub/lkYrlsJrmnKrlh4blpIflpb3vvIzor7dcIisgdGltZSArXCLnp5LlkI7lho3or5VcIiApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2xvc2Vmb2N1cyApO1xuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmlzdG9uZ2ppVmlkZW9OdW0gPSBpc3RvbmdqaU51bTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vd3ZpZGVva2V5ID0ga2V5O1xuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZz10cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9jYWxsb2JqID0gY2FsbG9iajtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvc3VjY2VlZENhbGxiYWNrID0gc3VjY2VlZGNhbGxiYWNrO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9mYWlsQ2FsbGJhY2sgPSBmYWlsQ2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkID0gd3guY3JlYXRlUmV3YXJkZWRWaWRlb0FkKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWRVbml0SWQ6J2FkdW5pdC0wYzY4NzA4NGM5MDhlZTg5J1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9BZC5vbkNsb3NlKHRoaXMuY2xvc2VBRCk7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkLm9uRXJyb3IoIHRoaXMub25lcnJvICk7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkLmxvYWQoKS50aGVuKCgpID0+IHRoaXMudmlkZW9BZC5zaG93KCkpLmNhdGNoKGVyciA9PiB7IGNvbnNvbGUubG9nKGVyci5lcnJNc2cpLFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmZhaWxWaWRlbygpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9ja1ZpZGVvTGVmdFRpbWUoKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHZhciB0aW1lOm51bWJlciA9IChMYXlhLkJyb3dzZXIubm93KCktV1hHYW1lUGxhdGZvcm0ubGFzdFZpZGVvVGltZSkvMTAwMDsgXG4gICAgICAgIHRpbWUgPSBXWEdhbWVQbGF0Zm9ybS5WaWRlb1RpbWUgLSB0aW1lO1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRpbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgb25lcnJvKHJlcyk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHd4Z2FtZVBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZz1mYWxzZTtcbiAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9BZC5vZmZFcnJvcih3eGdhbWVQbGF0Zm9ybS5vbmVycm8pOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcbiAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9BZC5vZmZDbG9zZSh3eGdhbWVQbGF0Zm9ybS5jbG9zZUFEKTsgLy/np7vpmaQg5LiN54S26KKr5aSa5qyh6LCD55SoXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2dldGZvY3VzICk7XG4gICAgfVxuXG4gICAgLy8g5YWz6Zet5bm/5ZGKXG4gICAgcHVibGljIGNsb3NlQUQoc3RhdHVzKTp2b2lkXG4gICAge1xuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5sYXN0VmlkZW9UaW1lID0gTGF5YS5Ccm93c2VyLm5vdygpO1xuICAgICAgICB2YXIgd3hnYW1lUGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcbiAgICAgICAgaWYgKHN0YXR1cyAmJiBzdGF0dXMuaXNFbmRlZCB8fCBzdGF0dXMgPT0gdW5kZWZpbmVkKSBcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmlzdG9uZ2ppVmlkZW9OdW0gKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtKys7XG4gICAgICAgICAgICAgICAgd3hnYW1lUGxhdGZvcm0udXBkYXRlRGF5VmlkZW9JbmZvKCk7XG4gICAgICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfdXBkYXRlVmlkZW9OdW1zICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0udmlkZW9jYWxsb2JqICYmIHd4Z2FtZVBsYXRmb3JtLnZpZGVvc3VjY2VlZENhbGxiYWNrIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb3N1Y2NlZWRDYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBcbiAgICAgICAgZWxzZSBcbiAgICAgICAge1xuICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLmnKrop4LnnIvlrozmlbTop4bpopHvvIzml6Dms5XojrflvpflpZblirFcIiApO1xuICAgICAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiAmJiB3eGdhbWVQbGF0Zm9ybS52aWRlb2ZhaWxDYWxsYmFjayApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9mYWlsQ2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0udmlkZW9jYWxsb2JqICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgV1hHYW1lUGxhdGZvcm0udmlkZW9wbGF5aW5nPWZhbHNlO1xuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkVycm9yKHd4Z2FtZVBsYXRmb3JtLm9uZXJybyk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkNsb3NlKHd4Z2FtZVBsYXRmb3JtLmNsb3NlQUQpOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfZ2V0Zm9jdXMgKTtcbiAgICB9XG5cbiAgICAvLyDlub/lkYrlpLHotKVcbiAgICBwdWJsaWMgZmFpbFZpZGVvKCk6dm9pZFxuICAgIHtcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubGFzdFZpZGVvVGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0udmlkZW9wbGF5aW5nPWZhbHNlO1xuICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuW5v+WRiuWKoOi9veWksei0pSzor5Xor5XliKvnmoTmlrnlvI/lkKd+XCIgKTtcbiAgICAgICAgdmFyIHd4Z2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmRXJyb3Iod3hnYW1lUGxhdGZvcm0ub25lcnJvKTsgLy/np7vpmaQg5LiN54S26KKr5aSa5qyh6LCD55SoXG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmQ2xvc2Uod3hnYW1lUGxhdGZvcm0uY2xvc2VBRCk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxuICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0udmlkZW9jYWxsb2JqICYmIHd4Z2FtZVBsYXRmb3JtLnZpZGVvZmFpbENhbGxiYWNrICkgXG4gICAgICAgIHtcbiAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvZmFpbENhbGxiYWNrLmNhbGwoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiApO1xuICAgICAgICB9XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2dldGZvY3VzICk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ2FuVmlkZW8oKTpib29sZWFuXG4gICAge1xuICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0gPCBXWEdhbWVQbGF0Zm9ybS5WaWRlb051bSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bSA9PSAwIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2aWRlb2JzOm51bWJlciA9IE1hdGguZmxvb3IoV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0vV1hHYW1lUGxhdGZvcm0uVmlkZW90b1NoYXJlKTtcbiAgICAgICAgICAgIHZhciBzaGFyZWJzOm51bWJlciA9IE1hdGguZmxvb3IoV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW0vV1hHYW1lUGxhdGZvcm0uU2hhcmV0b1ZpZGVvKTtcbiAgICAgICAgICAgIGlmKCB2aWRlb2JzID4gc2hhcmVicyApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiggdmlkZW9icyA8IHNoYXJlYnMgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciB2aWRlb3l1c2h1Om51bWJlciA9IFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtJVdYR2FtZVBsYXRmb3JtLlZpZGVvdG9TaGFyZTtcbiAgICAgICAgICAgICAgICBpZiggdmlkZW95dXNodSAhPSAwIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc2hhcmV5dXNodTpudW1iZXIgPSBXWEdhbWVQbGF0Zm9ybS5kYXlTaGFyZU51bSVXWEdhbWVQbGF0Zm9ybS5TaGFyZXRvVmlkZW87XG4gICAgICAgICAgICAgICAgaWYoIHNoYXJleXVzaHUgIT0gMCApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJhbm5lclJ1blRpbWU6bnVtYmVyPTA7XG4gICAgcHJpdmF0ZSBiYW5uZXJBZDtcbiAgICBwdWJsaWMgbm93U3R5cGU6YW55O1xuICAgIHByaXZhdGUgX2Jhbm5lclR5cGVMaXN0OkFycmF5PGFueT4gPSBbXTtcbiAgICBwdWJsaWMgY3JlYXRlQmFubmVyKCBiYW5uZXJ0eXBlOnN0cmluZz1cIlwiLHN0eWxlOmFueSk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggYmFubmVydHlwZSAhPSBcIlwiIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgYm86Ym9vbGVhbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciggdmFyIGk6bnVtYmVyID0gMDtpIDwgdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoO2krKyApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiggYmFubmVydHlwZSA9PSB0aGlzLl9iYW5uZXJUeXBlTGlzdFtpXS50eXBlIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmFubmVyVHlwZUxpc3RbaV0uc3R5bGUgPSBzdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8YW55PiA9IHRoaXMuX2Jhbm5lclR5cGVMaXN0LnNwbGljZSggaSwxICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYW5uZXJUeXBlTGlzdC5wdXNoKCBhcnJbMF0gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKCAhYm8gKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmFubmVyVHlwZUxpc3QucHVzaCggeyB0eXBlOmJhbm5lcnR5cGUsc3R5bGU6c3R5bGUgfSApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoPT0wIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW06YW55ID0gdGhpcy5fYmFubmVyVHlwZUxpc3RbdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IGl0ZW0uc3R5bGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuYmFubmVyQWQpIFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBub3cgPSBMYXlhLkJyb3dzZXIubm93KCk7XG4gICAgICAgICAgICAgICAgLy/otoXov4cz5YiG6ZKf5Yi35pawXG4gICAgICAgICAgICAgICAgaWYgKG5vdyAtIHRoaXMuYmFubmVyUnVuVGltZSA+IDYwMDAwICogMykgXG4gICAgICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQub2ZmRXJyb3IodGhpcy5iYW5uZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQub2ZmUmVzaXplKHRoaXMuYmFubmVyUmVzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5kZXN0b3J5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTmV3QmFubmVyKHN0eWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QmFubmVyKHN0eWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU5ld0Jhbm5lcihzdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9zY3JlZW53aWR0aDpudW1iZXIgPSAwO1xuICAgIGJhbm5lcmhlaWdodDpudW1iZXIgPSAwO1xuICAgIGJhbm5lcndpZHRoOm51bWJlciA9IDA7XG4gICAgaXNvblJlc2l6ZTpib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGNyZWF0ZU5ld0Jhbm5lcihzdHlsZTogYW55KSB7XG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XG4gICAgICAgIGlmKCB3eCAmJiB3eC5jcmVhdGVCYW5uZXJBZCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubm93U3R5cGUgPSBzdHlsZTtcbiAgICAgICAgICAgIHRoaXMuYmFubmVyUnVuVGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcbiAgICAgICAgICAgIHZhciBpbmZvID0gdGhpcy5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgICAgICAgICAgdGhpcy5fc2NyZWVud2lkdGggPSBpbmZvLnNjcmVlbldpZHRoO1xuICAgICAgICAgICAgdmFyIHNjYWxlOm51bWJlciA9IDE7XG4gICAgICAgICAgICBpZiggc3R5bGUuaGFzT3duUHJvcGVydHkoXCJzY2FsZVwiKSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2NhbGUgPSBzdHlsZS5zY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYmFubmVyQWQgPSB3eC5jcmVhdGVCYW5uZXJBZCh7XG4gICAgICAgICAgICAgICAgYWRVbml0SWQ6ICdhZHVuaXQtOGMyZDU4NjEzNWZhNmQ0ZicsXG4gICAgICAgICAgICAgICAgYWRJbnRlcnZhbHM6MzAsXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBpbmZvLnNjcmVlbkhlaWdodCAtIDEwNSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGluZm8uc2NyZWVuV2lkdGggKiBzY2FsZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuYmFubmVyQWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLm9uRXJyb3IodGhpcy5iYW5uZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93QmFubmVyKHN0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYmFubmVyUmVzaXplKCByZXMgKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgc2VsZiA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xuICAgICAgICBzZWxmLmJhbm5lckFkLm9mZlJlc2l6ZShzZWxmLmJhbm5lclJlc2l6ZSk7XG4gICAgICAgIHNlbGYuaXNvblJlc2l6ZSA9IGZhbHNlO1xuICAgICAgICB2YXIgbm93c3R5cGU6YW55ID0gc2VsZi5ub3dTdHlwZTtcbiAgICAgICAgaWYoICFub3dzdHlwZSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5mbyA9IHNlbGYuZ2V0U3lzdGVtSW5mb1N5bmMoKTtcbiAgICAgICAgdmFyIHBlcmNlbnRhZ2VIOm51bWJlciA9IExheWEuQnJvd3Nlci5jbGllbnRIZWlnaHQvTGF5YS5zdGFnZS5kaXNwbGF5SGVpZ2h0O1xuICAgICAgICB2YXIgcGVyY2VudGFnZVc6bnVtYmVyID0gTGF5YS5Ccm93c2VyLmNsaWVudFdpZHRoL0xheWEuc3RhZ2UuZGlzcGxheVdpZHRoO1xuICAgICAgICBzZWxmLmJhbm5lcndpZHRoID0gcmVzLndpZHRoO1xuICAgICAgICBzZWxmLmJhbm5lcmhlaWdodCA9IHJlcy5oZWlnaHQ7XG4gICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInhcIikgJiYgbm93c3R5cGUueCAhPSAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgc2VsZi5iYW5uZXJBZC5zdHlsZS5sZWZ0ID0gbm93c3R5cGUueCAqIHBlcmNlbnRhZ2VXO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgc2VsZi5iYW5uZXJBZC5zdHlsZS5sZWZ0ID0gKGluZm8ud2luZG93V2lkdGggLSByZXMud2lkdGgpICogMC41O1xuICAgICAgICB9XG4gICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInlcIikgJiYgbm93c3R5cGUueSAhPSAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgc2VsZi5iYW5uZXJBZC5zdHlsZS50b3AgPSBub3dzdHlwZS55ICogcGVyY2VudGFnZUg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBzZWxmLmJhbm5lckFkLnN0eWxlLnRvcCA9IChpbmZvLndpbmRvd0hlaWdodCAtIHJlcy5oZWlnaHQpIC0gMTU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGJhbm5lckVycm9yKGVycjphbnkpOnZvaWRcbiAgICB7XG5cbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dCYW5uZXIoIHN0eWxlICkge1xuICAgICAgICBpZiAodGhpcy5iYW5uZXJBZCkgXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubm93U3R5cGUgPSBzdHlsZTtcbiAgICAgICAgICAgIHZhciBpbmZvID0gdGhpcy5nZXRTeXN0ZW1JbmZvU3luYygpO1xuXG4gICAgICAgICAgICB2YXIgbm93c3R5cGU6YW55ID0gdGhpcy5ub3dTdHlwZTtcbiAgICAgICAgICAgIHZhciBzY2FsZTpudW1iZXIgPSAxO1xuICAgICAgICAgICAgaWYoIG5vd3N0eXBlLmhhc093blByb3BlcnR5KFwic2NhbGVcIikgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNjYWxlID0gbm93c3R5cGUuc2NhbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGVyY2VudGFnZUg6bnVtYmVyID0gTGF5YS5Ccm93c2VyLmNsaWVudEhlaWdodC9MYXlhLnN0YWdlLmRpc3BsYXlIZWlnaHQ7XG4gICAgICAgICAgICB2YXIgcGVyY2VudGFnZVc6bnVtYmVyID0gTGF5YS5Ccm93c2VyLmNsaWVudFdpZHRoL0xheWEuc3RhZ2UuZGlzcGxheVdpZHRoO1xuICAgICAgICAgICAgaWYoIG5vd3N0eXBlLmhhc093blByb3BlcnR5KFwieFwiKSAmJiBub3dzdHlwZS54ICE9IDAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuc3R5bGUubGVmdCA9IG5vd3N0eXBlLnggKiBwZXJjZW50YWdlVztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLmxlZnQgPSAoaW5mby53aW5kb3dXaWR0aCAtIHRoaXMuYmFubmVyd2lkdGgpICogMC41O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIG5vd3N0eXBlLmhhc093blByb3BlcnR5KFwieVwiKSAmJiBub3dzdHlwZS55ICE9IDAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuc3R5bGUudG9wID0gbm93c3R5cGUueSAqIHBlcmNlbnRhZ2VIO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuc3R5bGUudG9wID0gKGluZm8ud2luZG93SGVpZ2h0IC0gdGhpcy5iYW5uZXJoZWlnaHQpIC0gMTU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLndpZHRoID0gaW5mby5zY3JlZW5XaWR0aCAqIHNjYWxlO1xuICAgICAgICAgICAgaWYoICF0aGlzLmlzb25SZXNpemUgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNvblJlc2l6ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5vblJlc2l6ZSh0aGlzLmJhbm5lclJlc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJhbm5lckFkLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoaWRlQmFubmVyKCB0eXBlOnN0cmluZyA9IFwiXCIgKSB7XG4gICAgICAgIGlmICh0aGlzLmJhbm5lckFkKSB7XG4gICAgICAgICAgICB0aGlzLmJhbm5lckFkLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiggdHlwZSAhPSBcIlwiIClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKCB2YXIgaTpudW1iZXIgPSAwO2kgPCB0aGlzLl9iYW5uZXJUeXBlTGlzdC5sZW5ndGg7aSsrIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggdHlwZSA9PSB0aGlzLl9iYW5uZXJUeXBlTGlzdFtpXS50eXBlIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Jhbm5lclR5cGVMaXN0LnNwbGljZSggaSwxICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCB0aGlzLl9iYW5uZXJUeXBlTGlzdC5sZW5ndGggPiAwIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbTphbnkgPSB0aGlzLl9iYW5uZXJUeXBlTGlzdFt0aGlzLl9iYW5uZXJUeXBlTGlzdC5sZW5ndGgtMV07XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVCYW5uZXIoIGl0ZW0udHlwZSxpdGVtLnN0eWxlICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmjpLooYzmppzmiZPlvIDnsbvlnovlrZjlgqhcbiAgICAgKi9cbiAgICBwcml2YXRlIF9vcGVucmFua0RpY3Q6YW55PXt9O1xuICAgIC8vIHByaXZhdGUgX3d4T3BlbkRhdGFWaWV3ZXI6V1hPcGVuRGF0YVZpZXdlcjtcbiAgICAvKipcbiAgICAgKiDmiZPlvIDlpb3lj4vmjpLooYzmppxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlbkZyaWVuZFJhbmsoIHR5cGU6c3RyaW5nLHZpZXdUeXBlOnN0cmluZyxyZWN0OkxheWEuUmVjdGFuZ2xlLHBhcmVudDpMYXlhLlNwcml0ZSA9IG51bGwsZGF0YTphbnkgPSBudWxsICk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5jbG9zZXppeXVTdGFnZSgpO1xuICAgICAgICB0aGlzLl9vcGVucmFua0RpY3Rbdmlld1R5cGVdID0ge3R5cGU6dHlwZSx2aWV3VHlwZTp2aWV3VHlwZSxyZWN0OnJlY3QscGFyZW50OnBhcmVudCxkYXRhOmRhdGF9O1xuICAgICAgICB0aGlzLmluaXR6aXl1U3RhZ2UocmVjdCxwYXJlbnQpO1xuICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKCB0eXBlLGRhdGEgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmjpLooYzmppzmiZPlvIDnirbmgIHml7blgJnvvIzliIfmjaLmmL7npLrnsbvlnotcbiAgICAgKiBAcGFyYW0gdHlwZSBcbiAgICAgKi9cbiAgICBwdWJsaWMgY2hhbmdlRnJpZW5kUmFuayggdHlwZTpzdHJpbmcgKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKCB0eXBlICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5o6S6KGM5qac5LiK5LiA6aG1XG4gICAgICovXG4gICAgcHVibGljIHByZVBhZ2VSYW5rKCk6dm9pZFxuICAgIHtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaOkuihjOamnOS4i+S4gOmhtVxuICAgICAqL1xuICAgIHB1YmxpYyBuZXh0UGFnZVJhbmsoKTp2b2lkXG4gICAge1xuICAgICAgICBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlhbPpl63lpb3lj4vmjpLooYzmppxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2VGcmllbmRSYW5rKCB2aWV3VHlwZTpzdHJpbmcgKTp2b2lkXG4gICAge1xuXG4gICAgICAgIHRoaXMuY2xvc2V6aXl1U3RhZ2UoKTtcbiAgICAgICAgaWYoIHRoaXMuX29wZW5yYW5rRGljdFt2aWV3VHlwZV0gKVxuICAgICAgICB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fb3BlbnJhbmtEaWN0W3ZpZXdUeXBlXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IoIHZhciBzIGluIHRoaXMuX29wZW5yYW5rRGljdCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBpdGVtZDphbnkgPSB0aGlzLl9vcGVucmFua0RpY3Rbc107XG4gICAgICAgICAgICB0aGlzLm9wZW5GcmllbmRSYW5rKCBpdGVtZC50eXBlLGl0ZW1kLnZpZXdUeXBlLGl0ZW1kLnJlY3QsaXRlbWQucGFyZW50LGl0ZW1kLmRhdGEgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yid5aeL5YyW5a2Q5Z+fXG4gICAgICogQHBhcmFtIHJlY3QgXG4gICAgICogQHBhcmFtIHBhcmVudCBcbiAgICAgKi9cbiAgICBwcml2YXRlIGluaXR6aXl1U3RhZ2UoIHJlY3Q6TGF5YS5SZWN0YW5nbGUscGFyZW50OkxheWEuU3ByaXRlICk6dm9pZFxuICAgIHtcbiAgICAgICAgLy8gaWYoICF0aGlzLl93eE9wZW5EYXRhVmlld2VyIClcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgdGhpcy5fd3hPcGVuRGF0YVZpZXdlciA9IG5ldyBXWE9wZW5EYXRhVmlld2VyKCk7XG4gICAgICAgIC8vICAgICBpZiggcGFyZW50IClcbiAgICAgICAgLy8gICAgIHtcbiAgICAgICAgLy8gICAgICAgICBwYXJlbnQuYWRkQ2hpbGQoIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIgKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGVsc2VcbiAgICAgICAgLy8gICAgIHtcbiAgICAgICAgLy8gICAgICAgICBHYW1lTGF5ZXJNYW5hZ2VyLkluc3RhbmNlLnRvcExheWVyLmRpc3BsYXlPYmplY3QuYWRkQ2hpbGQoIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIgKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICAvLyB0aGlzLl93eE9wZW5EYXRhVmlld2VyLnggPSByZWN0Lng7XG4gICAgICAgIC8vIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIueSA9IHJlY3QueTtcbiAgICAgICAgLy8gdGhpcy5fd3hPcGVuRGF0YVZpZXdlci53aWR0aCA9IHJlY3Qud2lkdGg7XG4gICAgICAgIC8vIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIuaGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6ZSA5q+B5a2Q5Z+fXG4gICAgICovXG4gICAgcHJpdmF0ZSBjbG9zZXppeXVTdGFnZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIC8vIGlmKCB0aGlzLl93eE9wZW5EYXRhVmlld2VyIClcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgdGhpcy5fd3hPcGVuRGF0YVZpZXdlci5kZXN0cm95KCk7XG4gICAgICAgIC8vICAgICB0aGlzLl93eE9wZW5EYXRhVmlld2VyLnJlbW92ZVNlbGYoKTtcbiAgICAgICAgLy8gICAgIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIgPSBudWxsO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pWw5o2u5LiK5Lyg77yI55So5LqO5o6S6KGM5qac5pWw5o2u5pi+56S677yJXG4gICAgICogQHBhcmFtIHBhcmFtMSDkuIrmiqXmlbDmja5cbiAgICAgKiBAcGFyYW0gcGFyYW0yIOS4iuaKpeaVsOaNrlxuICAgICAqL1xuICAgIHB1YmxpYyBzdG9yZVRvQ2xvdWQocGFyYW0xOm51bWJlcixwYXJhbTI6bnVtYmVyKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgY2FjaGVNYWdlcjpMb2NhbERhdGFDb250cm9sID0gTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZTtcbiAgICAgICAgdmFyIHNjb3JlMTpudW1iZXIgPSBjYWNoZU1hZ2VyLmdldG51bSggXCJwYXJhbTFcIiApO1xuICAgICAgICAvLyB2YXIgc2NvcmUyOm51bWJlciA9IGNhY2hlTWFnZXIuZ2V0bnVtKCBcInBhcmFtMlwiICk7XG4gICAgICAgIHBhcmFtMSA9IE1hdGguZmxvb3IocGFyYW0xKTtcbiAgICAgICAgcGFyYW0yID0gTWF0aC5mbG9vcihwYXJhbTIpO1xuICAgICAgICB2YXIgcmVzdWx0MTpudW1iZXIgPSBwYXJhbTE7XG4gICAgICAgIHZhciByZXN1bHQyOm51bWJlciA9IHBhcmFtMjtcblxuICAgICAgICBpZiggcmVzdWx0MSA8IHNjb3JlMSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlc3VsdDEgPSBzY29yZTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjYWNoZU1hZ2VyLmFkZHN0ciggXCJwYXJhbTFcIixyZXN1bHQxLnRvU3RyaW5nKCkgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSBbXTtcbiAgICAgICAgYXJyLnB1c2goIHsga2V5OlwicGFyYW0xXCIsdmFsdWU6cmVzdWx0MS50b1N0cmluZygpIH0gKTtcbiAgICAgICAgYXJyLnB1c2goIHsga2V5OlwicGFyYW0yXCIsdmFsdWU6cmVzdWx0MiArIFwiXCIgfSApO1xuICAgICAgICB0aGlzLnNldFVzZXJDbG91ZFN0b3JhZ2UoYXJyKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2FtZWNsdWJCdXR0b246YW55O1xuICAgIHB1YmxpYyBjcmVhdGVHYW1lQ2x1YkJ1dHRvbiggc3R5bGU6YW55LGljb246c3RyaW5nID0gXCJncmVlblwiICk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHd4OmFueSA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XG4gICAgICAgIGlmKCB3eCAmJiBzdHlsZSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHN0eWxlLndpZHRoID0gNDA7XG4gICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSA0MDtcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdhbWVjbHViQnV0dG9uID0gd3guY3JlYXRlR2FtZUNsdWJCdXR0b24oXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpY29uOiBpY29uLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZihXWEdhbWVQbGF0Zm9ybS5nYW1lY2x1YkJ1dHRvbilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nYW1lY2x1YkJ1dHRvbi5zaG93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgfVxufVxuXG4iLCJpbXBvcnQge1dYR2FtZVBsYXRmb3JtfSBmcm9tIFwiLi4vV1hTREsvV1hHYW1lUGxhdGZvcm1cIjtcbmltcG9ydCB7UGxhdGZyb21UeXBlfSBmcm9tIFwiLi9QbGF0ZnJvbVR5cGVcIjtcbmltcG9ydCB7V0VDSEFURVZFTlR9IGZyb20gXCIuLi9XWFNESy9XRUNIQVRFVkVOVFwiO1xuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbmltcG9ydCB7IFRpbWVzVGFtcGVyIH0gZnJvbSBcIi4uL1RpbWUvVGltZXNUYW1wZXJcIjtcbmltcG9ydCB7RGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0RhdGVDb250cm9sXCI7XG5pbXBvcnQge0F1ZGlvQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvQXVkaW9Db250cm9sXCI7XG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XG5cbi8qXG4qIG5hbWU7XG4qLyBcbmV4cG9ydCBjbGFzcyBwaW5ndGFpdXRpbHNcbntcbiAgICBwcml2YXRlIF9pc2VuYWJsZTpib29sZWFuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICog5piv5ZCm5ZCI6KeEXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNsZWdhbDpudW1iZXIgPSAwO1xuXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcGluZ3RhaXV0aWxzLmlucyA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOiBwaW5ndGFpdXRpbHM7XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBwaW5ndGFpdXRpbHMge1xuICAgICAgICBpZiAocGluZ3RhaXV0aWxzLmlucyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHBpbmd0YWl1dGlscygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwaW5ndGFpdXRpbHMuaW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIneWni+WMluW5s+WPsFxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0UGxhdGZyb20oKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy50dCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIEdsb2JhbC5ub3dwbGF0ZnJvbSA9IFBsYXRmcm9tVHlwZS50dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChMYXlhLkJyb3dzZXIud2luZG93Lnd4KSAvL+W+ruS/oeWwj+a4uOaIj1xuICAgICAgICB7XG4gICAgICAgICAgICBHbG9iYWwubm93cGxhdGZyb20gPSBQbGF0ZnJvbVR5cGUud3g7XG4gICAgICAgIH0gXG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgR2xvYmFsLm5vd3BsYXRmcm9tID0gUGxhdGZyb21UeXBlLnBjO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQoKTp2b2lkIFxuICAgIHtcbiAgICAgICAgdGhpcy5pbml0UGxhdGZyb20oKTtcbiAgICAgICAgLy8gc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgLy8gICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5pbml0KCk7XG4gICAgICAgIC8vICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgUGxhdGZyb21UeXBlLnFxOlxuICAgICAgICAvLyAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBkZWZhdWx0OlxuICAgICAgICAvLyAgICAgYnJlYWs7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdGhpcy5vblNob3coIHRoaXMsdGhpcy5zaG93Y2FsbGJhY2sgKTtcbiAgICAgICAgLy8gdGhpcy5vbkhpZGUodGhpcyx0aGlzLmhpZGVjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RGF0YSgpOnZvaWRcbiAgICB7XG4gICAgICAgIERhdGVDb250cm9sLkluc3RhbmNlLlNldFNlbGYoKTtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5pbml0RGF0YSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkIjov53op4TliKTmlq0gdHJ1Ze+8muWQiOinhO+8jGZhbHNlOui/neinhFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tFbmFibGUoKTpib29sZWFuXG4gICAge1xuICAgICAgICBpZiAocGluZ3RhaXV0aWxzLmlzbGVnYWwgPT0gMSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2xvZ2luY2FsbG9iajphbnk7XG4gICAgcHJpdmF0ZSBfbG9naW5zdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb247XG4gICAgcHVibGljIGxvZ2luKCBjYWxsb2JqOmFueT1udWxsLHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbj1udWxsLHByb2dyZXNzQ2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsY2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsICk6dm9pZFxuICAgIHtcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XG4gICAgICAgIHRoaXMuX2xvZ2luY2FsbG9iaiA9IGNhbGxvYmo7XG4gICAgICAgIHRoaXMuX2xvZ2luc3VjY2VlZGNhbGxiYWNrID0gc3VjY2VlZGNhbGxiYWNrO1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNyZWF0ZVVzZXJBbmRMb2dpbih0aGlzLHRoaXMubG9naW5TdWNjZWVkLHRoaXMubG9naW5wcm9ncmVzc0NhbGxiYWNrLHRoaXMubG9naW5mYWlsY2FsbGJhY2spO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMubG9naW5TdWNjZWVkKG51bGwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvZ2lucHJvZ3Jlc3NDYWxsYmFjayggdmFsdWU6bnVtYmVyICk6dm9pZFxuICAgIHtcbiAgICAgICAgXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dpblN1Y2NlZWQoIGRhdGE6YW55ICk6dm9pZFxuICAgIHsgXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuY2xvc2VNb2RhbFdhaXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvZ2luZmFpbGNhbGxiYWNrKCk6dm9pZFxuICAgIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBvblNob3coY2FsbG9iajogYW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazogRnVuY3Rpb249bnVsbCwgZmFpbENhbGxiYWNrOiBGdW5jdGlvbiA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5vblNob3coY2FsbG9iaiwgc3VjY2VlZGNhbGxiYWNrLCBmYWlsQ2FsbGJhY2spO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS5xcTpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93Y2FsbGJhY2soKTp2b2lkXG4gICAge1xuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMuYWdhaW5wbGF5YmdTb3VuZCApO1xuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDUwMCx0aGlzLHRoaXMuYWdhaW5wbGF5YmdTb3VuZCApO1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9vbnNob3cgKTtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfZ2V0Zm9jdXMgKTtcbiAgICAgICAgdmFyIGZyb21zY2VuZTpudW1iZXIgPSBwaW5ndGFpdXRpbHMuZnJvbXNjZW5lKCk7XG4gICAgICAgIGlmKCBmcm9tc2NlbmUgPT0gMTA4OSB8fCBmcm9tc2NlbmUgPT0gMTEzMSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2Zyb21zY29yZmsgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWdhaW5wbGF5YmdTb3VuZCgpOnZvaWRcbiAgICB7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX29uQXVkaW9JbnRlcnJ1cHRpb25FbmQgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25IaWRlKGNhbGxvYmo6IGFueT1udWxsLCBzdWNjZWVkY2FsbGJhY2s6IEZ1bmN0aW9uPW51bGwpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5vbkhpZGUoY2FsbG9iaiwgc3VjY2VlZGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUucXE6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGhpZGVjYWxsYmFjaygpOnZvaWRcbiAgICB7XG4gICAgICAgIFRpbWVzVGFtcGVyLkluc3RhbmNlLnNlbmRvbmxpbmVUb25namkoKTtcbiAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLkNsZWFyQWxsU09VTkQoKTtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfb25oaWRlICk7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2xvc2Vmb2N1cyApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW9k+WJjea4uOaIj+aYr+WQpuWcqOaYvuekuuS4rVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNzaG93KCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgdmFyIGJvOmJvb2xlYW4gPSB0cnVlO1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5pc1Nob3dpbmcgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYm8gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBibyA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJvO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIhuWMheWKoOi9vVxuICAgICAqL1xuICAgIHB1YmxpYyBsb2FkU3VicGFja2FnZSggdHlwZW5hbWU6c3RyaW5nLGNhbGxvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGNhbGxwcm9ncmVzczpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb249bnVsbCApOnZvaWRcbiAgICB7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UubG9hZFN1YnBhY2thZ2UoIHR5cGVuYW1lLGNhbGxvYmosY2FsbGJhY2ssY2FsbHByb2dyZXNzLGZhaWxjYWxsYmFjayApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIGNhbGxiYWNrIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoIGNhbGxvYmogKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiOt+WPluaYr+WQpuW3sue7j+aOiOadg1xuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxuICAgICAqIEBwYXJhbSBjYWxsYmFjayBcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNhY2NyZWRpdCggY2FsbG9iajphbnksYWNjcmVkaXRDYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcbiAgICB7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuZ2V0YWNjcmVkaXQoIGNhbGxvYmosYWNjcmVkaXRDYWxsYmFjayApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS5xcTpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5nZXRhY2NyZWRpdCggY2FsbG9iaixhY2NyZWRpdENhbGxiYWNrICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3JlZGl0Q2FsbGJhY2suY2FsbCggY2FsbG9iaix0cnVlICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmi7/op5LoibLkv6Hmga/mjojmnYNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlYWNjcmVkaXQoIGNhbGxvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcbiAgICB7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuY3JlYXRlVXNlckluZm9CdXR0b24oY2FsbG9iaixjYWxsYmFjayxmYWlsY2FsbGJhY2spO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2V1c2VyaW5mb0J1dHRvbigpOnZvaWRcbiAgICB7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuY2xvc2V1c2VyaW5mb2JVdHRvbigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpgIDlh7rmuLjmiI9cbiAgICAgKi9cbiAgICBwdWJsaWMgZXhpdEdhbWUoKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmV4aXRHYW1lKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaJk+W8gOWuouacjeWvueivneahhlxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuQ3VzdG9tZXJTZXJ2aWNlKCk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5vcGVuQ3VzdG9tZXJTZXJ2aWNlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOefremch+WKqFxuICAgICAqL1xuICAgIHB1YmxpYyB2aWJyYXRlU2hvcnQoKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnZpYnJhdGVTaG9ydCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQ2FuVmlkZW8oKTpib29sZWFuXG4gICAge1xuICAgICAgICB2YXIgYm86Ym9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBpZiggcGluZ3RhaXV0aWxzLmNoZWNrRW5hYmxlKCkgKVxuICAgICAgICB7XG4gICAgICAgICAgICBibyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgICAgIGJvID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuaXNDYW5WaWRlbygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJvID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYm87XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0U2hhcmVBcHAoa2V5OnN0cmluZyxjYWxsb2JqOmFueT1udWxsLHN1Y2NlZWRDYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwpOnZvaWRcbiAgICB7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uuc3RhcnRTaGFyZUFwcCgga2V5LGNhbGxvYmosc3VjY2VlZENhbGxiYWNrLGZhaWxDYWxsYmFjayApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIHN1Y2NlZWRDYWxsYmFjayApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZWVkQ2FsbGJhY2suY2FsbCggY2FsbG9iaiApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBsYXlWaWRlbygga2V5OnN0cmluZywgY2FsbG9iajphbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uPW51bGwsaXN0b25namlOdW06Ym9vbGVhbiA9IHRydWUgKVxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5wbGF5VmlkZW8oIGtleSxjYWxsb2JqLHN1Y2NlZWRjYWxsYmFjayxmYWlsQ2FsbGJhY2ssaXN0b25namlOdW0gKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiggY2FsbG9iaiAmJiBzdWNjZWVkY2FsbGJhY2sgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmogKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVCYW5uZXIoYmFubmVydHlwZTpzdHJpbmcsc3R5bGU6YW55PXt4OjAseTowLHNjYWxlOjF9KTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNyZWF0ZUJhbm5lciggYmFubmVydHlwZSxzdHlsZSApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZUJhbm5lciggYmFubmVydHlwZTpzdHJpbmcgKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmhpZGVCYW5uZXIoIGJhbm5lcnR5cGUgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pWw5o2u5LiK5Lyg77yI55So5LqO5o6S6KGM5qac5pWw5o2u5pi+56S677yJXG4gICAgICogQHBhcmFtIHBhcmFtMSDkuIrmiqXmlbDmja4xXG4gICAgICogQHBhcmFtIHBhcmFtMiDkuIrmiqXmlbDmja4yXG4gICAgICovXG4gICAgcHVibGljIHN0b3JlVG9DbG91ZChwYXJhbTE6bnVtYmVyLHBhcmFtMjpudW1iZXIpOnZvaWRcbiAgICB7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uuc3RvcmVUb0Nsb3VkKCBwYXJhbTEscGFyYW0yICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaJk+W8gOWlveWPi+aOkuihjOamnFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuRnJpZW5kUmFuayggdHlwZTpzdHJpbmcsdmlld1R5cGU6c3RyaW5nLHJlY3Q6TGF5YS5SZWN0YW5nbGUscGFyZW50OkxheWEuU3ByaXRlID0gbnVsbCxkYXRhOmFueSA9IG51bGwgKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLm9wZW5GcmllbmRSYW5rKCB0eXBlLHZpZXdUeXBlLHJlY3QscGFyZW50LGRhdGEgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5o6S6KGM5qac5omT5byA54q25oCB5pe25YCZ77yM5YiH5o2i5pi+56S657G75Z6LXG4gICAgICogQHBhcmFtIHR5cGUgXG4gICAgICovXG4gICAgcHVibGljIGNoYW5nZUZyaWVuZFJhbmsoIHR5cGU6c3RyaW5nICk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5jaGFuZ2VGcmllbmRSYW5rKHR5cGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmjpLooYzmppzkuIrkuIDpobVcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlUGFnZVJhbmsoKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnByZVBhZ2VSYW5rKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaOkuihjOamnOS4i+S4gOmhtVxuICAgICAqL1xuICAgIHB1YmxpYyBuZXh0UGFnZVJhbmsoKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLm5leHRQYWdlUmFuaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlhbPpl63lpb3lj4vmjpLooYzmppxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2VGcmllbmRSYW5rKCB2aWV3VHlwZTpzdHJpbmcgKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNsb3NlRnJpZW5kUmFuayh2aWV3VHlwZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2NrVmlkZW9MZWZ0VGltZSgpOm51bWJlclxuICAgIHtcbiAgICAgICAgdmFyIHRpbWU6bnVtYmVyID0gMDtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICB0aW1lID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UubG9ja1ZpZGVvTGVmdFRpbWUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGF5VmlkZW9OdW1zKCk6bnVtYmVyXG4gICAge1xuICAgICAgICB2YXIgdGltZTpudW1iZXIgPSAwO1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIHRpbWUgPSBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDEwODk65re75Yqg5Yiw5oiR55qE5bCP56iL5bqP77yMMTEzMTrmt7vliqDliLDmta7nqpdcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21zY2VuZSgpOm51bWJlclxuICAgIHtcbiAgICAgICAgdmFyIHNjZW5lOm51bWJlciA9IDA7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICBzY2VuZSA9IFdYR2FtZVBsYXRmb3JtLmZyb21zY2VuZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2VuZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUdhbWVDbHViQnV0dG9uKCBzdHlsZTphbnksaWNvbjpzdHJpbmcgPSBcImdyZWVuXCIgKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNyZWF0ZUdhbWVDbHViQnV0dG9uKCBzdHlsZSxpY29uICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4vUGxheWVyQWNjb3VudFwiO1xyXG5cclxuLy8gaW1wb3J0IHsgQWNjb3VudCB9IGZyb20gXCIuLi9BY2NvdW50L0FjY291bnRcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgdHRzaGFyZVxyXG57XHJcbiAgICBzdGF0aWMgc2hhcmUoKVxyXG4gICAge1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQuc2hhcmVBcHBNZXNzYWdlKHtcclxuICAgICAgICAgICAgY2hhbm5lbDogXCJhcnRpY2xlXCIsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlSWQ6IFwib2NnZjliNDY0NjRiOWFubGZmXCIsIC8vIOabv+aNouaIkOmAmui/h+WuoeaguOeahOWIhuS6q0lEXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIuWGsuWViuWGslwiLFxyXG4gICAgICAgICAgICBpbWFnZVVybDogXCJqaWF6YWkvMTIzLnBuZ1wiLFxyXG4gICAgICAgICAgICBxdWVyeTogXCJyZXMucXVlcnlcIixcclxuICAgICAgICAgICAgc3VjY2VzczogKCkgPT57fSxcclxuICAgICAgICAgICAgZmFpbDogKCkgPT57fSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgdHRhZFxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTp0dGFkO1xyXG4gICAgY29uc3RydWN0b3IoKVxyXG4gICAge1xyXG4gICAgICAgIHR0YWQuaW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTp0dGFkXHJcbiAgICB7XHJcbiAgICAgICAgaWYodHRhZC5pbnN0YW5jZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0dGFkLmluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IHR0YWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdmlkZWxBZFVuaXRJZCA9IFwiMTVnZmdwNThwb2NwODBoYmtiXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBiYW5uZXJBZFVuaXRJZCA9IFwiZHNrN2NvaGJsMmY0anBqdHE1XCI7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdmlkZW9BZDtcclxuICAgIFxyXG4gICAgc3RhdGljIGNsb3NlY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgc3RhdGljIEluaXRBRCgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEudmlkZW8gfHwgIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcblxyXG4gICAgICAgIHR0YWQuYmFubmVyQWRVbml0SWQgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLmJhbm5lckFkVW5pdElkP1BsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuYmFubmVyQWRVbml0SWQ6dHRhZC5iYW5uZXJBZFVuaXRJZDtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImJhbm5lckFkVW5pdElkXCIsdHRhZC5iYW5uZXJBZFVuaXRJZCk7XHJcbiAgICAgICAgdHRhZC52aWRlbEFkVW5pdElkID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS52aWRlbEFkVW5pdElkP1BsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEudmlkZWxBZFVuaXRJZDp0dGFkLnZpZGVsQWRVbml0SWQ7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ2aWRlbEFkVW5pdElkXCIsdHRhZC52aWRlbEFkVW5pdElkKTtcclxuXHJcbiAgICAgICAgdHRhZC52aWRlb0FkID0gTGF5YS5Ccm93c2VyLndpbmRvdy50dC5jcmVhdGVSZXdhcmRlZFZpZGVvQWQoeyBhZFVuaXRJZDogdGhpcy52aWRlbEFkVW5pdElkIH0pO1xyXG4gICAgICAgIHR0YWQudmlkZW9BZC5vbkNsb3NlKHJlcyA9PiBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcy5pc0VuZGVkKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0dGFkLmNsb3NlY2FsbGJhY2spXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0dGFkLmNsb3NlY2FsbGJhY2sodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR0YWQuY2xvc2VjYWxsYmFjaylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR0YWQuY2xvc2VjYWxsYmFjayhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBTaG93VmlkZW8oX2NiOkZ1bmN0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnZpZGVvIHx8ICFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwic2hvdyB2aWRlb1wiKTtcclxuICAgICAgICB0dGFkLmNsb3NlY2FsbGJhY2sgPSBfY2I7XHJcbiAgICAgICAgdHRhZC52aWRlb0FkLnNob3coKS50aGVuKCgpID0+IFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLlub/lkYrmmL7npLrmiJDlip9cIik7XHJcbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0dGFkLlNob3dUeHQoXCLop4bpopHmraPlnKjliqDovb3kuK1cIik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW5v+WRiue7hOS7tuWHuueOsOmXrumimFwiLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgLy8g5Y+v5Lul5omL5Yqo5Yqg6L295LiA5qyhXHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMjAwLHRoaXMsKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0dGFkLnZpZGVvQWQubG9hZCgpLnRoZW4oKCkgPT4gXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaJi+WKqOWKoOi9veaIkOWKn1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Yqg6L295oiQ5Yqf5ZCO6ZyA6KaB5YaN5pi+56S65bm/5ZGKXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0dGFkLnZpZGVvQWQuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNhbnNob3cgPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYmFubmVyQWQ7XHJcbiAgICBzdGF0aWMgU2hvd2Jhbm5lcigpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJzaG93IGJhbm5lclwiKTtcclxuICAgICAgICB0dGFkLmNhbnNob3cgPSB0cnVlO1xyXG4gICAgICAgIHZhciBpbmZvciA9IExheWEuQnJvd3Nlci53aW5kb3cudHQuZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgICAgICB2YXIgdGFyZ2V0QmFubmVyQWRXaWR0aCA9IDIwMDtcclxuICAgICAgICBpZih0dGFkLmJhbm5lckFkKXR0YWQuYmFubmVyQWQuZGVzdHJveSgpO1xyXG4gICAgICAgIExheWEudGltZXIub25jZSgyMDAsdGhpcywoKT0+e1xyXG4gICAgICAgICAgICB0dGFkLmJhbm5lckFkID0gTGF5YS5Ccm93c2VyLndpbmRvdy50dC5jcmVhdGVCYW5uZXJBZCh7XHJcbiAgICAgICAgICAgICAgICBhZFVuaXRJZDogdHRhZC5iYW5uZXJBZFVuaXRJZCxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRhcmdldEJhbm5lckFkV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBpbmZvci53aW5kb3dIZWlnaHQgLSAodGFyZ2V0QmFubmVyQWRXaWR0aCAvIDE2KSAqIDkgLy8g5qC55o2u57O757uf57qm5a6a5bC65a+46K6h566X5Ye65bm/5ZGK6auY5bqmXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICBcclxuICAgICAgICAgICAgdHRhZC5iYW5uZXJBZC5vbkxvYWQoKCk9PlxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZih0dGFkLmNhbnNob3cpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHRhZC5iYW5uZXJBZC5zaG93KCkudGhlbigoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlub/lkYrmmL7npLrmiJDlip9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW5v+WRiue7hOS7tuWHuueOsOmXrumimFwiLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICBcclxuICAgICAgICAgICAgdHRhZC5iYW5uZXJBZC5vblJlc2l6ZShzaXplID0+IFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgICAgICB0dGFkLmJhbm5lckFkLnN0eWxlLnRvcCA9IGluZm9yLndpbmRvd0hlaWdodCAtIHNpemUuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHR0YWQuYmFubmVyQWQuc3R5bGUubGVmdCA9IChpbmZvci53aW5kb3dXaWR0aCAtIHNpemUud2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIENsZWFyKClcclxuICAgIHtcclxuICAgICAgICB0dGFkLmNhbnNob3cgPSBmYWxzZTtcclxuICAgICAgICB0dGFkLmNsb3NlY2FsbGJhY2sgPSBudWxsO1xyXG4gICAgICAgIGlmKHR0YWQuYmFubmVyQWQpdHRhZC5iYW5uZXJBZC5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq5oqW6Z+z5pu05aSa5ri45oiP5pa55rOVKi9cclxuICAgIHN0YXRpYyBDcmVhdGVNb3JlR2FtZUJ0bihmdW46RnVuY3Rpb249bnVsbClcclxuICAgIHtcclxuICAgICAgICBpZighTGF5YS5Ccm93c2VyLm9uTW9iaWxlKXJldHVybjtcclxuICAgICAgICBpZihMYXlhLkJyb3dzZXIub25JT1MpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0dGFkLlNob3dUeHQoXCLmmoLmnKrlvIDmlL5cIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy50dC5zaG93TW9yZUdhbWVzTW9kYWwoe1xyXG4gICAgICAgICAgICBhcHBMYXVuY2hPcHRpb25zOiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXBwSWQ6IFwidHQ2NmQwMTA2ZGY5ZWFhMDgzXCIsXHJcbiAgICAgICAgICAgICAgICBxdWVyeTogXCJmb289YmFyJmJhej1xdXhcIixcclxuICAgICAgICAgICAgICAgIGV4dHJhRGF0YToge31cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBzdWNjZXNzKHJlcykge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3VjY2Vzc1wiLCByZXMuZXJyTXNnKTtcclxuICAgICAgICAgICAgICBpZihmdW4pXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZnVuKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBmYWlsKHJlcykge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZmFpbFwiLCByZXMuZXJyTXNnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvLyDnm5HlkKzlvLnnqpflhbPpl61cclxuICAgICAgICAvLyAgIHRoaXMub25Nb3JlR2FtZXNNb2RhbENsb3NlKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8q55uR5ZCs5by556qX5YWz6ZetKi9cclxuICAgIC8vIHN0YXRpYyBvbk1vcmVHYW1lc01vZGFsQ2xvc2UoKVxyXG4gICAgLy8ge1xyXG4gICAgLy8gICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG4gICAgLy8gICAgIGlmKCBMYXlhLkJyb3dzZXIub25JT1MpXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgICB0dGFkLlNob3dUeHQoXCLmmoLmnKrlvIDmlL5cIik7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy50dC5vbk1vcmVHYW1lc01vZGFsQ2xvc2UoZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwibW9kYWwgY2xvc2VkXCIpO1xyXG4gICAgLy8gICAgICAgICBpZihTY2VuZTNETWFuYWdlci5nZXRJbnN0YW5jZSgpLklzR2FtZVBhc3VlKVxyXG4gICAgLy8gICAgICAgICB7XHJcbiAgICAvLyAgICAgICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIEdhbWVFdmVudC5jb250aW51ZUdhbWUgKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd1R4dCh0ZXh0OiBzdHJpbmcpIFxyXG4gICAge1xyXG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93LnR0KSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQuc2hvd1RvYXN0KHsgdGl0bGU6IHRleHQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0ZXh0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvKipcbiAqIOWFqOWxgOS+puWQrOexu+WPiua2iOaBr+WkhOeQhlxuICovXG5leHBvcnQgIGNsYXNzIERpc1BhdGNoZXJPbiBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXG57XG4gICAgcHVibGljIHN0YXRpYyBpbnM6RGlzUGF0Y2hlck9uO1xuICAgIHByaXZhdGUgX2Rpc3BhdGNoZXI6TGF5YS5FdmVudERpc3BhdGNoZXI7XG4gICAgcHJpdmF0ZSBpc0luaXQ6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBEaXNQYXRjaGVyT24uaW5zID0gdGhpcztcbiAgICAgICAgaWYodGhpcy5pc0luaXQpeyAgICAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLl9kaXNwYXRjaGVyID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hlciA9IG5ldyBMYXlhLkV2ZW50RGlzcGF0Y2hlcigpO1xuICAgICAgICAgICAgdGhpcy5pc0luaXQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpEaXNQYXRjaGVyT257XG4gICAgICAgIGlmKERpc1BhdGNoZXJPbi5pbnM9PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gbmV3IERpc1BhdGNoZXJPbigpO1xuICAgICAgICByZXR1cm4gRGlzUGF0Y2hlck9uLmlucztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOnN0cmluZyxsaXN0ZW5lcjpGdW5jdGlvbix0aGlzT2JqZWN0OmFueSx1c2VDYXB0dXJlOmJvb2xlYW49ZmFsc2UscHJpb3JpdHk6bnVtYmVyPTApOnZvaWR7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoZXIub24oIHR5cGUsdGhpc09iamVjdCwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nLGxpc3RlbmVyOkZ1bmN0aW9uLHRoaXNPYmplY3Q6YW55LHVzZUNhcHR1cmU6Ym9vbGVhbj1mYWxzZSk6dm9pZHtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hlci5vZmYoIHR5cGUsdGhpc09iamVjdCwgbGlzdGVuZXIgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzRXZlbnRMaXN0ZW5lcih0eXBlOnN0cmluZyk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuaGFzTGlzdGVuZXIodHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQodHlwZTpzdHJpbmcsZGF0YT86IGFueSk6Ym9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaGVyLmV2ZW50KHR5cGUsZGF0YSk7XG4gICAgfVxufSIsImltcG9ydCB7TEV2ZW50fSBmcm9tIFwiLi9MRXZlbnRcIjtcbmltcG9ydCB7RGlzUGF0Y2hlck9ufSBmcm9tIFwiLi9EaXNQYXRjaGVyT25cIjtcblxuLypcbiogbmFtZTtcbiovXG5leHBvcnQgY2xhc3MgRGlzcGF0Y2hlck1hbmFnZXJcbntcbiAgICBzdGF0aWMgIGluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICBEaXNQYXRjaGVyT24uSW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLy/mlrDlu7rkuovku7ZcbiAgICBzdGF0aWMgIEV2ZW50KHR5cGU6IHN0cmluZywgb2JqOiBPYmplY3QgPSBudWxsLCBidWJibGVzOiBib29sZWFuID0gZmFsc2UsIGNhbmNlbGFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IExheWEuRXZlbnQge1xuICAgICAgICByZXR1cm4gbmV3IExFdmVudCh0eXBlLCBvYmosIGJ1YmJsZXMsIGNhbmNlbGFibGUpO1xuICAgIH1cblxuICAgIC8v5rS+5Y+R5LqL5Lu2XG4gICAgc3RhdGljICBkaXNwYXRjaEV2ZW50KHR5cGU6IHN0cmluZywgb2JqOiBPYmplY3QgPSBudWxsLCBidWJibGVzOiBib29sZWFuID0gZmFsc2UsIGNhbmNlbGFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBEaXNQYXRjaGVyT24uSW5zdGFuY2UuZGlzcGF0Y2hFdmVudCh0eXBlLCBvYmopO1xuICAgIH1cblxuICAgIC8v55uR5ZCs5LqL5Lu2XG4gICAgc3RhdGljICBhZGRFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIHVzZUNhcHR1cmU6IGJvb2xlYW4gPSBmYWxzZSwgcHJpb3JpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICAgICAgRGlzUGF0Y2hlck9uLkluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXNPYmplY3QsIHVzZUNhcHR1cmUsIHByaW9yaXR5KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgIGhhc0V2ZW50TGlzdGVuZXIodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBEaXNQYXRjaGVyT24uSW5zdGFuY2UuaGFzRXZlbnRMaXN0ZW5lcih0eXBlKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbiwgdXNlQ2FwdHVyZTogYm9vbGVhbiA9IGZhbHNlLCBwcmlvcml0eTogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgICAgICBEaXNQYXRjaGVyT24uSW5zdGFuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpc09iamVjdCk7XG4gICAgfVxufSIsImltcG9ydCBTcHJpdGUgPSBMYXlhLlNwcml0ZTtcbmV4cG9ydCAgY2xhc3MgR2FtZVN0YXRlXG57XG4gICAgc3RhdGljIHJlbW92ZXNlbGVjdDpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9yZW1vdmVzZWxlY3RcIjtcblxuICAgIFxuXG4gICAgc3RhdGljIG5wY2VuZDpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9ucGNlbmRHYW1lXCI7XG5cbiAgICBcblxuICAgIC8qKlxuICAgICAqIOmAmuWFs+aIkOWKn1xuICAgICAqL1xuICAgIHN0YXRpYyB3aW46c3RyaW5nID0gXCJHYW1lU3RhdGVfd2luR2FtZVwiO1xuXG4gICAgcHJpdmF0ZSBzcDogU3ByaXRlO1xuICAgIHByaXZhdGUgZHJhd1NvbWV0aGluZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zcCA9IG5ldyBTcHJpdGUoKTtcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLnNwKTtcbiAgICAgICAgLy/nlLvnur9cbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3TGluZSgxMCwgNTgsIDE0NiwgNTgsIFwiI2ZmMDAwMFwiLCAzKTtcbiAgICAgICAgLy/nlLvov57nu63nm7Tnur9cbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3TGluZXMoMTc2LCA1OCwgWzAsIDAsIDM5LCAtNTAsIDc4LCAwLCAxMTcsIDUwLCAxNTYsIDBdLCBcIiNmZjAwMDBcIiwgNSk7XG4gICAgICAgIC8v55S75puy57q/XG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0N1cnZlcygzNTIsIDU4LCBbMCwgMCwgMTksIC0xMDAsIDM5LCAwLCA1OCwgMTAwLCA3OCwgMCwgOTcsIC0xMDAsIDExNywgMCwgMTM2LCAxMDAsIDE1NiwgMF0sIFwiI2ZmMDAwMFwiLCA1KTtcbiAgICAgICAgLy/nlLvnn6nlvaJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UmVjdCgxMCwgMTY2LCAxNjYsIDkwLCBcIiNmZmZmMDBcIik7XG4gICAgICAgIC8v55S75aSa6L655b2iXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1BvbHkoMjY0LCAxNjYsIFswLCAwLCA2MCwgMCwgNzguNDgsIDU3LCAzMCwgOTMuNDgsIC0xOC40OCwgNTddLCBcIiNmZmZmMDBcIik7XG4gICAgICAgIC8v55S75LiJ6KeS5b2iXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1BvbHkoNDAwLCAxNjYsIFswLCAxMDAsIDUwLCAwLCAxMDAsIDEwMF0sIFwiI2ZmZmYwMFwiKTtcbiAgICAgICAgLy/nlLvlnIZcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3Q2lyY2xlKDk4LCAzMzIsIDUwLCBcIiMwMGZmZmZcIik7XG4gICAgICAgIC8v55S75omH5b2iXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1BpZSgyNDAsIDI5MCwgMTAwLCAxMCwgNjAsIFwiIzAwZmZmZlwiKTtcbiAgICAgICAgLy/nu5jliLblnIbop5Lnn6nlvaLvvIzoh6rlrprkuYnot6/lvoRcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UGF0aCg0MDAsIDMxMCwgW1tcIm1vdmVUb1wiLCA1LCAwXSwgW1wibGluZVRvXCIsIDEwNSwgMF0sIFtcImFyY1RvXCIsIDExMCwgMCwgMTEwLCA1LCA1XSwgW1wibGluZVRvXCIsIDExMCwgNTVdLCBbXCJhcmNUb1wiLCAxMTAsIDYwLCAxMDUsIDYwLCA1XSwgW1wibGluZVRvXCIsIDUsIDYwXSwgW1wiYXJjVG9cIiwgMCwgNjAsIDAsIDU1LCA1XSwgW1wibGluZVRvXCIsIDAsIDVdLCBbXCJhcmNUb1wiLCAwLCAwLCA1LCAwLCA1XSwgW1wiY2xvc2VQYXRoXCJdXSwge2ZpbGxTdHlsZTogXCIjMDBmZmZmXCJ9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog6YCa5YWz5aSx6LSlXG4gICAgICovXG4gICAgc3RhdGljIGZhaWw6c3RyaW5nID0gXCJHYW1lU3RhdGVfZmFpbEdhbWVcIjtcblxuICAgIHN0YXRpYyBqdW1wOnN0cmluZyA9IFwiR2FtZVN0YXRlX2p1bXBnYW1lXCI7XG5cbiAgICAvKipcbiAgICAgKiDmmoLlgZzmuLjmiI9cbiAgICAgKi9cbiAgICBzdGF0aWMgc3RvcDpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9zdG9wR2FtZVwiO1xuXG4gICAgLyoqXG4gICAgICog5Zue5Yiw5Li755WM6Z2iXG4gICAgICovXG4gICAgc3RhdGljIHJldHVybk1haW5WaWV3OnN0cmluZyA9IFwicmV0dXJuTWFpblZpZXdcIjtcblxuICAgIHN0YXRpYyB1cGRhdGVTS2luVmlldzpzdHJpbmcgPSBcIkdhbWVTdGF0ZV91cGRhdGVTS2luVmlld1wiO1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBidG5BcnI6QXJyYXk8c3RyaW5nPiA9IFtcInJlcy9idXR0b24ucG5nXCIsIFwicmVzL2J1dHRvbi5wbmdcIiwgXCJyZXMvYnV0dG9uLnBuZ1wiXTtcbiAgICBwcml2YXRlIG5hbWVBcnI6QXJyYXk8c3RyaW5nPiA9IFtcImNhbnZhc+aIquWbvlwiLFwic3ByaXRl5oiq5Zu+XCIsXCLmuIXnkIZcIl07XG4gICAgcHJpdmF0ZSBfY2FudmFzOkhUTUxDYW52YXNFbGVtZW50O1xuICAgIHByaXZhdGUgYWltU3A6U3ByaXRlO1xuICAgIHByaXZhdGUgZHJhd0ltYWdlOkxheWEuSW1hZ2U7XG4gICAgcHJpdmF0ZSBkcmF3U3A6U3ByaXRlO1xuXHRwcml2YXRlIG1vbmtleVRleHR1cmU6TGF5YS5UZXh0dXJlO1xuXG4gICAgcHJpdmF0ZSBfb25jbGljayhlOkxheWEuRXZlbnQpe1xuICAgICAgICBzd2l0Y2ggKGUudGFyZ2V0Lm5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgdGhpcy5uYW1lQXJyWzBdOlxuICAgICAgICAgICAgICAgIHZhciBiYXNlNjRVcmw6c3RyaW5nID0gdGhpcy5fY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiLDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd0ltYWdlLnNraW4gPSBiYXNlNjRVcmw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHRoaXMubmFtZUFyclsxXTpcbiAgICAgICAgICAgICAgICB2YXIgdGV4dDpMYXlhLlRleHR1cmUgPSBMYXlhLnN0YWdlLmRyYXdUb1RleHR1cmUoTGF5YS5Ccm93c2VyLmNsaWVudFdpZHRoLExheWEuQnJvd3Nlci5jbGllbnRIZWlnaHQsMCwwKSBhcyBMYXlhLlRleHR1cmU7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3U3AuZ3JhcGhpY3MuZHJhd1RleHR1cmUodGV4dCwwLDAsdGhpcy5kcmF3U3Aud2lkdGgsdGhpcy5kcmF3U3AuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgdGhpcy5uYW1lQXJyWzJdOlxuICAgICAgICAgICAgICAgIHRoaXMuZHJhd0ltYWdlLnNraW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1NwLmdyYXBoaWNzLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3U3AuZ3JhcGhpY3MuZHJhd1JlY3QoMCwwLHRoaXMuZHJhd1NwLndpZHRoLHRoaXMuZHJhd1NwLmhlaWdodCxcIiNmZjAwMDBcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgLyoqXG4gICAgICog5byA5aeL5ri45oiPXG4gICAgICovXG4gICAgc3RhdGljIHN0YXJ0OnN0cmluZyA9IFwiR2FtZVN0YXRlX3N0YXJ0R2FtZVwiO1xuXG4gICAgLyoqXG4gICAgICog57uT5p2f5ri45oiPXG4gICAgICovXG4gICAgc3RhdGljIGVuZDpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9lbmRHYW1lXCI7XG4gICAgXG4gICAgLyoq5aSx6LSlICovXG4gICAgc3RhdGljIGxvc2U6c3RyaW5nID0gXCJHYW1lU3RhdGVfbG9zZUdhbWVcIlxuICAgIC8qKlxuICAgICAqIOWkjea0u1xuICAgICAqL1xuICAgIHN0YXRpYyByZXZpdmU6c3RyaW5nID0gXCJHYW1lU3RhdGVfcmV2aXZlR2FtZVwiO1xuXG4gICAgLyoq5piv5ZCm5aSN5rS7ICovXG4gICAgc3RhdGljIGlzZGllOmJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKuWFgeiuuOWkjea0u+asoeaVsCAqL1xuICAgIHN0YXRpYyBmdWh1b2Npc2h1Om51bWJlciA9IDE7XG5cbiAgICAvKirmmK/lkKblt7Lnu4/lj5HluIPov4flvZXlsY8gKi9cbiAgICBzdGF0aWMgcmVjb3Jkc2NyZWU6Ym9vbGVhbiA9IGZhbHNlO1xufSIsIlxuLypcbiog5YWs5YWx5o6l5Y+jXG4qL1xuZXhwb3J0IG1vZHVsZSBHYW1lVXRpbHMge1xuICAgIC8qKlxuICAgICAqIOmaj+acuuWHveaVsCjov5Tlm57mlbTlnospXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJhbmRSYW5nZWludChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIgIHtcbiAgICAgICAgdmFyIHZhbHVlOm51bWJlcj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluO1xuICAgICAgICBpZih2YWx1ZT5tYXgpe1xuICAgICAgICAgICAgdmFsdWUgPSBtYXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmaj+acuuWHveaVsCgg5LiN5Y+W5pW0IClcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gcmFuZFJhbmdlZmxvYXQobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyICB7XG4gICAgICAgIHZhciB2YWx1ZTpudW1iZXIgPSBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluO1xuICAgICAgICBpZih2YWx1ZT5tYXgpe1xuICAgICAgICAgICAgdmFsdWUgPSBtYXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRUZXhieVBrZ0FuZE5hbWUoIHBrZ25hbWU6c3RyaW5nLHRleG5hbWU6c3RyaW5nICk6TGF5YS5UZXh0dXJlXG4gICAge1xuICAgICAgICB2YXIgdWlwYWNrYWdlOmZhaXJ5Z3VpLlVJUGFja2FnZSA9IGZhaXJ5Z3VpLlVJUGFja2FnZS5nZXRCeU5hbWUocGtnbmFtZSk7XG4gICAgICAgIGlmKCB1aXBhY2thZ2UgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdWlwYWNrYWdlLmdldEl0ZW1Bc3NldEJ5TmFtZSh0ZXhuYW1lKSBhcyBMYXlhLlRleHR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5YiH5Ymy5YiG5Y+35Y+Y5oiQUG9pbnTlr7nosaFcbiAgICAgKiBAcGFyYW0gc3RyIFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRmZW5oYW9Qb2ludCggc3RyOnN0cmluZyApOkxheWEuUG9pbnRcbiAgICB7XG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIjtcIik7XG4gICAgICAgIHJldHVybiBuZXcgTGF5YS5Qb2ludCggTnVtYmVyKCBhcnJbMF0gKSxOdW1iZXIoIGFyclsxXSApICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5YiH5Ymy5YiG5Y+35Y+Y5oiQ5pWw5o2uKG51bWJlcilcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0ZmVuaGFvdG9BcnJudW0oIHN0cjpzdHJpbmcgKTpBcnJheTxudW1iZXI+XG4gICAge1xuICAgICAgICB2YXIgbnVtQXJyOkFycmF5PG51bWJlcj49W107XG4gICAgICAgIGlmIChzdHIgPT0gXCJcIilcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG51bUFycjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCI7XCIpO1xuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xuICAgICAgICBmb3IoIGk7aTxhcnIubGVuZ3RoO2krKyApXG4gICAgICAgIHtcbiAgICAgICAgICAgIG51bUFyci5wdXNoKCBOdW1iZXIoIGFycltpXSApICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bUFycjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliIflibLliIblj7flj5jmiJDmlbDmja4oc3RyaW5nKVxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRmZW5oYW90b0FycnN0ciggc3RyOnN0cmluZyApOkFycmF5PHN0cmluZz5cbiAgICB7XG4gICAgICAgIHJldHVybiBzdHIuc3BsaXQoXCI7XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIh+WJsuWIhuWPt+WPmOaIkOaVsOaNriggeyBrZXk6MSx2YWx1ZToxIH0gKVxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRmZW5oYW90b09iaiggc3RyOnN0cmluZyApOmFueVxuICAgIHtcbiAgICAgICAgdmFyIG9iajphbnkgPSB7fTtcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KCBcIjtcIiApO1xuICAgICAgICBvYmoua2V5ID0gYXJyWzBdO1xuICAgICAgICBvYmoudmFsdWUgPSBhcnJbMV07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLyoq5YiH5Ymyc3RyKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0c3RydG9BcnIoIHN0cjpzdHJpbmcgKTpBcnJheTxzdHJpbmc+XG4gICAge1xuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoIFwifFwiICk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgLyoq5YiH5Ymyc3RyKCAxOjF8MToxICkgdG8gQXJyYXk8eyBrZXk6MSx2YWx1ZToxIH0+ICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dHN0cnRvQXJyMSggc3RyOnN0cmluZyApOkFycmF5PGFueT5cbiAgICB7XG4gICAgICAgIHZhciByZXNsdXRBcnI6QXJyYXk8YW55Pj1bXTtcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KCBcInxcIiApO1xuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xuICAgICAgICBmb3IoIGk9MDtpPGFyci5sZW5ndGg7aSsrIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGl0ZW1hcnI6QXJyYXk8c3RyaW5nPiA9IGFycltpXS5zcGxpdCggXCI7XCIgKTtcbiAgICAgICAgICAgIHJlc2x1dEFyci5wdXNoKCB7IGtleTppdGVtYXJyWzBdLHZhbHVlOml0ZW1hcnJbMV0gfSApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNsdXRBcnI7XG4gICAgfVxuXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dHN0cnRvT2JqKCBzdHI6c3RyaW5nICk6YW55XG4gICAge1xuICAgICAgICB2YXIgcmVzdWx0b2JqOmFueSA9IHt9O1xuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoIFwifFwiICk7XG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XG4gICAgICAgIGZvciggaT0wO2k8YXJyLmxlbmd0aDtpKysgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgaXRlbWFycjpBcnJheTxzdHJpbmc+ID0gYXJyW2ldLnNwbGl0KCBcIjtcIiApO1xuICAgICAgICAgICAgcmVzdWx0b2JqW2l0ZW1hcnJbMF1dID0gaXRlbWFyclsxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0b2JqO1xuICAgIH1cblxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVmVyc2lvbih2MSwgdjIpOm51bWJlclxuICAgIHtcbiAgICAgICAgdjEgPSB2MS5zcGxpdCgnLicpO1xuICAgICAgICB2MiA9IHYyLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWF4KHYxLmxlbmd0aCwgdjIubGVuZ3RoKTtcbiAgICAgICAgd2hpbGUgKHYxLmxlbmd0aCA8IGxlbikge1xuICAgICAgICAgICAgdjEucHVzaCgnMCcpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh2Mi5sZW5ndGggPCBsZW4pIHtcbiAgICAgICAgICAgIHYyLnB1c2goJzAnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBudW0xID0gcGFyc2VJbnQodjFbaV0pO1xuICAgICAgICAgICAgY29uc3QgbnVtMiA9IHBhcnNlSW50KHYyW2ldKTtcbiAgICAgICAgICAgIGlmIChudW0xID4gbnVtMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChudW0xIDwgbnVtMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59IiwiaW1wb3J0IHsgV29yZFRpcHNQYW5lbCB9IGZyb20gXCIuLi9WaWV3L0dsb2JhbFRpcFBhbmVsXCI7XG5pbXBvcnQgeyBMYXlvdXRDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvTGF5b3V0Q29udHJvbFwiO1xuaW1wb3J0IHsgTGF5T1VUIH0gZnJvbSBcIi4uL3V0aWxzL0xheU9VVFwiO1xuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIEdsb2JhbFRpcFxue1xuICAgIHN0YXRpYyB3b3JkTGlzdDpBcnJheTxXb3JkVGlwc1BhbmVsPiA9IFtdO1xuICAgIHN0YXRpYyBzaG93V29yZExpc3Q6QXJyYXk8V29yZFRpcHNQYW5lbD4gPSBbXTtcbiAgICBzdGF0aWMgbWF4TnVtOm51bWJlciA9IDEwO1xuICAgIHN0YXRpYyBpc0V2ZW50OmJvb2xlYW4gPSBmYWxzZTtcbiAgICBcblxuICAgIHByaXZhdGUgc3RhdGljIGluczpHbG9iYWxUaXA7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgR2xvYmFsVGlwLmlucyA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpHbG9iYWxUaXBcbiAgICB7XG4gICAgICAgIGlmKCBHbG9iYWxUaXAuaW5zID09IG51bGwgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEdsb2JhbFRpcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBHbG9iYWxUaXAuaW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0RXZlbnQoKTp2b2lkXG4gICAge1xuICAgICAgICBHbG9iYWxUaXAuaXNFdmVudCA9IHRydWU7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVTdGF0ZS5yZW1vdmVzZWxlY3QsdGhpcyx0aGlzLmFkZHdvcmRMaXN0ICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dXb3JkVGlwcyggd29yZDpzdHJpbmcgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggIUdsb2JhbFRpcC5pc0V2ZW50IClcbiAgICAgICAge1xuICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLmluaXRFdmVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKCBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0Lmxlbmd0aCA+IDAgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgbGFzdHdvcmQ6c3RyaW5nID0gR2xvYmFsVGlwLnNob3dXb3JkTGlzdFtHbG9iYWxUaXAuc2hvd1dvcmRMaXN0Lmxlbmd0aC0xXS5ub3d3b3JkO1xuICAgICAgICAgICAgLy8gaWYoIGxhc3R3b3JkID09IHdvcmQgKVxuICAgICAgICAgICAgLy8ge1xuICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgICBpZiggR2xvYmFsVGlwLndvcmRMaXN0Lmxlbmd0aCA+IDAgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgaXRlbTpXb3JkVGlwc1BhbmVsID0gR2xvYmFsVGlwLndvcmRMaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLkFkZExheWVyQnlOYW1lKCBpdGVtLExheU9VVC5USVAgKTtcbiAgICAgICAgICAgIEdsb2JhbFRpcC5zaG93V29yZExpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICAgIGl0ZW0uc2hvd1dvcmQoIHdvcmQgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0Lmxlbmd0aCA8IDEwIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbTE6V29yZFRpcHNQYW5lbCA9IG5ldyBXb3JkVGlwc1BhbmVsKCk7XG4gICAgICAgICAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5BZGRMYXllckJ5TmFtZSggaXRlbTEsTGF5T1VULlRJUCApO1xuICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5zaG93V29yZExpc3QucHVzaChpdGVtMSk7XG4gICAgICAgICAgICAgICAgaXRlbTEuc2hvd1dvcmQoIHdvcmQgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbTE6V29yZFRpcHNQYW5lbCA9IEdsb2JhbFRpcC5zaG93V29yZExpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpdGVtMS5zaG93V29yZCggd29yZCApO1xuICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5zaG93V29yZExpc3QucHVzaChpdGVtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFkZHdvcmRMaXN0KCBpdGVtOldvcmRUaXBzUGFuZWwgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggaXRlbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRnJvbVBhcmVudCgpO1xuICAgICAgICAgICAgdmFyIGluZGV4Om51bWJlciA9IEdsb2JhbFRpcC5zaG93V29yZExpc3QuaW5kZXhPZiggaXRlbSApO1xuICAgICAgICAgICAgaWYoIGluZGV4ICE9IC0xIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0LnNwbGljZSggaW5kZXgsMSApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5DbGVhckxheWVyQnlOYW1lKExheU9VVC5USVAgKTtcbiAgICAgICAgICAgIEdsb2JhbFRpcC53b3JkTGlzdC5wdXNoKCBpdGVtICk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiIsImV4cG9ydCAgY2xhc3MgTEV2ZW50IGV4dGVuZHMgTGF5YS5FdmVudFxue1xuICAgIHB1YmxpYyBDTEFTU19OQU1FOnN0cmluZyA9IFwiTEV2ZW50XCI7XG4gICAgcHJpdmF0ZSBfb2JqOmFueTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTpzdHJpbmcsIG9iajphbnkgPSBudWxsLCBidWJibGVzOmJvb2xlYW4gPSBmYWxzZSwgY2FuY2VsYWJsZTpib29sZWFuID0gZmFsc2Upe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZihvYmope1xuICAgICAgICAgICAgdGhpcy5fb2JqID0gb2JqO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsb25lKG9iaj86T2JqZWN0KTpMRXZlbnR7XG4gICAgICAgIHJldHVybiBuZXcgTEV2ZW50KHRoaXMudHlwZSwgb2JqP29iajp0aGlzLl9vYmopO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOnZvaWR7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuQ0xBU1NfTkFNRSwgXCJ0eXBlXCIsIFwiYnViYmxlc1wiLCBcImNhbmNlbGFibGVcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Lyg5Y+C6I635Y+WXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcmFtKCk6YW55e1xuICAgICAgICByZXR1cm4gdGhpcy5fb2JqO1xuICAgIH1cblxufSIsIlxuZXhwb3J0IGNsYXNzIExheU9VVCB7XG4gICAgLyoqXG4gICAgICog6IOM5pmv5bGCXG4gICAgICovXG4gICAgc3RhdGljICBCRzogc3RyaW5nID0gXCJCR1wiO1xuICAgIC8qKlxuICAgICAqIHVp5bGCXG4gICAgICovXG4gICAgc3RhdGljICBVSTogc3RyaW5nID0gXCJVSVwiO1xuXG4gICAgLyoqXG4gICAgICogdWnlsYLkuIrlsYJcbiAgICAgKi9cbiAgICBzdGF0aWMgIFVJVG9wOiBzdHJpbmcgPSBcIlVJVG9wXCI7XG4gICAgLyoqXG4gICAgICogdGlwc+WxglxuICAgICAqL1xuICAgIHN0YXRpYyAgVElQOiBzdHJpbmcgPSBcIlRJUFwiO1xuXG4gICAgLyoqXG4gICAgICog5paw5omL5byV5a+85bGCXG4gICAgICovXG4gICAgc3RhdGljICBHVUlERTpzdHJpbmcgPSBcIkdVSURFXCI7XG5cbn1cbiIsIi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0ICBjbGFzcyBTaW5nbGV0b24gZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxue1xuICAgIHByaXZhdGUgc3RhdGljIF9kaWN0OmFueSA9IHt9O1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgIC8qKlxuICAgICAqIOiOt+WPluWNleS+i+exu++8jOiLpeS4jeWtmOWcqOWImei/lOWbnuepulxuICAgICAqIEBwYXJhbVx0cmVmIOe7p+aJv+iHqlNpbmdsZXRvbueahOexu1xuICAgICAqIEByZXR1cm5cdCpcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIEluc3RhbmNlKHJlZjphbnkpOmFueVxuICAgIHtcbiAgICAgICAgaWYoIHJlZi5rZXkgPT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdldGluc3RhbmNlIGVycm9cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpY3RbcmVmLmtleV07XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIOiOt+WPluWNleS+i+exu++8jOiLpeS4jeWtmOWcqOWImeWIm+W7ulxuICAgICAqIEBwYXJhbVx0cmVmXHRcdOe7p+aJv+iHqlNpbmdsZXRvbueahOexu1xuICAgICAqIEByZXR1cm5cdCpcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlT3JDcmVhdGUocmVmOmFueSk6YW55XG4gICAge1xuICAgICAgICBpZiggcmVmLmtleSA9PSBudWxsIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2V0SW5zdGFuY2VPckNyZWF0ZSBlcnJvXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3JlYXRlKHJlZik7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaWN0W3JlZi5rZXldO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICog5Yib5bu65Y2V5L6L57G7XG4gICAqIEBwYXJhbVx0cmVmXHRcdOe7p+aJv+iHqlNpbmdsZXRvbueahOexu1xuICAgKiBAcmV0dXJuXHR2b2lkXG4gICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKHJlZjphbnkpOmFueVxuICAgIHtcbiAgICAgICAgaWYoIHJlZi5rZXkgPT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNyZWF0ZSBlcnJvXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuX2RpY3RbcmVmLmtleV0gPT0gbnVsbCkgXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2RpY3RbcmVmLmtleV0gPSBuZXcgcmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpY3RbcmVmLmtleV07XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAgICAgKiDliKDpmaTljZXkvovnsbtcbiAgICAgICAgICogQHBhcmFtXHRyZWZcdFx057un5om/6IeqU2luZ2xldG9u55qE57G7XG4gICAgICAgICAqIEByZXR1cm5cdHZvaWRcbiAgICAgICAgICovXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmUocmVmOmFueSk6dm9pZFxuXHR7XG4gICAgICAgIHZhciBrZXk6c3RyaW5nID0gcmVmLmtleTtcbiAgICAgICAgaWYodGhpcy5fZGljdFtrZXldICE9IG51bGwpIFxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9kaWN0W2tleV0uZGVzdG9yeSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICog6ZSA5q+B5pa55rOVXG4gICAgKi9cbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcbiAgICB7XG4gICAgICAgIFxuICAgIH1cbn0iLCJpbXBvcnQge1BhbmVsQ2hpbGRDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbENoaWxkQ29udHJvbFwiO1xuaW1wb3J0IHtTa2luRGF0YX0gZnJvbSBcIi4uL0RhdGEvU2tpbkRhdGFcIjtcbmltcG9ydCB7QWdlbmN5U2tpbn0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lTa2luXCI7XG5pbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcbmltcG9ydCB7cGluZ3RhaXV0aWxzfSBmcm9tIFwiLi4vV1hTREsvcGluZ3RhaXV0aWxzXCI7XG5pbXBvcnQgTW92aWVDbGlwID0gTGF5YS5Nb3ZpZUNsaXA7XG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL1dYU0RLL3R0YWRcIjtcbmV4cG9ydCBjbGFzcyBTa2luSXRlbSBleHRlbmRzIGZhaXJ5Z3VpLkdCdXR0b24gXG57XG4gICAgbG9hZF9pY29uOmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgY19zdGF0ZTpmYWlyeWd1aS5Db250cm9sbGVyO1xuICAgIHR4dF9uZWVkOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgcGlmdXZvOlNraW5EYXRhO1xuICAgIGJ0bl8wOmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgcHJpdmF0ZSBhZ2VuY3lza2luOkFnZW5jeVNraW47XG4gICAgY29uc3RydWN0b3IoKSBcbiAgICB7IFxuICAgICAgICBzdXBlcigpOyBcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgYmdDb2xvckNoYW5uZWxzOiBhbnkgPSB7IHI6IDk5LCBnOiAwLCBiOiAweEZGIH07XG4gICAgcHJpdmF0ZSBnZXRIZXhDb2xvclN0cmluZygpOiBzdHJpbmcge1xuICAgICAgICB0aGlzLmJnQ29sb3JDaGFubmVscy5yID0gTWF0aC5mbG9vcih0aGlzLmJnQ29sb3JDaGFubmVscy5yKTtcbiAgICAgICAgLy8g57u/6Imy6YCa6YGT5L2/55SoMFxuICAgICAgICB0aGlzLmJnQ29sb3JDaGFubmVscy5nID0gMDtcbiAgICAgICAgLy9vYmouZyA9IE1hdGguZmxvb3Iob2JqLmcpO1xuICAgICAgICB0aGlzLmJnQ29sb3JDaGFubmVscy5iID0gTWF0aC5mbG9vcih0aGlzLmJnQ29sb3JDaGFubmVscy5iKTtcblxuICAgICAgICB2YXIgcjogU3RyaW5nID0gdGhpcy5iZ0NvbG9yQ2hhbm5lbHMuci50b1N0cmluZygxNik7XG4gICAgICAgIHIgPSByLmxlbmd0aCA9PSAyID8gciA6IFwiMFwiICsgcjtcbiAgICAgICAgdmFyIGc6IFN0cmluZyA9IHRoaXMuYmdDb2xvckNoYW5uZWxzLmcudG9TdHJpbmcoMTYpO1xuICAgICAgICBnID0gZy5sZW5ndGggPT0gMiA/IGcgOiBcIjBcIiArIGc7XG4gICAgICAgIHZhciBiOiBTdHJpbmcgPSB0aGlzLmJnQ29sb3JDaGFubmVscy5iLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgYiA9IGIubGVuZ3RoID09IDIgPyBiIDogXCIwXCIgKyBiO1xuICAgICAgICByZXR1cm4gXCIjXCIgKyByICsgZyArIGI7XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0RnJvbVhNTCh4bWw6IGFueSk6IHZvaWQge1xuICAgICAgICBzdXBlci5jb25zdHJ1Y3RGcm9tWE1MKHhtbCk7XG4gICAgICAgIGZvciAodmFyIHN0ciBpbiB0aGlzLl9jaGlsZHJlbikge1xuICAgICAgICAgICAgdmFyIGl0ZW06IGZhaXJ5Z3VpLkdPYmplY3QgPSB0aGlzLl9jaGlsZHJlbltzdHJdO1xuICAgICAgICAgICAgdGhpc1tpdGVtLm5hbWVdID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uSW5pdCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0VmlldygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuYWdlbmN5c2tpbiA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5U2tpbiApO1xuICAgICAgICB0aGlzLmNfc3RhdGUgPSB0aGlzLmdldENvbnRyb2xsZXIoIFwiY19zdGF0ZVwiICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RXZlbnQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLm9uKCBMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5idG5jbGljayApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYnRuY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5waWZ1dm8gKVxuICAgICAgICB7XG4gICAgICAgICAgICBzd2l0Y2goIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4IClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOiAvL+aLpeaciVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFnZW5jeXNraW4uR2FpblBpZnUoIHRoaXMucGlmdXZvICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOi8v5rS75Yqo6I635Y+WXG4gICAgICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoXCLmmoLmnKrlvIDmlL5cIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOi8v55yL6KeG6aKR6I635Y+WXG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5dmlkZW9jYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAvLyBwaW5ndGFpdXRpbHMuSW5zdGFuY2UucGxheVZpZGVvKCBcIlwiLHRoaXMsdGhpcy5wbGF5dmlkZW9jYWxsYmFjayApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDovL+mHkeW4gei0reS5sFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFnZW5jeXNraW4uR2FpblBpZnUoIHRoaXMucGlmdXZvICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgU1dGUGF0aDogc3RyaW5nID0gXCJyZXMvc3dmL2RyYWdvbi5zd2ZcIjtcblxuXHRcdHByaXZhdGUgTUNXaWR0aDogbnVtYmVyID0gMzE4O1xuXHRcdHByaXZhdGUgTUNIZWlnaHQ6IG51bWJlciA9IDQwNjtcbiAgICBwcml2YXRlIGNyZWF0ZU1vdmllQ2xpcCgpOiB2b2lkIHtcbiAgICAgICAgdmFyIG1jOiBNb3ZpZUNsaXAgPSBuZXcgTW92aWVDbGlwKCk7XG4gICAgICAgIG1jLmxvYWQodGhpcy5TV0ZQYXRoKTtcblxuICAgICAgICBtYy54ID0gKExheWEuc3RhZ2Uud2lkdGggLSB0aGlzLk1DV2lkdGgpIC8gMjtcbiAgICAgICAgbWMueSA9IChMYXlhLnN0YWdlLmhlaWdodCAtIHRoaXMuTUNIZWlnaHQpIC8gMjtcblxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKG1jKTtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuICAgIHByaXZhdGUgcGxheXZpZGVvY2FsbGJhY2soKTp2b2lkXG4gICAge1xuICAgICAgICB0dGFkLlNob3dWaWRlbygoaXNMb2FkPT57XG4gICAgICAgICAgICBpZihpc0xvYWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuYWdlbmN5c2tpbi5HYWluUGlmdSggdGhpcy5waWZ1dm8gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpIFxuICAgIH1cblxuICAgIHB1YmxpYyBzaG93RGF0YSggdm86U2tpbkRhdGEgKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLnBpZnV2byA9IHZvO1xuICAgICAgICBpZiggdGhpcy5waWZ1dm8gKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmxvYWRfaWNvbi5pY29uID0gQXNzZXRQYXRoLmdldHJvbGVpY29uKCB0aGlzLnBpZnV2by5yb2xlQ0ZHLmljb24gKTtcbiAgICAgICAgICAgIGlmKCB0aGlzLmFnZW5jeXNraW4uUm9sZURhdGEuQ2hhcmFjdGVySUQgPT0gdGhpcy5waWZ1dm8ucm9sZUNGRy5pZCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5waWZ1dm8uc3RhdGUgPT0gMSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5waWZ1dm8ucm9sZUNGRy5nZXRTdGF0ZSApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR4dF9uZWVkLnRleHQgPSB0aGlzLnBpZnV2by5oYXNudW0gKyBcIi9cIiArIHRoaXMucGlmdXZvLnJvbGVDRkcubmVlZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHh0X25lZWQudGV4dCA9IHRoaXMucGlmdXZvLnJvbGVDRkcubmVlZC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIHByZUZpeE51bWJlcihudW06bnVtYmVyLCBzdHJMZW46bnVtYmVyKTpzdHJpbmdcbiAgICB7XG4gICAgICAgIHJldHVybiAoXCIwMDAwMDAwMDAwXCIgKyBudW0pLnNsaWNlKC1zdHJMZW4pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXZhbEJnQ29sb3IoKTogdm9pZCB7XG4gICAgICAgIHZhciBjb2xvcjogbnVtYmVyID0gTWF0aC5yYW5kb20oKSAqIDB4RkZGRkZGO1xuICAgICAgICB2YXIgY2hhbm5lbHM6IEFycmF5PG51bWJlcj4gPSB0aGlzLmdldENvbG9yQ2hhbm5hbHMoY29sb3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q29sb3JDaGFubmFscyhjb2xvcjogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICAgIHZhciByZXN1bHQ6IEFycmF5PG51bWJlcj4gPSBbXTtcbiAgICAgICAgcmVzdWx0LnB1c2goY29sb3IgPj4gMTYpO1xuICAgICAgICByZXN1bHQucHVzaChjb2xvciA+PiA4ICYgMHhGRik7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNvbG9yICYgMHhGRik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLm9mZiggTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuYnRuY2xpY2sgKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBcbn0iLCIvKipcbiAqIOe7p+aJv2Jhc2VWaWV355WM6Z2i55qE5omT5byA5YWz6Zet5Yqo5pWI57G75Z6LXG4gKi9cbmV4cG9ydCBjbGFzcyBWaWV3QWN0aW9uIFxueyAgIFxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgX3RleHQ6TGF5YS5UZXh0ID0gbnVsbDtcbiAgICBcdC8qKlxuXHQgKiDliqjnlLvnirbmgIHlvIDlp4vml7bmiafooYzjgIJcblx0ICovXG5cdHB1YmxpYyBvblN0YXRlRW50ZXIoKTp2b2lkIHtcblx0XHRjb25zb2xlLmxvZyhcIuWKqOeUu+W8gOWni+aSreaUvuS6hlwiKTtcblx0XHR0aGlzLl90ZXh0LnRleHQgPSBcIuWKqOeUu+eKtuaAge+8muWKqOeUu+W8gOWni+aSreaUvlwiO1xuXHR9XG5cdFx0XG5cdC8qKlxuXHQgKiDliqjnlLvnirbmgIHmm7TmlrDml7bmiafooYzjgIJcblx0ICovXG5cdHB1YmxpYyBvblN0YXRlVXBkYXRlKCk6dm9pZCB7XG5cdFx0Y29uc29sZS5sb2coXCLliqjnlLvnirbmgIHmm7TmlrDkuoZcIik7XG5cdFx0dGhpcy5fdGV4dC50ZXh0ID0gXCLliqjnlLvnirbmgIHvvJrliqjnlLvmm7TmlrDkuK1cIjtcblx0fVxuXHRcdFxuXHQvKipcblx0ICog5Yqo55S754q25oCB6YCA5Ye65pe25omn6KGM44CCXG5cdCAqL1xuXHRwdWJsaWMgb25TdGF0ZUV4aXQoKTp2b2lkIHtcblx0XHRjb25zb2xlLmxvZyhcIuWKqOeUu+mAgOWHuuS6hlwiKTtcblx0XHR0aGlzLl90ZXh0LnRleHQgPSBcIuWKqOeUu+eKtuaAge+8muWKqOeUu+W8gOWni+mAgOWHulwiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDku47lsI/lj5jlpKdcbiAgICAgKi9cbiAgICBzdGF0aWMgQWN0aW9uVHlwZV9hZGRzY2FsZU1pblRvTWF4OnN0cmluZyA9IFwiQWN0aW9uVHlwZV9hZGRzY2FsZU1pblRvTWF4XCI7XG5cbiAgICAvKipcbiAgICAgKiDku47lpKflj5jlsI/np7vlh7pcbiAgICAgKi9cbiAgICBzdGF0aWMgQWN0aW9uVHlwZV9yZW1vdmVzY2FsZU1heFRvTWluOnN0cmluZyA9IFwiQWN0aW9uVHlwZV9yZW1vdmVzY2FsZU1heFRvTWluXCI7XG5cbiAgICAvKipcbiAgICAgKiDmsqHmnInliqjmlYhcbiAgICAgKi9cbiAgICBzdGF0aWMgQWN0aW9uVHlwZV9ub25lOnN0cmluZyA9IFwiQWN0aW9uVHlwZV9ub25lXCI7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgc2NlbmU6TGF5YS5TY2VuZTNEO1xuICAgIHByaXZhdGUgbWF0MTpMYXlhLkJsaW5uUGhvbmdNYXRlcmlhbDsgXG4gICAgcHJpdmF0ZSBtZXNoMTpMYXlhLk1lc2g7XG4gICAgcHJpdmF0ZSBtZXNoMjpMYXlhLk1lc2g7XG4gICAgcHVibGljIGFkZEJveCgpOnZvaWRcbiAgICB7XG4gICAgICAgIGZvciAobGV0IGk6bnVtYmVyID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hZGRWZXJ0aWNhbEJveCgtMC42NSwgMC4xNjUgKyBpICogMC4zMyAqIDIsIDApO1xuICAgICAgICAgICAgdGhpcy5hZGRWZXJ0aWNhbEJveCgwLCAwLjE2NSArIGkgKiAwLjMzICogMiwgMCk7XG4gICAgICAgICAgICB0aGlzLmFkZFZlcnRpY2FsQm94KDAuNjUsIDAuMTY1ICsgaSAqIDAuMzMgKiAyLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYWRkVmVydGljYWxCb3goeDpudW1iZXIsIHk6bnVtYmVyLCB6Om51bWJlcik6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGJveDpMYXlhLk1lc2hTcHJpdGUzRCA9IHRoaXMuc2NlbmUuYWRkQ2hpbGQobmV3IExheWEuTWVzaFNwcml0ZTNEKHRoaXMubWVzaDEpKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcbiAgICAgICAgYm94Lm1lc2hSZW5kZXJlci5tYXRlcmlhbCA9IHRoaXMubWF0MTtcbiAgICAgICAgYm94Lm1lc2hSZW5kZXJlci5jYXN0U2hhZG93ID0gdHJ1ZTtcbiAgICAgICAgYm94Lm1lc2hSZW5kZXJlci5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcbiAgICAgICAgYm94LnRyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoeCwgeSwgeik7XG4gICAgICAgIFxuICAgICAgICB2YXIgcmlnaWRCb2R5OkxheWEuUmlnaWRib2R5M0QgPSBib3guYWRkQ29tcG9uZW50KExheWEuUmlnaWRib2R5M0QpIGFzIExheWEuUmlnaWRib2R5M0Q7XG4gICAgICAgIHJpZ2lkQm9keS5tYXNzID0gMTA7XG4gICAgICAgIHJpZ2lkQm9keS5mcmljdGlvbiA9IDAuNDtcbiAgICAgICAgcmlnaWRCb2R5LnJlc3RpdHV0aW9uID0gMC4yO1xuICAgICAgICB2YXIgYm94U2hhcGU6TGF5YS5Cb3hDb2xsaWRlclNoYXBlID0gbmV3IExheWEuQm94Q29sbGlkZXJTaGFwZSgwLjUsIDAuMzMsIDIpO1xuICAgICAgICByaWdpZEJvZHkuY29sbGlkZXJTaGFwZSA9IGJveFNoYXBlO1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cblxuICAgIC8qKlxuICAgICAqIOS7juWPs+i+ueenu+WKqOWIsOS4reWkrlxuICAgICAqL1xuICAgIHN0YXRpYyBBY3Rpb25UeXBlX2FkZG1vdmVUb01pZGRsZTpzdHJpbmc9XCJBY3Rpb25UeXBlX2FkZG1vdmVUb01pZGRsZVwiO1xuICAgIC8qKlxuICAgICAqIOS7juacgOWPs+i+ueenu+WHulxuICAgICAqL1xuICAgIHN0YXRpYyBBY3Rpb25UeXBlX3JlbW92ZW1vdmVUb1JpZ2h0OnN0cmluZyA9IFwiQWN0aW9uVHlwZV9yZW1vdmVtb3ZlVG9SaWdodFwiO1xuXG4gICAgLyoqXG4gICAgICog5LuO5bqV6YOo5ZCR5LiK56e75YqoXG4gICAgICovXG4gICAgc3RhdGljIEFjdGlvblR5cGVfYWRkbW92ZUZyb21Cb3R0b206c3RyaW5nPVwiQWN0aW9uVHlwZV9hZGRtb3ZlRnJvbUJvdHRvbVwiO1xuICAgIC8qKlxuICAgICAqIOS7juS4iuWQkeW6lemDqOenu+WKqFxuICAgICAqL1xuICAgIHN0YXRpYyBBY3Rpb25UeXBlX2FkZG1vdmVGcm9tdXA6c3RyaW5nPVwiQWN0aW9uVHlwZV9hZGRtb3ZlRnJvbXVwXCI7XG5cbiAgICBcblxuICAgIFxufSJdfQ==