bundle.js 1.9 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720
  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 MainPanel_1 = require("../View/MainPanel");
  134. var AgencyInGame = /** @class */ (function (_super) {
  135. __extends(AgencyInGame, _super);
  136. function AgencyInGame() {
  137. return _super.call(this) || this;
  138. }
  139. AgencyInGame.prototype.initSelf = function () {
  140. this.DisOn(GameState_1.GameState.end, this, this.endgameHandler);
  141. this.DisOn(GameState_1.GameState.revive, this, this.RevivegameHandler);
  142. this.DisOn(GameState_1.GameState.lose, this, this.LosegameHandler);
  143. };
  144. /**复活界面 */
  145. AgencyInGame.prototype.RevivegameHandler = function () {
  146. Laya.timer.once(1000, this, this.reviveView);
  147. };
  148. /**失败界面 */
  149. AgencyInGame.prototype.LosegameHandler = function () {
  150. Laya.timer.once(1000, this, this.loseView);
  151. };
  152. AgencyInGame.prototype.reviveView = function () {
  153. RecordManager_1.RecordManager.Instance.RecordStop();
  154. var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
  155. var getGold = 0;
  156. Sdk_1.WxApi.recordAldEvent("打开结算界面(复活)");
  157. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
  158. };
  159. AgencyInGame.prototype.loseView = function () {
  160. RecordManager_1.RecordManager.Instance.RecordStop();
  161. var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
  162. var getGold = 0;
  163. Sdk_1.WxApi.recordAldEvent("打开结算界面(失败)");
  164. this.RecropLevelEnd(false);
  165. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
  166. };
  167. AgencyInGame.prototype.endgameHandler = function () {
  168. RecordManager_1.RecordManager.Instance.RecordStop();
  169. Laya.timer.once(1000, this, this.startEndView);
  170. };
  171. AgencyInGame.prototype.startEndView = function () {
  172. var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
  173. var getGold = 0;
  174. if (GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0) {
  175. getGold = this.RoleData.levelcfg.winGold;
  176. Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏胜利)");
  177. this.RecropLevelEnd(true);
  178. }
  179. else {
  180. var arr = GameUtils_1.GameUtils.cutstrtoArr(this.RoleData.levelcfg.failGod);
  181. getGold = GameUtils_1.GameUtils.randRangeint(Number(arr[0]), Number(arr[1]));
  182. Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏失败)");
  183. this.RecropLevelEnd(false);
  184. }
  185. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
  186. // ViewManager.Instance.add( ChoutiPanView,2 );
  187. };
  188. AgencyInGame.prototype.RecropLevelEnd = function (_win) {
  189. // if(!Laya.Browser.onWeiXin)return;
  190. // var stageid = this.RoleData.LevelID.toString();
  191. // var useid = PlayerAccount.CurrentAccount.CurAccountData.UseId;
  192. // var stagename = "第" + this.RoleData.LevelID + "关";
  193. // if(_win)
  194. // {
  195. // WxApi.levelSuccess(stageid,stagename,stageid);
  196. // }
  197. // else
  198. // {
  199. // var equipid = this.RoleData.CharacterID.toString();
  200. // var carname = this.RoleData.roleCfg.name;
  201. // WxApi.levelFail(stageid,stagename,stageid,"0",carname);
  202. // }
  203. };
  204. AgencyInGame.prototype.returnmainview = function (win) {
  205. if (win && PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
  206. var ran = Math.random();
  207. console.log("误触几率为---", ran);
  208. if (ran <= PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.EndCheat) {
  209. ViewManager_1.ViewManager.Instance.add(GiftView_1.default);
  210. }
  211. GameState_1.GameState.fuhuocishu = 1;
  212. GameState_1.GameState.recordscree = false;
  213. GameState_1.GameState.isdie = false;
  214. PropManager_1.PropManager.Instance.CloseGameOverEffect();
  215. ViewManager_1.ViewManager.Instance.close(CompletePanel_1.CompletePanel);
  216. this.DisTrigger(GameState_1.GameState.returnMainView);
  217. SceneControl_1.SceneControl.Instance.ShowTheGameScene();
  218. var agencytrial = this.getSingleTon(AgencyTrial_1.AgencyTrial);
  219. if (agencytrial.isshiyonging) {
  220. SceneControl_1.SceneControl.Instance.CreatePlayer(this.RoleData.roleCfg);
  221. agencytrial.isshiyonging = false;
  222. }
  223. }
  224. else {
  225. GameState_1.GameState.fuhuocishu = 1;
  226. GameState_1.GameState.recordscree = false;
  227. GameState_1.GameState.isdie = false;
  228. PropManager_1.PropManager.Instance.CloseGameOverEffect();
  229. ViewManager_1.ViewManager.Instance.close(CompletePanel_1.CompletePanel);
  230. this.DisTrigger(GameState_1.GameState.returnMainView);
  231. SceneControl_1.SceneControl.Instance.ShowTheGameScene();
  232. var agencytrial = this.getSingleTon(AgencyTrial_1.AgencyTrial);
  233. if (agencytrial.isshiyonging) {
  234. SceneControl_1.SceneControl.Instance.CreatePlayer(this.RoleData.roleCfg);
  235. agencytrial.isshiyonging = false;
  236. }
  237. }
  238. if (GameState_1.GameState.GameNum % 3 == 0) {
  239. MainPanel_1.MainPanel.instance.skinclick();
  240. }
  241. //打开好友邀请界面
  242. // ViewManager.Instance.add(FriendInviteView);
  243. };
  244. AgencyInGame.prototype.startGame = function () {
  245. AgencyInGame.gamenum++;
  246. var stageid = this.RoleData.getNowServerLevel().toString().toString();
  247. var stagename = "第" + stageid + "关";
  248. var useid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.UseId;
  249. Sdk_1.WxApi.levelStart(stageid, stagename, useid);
  250. GameStateControl_1.GameStateControl.Instance.startGame();
  251. };
  252. AgencyInGame.key = "AgencyInGame";
  253. AgencyInGame.gamenum = 0;
  254. return AgencyInGame;
  255. }(AgencyBaseControl_1.AgencyBaseControl));
  256. exports.AgencyInGame = AgencyInGame;
  257. },{"../Control/GameStateControl":20,"../Control/SceneControl":27,"../PrefabControl/PropManager":47,"../View/CompletePanel":59,"../View/GiftView":61,"../View/MainPanel":65,"../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){
  258. "use strict";
  259. Object.defineProperty(exports, "__esModule", { value: true });
  260. var ViewManager_1 = require("../View/ViewManager");
  261. var LoadingPanel_1 = require("../View/LoadingPanel");
  262. var AgencyUserMessage_1 = require("./AgencyUserMessage");
  263. var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
  264. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  265. var AgencyMain_1 = require("./AgencyMain");
  266. var RoleCFG_1 = require("../CFG/RoleCFG");
  267. var LevelCFG_1 = require("../CFG/LevelCFG");
  268. var BuildCFG_1 = require("../CFG/BuildCFG");
  269. var NpcCFG_1 = require("../CFG/NpcCFG");
  270. var GameCFG_1 = require("../CFG/GameCFG");
  271. var AgencySkin_1 = require("./AgencySkin");
  272. var Sdk_1 = require("../WXSDK/Sdk");
  273. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  274. var NetworkManager_1 = require("../WXSDK/NetworkManager");
  275. var Global_1 = require("../Global");
  276. var LotteryCFG_1 = require("../CFG/LotteryCFG");
  277. var AgencyLottery_1 = require("./AgencyLottery");
  278. var ttad_1 = require("../WXSDK/ttad");
  279. var AgencyLogin = /** @class */ (function (_super) {
  280. __extends(AgencyLogin, _super);
  281. function AgencyLogin() {
  282. return _super.call(this) || this;
  283. }
  284. AgencyLogin.prototype.initSelf = function () {
  285. this.DisOn(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_loginSucceed, this, this.Success);
  286. };
  287. AgencyLogin.prototype.Login = function () {
  288. ViewManager_1.ViewManager.Instance.add(LoadingPanel_1.LoadingPanel);
  289. this.loginprogress(0);
  290. // if(Laya.Browser.onWeiXin)
  291. // {
  292. // this.LoginWX();
  293. // }
  294. // else
  295. // {
  296. this.LoginLocal();
  297. // }
  298. };
  299. AgencyLogin.prototype.LoginWX = function () {
  300. var _this = this;
  301. Sdk_1.WxApi.recordAldEvent("开始微信登录");
  302. Sdk_1.WxApi.WXLogin(function (res) {
  303. if (res != "error") {
  304. Sdk_1.WxApi.recordAldEvent("微信登录成功");
  305. console.log("hplogin:" + "querychannel->" + Sdk_1.WxApi.querychannel + " referrerInfoappId->" + Sdk_1.WxApi.referrerInfoappId);
  306. _this.LoginLocal();
  307. }
  308. else {
  309. Sdk_1.WxApi.recordAldEvent("微信登录失败");
  310. _this.LoginWX();
  311. }
  312. });
  313. };
  314. AgencyLogin.prototype.LoginLocal = function (res) {
  315. if (res === void 0) { res = null; }
  316. Sdk_1.WxApi.recordAldEvent("开始本地登录");
  317. if (res) {
  318. new PlayerAccount_1.PlayerAccount(res.code, "", "", 0, "", "", "", "", Sdk_1.WxApi.shareOpenId, Sdk_1.WxApi.shareOpenId, Global_1.Global.gameVersion);
  319. }
  320. NetworkManager_1.NetworkManager.Instance.login(null, Laya.Handler.create(this, this.LoginComplete), null);
  321. //this.LoadSbp();
  322. };
  323. AgencyLogin.prototype.LoginComplete = function () {
  324. Sdk_1.WxApi.recordAldEvent("本地服务器登录完成...");
  325. // ShareUtil.Instance.onRegister();
  326. // GuangGao.InitVideo();
  327. Sdk_1.WxApi.aldSendOpenid(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid);
  328. this.Success();
  329. };
  330. AgencyLogin.prototype.loginprogress = function (value) {
  331. var loadingPanel = ViewManager_1.ViewManager.Instance.getView(LoadingPanel_1.LoadingPanel);
  332. if (loadingPanel) {
  333. loadingPanel.showWord(value);
  334. }
  335. };
  336. AgencyLogin.prototype.Success = function () {
  337. this.ResolveData();
  338. this.initData();
  339. this.StartMain();
  340. ttad_1.ttad.InitAD();
  341. };
  342. AgencyLogin.prototype.StartMain = function () {
  343. console.log("当前配置表总关卡:", LevelCFG_1.default.vec.length);
  344. this.getSingleTon(AgencyMain_1.AgencyMain).StartMain();
  345. };
  346. /**
  347. * 解析配置数据
  348. */
  349. AgencyLogin.prototype.ResolveData = function () {
  350. var byteData = PlayerAccount_1.PlayerAccount.CurrentAccount.nowConfig.gameConfig[0].config;
  351. if (byteData && byteData != "") {
  352. var arr = byteData.split("%file%");
  353. var i;
  354. var nums = arr.length;
  355. for (i = 0; i < nums; i++) {
  356. var itemarr = arr[i].split("%cfg%");
  357. var cla = AgencyLogin.configClass[itemarr[0]];
  358. if (cla) {
  359. cla.initCfg(itemarr[1]);
  360. }
  361. else {
  362. }
  363. }
  364. return true;
  365. }
  366. return false;
  367. };
  368. /**
  369. * 初始化游戏数据
  370. */
  371. AgencyLogin.prototype.initData = function () {
  372. this.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).init();
  373. this.getSingleTon(AgencySkin_1.AgencySkin).init();
  374. this.getSingleTon(AgencyLottery_1.AgencyLottery).init();
  375. };
  376. AgencyLogin.key = "AgencyLogin";
  377. AgencyLogin.configClass = {
  378. RoleCFG: RoleCFG_1.default,
  379. LevelCFG: LevelCFG_1.default,
  380. BuildCFG: BuildCFG_1.default,
  381. NpcCFG: NpcCFG_1.default,
  382. GameCFG: GameCFG_1.default,
  383. LotteryCFG: LotteryCFG_1.default
  384. };
  385. return AgencyLogin;
  386. }(AgencyBaseControl_1.AgencyBaseControl));
  387. exports.AgencyLogin = AgencyLogin;
  388. },{"../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){
  389. "use strict";
  390. Object.defineProperty(exports, "__esModule", { value: true });
  391. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  392. var ViewManager_1 = require("../View/ViewManager");
  393. var LotteryPanel_1 = require("../View/LotteryPanel");
  394. var LotteryCFG_1 = require("../CFG/LotteryCFG");
  395. var GameUtils_1 = require("../utils/GameUtils");
  396. var GlobalTip_1 = require("../utils/GlobalTip");
  397. var RoleCFG_1 = require("../CFG/RoleCFG");
  398. var AgencySkin_1 = require("./AgencySkin");
  399. var AgencyLottery = /** @class */ (function (_super) {
  400. __extends(AgencyLottery, _super);
  401. function AgencyLottery() {
  402. var _this = _super.call(this) || this;
  403. _this.mStartX = 400;
  404. _this.mStartY = 500;
  405. _this.mActionIndex = 0;
  406. _this.mCurrIndex = 0;
  407. _this.mCurrSkinIndex = 0;
  408. return _this;
  409. }
  410. AgencyLottery.prototype.init = function () {
  411. };
  412. AgencyLottery.prototype.openView = function () {
  413. ViewManager_1.ViewManager.Instance.add(LotteryPanel_1.LotteryPanel);
  414. };
  415. /**************************** */
  416. AgencyLottery.prototype.createAnimation = function () {
  417. var ani = new Laya.Animation();
  418. // ani.loadAtlas(this.AniConfPath); // 加载图集动画
  419. ani.interval = 30; // 设置播放间隔(单位:毫秒)
  420. ani.index = 1; // 当前播放索引
  421. ani.play(); // 播放图集动画
  422. // 获取动画的边界信息
  423. var bounds = ani.getGraphicBounds();
  424. ani.pivot(bounds.width / 2, bounds.height / 2);
  425. ani.pos(Laya.stage.width / 2, Laya.stage.height / 2);
  426. Laya.stage.addChild(ani);
  427. };
  428. /************************* */
  429. AgencyLottery.prototype.getreward = function (cfg) {
  430. if (cfg) {
  431. switch (cfg.type) {
  432. case 1:
  433. this.RoleData.Money += Number(cfg.value);
  434. GlobalTip_1.GlobalTip.Instance.showWordTips("恭喜获得" + cfg.value + "金币!");
  435. break;
  436. case 2:
  437. var rolecfg = RoleCFG_1.default.dict[cfg.value];
  438. this.getSingleTon(AgencySkin_1.AgencySkin).setRoleState(rolecfg, 1);
  439. GlobalTip_1.GlobalTip.Instance.showWordTips("恭喜获得角色" + rolecfg.rolename);
  440. break;
  441. }
  442. }
  443. };
  444. AgencyLottery.prototype.GetReward = function () {
  445. var index = 0;
  446. var dicts = LotteryCFG_1.default.vec;
  447. var maxNum = 0;
  448. var cfg;
  449. var i = 0;
  450. for (i = 0; i < dicts.length; i++) {
  451. cfg = dicts[i];
  452. maxNum += cfg.weight;
  453. }
  454. var sordvalue = GameUtils_1.GameUtils.randRangeint(1, maxNum);
  455. var totalnum = 0;
  456. for (i = 0; i < dicts.length; i++) {
  457. cfg = dicts[i];
  458. totalnum += cfg.weight;
  459. if (totalnum >= sordvalue) {
  460. index = i;
  461. break;
  462. }
  463. }
  464. return index;
  465. };
  466. /************************************************ */
  467. AgencyLottery.prototype.startFun = function () {
  468. this.mAniPath = "res/spine/spineRes1/dragon.sk";
  469. // this.mFactory = new Templet();
  470. // this.mFactory.on(Event.COMPLETE, this, this.parseComplete);
  471. // this.mFactory.on(Event.ERROR, this, this.onError);
  472. // this.mFactory.loadAni(this.mAniPath);
  473. };
  474. AgencyLottery.prototype.onError = function () {
  475. console.log("error");
  476. };
  477. AgencyLottery.prototype.parseComplete = function () {
  478. //创建模式为1,可以启用换装
  479. this.mArmature = this.mFactory.buildArmature(1);
  480. this.mArmature.x = this.mStartX;
  481. this.mArmature.y = this.mStartY;
  482. this.mArmature.scale(0.5, 0.5);
  483. Laya.stage.addChild(this.mArmature);
  484. // this.mArmature.on(Event.STOPPED, this, this.completeHandler);
  485. this.play();
  486. };
  487. AgencyLottery.prototype.completeHandler = function () {
  488. this.play();
  489. };
  490. AgencyLottery.prototype.play = function () {
  491. this.mCurrIndex++;
  492. if (this.mCurrIndex >= this.mArmature.getAnimNum()) {
  493. this.mCurrIndex = 0;
  494. }
  495. this.mArmature.play(this.mCurrIndex, false);
  496. };
  497. AgencyLottery.key = "AgencyLottery";
  498. return AgencyLottery;
  499. }(AgencyBaseControl_1.AgencyBaseControl));
  500. exports.AgencyLottery = AgencyLottery;
  501. },{"../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){
  502. "use strict";
  503. Object.defineProperty(exports, "__esModule", { value: true });
  504. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  505. var ResourceControl_1 = require("../Control/ResourceControl");
  506. var LoadingPanel_1 = require("../View/LoadingPanel");
  507. var ViewManager_1 = require("../View/ViewManager");
  508. var ResDataControl_1 = require("../Control/ResDataControl");
  509. var MainPanel_1 = require("../View/MainPanel");
  510. var SceneControl_1 = require("../Control/SceneControl");
  511. var AssetPath_1 = require("../Config/AssetPath");
  512. var GameStateControl_1 = require("../Control/GameStateControl");
  513. var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
  514. var NpcCFG_1 = require("../CFG/NpcCFG");
  515. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  516. var PropManager_1 = require("../PrefabControl/PropManager");
  517. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  518. var GiftView_1 = require("../View/GiftView");
  519. var AgencyMain = /** @class */ (function (_super) {
  520. __extends(AgencyMain, _super);
  521. function AgencyMain() {
  522. var _this = _super.call(this) || this;
  523. _this._loadjd = 0;
  524. _this._alljd = 0;
  525. return _this;
  526. }
  527. AgencyMain.prototype.initSelf = function () {
  528. };
  529. AgencyMain.prototype.StartMain = function () {
  530. this._loadjd = 0;
  531. this._alljd = 20;
  532. WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage("subpackage", this, this.sub1complete, this.loadprogress, null);
  533. };
  534. AgencyMain.prototype.sub1complete = function () {
  535. this._loadjd = 20;
  536. this._alljd = 30;
  537. WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage("subpackage1", this, this.SubpackageOver, this.loadprogress, null);
  538. };
  539. AgencyMain.prototype.onComplete = function () {
  540. //添加父级猴子
  541. var dude = this.scene.addChild(Laya.Loader.getRes("res/threeDimen/skinModel/dude/dude.lh"));
  542. //缩放
  543. var scale = new Laya.Vector3(0.1, 0.1, 0.1);
  544. dude.transform.localScale = scale;
  545. dude.transform.rotate(new Laya.Vector3(0, 3.14, 0));
  546. };
  547. /*************************************** */
  548. AgencyMain.prototype.SubpackageOver = function () {
  549. this._loadjd = 50;
  550. this._alljd = 40;
  551. var pathArr = [];
  552. var urlArr = [];
  553. urlArr.push(AssetPath_1.AssetPath.get3DModel("startpanel"));
  554. urlArr.push(AssetPath_1.AssetPath.get3DModel("endpanel"));
  555. urlArr.push(AssetPath_1.AssetPath.get3DModel("speedupeffect"));
  556. urlArr.push(AssetPath_1.AssetPath.get3DModel("color_white"));
  557. urlArr.push(AssetPath_1.AssetPath.get3DModel("color_yellow"));
  558. urlArr.push(AssetPath_1.AssetPath.get3DModel("winline"));
  559. urlArr.push(AssetPath_1.AssetPath.get3DModel("fireworks"));
  560. urlArr.push(AssetPath_1.AssetPath.get3DModel("DirectionalLight"));
  561. // urlArr.push( AssetPath.get3DModel( "distantview" ) );
  562. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(this.RoleData.roleCfg.name));
  563. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel("Arrow"));
  564. var arr = this.RoleData.levelmapArr;
  565. var i = 0;
  566. for (i = 0; i < arr.length; i++) {
  567. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DModel(arr[i])) == -1) {
  568. urlArr.push(AssetPath_1.AssetPath.get3DModel(arr[i]));
  569. }
  570. }
  571. var npcArr = this.RoleData.levelcfg.npc;
  572. for (i = 0; i < npcArr.length; i++) {
  573. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) {
  574. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name));
  575. }
  576. }
  577. for (i = 0; i < urlArr.length; i++) {
  578. pathArr.push({ url: urlArr[i] });
  579. }
  580. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.load3Dcomplete, this.loadprogress);
  581. };
  582. AgencyMain.prototype.load3Dcomplete = function () {
  583. this._loadjd = 90;
  584. this._alljd = 10;
  585. ResourceControl_1.ResourceControl.Instance.loadGroup("main", this, this.loadcomplete, this.loadprogress, false);
  586. };
  587. AgencyMain.prototype.loadprogress = function (value) {
  588. var loadingpanel = ViewManager_1.ViewManager.Instance.getView(LoadingPanel_1.LoadingPanel);
  589. if (loadingpanel) {
  590. value = this._loadjd + Math.ceil(value / 100 * this._alljd);
  591. loadingpanel.showWord(value);
  592. }
  593. };
  594. AgencyMain.prototype.loadcomplete = function () {
  595. fairygui.UIConfig.buttonSound = "ui://lecxynh2iz9y26";
  596. GameStateControl_1.GameStateControl.Instance.init();
  597. ResDataControl_1.ResDataControl.Instance.AddViewPackByName("main");
  598. ViewManager_1.ViewManager.Instance.close(LoadingPanel_1.LoadingPanel);
  599. // FYHD_Sdk.InitSdk();
  600. ViewManager_1.ViewManager.Instance.add(MainPanel_1.MainPanel);
  601. console.log("新用户FYHD_Sdk.isnewuser---", FYHD_Sdk_1.FYHD_Sdk.isnewuser);
  602. var newuser = Laya.LocalStorage.getItem("is_newuser");
  603. if (FYHD_Sdk_1.FYHD_Sdk.isnewuser) {
  604. Laya.timer.once(500, this, function () {
  605. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
  606. ViewManager_1.ViewManager.Instance.add(GiftView_1.default);
  607. }
  608. });
  609. }
  610. else {
  611. Laya.LocalStorage.setItem("is_newuser", "1");
  612. }
  613. SceneControl_1.SceneControl.Instance.SetScene();
  614. PropManager_1.PropManager.Instance.InitEffect();
  615. };
  616. AgencyMain.key = "AgencyMain";
  617. return AgencyMain;
  618. }(AgencyBaseControl_1.AgencyBaseControl));
  619. exports.AgencyMain = AgencyMain;
  620. },{"../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){
  621. "use strict";
  622. Object.defineProperty(exports, "__esModule", { value: true });
  623. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  624. var LocalDataControl_1 = require("../Control/LocalDataControl");
  625. var UserDataInfo_1 = require("../Data/UserDataInfo");
  626. var SkinData_1 = require("../Data/SkinData");
  627. var RoleCFG_1 = require("../CFG/RoleCFG");
  628. var ViewManager_1 = require("../View/ViewManager");
  629. var SkinPanel_1 = require("../View/SkinPanel");
  630. var GlobalTip_1 = require("../utils/GlobalTip");
  631. var GameState_1 = require("../utils/GameState");
  632. var AgencySkin = /** @class */ (function (_super) {
  633. __extends(AgencySkin, _super);
  634. function AgencySkin() {
  635. var _this = _super.call(this) || this;
  636. AgencySkin.instance = _this;
  637. return _this;
  638. }
  639. AgencySkin.prototype.initSelf = function () {
  640. };
  641. AgencySkin.prototype.init = function () {
  642. this.localdata = LocalDataControl_1.LocalDataControl.Instance.GetLocalCaCheData(UserDataInfo_1.UserDataInfo.skin);
  643. var pifuData;
  644. if (!this.localdata.hasOwnProperty("pifu")) {
  645. this.localdata["pifu"] = {};
  646. }
  647. pifuData = this.localdata["pifu"];
  648. this.pifuArr = [];
  649. this.pifuDict = {};
  650. var i = 0;
  651. var nums = RoleCFG_1.default.vec.length;
  652. for (i = 0; i < nums; i++) {
  653. var pifuvo = new SkinData_1.SkinData;
  654. var cfg = RoleCFG_1.default.vec[i];
  655. pifuvo.roleCFG = cfg;
  656. var d = pifuData[cfg.id];
  657. if (d) {
  658. pifuvo.state = Number(d.state);
  659. pifuvo.hasnum = Number(d.hasnum);
  660. }
  661. else {
  662. pifuvo.state = 0;
  663. pifuvo.hasnum = 0;
  664. }
  665. if (cfg.getState == 0) {
  666. pifuvo.state = 1;
  667. }
  668. this.pifuArr.push(pifuvo);
  669. this.pifuDict[pifuvo.roleCFG.id] = pifuvo;
  670. }
  671. };
  672. AgencySkin.prototype.openview = function () {
  673. ViewManager_1.ViewManager.Instance.add(SkinPanel_1.SkinPanel);
  674. };
  675. AgencySkin.prototype.setRoleState = function (cfg, value) {
  676. var pifuvo = this.pifuDict[cfg.id];
  677. if (pifuvo) {
  678. pifuvo.state = 1;
  679. this.AddLocalSkinData(pifuvo.roleCFG.id, pifuvo.state, pifuvo.hasnum);
  680. }
  681. };
  682. AgencySkin.prototype.AddLocalSkinData = function (id, state, hasnum) {
  683. this.localdata["pifu"][id] = {};
  684. this.localdata["pifu"][id]["state"] = state;
  685. this.localdata["pifu"][id]["hasnum"] = hasnum;
  686. LocalDataControl_1.LocalDataControl.Instance.AddData(UserDataInfo_1.UserDataInfo.skin, this.localdata);
  687. };
  688. AgencySkin.prototype.createCantralRect = function () {
  689. this.rect = new Laya.Sprite();
  690. this.rect.graphics.drawRect(-100, -100, 200, 200, "gray");
  691. Laya.stage.addChild(this.rect);
  692. this.updateRectPos();
  693. };
  694. AgencySkin.prototype.updateRectPos = function () {
  695. this.rect.x = Laya.stage.width / 2;
  696. this.rect.y = Laya.stage.height / 2;
  697. };
  698. /****************************************** */
  699. AgencySkin.prototype.GainPifu = function (_skinitem) {
  700. if (_skinitem.state == 1) {
  701. this.RoleData.CharacterID = _skinitem.roleCFG.id;
  702. this.DisTrigger(GameState_1.GameState.updateSKinView);
  703. }
  704. else {
  705. switch (_skinitem.roleCFG.getState) {
  706. case 1: //视频获取
  707. _skinitem.hasnum++;
  708. if (_skinitem.roleCFG.need <= _skinitem.hasnum) {
  709. _skinitem.state = 1;
  710. }
  711. this.AddLocalSkinData(_skinitem.roleCFG.id, _skinitem.state, _skinitem.hasnum);
  712. this.DisTrigger(GameState_1.GameState.updateSKinView);
  713. break;
  714. case 2: //金币购买
  715. if (this.RoleData.Money >= _skinitem.roleCFG.need) {
  716. this.RoleData.Money -= _skinitem.roleCFG.need;
  717. _skinitem.state = 1;
  718. this.AddLocalSkinData(_skinitem.roleCFG.id, _skinitem.state, _skinitem.hasnum);
  719. this.DisTrigger(GameState_1.GameState.updateSKinView);
  720. GlobalTip_1.GlobalTip.Instance.showWordTips("购买成功");
  721. }
  722. else {
  723. GlobalTip_1.GlobalTip.Instance.showWordTips("金币不足");
  724. }
  725. break;
  726. case 3: //活动获取
  727. break;
  728. }
  729. }
  730. };
  731. AgencySkin.prototype.GainNoHaveSkin = function () {
  732. var arr = [];
  733. for (var s in this.pifuDict) {
  734. if (this.pifuDict[s].state == 0) {
  735. arr.push(this.pifuDict[s]);
  736. }
  737. }
  738. return arr;
  739. };
  740. AgencySkin.key = "AgencySkin";
  741. return AgencySkin;
  742. }(AgencyBaseControl_1.AgencyBaseControl));
  743. exports.AgencySkin = AgencySkin;
  744. },{"../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){
  745. "use strict";
  746. Object.defineProperty(exports, "__esModule", { value: true });
  747. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  748. var ViewManager_1 = require("../View/ViewManager");
  749. var TrialPanel_1 = require("../View/TrialPanel");
  750. var GameStateControl_1 = require("../Control/GameStateControl");
  751. var AssetPath_1 = require("../Config/AssetPath");
  752. var ResourceControl_1 = require("../Control/ResourceControl");
  753. var SceneControl_1 = require("../Control/SceneControl");
  754. var AgencyInGame_1 = require("./AgencyInGame");
  755. var EggPanel_1 = require("../View/EggPanel");
  756. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  757. var AgencyTrial = /** @class */ (function (_super) {
  758. __extends(AgencyTrial, _super);
  759. function AgencyTrial() {
  760. var _this = _super.call(this) || this;
  761. _this.isshiyonging = false;
  762. return _this;
  763. }
  764. AgencyTrial.prototype.openview = function (arr) {
  765. ViewManager_1.ViewManager.Instance.add(TrialPanel_1.TrialPanel, arr);
  766. };
  767. /**退出界面 */
  768. AgencyTrial.prototype.ExitPanel = function (_data) {
  769. this.isshiyonging = _data ? true : false;
  770. this._selectvo = _data;
  771. if (_data) {
  772. var urlArr = [];
  773. urlArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(_data.roleCFG.name) });
  774. ResourceControl_1.ResourceControl.Instance.loader3DArr(urlArr, this, this.SceneCreateComplete, null, true);
  775. }
  776. else {
  777. // if(AgencyInGame.gamenum>1){
  778. var random = Math.random();
  779. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser && random <= PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.HitEgg) {
  780. ViewManager_1.ViewManager.Instance.add(EggPanel_1.default);
  781. }
  782. else {
  783. GameStateControl_1.GameStateControl.Instance.entergame();
  784. }
  785. // }
  786. // else{
  787. // GameStateControl.Instance.entergame();
  788. // }
  789. }
  790. ViewManager_1.ViewManager.Instance.close(TrialPanel_1.TrialPanel);
  791. };
  792. /************************************************ */
  793. AgencyTrial.prototype.createSprite = function () {
  794. this.sprit = new Laya.Sprite();
  795. this.sprit.graphics.drawRect(0, 0, 200, 200, "#D2691E");
  796. this.sprit.pivot(100, 100);
  797. this.sprit.x = Laya.stage.width / 2;
  798. this.sprit.y = Laya.stage.height / 2;
  799. this.sprit.size(200, 200);
  800. Laya.stage.addChild(this.sprit);
  801. // this.sp.on(Interaction_CustomEvent.ROTATE, this, this.onRotate); // 侦听自定义的事件
  802. // this.sprit.on(Event.CLICK, this, this.onSpriteClick);
  803. };
  804. AgencyTrial.prototype.onSpriteClick = function (e) {
  805. var randomAngle = Math.random() * 180;
  806. //发送自定义事件
  807. // this.sprit.event(Interaction_CustomEvent.ROTATE, [randomAngle]);
  808. };
  809. // 触发自定义的rotate事件
  810. AgencyTrial.prototype.onRotate = function (newAngle) {
  811. // Tween.to(this.sp, { "rotation": newAngle }, 1000, Ease.elasticOut);
  812. };
  813. /******************************* */
  814. AgencyTrial.prototype.SceneCreateComplete = function () {
  815. SceneControl_1.SceneControl.Instance.CreatePlayer(this._selectvo.roleCFG);
  816. if (AgencyInGame_1.AgencyInGame.gamenum > 1) {
  817. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
  818. ViewManager_1.ViewManager.Instance.add(EggPanel_1.default);
  819. }
  820. else {
  821. GameStateControl_1.GameStateControl.Instance.entergame();
  822. }
  823. }
  824. else {
  825. GameStateControl_1.GameStateControl.Instance.entergame();
  826. }
  827. };
  828. /******************************* */
  829. AgencyTrial.prototype.createText = function () {
  830. var txt = new Laya.Text();
  831. //给文本的text属性赋值
  832. txt.text = "Layabox是性能最强的HTML5引擎技术提供商与优秀的游戏发行商,面向Flash开发者提供HTML5开发技术方案!";
  833. //设置宽度,高度自动匹配
  834. txt.width = 400;
  835. //自动换行
  836. txt.wordWrap = true;
  837. txt.align = "center";
  838. txt.fontSize = 40;
  839. txt.font = "Microsoft YaHei";
  840. txt.color = "#ff0000";
  841. txt.bold = true;
  842. txt.leading = 5;
  843. //设置描边属性
  844. txt.stroke = 2;
  845. txt.strokeColor = "#ffffff";
  846. txt.borderColor = "#00ff00";
  847. txt.x = (Laya.stage.width - txt.textWidth) / 2;
  848. txt.y = (Laya.stage.height - txt.textHeight) / 2;
  849. Laya.stage.addChild(txt);
  850. };
  851. /************************** */
  852. AgencyTrial.prototype.createInput = function () {
  853. var inputText = new Laya.Input();
  854. // 移动端输入提示符
  855. inputText.prompt = "Type some word...";
  856. //多行输入
  857. inputText.multiline = true;
  858. inputText.wordWrap = true;
  859. inputText.size(350, 100);
  860. inputText.x = Laya.stage.width - inputText.width >> 1;
  861. inputText.y = Laya.stage.height - inputText.height >> 1;
  862. inputText.padding = [2, 2, 2, 2];
  863. inputText.bgColor = "#666666";
  864. inputText.color = "#ffffff";
  865. inputText.fontSize = 20;
  866. Laya.stage.addChild(inputText);
  867. };
  868. AgencyTrial.key = "AgencyTrial";
  869. return AgencyTrial;
  870. }(AgencyBaseControl_1.AgencyBaseControl));
  871. exports.AgencyTrial = AgencyTrial;
  872. },{"../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){
  873. "use strict";
  874. Object.defineProperty(exports, "__esModule", { value: true });
  875. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  876. var AgencyUserMessage = /** @class */ (function (_super) {
  877. __extends(AgencyUserMessage, _super);
  878. function AgencyUserMessage() {
  879. var _this = _super.call(this) || this;
  880. _this.roleisinit = false;
  881. return _this;
  882. }
  883. AgencyUserMessage.prototype.initSelf = function () {
  884. };
  885. /**加金币 */
  886. AgencyUserMessage.prototype.GoldUp = function (_num) {
  887. this.RoleData.Money += _num;
  888. };
  889. /**************************** */
  890. AgencyUserMessage.prototype.createInput = function () {
  891. var inputText = new Laya.Input();
  892. inputText.size(350, 100);
  893. inputText.x = Laya.stage.width - inputText.width >> 1;
  894. inputText.y = Laya.stage.height - inputText.height >> 1;
  895. inputText.text = "这段文本不可编辑,但可复制";
  896. inputText.editable = false;
  897. // 设置字体样式
  898. inputText.bold = true;
  899. inputText.bgColor = "#666666";
  900. inputText.color = "#ffffff";
  901. inputText.fontSize = 20;
  902. Laya.stage.addChild(inputText);
  903. };
  904. /******************************** */
  905. AgencyUserMessage.prototype.init = function () {
  906. this.RoleData.init();
  907. this.roleisinit = true;
  908. };
  909. /************************ */
  910. AgencyUserMessage.prototype.createText = function () {
  911. var txt = new Laya.Text();
  912. txt.text =
  913. "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!\n" +
  914. "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!\n" +
  915. "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!";
  916. txt.borderColor = "#FFFF00";
  917. txt.size(300, 50);
  918. txt.fontSize = 20;
  919. txt.color = "#ffffff";
  920. Laya.stage.addChild(txt);
  921. return txt;
  922. };
  923. /**************************** */
  924. /**升级 */
  925. AgencyUserMessage.prototype.LevelUp = function () {
  926. this.RoleData.LevelUp();
  927. };
  928. AgencyUserMessage.key = "AgencyUserMessage";
  929. return AgencyUserMessage;
  930. }(AgencyBaseControl_1.AgencyBaseControl));
  931. exports.AgencyUserMessage = AgencyUserMessage;
  932. },{"./AgencyBaseControl":1}],9:[function(require,module,exports){
  933. "use strict";
  934. Object.defineProperty(exports, "__esModule", { value: true });
  935. //------------------------------------------------------------------------------
  936. //工具生成,请勿修改。
  937. //配置文件名称:build.xlsx。
  938. //------------------------------------------------------------------------------
  939. var BuildCFG = /** @class */ (function () {
  940. function BuildCFG() {
  941. }
  942. BuildCFG.initCfg = function (str) {
  943. var i = 0;
  944. var arr = str.split("\n");
  945. var i = 0;
  946. for (i = 0; i < arr.length; i++) {
  947. var singleStr = arr[i];
  948. var singleArr = singleStr.split("&");
  949. if (BuildCFG.dict[singleArr[0]])
  950. continue;
  951. var item = new BuildCFG();
  952. item.name = singleArr[0];
  953. item.buffx = Number(singleArr[1]);
  954. item.buffy = Number(singleArr[2]);
  955. item.buffz = Number(singleArr[3]);
  956. item.time = Number(singleArr[4]);
  957. BuildCFG.dict[item.name] = item;
  958. BuildCFG.vec.push(item);
  959. }
  960. };
  961. BuildCFG.dict = {};
  962. BuildCFG.vec = [];
  963. return BuildCFG;
  964. }());
  965. exports.default = BuildCFG;
  966. },{}],10:[function(require,module,exports){
  967. "use strict";
  968. Object.defineProperty(exports, "__esModule", { value: true });
  969. //------------------------------------------------------------------------------
  970. //工具生成,请勿修改。
  971. //配置文件名称:game.xlsx。
  972. //------------------------------------------------------------------------------
  973. var GameCFG = /** @class */ (function () {
  974. function GameCFG() {
  975. }
  976. GameCFG.initCfg = function (str) {
  977. var i = 0;
  978. var arr = str.split("\n");
  979. var i = 0;
  980. for (i = 0; i < arr.length; i++) {
  981. var singleStr = arr[i];
  982. var singleArr = singleStr.split("&");
  983. if (GameCFG.dict[singleArr[0]])
  984. continue;
  985. var item = new GameCFG();
  986. item.id = Number(singleArr[0]);
  987. item.value = singleArr[1];
  988. GameCFG.dict[item.id] = item;
  989. GameCFG.vec.push(item);
  990. }
  991. };
  992. GameCFG.dict = {};
  993. GameCFG.vec = [];
  994. return GameCFG;
  995. }());
  996. exports.default = GameCFG;
  997. },{}],11:[function(require,module,exports){
  998. "use strict";
  999. Object.defineProperty(exports, "__esModule", { value: true });
  1000. //------------------------------------------------------------------------------
  1001. //工具生成,请勿修改。
  1002. //配置文件名称:level.xlsx。
  1003. //------------------------------------------------------------------------------
  1004. var LevelCFG = /** @class */ (function () {
  1005. function LevelCFG() {
  1006. }
  1007. LevelCFG.initCfg = function (str) {
  1008. var i = 0;
  1009. var arr = str.split("\n");
  1010. var i = 0;
  1011. for (i = 0; i < arr.length; i++) {
  1012. var singleStr = arr[i];
  1013. var singleArr = singleStr.split("&");
  1014. if (LevelCFG.dict[singleArr[0]])
  1015. continue;
  1016. var item = new LevelCFG();
  1017. item.id = Number(singleArr[0]);
  1018. item.road = singleArr[1];
  1019. item.roleinitpos = JSON.parse(singleArr[2]);
  1020. item.npc = JSON.parse(singleArr[3]);
  1021. item.firstScenepos = singleArr[4];
  1022. item.winGold = Number(singleArr[5]);
  1023. item.failGod = singleArr[6];
  1024. LevelCFG.dict[item.id] = item;
  1025. LevelCFG.vec.push(item);
  1026. }
  1027. };
  1028. LevelCFG.dict = {};
  1029. LevelCFG.vec = [];
  1030. return LevelCFG;
  1031. }());
  1032. exports.default = LevelCFG;
  1033. },{}],12:[function(require,module,exports){
  1034. "use strict";
  1035. Object.defineProperty(exports, "__esModule", { value: true });
  1036. //------------------------------------------------------------------------------
  1037. //工具生成,请勿修改。
  1038. //配置文件名称:lottery.xlsx。
  1039. //------------------------------------------------------------------------------
  1040. var LotteryCFG = /** @class */ (function () {
  1041. function LotteryCFG() {
  1042. }
  1043. LotteryCFG.initCfg = function (str) {
  1044. var i = 0;
  1045. var arr = str.split("\n");
  1046. var i = 0;
  1047. for (i = 0; i < arr.length; i++) {
  1048. var singleStr = arr[i];
  1049. var singleArr = singleStr.split("&");
  1050. if (LotteryCFG.dict[singleArr[0]])
  1051. continue;
  1052. var item = new LotteryCFG();
  1053. item.id = Number(singleArr[0]);
  1054. item.type = Number(singleArr[1]);
  1055. item.value = singleArr[2];
  1056. item.weight = Number(singleArr[3]);
  1057. LotteryCFG.dict[item.id] = item;
  1058. LotteryCFG.vec.push(item);
  1059. }
  1060. };
  1061. LotteryCFG.dict = {};
  1062. LotteryCFG.vec = [];
  1063. return LotteryCFG;
  1064. }());
  1065. exports.default = LotteryCFG;
  1066. },{}],13:[function(require,module,exports){
  1067. "use strict";
  1068. Object.defineProperty(exports, "__esModule", { value: true });
  1069. //------------------------------------------------------------------------------
  1070. //工具生成,请勿修改。
  1071. //配置文件名称:npc.xlsx。
  1072. //------------------------------------------------------------------------------
  1073. var NpcCFG = /** @class */ (function () {
  1074. function NpcCFG() {
  1075. }
  1076. NpcCFG.initCfg = function (str) {
  1077. var i = 0;
  1078. var arr = str.split("\n");
  1079. var i = 0;
  1080. for (i = 0; i < arr.length; i++) {
  1081. var singleStr = arr[i];
  1082. var singleArr = singleStr.split("&");
  1083. if (NpcCFG.dict[singleArr[0]])
  1084. continue;
  1085. var item = new NpcCFG();
  1086. item.id = Number(singleArr[0]);
  1087. item.name = singleArr[1];
  1088. item.speed = Number(singleArr[2]);
  1089. item.frontjump = JSON.parse(singleArr[3]);
  1090. item.leftjump = JSON.parse(singleArr[4]);
  1091. item.rightjump = JSON.parse(singleArr[5]);
  1092. item.upclimb = Number(singleArr[6]);
  1093. item.slideclimb = JSON.parse(singleArr[7]);
  1094. item.jump_left = Number(singleArr[8]);
  1095. item.jump_right = Number(singleArr[9]);
  1096. item.start_ahead = Number(singleArr[10]);
  1097. item.distance = Number(singleArr[11]);
  1098. item.gravity = Number(singleArr[12]);
  1099. NpcCFG.dict[item.id] = item;
  1100. NpcCFG.vec.push(item);
  1101. }
  1102. };
  1103. NpcCFG.dict = {};
  1104. NpcCFG.vec = [];
  1105. return NpcCFG;
  1106. }());
  1107. exports.default = NpcCFG;
  1108. },{}],14:[function(require,module,exports){
  1109. "use strict";
  1110. Object.defineProperty(exports, "__esModule", { value: true });
  1111. //------------------------------------------------------------------------------
  1112. //工具生成,请勿修改。
  1113. //配置文件名称:role.xlsx。
  1114. //------------------------------------------------------------------------------
  1115. var RoleCFG = /** @class */ (function () {
  1116. function RoleCFG() {
  1117. }
  1118. RoleCFG.initCfg = function (str) {
  1119. var i = 0;
  1120. var arr = str.split("\n");
  1121. var i = 0;
  1122. for (i = 0; i < arr.length; i++) {
  1123. var singleStr = arr[i];
  1124. var singleArr = singleStr.split("&");
  1125. if (RoleCFG.dict[singleArr[0]])
  1126. continue;
  1127. var item = new RoleCFG();
  1128. item.id = Number(singleArr[0]);
  1129. item.name = singleArr[1];
  1130. item.speed = Number(singleArr[2]);
  1131. item.frontjump = JSON.parse(singleArr[3]);
  1132. item.leftjump = JSON.parse(singleArr[4]);
  1133. item.rightjump = JSON.parse(singleArr[5]);
  1134. item.upclimb = Number(singleArr[6]);
  1135. item.slideclimb = JSON.parse(singleArr[7]);
  1136. item.getState = Number(singleArr[8]);
  1137. item.need = Number(singleArr[9]);
  1138. item.icon = singleArr[10];
  1139. item.gravity = Number(singleArr[11]);
  1140. item.rolename = singleArr[12];
  1141. RoleCFG.dict[item.id] = item;
  1142. RoleCFG.vec.push(item);
  1143. }
  1144. };
  1145. RoleCFG.dict = {};
  1146. RoleCFG.vec = [];
  1147. return RoleCFG;
  1148. }());
  1149. exports.default = RoleCFG;
  1150. },{}],15:[function(require,module,exports){
  1151. "use strict";
  1152. Object.defineProperty(exports, "__esModule", { value: true });
  1153. var Global_1 = require("../Global");
  1154. /*
  1155. * name;
  1156. */
  1157. var AssetPath = /** @class */ (function () {
  1158. function AssetPath() {
  1159. }
  1160. AssetPath.init = function () {
  1161. AssetPath.versionrandom = "?v=" + Math.random();
  1162. };
  1163. AssetPath.getsound = function (id) {
  1164. return Global_1.Global.getUrl(AssetPath.resources + AssetPath.music + id + ".mp3");
  1165. };
  1166. AssetPath.getResConfig = function () {
  1167. return Global_1.Global.getUrl(AssetPath.resources + "resConfig.json");
  1168. };
  1169. AssetPath.getConfig = function (configname) {
  1170. return Global_1.Global.getUrl(AssetPath.resources + configname + ".bin");
  1171. };
  1172. AssetPath.get3Dscene = function (name) {
  1173. return Global_1.Global.getUrl(AssetPath.res + AssetPath.prop + "Conventional/" + name + ".ls");
  1174. };
  1175. AssetPath.get3DModel = function (name) {
  1176. return Global_1.Global.getUrl(AssetPath.res + AssetPath.prop + "Conventional/" + name + ".lh");
  1177. };
  1178. AssetPath.get3DRoleModel = function (name) {
  1179. return Global_1.Global.getUrl(AssetPath.res + "character/Conventional/" + name + ".lh");
  1180. };
  1181. AssetPath.getroleicon = function (id) {
  1182. return Global_1.Global.getUrl(AssetPath.res + "skinicon/" + id + ".png");
  1183. };
  1184. AssetPath.getVerisonurl = function () {
  1185. if (Global_1.Global.isdebug) {
  1186. return Global_1.Global.getUrl(AssetPath.res + "version.json") + AssetPath.versionrandom;
  1187. }
  1188. return Global_1.Global.getUrl(AssetPath.res + "version" + Global_1.Global.resconfigVersion + ".json");
  1189. };
  1190. AssetPath.getGameVersion = function () {
  1191. return Global_1.Global.getUrl("gameversion.json");
  1192. };
  1193. /**获取匹配人物头像icon */
  1194. AssetPath.pipeiicon = function (id) {
  1195. return Global_1.Global.getUrl(AssetPath.res + "icon/" + id + ".png");
  1196. };
  1197. AssetPath.res = "res/";
  1198. AssetPath.resources = "resources/";
  1199. // export var configs:string = "configs/";
  1200. AssetPath.ui = "ui/";
  1201. AssetPath.subpacksgeui = "character/ui/";
  1202. AssetPath.music = "music/";
  1203. AssetPath.versionrandom = "";
  1204. AssetPath.prop = "prop/";
  1205. AssetPath.skinicon = "skinicon/";
  1206. return AssetPath;
  1207. }());
  1208. exports.AssetPath = AssetPath;
  1209. },{"../Global":39}],16:[function(require,module,exports){
  1210. "use strict";
  1211. Object.defineProperty(exports, "__esModule", { value: true });
  1212. var AssetPath_1 = require("./AssetPath");
  1213. var Global_1 = require("../Global");
  1214. /*
  1215. * name;
  1216. */
  1217. var RecConfigs = /** @class */ (function (_super) {
  1218. __extends(RecConfigs, _super);
  1219. function RecConfigs() {
  1220. var _this = _super.call(this) || this;
  1221. RecConfigs.ins = _this;
  1222. return _this;
  1223. }
  1224. Object.defineProperty(RecConfigs, "Instance", {
  1225. get: function () {
  1226. if (RecConfigs.ins == null) {
  1227. return new RecConfigs();
  1228. }
  1229. return RecConfigs.ins;
  1230. },
  1231. enumerable: true,
  1232. configurable: true
  1233. });
  1234. RecConfigs.prototype.init = function () {
  1235. this.ResDic = {};
  1236. };
  1237. /****************************************************************** */
  1238. RecConfigs.prototype.loadUI = function () {
  1239. Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(this, function () {
  1240. var changeActionButton = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", "正常模式"));
  1241. changeActionButton.size(160, 40);
  1242. changeActionButton.labelBold = true;
  1243. changeActionButton.labelSize = 30;
  1244. changeActionButton.sizeGrid = "4,4,4,4";
  1245. changeActionButton.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
  1246. changeActionButton.pos(Laya.stage.width / 2 - changeActionButton.width * Laya.Browser.pixelRatio / 2, Laya.stage.height - 100 * Laya.Browser.pixelRatio);
  1247. changeActionButton.on(Laya.Event.CLICK, this, function () {
  1248. if (++this.curStateIndex % 2 == 1) {
  1249. this.sprite3D.active = false;
  1250. this.lineSprite3D.active = true;
  1251. changeActionButton.label = "网格模式";
  1252. }
  1253. else {
  1254. this.sprite3D.active = true;
  1255. this.lineSprite3D.active = false;
  1256. changeActionButton.label = "正常模式";
  1257. }
  1258. });
  1259. }));
  1260. };
  1261. /****************************************************************** */
  1262. RecConfigs.prototype.initRec = function (_res) {
  1263. if (_res != null && !RecConfigs.inited) {
  1264. RecConfigs.inited = true;
  1265. var groupsArr = _res.groups;
  1266. var resourcesArr = _res.resources;
  1267. var resourcesDict = {};
  1268. for (var item in resourcesArr) {
  1269. var child = resourcesArr[item];
  1270. switch (child.type) {
  1271. case "bin":
  1272. child.type = Laya.Loader.BUFFER;
  1273. break;
  1274. case "ls":
  1275. child.type = Laya.Scene;
  1276. break;
  1277. case "lh":
  1278. child.type = Laya.Sprite3D;
  1279. break;
  1280. case "lm":
  1281. child.type = Laya.MeshSprite3D;
  1282. break;
  1283. }
  1284. resourcesDict[child.name] = child;
  1285. }
  1286. for (var grouptype in groupsArr) {
  1287. var groupchild = groupsArr[grouptype];
  1288. var arr = groupchild.keys.split(",");
  1289. var childArr = [];
  1290. var chidstr;
  1291. for (chidstr in arr) {
  1292. var strChild = arr[chidstr];
  1293. if (strChild != "") {
  1294. var urls = resourcesDict[strChild].url;
  1295. urls = urls.replace("res/", AssetPath_1.AssetPath.res);
  1296. childArr.push({ url: Global_1.Global.getUrl(urls), type: resourcesDict[strChild].type });
  1297. }
  1298. }
  1299. this.ResDic[groupchild.name] = childArr;
  1300. }
  1301. Laya.loader.clearRes(AssetPath_1.AssetPath.getResConfig());
  1302. }
  1303. };
  1304. /**
  1305. * 是否已经初始化
  1306. */
  1307. RecConfigs.inited = false;
  1308. return RecConfigs;
  1309. }(Laya.EventDispatcher));
  1310. exports.RecConfigs = RecConfigs;
  1311. },{"../Global":39,"./AssetPath":15}],17:[function(require,module,exports){
  1312. "use strict";
  1313. Object.defineProperty(exports, "__esModule", { value: true });
  1314. var AssetPath_1 = require("../Config/AssetPath");
  1315. /*
  1316. * name;
  1317. */
  1318. var AudioControl = /** @class */ (function (_super) {
  1319. __extends(AudioControl, _super);
  1320. function AudioControl() {
  1321. var _this = _super.call(this) || this;
  1322. _this._isbgOpen = true;
  1323. _this.open = true;
  1324. _this._isAllOpen = true;
  1325. _this._nowBgName = "";
  1326. _this._isPlaybging = false;
  1327. /**
  1328. * 声音开关引用索引
  1329. */
  1330. _this._soundIndex = 0;
  1331. AudioControl.ins = _this;
  1332. return _this;
  1333. }
  1334. Object.defineProperty(AudioControl, "Instance", {
  1335. get: function () {
  1336. if (AudioControl.ins == null) {
  1337. return new AudioControl();
  1338. }
  1339. return AudioControl.ins;
  1340. },
  1341. enumerable: true,
  1342. configurable: true
  1343. });
  1344. AudioControl.prototype.init = function () {
  1345. Laya.SoundManager.autoReleaseSound = false;
  1346. Laya.SoundManager.autoStopMusic = true;
  1347. };
  1348. Object.defineProperty(AudioControl.prototype, "gamesoundOpen", {
  1349. set: function (value) {
  1350. this.open = value;
  1351. Laya.SoundManager.soundMuted = !value;
  1352. if (value == true) {
  1353. fairygui.UIConfig.buttonSoundVolumeScale = 1;
  1354. }
  1355. else {
  1356. fairygui.UIConfig.buttonSoundVolumeScale = 0;
  1357. }
  1358. },
  1359. enumerable: true,
  1360. configurable: true
  1361. });
  1362. Object.defineProperty(AudioControl.prototype, "GetSoundSwitch", {
  1363. /**
  1364. * 音效是否开启
  1365. */
  1366. get: function () {
  1367. return this.open;
  1368. },
  1369. enumerable: true,
  1370. configurable: true
  1371. });
  1372. Object.defineProperty(AudioControl.prototype, "isbgOpen", {
  1373. /**
  1374. * 背景音乐是否开启
  1375. */
  1376. get: function () {
  1377. return this._isbgOpen;
  1378. },
  1379. set: function (value) {
  1380. this._isbgOpen = value;
  1381. Laya.SoundManager.musicMuted = !value;
  1382. },
  1383. enumerable: true,
  1384. configurable: true
  1385. });
  1386. Object.defineProperty(AudioControl.prototype, "isAllOpen", {
  1387. /**
  1388. * 所有音乐是否开启
  1389. */
  1390. get: function () {
  1391. return this._isAllOpen;
  1392. },
  1393. set: function (value) {
  1394. if (value) {
  1395. this._soundIndex--;
  1396. if (this._soundIndex < 0) {
  1397. this._soundIndex = 0;
  1398. }
  1399. if (!this._isPlaybging && this._soundIndex == 0) {
  1400. this._isAllOpen = true;
  1401. this.setGameVolume(1);
  1402. this.playbgSound(this._nowBgName);
  1403. fairygui.UIConfig.buttonSoundVolumeScale = 1;
  1404. }
  1405. else {
  1406. this._isAllOpen = false;
  1407. }
  1408. }
  1409. else {
  1410. this._isAllOpen = false;
  1411. if (this._soundIndex < 0) {
  1412. this._soundIndex = 0;
  1413. }
  1414. this._soundIndex++;
  1415. if (this._isPlaybging) {
  1416. this.stopbgSound();
  1417. }
  1418. this.setGameVolume(0);
  1419. fairygui.UIConfig.buttonSoundVolumeScale = 0;
  1420. }
  1421. },
  1422. enumerable: true,
  1423. configurable: true
  1424. });
  1425. /**
  1426. * 停止播放音效
  1427. */
  1428. AudioControl.prototype.stopGameSound = function () {
  1429. Laya.SoundManager.stopAllSound();
  1430. };
  1431. /**
  1432. * 停止所有声音
  1433. */
  1434. AudioControl.prototype.ClearAllSOUND = function () {
  1435. this.stopGameSound();
  1436. this.stopbgSound();
  1437. };
  1438. /**
  1439. * 播放背景音乐
  1440. * @param soundName 声音名
  1441. */
  1442. AudioControl.prototype.playbgSound = function (soundName) {
  1443. this._nowBgName = soundName;
  1444. if (this._isAllOpen && this._nowBgName != "" && this._soundIndex <= 0 && !this._isPlaybging) {
  1445. this._isPlaybging = true;
  1446. Laya.SoundManager.playMusic(AssetPath_1.AssetPath.getsound(this._nowBgName));
  1447. this.bgSoundVolume = 0.4;
  1448. }
  1449. };
  1450. /**
  1451. * 停止背景音乐
  1452. */
  1453. AudioControl.prototype.stopbgSound = function () {
  1454. this._isPlaybging = false;
  1455. Laya.SoundManager.stopMusic();
  1456. };
  1457. Object.defineProperty(AudioControl.prototype, "bgSoundVolume", {
  1458. get: function () {
  1459. return Laya.SoundManager.musicVolume;
  1460. },
  1461. /**
  1462. * 设置背景音乐音量
  1463. * @param value 音量范围从 0(静音)至 1(最大音量)。
  1464. */
  1465. set: function (value) {
  1466. Laya.SoundManager.setMusicVolume(value);
  1467. },
  1468. enumerable: true,
  1469. configurable: true
  1470. });
  1471. Object.defineProperty(AudioControl.prototype, "soundVolume", {
  1472. get: function () {
  1473. return Laya.SoundManager.soundVolume;
  1474. },
  1475. /**
  1476. * 设置背景音乐音量
  1477. * @param value 音量范围从 0(静音)至 1(最大音量)。
  1478. */
  1479. set: function (value) {
  1480. Laya.SoundManager.setSoundVolume(value);
  1481. },
  1482. enumerable: true,
  1483. configurable: true
  1484. });
  1485. /**
  1486. * 设置所有声音音量
  1487. * @param value 音量范围从 0(静音)至 1(最大音量)。
  1488. */
  1489. AudioControl.prototype.setGameVolume = function (value) {
  1490. this.bgSoundVolume = value;
  1491. this.soundVolume = value;
  1492. };
  1493. /**
  1494. * 播放音效
  1495. * @param soundName 音效名
  1496. * @param loop 播放次数
  1497. */
  1498. AudioControl.prototype.playGameSound = function (soundName, loop) {
  1499. if (loop === void 0) { loop = 1; }
  1500. if (this._isAllOpen && soundName != "" && Laya.SoundManager.soundVolume != 0) {
  1501. Laya.SoundManager.playSound(AssetPath_1.AssetPath.getsound(soundName), loop);
  1502. }
  1503. };
  1504. return AudioControl;
  1505. }(Laya.EventDispatcher));
  1506. exports.AudioControl = AudioControl;
  1507. },{"../Config/AssetPath":15}],18:[function(require,module,exports){
  1508. "use strict";
  1509. Object.defineProperty(exports, "__esModule", { value: true });
  1510. var ResourceControl_1 = require("./ResourceControl");
  1511. var SkinItem_1 = require("../utils/SkinItem");
  1512. var CpaDownsView_1 = require("../Push/CpaDownsView");
  1513. var CpaItem_1 = require("../Push/CpaItem");
  1514. var BaoKuanGameView_1 = require("../Push/BaoKuanGameView");
  1515. var ShiwantuijianView_1 = require("../Push/ShiwantuijianView");
  1516. /*
  1517. * name;
  1518. */
  1519. var ConnectControl = /** @class */ (function (_super) {
  1520. __extends(ConnectControl, _super);
  1521. function ConnectControl() {
  1522. var _this = _super.call(this) || this;
  1523. /****************************************************** */
  1524. _this.motionCross = false;
  1525. _this.blendType = 0;
  1526. _this.motionIndex = 0;
  1527. _this.motions = ["run", "run_2", "attack", "attack_1", "attack_2", "dead", "idle_2", "idle_3", "idle_4", "idle4", "reload", "replace", "replace_2", "stop"];
  1528. return _this;
  1529. }
  1530. /**
  1531. * 组件绑定
  1532. */
  1533. ConnectControl.ConnectComponent = function () {
  1534. //main
  1535. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2pwlk1a", SkinItem_1.SkinItem);
  1536. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c527", CpaDownsView_1.default);
  1537. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c528", CpaItem_1.default);
  1538. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c529", BaoKuanGameView_1.default);
  1539. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52a", CpaItem_1.default);
  1540. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52b", ShiwantuijianView_1.default);
  1541. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52c", CpaItem_1.default);
  1542. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc21", CpaItem_1.default);
  1543. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc22", CpaItem_1.default);
  1544. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52e", CpaItem_1.default);
  1545. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2uotu6h", CpaItem_1.default);
  1546. // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2ip616l", GiftView);
  1547. // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52d", TuijianView);
  1548. // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2kalr6k",FriendInviteView);
  1549. };
  1550. ConnectControl.prototype.sceneLoaded = function (scene) {
  1551. Laya.stage.addChild(scene);
  1552. var animator = scene.getChildAt(2).getComponent(Laya.Animator);
  1553. this.addButton(100, 100, 160, 30, "动画过渡:否", 20, function (e) {
  1554. this.motionCross = !this.motionCross;
  1555. if (this.motionCross)
  1556. e.target.label = "动画过渡:是";
  1557. else
  1558. e.target.label = "动画过渡:否";
  1559. });
  1560. this.addButton(100, 160, 160, 30, "混合模式:全身", 20, function (e) {
  1561. this.blendType++;
  1562. (this.blendType === 3) && (this.blendType = 0);
  1563. switch (this.blendType) {
  1564. case 0:
  1565. e.target.label = "混合模式:全身";
  1566. break;
  1567. case 1:
  1568. e.target.label = "混合模式:上身";
  1569. break;
  1570. case 2:
  1571. e.target.label = "混合模式:下身";
  1572. break;
  1573. }
  1574. });
  1575. this.addButton(100, 220, 260, 40, "切换动作:attack_2", 28, function (e) {
  1576. switch (this.blendType) {
  1577. case 0:
  1578. if (this.motionCross) {
  1579. animator.crossFade(this.motions[this.motionIndex], 0.2, 0);
  1580. animator.crossFade(this.motions[this.motionIndex], 0.2, 1);
  1581. }
  1582. else {
  1583. animator.play(this.motions[this.motionIndex], 0);
  1584. animator.play(this.motions[this.motionIndex], 1);
  1585. }
  1586. break;
  1587. case 1:
  1588. if (this.motionCross)
  1589. animator.crossFade(this.motions[this.motionIndex], 0.2, 0);
  1590. else
  1591. animator.play(this.motions[this.motionIndex], 0);
  1592. break;
  1593. case 2:
  1594. if (this.motionCross)
  1595. animator.crossFade(this.motions[this.motionIndex], 0.2, 1);
  1596. else
  1597. animator.play(this.motions[this.motionIndex], 1);
  1598. break;
  1599. }
  1600. e.target.label = "切换动作:" + this.motions[this.motionIndex];
  1601. this.motionIndex++;
  1602. (this.motionIndex === this.motions.length) && (this.motionIndex = 0);
  1603. });
  1604. };
  1605. ConnectControl.prototype.addButton = function (x, y, width, height, text, size, clickFun) {
  1606. var thiss = this;
  1607. Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(null, function () {
  1608. var changeActionButton = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", text));
  1609. changeActionButton.size(width, height);
  1610. changeActionButton.labelBold = true;
  1611. changeActionButton.labelSize = size;
  1612. changeActionButton.sizeGrid = "4,4,4,4";
  1613. changeActionButton.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
  1614. changeActionButton.pos(x, y);
  1615. changeActionButton.on(Laya.Event.CLICK, thiss, clickFun);
  1616. }));
  1617. };
  1618. /****************************************************** */
  1619. /**
  1620. * 数据绑定
  1621. */
  1622. ConnectControl.Connnect = function () {
  1623. this.ConnectFairygui();
  1624. this.ConnectComponent();
  1625. };
  1626. /**
  1627. * ui框架的绑定
  1628. */
  1629. ConnectControl.ConnectFairygui = function () {
  1630. fairygui.UIConfig.gameLoaderManager = ResourceControl_1.ResourceControl.Instance;
  1631. //特效绑定( url 绑定组名,只有公共特效需要绑定 ) "ui://fqpgxr1kl6mw0":"effect1"
  1632. fairygui.UIConfig.gameEffectDict = {};
  1633. };
  1634. return ConnectControl;
  1635. }(Laya.EventDispatcher));
  1636. exports.ConnectControl = ConnectControl;
  1637. },{"../Push/BaoKuanGameView":48,"../Push/CpaDownsView":50,"../Push/CpaItem":52,"../Push/ShiwantuijianView":54,"../utils/SkinItem":90,"./ResourceControl":26}],19:[function(require,module,exports){
  1638. "use strict";
  1639. Object.defineProperty(exports, "__esModule", { value: true });
  1640. var LocalDataControl_1 = require("./LocalDataControl");
  1641. var TimeUtils_1 = require("../Time/TimeUtils");
  1642. var UserDataInfo_1 = require("../Data/UserDataInfo");
  1643. var TimesTamper_1 = require("../Time/TimesTamper");
  1644. var DateControl = /** @class */ (function () {
  1645. function DateControl() {
  1646. DateControl.ins = this;
  1647. }
  1648. Object.defineProperty(DateControl, "Instance", {
  1649. get: function () {
  1650. if (DateControl.ins == null) {
  1651. return new DateControl();
  1652. }
  1653. return DateControl.ins;
  1654. },
  1655. enumerable: true,
  1656. configurable: true
  1657. });
  1658. /************************************************************** */
  1659. DateControl.prototype.loadUI = function () {
  1660. Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(this, function () {
  1661. var button = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", "关闭HDR"));
  1662. button.size(200, 40);
  1663. button.labelBold = true;
  1664. button.labelSize = 30;
  1665. button.sizeGrid = "4,4,4,4";
  1666. button.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
  1667. button.pos(Laya.stage.width / 2 - button.width * Laya.Browser.pixelRatio / 2, Laya.stage.height - 60 * Laya.Browser.pixelRatio);
  1668. button.on(Laya.Event.CLICK, this, function () {
  1669. var enableHDR = this.camera.enableHDR;
  1670. if (enableHDR)
  1671. button.label = "开启HDR";
  1672. else
  1673. button.label = "关闭HDR";
  1674. this.camera.enableHDR = !enableHDR;
  1675. });
  1676. }));
  1677. };
  1678. /************************************************ */
  1679. DateControl.prototype.SetSelf = function () {
  1680. var lastday = LocalDataControl_1.LocalDataControl.Instance.getstr(UserDataInfo_1.UserDataInfo.lastDay);
  1681. var nowday = TimeUtils_1.TimeUtils.formatYearMonthDate1(TimesTamper_1.TimesTamper.Instance.serverTime);
  1682. if (lastday != nowday) {
  1683. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lastDay, nowday);
  1684. DateControl.Fresh = true;
  1685. }
  1686. else {
  1687. DateControl.Fresh = false;
  1688. }
  1689. };
  1690. return DateControl;
  1691. }());
  1692. exports.DateControl = DateControl;
  1693. },{"../Data/UserDataInfo":33,"../Time/TimeUtils":56,"../Time/TimesTamper":58,"./LocalDataControl":22}],20:[function(require,module,exports){
  1694. "use strict";
  1695. Object.defineProperty(exports, "__esModule", { value: true });
  1696. var JoystickModule_1 = require("../JoystickModule");
  1697. var DispatcherManager_1 = require("../utils/DispatcherManager");
  1698. var GameState_1 = require("../utils/GameState");
  1699. var SceneControl_1 = require("../Control/SceneControl");
  1700. var PropManager_1 = require("../PrefabControl/PropManager");
  1701. var TimerService_1 = require("../Time/TimerService");
  1702. var GameCFG_1 = require("../CFG/GameCFG");
  1703. var AudioControl_1 = require("../Control/AudioControl");
  1704. var Sdk_1 = require("../WXSDK/Sdk");
  1705. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  1706. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  1707. var AgencyTrial_1 = require("../Agency/AgencyTrial");
  1708. var AgencySkin_1 = require("../Agency/AgencySkin");
  1709. var RecordManager_1 = require("../WXSDK/RecordManager");
  1710. var GameStateControl = /** @class */ (function () {
  1711. function GameStateControl() {
  1712. /**
  1713. * 0:未开始,1:游戏中,2:暂停中
  1714. */
  1715. this.nowGameState = 0;
  1716. this._zhuanxiangbeishu = 0;
  1717. this._huadongSpeedX = 0;
  1718. this._huadongClimbSpeedX = 0;
  1719. this.endGamePlayerArr = [];
  1720. this._isneedShunyiX = false;
  1721. this._nowTime = 0;
  1722. this._lastAngle = 0;
  1723. this._time = 0;
  1724. this.nowMingCi = 0;
  1725. this._nums = 0;
  1726. this._all = 0;
  1727. GameStateControl.ins = this;
  1728. }
  1729. Object.defineProperty(GameStateControl, "Instance", {
  1730. get: function () {
  1731. if (GameStateControl.ins == null) {
  1732. return new GameStateControl();
  1733. }
  1734. return GameStateControl.ins;
  1735. },
  1736. enumerable: true,
  1737. configurable: true
  1738. });
  1739. GameStateControl.prototype.init = function () {
  1740. this._huadongSpeedX = Number(GameCFG_1.default.dict[4].value);
  1741. this._huadongClimbSpeedX = Number(GameCFG_1.default.dict[5].value);
  1742. if (GameCFG_1.default.dict[7]) {
  1743. this._zhuanxiangbeishu = Number(GameCFG_1.default.dict[7].value);
  1744. }
  1745. else {
  1746. this._zhuanxiangbeishu = 2;
  1747. }
  1748. this.initEvent();
  1749. };
  1750. GameStateControl.prototype.initEvent = function () {
  1751. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.lose, this, this.endGame);
  1752. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.end, this, this.endGame);
  1753. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.npcend, this, this.npcendGameHandler);
  1754. };
  1755. GameStateControl.prototype.npcendGameHandler = function (str) {
  1756. this.endGamePlayerArr.push(str);
  1757. };
  1758. GameStateControl.prototype.setClickPanel = function (panel) {
  1759. this._joystickModule = new JoystickModule_1.JoystickModule(panel);
  1760. this._joystickModule.setEventCallback(this, this.ondownfun, this.onmovefun, this.onupfun);
  1761. };
  1762. GameStateControl.prototype.ondownfun = function () {
  1763. this._lastAngle = 0;
  1764. this._nowTime = Laya.Browser.now() / 1000;
  1765. };
  1766. GameStateControl.prototype.onmovefun = function (offsetX) {
  1767. if (this.nowGameState == 1) {
  1768. var disAngle = this._joystickModule.angle - this._lastAngle;
  1769. this._lastAngle = this._joystickModule.angle;
  1770. if (PropManager_1.PropManager.iscarmanpc) {
  1771. PropManager_1.PropManager.npcscriptDict["npc_0"].Joy(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, disAngle * this._zhuanxiangbeishu);
  1772. }
  1773. else {
  1774. SceneControl_1.SceneControl.Instance.PlayerScript.Joy(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, offsetX > 0 ? this._huadongClimbSpeedX : -this._huadongClimbSpeedX, disAngle * this._zhuanxiangbeishu);
  1775. }
  1776. }
  1777. };
  1778. GameStateControl.prototype.onupfun = function () {
  1779. if (PropManager_1.PropManager.iscarmanpc) {
  1780. PropManager_1.PropManager.npcscriptDict["npc_0"].Joy(0, 0);
  1781. }
  1782. else {
  1783. if (this.nowGameState == 1) {
  1784. SceneControl_1.SceneControl.Instance.PlayerScript.Joy(0, 0, 0);
  1785. }
  1786. }
  1787. };
  1788. GameStateControl.prototype.update = function (dt) {
  1789. if (this.nowGameState == 1) {
  1790. this._time = 0;
  1791. var npcdict = PropManager_1.PropManager.npcscriptDict;
  1792. this._nums = 0;
  1793. this._all = 0;
  1794. var s;
  1795. var npcsp;
  1796. for (s in npcdict) {
  1797. npcsp = npcdict[s];
  1798. if (npcsp.getAction() == 1) {
  1799. if (PropManager_1.PropManager.mainRole.transform.position.z < npcsp.getPostion().z) {
  1800. this._nums++;
  1801. }
  1802. this._all++;
  1803. }
  1804. }
  1805. this.nowMingCi = this.endGamePlayerArr.length + ((this._all + 1) - this._nums);
  1806. PropManager_1.PropManager.txt_mingci.text = "第" + this.nowMingCi + "名";
  1807. }
  1808. };
  1809. GameStateControl.prototype.startGame = function () {
  1810. var RoleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
  1811. var agencyskin = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencySkin_1.AgencySkin);
  1812. var nohasskinArr = agencyskin.GainNoHaveSkin();
  1813. if (nohasskinArr.length == 0) {
  1814. this.entergame();
  1815. }
  1816. else {
  1817. PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyTrial_1.AgencyTrial).openview(nohasskinArr);
  1818. }
  1819. };
  1820. GameStateControl.prototype.entergame = function (jiasu) {
  1821. RecordManager_1.RecordManager.Instance.RecordStart();
  1822. this.nowMingCi = 0;
  1823. this.endGamePlayerArr.length = 0;
  1824. this.nowGameState = 1;
  1825. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  1826. this.update(500);
  1827. if (jiasu) {
  1828. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.start, jiasu);
  1829. }
  1830. else {
  1831. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.start);
  1832. }
  1833. AudioControl_1.AudioControl.Instance.playbgSound("bgm");
  1834. Sdk_1.WxApi.recordAldEvent("主界面点击开始游戏...");
  1835. };
  1836. GameStateControl.prototype.stopGame = function () {
  1837. this.nowGameState = 2;
  1838. this.onupfun();
  1839. };
  1840. GameStateControl.prototype.endGame = function () {
  1841. if (PropManager_1.PropManager.jiantouArr && PropManager_1.PropManager.jiantouArr.length > 0) {
  1842. var arr = PropManager_1.PropManager.jiantouArr;
  1843. for (var i = arr.length - 1; i >= 0; i--) {
  1844. arr[i].destroy();
  1845. arr.splice(i, 1);
  1846. }
  1847. }
  1848. PropManager_1.PropManager.jiantouArr.length = 0;
  1849. this.nowGameState = 0;
  1850. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  1851. var npcdict = PropManager_1.PropManager.npcscriptDict;
  1852. if (npcdict) {
  1853. for (var s in npcdict) {
  1854. npcdict[s].stop();
  1855. }
  1856. }
  1857. this.onupfun();
  1858. AudioControl_1.AudioControl.Instance.stopbgSound();
  1859. };
  1860. return GameStateControl;
  1861. }());
  1862. exports.GameStateControl = GameStateControl;
  1863. },{"../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){
  1864. "use strict";
  1865. Object.defineProperty(exports, "__esModule", { value: true });
  1866. var Global_1 = require("../Global");
  1867. var LayOUT_1 = require("../utils/LayOUT");
  1868. /*
  1869. * name;
  1870. */
  1871. var LayoutControl = /** @class */ (function (_super) {
  1872. __extends(LayoutControl, _super);
  1873. function LayoutControl() {
  1874. var _this = _super.call(this) || this;
  1875. _this._uilayerZorder = 0;
  1876. _this._upuilayerZorder = 200;
  1877. _this._tipslayerZorder = 1000;
  1878. _this._guidelayerZorder = 600;
  1879. /**
  1880. * ui层
  1881. */
  1882. _this.uiLayer = new fairygui.GComponent();
  1883. /**
  1884. * 最定层
  1885. */
  1886. _this.topLayer = new fairygui.GComponent();
  1887. /**
  1888. * 背景层( 或者3D场景层 )
  1889. */
  1890. _this.background = new fairygui.GComponent();
  1891. _this._position = new Laya.Vector3();
  1892. _this._outPos = new Laya.Vector3();
  1893. _this.scaleDelta = 0;
  1894. LayoutControl.ins = _this;
  1895. return _this;
  1896. }
  1897. Object.defineProperty(LayoutControl, "Instance", {
  1898. get: function () {
  1899. if (LayoutControl.ins == null) {
  1900. return new LayoutControl();
  1901. }
  1902. return LayoutControl.ins;
  1903. },
  1904. enumerable: true,
  1905. configurable: true
  1906. });
  1907. LayoutControl.prototype.AddLayerByName = function (itemview, layer) {
  1908. if (layer == LayOUT_1.LayOUT.BG) {
  1909. LayoutControl.Instance.background.addChild(itemview);
  1910. }
  1911. else if (layer == LayOUT_1.LayOUT.UI) {
  1912. this._uilayerZorder++;
  1913. LayoutControl.Instance.uiLayer.addChild(itemview);
  1914. itemview.sortingOrder = this._uilayerZorder;
  1915. }
  1916. else if (layer == LayOUT_1.LayOUT.UITop) {
  1917. this._upuilayerZorder++;
  1918. LayoutControl.Instance.uiLayer.addChild(itemview);
  1919. itemview.sortingOrder = this._upuilayerZorder;
  1920. }
  1921. else if (layer == LayOUT_1.LayOUT.TIP) {
  1922. // GameLayerManager.Instance.tipsLayer.addChild(itemview);
  1923. this._tipslayerZorder++;
  1924. LayoutControl.Instance.uiLayer.addChild(itemview);
  1925. itemview.sortingOrder = this._tipslayerZorder;
  1926. }
  1927. else if (layer == LayOUT_1.LayOUT.GUIDE) {
  1928. this._guidelayerZorder++;
  1929. LayoutControl.Instance.uiLayer.addChild(itemview);
  1930. itemview.sortingOrder = this._guidelayerZorder;
  1931. }
  1932. };
  1933. //初始化层级
  1934. LayoutControl.prototype.initlayer = function () {
  1935. Global_1.Global.stage.addChild(fairygui.GRoot.inst.displayObject);
  1936. fairygui.GRoot.inst.addChild(this.background);
  1937. fairygui.GRoot.inst.addChild(this.uiLayer);
  1938. fairygui.GRoot.inst.addChild(this.topLayer);
  1939. };
  1940. LayoutControl.prototype.addHorizontalBox = function (x, y, z) {
  1941. var box = this.scene.addChild(new Laya.MeshSprite3D(this.mesh2));
  1942. box.meshRenderer.material = this.mat1;
  1943. box.meshRenderer.castShadow = true;
  1944. box.meshRenderer.receiveShadow = true;
  1945. this.tmpVector.setValue(x, y, z);
  1946. box.transform.position = this.tmpVector;
  1947. var rigidBody = box.addComponent(Laya.Rigidbody3D);
  1948. rigidBody.mass = 10;
  1949. rigidBody.friction = 1.0;
  1950. rigidBody.restitution = 0.2;
  1951. var boxShape = new Laya.BoxColliderShape(2, 0.33, 0.5);
  1952. rigidBody.colliderShape = boxShape;
  1953. };
  1954. /************************************************ */
  1955. LayoutControl.prototype.ClearLayerByName = function (layer) {
  1956. switch (layer) {
  1957. case LayOUT_1.LayOUT.UI:
  1958. this._uilayerZorder--;
  1959. if (this._uilayerZorder < 0) {
  1960. this._uilayerZorder = 0;
  1961. }
  1962. break;
  1963. case LayOUT_1.LayOUT.UITop:
  1964. this._upuilayerZorder--;
  1965. if (this._upuilayerZorder < 200) {
  1966. this._upuilayerZorder = 200;
  1967. }
  1968. break;
  1969. case LayOUT_1.LayOUT.TIP:
  1970. this._tipslayerZorder--;
  1971. if (this._tipslayerZorder < 1000) {
  1972. this._tipslayerZorder = 1000;
  1973. }
  1974. break;
  1975. case LayOUT_1.LayOUT.GUIDE:
  1976. this._tipslayerZorder--;
  1977. if (this._tipslayerZorder < 600) {
  1978. this._tipslayerZorder = 600;
  1979. }
  1980. break;
  1981. }
  1982. };
  1983. LayoutControl.prototype.onComplete = function () {
  1984. //加载三维地面
  1985. var grid = this.scene.addChild(Laya.Loader.getRes("res/threeDimen/staticModel/grid/plane.lh"));
  1986. //加载二维猴子
  1987. this.layaMonkey2D = Laya.stage.addChild(new Laya.Image("res/threeDimen/monkey.png"));
  1988. //开启定时器循环
  1989. Laya.timer.frameLoop(1, this, this.animate);
  1990. };
  1991. LayoutControl.prototype.animate = function () {
  1992. //变换位置
  1993. this._position.x = Math.sin(this.scaleDelta += 0.01);
  1994. //计算位置
  1995. this.camera.viewport.project(this._position, this.camera.projectionViewMatrix, this._outPos);
  1996. this.layaMonkey2D.pos(this._outPos.x / Laya.stage.clientScaleX, this._outPos.y / Laya.stage.clientScaleY);
  1997. };
  1998. return LayoutControl;
  1999. }(Laya.EventDispatcher));
  2000. exports.LayoutControl = LayoutControl;
  2001. },{"../Global":39,"../utils/LayOUT":88}],22:[function(require,module,exports){
  2002. "use strict";
  2003. Object.defineProperty(exports, "__esModule", { value: true });
  2004. var Global_1 = require("../Global");
  2005. var PlatfromType_1 = require("../WXSDK/PlatfromType");
  2006. /*
  2007. * 本地数据缓存管理器
  2008. */
  2009. var LocalDataControl = /** @class */ (function (_super) {
  2010. __extends(LocalDataControl, _super);
  2011. function LocalDataControl() {
  2012. var _this = _super.call(this) || this;
  2013. LocalDataControl.ins = _this;
  2014. return _this;
  2015. }
  2016. Object.defineProperty(LocalDataControl, "Instance", {
  2017. get: function () {
  2018. if (LocalDataControl.ins == null) {
  2019. return new LocalDataControl();
  2020. }
  2021. return LocalDataControl.ins;
  2022. },
  2023. enumerable: true,
  2024. configurable: true
  2025. });
  2026. LocalDataControl.prototype.init = function () {
  2027. };
  2028. /**
  2029. * 添加本地缓存数据 object
  2030. * @param key
  2031. * @param value
  2032. */
  2033. LocalDataControl.prototype.AddData = function (key, value) {
  2034. this.AddLocalData(key, value);
  2035. };
  2036. /**
  2037. * 获取本地缓存数据 object
  2038. * @param key
  2039. */
  2040. LocalDataControl.prototype.getObj = function (key) {
  2041. return this.GetLocalCaCheData(key);
  2042. };
  2043. /**
  2044. * 添加本地缓存数据 string
  2045. * @param key
  2046. * @param value
  2047. */
  2048. LocalDataControl.prototype.addstr = function (key, value) {
  2049. this.addCacheStr(key, value);
  2050. };
  2051. LocalDataControl.prototype.addnum = function (key, value) {
  2052. this.addCacheStr(key, value.toString());
  2053. };
  2054. /**
  2055. * 获取本地缓存数据 string
  2056. * @param key
  2057. */
  2058. LocalDataControl.prototype.getstr = function (key) {
  2059. return this.getCachestr(key);
  2060. };
  2061. /**
  2062. * 获取本地缓存数据 number
  2063. * @param key
  2064. */
  2065. LocalDataControl.prototype.getnum = function (key) {
  2066. return Number(this.getCachestr(key));
  2067. };
  2068. /**
  2069. * 清理指定本地缓存数据
  2070. * @param key
  2071. */
  2072. LocalDataControl.prototype.removeCache = function (key) {
  2073. this.removeselectCache(key);
  2074. };
  2075. /**
  2076. * 清理所有本地缓存数据
  2077. */
  2078. LocalDataControl.prototype.clearAll = function () {
  2079. this.clearAllCache();
  2080. };
  2081. LocalDataControl.prototype.AddLocalData = function (key, value) {
  2082. switch (Global_1.Global.nowplatfrom) {
  2083. case PlatfromType_1.PlatfromType.wx:
  2084. this.setStorageSyncWX(key, value);
  2085. break;
  2086. default:
  2087. Laya.LocalStorage.setJSON(key, value);
  2088. break;
  2089. }
  2090. };
  2091. LocalDataControl.prototype.GetLocalCaCheData = function (key) {
  2092. var obj;
  2093. switch (Global_1.Global.nowplatfrom) {
  2094. case PlatfromType_1.PlatfromType.wx:
  2095. obj = this.getStorageSyncWX(key);
  2096. break;
  2097. default:
  2098. obj = Laya.LocalStorage.getJSON(key);
  2099. break;
  2100. }
  2101. if (!obj) {
  2102. obj = {};
  2103. }
  2104. return obj;
  2105. };
  2106. LocalDataControl.prototype.addCacheStr = function (key, value) {
  2107. switch (Global_1.Global.nowplatfrom) {
  2108. case PlatfromType_1.PlatfromType.wx:
  2109. this.setStorageSyncWX(key, value);
  2110. break;
  2111. default:
  2112. Laya.LocalStorage.setItem(key, value);
  2113. break;
  2114. }
  2115. };
  2116. LocalDataControl.prototype.getCachestr = function (key) {
  2117. var str = "0";
  2118. switch (Global_1.Global.nowplatfrom) {
  2119. case PlatfromType_1.PlatfromType.wx:
  2120. str = this.getStorageSyncWX(key);
  2121. break;
  2122. default:
  2123. str = Laya.LocalStorage.getItem(key);
  2124. break;
  2125. }
  2126. if (str == null || str == "") {
  2127. str = "0";
  2128. }
  2129. return str;
  2130. };
  2131. LocalDataControl.prototype.removeselectCache = function (key) {
  2132. switch (Global_1.Global.nowplatfrom) {
  2133. case PlatfromType_1.PlatfromType.wx:
  2134. this.removeStorageWX(key);
  2135. break;
  2136. default:
  2137. Laya.LocalStorage.removeItem(key);
  2138. break;
  2139. }
  2140. };
  2141. LocalDataControl.prototype.clearAllCache = function () {
  2142. switch (Global_1.Global.nowplatfrom) {
  2143. case PlatfromType_1.PlatfromType.wx:
  2144. this.clearStorageWX();
  2145. break;
  2146. default:
  2147. Laya.LocalStorage.clear();
  2148. break;
  2149. }
  2150. };
  2151. /**
  2152. * 本地存储
  2153. * @param key
  2154. * @param data
  2155. */
  2156. LocalDataControl.prototype.setStorageSyncWX = function (key, data) {
  2157. var wx = Laya.Browser.window.wx;
  2158. if (wx) {
  2159. wx.setStorageSync(key, data);
  2160. }
  2161. };
  2162. /**
  2163. * 获取本地存储
  2164. * @param key
  2165. */
  2166. LocalDataControl.prototype.getStorageSyncWX = function (key) {
  2167. var wx = Laya.Browser.window.wx;
  2168. if (wx) {
  2169. return wx.getStorageSync(key);
  2170. }
  2171. return null;
  2172. };
  2173. /**
  2174. * 从本地缓存中移除指定 key
  2175. * @param key
  2176. */
  2177. LocalDataControl.prototype.removeStorageWX = function (key) {
  2178. if (Laya.Browser.window.wx) {
  2179. Laya.Browser.window.wx.removeStorage(key);
  2180. }
  2181. };
  2182. /**
  2183. * 清理存储数据
  2184. */
  2185. LocalDataControl.prototype.clearStorageWX = function () {
  2186. if (Laya.Browser.window.wx) {
  2187. Laya.Browser.window.wx.clearStorageSync();
  2188. }
  2189. };
  2190. return LocalDataControl;
  2191. }(Laya.EventDispatcher));
  2192. exports.LocalDataControl = LocalDataControl;
  2193. },{"../Global":39,"../WXSDK/PlatfromType":72}],23:[function(require,module,exports){
  2194. "use strict";
  2195. Object.defineProperty(exports, "__esModule", { value: true });
  2196. var ResDataControl_1 = require("../Control/ResDataControl");
  2197. var ResourceControl_1 = require("../Control/ResourceControl");
  2198. var DispatcherManager_1 = require("../utils/DispatcherManager");
  2199. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  2200. var ViewAction_1 = require("../utils/ViewAction");
  2201. var ViewManager_1 = require("../View/ViewManager");
  2202. var ComponentEventData_1 = require("../Data/ComponentEventData");
  2203. var GamePool_1 = require("../PrefabControl/GamePool");
  2204. /*
  2205. * name;
  2206. */
  2207. var PanelBaseControl = /** @class */ (function (_super) {
  2208. __extends(PanelBaseControl, _super);
  2209. /**
  2210. * 界面初始化
  2211. * @param pkgName 包名
  2212. * @param resName 界面名
  2213. * @param isAddpackage 是否添加包
  2214. * @param ActionType 界面打开动画类型
  2215. * @param clickBgIsColse 黑色背景 0:无背景 1:背景无关闭事件 2:背景有关闭事件
  2216. * @param iscache 是否添加到缓存池(如是为true,则加入进缓存池定时根据是否引用清理。 若是为false,则不清理当前缓存,如若清理,请手动清理 )
  2217. */
  2218. function PanelBaseControl(pkgName, resName, isAddpackage, ActionType, clickBgIsColse, iscache) {
  2219. if (pkgName === void 0) { pkgName = ""; }
  2220. if (resName === void 0) { resName = ""; }
  2221. if (isAddpackage === void 0) { isAddpackage = false; }
  2222. if (ActionType === void 0) { ActionType = ViewAction_1.ViewAction.ActionType_none; }
  2223. if (clickBgIsColse === void 0) { clickBgIsColse = 0; }
  2224. if (iscache === void 0) { iscache = true; }
  2225. var _this = _super.call(this) || this;
  2226. _this.isguideing = false;
  2227. _this.PackageName = "";
  2228. _this.ResourcesName = "";
  2229. _this._iscache = true;
  2230. _this._ActionType = ViewAction_1.ViewAction.ActionType_none;
  2231. _this._clickBgIsColse = 0;
  2232. /**
  2233. * 事件容器
  2234. */
  2235. _this.EventResDic = {};
  2236. /**
  2237. * 全局事件容器
  2238. */
  2239. _this.EventGlobal = {};
  2240. _this._iscache = iscache;
  2241. _this.PackageName = pkgName;
  2242. _this.ResourcesName = resName;
  2243. _this._isAddpackage = isAddpackage;
  2244. _this._ActionType = ActionType;
  2245. _this._clickBgIsColse = clickBgIsColse;
  2246. _this.showModalWait();
  2247. return _this;
  2248. }
  2249. PanelBaseControl.prototype.ResolveUI = function (pkgname, resname, isaddpackage, ActionType, clickBgIsColse, iscache) {
  2250. if (ActionType === void 0) { ActionType = ViewAction_1.ViewAction.ActionType_none; }
  2251. if (clickBgIsColse === void 0) { clickBgIsColse = 0; }
  2252. if (iscache === void 0) { iscache = true; }
  2253. this.PackageName = pkgname;
  2254. this.ResourcesName = resname;
  2255. this._ActionType = ActionType;
  2256. this._clickBgIsColse = clickBgIsColse;
  2257. ResDataControl_1.ResDataControl.Instance.AddViewPackByName(pkgname, isaddpackage, iscache);
  2258. this.contentPane = fairygui.UIPackage.createObject(pkgname, resname).asCom;
  2259. for (var str in this.contentPane._children) {
  2260. var item = this.contentPane._children[str];
  2261. if (item.name == "item_panel") {
  2262. var itempanel = item;
  2263. if (itempanel) {
  2264. for (var str1 in itempanel._children) {
  2265. var itempanelItem = itempanel._children[str1];
  2266. this[itempanelItem.name] = itempanelItem;
  2267. }
  2268. }
  2269. // this[item.name] = item;
  2270. this.item_panel = item;
  2271. }
  2272. else {
  2273. this[item.name] = item;
  2274. }
  2275. }
  2276. this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  2277. this.contentPane.setPivot(0.5, 0.5);
  2278. this.setPivot(0.5, 0.5);
  2279. this.setclickBgIsColse();
  2280. this.initView();
  2281. this.initEvent();
  2282. this.ShowViewACTION();
  2283. };
  2284. /**
  2285. * 加载ui
  2286. * @param groupName 组名
  2287. * @param target 作用域
  2288. * @param onLoadedHandler 加载完成回调函数
  2289. */
  2290. PanelBaseControl.prototype.LoadViewUI = function (groupName, target, onLoadedHandler) {
  2291. this._loadTarget = target;
  2292. this._onLoadedHandler = onLoadedHandler;
  2293. ResourceControl_1.ResourceControl.Instance.loadGroup(groupName, this, this.LoadComplete);
  2294. };
  2295. /******************************************************************* */
  2296. PanelBaseControl.prototype.createLabel = function (color, strokeColor) {
  2297. var STROKE_WIDTH = 4;
  2298. var label = new Laya.Label();
  2299. label.font = "Microsoft YaHei";
  2300. label.text = "SAMPLE DEMO";
  2301. label.fontSize = 30;
  2302. label.color = color;
  2303. if (strokeColor) {
  2304. label.stroke = STROKE_WIDTH;
  2305. label.strokeColor = strokeColor;
  2306. }
  2307. Laya.stage.addChild(label);
  2308. return label;
  2309. };
  2310. /****************************************************************** */
  2311. /**
  2312. * 加载资源数组
  2313. * @param urls 资源数组
  2314. * @param target 作用域
  2315. * @param onLoadedHandler 加载完成回调函数
  2316. */
  2317. PanelBaseControl.prototype.loadUibyArr = function (urls, target, onLoadedHandler) {
  2318. // this.showModalWait();
  2319. this._loadTarget = target;
  2320. this._onLoadedHandler = onLoadedHandler;
  2321. ResourceControl_1.ResourceControl.Instance.Loaders(urls, this, this.LoadComplete);
  2322. };
  2323. /********************************************************************* */
  2324. PanelBaseControl.prototype.createRadioGroup = function (skin) {
  2325. var rg = new Laya.RadioGroup();
  2326. rg.skin = skin;
  2327. rg.space = 70;
  2328. rg.direction = "v";
  2329. rg.labels = "Item1, Item2, Item3";
  2330. rg.labelColors = "#787878,#d3d3d3,#FFFFFF";
  2331. rg.labelSize = 20;
  2332. rg.labelBold = true;
  2333. rg.labelPadding = "5,0,0,5";
  2334. rg.selectHandler = new Laya.Handler(this, this.onSelectChange);
  2335. Laya.stage.addChild(rg);
  2336. return rg;
  2337. };
  2338. PanelBaseControl.prototype.onSelectChange = function (index) {
  2339. console.log("你选择了第 " + (index + 1) + " 项");
  2340. };
  2341. /********************************************************************* */
  2342. PanelBaseControl.prototype.LoadComplete = function () {
  2343. if (this._loadTarget && this._onLoadedHandler) {
  2344. this._onLoadedHandler.call(this._loadTarget);
  2345. }
  2346. };
  2347. PanelBaseControl.prototype.removeEffectPackage = function (packageName) {
  2348. ResDataControl_1.ResDataControl.Instance.ClearPackByName(packageName, true);
  2349. };
  2350. PanelBaseControl.prototype.getpanelController = function (name) {
  2351. if (this.item_panel) {
  2352. return this.item_panel.getController(name);
  2353. }
  2354. return null;
  2355. };
  2356. /************************************************************ */
  2357. PanelBaseControl.prototype.setup = function () {
  2358. this.createLabel("#FFFFFF", null).pos(30, 50);
  2359. this.createLabel("#00FFFF", null).pos(290, 50);
  2360. this.createLabel("#FFFF00", "#FFFFFF").pos(30, 100);
  2361. this.createLabel("#000000", "#FFFFFF").pos(290, 100);
  2362. this.createLabel("#FFFFFF", "#00FFFF").pos(30, 150);
  2363. this.createLabel("#0080FF", "#00FFFF").pos(290, 150);
  2364. };
  2365. /************************************************************ */
  2366. PanelBaseControl.prototype.getpanelTransition = function (name) {
  2367. if (this.item_panel) {
  2368. return this.item_panel.getTransition(name);
  2369. }
  2370. return null;
  2371. };
  2372. PanelBaseControl.prototype.getChildformContentPanel = function (name) {
  2373. if (this.contentPane) {
  2374. return this.contentPane.getChild(name);
  2375. }
  2376. return null;
  2377. };
  2378. /*界面初始化*/
  2379. PanelBaseControl.prototype.onInit = function () {
  2380. _super.prototype.onInit.call(this);
  2381. if (this.PackageName != "" && this.ResourcesName != "") {
  2382. this.ResolveUI(this.PackageName, this.ResourcesName, this._isAddpackage, this._ActionType, this._clickBgIsColse, this._iscache);
  2383. }
  2384. };
  2385. //解析ui
  2386. PanelBaseControl.prototype.initView = function () {
  2387. };
  2388. PanelBaseControl.prototype.initEvent = function () {
  2389. };
  2390. PanelBaseControl.prototype.ShowViewACTION = function () {
  2391. switch (this._ActionType) {
  2392. case ViewAction_1.ViewAction.ActionType_none:
  2393. this.windowanmoend();
  2394. break;
  2395. case ViewAction_1.ViewAction.ActionType_addmoveToMiddle:
  2396. this.contentPane.x = fairygui.GRoot.inst.width;
  2397. Laya.Tween.to(this.contentPane, { x: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  2398. break;
  2399. case ViewAction_1.ViewAction.ActionType_addmoveFromBottom:
  2400. this.contentPane.y = fairygui.GRoot.inst.height;
  2401. Laya.Tween.to(this.contentPane, { y: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  2402. break;
  2403. case ViewAction_1.ViewAction.ActionType_addscaleMinToMax:
  2404. this.contentPane.scaleX = this.contentPane.scaleY = 0.01;
  2405. Laya.Tween.to(this.contentPane, { scaleX: 1, scaleY: 1 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  2406. break;
  2407. }
  2408. };
  2409. /******************************************************** */
  2410. PanelBaseControl.prototype.createCheckBox = function (skin) {
  2411. var cb = new Laya.CheckBox(skin);
  2412. Laya.stage.addChild(cb);
  2413. cb.labelColors = "white";
  2414. cb.labelSize = 20;
  2415. cb.labelFont = "Microsoft YaHei";
  2416. cb.labelPadding = "3,0,0,5";
  2417. return cb;
  2418. };
  2419. PanelBaseControl.prototype.updateLabel = function (checkBox) {
  2420. checkBox.label = checkBox.selected ? "已选中" : "未选中";
  2421. };
  2422. /******************************************************** */
  2423. PanelBaseControl.prototype.windowanmoend = function () {
  2424. Laya.timer.callLater(this, this.onShowView);
  2425. };
  2426. PanelBaseControl.prototype.onShowView = function () {
  2427. this.closeModalWait();
  2428. this.showClickBg();
  2429. };
  2430. PanelBaseControl.prototype.showClickBg = function () {
  2431. if (this._clickBg) {
  2432. this._clickBg.alpha = 0.55;
  2433. if (this._clickBgIsColse == 2 && !this.hasClickListener()) {
  2434. this._clickBg.onClick(this, this.ClickExitView);
  2435. }
  2436. }
  2437. };
  2438. /**点击关闭页面按钮 */
  2439. PanelBaseControl.prototype.ClickExitView = function () {
  2440. ViewManager_1.ViewManager.Instance.close(this.viewKey, true);
  2441. };
  2442. /*获取管理数据模块*/
  2443. PanelBaseControl.prototype.getProxy = function (d) {
  2444. return PanelResDic_1.PanelResDic.Instance.getSingleTon(d);
  2445. };
  2446. /**
  2447. * 界面关闭事件
  2448. */
  2449. PanelBaseControl.prototype.ExitView = function (ActionType) {
  2450. if (ActionType === void 0) { ActionType = ""; }
  2451. if (this._clickBg) {
  2452. this._clickBg.visible = false;
  2453. }
  2454. if (ActionType == "") {
  2455. switch (this._ActionType) {
  2456. case ViewAction_1.ViewAction.ActionType_none:
  2457. this.destory();
  2458. break;
  2459. case ViewAction_1.ViewAction.ActionType_addmoveToMiddle:
  2460. Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2461. break;
  2462. case ViewAction_1.ViewAction.ActionType_addmoveFromBottom:
  2463. Laya.Tween.to(this, { y: fairygui.GRoot.inst.height }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2464. break;
  2465. case ViewAction_1.ViewAction.ActionType_addscaleMinToMax:
  2466. Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2467. break;
  2468. }
  2469. }
  2470. else {
  2471. switch (ActionType) {
  2472. case ViewAction_1.ViewAction.ActionType_none:
  2473. this.destory();
  2474. break;
  2475. case ViewAction_1.ViewAction.ActionType_removescaleMaxToMin:
  2476. Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2477. break;
  2478. case ViewAction_1.ViewAction.ActionType_removemoveToRight:
  2479. Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2480. break;
  2481. }
  2482. }
  2483. };
  2484. PanelBaseControl.prototype.getTransitionByName = function (id) {
  2485. return this.contentPane.getTransition(id);
  2486. };
  2487. /**注册事件 */
  2488. PanelBaseControl.prototype.dispacheDatatrigger = function (type, data) {
  2489. if (data === void 0) { data = null; }
  2490. DispatcherManager_1.DispatcherManager.dispatchEvent(type, data);
  2491. };
  2492. /**
  2493. * 注册全局事件
  2494. * @param type
  2495. * @param thisObject
  2496. * @param listener
  2497. */
  2498. PanelBaseControl.prototype.addDataEvent = function (type, thisObject, listener) {
  2499. if (!this.EventGlobal.hasOwnProperty(type)) {
  2500. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2501. this.EventGlobal[type] = vo;
  2502. vo.type = type;
  2503. vo.thisObject = thisObject;
  2504. vo.listener = listener;
  2505. DispatcherManager_1.DispatcherManager.addEventListener(type, thisObject, listener);
  2506. }
  2507. };
  2508. /**
  2509. * 移除全局事件
  2510. * @param type
  2511. * @param thisObject
  2512. * @param listener
  2513. */
  2514. PanelBaseControl.prototype.ClearEventData = function (type, thisObject, listener) {
  2515. if (this.EventGlobal[type]) {
  2516. var vo = this.EventGlobal[type];
  2517. DispatcherManager_1.DispatcherManager.removeEventListener(type, thisObject, listener);
  2518. vo.clear();
  2519. delete this.EventGlobal[type];
  2520. }
  2521. };
  2522. /**
  2523. * 移除组件事件
  2524. * @param type 时间类型
  2525. * @param callbackobj 作用域
  2526. * @param callbackHandler 事件回调
  2527. */
  2528. PanelBaseControl.prototype.ClearEventByType = function (target, type, thisObject, listener) {
  2529. if (target && this.EventResDic[target.name]) {
  2530. var arr = this.EventResDic[target.name];
  2531. var i = 0;
  2532. var nums = arr.length;
  2533. var vo;
  2534. for (i; i < nums; i++) {
  2535. vo = arr[i];
  2536. if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) {
  2537. target.off(type, thisObject, listener);
  2538. vo.clear();
  2539. arr.splice(i, 1);
  2540. break;
  2541. }
  2542. }
  2543. }
  2544. };
  2545. /**
  2546. * 注册组件事件,调用此方法,界面关闭会自动移除
  2547. * @param type 时间类型
  2548. * @param callbackobj 作用域
  2549. * @param callbackHandler 事件回调
  2550. */
  2551. PanelBaseControl.prototype.AddEventByType = function (target, type, thisObject, listener, args) {
  2552. if (args === void 0) { args = null; }
  2553. if (target) {
  2554. if (target.name == null || target.name == "") {
  2555. throw "baseview addListener target.name is null";
  2556. }
  2557. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2558. vo.target = target;
  2559. vo.type = type;
  2560. vo.thisObject = thisObject;
  2561. vo.listener = listener;
  2562. if (!this.EventResDic.hasOwnProperty(target.name)) {
  2563. this.EventResDic[target.name] = [];
  2564. }
  2565. var bo = this.JudgeIsHaveEvent(target, type);
  2566. if (!bo) {
  2567. target.on(type, thisObject, listener, args);
  2568. this.EventResDic[target.name].push(vo);
  2569. }
  2570. }
  2571. };
  2572. /**判断是否含有事件 */
  2573. PanelBaseControl.prototype.JudgeIsHaveEvent = function (target, type) {
  2574. var eventArr;
  2575. eventArr = this.EventResDic[target.name];
  2576. var childvo;
  2577. for (var s in eventArr) {
  2578. childvo = eventArr[s];
  2579. if (childvo && childvo.type == type) {
  2580. return true;
  2581. }
  2582. }
  2583. return false;
  2584. };
  2585. PanelBaseControl.prototype.getComById = function (id) {
  2586. return this.contentPane.getChild(id).asCom;
  2587. };
  2588. PanelBaseControl.prototype.getControllerByBame = function (id) {
  2589. return this.contentPane.getController(id);
  2590. };
  2591. /**
  2592. * 移除所有组件事件
  2593. */
  2594. PanelBaseControl.prototype.ClearEvent = function () {
  2595. if (this.EventResDic) {
  2596. var s;
  2597. var dict = this.EventResDic;
  2598. var arr;
  2599. var i;
  2600. var nums = 0;
  2601. var vo;
  2602. for (s in dict) {
  2603. arr = dict[s];
  2604. if (arr && arr.length > 0) {
  2605. i = 0;
  2606. nums = arr.length;
  2607. for (i = nums - 1; i >= 0; i--) {
  2608. vo = arr[i];
  2609. if (vo) {
  2610. if (vo.target) {
  2611. vo.target.off(vo.type, vo.thisObject, vo.listener);
  2612. }
  2613. vo.clear();
  2614. }
  2615. arr.splice(i, 1);
  2616. }
  2617. }
  2618. delete this.EventResDic[s];
  2619. }
  2620. }
  2621. this.EventResDic = {};
  2622. };
  2623. PanelBaseControl.prototype.clearEvent = function () {
  2624. };
  2625. /* 销毁*/
  2626. PanelBaseControl.prototype.destory = function () {
  2627. this.clearEvent();
  2628. this.closeModalWait();
  2629. this.ClearGlobalEvent();
  2630. this.ClearEvent();
  2631. this._loadTarget = null;
  2632. this._onLoadedHandler = null;
  2633. Laya.Tween.clearTween(this);
  2634. ResDataControl_1.ResDataControl.Instance.ClearPackByName(this.PackageName, false);
  2635. this.PackageName = null;
  2636. this.ResourcesName = null;
  2637. if (this._clickBg) {
  2638. this._clickBg.offClick(this, this.ClickExitView);
  2639. this._clickBg.dispose();
  2640. this._clickBg = null;
  2641. }
  2642. this.viewKey = null;
  2643. this.dispose();
  2644. };
  2645. PanelBaseControl.prototype.setclickBgIsColse = function () {
  2646. if (this.isShowing && this._clickBgIsColse > 0 && this.contentPane) {
  2647. if (!this._clickBg && PanelBaseControl.viewbgUrl != "") {
  2648. this._clickBg = new fairygui.GLoader();
  2649. this._clickBg.touchable = true;
  2650. this._clickBg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  2651. this._clickBg.url = PanelBaseControl.viewbgUrl;
  2652. this._clickBg.fill = fairygui.LoaderFillType.ScaleFree;
  2653. this._clickBg.alpha = 0;
  2654. this.contentPane.addChildAt(this._clickBg, 0);
  2655. }
  2656. }
  2657. };
  2658. /**
  2659. * 移除所有全局事件
  2660. */
  2661. PanelBaseControl.prototype.ClearGlobalEvent = function () {
  2662. if (this.EventGlobal) {
  2663. var s;
  2664. var dict = this.EventGlobal;
  2665. for (s in dict) {
  2666. var vo = dict[s];
  2667. if (vo) {
  2668. this.ClearEventData(vo.type, vo.thisObject, vo.listener);
  2669. }
  2670. }
  2671. }
  2672. this.EventGlobal = {};
  2673. };
  2674. PanelBaseControl.viewbgUrl = "";
  2675. return PanelBaseControl;
  2676. }(fairygui.Window));
  2677. exports.PanelBaseControl = PanelBaseControl;
  2678. },{"../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){
  2679. "use strict";
  2680. Object.defineProperty(exports, "__esModule", { value: true });
  2681. var DispatcherManager_1 = require("../utils/DispatcherManager");
  2682. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  2683. var ComponentEventData_1 = require("../Data/ComponentEventData");
  2684. var GamePool_1 = require("../PrefabControl/GamePool");
  2685. var PanelChildControl = /** @class */ (function (_super) {
  2686. __extends(PanelChildControl, _super);
  2687. function PanelChildControl() {
  2688. var _this = _super.call(this) || this;
  2689. /**
  2690. * 事件容器
  2691. */
  2692. _this.EventResDic = {};
  2693. /**
  2694. * 全局事件容器
  2695. */
  2696. _this.EventGlobal = {};
  2697. /******************************************** */
  2698. _this.DIALOG_WIDTH = 220;
  2699. _this.DIALOG_HEIGHT = 275;
  2700. _this.CLOSE_BTN_WIDTH = 43;
  2701. _this.CLOSE_BTN_PADDING = 5;
  2702. return _this;
  2703. }
  2704. /**
  2705. * 移除所有组件事件
  2706. */
  2707. PanelChildControl.prototype.ClearEvent = function () {
  2708. if (this.EventResDic) {
  2709. var s;
  2710. var dict = this.EventResDic;
  2711. var arr;
  2712. var i;
  2713. var nums = 0;
  2714. var vo;
  2715. for (s in dict) {
  2716. arr = dict[s];
  2717. if (arr && arr.length > 0) {
  2718. i = 0;
  2719. nums = arr.length;
  2720. for (i = nums - 1; i >= 0; i--) {
  2721. vo = arr[i];
  2722. if (vo) {
  2723. if (vo.target) {
  2724. vo.target.off(vo.type, vo.thisObject, vo.listener);
  2725. }
  2726. vo.clear();
  2727. }
  2728. arr.splice(i, 1);
  2729. }
  2730. }
  2731. delete this.EventResDic[s];
  2732. }
  2733. }
  2734. this.EventResDic = {};
  2735. };
  2736. PanelChildControl.prototype.dispose = function () {
  2737. this.ClearGlobalEvent();
  2738. this.ClearEvent();
  2739. _super.prototype.dispose.call(this);
  2740. };
  2741. PanelChildControl.prototype.constructFromXML = function (xml) {
  2742. _super.prototype.constructFromXML.call(this, xml);
  2743. for (var str in this._children) {
  2744. var item = this._children[str];
  2745. this[item.name] = item;
  2746. }
  2747. this.onInit();
  2748. };
  2749. PanelChildControl.prototype.onInit = function () {
  2750. };
  2751. /*获取管理数据模块*/
  2752. PanelChildControl.prototype.getProxy = function (d) {
  2753. return PanelResDic_1.PanelResDic.Instance.getSingleTon(d);
  2754. };
  2755. PanelChildControl.prototype.dispacheDatatrigger = function (type, data) {
  2756. if (data === void 0) { data = null; }
  2757. DispatcherManager_1.DispatcherManager.dispatchEvent(type, data);
  2758. };
  2759. PanelChildControl.prototype.hasDataEvent = function (type) {
  2760. return DispatcherManager_1.DispatcherManager.hasEventListener(type);
  2761. };
  2762. /**
  2763. * 注册全局事件
  2764. * @param type
  2765. * @param thisObject
  2766. * @param listener
  2767. */
  2768. PanelChildControl.prototype.AddEventData = function (type, thisObject, listener) {
  2769. if (!this.EventGlobal.hasOwnProperty(type)) {
  2770. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2771. this.EventGlobal[type] = vo;
  2772. vo.type = type;
  2773. vo.thisObject = thisObject;
  2774. vo.listener = listener;
  2775. DispatcherManager_1.DispatcherManager.addEventListener(type, thisObject, listener);
  2776. }
  2777. };
  2778. PanelChildControl.prototype.onSkinLoadComplete = function () {
  2779. var dialog = new Laya.Dialog();
  2780. var bg = new Laya.Image(this.assets[0]);
  2781. dialog.addChild(bg);
  2782. var button = new Laya.Button(this.assets[1]);
  2783. // button.name = Dialog.CLOSE;
  2784. button.pos(this.DIALOG_WIDTH - this.CLOSE_BTN_WIDTH - this.CLOSE_BTN_PADDING, this.CLOSE_BTN_PADDING);
  2785. dialog.addChild(button);
  2786. dialog.dragArea = "0,0," + this.DIALOG_WIDTH + "," + this.DIALOG_HEIGHT;
  2787. dialog.show();
  2788. };
  2789. /******************************************** */
  2790. /**
  2791. * 移除全局事件
  2792. * @param type
  2793. * @param thisObject
  2794. * @param listener
  2795. */
  2796. PanelChildControl.prototype.removeDataEvent = function (type, thisObject, listener) {
  2797. if (this.EventGlobal[type]) {
  2798. var vo = this.EventGlobal[type];
  2799. DispatcherManager_1.DispatcherManager.removeEventListener(type, thisObject, listener);
  2800. vo.clear();
  2801. delete this.EventGlobal[type];
  2802. }
  2803. };
  2804. /**
  2805. * 注册组件事件,调用此方法,界面关闭会自动移除
  2806. * @param type 时间类型
  2807. * @param callbackobj 作用域
  2808. * @param callbackHandler 事件回调
  2809. */
  2810. PanelChildControl.prototype.AddEventByType = function (target, type, thisObject, listener, args) {
  2811. if (args === void 0) { args = null; }
  2812. if (target) {
  2813. if (target.name == null || target.name == "") {
  2814. throw "childbaseview addListener target.name is null";
  2815. }
  2816. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2817. vo.target = target;
  2818. vo.type = type;
  2819. vo.thisObject = thisObject;
  2820. vo.listener = listener;
  2821. if (!this.EventResDic.hasOwnProperty(target.name)) {
  2822. this.EventResDic[target.name] = [];
  2823. }
  2824. var bo = this.JudgeIsHaveEvent(target, type);
  2825. if (!bo) {
  2826. target.on(type, thisObject, listener, args);
  2827. this.EventResDic[target.name].push(vo);
  2828. }
  2829. }
  2830. };
  2831. PanelChildControl.prototype.JudgeIsHaveEvent = function (target, type) {
  2832. var eventArr;
  2833. eventArr = this.EventResDic[target.name];
  2834. var childvo;
  2835. for (var s in eventArr) {
  2836. childvo = eventArr[s];
  2837. if (childvo && childvo.type == type) {
  2838. return true;
  2839. }
  2840. }
  2841. return false;
  2842. };
  2843. /**
  2844. * 移除组件事件
  2845. * @param type 时间类型
  2846. * @param callbackobj 作用域
  2847. * @param callbackHandler 事件回调
  2848. */
  2849. PanelChildControl.prototype.ClearEventByType = function (target, type, thisObject, listener) {
  2850. if (target && this.EventResDic[target.name]) {
  2851. var arr = this.EventResDic[target.name];
  2852. var i = 0;
  2853. var nums = arr.length;
  2854. var vo;
  2855. for (i; i < nums; i++) {
  2856. vo = arr[i];
  2857. if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) {
  2858. target.off(type, thisObject, listener);
  2859. vo.clear();
  2860. arr.splice(i, 1);
  2861. break;
  2862. }
  2863. }
  2864. }
  2865. };
  2866. /**
  2867. * 移除所有全局事件
  2868. */
  2869. PanelChildControl.prototype.ClearGlobalEvent = function () {
  2870. if (this.EventGlobal) {
  2871. var s;
  2872. var dict = this.EventGlobal;
  2873. for (s in dict) {
  2874. var vo = dict[s];
  2875. if (vo) {
  2876. this.removeDataEvent(vo.type, vo.thisObject, vo.listener);
  2877. }
  2878. }
  2879. }
  2880. this.EventGlobal = {};
  2881. };
  2882. /***************************************************** */
  2883. PanelChildControl.prototype.placeHScroller = function () {
  2884. var hs = new Laya.HScrollBar();
  2885. hs.skin = "res/ui/hscroll.png";
  2886. hs.width = 300;
  2887. hs.pos(50, 170);
  2888. hs.min = 0;
  2889. hs.max = 100;
  2890. hs.changeHandler = new Laya.Handler(this, this.onChange);
  2891. Laya.stage.addChild(hs);
  2892. };
  2893. PanelChildControl.prototype.placeVScroller = function () {
  2894. var vs = new Laya.VScrollBar();
  2895. vs.skin = "res/ui/vscroll.png";
  2896. vs.height = 300;
  2897. vs.pos(400, 50);
  2898. vs.min = 0;
  2899. vs.max = 100;
  2900. vs.changeHandler = new Laya.Handler(this, this.onChange);
  2901. Laya.stage.addChild(vs);
  2902. };
  2903. PanelChildControl.prototype.onChange = function (value) {
  2904. console.log("滚动条的位置: value=" + value);
  2905. };
  2906. return PanelChildControl;
  2907. }(fairygui.GComponent));
  2908. exports.PanelChildControl = PanelChildControl;
  2909. },{"../Data/ComponentEventData":28,"../PrefabControl/GamePool":45,"../PrefabControl/PanelResDic":46,"../utils/DispatcherManager":83}],25:[function(require,module,exports){
  2910. "use strict";
  2911. Object.defineProperty(exports, "__esModule", { value: true });
  2912. var ResourceControl_1 = require("./ResourceControl");
  2913. var LocalData_1 = require("../Data/LocalData");
  2914. var GamePool_1 = require("../PrefabControl/GamePool");
  2915. var AssetPath_1 = require("../Config/AssetPath");
  2916. var TimerService_1 = require("../Time/TimerService");
  2917. var Tab = Laya.Tab;
  2918. /*
  2919. * 资源管理器;
  2920. */
  2921. var ResDataControl = /** @class */ (function () {
  2922. function ResDataControl() {
  2923. /************************************************ */
  2924. this._time = 0;
  2925. this.ClearInterval = 50000;
  2926. this.CheckInterval = 20000;
  2927. /******************************************************************* */
  2928. this.skins = ["res/ui/tab1.png", "res/ui/tab2.png"];
  2929. ResDataControl.ins = this;
  2930. }
  2931. Object.defineProperty(ResDataControl, "Instance", {
  2932. get: function () {
  2933. if (ResDataControl.ins == null) {
  2934. return new ResDataControl();
  2935. }
  2936. return ResDataControl.ins;
  2937. },
  2938. enumerable: true,
  2939. configurable: true
  2940. });
  2941. /**
  2942. * 添加包
  2943. * @param path 路径( 事例:res/ui/ )
  2944. * @param pkgname 包名
  2945. * @param isaddpackage 是否添加
  2946. * @param isCache 是否缓存
  2947. */
  2948. ResDataControl.prototype.AddPackByName = function (path, pkgname, isaddpackage, isCache) {
  2949. if (isaddpackage === void 0) { isaddpackage = true; }
  2950. if (isCache === void 0) { isCache = true; }
  2951. if (isaddpackage) {
  2952. fairygui.UIPackage.addPackage(path + pkgname, pkgname);
  2953. }
  2954. this.AddLocalLiveData(pkgname, isCache);
  2955. };
  2956. ResDataControl.prototype.init = function () {
  2957. GamePool_1.GamePool.Mark(LocalData_1.LocalData.ResDicValue, LocalData_1.LocalData);
  2958. this.urlRes = {};
  2959. this.packageRes = {};
  2960. this.NoLiveData = { "loading": true, "main": true, "uicomponent": true };
  2961. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  2962. };
  2963. /**
  2964. * 清理资源缓存(Array)
  2965. * @param urls 资源数组
  2966. * @param packageName 包名
  2967. */
  2968. ResDataControl.prototype.RemoveResources = function (urls, packageName) {
  2969. if (packageName === void 0) { packageName = ""; }
  2970. if (packageName != "") {
  2971. fairygui.UIPackage.removePackage(packageName);
  2972. }
  2973. for (var s in urls) {
  2974. this.RemoveResourcesByurl(urls[s].url, true);
  2975. }
  2976. };
  2977. /************************************************ */
  2978. ResDataControl.prototype.placeHSlider = function () {
  2979. var hs = new Laya.HSlider();
  2980. hs.skin = "res/ui/hslider.png";
  2981. hs.width = 300;
  2982. hs.pos(50, 170);
  2983. hs.min = 0;
  2984. hs.max = 100;
  2985. hs.value = 50;
  2986. hs.tick = 1;
  2987. Laya.stage.addChild(hs);
  2988. };
  2989. ResDataControl.prototype.placeVSlider = function () {
  2990. var vs = new Laya.VSlider();
  2991. vs.skin = "res/ui/vslider.png";
  2992. vs.height = 300;
  2993. vs.pos(400, 50);
  2994. vs.min = 0;
  2995. vs.max = 100;
  2996. vs.value = 50;
  2997. vs.tick = 1;
  2998. Laya.stage.addChild(vs);
  2999. };
  3000. ResDataControl.prototype.update = function (dt) {
  3001. this._time += dt;
  3002. if (this._time > this.CheckInterval) //1分钟检查一次
  3003. {
  3004. if (ResourceControl_1.ResourceControl.Instance.running) //如果当前在加载中,延时1秒检测
  3005. {
  3006. this._time -= 1000;
  3007. return;
  3008. }
  3009. this.RefreshGroupRes();
  3010. this._time = 0;
  3011. }
  3012. };
  3013. /**
  3014. * 清理资源缓存(url)
  3015. * @param url 要清理的资源url
  3016. * @param isClear 对于缓存池中的数据,当引用为0时,是否直接强制清除( 如果为false,则等待缓存定时刷新时候再去判断 )
  3017. */
  3018. ResDataControl.prototype.RemoveResourcesByurl = function (url, isClear) {
  3019. if (isClear === void 0) { isClear = false; }
  3020. if (this.urlRes.hasOwnProperty(url)) {
  3021. if (isClear) {
  3022. Laya.loader.clearRes(url);
  3023. delete this.urlRes[url];
  3024. }
  3025. else {
  3026. this.urlRes[url]--;
  3027. }
  3028. }
  3029. else {
  3030. Laya.loader.clearRes(url);
  3031. }
  3032. };
  3033. ResDataControl.prototype.ClearLiveDataByPackName = function (pkgName) {
  3034. if (this.packageRes[pkgName]) {
  3035. var vo = this.packageRes[pkgName];
  3036. vo.clear();
  3037. delete this.packageRes[pkgName];
  3038. }
  3039. };
  3040. /**
  3041. * 添加ui包
  3042. * @param pkgname 包名
  3043. * @param isaddpackage 是否创建uipackage
  3044. * @param isCache 是否添加到组缓存中( 如果添加,则参与定时清理的逻辑,常驻资源请勿设置为ture )
  3045. */
  3046. ResDataControl.prototype.AddViewPackByName = function (pkgname, isaddpackage, isCache) {
  3047. if (isaddpackage === void 0) { isaddpackage = true; }
  3048. if (isCache === void 0) { isCache = true; }
  3049. if (isaddpackage) {
  3050. if (pkgname == "main") {
  3051. fairygui.UIPackage.addPackage(AssetPath_1.AssetPath.res + AssetPath_1.AssetPath.subpacksgeui + pkgname, pkgname);
  3052. }
  3053. else {
  3054. fairygui.UIPackage.addPackage(AssetPath_1.AssetPath.resources + AssetPath_1.AssetPath.ui + pkgname, pkgname);
  3055. }
  3056. }
  3057. this.AddLocalLiveData(pkgname, isCache);
  3058. };
  3059. /**
  3060. * 移除包
  3061. * @param pkgname 包名
  3062. * @param isclear 是否强制清除( 如果为false则等待定时器判断清理,如果为true则强制清除 )
  3063. */
  3064. ResDataControl.prototype.ClearPackByName = function (pkgname, isclear) {
  3065. if (isclear === void 0) { isclear = false; }
  3066. if (pkgname == "" || pkgname == null) {
  3067. return;
  3068. }
  3069. if (isclear) {
  3070. fairygui.UIPackage.removePackage(pkgname);
  3071. if (this.packageRes.hasOwnProperty(pkgname)) {
  3072. delete this.packageRes[pkgname];
  3073. }
  3074. }
  3075. else {
  3076. if (this.packageRes.hasOwnProperty(pkgname)) {
  3077. var vo = this.packageRes[pkgname];
  3078. if (vo) {
  3079. vo.ref--;
  3080. }
  3081. }
  3082. }
  3083. };
  3084. ResDataControl.prototype.RefreshGroupRes = function () {
  3085. var nowTime = Laya.Browser.now();
  3086. var s;
  3087. if (this.packageRes) {
  3088. var vo;
  3089. for (s in this.packageRes) {
  3090. vo = this.packageRes[s];
  3091. if (vo.ref <= 0 && (nowTime - vo.time) > this.ClearInterval) {
  3092. this.ClearPackByName(vo.packageName, true);
  3093. this.ClearLiveDataByPackName(vo.packageName);
  3094. }
  3095. }
  3096. }
  3097. //清理图片缓存
  3098. if (this.urlRes) {
  3099. var resourceurlPool = this.urlRes;
  3100. for (s in resourceurlPool) {
  3101. if (resourceurlPool[s] <= 0) {
  3102. this.RemoveResourcesByurl(s, true);
  3103. }
  3104. }
  3105. }
  3106. };
  3107. ResDataControl.prototype.onSkinLoaded = function () {
  3108. var tabA = this.createTab(this.skins[0]);
  3109. tabA.pos(40, 120);
  3110. tabA.labelColors = "#000000,#d3d3d3,#333333";
  3111. var tabB = this.createTab(this.skins[1]);
  3112. tabB.pos(40, 220);
  3113. tabB.labelColors = "#FFFFFF,#8FB299,#FFFFFF";
  3114. };
  3115. ResDataControl.prototype.createTab = function (skin) {
  3116. var tab = new Tab();
  3117. tab.skin = skin;
  3118. tab.labelBold = true;
  3119. tab.labelSize = 20;
  3120. tab.labelStrokeColor = "#000000";
  3121. tab.labels = "Tab Control 1,Tab Control 2,Tab Control 3";
  3122. tab.labelPadding = "0,0,0,0";
  3123. tab.selectedIndex = 1;
  3124. Laya.stage.addChild(tab);
  3125. return tab;
  3126. };
  3127. /******************************************************************* */
  3128. /**
  3129. * 获取已经加载过的数据
  3130. * @param url 资源url
  3131. * @param isCache 是否存储在缓存池中,默认为true
  3132. */
  3133. ResDataControl.prototype.GainResources = function (url, isCache) {
  3134. if (isCache === void 0) { isCache = true; }
  3135. if (isCache) {
  3136. if (this.urlRes[url] == null) {
  3137. this.urlRes[url] = 0;
  3138. }
  3139. this.urlRes[url]++;
  3140. }
  3141. return Laya.loader.getRes(url);
  3142. };
  3143. ResDataControl.prototype.AddLocalLiveData = function (pkgname, isCache) {
  3144. if (isCache && !this.NoLiveData.hasOwnProperty(pkgname)) {
  3145. var vo;
  3146. if (!this.packageRes.hasOwnProperty(pkgname)) {
  3147. vo = GamePool_1.GamePool.GetItem(LocalData_1.LocalData.ResDicValue);
  3148. vo.packageName = pkgname;
  3149. this.packageRes[pkgname] = vo;
  3150. }
  3151. else {
  3152. vo = this.packageRes[pkgname];
  3153. }
  3154. vo.ref++;
  3155. vo.time = Laya.Browser.now();
  3156. }
  3157. };
  3158. return ResDataControl;
  3159. }());
  3160. exports.ResDataControl = ResDataControl;
  3161. },{"../Config/AssetPath":15,"../Data/LocalData":30,"../PrefabControl/GamePool":45,"../Time/TimerService":57,"./ResourceControl":26}],26:[function(require,module,exports){
  3162. "use strict";
  3163. Object.defineProperty(exports, "__esModule", { value: true });
  3164. /*
  3165. * name;
  3166. */
  3167. var Handler = Laya.Handler;
  3168. var DispatcherManager_1 = require("../utils/DispatcherManager");
  3169. var RecConfigs_1 = require("../Config/RecConfigs");
  3170. var ResourceControl = /** @class */ (function (_super) {
  3171. __extends(ResourceControl, _super);
  3172. function ResourceControl() {
  3173. var _this = _super.call(this) || this;
  3174. _this._groupIndex = 0;
  3175. _this.running = false;
  3176. /**
  3177. * 要加载的总数量
  3178. */
  3179. _this._loadNum = 0;
  3180. /**
  3181. * 已经加载的数量
  3182. */
  3183. _this._loadedNum = 0;
  3184. _this._preloadNum = 0;
  3185. _this._cut = 0;
  3186. _this._nowLoadArr = null;
  3187. ResourceControl.ins = _this;
  3188. return _this;
  3189. }
  3190. Object.defineProperty(ResourceControl, "Instance", {
  3191. get: function () {
  3192. if (ResourceControl.ins == null) {
  3193. return new ResourceControl();
  3194. }
  3195. return ResourceControl.ins;
  3196. },
  3197. enumerable: true,
  3198. configurable: true
  3199. });
  3200. ResourceControl.prototype.init = function () {
  3201. this._configs = new Array();
  3202. this._groups = {};
  3203. Laya.loader.retryNum = 4;
  3204. Laya.loader.on(Laya.Event.ERROR, this, this.onError);
  3205. Laya.loader.on("errorsMsg", this, this.errorsMsghandler);
  3206. Laya.loader.on("gameerrorsMsg", this, this.gameerrorsMsghandler);
  3207. };
  3208. ResourceControl.prototype.onLoadConfigComplete = function () {
  3209. if (this._onConfigCompleteTarget != null && this._onConfigComplete != null) {
  3210. this._onConfigComplete.call(this._onConfigCompleteTarget);
  3211. }
  3212. };
  3213. ResourceControl.prototype.errorsMsghandler = function (msg) {
  3214. DispatcherManager_1.DispatcherManager.dispatchEvent("loadfailEvent", msg);
  3215. };
  3216. ResourceControl.prototype.gameerrorsMsghandler = function (msg) {
  3217. DispatcherManager_1.DispatcherManager.dispatchEvent("gameserrosEvent", msg);
  3218. };
  3219. /**
  3220. * 加载资源组
  3221. * @param groupName 组名
  3222. * @param onResourceLoadTarget 作用域
  3223. * @param ResourceLoadComplete 完成事件
  3224. * @param onResourceProgress 加载进度事件
  3225. * @param isShow 是否显示加载状态
  3226. */
  3227. ResourceControl.prototype.loadGroup = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3228. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3229. if (isShow === void 0) { isShow = true; }
  3230. if (args === void 0) { args = null; }
  3231. // Debuger.log(groupName);
  3232. var data = {};
  3233. data.complete = ResourceLoadComplete;
  3234. data.completeTarget = onResourceLoadTarget;
  3235. data.progress = onResourceProgress;
  3236. data.urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
  3237. data.isShow = isShow;
  3238. data.args = args;
  3239. data.type = "group";
  3240. data.resouseType = "2D";
  3241. this._configs.push(data);
  3242. this.loadStart();
  3243. };
  3244. /**
  3245. * 加载单个资源
  3246. * @param url 资源url
  3247. * @param type 资源类型
  3248. * @param onResourceLoadTarget 作用域
  3249. * @param ResourceLoadComplete 完成事件
  3250. * @param onResourceProgress 加载进度事件
  3251. * @param isShow 是否显示加载状态
  3252. */
  3253. ResourceControl.prototype.Loader = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3254. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3255. if (isShow === void 0) { isShow = true; }
  3256. if (args === void 0) { args = null; }
  3257. var data = {};
  3258. data.complete = ResourceLoadComplete;
  3259. data.completeTarget = onResourceLoadTarget;
  3260. data.progress = onResourceProgress;
  3261. data.urls = [{ url: url, type: type }];
  3262. data.isShow = isShow;
  3263. data.args = args;
  3264. data.type = "single";
  3265. data.resouseType = "2D";
  3266. this._configs.push(data);
  3267. this.loadStart();
  3268. };
  3269. /**
  3270. * 加载数组资源
  3271. * @param urls
  3272. * @param onResourceLoadTarget
  3273. * @param ResourceLoadComplete
  3274. * @param onResourceProgress
  3275. * @param isShow
  3276. */
  3277. ResourceControl.prototype.Loaders = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3278. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3279. if (isShow === void 0) { isShow = true; }
  3280. if (args === void 0) { args = null; }
  3281. var data = {};
  3282. data.complete = ResourceLoadComplete;
  3283. data.completeTarget = onResourceLoadTarget;
  3284. data.progress = onResourceProgress;
  3285. data.urls = urls;
  3286. data.isShow = isShow;
  3287. data.type = "arr";
  3288. data.args = args;
  3289. data.resouseType = "2D";
  3290. this._configs.push(data);
  3291. this.loadStart();
  3292. };
  3293. /**
  3294. * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 )
  3295. * @param urls
  3296. * @param onResourceLoadTarget
  3297. * @param ResourceLoadComplete
  3298. * @param onResourceProgress
  3299. * @param isShow
  3300. */
  3301. ResourceControl.prototype.loaderArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, cut) {
  3302. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3303. if (cut === void 0) { cut = 3; }
  3304. var data = {};
  3305. data.complete = ResourceLoadComplete;
  3306. data.completeTarget = onResourceLoadTarget;
  3307. data.progress = onResourceProgress;
  3308. data.urls = urls;
  3309. data.isShow = false;
  3310. data.type = "loaderArr";
  3311. data.cut = cut;
  3312. data.resouseType = "2D";
  3313. this._configs.push(data);
  3314. this.startLoad1();
  3315. };
  3316. ResourceControl.prototype.startLoad1 = function () {
  3317. if (!this.running && this._configs.length > 0) {
  3318. this._nowLoadData = this._configs.shift();
  3319. this._nowLoadArr = this._nowLoadData.urls.concat().reverse();
  3320. this._loadNum = this._nowLoadArr.length;
  3321. this._loadedNum = 0;
  3322. this._preloadNum = this._loadedNum;
  3323. this._cut = Number(this._nowLoadData.cut);
  3324. this.loadStart1();
  3325. }
  3326. };
  3327. ResourceControl.prototype.loadStart1 = function () {
  3328. if (this.running) {
  3329. return;
  3330. }
  3331. if (this._nowLoadArr && this._nowLoadArr.length > 0) {
  3332. this.running = true;
  3333. var needArr;
  3334. if (this._nowLoadArr.length > this._cut) {
  3335. needArr = this._nowLoadArr.splice(0, this._cut);
  3336. }
  3337. else {
  3338. needArr = this._nowLoadArr.splice(0);
  3339. }
  3340. this._cut = needArr.length;
  3341. this._preloadNum = this._loadedNum;
  3342. this.onLoadingArr(0);
  3343. var resouseType = this._nowLoadData.resouseType;
  3344. if (resouseType == "2D" || resouseType == null) {
  3345. Laya.loader.load(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false));
  3346. }
  3347. else {
  3348. Laya.loader.create(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false));
  3349. }
  3350. }
  3351. else {
  3352. this._nowLoadData = null;
  3353. this.startLoad1();
  3354. }
  3355. };
  3356. ResourceControl.prototype.onLoadingArr = function (value) {
  3357. this._loadedNum = this._preloadNum + value * this._cut;
  3358. if (this._nowLoadData) {
  3359. var allvalue = Math.ceil((this._loadedNum / this._loadNum) * 100);
  3360. if (this._nowLoadData.progress != null) {
  3361. this._nowLoadData.progress.call(this._nowLoadData.completeTarget, allvalue, Math.floor(value * 100));
  3362. }
  3363. }
  3364. };
  3365. ResourceControl.prototype.onLoadCompleteArr = function () {
  3366. this.onLoadingArr(1);
  3367. this._loadedNum = this._preloadNum + this._cut;
  3368. this.running = false;
  3369. if (this._loadedNum == this._loadNum) {
  3370. if (this._nowLoadData && this._nowLoadData.complete) {
  3371. this._nowLoadData.complete.call(this._nowLoadData.completeTarget);
  3372. }
  3373. }
  3374. Laya.timer.callLater(this, this.loadStart1);
  3375. // this.loadStart1();
  3376. };
  3377. ResourceControl.prototype.loadStart = function () {
  3378. if (this.running || this._configs.length == 0) {
  3379. return;
  3380. }
  3381. this.running = true;
  3382. this._nowLoadData = this._configs[0];
  3383. var arr = this._nowLoadData.urls;
  3384. var isShow = this._nowLoadData.isShow;
  3385. if (isShow) {
  3386. fairygui.GRoot.inst.showModalWait();
  3387. }
  3388. var resouseType = this._nowLoadData.resouseType;
  3389. if (arr != null) {
  3390. if (resouseType == "2D" || resouseType == null) {
  3391. Laya.loader.load(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false));
  3392. }
  3393. else {
  3394. Laya.loader.create(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false));
  3395. }
  3396. }
  3397. };
  3398. // 加载进度侦听器
  3399. ResourceControl.prototype.onLoading = function (progress) {
  3400. if (this._nowLoadData) {
  3401. progress = Math.ceil(Number(progress * 100));
  3402. if (this._nowLoadData.progress != null) {
  3403. this._nowLoadData.progress.call(this._nowLoadData.completeTarget, progress);
  3404. }
  3405. }
  3406. };
  3407. ResourceControl.prototype.onLoadComplete = function (args) {
  3408. if (args === void 0) { args = null; }
  3409. fairygui.GRoot.inst.closeModalWait();
  3410. if (this._nowLoadData && this._nowLoadData.complete) {
  3411. if (this._nowLoadData.args) {
  3412. this._nowLoadData.complete.call(this._nowLoadData.completeTarget, this._nowLoadData.args);
  3413. }
  3414. else {
  3415. this._nowLoadData.complete.call(this._nowLoadData.completeTarget);
  3416. }
  3417. }
  3418. this.running = false;
  3419. this._nowLoadData = null;
  3420. this._configs.shift();
  3421. this.loadStart();
  3422. };
  3423. ResourceControl.prototype.onError = function (err) {
  3424. fairygui.GRoot.inst.closeModalWait();
  3425. };
  3426. /**
  3427. * 加载3D单个资源
  3428. * @param url 资源url
  3429. * @param type 资源类型
  3430. * @param onResourceLoadTarget 作用域
  3431. * @param ResourceLoadComplete 完成事件
  3432. * @param onResourceProgress 加载进度事件
  3433. * @param isShow 是否显示加载状态
  3434. */
  3435. ResourceControl.prototype.Loader3D = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow) {
  3436. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3437. if (isShow === void 0) { isShow = true; }
  3438. var data = {};
  3439. data.complete = ResourceLoadComplete;
  3440. data.completeTarget = onResourceLoadTarget;
  3441. data.progress = onResourceProgress;
  3442. data.urls = [{ url: url, type: type }];
  3443. data.isShow = isShow;
  3444. data.type = "single";
  3445. data.resouseType = "3D";
  3446. this._configs.push(data);
  3447. this.loadStart();
  3448. };
  3449. /**
  3450. * 加载3D资源组
  3451. * @param groupName 组名
  3452. * @param onResourceLoadTarget 作用域
  3453. * @param ResourceLoadComplete 完成事件
  3454. * @param onResourceProgress 加载进度事件
  3455. * @param isShow 是否显示加载状态
  3456. */
  3457. ResourceControl.prototype.loadGroup3D = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3458. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3459. if (isShow === void 0) { isShow = true; }
  3460. if (args === void 0) { args = null; }
  3461. var data = {};
  3462. data.complete = ResourceLoadComplete;
  3463. data.completeTarget = onResourceLoadTarget;
  3464. data.progress = onResourceProgress;
  3465. data.urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
  3466. data.isShow = isShow;
  3467. data.args = args;
  3468. data.type = "group";
  3469. data.resouseType = "3D";
  3470. this._configs.push(data);
  3471. this.loadStart();
  3472. };
  3473. /**
  3474. * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 )
  3475. * @param urls
  3476. * @param onResourceLoadTarget
  3477. * @param ResourceLoadComplete
  3478. * @param onResourceProgress
  3479. * @param isShow
  3480. */
  3481. ResourceControl.prototype.loader3DArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isshow, args) {
  3482. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3483. if (isshow === void 0) { isshow = false; }
  3484. if (args === void 0) { args = null; }
  3485. var data = {};
  3486. data.complete = ResourceLoadComplete;
  3487. data.completeTarget = onResourceLoadTarget;
  3488. data.progress = onResourceProgress;
  3489. data.urls = urls;
  3490. data.isShow = isshow;
  3491. data.args = args;
  3492. data.type = "loaderArr";
  3493. data.resouseType = "3D";
  3494. this._configs.push(data);
  3495. this.loadStart();
  3496. };
  3497. /**
  3498. * 加载特效
  3499. * @param groupName
  3500. * @param onResourceLoadTarget
  3501. * @param ResourceLoadComplete
  3502. * @param args
  3503. */
  3504. ResourceControl.prototype.loadEffect = function (groupName, onResourceLoadTarget, ResourceLoadComplete, args) {
  3505. if (args === void 0) { args = null; }
  3506. var urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
  3507. if (urls && urls.length > 0) {
  3508. Laya.loader.load(urls, Handler.create(onResourceLoadTarget, ResourceLoadComplete, [args]));
  3509. }
  3510. };
  3511. return ResourceControl;
  3512. }(Laya.EventDispatcher));
  3513. exports.ResourceControl = ResourceControl;
  3514. },{"../Config/RecConfigs":16,"../utils/DispatcherManager":83}],27:[function(require,module,exports){
  3515. "use strict";
  3516. Object.defineProperty(exports, "__esModule", { value: true });
  3517. var LayoutControl_1 = require("./LayoutControl");
  3518. var AssetPath_1 = require("../Config/AssetPath");
  3519. var CameraManager_1 = require("../Game/CameraManager");
  3520. var PropManager_1 = require("../PrefabControl/PropManager");
  3521. var Player_1 = require("../Game/Player");
  3522. var DispatcherManager_1 = require("../utils/DispatcherManager");
  3523. var GameState_1 = require("../utils/GameState");
  3524. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  3525. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  3526. var GameUtils_1 = require("../utils/GameUtils");
  3527. var NpcCFG_1 = require("../CFG/NpcCFG");
  3528. var NpcScript_1 = require("../Game/NpcScript");
  3529. var ResourceControl_1 = require("./ResourceControl");
  3530. var GameCFG_1 = require("../CFG/GameCFG");
  3531. var CharacterState_1 = require("../PrefabControl/CharacterState");
  3532. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  3533. var CharacterPool_1 = require("../PrefabControl/CharacterPool");
  3534. var Sprite = Laya.Sprite;
  3535. var Event = Laya.Event;
  3536. var SceneControl = /** @class */ (function () {
  3537. function SceneControl() {
  3538. this._initPosY = 1;
  3539. this.index = 0;
  3540. this.preRadian = 0;
  3541. SceneControl.ins = this;
  3542. }
  3543. Object.defineProperty(SceneControl, "Instance", {
  3544. get: function () {
  3545. if (SceneControl.ins == null) {
  3546. return new SceneControl();
  3547. }
  3548. return SceneControl.ins;
  3549. },
  3550. enumerable: true,
  3551. configurable: true
  3552. });
  3553. //创建主角
  3554. SceneControl.prototype.CreatePlayer = function (rolecfg) {
  3555. var iscreate = false;
  3556. if (!PropManager_1.PropManager.mainRole) {
  3557. iscreate = true;
  3558. }
  3559. else if (PropManager_1.PropManager.mainRole.name != "Character" + rolecfg.name) {
  3560. iscreate = true;
  3561. this.ClearMomentCharacter();
  3562. }
  3563. if (iscreate) {
  3564. // var sp:Laya.Sprite3D = Laya.Loader.getRes(AssetPath.get3DRoleModel(RoleData.roleCfg.name)) as Laya.Sprite3D;
  3565. // PropManager.mainRole = Laya.Sprite3D.instantiate(sp, PropManager.scene3D, false,new Laya.Vector3( 0,0,0 )) as Laya.Sprite3D;
  3566. PropManager_1.PropManager.mainRole = CharacterPool_1.CharacterPool.AddCharacter(rolecfg.name, Player_1.Player, PropManager_1.PropManager.scene3D);
  3567. PropManager_1.PropManager.mainRole.name = "Character" + rolecfg.name;
  3568. this.PlayerScript = PropManager_1.PropManager.mainRole.getComponent(Player_1.Player);
  3569. // this.mainRoleScript.resouseName = RoleData.roleCfg.name;
  3570. // if( )
  3571. // this.mainRoleScript = PropManager.mainRole.addComponent( MainRAoleScript );
  3572. }
  3573. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3574. var RoleData = agencyusermessage.RoleData;
  3575. var info = RoleData.levelcfg.roleinitpos;
  3576. var chidarr = GameUtils_1.GameUtils.cutstrtoArr(info.offsetPos);
  3577. var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2]));
  3578. var posVec = new Laya.Vector3;
  3579. var selectVec;
  3580. if (info.initbuild == "startpanel") {
  3581. posVec.x = PropManager_1.PropManager.startPlane.transform.position.x + offsetPos.x;
  3582. posVec.y = PropManager_1.PropManager.startPlane.transform.position.y + offsetPos.y;
  3583. posVec.z = PropManager_1.PropManager.startPlane.transform.position.z + offsetPos.z;
  3584. selectVec = PropManager_1.PropManager.startPlane.getChildByName("child_pos").transform.position;
  3585. }
  3586. else {
  3587. var childpos = PropManager_1.PropManager.getPosVecbyScene(RoleData.levelmapArr[0], info.initbuild);
  3588. posVec.x = childpos.x + offsetPos.x;
  3589. posVec.y = childpos.y + offsetPos.y;
  3590. posVec.z = childpos.z + offsetPos.z;
  3591. selectVec = childpos;
  3592. }
  3593. PropManager_1.PropManager.mainRole.transform.position = posVec;
  3594. this.cameraScript.SetCameraPosition(PropManager_1.PropManager.mainRole.transform.position);
  3595. this.PlayerScript.setnowSelectVec(selectVec);
  3596. this.PlayerScript.nowAction = CharacterState_1.CharacterState.stand;
  3597. this.PlayerScript.PlayAnimator(CharacterState_1.CharacterState.stand);
  3598. // var UIPos = PropManager.mainRole.transform.position;
  3599. // var NAMEUI = new Laya.Text();
  3600. // NAMEUI.text = "自己";
  3601. // NAMEUI.fontSize = 60;
  3602. // NAMEUI.color = "#ffffff";
  3603. // NAMEUI.scaleX = 0.5;
  3604. // NAMEUI.scaleY = 0.5;
  3605. // NAMEUI.align = "center";
  3606. // NAMEUI.valign = "middle";
  3607. // Laya.stage.addChild(NAMEUI);
  3608. // Laya.timer.frameLoop(1, this, () => {
  3609. // let ScreenPos = new Laya.Vector3();
  3610. // PropManager.carma.worldToViewportPoint(UIPos, ScreenPos);
  3611. // NAMEUI.pos(ScreenPos.x, ScreenPos.y);
  3612. // })
  3613. };
  3614. //创建npc
  3615. SceneControl.prototype.createNpc = function () {
  3616. console.log("CreatNpc---");
  3617. this.ClearNpc();
  3618. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3619. var RoleData = agencyusermessage.RoleData;
  3620. var arr = RoleData.levelcfg.npc;
  3621. var childdict;
  3622. var index = 0;
  3623. PropManager_1.PropManager.npcnum = arr.length;
  3624. for (var s in arr) {
  3625. childdict = arr[s];
  3626. var selectVec = null;
  3627. var npccfg = NpcCFG_1.default.dict[childdict.id];
  3628. var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DRoleModel(npccfg.name));
  3629. var chidarr = GameUtils_1.GameUtils.cutstrtoArr(childdict.offsetPos);
  3630. var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2]));
  3631. var posVec = new Laya.Vector3;
  3632. if (childdict.scene == "startpanel") {
  3633. posVec.x = PropManager_1.PropManager.startPlane.transform.position.x + offsetPos.x;
  3634. posVec.y = PropManager_1.PropManager.startPlane.transform.position.y + 1 + offsetPos.y;
  3635. posVec.z = PropManager_1.PropManager.startPlane.transform.position.z + offsetPos.z;
  3636. selectVec = PropManager_1.PropManager.startPlane.getChildByName("child_pos").transform.position;
  3637. }
  3638. else {
  3639. var childpos = PropManager_1.PropManager.getPosVecbyScene(childdict.scene, childdict.initbuild);
  3640. posVec.x = childpos.x + offsetPos.x;
  3641. posVec.y = childpos.y + offsetPos.y;
  3642. posVec.z = childpos.z + offsetPos.z;
  3643. selectVec = childpos;
  3644. }
  3645. var npcsp = CharacterPool_1.CharacterPool.AddCharacter(npccfg.name, NpcScript_1.NpcScript, PropManager_1.PropManager.scene3D);
  3646. npcsp.name = "npc_" + index;
  3647. npcsp.transform.position = posVec;
  3648. var npcscript = npcsp.getComponent(NpcScript_1.NpcScript);
  3649. npcscript.setnowSelectVec(selectVec);
  3650. npcscript.npcinfo(npccfg);
  3651. PropManager_1.PropManager.npcDict[npcsp.name] = npcsp;
  3652. PropManager_1.PropManager.npcscriptDict[npcsp.name] = npcscript;
  3653. npcscript.PlayAnimator(CharacterState_1.CharacterState.stand);
  3654. index++;
  3655. // this.ShowUI(npcsp);
  3656. }
  3657. console.log("CreatNpc2---");
  3658. };
  3659. SceneControl.prototype.ShowUI = function (_sprite) {
  3660. var UIPos = _sprite.transform.position;
  3661. var NAMEUI = new Laya.Text();
  3662. var random = GameUtils_1.GameUtils.randRangeint(1, 30);
  3663. NAMEUI.text = "npc_" + this.index;
  3664. NAMEUI.fontSize = 60;
  3665. NAMEUI.color = "#ffffff";
  3666. NAMEUI.scaleX = 0.5;
  3667. NAMEUI.scaleY = 0.5;
  3668. NAMEUI.align = "center";
  3669. NAMEUI.valign = "middle";
  3670. Laya.stage.addChild(NAMEUI);
  3671. Laya.timer.frameLoop(1, this, function () {
  3672. var ScreenPos = new Laya.Vector3();
  3673. PropManager_1.PropManager.carma.worldToViewportPoint(UIPos, ScreenPos);
  3674. NAMEUI.pos(ScreenPos.x, ScreenPos.y + 20);
  3675. });
  3676. this.index++;
  3677. };
  3678. SceneControl.prototype.ShowTheGameScene = function () {
  3679. var pathArr = [];
  3680. var urlArr = [];
  3681. this.cameraScript.iscanfollow = true;
  3682. var roleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
  3683. var arr = roleData.levelmapArr;
  3684. var i = 0;
  3685. for (i = 0; i < arr.length; i++) {
  3686. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DModel(arr[i])) == -1) {
  3687. urlArr.push(AssetPath_1.AssetPath.get3DModel(arr[i]));
  3688. }
  3689. }
  3690. var npcArr = roleData.levelcfg.npc;
  3691. for (i = 0; i < npcArr.length; i++) {
  3692. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) {
  3693. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name));
  3694. }
  3695. }
  3696. for (i = 0; i < urlArr.length; i++) {
  3697. pathArr.push({ url: urlArr[i] });
  3698. }
  3699. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.SceneCreatComplete, null, true);
  3700. };
  3701. SceneControl.prototype.SceneCreatComplete = function () {
  3702. this.RefreshTerrain();
  3703. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3704. var RoleData = agencyusermessage.RoleData;
  3705. this.CreatePlayer(RoleData.roleCfg);
  3706. this.createNpc();
  3707. };
  3708. SceneControl.prototype.ListenOnEvent = function () {
  3709. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.start, this, this.EnterGame);
  3710. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.jump, this, this.Jump);
  3711. DispatcherManager_1.DispatcherManager.addEventListener(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid, this, this.RefreshCharacterModel);
  3712. };
  3713. SceneControl.prototype.CharacterLoadEnd = function (url) {
  3714. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3715. var RoleData = agencyusermessage.RoleData;
  3716. if (AssetPath_1.AssetPath.get3DModel(RoleData.roleCfg.name) == url) {
  3717. this.CreatePlayer(RoleData.roleCfg);
  3718. }
  3719. };
  3720. SceneControl.prototype.Jump = function () {
  3721. this.PlayerScript.TestJump();
  3722. };
  3723. /************************************************************** */
  3724. SceneControl.prototype.setup = function () {
  3725. this.createSprite();
  3726. Laya.stage.on(Event.MOUSE_UP, this, this.onMouseUp);
  3727. Laya.stage.on(Event.MOUSE_OUT, this, this.onMouseUp);
  3728. };
  3729. SceneControl.prototype.createSprite = function () {
  3730. this.sp = new Sprite();
  3731. var w = 200, h = 300;
  3732. this.sp.graphics.drawRect(0, 0, w, h, "#FF7F50");
  3733. this.sp.size(w, h);
  3734. this.sp.pivot(w / 2, h / 2);
  3735. this.sp.pos(Laya.stage.width / 2, Laya.stage.height / 2);
  3736. Laya.stage.addChild(this.sp);
  3737. this.sp.on(Event.MOUSE_DOWN, this, this.onMouseDown);
  3738. };
  3739. SceneControl.prototype.onMouseDown = function (e) {
  3740. var touches = e.touches;
  3741. if (touches && touches.length == 2) {
  3742. this.preRadian = Math.atan2(touches[0].stageY - touches[1].stageY, touches[0].stageX - touches[1].stageX);
  3743. Laya.stage.on(Event.MOUSE_MOVE, this, this.onMouseMove);
  3744. }
  3745. };
  3746. SceneControl.prototype.onMouseMove = function (e) {
  3747. var touches = e.touches;
  3748. if (touches && touches.length == 2) {
  3749. var nowRadian = Math.atan2(touches[0].stageY - touches[1].stageY, touches[0].stageX - touches[1].stageX);
  3750. this.sp.rotation += 180 / Math.PI * (nowRadian - this.preRadian);
  3751. this.preRadian = nowRadian;
  3752. }
  3753. };
  3754. SceneControl.prototype.onMouseUp = function (e) {
  3755. Laya.stage.off(Event.MOUSE_MOVE, this, this.onMouseMove);
  3756. };
  3757. /********************************** */
  3758. SceneControl.prototype.EnterGame = function (jiasu) {
  3759. this.PlayerScript.startRun(jiasu);
  3760. var npcdict = PropManager_1.PropManager.npcscriptDict;
  3761. for (var s in npcdict) {
  3762. var npcscript = npcdict[s];
  3763. npcscript.startRun();
  3764. }
  3765. };
  3766. SceneControl.prototype.ClearMomentCharacter = function () {
  3767. if (PropManager_1.PropManager.mainRole && this.PlayerScript) {
  3768. CharacterPool_1.CharacterPool.ClearCharacter(PropManager_1.PropManager.mainRole, this.PlayerScript.resouseName, this.PlayerScript);
  3769. this.PlayerScript = null;
  3770. PropManager_1.PropManager.mainRole = null;
  3771. }
  3772. };
  3773. SceneControl.prototype.SetScene = function () {
  3774. var backgroundParent = LayoutControl_1.LayoutControl.Instance.background.displayObject;
  3775. var scenebg = fairygui.UIPackage.createObject("main", "gambg");
  3776. scenebg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  3777. LayoutControl_1.LayoutControl.Instance.background.addChild(scenebg);
  3778. // UiManager.instance.add( GameBgView,null,LayerNotify.LAYER_BACKGROUND );
  3779. //添加3D场景
  3780. PropManager_1.PropManager.scene3D = backgroundParent.addChild(new Laya.Scene3D());
  3781. PropManager_1.PropManager.scene3D.physicsSimulation.continuousCollisionDetection = true;
  3782. //添加照相机
  3783. PropManager_1.PropManager.carma = (PropManager_1.PropManager.scene3D.addChild(new Laya.Camera(0, 0.1, 70)));
  3784. this.cameraScript = PropManager_1.PropManager.carma.addComponent(CameraManager_1.CameraManager);
  3785. PropManager_1.PropManager.carma.clearFlag = Laya.BaseCamera.CLEARFLAG_DEPTHONLY;
  3786. //添加方向光
  3787. var directionLight = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("DirectionalLight")); //PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  3788. PropManager_1.PropManager.scene3D.addChild(directionLight);
  3789. // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  3790. // var directionLight: Laya.DirectionLight = PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  3791. // directionLight.color = new Laya.Vector3(1,1,1);
  3792. // directionLight.intensity = 0.5;
  3793. // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  3794. PropManager_1.PropManager.startPlane = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("startpanel"));
  3795. PropManager_1.PropManager.scene3D.addChild(PropManager_1.PropManager.startPlane);
  3796. PropManager_1.PropManager.endPlane = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("endpanel"));
  3797. PropManager_1.PropManager.scene3D.addChild(PropManager_1.PropManager.endPlane);
  3798. // PropManager.bgsprite3d = Laya.Loader.getRes(AssetPath.get3DModel("distantview"));
  3799. // PropManager.scene3D.addChild(PropManager.bgsprite3d);
  3800. //雾化代码
  3801. PropManager_1.PropManager.scene3D.enableFog = true;
  3802. //设置雾化的颜色
  3803. var fogArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[2].value);
  3804. if (GameCFG_1.default.dict[8]) {
  3805. var wucolor = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[8].value);
  3806. PropManager_1.PropManager.scene3D.fogColor = new Laya.Vector3(Number(wucolor[0]), Number(wucolor[1]), Number(wucolor[2]));
  3807. }
  3808. else {
  3809. PropManager_1.PropManager.scene3D.fogColor = new Laya.Vector3(0, 0, 0.6);
  3810. }
  3811. //设置雾化的起始位置,相对于相机的距离
  3812. var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[3].value);
  3813. PropManager_1.PropManager.scene3D.fogStart = Number(valueArr[0]);
  3814. //设置雾化最浓处的距离。
  3815. PropManager_1.PropManager.scene3D.fogRange = Number(valueArr[1]);
  3816. this.ShowTheGameScene();
  3817. this.ListenOnEvent();
  3818. };
  3819. /**清除所有NPC */
  3820. SceneControl.prototype.ClearNpc = function () {
  3821. var npcdict = PropManager_1.PropManager.npcDict;
  3822. var s;
  3823. for (s in npcdict) {
  3824. var sp = npcdict[s];
  3825. var npcscript = PropManager_1.PropManager.npcscriptDict[s];
  3826. var resousename = npcscript.resouseName;
  3827. CharacterPool_1.CharacterPool.ClearCharacter(sp, resousename, npcscript);
  3828. delete PropManager_1.PropManager.npcscriptDict[s];
  3829. delete npcdict[s];
  3830. }
  3831. };
  3832. SceneControl.prototype.Pattern = function (mapSprite3D) {
  3833. console.log("Pattern1----");
  3834. if (PropManager_1.PropManager.patternDict[mapSprite3D.name]) {
  3835. delete PropManager_1.PropManager.patternDict[mapSprite3D.name];
  3836. }
  3837. var BlocksSprite = mapSprite3D.getChildByName("Blocks");
  3838. var chiddict = {};
  3839. var chidsp;
  3840. var buildSp;
  3841. var index = 0;
  3842. while (BlocksSprite.getChildByName("build_all_" + index)) {
  3843. buildSp = BlocksSprite.getChildByName("build_all_" + index);
  3844. chidsp = buildSp.getChildByName("child_pos");
  3845. chiddict["build_all_" + index] = chidsp.transform.position;
  3846. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3847. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3848. }
  3849. index++;
  3850. }
  3851. index = 0;
  3852. while (BlocksSprite.getChildByName("build_front_" + index)) {
  3853. buildSp = BlocksSprite.getChildByName("build_front_" + index);
  3854. chidsp = buildSp.getChildByName("child_pos");
  3855. chiddict["build_front_" + index] = chidsp.transform.position;
  3856. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3857. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3858. }
  3859. index++;
  3860. }
  3861. index = 0;
  3862. while (BlocksSprite.getChildByName("build_left_" + index)) {
  3863. buildSp = BlocksSprite.getChildByName("build_left_" + index);
  3864. chidsp = buildSp.getChildByName("child_pos");
  3865. chiddict["build_left_" + index] = chidsp.transform.position;
  3866. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3867. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3868. }
  3869. index++;
  3870. }
  3871. index = 0;
  3872. while (BlocksSprite.getChildByName("build_right_" + index)) {
  3873. buildSp = BlocksSprite.getChildByName("build_right_" + index);
  3874. chidsp = buildSp.getChildByName("child_pos");
  3875. chiddict["build_right_" + index] = chidsp.transform.position;
  3876. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3877. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3878. }
  3879. index++;
  3880. }
  3881. index = 0;
  3882. while (BlocksSprite.getChildByName("build_frontleft_" + index)) {
  3883. buildSp = BlocksSprite.getChildByName("build_frontleft_" + index);
  3884. chidsp = buildSp.getChildByName("child_pos");
  3885. chiddict["build_frontleft_" + index] = chidsp.transform.position;
  3886. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3887. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3888. }
  3889. index++;
  3890. }
  3891. index = 0;
  3892. while (BlocksSprite.getChildByName("build_frontright_" + index)) {
  3893. buildSp = BlocksSprite.getChildByName("build_frontright_" + index);
  3894. chidsp = buildSp.getChildByName("child_pos");
  3895. chiddict["build_frontright_" + index] = chidsp.transform.position;
  3896. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3897. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3898. }
  3899. index++;
  3900. }
  3901. index = 0;
  3902. while (BlocksSprite.getChildByName("build_leftright_" + index)) {
  3903. buildSp = BlocksSprite.getChildByName("build_leftright_" + index);
  3904. chidsp = buildSp.getChildByName("child_pos");
  3905. chiddict["build_leftright_" + index] = chidsp.transform.position;
  3906. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3907. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3908. }
  3909. index++;
  3910. }
  3911. index = 0;
  3912. var Props = mapSprite3D.getChildByName("Props");
  3913. while (Props.getChildByName("Scaffolding_" + index)) {
  3914. chidsp = Props.getChildByName("Scaffolding_" + index).getChildByName("child_pos");
  3915. chiddict["Scaffolding_" + index] = chidsp.transform.position;
  3916. index++;
  3917. }
  3918. index = 0;
  3919. while (Props.getChildByName("grilling_" + index)) {
  3920. chidsp = Props.getChildByName("grilling_" + index).getChildByName("child_pos");
  3921. chiddict["grilling_" + index] = chidsp.transform.position;
  3922. index++;
  3923. }
  3924. index = 0;
  3925. var jumpchildSp;
  3926. var iscreatejt = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData.LevelID < 3 ? true : false;
  3927. while (Props.getChildByName("JumpBoost_" + index)) {
  3928. jumpchildSp = Props.getChildByName("JumpBoost_" + index);
  3929. if (iscreatejt) {
  3930. var pos = jumpchildSp.transform.position.clone();
  3931. pos.y += 3;
  3932. var jiantou = Laya.Sprite3D.instantiate(Laya.loader.getRes(AssetPath_1.AssetPath.get3DRoleModel("Arrow")), PropManager_1.PropManager.scene3D, false, pos);
  3933. PropManager_1.PropManager.jiantouArr.push(jiantou);
  3934. }
  3935. index++;
  3936. }
  3937. PropManager_1.PropManager.patternDict[mapSprite3D.name] = chiddict;
  3938. console.log("Pattern2----");
  3939. };
  3940. /***************************************************** */
  3941. SceneControl.prototype.onSpriteClick = function (e) {
  3942. var randomAngle = Math.random() * 180;
  3943. //发送自定义事件
  3944. // this.sp.event(Interaction_CustomEvent.ROTATE, [randomAngle]);
  3945. };
  3946. // 触发自定义的rotate事件
  3947. SceneControl.prototype.onRotate = function (newAngle) {
  3948. Laya.Tween.to(this.sp, { "rotation": newAngle }, 1000, Laya.Ease.elasticOut);
  3949. };
  3950. /***************************************************** */
  3951. SceneControl.prototype.RefreshCharacterModel = function () {
  3952. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3953. var RoleData = agencyusermessage.RoleData;
  3954. var pathArr = [];
  3955. pathArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(RoleData.roleCfg.name) });
  3956. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.CharacterLoadEnd, null, true, AssetPath_1.AssetPath.get3DModel(RoleData.roleCfg.name));
  3957. };
  3958. /*********更新地形 */
  3959. SceneControl.prototype.RefreshTerrain = function () {
  3960. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3961. var RoleData = agencyusermessage.RoleData;
  3962. var nowlevelcfg = RoleData.levelcfg;
  3963. var mapArr = RoleData.levelmapArr;
  3964. var mapSprite3D;
  3965. var mapname;
  3966. var _lastmapSprite3D;
  3967. for (var s in PropManager_1.PropManager.nowmapDict) {
  3968. PropManager_1.PropManager.nowmapDict[s].active = false;
  3969. }
  3970. for (var i = 0; i < mapArr.length; i++) {
  3971. mapname = mapArr[i];
  3972. console.log("mapname1----", mapname);
  3973. if (PropManager_1.PropManager.nowmapDict[mapname]) {
  3974. mapSprite3D = PropManager_1.PropManager.nowmapDict[mapname];
  3975. mapSprite3D.active = true;
  3976. }
  3977. else {
  3978. console.log("mapname2----", mapname);
  3979. var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel(mapname));
  3980. console.log("mapname3----", mapname);
  3981. mapSprite3D = Laya.Sprite3D.instantiate(sp, PropManager_1.PropManager.scene3D, false, null);
  3982. console.log("mapname4----", mapname);
  3983. PropManager_1.PropManager.nowmapDict[mapname] = mapSprite3D;
  3984. console.log("mapname5----", mapname);
  3985. }
  3986. if (i == 0) {
  3987. var arr = GameUtils_1.GameUtils.cutstrtoArr(nowlevelcfg.firstScenepos);
  3988. mapSprite3D.transform.position = new Laya.Vector3(Number(arr[0]), Number(arr[1]), Number(arr[2]));
  3989. }
  3990. else {
  3991. var endPos = _lastmapSprite3D.getChildByName("END").transform.position.clone();
  3992. endPos.x = 0;
  3993. endPos.y = 0;
  3994. mapSprite3D.transform.position = endPos;
  3995. }
  3996. this.Pattern(mapSprite3D);
  3997. _lastmapSprite3D = mapSprite3D;
  3998. var endPos1 = mapSprite3D.getChildByName("END").transform.position.clone();
  3999. endPos1.z += Number(GameCFG_1.default.dict[6].value);
  4000. PropManager_1.PropManager.endPlane.transform.position = endPos1;
  4001. PropManager_1.PropManager.gamewinPosZ = endPos1.z;
  4002. PropManager_1.PropManager.gamewinPosZ -= 2;
  4003. // PropManager.bgsprite3d.transform.position = new Laya.Vector3( 0,-20,-40 );
  4004. }
  4005. };
  4006. /*使用界面显示,0:砸蛋,1:宝箱*/
  4007. SceneControl.EggGGroup = 0;
  4008. /**签到是否正在显示 */
  4009. SceneControl.IsShowSign = false;
  4010. return SceneControl;
  4011. }());
  4012. exports.SceneControl = SceneControl;
  4013. },{"../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){
  4014. "use strict";
  4015. Object.defineProperty(exports, "__esModule", { value: true });
  4016. var GamePool_1 = require("../PrefabControl/GamePool");
  4017. var ComponentEventData = /** @class */ (function () {
  4018. function ComponentEventData() {
  4019. }
  4020. ComponentEventData.prototype.listenKeyboard = function () {
  4021. this.keyDownList = [];
  4022. //添加键盘按下事件,一直按着某按键则会不断触发
  4023. Laya.stage.on(Laya.Event.KEY_DOWN, this, this.onKeyDown);
  4024. //添加键盘抬起事件
  4025. Laya.stage.on(Laya.Event.KEY_UP, this, this.onKeyUp);
  4026. };
  4027. /**键盘按下处理*/
  4028. ComponentEventData.prototype.onKeyDown = function (e) {
  4029. var keyCode = e["keyCode"];
  4030. this.keyDownList[keyCode] = true;
  4031. };
  4032. ComponentEventData.prototype.clear = function () {
  4033. this.target = null;
  4034. this.type = null;
  4035. this.thisObject = null;
  4036. this.listener = null;
  4037. GamePool_1.GamePool.RemoveItem(ComponentEventData.ResDicValue, this);
  4038. };
  4039. /**键盘抬起处理*/
  4040. ComponentEventData.prototype.onKeyUp = function (e) {
  4041. delete this.keyDownList[e["keyCode"]];
  4042. };
  4043. ComponentEventData.ResDicValue = "ComponentEventData";
  4044. return ComponentEventData;
  4045. }());
  4046. exports.ComponentEventData = ComponentEventData;
  4047. },{"../PrefabControl/GamePool":45}],29:[function(require,module,exports){
  4048. "use strict";
  4049. Object.defineProperty(exports, "__esModule", { value: true });
  4050. /*
  4051. * name;
  4052. */
  4053. var DataInfoBase = /** @class */ (function (_super) {
  4054. __extends(DataInfoBase, _super);
  4055. function DataInfoBase() {
  4056. return _super.call(this) || this;
  4057. }
  4058. /***********混淆********* */
  4059. DataInfoBase.prototype.showApe = function () {
  4060. var monkey1Path = "./res/apes/monkey1.png", monkey2Path = "./res/apes/monkey2.png";
  4061. // 方法1:使用loadImage
  4062. var ape = new Laya.Sprite();
  4063. Laya.stage.addChild(ape);
  4064. ape.loadImage(monkey1Path);
  4065. // 方法2:使用drawTexture
  4066. Laya.loader.load(monkey2Path, Laya.Handler.create(this, function () {
  4067. var monkey2 = Laya.loader.getRes(monkey2Path);
  4068. var ape2 = new Laya.Sprite();
  4069. Laya.stage.addChild(ape2);
  4070. ape2.graphics.drawTexture(monkey2, 100, 0);
  4071. }));
  4072. };
  4073. /*********************** */
  4074. DataInfoBase.prototype.DataInfo = function (data) {
  4075. if (data) {
  4076. for (var s in data) {
  4077. var itemd = this[s];
  4078. if (itemd != null) {
  4079. this[s] = data[s];
  4080. }
  4081. // else
  4082. // {
  4083. // Debuger.log( "VO:未定义属性-" + s );
  4084. // }
  4085. }
  4086. }
  4087. };
  4088. /*********混淆 */
  4089. DataInfoBase.prototype.createButton = function (skin, name, cb, index) {
  4090. var btn = new Laya.Button(skin, name);
  4091. Laya.stage.addChild(btn);
  4092. btn.on(Laya.Event.CLICK, this, cb);
  4093. btn.size(147, 55);
  4094. btn.name = name;
  4095. btn.right = 10;
  4096. btn.top = index * (btn.height + 10);
  4097. return btn;
  4098. };
  4099. /***************** */
  4100. DataInfoBase.prototype.dispatchEvent = function (type, data) {
  4101. this.event(type, data);
  4102. };
  4103. return DataInfoBase;
  4104. }(Laya.EventDispatcher));
  4105. exports.DataInfoBase = DataInfoBase;
  4106. },{}],30:[function(require,module,exports){
  4107. "use strict";
  4108. Object.defineProperty(exports, "__esModule", { value: true });
  4109. var GamePool_1 = require("../PrefabControl/GamePool");
  4110. var Sprite = Laya.Sprite;
  4111. var Event = Laya.Event;
  4112. /*
  4113. * name;
  4114. */
  4115. var LocalData = /** @class */ (function (_super) {
  4116. __extends(LocalData, _super);
  4117. function LocalData() {
  4118. var _this = _super !== null && _super.apply(this, arguments) || this;
  4119. /**
  4120. * 引用次数
  4121. */
  4122. _this.ref = 0;
  4123. /**
  4124. * 最后一次被引用的时间
  4125. */
  4126. _this.time = 0;
  4127. /**
  4128. * 包名
  4129. */
  4130. _this.packageName = "";
  4131. return _this;
  4132. }
  4133. LocalData.prototype.createCoralRect = function () {
  4134. var coralRect = new Sprite();
  4135. coralRect.graphics.drawRect(0, 0, Laya.stage.width, Laya.stage.height / 2, "#FF7F50");
  4136. //设置名称
  4137. coralRect.name = "珊瑚色容器";
  4138. coralRect.size(Laya.stage.width, Laya.stage.height / 2);
  4139. Laya.stage.addChild(coralRect);
  4140. coralRect.on(Event.MOUSE_DOWN, this, this.onDown);
  4141. };
  4142. LocalData.prototype.createDeepSkyblueRect = function () {
  4143. var deepSkyblueRect = new Sprite();
  4144. deepSkyblueRect.graphics.drawRect(0, 0, 100, 100, "#00BFFF");
  4145. //设置名称
  4146. deepSkyblueRect.name = "天蓝色矩形";
  4147. //设置宽高(要接收鼠标事件必须设置宽高,否则不会被命中)
  4148. deepSkyblueRect.size(100, 100);
  4149. deepSkyblueRect.pos(10, 10);
  4150. Laya.stage.addChild(deepSkyblueRect);
  4151. deepSkyblueRect.on(Event.MOUSE_DOWN, this, this.onDown);
  4152. };
  4153. LocalData.prototype.clear = function () {
  4154. this.ref = 0;
  4155. this.time = 0;
  4156. this.packageName = "";
  4157. GamePool_1.GamePool.RemoveItem(LocalData.ResDicValue, this);
  4158. };
  4159. /**侦听处理方法*/
  4160. LocalData.prototype.onDown = function (e) {
  4161. this.logger.text += "点击 - " + e.target.name + "\n";
  4162. };
  4163. LocalData.ResDicValue = "LocalData";
  4164. return LocalData;
  4165. }(Laya.EventDispatcher));
  4166. exports.LocalData = LocalData;
  4167. },{"../PrefabControl/GamePool":45}],31:[function(require,module,exports){
  4168. "use strict";
  4169. Object.defineProperty(exports, "__esModule", { value: true });
  4170. var DispatcherManager_1 = require("../utils/DispatcherManager");
  4171. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  4172. var LocalDataControl_1 = require("../Control/LocalDataControl");
  4173. var UserDataInfo_1 = require("../Data/UserDataInfo");
  4174. var RoleCFG_1 = require("../CFG/RoleCFG");
  4175. var LevelCFG_1 = require("../CFG/LevelCFG");
  4176. var GameUtils_1 = require("../utils/GameUtils");
  4177. var DataInfoBase_1 = require("./DataInfoBase");
  4178. var Templet = Laya.Templet;
  4179. var Event = Laya.Event;
  4180. var RoleData = /** @class */ (function (_super) {
  4181. __extends(RoleData, _super);
  4182. function RoleData() {
  4183. var _this = _super.call(this) || this;
  4184. /**
  4185. * 金币
  4186. */
  4187. _this._Gold = 0;
  4188. _this._roleid = 0;
  4189. _this._leveid = 0;
  4190. _this.mStartX = 400;
  4191. _this.mStartY = 500;
  4192. _this.mActionIndex = 0;
  4193. _this.mCurrIndex = 0;
  4194. _this.mCurrSkinIndex = 0;
  4195. /****************************************************** */
  4196. _this.movespeed = 0;
  4197. _this.frontjump = new Laya.Vector3;
  4198. _this.leftjump = new Laya.Vector3;
  4199. _this.rightjump = new Laya.Vector3;
  4200. _this.upclimb = 0;
  4201. _this.slideclimb = new Laya.Vector3;
  4202. RoleData.ins = _this;
  4203. return _this;
  4204. }
  4205. Object.defineProperty(RoleData, "Instance", {
  4206. get: function () {
  4207. if (RoleData.ins == null) {
  4208. return new RoleData();
  4209. }
  4210. return RoleData.ins;
  4211. },
  4212. enumerable: true,
  4213. configurable: true
  4214. });
  4215. RoleData.prototype.init = function () {
  4216. var localdatacontrol = LocalDataControl_1.LocalDataControl.Instance;
  4217. // var nowGold:number = Number(PlayerAccount.CurrentAccount.CurAccountData.GetUser(AccountUser.money));
  4218. // this.Gold = nowGold;
  4219. this.Money = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.gold);
  4220. this._roleid = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.roleid);
  4221. if (this.CharacterID == 0) {
  4222. this.CharacterID = 1;
  4223. }
  4224. else {
  4225. this.InitCharacterInfo();
  4226. }
  4227. this._leveid = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.levelid);
  4228. if (this._leveid == 0) {
  4229. this._leveid = 1;
  4230. }
  4231. this.RefreshLevel();
  4232. };
  4233. Object.defineProperty(RoleData.prototype, "nowlevel", {
  4234. get: function () {
  4235. return this._leveid;
  4236. },
  4237. enumerable: true,
  4238. configurable: true
  4239. });
  4240. RoleData.prototype.getNowServerLevel = function () {
  4241. return this._leveid;
  4242. };
  4243. RoleData.prototype.LevelUp = function () {
  4244. this._leveid++;
  4245. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.levelid, this._leveid.toString());
  4246. this.RefreshLevel();
  4247. };
  4248. /*********************************************************** */
  4249. RoleData.prototype.startFun = function () {
  4250. this.mAniPath = "res/spine/spineRes6/alien.sk";
  4251. this.mFactory = new Templet();
  4252. this.mFactory.on(Event.COMPLETE, this, this.parseComplete);
  4253. this.mFactory.on(Event.ERROR, this, this.onError);
  4254. this.mFactory.loadAni(this.mAniPath);
  4255. };
  4256. RoleData.prototype.onError = function () {
  4257. console.log("error");
  4258. };
  4259. RoleData.prototype.parseComplete = function () {
  4260. //创建模式为1,可以启用换装
  4261. this.mArmature = this.mFactory.buildArmature(1);
  4262. this.mArmature.x = this.mStartX;
  4263. this.mArmature.y = this.mStartY;
  4264. this.mArmature.scale(0.5, 0.5);
  4265. Laya.stage.addChild(this.mArmature);
  4266. this.mArmature.on(Event.LABEL, this, this.onEvent);
  4267. this.play();
  4268. };
  4269. /******************************************************************** */
  4270. RoleData.prototype.RefreshLevel = function () {
  4271. var lv = this._leveid;
  4272. var nowcfglv = 0;
  4273. var allnums = LevelCFG_1.default.vec.length;
  4274. if (lv > allnums) {
  4275. var value = (lv - allnums) % (allnums - 2);
  4276. if (value == 0) {
  4277. nowcfglv = allnums;
  4278. }
  4279. else {
  4280. nowcfglv = value + 2;
  4281. }
  4282. }
  4283. else {
  4284. nowcfglv = lv;
  4285. }
  4286. this.levelcfg = LevelCFG_1.default.dict[nowcfglv];
  4287. this.levelmapArr = GameUtils_1.GameUtils.cutstrtoArr(this.levelcfg.road);
  4288. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_levelid);
  4289. };
  4290. RoleData.prototype.play = function () {
  4291. this.mCurrIndex++;
  4292. if (this.mCurrIndex >= this.mArmature.getAnimNum()) {
  4293. this.mCurrIndex = 0;
  4294. }
  4295. this.mArmature.play(this.mCurrIndex, false);
  4296. };
  4297. RoleData.prototype.onEvent = function (e) {
  4298. Laya.stage.addChild(this.mLabelSprite);
  4299. this.mLabelSprite.x = this.mStartX;
  4300. this.mLabelSprite.y = this.mStartY;
  4301. this.mLabelSprite.graphics.clear();
  4302. };
  4303. RoleData.prototype.InitCharacterInfo = function () {
  4304. this.roleCfg = RoleCFG_1.default.dict[this._roleid];
  4305. this.movespeed = this.roleCfg.speed;
  4306. this.frontjump = this.roleCfg.frontjump;
  4307. this.leftjump = this.roleCfg.leftjump;
  4308. this.rightjump = this.roleCfg.rightjump;
  4309. this.upclimb = Number(this.roleCfg.upclimb);
  4310. this.slideclimb = this.roleCfg.slideclimb;
  4311. // this.frontjump.x = Number( this.roleCfg.frontjump.x );
  4312. // this.frontjump.y = Number( this.roleCfg.frontjump.y );
  4313. // this.frontjump.z = Number( this.roleCfg.frontjump.z );
  4314. // this.leftjump.x = Number( this.roleCfg.leftjump.x );
  4315. // this.leftjump.y = Number( this.roleCfg.leftjump.y );
  4316. // this.leftjump.z = Number( this.roleCfg.leftjump.z );
  4317. // this.rightjump.x = Number( this.roleCfg.rightjump.x );
  4318. // this.rightjump.y = Number( this.roleCfg.rightjump.y );
  4319. // this.rightjump.z = Number( this.roleCfg.rightjump.z );
  4320. // this.slideclimb.x = Number( this.roleCfg.slideclimb.x );
  4321. // this.slideclimb.y = Number( this.roleCfg.slideclimb.y );
  4322. // this.slideclimb.z = Number( this.roleCfg.slideclimb.z );
  4323. };
  4324. Object.defineProperty(RoleData.prototype, "LevelID", {
  4325. // public set leveid( value:number )
  4326. // {
  4327. // if( this._leveid != value )
  4328. // {
  4329. // this._leveid = value;
  4330. // this.levelcfg = LevelCFG.dict[ this._leveid ];
  4331. // this.levelmapArr = GameUtils.cutstrtoArr(this.levelcfg.road);
  4332. // CacheManager.getInstance().addstr( UserDataInfo.levelid,this._leveid.toString() );
  4333. // DispatcherManager.dispatchEvent( UserInfoEvent.userinfoEvent_updateroleid );
  4334. // }
  4335. // }
  4336. get: function () {
  4337. return this._leveid;
  4338. },
  4339. enumerable: true,
  4340. configurable: true
  4341. });
  4342. Object.defineProperty(RoleData.prototype, "CharacterID", {
  4343. get: function () {
  4344. return this._roleid;
  4345. },
  4346. set: function (value) {
  4347. if (this._roleid != value) {
  4348. this._roleid = value;
  4349. this.InitCharacterInfo();
  4350. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.roleid, this._roleid.toString());
  4351. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid);
  4352. }
  4353. },
  4354. enumerable: true,
  4355. configurable: true
  4356. });
  4357. Object.defineProperty(RoleData.prototype, "Money", {
  4358. get: function () {
  4359. return this._Gold;
  4360. },
  4361. set: function (value) {
  4362. if (this._Gold != value) {
  4363. this._Gold = value;
  4364. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.gold, this._Gold.toString());
  4365. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.UserInfoEvent_updateUserData);
  4366. }
  4367. },
  4368. enumerable: true,
  4369. configurable: true
  4370. });
  4371. return RoleData;
  4372. }(DataInfoBase_1.DataInfoBase));
  4373. exports.RoleData = RoleData;
  4374. },{"../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){
  4375. "use strict";
  4376. Object.defineProperty(exports, "__esModule", { value: true });
  4377. var SkinData = /** @class */ (function () {
  4378. function SkinData() {
  4379. /**
  4380. * 0:未拥有,1:已经拥有
  4381. */
  4382. this.state = 0;
  4383. this.hasnum = 0;
  4384. /************************************ */
  4385. }
  4386. /************************************ */
  4387. SkinData.prototype.createText = function () {
  4388. var txt = new Laya.Text();
  4389. txt.text = "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!";
  4390. txt.width = 300;
  4391. txt.fontSize = 40;
  4392. txt.color = "#ffffff";
  4393. //设置文本为多行文本
  4394. txt.wordWrap = true;
  4395. txt.x = Laya.stage.width - txt.textWidth >> 1;
  4396. txt.y = Laya.stage.height - txt.textHeight >> 1;
  4397. Laya.stage.addChild(txt);
  4398. };
  4399. return SkinData;
  4400. }());
  4401. exports.SkinData = SkinData;
  4402. },{}],33:[function(require,module,exports){
  4403. "use strict";
  4404. Object.defineProperty(exports, "__esModule", { value: true });
  4405. var Event = Laya.Event;
  4406. var UserDataInfo = /** @class */ (function () {
  4407. function UserDataInfo() {
  4408. }
  4409. /******************************* */
  4410. UserDataInfo.prototype.onCallLater = function () {
  4411. console.log("onCallLater triggered");
  4412. var text = new Laya.Text();
  4413. text.font = "SimHei";
  4414. text.fontSize = 30;
  4415. text.color = "#FFFFFF";
  4416. text.text = "打开控制台可见该函数仅触发了一次";
  4417. text.size(Laya.stage.width, Laya.stage.height);
  4418. text.wordWrap = true;
  4419. text.valign = "middle";
  4420. text.align = "center";
  4421. Laya.stage.addChild(text);
  4422. };
  4423. UserDataInfo.prototype.onDecreaseAlpha1 = function (e) {
  4424. //移除鼠标单击事件
  4425. this.button1.off(Event.CLICK, this, this.onDecreaseAlpha1);
  4426. //定时执行一次(间隔时间)
  4427. Laya.timer.once(3000, this, this.onComplete1);
  4428. };
  4429. UserDataInfo.prototype.onDecreaseAlpha2 = function (e) {
  4430. //移除鼠标单击事件
  4431. this.button2.off(Event.CLICK, this, this.onDecreaseAlpha2);
  4432. //定时执行一次(基于帧率)
  4433. Laya.timer.frameOnce(60, this, this.onComplete2);
  4434. };
  4435. UserDataInfo.prototype.onComplete1 = function () {
  4436. //spBtn1的透明度减少0.5
  4437. this.button1.alpha -= 0.5;
  4438. };
  4439. UserDataInfo.prototype.onComplete2 = function () {
  4440. //spBtn2的透明度减少0.5
  4441. this.button2.alpha -= 0.5;
  4442. };
  4443. /******************************************************** */
  4444. /**
  4445. * 记录上次离开时间
  4446. */
  4447. UserDataInfo.lasttime = "lasttime";
  4448. UserDataInfo.caplastflushtime = "captime";
  4449. UserDataInfo.capstorageappids = "capappids";
  4450. UserDataInfo.hasgetappids = "hasgetappids";
  4451. /******************************* */
  4452. /**
  4453. * 角色信息
  4454. */
  4455. UserDataInfo.roleData = "roleData";
  4456. /********************************************************************** */
  4457. UserDataInfo.gold = "gold";
  4458. UserDataInfo.roleid = "roleid";
  4459. UserDataInfo.levelid = "levelid";
  4460. /**
  4461. * 皮肤
  4462. */
  4463. UserDataInfo.skin = "skin";
  4464. UserDataInfo.lastDay = "lastDay";
  4465. UserDataInfo.nowdayShare = "dayshare";
  4466. UserDataInfo.nowdayVideo = "dayvideo";
  4467. return UserDataInfo;
  4468. }());
  4469. exports.UserDataInfo = UserDataInfo;
  4470. },{}],34:[function(require,module,exports){
  4471. "use strict";
  4472. Object.defineProperty(exports, "__esModule", { value: true });
  4473. var UserInfoEvent = /** @class */ (function () {
  4474. function UserInfoEvent() {
  4475. }
  4476. UserInfoEvent.UserInfoEvent_updateUserData = "UserInfoEvent_updateUserData";
  4477. UserInfoEvent.userinfoEvent_updateroleid = "userinfoEvent_updateroleid";
  4478. UserInfoEvent.userinfoEvent_levelid = "userinfoEvent_levelid";
  4479. UserInfoEvent.updatePlayerInfo = "UserInfoEvent_updatePlayerInfo";
  4480. return UserInfoEvent;
  4481. }());
  4482. exports.UserInfoEvent = UserInfoEvent;
  4483. },{}],35:[function(require,module,exports){
  4484. "use strict";
  4485. Object.defineProperty(exports, "__esModule", { value: true });
  4486. var Global_1 = require("./Global");
  4487. var PanelResDic_1 = require("./PrefabControl/PanelResDic");
  4488. var DispatcherManager_1 = require("./utils/DispatcherManager");
  4489. var ComponentEventData_1 = require("./Data/ComponentEventData");
  4490. var RecConfigs_1 = require("./Config/RecConfigs");
  4491. var TimesTamper_1 = require("./Time/TimesTamper");
  4492. var AssetPath_1 = require("./Config/AssetPath");
  4493. var TimerService_1 = require("./Time/TimerService");
  4494. var GlobalWaiting_1 = require("./GlobalWaiting");
  4495. var PanelBaseControl_1 = require("./Control/PanelBaseControl");
  4496. var GamePool_1 = require("./PrefabControl/GamePool");
  4497. var LayoutControl_1 = require("./Control/LayoutControl");
  4498. var ViewManager_1 = require("./View/ViewManager");
  4499. var ResourceControl_1 = require("./Control/ResourceControl");
  4500. var ResDataControl_1 = require("./Control/ResDataControl");
  4501. var AudioControl_1 = require("./Control/AudioControl");
  4502. var ConnectControl_1 = require("./Control/ConnectControl");
  4503. var pingtaiutils_1 = require("./WXSDK/pingtaiutils");
  4504. var AgencyLogin_1 = require("./Agency/AgencyLogin");
  4505. var AgencyUserMessage_1 = require("./Agency/AgencyUserMessage");
  4506. var AgencyMain_1 = require("./Agency/AgencyMain");
  4507. var AgencyInGame_1 = require("./Agency/AgencyInGame");
  4508. var AgencySkin_1 = require("./Agency/AgencySkin");
  4509. var AgencyTrial_1 = require("./Agency/AgencyTrial");
  4510. var AgencyLottery_1 = require("./Agency/AgencyLottery");
  4511. /*
  4512. * name;
  4513. */
  4514. var GameContents = /** @class */ (function (_super) {
  4515. __extends(GameContents, _super);
  4516. function GameContents() {
  4517. return _super.call(this) || this;
  4518. }
  4519. /**
  4520. * 初始化游戏
  4521. */
  4522. GameContents.prototype.initGame = function () {
  4523. RecConfigs_1.RecConfigs.Instance.init();
  4524. DispatcherManager_1.DispatcherManager.init();
  4525. TimerService_1.TimerService.Instance.init();
  4526. LayoutControl_1.LayoutControl.Instance.initlayer();
  4527. ViewManager_1.ViewManager.Instance.init();
  4528. ResourceControl_1.ResourceControl.Instance.init();
  4529. ResDataControl_1.ResDataControl.Instance.init();
  4530. AudioControl_1.AudioControl.Instance.init();
  4531. ConnectControl_1.ConnectControl.Connnect();
  4532. TimesTamper_1.TimesTamper.Instance.init();
  4533. pingtaiutils_1.pingtaiutils.Instance.init();
  4534. this.initPoolObject();
  4535. this.initProxy();
  4536. this.initmapView();
  4537. this.beginLoadHandler();
  4538. };
  4539. /**
  4540. * 初始化对象池
  4541. */
  4542. GameContents.prototype.initPoolObject = function () {
  4543. GamePool_1.GamePool.Mark(ComponentEventData_1.ComponentEventData.ResDicValue, ComponentEventData_1.ComponentEventData);
  4544. };
  4545. /**
  4546. * 初始化模块代理类
  4547. */
  4548. GameContents.prototype.initProxy = function () {
  4549. var mvcpool = PanelResDic_1.PanelResDic.Instance;
  4550. mvcpool.AgencyAdd(AgencyLogin_1.AgencyLogin);
  4551. mvcpool.AgencyAdd(AgencyUserMessage_1.AgencyUserMessage);
  4552. mvcpool.AgencyAdd(AgencyMain_1.AgencyMain);
  4553. mvcpool.AgencyAdd(AgencyInGame_1.AgencyInGame);
  4554. mvcpool.AgencyAdd(AgencySkin_1.AgencySkin);
  4555. mvcpool.AgencyAdd(AgencyTrial_1.AgencyTrial);
  4556. mvcpool.AgencyAdd(AgencyLottery_1.AgencyLottery);
  4557. };
  4558. GameContents.prototype.initmapView = function () {
  4559. var mvcpool = PanelResDic_1.PanelResDic.Instance;
  4560. // mvcpool.mapView( MapViewType.DailyrewardView,DailyrewardView );
  4561. };
  4562. GameContents.prototype.beginLoadHandler = function () {
  4563. var patharr = [];
  4564. patharr.push({ url: AssetPath_1.AssetPath.getResConfig(), type: Laya.Loader.JSON });
  4565. patharr.push({ url: AssetPath_1.AssetPath.getGameVersion(), type: Laya.Loader.JSON });
  4566. ResourceControl_1.ResourceControl.Instance.Loaders(patharr, this, this.recloadComplete);
  4567. };
  4568. GameContents.prototype.recloadComplete = function () {
  4569. var gameversion = ResDataControl_1.ResDataControl.Instance.GainResources(AssetPath_1.AssetPath.getGameVersion(), false);
  4570. if (gameversion) {
  4571. Global_1.Global.gameVersion = gameversion.version;
  4572. }
  4573. else {
  4574. Global_1.Global.gameVersion = "1.0.0";
  4575. }
  4576. var configres = ResDataControl_1.ResDataControl.Instance.GainResources(AssetPath_1.AssetPath.getResConfig(), false);
  4577. RecConfigs_1.RecConfigs.Instance.initRec(configres);
  4578. ResourceControl_1.ResourceControl.Instance.loadGroup("loading", this, this.onPreLoaded, this.onPreprogress);
  4579. };
  4580. GameContents.prototype.onPreprogress = function (value) {
  4581. };
  4582. GameContents.prototype.onPreLoaded = function () {
  4583. ResDataControl_1.ResDataControl.Instance.AddViewPackByName("loading", true, false);
  4584. var globalwaiturl = fairygui.UIPackage.getItemURL("loading", "globalWaiting");
  4585. PanelBaseControl_1.PanelBaseControl.viewbgUrl = fairygui.UIPackage.getItemURL("loading", "img_black");
  4586. fairygui.UIObjectFactory.setPackageItemExtension(globalwaiturl, GlobalWaiting_1.GlobalWaiting);
  4587. fairygui.UIConfig.globalModalWaiting = globalwaiturl;
  4588. fairygui.UIConfig.windowModalWaiting = globalwaiturl;
  4589. // CPAUtils.init();
  4590. this.Login();
  4591. };
  4592. GameContents.prototype.Login = function () {
  4593. PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyLogin_1.AgencyLogin).Login();
  4594. };
  4595. return GameContents;
  4596. }(Laya.EventDispatcher));
  4597. exports.GameContents = GameContents;
  4598. },{"./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){
  4599. "use strict";
  4600. Object.defineProperty(exports, "__esModule", { value: true });
  4601. var PropManager_1 = require("../PrefabControl/PropManager");
  4602. var GameUtils_1 = require("../utils/GameUtils");
  4603. var GameCFG_1 = require("../CFG/GameCFG");
  4604. var Sprite = Laya.Sprite;
  4605. var TiledMap = Laya.TiledMap;
  4606. var Point = Laya.Point;
  4607. var Rectangle = Laya.Rectangle;
  4608. var Handler = Laya.Handler;
  4609. var CameraManager = /** @class */ (function (_super) {
  4610. __extends(CameraManager, _super);
  4611. function CameraManager() {
  4612. var _this = _super.call(this) || this;
  4613. _this.iscanfollow = false;
  4614. /***************************************************************** */
  4615. _this._upvec = new Laya.Vector3(0, 1, 0);
  4616. _this._index = 0;
  4617. _this._slerpValue = 8;
  4618. _this._lookatVec = new Laya.Vector3;
  4619. return _this;
  4620. }
  4621. CameraManager.prototype.onAwake = function () {
  4622. //获取脚本所属对象
  4623. this.camera = this.owner;
  4624. this._toVec = new Laya.Vector3();
  4625. this.camera.fieldOfView = 90;
  4626. };
  4627. CameraManager.prototype.onStart = function () {
  4628. this._transform = this.camera.transform;
  4629. //旋转摄像机角度
  4630. this._transform.rotate(new Laya.Vector3(0, 0, 0), true, false);
  4631. // this.camera.clearColor = null;
  4632. };
  4633. CameraManager.prototype.createMap = function () {
  4634. this.tiledMap = new TiledMap();
  4635. 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));
  4636. };
  4637. CameraManager.prototype.onStageClick = function () {
  4638. var p = new Point(0, 0);
  4639. this.layer.getTilePositionByScreenPos(Laya.stage.mouseX, Laya.stage.mouseY, p);
  4640. this.layer.getScreenPositionByTilePos(Math.floor(p.x), Math.floor(p.y), p);
  4641. this.sprite.pos(p.x, p.y);
  4642. };
  4643. CameraManager.prototype.mapLoaded = function () {
  4644. this.layer = this.tiledMap.getLayerByIndex(0);
  4645. var radiusX = 32;
  4646. var radiusY = Math.tan(180 / Math.PI * 30) * radiusX;
  4647. var color = "#FF7F50";
  4648. this.sprite = new Sprite();
  4649. this.sprite.graphics.drawLine(0, 0, -radiusX, radiusY, color);
  4650. this.sprite.graphics.drawLine(0, 0, radiusX, radiusY, color);
  4651. this.sprite.graphics.drawLine(-radiusX, radiusY, 0, radiusY * 2, color);
  4652. this.sprite.graphics.drawLine(radiusX, radiusY, 0, radiusY * 2, color);
  4653. Laya.stage.addChild(this.sprite);
  4654. };
  4655. CameraManager.prototype.onUpdate = function () {
  4656. if (this.iscanfollow) {
  4657. if (PropManager_1.PropManager.iscarmanpc) {
  4658. if (PropManager_1.PropManager.npcDict["npc_0"]) {
  4659. Laya.Vector3.add(PropManager_1.PropManager.npcDict["npc_0"].transform.position, this._disVector, this._toVec);
  4660. this._transform.position = this._toVec;
  4661. this._transform.position.x = PropManager_1.PropManager.npcDict["npc_0"].transform.position.x;
  4662. this._transform.lookAt(PropManager_1.PropManager.npcDict["npc_0"].transform.position, this._upvec);
  4663. }
  4664. }
  4665. else {
  4666. if (PropManager_1.PropManager.mainRole) {
  4667. Laya.Vector3.add(PropManager_1.PropManager.mainRole.transform.position, this._disVector, this._toVec);
  4668. // this._toVec.x = PropManager.mainRole.transform.position.x;
  4669. // this._transform.position = this._toVec;
  4670. // this._transform.lookAt( PropManager.mainRole.transform.position,this._upvec );
  4671. Laya.Vector3.lerp(this._transform.position, this._toVec, 16 / 1000 * this._slerpValue, this._toVec);
  4672. // this._toVec.z = PropManager.mainRole.transform.position.z+this._disVector.z;
  4673. // this._toVec.y = PropManager.mainRole.transform.position.y + this._disVector.y;
  4674. this._transform.position = this._toVec;
  4675. this._lookatVec.x = this._toVec.x;
  4676. this._lookatVec.y = PropManager_1.PropManager.mainRole.transform.position.y;
  4677. this._lookatVec.z = PropManager_1.PropManager.mainRole.transform.position.z;
  4678. this._transform.lookAt(this._lookatVec, this._upvec);
  4679. }
  4680. }
  4681. }
  4682. };
  4683. CameraManager.prototype.GameEndRotate = function (targetPos, speed) {
  4684. this.iscanfollow = false;
  4685. this._transform.translate(speed, false);
  4686. this._transform.lookAt(targetPos, this._upvec);
  4687. };
  4688. CameraManager.prototype.SetCameraPosition = function (vec) {
  4689. var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[1].value);
  4690. this._disVector = new Laya.Vector3(Number(valueArr[0]), Number(valueArr[1]), Number(valueArr[2]));
  4691. Laya.Vector3.add(vec, this._disVector, this._toVec);
  4692. this.camera.transform.position = this._toVec;
  4693. this.camera.transform.position.x = vec.x;
  4694. // this.camera.transform.lookAt( vec,new Laya.Vector3( 0,1,0 ) );
  4695. };
  4696. return CameraManager;
  4697. }(Laya.Script3D));
  4698. exports.CameraManager = CameraManager;
  4699. },{"../CFG/GameCFG":10,"../PrefabControl/PropManager":47,"../utils/GameUtils":85}],37:[function(require,module,exports){
  4700. "use strict";
  4701. Object.defineProperty(exports, "__esModule", { value: true });
  4702. var TimerService_1 = require("../Time/TimerService");
  4703. var PropManager_1 = require("../PrefabControl/PropManager");
  4704. var CharacterState_1 = require("../PrefabControl/CharacterState");
  4705. var BuildCFG_1 = require("../CFG/BuildCFG");
  4706. var CameraManager_1 = require("./CameraManager");
  4707. var DispatcherManager_1 = require("../utils/DispatcherManager");
  4708. var GameState_1 = require("../utils/GameState");
  4709. var GameUtils_1 = require("../utils/GameUtils");
  4710. var NpcScript = /** @class */ (function (_super) {
  4711. __extends(NpcScript, _super);
  4712. function NpcScript() {
  4713. var _this = _super.call(this) || this;
  4714. _this._nowAction = "";
  4715. _this.resouseName = "";
  4716. _this._shangpaVec = new Laya.Vector3;
  4717. /**是否发生碰撞 */
  4718. _this.haveCollision = false;
  4719. _this._TargetCollision = "";
  4720. _this._normalizeVec = new Laya.Vector3;
  4721. _this.staybuild = "";
  4722. _this.stayscene = "";
  4723. /**
  4724. * 0:未锁,1:锁左边,2:锁右边
  4725. */
  4726. _this._lockxstate = 0;
  4727. /**
  4728. * 状态,0:等待状态,1:开始状态,2:完成状态
  4729. */
  4730. _this._nowRoleState = 0;
  4731. _this.movespeed = 0;
  4732. _this.frontjumpspeed = new Laya.Vector3;
  4733. _this.leftjumpspeed = new Laya.Vector3;
  4734. _this.rightjumpspeed = new Laya.Vector3;
  4735. _this.climbspeed = 0;
  4736. _this.sideclimbspeed = new Laya.Vector3;
  4737. _this._lockbyBuildname = "";
  4738. /**
  4739. * 0:未被锁,1:锁定左边,2:锁定右边,
  4740. */
  4741. _this._lockstate = 0;
  4742. _this.LastAction = "";
  4743. _this._moveTime = 0;
  4744. _this._chixuTime = 0;
  4745. _this._isActionNums = false;
  4746. _this._isneedactionnum = 0;
  4747. _this._needactiontime = 0;
  4748. _this._moveVec = new Laya.Vector3;
  4749. _this.jumpSpeed = new Laya.Vector3;
  4750. _this.jumpHight = 0;
  4751. _this._disy = 0;
  4752. _this.Gravity_g = 10; //重力加速度
  4753. _this._checktime = 0;
  4754. _this._ending = false;
  4755. _this._endAnmoSpeed = new Laya.Vector3();
  4756. _this._endanmotime = 1;
  4757. _this._endAnmoSpeed1 = new Laya.Vector3;
  4758. _this._changeMoveX = 0;
  4759. _this.HaveForceJump = false;
  4760. _this.quaternion = new Laya.Quaternion;
  4761. return _this;
  4762. }
  4763. NpcScript.prototype.onAwake = function () {
  4764. this._animator = this.owner.getComponent(Laya.Animator);
  4765. PropManager_1.PropManager.setAnimator(this._animator);
  4766. };
  4767. NpcScript.prototype.onStart = function () {
  4768. this._speedMoveV3 = new Laya.Vector3(0, 0, 0);
  4769. this._transform = this.owner.transform;
  4770. var sp = this.owner;
  4771. sp.getChildByName("lefttrail").active = false;
  4772. sp.getChildByName("righttrail").active = false;
  4773. };
  4774. NpcScript.prototype.startRun = function () {
  4775. if (this._nowNpcinfo.gravity) {
  4776. this.Gravity_g = this._nowNpcinfo.gravity;
  4777. }
  4778. else {
  4779. this.Gravity_g = 10;
  4780. }
  4781. this._checktime = 500;
  4782. this._nowRoleState = 1;
  4783. this._ending = false;
  4784. this._changeMoveX = 0;
  4785. this._initPosVec = this._transform.position.clone();
  4786. this.staybuild = "";
  4787. this.stayscene = "";
  4788. this._nowAction = CharacterState_1.CharacterState.stand;
  4789. this.nowAction = CharacterState_1.CharacterState.run;
  4790. this._speedMoveV3.x = 0;
  4791. this._speedMoveV3.y = 0;
  4792. this._speedMoveV3.z = -this.movespeed;
  4793. this._iscanMove = true;
  4794. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  4795. };
  4796. NpcScript.prototype.npcinfo = function (cfg) {
  4797. this._nowNpcinfo = cfg;
  4798. this.movespeed = this._nowNpcinfo.speed;
  4799. this.climbspeed = Number(this._nowNpcinfo.upclimb);
  4800. this.frontjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.frontjump.x), Number(this._nowNpcinfo.frontjump.y), Number(this._nowNpcinfo.frontjump.z));
  4801. this.leftjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.leftjump.x), Number(this._nowNpcinfo.leftjump.y), Number(this._nowNpcinfo.leftjump.z));
  4802. this.rightjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.rightjump.x), Number(this._nowNpcinfo.rightjump.y), Number(this._nowNpcinfo.rightjump.z));
  4803. this.sideclimbspeed = new Laya.Vector3(Number(this._nowNpcinfo.slideclimb.x), Number(this._nowNpcinfo.slideclimb.y), Number(this._nowNpcinfo.slideclimb.z));
  4804. // this.frontjump.x = Number( this._nowNpcinfo.frontjump.x );
  4805. // this.frontjump.y = Number( this._nowNpcinfo.frontjump.y );
  4806. // this.frontjump.z = Number( this._nowNpcinfo.frontjump.z );
  4807. // this.leftjump.x = Number( this._nowNpcinfo.leftjump.x );
  4808. // this.leftjump.y = Number( this._nowNpcinfo.leftjump.y );
  4809. // this.leftjump.z = Number( this._nowNpcinfo.leftjump.z );
  4810. // this.rightjump.x = Number( this._nowNpcinfo.rightjump.x );
  4811. // this.rightjump.y = Number( this._nowNpcinfo.rightjump.y );
  4812. // this.rightjump.z = Number( this._nowNpcinfo.rightjump.z );
  4813. // this.upclimb = Number( this._nowNpcinfo.upclimb );
  4814. // this.slideclimb.x = Number( this._nowNpcinfo.slideclimb.x );
  4815. // this.slideclimb.y = Number( this._nowNpcinfo.slideclimb.y );
  4816. // this.slideclimb.z = Number( this._nowNpcinfo.slideclimb.z );
  4817. };
  4818. /**
  4819. * 开始碰撞时执行
  4820. */
  4821. NpcScript.prototype.onCollisionEnter = function (collision) {
  4822. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  4823. var contactPoint = collision.contacts[0];
  4824. this.Calculate(contactPoint.normal, collision.other.owner);
  4825. }
  4826. };
  4827. NpcScript.prototype.setnowSelectVec = function (pos) {
  4828. this._nowselectVec = pos;
  4829. };
  4830. NpcScript.prototype.Calculate = function (normal, target) {
  4831. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) {
  4832. return;
  4833. }
  4834. this._TargetCollision = target.name;
  4835. var n = new Laya.Vector3;
  4836. Laya.Vector3.normalize(normal, this._normalizeVec);
  4837. if (this._TargetCollision.indexOf("build") != -1 || this._TargetCollision.indexOf("Scaffolding") != -1 ||
  4838. this._TargetCollision.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  4839. {
  4840. if (this._TargetCollision.indexOf("build") != -1) {
  4841. this.staybuild = this._TargetCollision;
  4842. this.stayscene = target.parent.parent.name;
  4843. }
  4844. if (this._TargetCollision.indexOf("irongauze") != -1) {
  4845. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  4846. }
  4847. else {
  4848. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._TargetCollision);
  4849. }
  4850. if (this._normalizeVec.z == -1) //上爬
  4851. {
  4852. if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.1)) {
  4853. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  4854. this.nowAction = CharacterState_1.CharacterState.run;
  4855. }
  4856. else {
  4857. this.nowAction = CharacterState_1.CharacterState.climbup;
  4858. this._shangpaVec = this._nowselectVec.clone();
  4859. }
  4860. }
  4861. else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) {
  4862. this.nowAction = CharacterState_1.CharacterState.run;
  4863. }
  4864. else if (this._normalizeVec.x == -1) {
  4865. if (this.nowAction == CharacterState_1.CharacterState.run) {
  4866. this._lockxstate = 1;
  4867. }
  4868. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  4869. this._lockxstate = 1;
  4870. }
  4871. else {
  4872. this.nowAction = CharacterState_1.CharacterState.climbleft;
  4873. }
  4874. }
  4875. else if (this._normalizeVec.x == 1) {
  4876. if (this.nowAction == CharacterState_1.CharacterState.run) {
  4877. this._lockxstate = 2;
  4878. }
  4879. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  4880. this._lockxstate = 2;
  4881. }
  4882. else {
  4883. this.nowAction = CharacterState_1.CharacterState.climbright;
  4884. }
  4885. }
  4886. else {
  4887. if (this._normalizeVec.z != 1) {
  4888. this.nowAction = CharacterState_1.CharacterState.climbupblock;
  4889. this._shangpaVec = this._nowselectVec.clone();
  4890. }
  4891. }
  4892. }
  4893. else if (this._TargetCollision.indexOf("panel_jump") != -1) //加速板跳跃
  4894. {
  4895. this.nowAction = CharacterState_1.CharacterState.speedupjump;
  4896. // this.setJump( this.nowAction );
  4897. }
  4898. else if (this._TargetCollision.indexOf("panel_downslip") != -1) {
  4899. this.nowAction = CharacterState_1.CharacterState.downmove;
  4900. // this.setJump( this.nowAction );
  4901. }
  4902. else if (this._TargetCollision.indexOf("box_Board") != -1 && this.nowAction != CharacterState_1.CharacterState.downmove) {
  4903. if (this._normalizeVec.z == -1) //上爬
  4904. {
  4905. this.nowAction = CharacterState_1.CharacterState.climbup;
  4906. this._shangpaVec = this._nowselectVec.clone();
  4907. }
  4908. }
  4909. else if (this._TargetCollision.indexOf("box_sidejump") != -1) {
  4910. this.nowAction = CharacterState_1.CharacterState.sidespeedup;
  4911. // this.setJump( this.nowAction );
  4912. }
  4913. else if (this._TargetCollision.indexOf("box_Surmount") != -1) {
  4914. this.nowAction = CharacterState_1.CharacterState.cross;
  4915. // this.setJump( this.nowAction );
  4916. }
  4917. else if (this._TargetCollision.indexOf("irongauze") != -1) {
  4918. this.nowAction = CharacterState_1.CharacterState.climbup;
  4919. this._shangpaVec = this._nowselectVec.clone();
  4920. }
  4921. };
  4922. /**
  4923. * 持续碰撞时执行
  4924. */
  4925. NpcScript.prototype.onCollisionStay = function (collision) {
  4926. // Debuger.log( "碰撞中" );
  4927. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  4928. this.haveCollision = true;
  4929. var contactPoint = collision.contacts[0];
  4930. var target = collision.other.owner;
  4931. var targetname = target.name;
  4932. if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1 && targetname.indexOf("role") == -1) {
  4933. this._TargetCollision = targetname;
  4934. }
  4935. if (this._TargetCollision.indexOf("build") != -1 || this._TargetCollision.indexOf("Scaffolding") != -1 ||
  4936. this._TargetCollision.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  4937. {
  4938. if (this._TargetCollision.indexOf("build") != -1) {
  4939. this.staybuild = this._TargetCollision;
  4940. this.stayscene = target.parent.parent.name;
  4941. }
  4942. if (this._TargetCollision.indexOf("irongauze") != -1) {
  4943. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  4944. }
  4945. else {
  4946. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._TargetCollision);
  4947. }
  4948. }
  4949. }
  4950. };
  4951. /**
  4952. * 结束碰撞时执行
  4953. */
  4954. NpcScript.prototype.onCollisionExit = function (collision) {
  4955. this.haveCollision = false;
  4956. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  4957. var contactPoint = collision.contacts[0];
  4958. this.CheckEnd(contactPoint.normal, collision.other.owner);
  4959. }
  4960. };
  4961. NpcScript.prototype.CheckEnd = function (normal, target) {
  4962. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) {
  4963. return;
  4964. }
  4965. if (this.HaveForceJump) {
  4966. this.HaveForceJump = false;
  4967. return;
  4968. }
  4969. if (this._lockxstate) {
  4970. this._lockxstate = 0;
  4971. return;
  4972. }
  4973. if (this._TargetCollision != target.name) {
  4974. return;
  4975. }
  4976. if (target.name.indexOf("panel_jump") != -1) {
  4977. return;
  4978. }
  4979. switch (this.nowAction) {
  4980. case CharacterState_1.CharacterState.climbup:
  4981. case CharacterState_1.CharacterState.climbupblock:
  4982. if (this._TargetCollision.indexOf("box_Board") != -1) {
  4983. this.JumpAction(this._changeMoveX);
  4984. }
  4985. else {
  4986. if (this._changeMoveX > 0) {
  4987. this.nowAction = CharacterState_1.CharacterState.jumpright;
  4988. }
  4989. else if (this._changeMoveX < 0) {
  4990. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  4991. }
  4992. }
  4993. break;
  4994. case CharacterState_1.CharacterState.climbright:
  4995. case CharacterState_1.CharacterState.climbleft:
  4996. this.JumpAction(this._changeMoveX);
  4997. break;
  4998. case CharacterState_1.CharacterState.run:
  4999. this.JumpAction(this._changeMoveX);
  5000. break;
  5001. case CharacterState_1.CharacterState.MoveX:
  5002. this.JumpAction(this._speedMoveV3.x);
  5003. break;
  5004. }
  5005. };
  5006. NpcScript.prototype.JumpAction = function (value, isquanzhong) {
  5007. if (isquanzhong === void 0) { isquanzhong = false; }
  5008. if (value > 0) {
  5009. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5010. }
  5011. else if (value < 0) {
  5012. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5013. }
  5014. else {
  5015. if (isquanzhong) {
  5016. if (this._TargetCollision.indexOf("build") != -1) {
  5017. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  5018. var allvalue = 0;
  5019. var sort;
  5020. var selectdir = "";
  5021. if (this._TargetCollision.indexOf("leftright") != -1) {
  5022. allvalue = this._nowNpcinfo.jump_left + this._nowNpcinfo.jump_right;
  5023. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5024. if (sort <= this._nowNpcinfo.jump_left) {
  5025. selectdir = "left";
  5026. }
  5027. else {
  5028. selectdir = "right";
  5029. }
  5030. }
  5031. else if (this._TargetCollision.indexOf("frontright") != -1) {
  5032. allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_right;
  5033. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5034. if (sort <= this._nowNpcinfo.start_ahead) {
  5035. selectdir = "front";
  5036. }
  5037. else {
  5038. selectdir = "right";
  5039. }
  5040. }
  5041. else if (this._TargetCollision.indexOf("frontleft") != -1) {
  5042. allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left;
  5043. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5044. if (sort <= this._nowNpcinfo.start_ahead) {
  5045. selectdir = "front";
  5046. }
  5047. else {
  5048. selectdir = "left";
  5049. }
  5050. }
  5051. else if (this._TargetCollision.indexOf("right") != -1) {
  5052. selectdir = "right";
  5053. }
  5054. else if (this._TargetCollision.indexOf("left") != -1) {
  5055. selectdir = "left";
  5056. }
  5057. else if (this._TargetCollision.indexOf("front") != -1) {
  5058. selectdir = "front";
  5059. }
  5060. else {
  5061. allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left + this._nowNpcinfo.jump_right;
  5062. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5063. if (sort <= this._nowNpcinfo.start_ahead) {
  5064. selectdir = "front";
  5065. }
  5066. else if (sort <= this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left) {
  5067. selectdir = "left";
  5068. }
  5069. else {
  5070. selectdir = "right";
  5071. }
  5072. }
  5073. switch (selectdir) {
  5074. case "left":
  5075. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5076. break;
  5077. case "right":
  5078. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5079. break;
  5080. case "front":
  5081. this.nowAction = CharacterState_1.CharacterState.jump;
  5082. break;
  5083. default:
  5084. this.nowAction = CharacterState_1.CharacterState.jump;
  5085. break;
  5086. }
  5087. }
  5088. else {
  5089. this.nowAction = CharacterState_1.CharacterState.jump;
  5090. }
  5091. }
  5092. else {
  5093. this.nowAction = CharacterState_1.CharacterState.jump;
  5094. }
  5095. }
  5096. };
  5097. Object.defineProperty(NpcScript.prototype, "nowAction", {
  5098. get: function () {
  5099. return this._nowAction;
  5100. },
  5101. set: function (value) {
  5102. if (this._nowRoleState == 1) {
  5103. if (this._nowAction != value || this.LastAction == CharacterState_1.CharacterState.speedupjump || this.LastAction == CharacterState_1.CharacterState.jumpright) {
  5104. this.LastAction = this._nowAction;
  5105. this._nowAction = value;
  5106. this._moveTime = 0;
  5107. switch (this._nowAction) {
  5108. case CharacterState_1.CharacterState.stand:
  5109. this._isActionNums = false;
  5110. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  5111. break;
  5112. case CharacterState_1.CharacterState.run:
  5113. if (this.LastAction == CharacterState_1.CharacterState.jump || this.LastAction == CharacterState_1.CharacterState.jumpleft || this.LastAction == CharacterState_1.CharacterState.jumpright) {
  5114. this._isActionNums = true;
  5115. this._isneedactionnum = 1;
  5116. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  5117. if (sort < 50) {
  5118. this.PlayAnimator(CharacterState_1.CharacterState.land1);
  5119. }
  5120. else {
  5121. this.PlayAnimator(CharacterState_1.CharacterState.land2);
  5122. }
  5123. }
  5124. else {
  5125. this._isActionNums = false;
  5126. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5127. }
  5128. break;
  5129. case CharacterState_1.CharacterState.jump:
  5130. this.PlayAnimator(CharacterState_1.CharacterState.jump);
  5131. this._isActionNums = true;
  5132. this._isneedactionnum = 1;
  5133. this.jumpSpeed.x = this.frontjumpspeed.x;
  5134. this.jumpSpeed.y = this.frontjumpspeed.y;
  5135. this.jumpSpeed.z = this.frontjumpspeed.z;
  5136. break;
  5137. case CharacterState_1.CharacterState.jumpleft:
  5138. this.jumpSpeed = this.leftjumpspeed;
  5139. // this.jumpSpeed.x = this.leftjumpspeed.x;
  5140. // this.jumpSpeed.y = this.leftjumpspeed.y;
  5141. // this.jumpSpeed.z = this.leftjumpspeed.z;
  5142. this._isActionNums = true;
  5143. this._isneedactionnum = 1;
  5144. this.PlayAnimator(CharacterState_1.CharacterState.leftjump);
  5145. break;
  5146. case CharacterState_1.CharacterState.jumpright:
  5147. this.jumpSpeed = this.rightjumpspeed;
  5148. // this.jumpSpeed.x = this.rightjumpspeed.x;
  5149. // this.jumpSpeed.y = this.rightjumpspeed.y;
  5150. // this.jumpSpeed.z = this.rightjumpspeed.z;
  5151. this._isActionNums = true;
  5152. this._isneedactionnum = 1;
  5153. this.PlayAnimator(CharacterState_1.CharacterState.rightjump);
  5154. break;
  5155. case CharacterState_1.CharacterState.speedupjump:
  5156. var buildcfg = BuildCFG_1.default.dict["panel_jump"];
  5157. this.jumpSpeed.x = buildcfg.buffx;
  5158. this.jumpSpeed.y = buildcfg.buffy;
  5159. if (this.LastAction == CharacterState_1.CharacterState.speedupjump) {
  5160. this.jumpSpeed.z = this.jumpSpeed.z * buildcfg.buffz;
  5161. }
  5162. else {
  5163. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  5164. }
  5165. this._isActionNums = true;
  5166. this._isneedactionnum = 1;
  5167. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  5168. if (sort < 50) {
  5169. this.PlayAnimator(CharacterState_1.CharacterState.highjump1);
  5170. }
  5171. else {
  5172. this.PlayAnimator(CharacterState_1.CharacterState.highjump2);
  5173. }
  5174. break;
  5175. case CharacterState_1.CharacterState.downmove:
  5176. var buildcfg = BuildCFG_1.default.dict["panel_downslip"];
  5177. this.jumpSpeed.x = buildcfg.buffx;
  5178. this.jumpSpeed.y = buildcfg.buffy;
  5179. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  5180. this._chixuTime = buildcfg.time;
  5181. this._isActionNums = true;
  5182. this._isneedactionnum = 1;
  5183. this.PlayAnimator(CharacterState_1.CharacterState.huachan);
  5184. break;
  5185. case CharacterState_1.CharacterState.cross:
  5186. var buildcfg = BuildCFG_1.default.dict["box_Surmount"];
  5187. this.jumpSpeed.x = buildcfg.buffx;
  5188. this.jumpSpeed.y = buildcfg.buffy + 0.5;
  5189. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  5190. this._chixuTime = buildcfg.time;
  5191. this._isActionNums = true;
  5192. this._isneedactionnum = 1;
  5193. this.PlayAnimator(CharacterState_1.CharacterState.hurdle);
  5194. break;
  5195. case CharacterState_1.CharacterState.climbup:
  5196. case CharacterState_1.CharacterState.climbupblock:
  5197. this.jumpSpeed.x = 0;
  5198. this.jumpSpeed.y = this.climbspeed;
  5199. this.jumpSpeed.z = 0;
  5200. this._isActionNums = false;
  5201. this.PlayAnimator(CharacterState_1.CharacterState.climbwall);
  5202. break;
  5203. case CharacterState_1.CharacterState.climbleft:
  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.runwallleft);
  5210. break;
  5211. case CharacterState_1.CharacterState.climbright:
  5212. this.jumpSpeed = new Laya.Vector3(0, this.sideclimbspeed.y, this.sideclimbspeed.z);
  5213. // this.jumpSpeed.x = 0;
  5214. // this.jumpSpeed.y = this.sideclimbspeed.y;
  5215. // this.jumpSpeed.z = this.sideclimbspeed.z;
  5216. this._isActionNums = false;
  5217. this.PlayAnimator(CharacterState_1.CharacterState.runwallright);
  5218. break;
  5219. case CharacterState_1.CharacterState.ClimbMotion:
  5220. this._isActionNums = true;
  5221. this._isneedactionnum = 0;
  5222. this._needactiontime = 0.3;
  5223. this._moveTime = 0;
  5224. this.PlayAnimator(CharacterState_1.CharacterState.climbend);
  5225. break;
  5226. }
  5227. }
  5228. }
  5229. },
  5230. enumerable: true,
  5231. configurable: true
  5232. });
  5233. NpcScript.prototype.update = function (dt) {
  5234. if (this._nowRoleState == 1) {
  5235. dt = 16;
  5236. this._checktime += dt;
  5237. if (PropManager_1.PropManager.iscarmanpc) {
  5238. }
  5239. else {
  5240. if (this._checktime >= 500) {
  5241. this._checktime = 0;
  5242. if (this._nowNpcinfo && PropManager_1.PropManager.mainRole) {
  5243. if (this._transform.position.z + this._nowNpcinfo.distance < PropManager_1.PropManager.mainRole.transform.position.z) {
  5244. this._iscanMove = false;
  5245. }
  5246. else {
  5247. this._iscanMove = true;
  5248. }
  5249. }
  5250. }
  5251. }
  5252. if (this._iscanMove) {
  5253. var distime = dt / 1000;
  5254. this._moveTime += distime;
  5255. switch (this.nowAction) {
  5256. case CharacterState_1.CharacterState.run: //跑动
  5257. this._moveVec.y = 0;
  5258. this._moveVec.z = distime * this._speedMoveV3.z;
  5259. if (this._lockxstate == 0) {
  5260. this._moveVec.x = this._changeMoveX * distime;
  5261. }
  5262. else if (this._lockxstate == 1) {
  5263. if (this._changeMoveX < 0) {
  5264. this._moveVec.x = 0;
  5265. }
  5266. else {
  5267. this._moveVec.x = this._changeMoveX * distime;
  5268. }
  5269. }
  5270. else if (this._lockxstate == 2) {
  5271. if (this._changeMoveX > 0) {
  5272. this._moveVec.x = 0;
  5273. }
  5274. else {
  5275. this._moveVec.x = this._changeMoveX * distime;
  5276. }
  5277. }
  5278. this._transform.translate(this._moveVec, false);
  5279. break;
  5280. case CharacterState_1.CharacterState.climbup: //爬升
  5281. this._moveVec.z = 0;
  5282. this._moveVec.y = distime * this.jumpSpeed.y;
  5283. if (this._lockxstate == 1) {
  5284. if (this._changeMoveX < 0) {
  5285. this._moveVec.x = 0;
  5286. }
  5287. else {
  5288. this._moveVec.x = this._changeMoveX * distime;
  5289. }
  5290. }
  5291. else if (this._lockstate == 2) {
  5292. if (this._changeMoveX > 0) {
  5293. this._moveVec.x = 0;
  5294. }
  5295. else {
  5296. this._moveVec.x = this._changeMoveX * distime;
  5297. }
  5298. }
  5299. else {
  5300. this._moveVec.x = this._changeMoveX * distime;
  5301. }
  5302. this._transform.translate(this._moveVec, false);
  5303. if (this._shangpaVec) {
  5304. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  5305. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5306. }
  5307. }
  5308. else if (this._nowselectVec) {
  5309. if (this._transform.position.y + 1 > this._nowselectVec.y) {
  5310. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5311. }
  5312. }
  5313. break;
  5314. case CharacterState_1.CharacterState.climbupblock:
  5315. this._moveVec.z = 0;
  5316. this._moveVec.y = distime * this.jumpSpeed.y;
  5317. this._moveVec.x = 0;
  5318. this._transform.translate(this._moveVec, false);
  5319. if (this._shangpaVec) {
  5320. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  5321. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5322. }
  5323. }
  5324. else if (this._transform.position.y + 1 > this._nowselectVec.y) {
  5325. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5326. }
  5327. break;
  5328. case CharacterState_1.CharacterState.jump: //跳跃
  5329. case CharacterState_1.CharacterState.jumpleft:
  5330. case CharacterState_1.CharacterState.jumpright:
  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.speedupjump:
  5339. this._disy = this.jumpSpeed.y - this.Gravity_g * distime;
  5340. this.jumpSpeed.y = this._disy;
  5341. this._moveVec.x = this.jumpSpeed.x * distime;
  5342. this._moveVec.y = this._disy * distime;
  5343. this._moveVec.z = this.jumpSpeed.z * distime;
  5344. this._transform.translate(this._moveVec, false);
  5345. break;
  5346. case CharacterState_1.CharacterState.climbleft:
  5347. case CharacterState_1.CharacterState.climbright:
  5348. this._moveVec.z = distime * this.jumpSpeed.y;
  5349. this._moveVec.y = this.jumpSpeed.y * distime;
  5350. this._moveVec.x = 0;
  5351. this._transform.translate(this._moveVec, false);
  5352. break;
  5353. case CharacterState_1.CharacterState.MoveX:
  5354. this._moveVec.z = distime * this._speedMoveV3.z;
  5355. this._moveVec.x = this._speedMoveV3.x * distime;
  5356. this._transform.translate(this._moveVec, false);
  5357. if (this._moveTime > 0.1) {
  5358. this.nowAction = CharacterState_1.CharacterState.run;
  5359. }
  5360. break;
  5361. case CharacterState_1.CharacterState.downmove:
  5362. this._moveVec.y = this.jumpSpeed.x;
  5363. this._moveVec.x = this.jumpSpeed.y;
  5364. this._moveVec.z = this.jumpSpeed.z * distime;
  5365. this._transform.translate(this._moveVec, false);
  5366. if (this._moveTime > this._chixuTime) {
  5367. this.nowAction = CharacterState_1.CharacterState.run;
  5368. }
  5369. break;
  5370. case CharacterState_1.CharacterState.sidespeedup:
  5371. this._moveVec.y = 0;
  5372. this._moveVec.x = 0;
  5373. this._moveVec.z = this.jumpSpeed.z * distime;
  5374. this._transform.translate(this._moveVec, false);
  5375. if (this._moveTime > this._chixuTime && this.LastAction == CharacterState_1.CharacterState.climbleft || this.LastAction == CharacterState_1.CharacterState.climbright) {
  5376. this.nowAction = this.LastAction;
  5377. }
  5378. else {
  5379. this.nowAction = CharacterState_1.CharacterState.jump;
  5380. // this.setJump( this.nowAction );
  5381. }
  5382. break;
  5383. case CharacterState_1.CharacterState.cross:
  5384. this._disy = this.jumpSpeed.y - this.Gravity_g * distime;
  5385. this.jumpSpeed.y = this._disy;
  5386. this._moveVec.x = this.jumpSpeed.x * distime;
  5387. this._moveVec.y = this._disy * distime;
  5388. this._moveVec.z = this.jumpSpeed.z * distime;
  5389. this._transform.translate(this._moveVec, false);
  5390. break;
  5391. case CharacterState_1.CharacterState.ClimbMotion:
  5392. if (this._nowselectVec) {
  5393. if (this._transform.position.y < this._nowselectVec.y) {
  5394. this._moveVec.x = 0;
  5395. this._moveVec.y = (1 / 0.3) * distime;
  5396. this._moveVec.z = 0;
  5397. this._transform.translate(this._moveVec, false);
  5398. }
  5399. }
  5400. break;
  5401. }
  5402. if (this._nowselectVec && (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.downmove) && !this.haveCollision) {
  5403. if (this._transform.position.z <= this._nowselectVec.z) {
  5404. if (this._changeMoveX > 0) {
  5405. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5406. }
  5407. else if (this._changeMoveX < 0) {
  5408. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5409. }
  5410. else {
  5411. this.nowAction = CharacterState_1.CharacterState.jump;
  5412. }
  5413. }
  5414. }
  5415. if (this._transform.position.y < PropManager_1.PropManager.diePosY) //角色死亡
  5416. {
  5417. if (this.stayscene == "" || this.staybuild == "") {
  5418. this._transform.position = this._initPosVec.clone();
  5419. }
  5420. else {
  5421. this._transform.position = PropManager_1.PropManager.getPosVecbyScene(this.stayscene, this.staybuild).clone();
  5422. }
  5423. this.nowAction = CharacterState_1.CharacterState.run;
  5424. }
  5425. if (this._transform.position.z < PropManager_1.PropManager.gamewinPosZ) {
  5426. this.Win();
  5427. }
  5428. if (this._isActionNums) {
  5429. //如果当前播放state已经播放完了一次
  5430. if (this._isneedactionnum > 0) {
  5431. if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) {
  5432. switch (this._nowActionName) {
  5433. case CharacterState_1.CharacterState.jump:
  5434. case CharacterState_1.CharacterState.leftjump:
  5435. case CharacterState_1.CharacterState.rightjump:
  5436. case CharacterState_1.CharacterState.highjump1:
  5437. case CharacterState_1.CharacterState.highjump2:
  5438. case CharacterState_1.CharacterState.hurdle:
  5439. this._isActionNums = false;
  5440. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  5441. break;
  5442. case CharacterState_1.CharacterState.huachan:
  5443. case CharacterState_1.CharacterState.climbend:
  5444. this._isActionNums = false;
  5445. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5446. this.nowAction = CharacterState_1.CharacterState.run;
  5447. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  5448. break;
  5449. case CharacterState_1.CharacterState.land1:
  5450. case CharacterState_1.CharacterState.land2:
  5451. this._isActionNums = false;
  5452. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5453. break;
  5454. }
  5455. }
  5456. }
  5457. else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) {
  5458. switch (this._nowActionName) {
  5459. case CharacterState_1.CharacterState.jump:
  5460. case CharacterState_1.CharacterState.leftjump:
  5461. case CharacterState_1.CharacterState.rightjump:
  5462. case CharacterState_1.CharacterState.highjump1:
  5463. case CharacterState_1.CharacterState.highjump2:
  5464. case CharacterState_1.CharacterState.hurdle:
  5465. this._isActionNums = false;
  5466. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  5467. break;
  5468. case CharacterState_1.CharacterState.huachan:
  5469. case CharacterState_1.CharacterState.climbend:
  5470. this._isActionNums = false;
  5471. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5472. this.nowAction = CharacterState_1.CharacterState.run;
  5473. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  5474. break;
  5475. }
  5476. }
  5477. }
  5478. }
  5479. else {
  5480. if (this._ending) {
  5481. var distime = dt / 1000;
  5482. this._moveTime += distime;
  5483. if (this._moveTime >= this._endanmotime) {
  5484. this.GameOver();
  5485. }
  5486. else {
  5487. this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime;
  5488. this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime;
  5489. this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime;
  5490. PropManager_1.PropManager.carma.getComponent(CameraManager_1.CameraManager).GameEndRotate(this._transform.position, this._endAnmoSpeed1);
  5491. }
  5492. }
  5493. }
  5494. }
  5495. };
  5496. NpcScript.prototype.GameOver = function () {
  5497. this._ending = false;
  5498. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5499. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.end);
  5500. };
  5501. NpcScript.prototype.Win = function () {
  5502. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5503. this._nowRoleState = 2;
  5504. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  5505. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.npcend, this.owner.name);
  5506. };
  5507. NpcScript.prototype.stop = function () {
  5508. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5509. };
  5510. NpcScript.prototype.destroy = function () {
  5511. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5512. _super.prototype.destroy.call(this);
  5513. };
  5514. NpcScript.prototype.Joy = function (value, angle) {
  5515. if (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.climbup || CharacterState_1.CharacterState.climbleft || CharacterState_1.CharacterState.climbright) {
  5516. this._changeMoveX = value;
  5517. }
  5518. if (this.nowAction == CharacterState_1.CharacterState.climbleft && this._changeMoveX > 0) //强制跳跃
  5519. {
  5520. this.HaveForceJump = true;
  5521. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5522. }
  5523. else if (this.nowAction == CharacterState_1.CharacterState.climbright && this._changeMoveX < 0) {
  5524. this.HaveForceJump = true;
  5525. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5526. }
  5527. if (this.nowAction == CharacterState_1.CharacterState.jump ||
  5528. this.nowAction == CharacterState_1.CharacterState.jumpleft ||
  5529. this.nowAction == CharacterState_1.CharacterState.jumpright ||
  5530. this.nowAction == CharacterState_1.CharacterState.speedupjump)
  5531. angle = -angle * Math.PI / 180;
  5532. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion);
  5533. Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed);
  5534. };
  5535. NpcScript.prototype.PlayAnimator = function (actionName) {
  5536. // this._nowActionName = actionName;
  5537. var _actionname = this.TransitionActionName(actionName);
  5538. this._nowActionName = actionName;
  5539. if (this._animator) {
  5540. if (this._nowActionName == CharacterState_1.CharacterState.climbend) {
  5541. this._animator.speed = 1.5;
  5542. }
  5543. else {
  5544. this._animator.speed = 1;
  5545. }
  5546. this._animator.play(_actionname, 0, 0);
  5547. }
  5548. };
  5549. /**转换动作名称 */
  5550. NpcScript.prototype.TransitionActionName = function (_actionname) {
  5551. switch (_actionname) {
  5552. case "rollover1":
  5553. return "cefan1";
  5554. case "rollover2":
  5555. return "cefan2";
  5556. case "runwallleft":
  5557. return "paoqiangleft";
  5558. case "rightjump":
  5559. return "rightjump";
  5560. case "runwallright":
  5561. return "paoqiangright";
  5562. case "leftjump":
  5563. return "leftjump";
  5564. case "climbwall":
  5565. return "paqiang";
  5566. case "climbend":
  5567. return "climbend";
  5568. case "stand":
  5569. return "stand";
  5570. case "sky":
  5571. return "kongzhong";
  5572. case "land1":
  5573. return "luodi1";
  5574. case "land2":
  5575. return "luodi2";
  5576. case "highjump1":
  5577. return "datiao1";
  5578. case "highjump2":
  5579. return "datiao2";
  5580. case "run":
  5581. return "run";
  5582. case "jump":
  5583. return "jump";
  5584. case "climbup":
  5585. return "Climb";
  5586. case "falldown":
  5587. return "Freefalling";
  5588. case "climbleft":
  5589. return "left_climb";
  5590. case "climbright":
  5591. return "right_climb";
  5592. case "jumpright":
  5593. return "right_jump";
  5594. case "jumpleft":
  5595. return "left_jump";
  5596. case "ClimbMotion":
  5597. return "PlayPalouAction";
  5598. case "huachan":
  5599. return "huachan";
  5600. case "hurdle":
  5601. return "kualan";
  5602. case "speedupjump":
  5603. return "jiasuJump";
  5604. case "MoveX":
  5605. return "xshunyi";
  5606. case "downmove":
  5607. return "downSlide";
  5608. case "sidespeedup":
  5609. return "slidejiasu";
  5610. case "cross":
  5611. return "surmount";
  5612. case "climbupblock":
  5613. return "lockclimb";
  5614. }
  5615. };
  5616. NpcScript.prototype.TestJump = function () {
  5617. this.nowAction = CharacterState_1.CharacterState.jump;
  5618. };
  5619. NpcScript.prototype.getPostion = function () {
  5620. return this._transform.position;
  5621. };
  5622. NpcScript.prototype.getAction = function () {
  5623. return this._nowRoleState;
  5624. };
  5625. return NpcScript;
  5626. }(Laya.Script3D));
  5627. exports.NpcScript = NpcScript;
  5628. },{"../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){
  5629. "use strict";
  5630. Object.defineProperty(exports, "__esModule", { value: true });
  5631. var TimerService_1 = require("../Time/TimerService");
  5632. var PropManager_1 = require("../PrefabControl/PropManager");
  5633. var CharacterState_1 = require("../PrefabControl/CharacterState");
  5634. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  5635. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  5636. var BuildCFG_1 = require("../CFG/BuildCFG");
  5637. var CameraManager_1 = require("./CameraManager");
  5638. var DispatcherManager_1 = require("../utils/DispatcherManager");
  5639. var GameState_1 = require("../utils/GameState");
  5640. var GameUtils_1 = require("../utils/GameUtils");
  5641. var GameStateControl_1 = require("../Control/GameStateControl");
  5642. var AudioControl_1 = require("../Control/AudioControl");
  5643. var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
  5644. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  5645. var Player = /** @class */ (function (_super) {
  5646. __extends(Player, _super);
  5647. function Player() {
  5648. var _this = _super.call(this) || this;
  5649. _this._isActionNums = false;
  5650. _this._isneedactionnum = 0;
  5651. _this._needactiontime = 0;
  5652. _this._nowActionState = "";
  5653. _this._multiple = new Laya.Vector3(1, 1, 1);
  5654. _this.LastActionState = "";
  5655. _this._moveTime = 0;
  5656. /**
  5657. * 加速buffvec
  5658. */
  5659. _this._lastjiasuState = "";
  5660. _this.buff_speeduptime = 0;
  5661. _this.canshake = false;
  5662. _this.shaketime = 0;
  5663. _this.doublespeedup = false;
  5664. _this.resouseName = "";
  5665. _this._isColling = false;
  5666. _this._nowCollTargetName = "";
  5667. _this._normalizeVec = new Laya.Vector3;
  5668. _this._nowbuildname = "";
  5669. _this._nowscenename = "";
  5670. /**
  5671. * 0:未锁,1:锁左边,2:锁右边
  5672. */
  5673. _this._lockxstate = 0;
  5674. _this._lockbyBuildname = "";
  5675. /**
  5676. * 0:未被锁,1:锁定左边,2:锁定右边,
  5677. */
  5678. _this._lockstate = 0;
  5679. _this._shangpaVec = new Laya.Vector3;
  5680. _this._moveVec = new Laya.Vector3;
  5681. _this.jumpSpeed = new Laya.Vector3;
  5682. _this.jumpHight = 0;
  5683. _this._disy = 0;
  5684. _this.g = 10; //重力加速度
  5685. _this._ending = false;
  5686. _this._endAnmoSpeed = new Laya.Vector3();
  5687. _this._endanmotime = 1;
  5688. _this._endAnmoSpeed1 = new Laya.Vector3;
  5689. _this._changeMoveX = 0;
  5690. _this.isforceJump = false;
  5691. _this.quaternion = new Laya.Quaternion;
  5692. Player.ins = _this;
  5693. return _this;
  5694. }
  5695. Object.defineProperty(Player, "Instance", {
  5696. get: function () {
  5697. if (Player.ins == null) {
  5698. return new Player();
  5699. }
  5700. return Player.ins;
  5701. },
  5702. enumerable: true,
  5703. configurable: true
  5704. });
  5705. Player.prototype.onAwake = function () {
  5706. this._animator = this.owner.getComponent(Laya.Animator);
  5707. PropManager_1.PropManager.setAnimator(this._animator);
  5708. this._speedMoveV3 = new Laya.Vector3(0, 0, 0);
  5709. var sp = this.owner;
  5710. this._transform = sp.transform;
  5711. this._RoleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
  5712. sp.getComponent(Laya.Rigidbody3D).ccdMotionThreshold = 0.001;
  5713. this.LeftTrial = sp.getChildByName("lefttrail");
  5714. this.RightTrial = sp.getChildByName("righttrail");
  5715. };
  5716. Player.prototype.startRun = function (jiasu) {
  5717. var _this = this;
  5718. if (this._RoleData.roleCfg.gravity) {
  5719. this.g = this._RoleData.roleCfg.gravity;
  5720. }
  5721. else {
  5722. this.g = 10;
  5723. }
  5724. this._multiple.x = 1;
  5725. this._multiple.y = 1;
  5726. this._multiple.z = 1;
  5727. this.buff_speeduptime = 0;
  5728. this.doublespeedup = false;
  5729. this._lastjiasuState = "";
  5730. this._ending = false;
  5731. this._changeMoveX = 0;
  5732. this._initPosVec = this._transform.position.clone();
  5733. console.log("玩家的初始位置----", this._initPosVec);
  5734. this._nowbuildname = "";
  5735. this._nowscenename = "";
  5736. this.nowAction = CharacterState_1.CharacterState.run;
  5737. this._speedMoveV3.x = 0;
  5738. this._speedMoveV3.y = 0;
  5739. if (jiasu) {
  5740. this._speedMoveV3.z = -this._RoleData.movespeed * 2;
  5741. Laya.timer.once(3000, this, function () {
  5742. _this._speedMoveV3.z = -_this._RoleData.movespeed;
  5743. });
  5744. }
  5745. else {
  5746. this._speedMoveV3.z = -this._RoleData.movespeed;
  5747. }
  5748. this._iscanMove = true;
  5749. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  5750. };
  5751. // private pzdict:any = {};
  5752. // private pzarr:Array<any> = [];
  5753. /**
  5754. * 开始碰撞时执行
  5755. */
  5756. Player.prototype.onCollisionEnter = function (collision) {
  5757. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  5758. var contactPoint = collision.contacts[0];
  5759. this.Calculate(contactPoint.normal, collision.other.owner, contactPoint.positionOnB);
  5760. }
  5761. };
  5762. /**
  5763. * 持续碰撞时执行
  5764. */
  5765. Player.prototype.onCollisionStay = function (collision) {
  5766. // Debuger.log( "碰撞中" );
  5767. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  5768. this._isColling = true;
  5769. var contactPoint = collision.contacts[0];
  5770. var target = collision.other.owner;
  5771. var targetname = target.name;
  5772. if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1) {
  5773. this._nowCollTargetName = targetname;
  5774. }
  5775. if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
  5776. this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  5777. {
  5778. if (this._nowCollTargetName.indexOf("build") != -1) {
  5779. this._nowbuildname = this._nowCollTargetName;
  5780. this._nowscenename = target.parent.parent.name;
  5781. }
  5782. if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  5783. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  5784. }
  5785. else {
  5786. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
  5787. }
  5788. }
  5789. }
  5790. };
  5791. /**
  5792. * 结束碰撞时执行
  5793. */
  5794. Player.prototype.onCollisionExit = function (collision) {
  5795. this._isColling = false;
  5796. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  5797. var contactPoint = collision.contacts[0];
  5798. this.CheckEnd(contactPoint.normal, collision.other.owner);
  5799. }
  5800. };
  5801. /**检测结束碰撞 */
  5802. Player.prototype.CheckEnd = function (normal, target) {
  5803. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) {
  5804. return;
  5805. }
  5806. if (this.isforceJump) {
  5807. this.isforceJump = false;
  5808. return;
  5809. }
  5810. if (this._lockxstate) {
  5811. this._lockxstate = 0;
  5812. return;
  5813. }
  5814. if (this._nowCollTargetName != target.name) {
  5815. return;
  5816. }
  5817. if (target.name.indexOf("panel_jump") != -1) {
  5818. return;
  5819. }
  5820. switch (this.nowAction) {
  5821. case CharacterState_1.CharacterState.climbup:
  5822. case CharacterState_1.CharacterState.climbupblock:
  5823. if (this._nowCollTargetName.indexOf("box_Board") != -1) {
  5824. this.JumpAction(this._changeMoveX);
  5825. }
  5826. else {
  5827. if (this._changeMoveX > 0) {
  5828. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5829. }
  5830. else if (this._changeMoveX < 0) {
  5831. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5832. }
  5833. }
  5834. break;
  5835. case CharacterState_1.CharacterState.climbright:
  5836. case CharacterState_1.CharacterState.climbleft:
  5837. this.JumpAction(this._changeMoveX);
  5838. break;
  5839. case CharacterState_1.CharacterState.run:
  5840. this.JumpAction(this._changeMoveX);
  5841. break;
  5842. case CharacterState_1.CharacterState.MoveX:
  5843. this.JumpAction(this._speedMoveV3.x);
  5844. break;
  5845. }
  5846. };
  5847. Player.prototype.setnowSelectVec = function (pos) {
  5848. this._nowselectVec = pos;
  5849. };
  5850. /**计算碰撞 */
  5851. Player.prototype.Calculate = function (normal, target, collpoint) {
  5852. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) {
  5853. return;
  5854. }
  5855. this._nowCollTargetName = target.name;
  5856. var n = new Laya.Vector3;
  5857. Laya.Vector3.normalize(normal, this._normalizeVec);
  5858. if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
  5859. this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  5860. {
  5861. if (this._nowCollTargetName.indexOf("build") != -1) {
  5862. this._nowbuildname = this._nowCollTargetName;
  5863. this._nowscenename = target.parent.parent.name;
  5864. }
  5865. if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  5866. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  5867. }
  5868. else {
  5869. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
  5870. }
  5871. if (this._normalizeVec.z == -1) //上爬
  5872. {
  5873. if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.2)) {
  5874. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  5875. this.nowAction = CharacterState_1.CharacterState.run;
  5876. }
  5877. else {
  5878. this.nowAction = CharacterState_1.CharacterState.climbup;
  5879. this._shangpaVec = this._nowselectVec.clone();
  5880. }
  5881. }
  5882. else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) {
  5883. this.nowAction = CharacterState_1.CharacterState.run;
  5884. }
  5885. else if (this._normalizeVec.x == -1) {
  5886. if (this.nowAction == CharacterState_1.CharacterState.run) {
  5887. this._lockxstate = 1;
  5888. }
  5889. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  5890. this._lockxstate = 1;
  5891. }
  5892. else {
  5893. this.nowAction = CharacterState_1.CharacterState.climbleft;
  5894. }
  5895. }
  5896. else if (this._normalizeVec.x == 1) {
  5897. if (this.nowAction == CharacterState_1.CharacterState.run) {
  5898. this._lockxstate = 2;
  5899. }
  5900. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  5901. this._lockxstate = 2;
  5902. }
  5903. else {
  5904. this.nowAction = CharacterState_1.CharacterState.climbright;
  5905. }
  5906. }
  5907. else {
  5908. if (this._normalizeVec.z != 1) {
  5909. this.nowAction = CharacterState_1.CharacterState.climbupblock;
  5910. this._shangpaVec = this._nowselectVec.clone();
  5911. }
  5912. }
  5913. }
  5914. else if (this._nowCollTargetName.indexOf("panel_jump") != -1) //加速板跳跃
  5915. {
  5916. this.nowAction = CharacterState_1.CharacterState.speedupjump;
  5917. }
  5918. else if (this._nowCollTargetName.indexOf("panel_downslip") != -1) {
  5919. this.nowAction = CharacterState_1.CharacterState.downmove;
  5920. }
  5921. else if (this._nowCollTargetName.indexOf("box_Board") != -1 && this.nowAction != CharacterState_1.CharacterState.downmove) {
  5922. if (this._normalizeVec.z == -1) //上爬
  5923. {
  5924. this.nowAction = CharacterState_1.CharacterState.climbup;
  5925. this._shangpaVec = this._nowselectVec.clone();
  5926. }
  5927. }
  5928. else if (this._nowCollTargetName.indexOf("box_sidejump") != -1) {
  5929. this.nowAction = CharacterState_1.CharacterState.sidespeedup;
  5930. }
  5931. else if (this._nowCollTargetName.indexOf("box_Surmount") != -1) {
  5932. this.nowAction = CharacterState_1.CharacterState.cross;
  5933. }
  5934. else if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  5935. this.nowAction = CharacterState_1.CharacterState.climbup;
  5936. this._shangpaVec = this._nowselectVec.clone();
  5937. }
  5938. };
  5939. Player.prototype.JumpAction = function (value) {
  5940. if (value > 0) {
  5941. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5942. // this.setJump( this.nowAction );
  5943. }
  5944. else if (value < 0) {
  5945. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5946. // this.setJump( this.nowAction );
  5947. }
  5948. else {
  5949. this.nowAction = CharacterState_1.CharacterState.jump;
  5950. // this.setJump( this.nowAction );
  5951. }
  5952. };
  5953. Player.prototype.PlayAnimator = function (actionName) {
  5954. var _actionname = this.TransitionActionName(actionName);
  5955. this._StateName = actionName;
  5956. if (this._animator) {
  5957. if (this._StateName == CharacterState_1.CharacterState.climbend || this._StateName == CharacterState_1.CharacterState.land1 || this._StateName == CharacterState_1.CharacterState.land2) {
  5958. this._animator.speed = 1.5;
  5959. }
  5960. else {
  5961. this._animator.speed = 1;
  5962. }
  5963. this._animator.play(_actionname, 0, 0);
  5964. }
  5965. };
  5966. /**转换动作名称 */
  5967. Player.prototype.TransitionActionName = function (_actionname) {
  5968. switch (_actionname) {
  5969. case "rollover1":
  5970. return "cefan1";
  5971. case "rollover2":
  5972. return "cefan2";
  5973. case "runwallleft":
  5974. return "paoqiangleft";
  5975. case "rightjump":
  5976. return "rightjump";
  5977. case "runwallright":
  5978. return "paoqiangright";
  5979. case "leftjump":
  5980. return "leftjump";
  5981. case "climbwall":
  5982. return "paqiang";
  5983. case "climbend":
  5984. return "climbend";
  5985. case "stand":
  5986. return "stand";
  5987. case "sky":
  5988. return "kongzhong";
  5989. case "land1":
  5990. return "luodi1";
  5991. case "land2":
  5992. return "luodi2";
  5993. case "highjump1":
  5994. return "datiao1";
  5995. case "highjump2":
  5996. return "datiao2";
  5997. case "run":
  5998. return "run";
  5999. case "jump":
  6000. return "jump";
  6001. case "climbup":
  6002. return "Climb";
  6003. case "falldown":
  6004. return "Freefalling";
  6005. case "climbleft":
  6006. return "left_climb";
  6007. case "climbright":
  6008. return "right_climb";
  6009. case "jumpright":
  6010. return "right_jump";
  6011. case "jumpleft":
  6012. return "left_jump";
  6013. case "ClimbMotion":
  6014. return "PlayPalouAction";
  6015. case "huachan":
  6016. return "huachan";
  6017. case "hurdle":
  6018. return "kualan";
  6019. case "speedupjump":
  6020. return "jiasuJump";
  6021. case "MoveX":
  6022. return "xshunyi";
  6023. case "downmove":
  6024. return "downSlide";
  6025. case "sidespeedup":
  6026. return "slidejiasu";
  6027. case "cross":
  6028. return "surmount";
  6029. case "climbupblock":
  6030. return "lockclimb";
  6031. }
  6032. };
  6033. Object.defineProperty(Player.prototype, "nowAction", {
  6034. get: function () {
  6035. return this._nowActionState;
  6036. },
  6037. set: function (value) {
  6038. if (this._nowActionState != value || this.LastActionState == CharacterState_1.CharacterState.speedupjump || this._nowActionState == CharacterState_1.CharacterState.speedupjump) {
  6039. this.LastActionState = this._nowActionState;
  6040. this._nowActionState = value;
  6041. this._moveTime = 0;
  6042. this.canshake = false;
  6043. this.ChangeTrial(true);
  6044. switch (this._nowActionState) {
  6045. case CharacterState_1.CharacterState.stand:
  6046. this._isActionNums = false;
  6047. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  6048. break;
  6049. case CharacterState_1.CharacterState.run:
  6050. if (this.LastActionState == CharacterState_1.CharacterState.jump || this.LastActionState == CharacterState_1.CharacterState.jumpleft || this.LastActionState == CharacterState_1.CharacterState.jumpright) {
  6051. this._isActionNums = true;
  6052. this._isneedactionnum = 1;
  6053. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  6054. if (sort < 50) {
  6055. this.PlayAnimator(CharacterState_1.CharacterState.land1);
  6056. }
  6057. else {
  6058. this.PlayAnimator(CharacterState_1.CharacterState.land2);
  6059. }
  6060. }
  6061. else {
  6062. this._isActionNums = false;
  6063. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6064. }
  6065. break;
  6066. case CharacterState_1.CharacterState.jump:
  6067. this.PlayAnimator(CharacterState_1.CharacterState.jump);
  6068. PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
  6069. this._isActionNums = true;
  6070. this._isneedactionnum = 1;
  6071. this.jumpSpeed.x = this._RoleData.frontjump.x;
  6072. this.jumpSpeed.y = this._RoleData.frontjump.y;
  6073. this.jumpSpeed.z = this._RoleData.frontjump.z;
  6074. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6075. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6076. break;
  6077. case CharacterState_1.CharacterState.jumpleft:
  6078. PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
  6079. this.jumpSpeed.x = this._RoleData.leftjump.x;
  6080. this.jumpSpeed.y = this._RoleData.leftjump.y;
  6081. this.jumpSpeed.z = this._RoleData.leftjump.z;
  6082. this._isActionNums = true;
  6083. this._isneedactionnum = 1;
  6084. this.PlayAnimator(CharacterState_1.CharacterState.leftjump);
  6085. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6086. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6087. break;
  6088. case CharacterState_1.CharacterState.jumpright:
  6089. PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
  6090. this.jumpSpeed.x = this._RoleData.rightjump.x;
  6091. this.jumpSpeed.y = this._RoleData.rightjump.y;
  6092. this.jumpSpeed.z = this._RoleData.rightjump.z;
  6093. this._isActionNums = true;
  6094. this._isneedactionnum = 1;
  6095. this.PlayAnimator(CharacterState_1.CharacterState.rightjump);
  6096. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6097. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6098. break;
  6099. case CharacterState_1.CharacterState.speedupjump:
  6100. var buildcfg = BuildCFG_1.default.dict["panel_jump"];
  6101. if (this.buff_speeduptime > 0) {
  6102. this._multiple.x = 1;
  6103. this._multiple.y = 1;
  6104. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6105. this.doublespeedup = true;
  6106. }
  6107. else {
  6108. this._multiple.x = 1;
  6109. this._multiple.y = 1;
  6110. this._multiple.z = buildcfg.buffz;
  6111. }
  6112. this.buff_speeduptime = buildcfg.time;
  6113. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6114. this.jumpSpeed.y = buildcfg.buffy;
  6115. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6116. this._isActionNums = true;
  6117. this._isneedactionnum = 1;
  6118. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  6119. if (sort < 50) {
  6120. this.PlayAnimator(CharacterState_1.CharacterState.highjump1);
  6121. }
  6122. else {
  6123. this.PlayAnimator(CharacterState_1.CharacterState.highjump2);
  6124. }
  6125. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6126. Laya.timer.clear(this, this.playspeedSound);
  6127. Laya.timer.once(200, this, this.playspeedSound);
  6128. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6129. break;
  6130. case CharacterState_1.CharacterState.downmove:
  6131. var buildcfg = BuildCFG_1.default.dict["panel_downslip"];
  6132. if (this.buff_speeduptime > 0) {
  6133. this._multiple.x = 1;
  6134. this._multiple.y = 1;
  6135. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6136. this.doublespeedup = true;
  6137. }
  6138. else {
  6139. this._multiple.x = 1;
  6140. this._multiple.y = 1;
  6141. this._multiple.z = buildcfg.buffz;
  6142. }
  6143. this.buff_speeduptime = buildcfg.time;
  6144. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6145. this.jumpSpeed.y = buildcfg.buffy * this._multiple.y;
  6146. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6147. this._isActionNums = true;
  6148. this._isneedactionnum = 1;
  6149. this.PlayAnimator(CharacterState_1.CharacterState.huachan);
  6150. this.playspeedSound();
  6151. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6152. break;
  6153. case CharacterState_1.CharacterState.sidespeedup:
  6154. var buildcfg = BuildCFG_1.default.dict["box_sidejump"];
  6155. if (this.buff_speeduptime > 0) {
  6156. this._multiple.x = 1;
  6157. this._multiple.y = 1;
  6158. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6159. this.doublespeedup = true;
  6160. }
  6161. else {
  6162. this._multiple.x = 1;
  6163. this._multiple.y = 1;
  6164. this._multiple.z = buildcfg.buffz;
  6165. }
  6166. this.buff_speeduptime = buildcfg.time;
  6167. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6168. this.jumpSpeed.y = buildcfg.buffy * this._multiple.y;
  6169. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6170. this._isActionNums = false;
  6171. this.playspeedSound();
  6172. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6173. // this.PlayAnimator( CharacterState. );
  6174. break;
  6175. case CharacterState_1.CharacterState.cross:
  6176. var buildcfg = BuildCFG_1.default.dict["box_Surmount"];
  6177. if (this.buff_speeduptime > 0) {
  6178. this._multiple.x = 1;
  6179. this._multiple.y = 1;
  6180. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6181. this.doublespeedup = true;
  6182. }
  6183. else {
  6184. this._multiple.x = 1;
  6185. this._multiple.y = 1;
  6186. this._multiple.z = buildcfg.buffz;
  6187. }
  6188. this.buff_speeduptime = buildcfg.time;
  6189. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6190. this.jumpSpeed.y = (buildcfg.buffy + 0.5) * this._multiple.y;
  6191. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6192. this._isActionNums = true;
  6193. this._isneedactionnum = 1;
  6194. this.PlayAnimator(CharacterState_1.CharacterState.hurdle);
  6195. break;
  6196. case CharacterState_1.CharacterState.climbup:
  6197. case CharacterState_1.CharacterState.climbupblock:
  6198. this.jumpSpeed.x = 0;
  6199. this.jumpSpeed.y = this._RoleData.upclimb;
  6200. this.jumpSpeed.z = 0;
  6201. this._isActionNums = false;
  6202. this.PlayAnimator(CharacterState_1.CharacterState.climbwall);
  6203. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6204. this.canshake = true;
  6205. this.shaketime = 0;
  6206. this.ChangeTrial(false);
  6207. break;
  6208. case CharacterState_1.CharacterState.climbleft:
  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.runwallleft);
  6214. this.ChangeTrial(false);
  6215. break;
  6216. case CharacterState_1.CharacterState.climbright:
  6217. this.jumpSpeed.x = 0;
  6218. this.jumpSpeed.y = this._RoleData.slideclimb.y;
  6219. this.jumpSpeed.z = this._RoleData.slideclimb.z;
  6220. this._isActionNums = false;
  6221. this.PlayAnimator(CharacterState_1.CharacterState.runwallright);
  6222. this.ChangeTrial(false);
  6223. break;
  6224. case CharacterState_1.CharacterState.ClimbMotion:
  6225. this._isActionNums = true;
  6226. this._isneedactionnum = 0;
  6227. this._needactiontime = 0.3;
  6228. this._moveTime = 0;
  6229. this.PlayAnimator(CharacterState_1.CharacterState.climbend);
  6230. break;
  6231. }
  6232. }
  6233. },
  6234. enumerable: true,
  6235. configurable: true
  6236. });
  6237. Player.prototype.playspeedSound = function () {
  6238. AudioControl_1.AudioControl.Instance.playGameSound("speedup");
  6239. };
  6240. Player.prototype.ChangeTrial = function (bo) {
  6241. if (this.LeftTrial && this.RightTrial && this.LeftTrial.active != bo) {
  6242. this.LeftTrial.active = bo;
  6243. this.RightTrial.active = bo;
  6244. }
  6245. };
  6246. Player.prototype.Joy = function (value, value1, angle) {
  6247. if (this.nowAction == CharacterState_1.CharacterState.run) {
  6248. this._changeMoveX = value;
  6249. }
  6250. else if (this.nowAction == CharacterState_1.CharacterState.climbup || CharacterState_1.CharacterState.climbleft || CharacterState_1.CharacterState.climbright) {
  6251. this._changeMoveX = value1;
  6252. }
  6253. if (this.nowAction == CharacterState_1.CharacterState.climbleft && this._changeMoveX > 0) //强制跳跃
  6254. {
  6255. this.isforceJump = true;
  6256. this.nowAction = CharacterState_1.CharacterState.jumpright;
  6257. }
  6258. else if (this.nowAction == CharacterState_1.CharacterState.climbright && this._changeMoveX < 0) {
  6259. this.isforceJump = true;
  6260. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  6261. }
  6262. if (this.nowAction == CharacterState_1.CharacterState.jump ||
  6263. this.nowAction == CharacterState_1.CharacterState.jumpleft ||
  6264. this.nowAction == CharacterState_1.CharacterState.jumpright ||
  6265. this.nowAction == CharacterState_1.CharacterState.speedupjump) {
  6266. angle = -angle * Math.PI / 180;
  6267. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion);
  6268. var jumpz = this.jumpSpeed.z;
  6269. Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed);
  6270. this.jumpSpeed.z = jumpz;
  6271. }
  6272. };
  6273. Player.prototype.update = function (dt) {
  6274. dt = 16;
  6275. if (this._iscanMove) {
  6276. var distime = dt / 1000;
  6277. this._moveTime += distime;
  6278. switch (this.nowAction) {
  6279. case CharacterState_1.CharacterState.run: //跑动
  6280. this._moveVec.y = 0;
  6281. this._moveVec.z = distime * (this._speedMoveV3.z * this._multiple.z);
  6282. if (this._lockxstate == 0) {
  6283. this._moveVec.x = this._changeMoveX * distime;
  6284. }
  6285. else if (this._lockxstate == 1) {
  6286. if (this._changeMoveX < 0) {
  6287. this._moveVec.x = 0;
  6288. }
  6289. else {
  6290. this._moveVec.x = this._changeMoveX * distime;
  6291. }
  6292. }
  6293. else if (this._lockxstate == 2) {
  6294. if (this._changeMoveX > 0) {
  6295. this._moveVec.x = 0;
  6296. }
  6297. else {
  6298. this._moveVec.x = this._changeMoveX * distime;
  6299. }
  6300. }
  6301. this._transform.translate(this._moveVec, false);
  6302. break;
  6303. case CharacterState_1.CharacterState.climbup: //爬升
  6304. this._moveVec.z = 0;
  6305. this._moveVec.y = distime * this.jumpSpeed.y;
  6306. if (this._lockxstate == 1) {
  6307. if (this._changeMoveX < 0) {
  6308. this._moveVec.x = 0;
  6309. }
  6310. else {
  6311. this._moveVec.x = this._changeMoveX * distime;
  6312. }
  6313. }
  6314. else if (this._lockstate == 2) {
  6315. if (this._changeMoveX > 0) {
  6316. this._moveVec.x = 0;
  6317. }
  6318. else {
  6319. this._moveVec.x = this._changeMoveX * distime;
  6320. }
  6321. }
  6322. else {
  6323. this._moveVec.x = this._changeMoveX * distime;
  6324. }
  6325. this._transform.translate(this._moveVec, false);
  6326. if (this._shangpaVec) {
  6327. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  6328. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6329. }
  6330. }
  6331. else if (this._nowselectVec) {
  6332. if (this._transform.position.y + 1 > this._nowselectVec.y) {
  6333. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6334. }
  6335. }
  6336. break;
  6337. case CharacterState_1.CharacterState.climbupblock:
  6338. this._moveVec.z = 0;
  6339. this._moveVec.y = distime * this.jumpSpeed.y;
  6340. this._moveVec.x = 0;
  6341. this._transform.translate(this._moveVec, false);
  6342. if (this._shangpaVec) {
  6343. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  6344. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6345. }
  6346. }
  6347. else if (this._transform.position.y + 1 > this._nowselectVec.y) {
  6348. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6349. }
  6350. break;
  6351. case CharacterState_1.CharacterState.jump: //跳跃
  6352. case CharacterState_1.CharacterState.jumpleft:
  6353. case CharacterState_1.CharacterState.jumpright:
  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.speedupjump:
  6362. this._disy = this.jumpSpeed.y - this.g * distime;
  6363. this.jumpSpeed.y = this._disy;
  6364. this._moveVec.x = this.jumpSpeed.x * distime;
  6365. this._moveVec.y = this._disy * distime;
  6366. this._moveVec.z = this.jumpSpeed.z * distime;
  6367. this._transform.translate(this._moveVec, false);
  6368. break;
  6369. case CharacterState_1.CharacterState.climbleft:
  6370. case CharacterState_1.CharacterState.climbright:
  6371. this._moveVec.z = distime * this.jumpSpeed.y;
  6372. this._moveVec.y = this.jumpSpeed.y * distime;
  6373. this._moveVec.x = 0;
  6374. this._transform.translate(this._moveVec, false);
  6375. break;
  6376. case CharacterState_1.CharacterState.MoveX:
  6377. this._moveVec.z = distime * this._speedMoveV3.z;
  6378. this._moveVec.x = this._speedMoveV3.x * distime;
  6379. this._transform.translate(this._moveVec, false);
  6380. if (this._moveTime > 0.1) {
  6381. this.nowAction = CharacterState_1.CharacterState.run;
  6382. }
  6383. break;
  6384. case CharacterState_1.CharacterState.downmove:
  6385. this._moveVec.y = this.jumpSpeed.x;
  6386. this._moveVec.x = this.jumpSpeed.y;
  6387. this._moveVec.z = this.jumpSpeed.z * distime;
  6388. this._transform.translate(this._moveVec, false);
  6389. break;
  6390. case CharacterState_1.CharacterState.sidespeedup:
  6391. this._moveVec.y = 0;
  6392. this._moveVec.x = 0;
  6393. this._moveVec.z = this.jumpSpeed.z * distime;
  6394. this._transform.translate(this._moveVec, false);
  6395. if (this.buff_speeduptime <= 0 && this.LastActionState == CharacterState_1.CharacterState.climbleft || this.LastActionState == CharacterState_1.CharacterState.climbright) {
  6396. this.nowAction = this.LastActionState;
  6397. }
  6398. else {
  6399. this.nowAction = CharacterState_1.CharacterState.jump;
  6400. }
  6401. break;
  6402. case CharacterState_1.CharacterState.cross:
  6403. this._disy = this.jumpSpeed.y - this.g * distime;
  6404. this.jumpSpeed.y = this._disy;
  6405. this._moveVec.x = this.jumpSpeed.x * distime;
  6406. this._moveVec.y = this._disy * distime;
  6407. this._moveVec.z = this.jumpSpeed.z * distime;
  6408. this._transform.translate(this._moveVec, false);
  6409. break;
  6410. case CharacterState_1.CharacterState.ClimbMotion:
  6411. if (this._nowselectVec) {
  6412. if (this._transform.position.y < this._nowselectVec.y) {
  6413. this._moveVec.x = 0;
  6414. this._moveVec.y = (1 / 0.3) * distime;
  6415. this._moveVec.z = 0;
  6416. this._transform.translate(this._moveVec, false);
  6417. }
  6418. }
  6419. break;
  6420. }
  6421. if (this._nowselectVec && (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.downmove) && !this._isColling) {
  6422. if (this._transform.position.z <= this._nowselectVec.z) {
  6423. if (this._changeMoveX > 0) {
  6424. this.nowAction = CharacterState_1.CharacterState.jumpright;
  6425. }
  6426. else if (this._changeMoveX < 0) {
  6427. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  6428. }
  6429. else {
  6430. this.nowAction = CharacterState_1.CharacterState.jump;
  6431. }
  6432. }
  6433. }
  6434. if (this._transform.position.y < PropManager_1.PropManager.diePosY - PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.DieDistance) //角色死亡
  6435. {
  6436. if (this._nowscenename == "" || this._nowbuildname == "") {
  6437. if (GameState_1.GameState.fuhuocishu > 0) {
  6438. this.Revive();
  6439. }
  6440. else {
  6441. this.Lose();
  6442. }
  6443. }
  6444. else {
  6445. if (GameState_1.GameState.fuhuocishu > 0) {
  6446. this.Revive();
  6447. }
  6448. else {
  6449. this.Lose();
  6450. }
  6451. }
  6452. this.nowAction = CharacterState_1.CharacterState.stand;
  6453. }
  6454. if (this._transform.position.z < PropManager_1.PropManager.gamewinPosZ) //到达终点
  6455. {
  6456. this.Win();
  6457. }
  6458. else {
  6459. PropManager_1.PropManager.pro_jindu.value = this._transform.position.z / PropManager_1.PropManager.gamewinPosZ * 100;
  6460. }
  6461. if (this._isActionNums) {
  6462. if (this._isneedactionnum > 0) {
  6463. if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) {
  6464. switch (this._StateName) {
  6465. case CharacterState_1.CharacterState.jump:
  6466. case CharacterState_1.CharacterState.leftjump:
  6467. case CharacterState_1.CharacterState.rightjump:
  6468. case CharacterState_1.CharacterState.highjump1:
  6469. case CharacterState_1.CharacterState.highjump2:
  6470. case CharacterState_1.CharacterState.hurdle:
  6471. this._isActionNums = false;
  6472. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6473. break;
  6474. case CharacterState_1.CharacterState.huachan:
  6475. case CharacterState_1.CharacterState.climbend:
  6476. this._isActionNums = false;
  6477. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6478. this.nowAction = CharacterState_1.CharacterState.run;
  6479. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  6480. break;
  6481. case CharacterState_1.CharacterState.land1:
  6482. // this._isActionNums = false;
  6483. // this.PlayAnimator( CharacterState.run );
  6484. case CharacterState_1.CharacterState.land2:
  6485. this._isActionNums = false;
  6486. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6487. break;
  6488. case CharacterState_1.CharacterState.huachan:
  6489. this.nowAction = CharacterState_1.CharacterState.run;
  6490. break;
  6491. }
  6492. }
  6493. }
  6494. else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) {
  6495. switch (this._StateName) {
  6496. case CharacterState_1.CharacterState.jump:
  6497. case CharacterState_1.CharacterState.leftjump:
  6498. case CharacterState_1.CharacterState.rightjump:
  6499. case CharacterState_1.CharacterState.highjump1:
  6500. case CharacterState_1.CharacterState.highjump2:
  6501. this._isActionNums = false;
  6502. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6503. this._changeMoveX = 0;
  6504. break;
  6505. case CharacterState_1.CharacterState.hurdle:
  6506. this._isActionNums = false;
  6507. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6508. break;
  6509. case CharacterState_1.CharacterState.huachan:
  6510. case CharacterState_1.CharacterState.climbend:
  6511. this._isActionNums = false;
  6512. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6513. this.nowAction = CharacterState_1.CharacterState.run;
  6514. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  6515. break;
  6516. }
  6517. }
  6518. }
  6519. if (this.buff_speeduptime > 0) {
  6520. this.buff_speeduptime -= distime;
  6521. PropManager_1.PropManager.Instance.SpeedUpEffect("jiasulizi", this._transform.position);
  6522. if (this.doublespeedup) {
  6523. PropManager_1.PropManager.Instance.SpeedUpEffect1("jiasulizi", this._transform.position);
  6524. }
  6525. }
  6526. else {
  6527. this._multiple.x = 1;
  6528. this._multiple.y = 1;
  6529. this._multiple.z = 1;
  6530. this.doublespeedup = false;
  6531. PropManager_1.PropManager.Instance.CloseSpeedUpEffect();
  6532. PropManager_1.PropManager.Instance.CloseSpeedUpEffect1();
  6533. }
  6534. if (this.canshake) {
  6535. this.shaketime += distime;
  6536. if (this.shaketime >= 0.5) {
  6537. this.shaketime = 0;
  6538. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6539. }
  6540. }
  6541. }
  6542. else {
  6543. if (this._ending) {
  6544. var distime = dt / 1000;
  6545. this._moveTime += distime;
  6546. if (this._moveTime >= this._endanmotime) {
  6547. this.GameOver();
  6548. }
  6549. else {
  6550. this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime;
  6551. this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime;
  6552. this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime;
  6553. PropManager_1.PropManager.carma.getComponent(CameraManager_1.CameraManager).GameEndRotate(this._transform.position, this._endAnmoSpeed1);
  6554. }
  6555. }
  6556. }
  6557. };
  6558. Player.prototype.Win = function () {
  6559. AudioControl_1.AudioControl.Instance.playGameSound("over");
  6560. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.end);
  6561. var carmaTrans = PropManager_1.PropManager.carma.transform;
  6562. this._endAnmoSpeed.z = (this._transform.position.z - 2 - carmaTrans.position.z) / this._endanmotime;
  6563. this._endAnmoSpeed.y = (this._transform.position.y - carmaTrans.position.y) / this._endanmotime;
  6564. this._endAnmoSpeed.x = (this._transform.position.x + 3 - carmaTrans.position.x) / this._endanmotime;
  6565. this._moveTime = 0;
  6566. this._iscanMove = false;
  6567. this._ending = true;
  6568. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6569. PropManager_1.PropManager.Instance.GameOverEffecf("yanhua", this._transform.position, GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0 ? true : false);
  6570. };
  6571. /**出现复活界面 */
  6572. Player.prototype.Revive = function () {
  6573. AudioControl_1.AudioControl.Instance.playGameSound("over");
  6574. GameState_1.GameState.isdie = true;
  6575. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.revive);
  6576. this._iscanMove = false;
  6577. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  6578. // this._ending = true;
  6579. };
  6580. Player.prototype.Lose = function () {
  6581. AudioControl_1.AudioControl.Instance.playGameSound("over");
  6582. GameState_1.GameState.isdie = true;
  6583. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
  6584. this._iscanMove = false;
  6585. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  6586. this._ending = true;
  6587. };
  6588. Player.prototype.GameOver = function () {
  6589. this._ending = false;
  6590. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  6591. };
  6592. Player.prototype.TestJump = function () {
  6593. this.nowAction = CharacterState_1.CharacterState.jump;
  6594. };
  6595. Player.prototype.destroy = function () {
  6596. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  6597. _super.prototype.destroy.call(this);
  6598. };
  6599. Player.prototype.XMove = function (state) {
  6600. if (this.nowAction == CharacterState_1.CharacterState.run) {
  6601. this._moveTime = 0;
  6602. this._speedMoveV3.x = state * 20;
  6603. this.nowAction = CharacterState_1.CharacterState.MoveX;
  6604. }
  6605. };
  6606. Player.prototype.dispose = function () {
  6607. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  6608. };
  6609. return Player;
  6610. }(Laya.Script3D));
  6611. exports.Player = Player;
  6612. },{"../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){
  6613. "use strict";
  6614. Object.defineProperty(exports, "__esModule", { value: true });
  6615. var Global = /** @class */ (function () {
  6616. function Global() {
  6617. }
  6618. Global.curHeight = function () {
  6619. return Laya.stage.height;
  6620. };
  6621. Global.curWidth = function () {
  6622. return Laya.stage.width;
  6623. };
  6624. Global.setVars = function () {
  6625. Global.stage = Laya.stage;
  6626. Global.sethttpurl();
  6627. };
  6628. Global.getUrl = function (url) {
  6629. if (url.indexOf("wxlocal") == -1) {
  6630. return Global.resourcehtttp + url + Global.versions;
  6631. }
  6632. return url;
  6633. };
  6634. Global.sethttpurl = function () {
  6635. if (Global.isdebug) {
  6636. Global.httpurl = "https://wxgamedev.51yoyoyo.com/";
  6637. }
  6638. else {
  6639. Global.httpurl = "https://minport.51yoyoyo.com/";
  6640. }
  6641. };
  6642. Global.httpurl = "";
  6643. Global.resourcehtttp = "";
  6644. Global.cdnurl = "https://wxgame.51yoyoyo.com/";
  6645. /**
  6646. * 资源后缀版本号
  6647. */
  6648. Global.versions = ""; //"?v=1.0.7";
  6649. Global.initWidth = 720;
  6650. Global.initHeight = 1280;
  6651. /**
  6652. * 资源版本号
  6653. */
  6654. Global.resconfigVersion = "";
  6655. /**
  6656. * 当前平台
  6657. */
  6658. Global.nowplatfrom = "";
  6659. /**
  6660. * 当前游戏appid
  6661. */
  6662. Global.appid = "wx46f4626932e5f48b";
  6663. /**
  6664. * 游戏版本号
  6665. */
  6666. Global.gameVersion = "1.0.0";
  6667. /**
  6668. * 是否调试版本
  6669. */
  6670. Global.isdebug = false;
  6671. Global.AppKeyID = 0;
  6672. Global.MemberID = 0;
  6673. return Global;
  6674. }());
  6675. exports.Global = Global;
  6676. },{}],40:[function(require,module,exports){
  6677. "use strict";
  6678. Object.defineProperty(exports, "__esModule", { value: true });
  6679. var GlobalWaiting = /** @class */ (function (_super) {
  6680. __extends(GlobalWaiting, _super);
  6681. function GlobalWaiting() {
  6682. var _this = _super.call(this) || this;
  6683. _this._isforcehide = false;
  6684. _this._lastTime = 0;
  6685. return _this;
  6686. }
  6687. GlobalWaiting.prototype.constructFromXML = function (xml) {
  6688. this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  6689. _super.prototype.constructFromXML.call(this, xml);
  6690. this.img_0 = this.getChild("img_0").asImage;
  6691. this.img_0.visible = false;
  6692. this.on(Laya.Event.DISPLAY, this, this.onAddedToStage);
  6693. this.on(Laya.Event.UNDISPLAY, this, this.onRemoveFromStage);
  6694. };
  6695. GlobalWaiting.prototype.onAddedToStage = function () {
  6696. this._lastTime = Laya.Browser.now();
  6697. Laya.timer.frameLoop(1, this, this.onTimer);
  6698. };
  6699. GlobalWaiting.prototype.onTimer = function () {
  6700. if (this.img_0) {
  6701. var nowtime = Laya.Browser.now();
  6702. var distime = nowtime - this._lastTime;
  6703. if (distime / 1000 >= 0) {
  6704. if (!this._isforcehide) {
  6705. this.img_0.visible = true;
  6706. }
  6707. var i = this.img_0.rotation;
  6708. i += 10;
  6709. if (i > 360)
  6710. i = i % 360;
  6711. this.img_0.rotation = i;
  6712. }
  6713. else {
  6714. this.img_0.visible = false;
  6715. }
  6716. }
  6717. };
  6718. GlobalWaiting.prototype.hideimg = function () {
  6719. this._isforcehide = true;
  6720. if (this.img_0) {
  6721. this.img_0.visible = false;
  6722. }
  6723. };
  6724. GlobalWaiting.prototype.onRemoveFromStage = function () {
  6725. Laya.timer.clear(this, this.onTimer);
  6726. };
  6727. return GlobalWaiting;
  6728. }(fairygui.GComponent));
  6729. exports.GlobalWaiting = GlobalWaiting;
  6730. },{}],41:[function(require,module,exports){
  6731. "use strict";
  6732. Object.defineProperty(exports, "__esModule", { value: true });
  6733. var JoystickModule = /** @class */ (function (_super) {
  6734. __extends(JoystickModule, _super);
  6735. function JoystickModule(clickpanel) {
  6736. var _this = _super.call(this) || this;
  6737. _this.dis = 0;
  6738. _this.degree = 0;
  6739. _this.angle = 0;
  6740. _this.offx = 0;
  6741. _this._iscanCBack = false;
  6742. _this.mLastMouseX = 0;
  6743. _this.mLastMouseY = 0;
  6744. _this.mX = 0;
  6745. _this.mY = 0;
  6746. _this._iacanCallback = false;
  6747. _this._clickpanel = clickpanel;
  6748. _this._button = new Laya.Point();
  6749. _this.touchId = -1;
  6750. _this.radius = 400;
  6751. _this._curPos = new Laya.Point();
  6752. _this._clickpanel.on(Laya.Event.MOUSE_DOWN, _this, _this.onTouchDown);
  6753. return _this;
  6754. }
  6755. JoystickModule.prototype.onTouchDown = function (evt) {
  6756. if (this.touchId == -1) { //First touch
  6757. this.touchId = evt.touchId;
  6758. this.offx = 0;
  6759. this._iscanCBack = false;
  6760. fairygui.GRoot.inst.globalToLocal(Laya.stage.mouseX, Laya.stage.mouseY, this._curPos);
  6761. var bx = this._curPos.x;
  6762. var by = this._curPos.y;
  6763. this._lastStageX = bx;
  6764. this._lastStageY = by;
  6765. this._startStageX = bx;
  6766. this._startStageY = by;
  6767. this._button.x = bx;
  6768. this._button.y = by;
  6769. if (this._callobj && this._downCallback) {
  6770. this._downCallback.call(this._callobj);
  6771. }
  6772. this._clickpanel.on(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove);
  6773. this._clickpanel.on(Laya.Event.MOUSE_UP, this, this.OnTouchUp);
  6774. this._clickpanel.on(Laya.Event.MOUSE_OUT, this, this.OnTouchUp);
  6775. }
  6776. };
  6777. JoystickModule.prototype.setEventCallback = function (callobj, downCallback, movecallback, upcallback) {
  6778. this._callobj = callobj;
  6779. this._downCallback = downCallback;
  6780. this._movecallback = movecallback;
  6781. this._updatecallback = upcallback;
  6782. };
  6783. JoystickModule.prototype.Trigger = function (evt) {
  6784. this.onTouchDown(evt);
  6785. };
  6786. //创建地图
  6787. JoystickModule.prototype.createMap = function () {
  6788. //创建地图对象
  6789. this.tiledMap = new Laya.TiledMap();
  6790. this.mX = this.mY = 0;
  6791. //创建地图,适当的时候调用destory销毁地图
  6792. this.tiledMap.createMap("res/tiledMap/desert.json", new Laya.Rectangle(0, 0, Laya.Browser.width, Laya.Browser.height), new Laya.Handler(this, this.completeHandler));
  6793. };
  6794. /**
  6795. * 地图加载完成的回调
  6796. */
  6797. JoystickModule.prototype.completeHandler = function () {
  6798. console.log("地图创建完成");
  6799. console.log("ClientW:" + Laya.Browser.clientWidth + " ClientH:" + Laya.Browser.clientHeight);
  6800. };
  6801. /************************************************* */
  6802. JoystickModule.prototype.OnTouchUp = function (evt) {
  6803. if (evt === void 0) { evt = null; }
  6804. if (this.touchId != -1 && evt.touchId == this.touchId) {
  6805. this.touchup();
  6806. if (this._callobj && this._updatecallback) {
  6807. this._updatecallback.call(this._callobj);
  6808. }
  6809. }
  6810. };
  6811. JoystickModule.prototype.touchup = function () {
  6812. this._iscanCBack = false;
  6813. this.touchId = -1;
  6814. this._clickpanel.off(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove);
  6815. this._clickpanel.off(Laya.Event.MOUSE_UP, this, this.OnTouchUp);
  6816. this._clickpanel.off(Laya.Event.MOUSE_OUT, this, this.OnTouchUp);
  6817. this._iacanCallback = false;
  6818. this.degree = 0;
  6819. };
  6820. JoystickModule.prototype.OnTouchMove = function (evt) {
  6821. if (this.touchId != -1 && evt.touchId == this.touchId) {
  6822. var bx = Laya.stage.mouseX;
  6823. var by = Laya.stage.mouseY;
  6824. var moveX = bx - this._lastStageX;
  6825. var moveY = by - this._lastStageY;
  6826. this._lastStageX = bx;
  6827. this._lastStageY = by;
  6828. var buttonX = this._button.x + moveX;
  6829. var buttonY = this._button.y + moveY;
  6830. var offsetX = buttonX - this._startStageX;
  6831. var offsetY = buttonY - this._startStageY;
  6832. var disX = 0;
  6833. if (moveX >= 2 || moveX <= -2) {
  6834. this._iscanCBack = true;
  6835. }
  6836. else {
  6837. this._iscanCBack = false;
  6838. }
  6839. this.offx = moveX;
  6840. if (offsetX == 0 && offsetY == 0) {
  6841. return;
  6842. }
  6843. if (offsetX > 0) {
  6844. if (offsetX > this.radius) {
  6845. disX = this.radius;
  6846. this.angle = 90;
  6847. }
  6848. else {
  6849. disX = this.radius - offsetX;
  6850. this.angle = 90 - disX / this.radius * 90;
  6851. }
  6852. }
  6853. else if (offsetX == 0) {
  6854. this.angle = 0;
  6855. }
  6856. else {
  6857. if (-offsetX > this.radius) {
  6858. disX = this.radius;
  6859. this.angle = -90;
  6860. }
  6861. else {
  6862. disX = this.radius + offsetX;
  6863. this.angle = -(90 - disX / this.radius * 90);
  6864. }
  6865. }
  6866. var rad = Math.atan2(offsetY, offsetX);
  6867. this.degree = rad;
  6868. var maxX = this.radius * Math.cos(rad);
  6869. var maxY = this.radius * Math.sin(rad);
  6870. if (Math.abs(offsetX) > Math.abs(maxX))
  6871. offsetX = maxX;
  6872. if (Math.abs(offsetY) > Math.abs(maxY))
  6873. offsetY = maxY;
  6874. buttonX = this._startStageX + offsetX;
  6875. buttonY = this._startStageY + offsetY;
  6876. if (buttonX < 0)
  6877. buttonX = 0;
  6878. if (buttonY > fairygui.GRoot.inst.height)
  6879. buttonY = fairygui.GRoot.inst.height;
  6880. this._button.x = buttonX;
  6881. this._button.y = buttonY;
  6882. this.dis = Math.sqrt(offsetX * offsetX + offsetY * offsetY);
  6883. this._iacanCallback = true;
  6884. if (this._iscanCBack && this._callobj && this._movecallback && this._iacanCallback) {
  6885. this._movecallback.call(this._callobj, this.offx);
  6886. }
  6887. }
  6888. };
  6889. JoystickModule.prototype.dispose = function () {
  6890. this._clickpanel.off(Laya.Event.MOUSE_DOWN, this, this.onTouchDown);
  6891. };
  6892. // private _center:fairygui.GImage;
  6893. JoystickModule.JoystickMoving = "JoystickMoving";
  6894. JoystickModule.JoystickUp = "JoystickUp";
  6895. return JoystickModule;
  6896. }(Laya.EventDispatcher));
  6897. exports.JoystickModule = JoystickModule;
  6898. },{}],42:[function(require,module,exports){
  6899. "use strict";
  6900. Object.defineProperty(exports, "__esModule", { value: true });
  6901. var Global_1 = require("./Global");
  6902. var Stage = Laya.Stage;
  6903. var AssetPath_1 = require("./Config/AssetPath");
  6904. var GameContents_1 = require("./GameContents");
  6905. var Sdk_1 = require("./WXSDK/Sdk");
  6906. var Main = /** @class */ (function () {
  6907. function Main() {
  6908. //根据IDE设置初始化引擎
  6909. // Laya.init(Global.initWidth, Global.initHeight, Laya["WebGL"]);
  6910. Laya3D.init(Global_1.Global.initWidth, Global_1.Global.initHeight);
  6911. Laya.stage.scaleMode = Stage.SCALE_FIXED_WIDTH;
  6912. Laya.stage.alignH = Stage.ALIGN_CENTER;
  6913. Laya.stage.alignV = Stage.ALIGN_TOP;
  6914. Laya.stage.screenMode = Stage.SCREEN_VERTICAL;
  6915. Laya.stage.bgColor = "#54B9F6";
  6916. // Laya.Stat.show();
  6917. Laya.alertGlobalError = true;
  6918. window['Config3D'] && (window['Config3D']["_default"]["_defaultPhysicsMemory"] = 128);
  6919. if (Laya.Browser.window.tt) {
  6920. // WxApi.WxInit();
  6921. Sdk_1.WxApi.CheckWXUpdate();
  6922. }
  6923. Laya.stage.on("resize", this, this.onResize);
  6924. }
  6925. Main.prototype.onResize = function () {
  6926. Laya.stage.off("resize", this, this.onResize);
  6927. Global_1.Global.setVars();
  6928. AssetPath_1.AssetPath.init();
  6929. fairygui.UIConfig.packageFileExtension = "bin";
  6930. fairygui.UIConfig.textureLinearSampling = true;
  6931. fairygui.UIConfig.defaultFont = "黑体";
  6932. fairygui.UIConfig.versions = Global_1.Global.versions;
  6933. var gameContent = new GameContents_1.GameContents();
  6934. gameContent.initGame();
  6935. };
  6936. return Main;
  6937. }());
  6938. //激活启动类
  6939. new Main();
  6940. },{"./Config/AssetPath":15,"./GameContents":35,"./Global":39,"./WXSDK/Sdk":75}],43:[function(require,module,exports){
  6941. "use strict";
  6942. Object.defineProperty(exports, "__esModule", { value: true });
  6943. var AssetPath_1 = require("../Config/AssetPath");
  6944. var CharacterPool = /** @class */ (function () {
  6945. function CharacterPool() {
  6946. }
  6947. CharacterPool.AddCharacter = function (resouceName, clas, parent) {
  6948. var skinnedmesh;
  6949. var arr = CharacterPool.roledict[resouceName];
  6950. if (arr && arr.length > 0) {
  6951. skinnedmesh = arr.shift();
  6952. skinnedmesh.active = true;
  6953. parent.addChild(skinnedmesh);
  6954. }
  6955. else {
  6956. var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DRoleModel(resouceName));
  6957. skinnedmesh = Laya.Sprite3D.instantiate(sp, parent, false, new Laya.Vector3(0, 0, 0));
  6958. }
  6959. if (clas) {
  6960. var cla = skinnedmesh.addComponent(clas);
  6961. cla.resouseName = resouceName;
  6962. }
  6963. var _out = new Laya.Quaternion;
  6964. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), 180 * Math.PI / 180, _out);
  6965. skinnedmesh.transform.rotation = _out;
  6966. return skinnedmesh;
  6967. };
  6968. CharacterPool.ClearCharacter = function (sp, resouceName, cla) {
  6969. if (!CharacterPool.roledict[resouceName]) {
  6970. CharacterPool.roledict[resouceName] = [];
  6971. }
  6972. if (cla) {
  6973. cla.destroy();
  6974. }
  6975. sp.active = false;
  6976. sp.removeSelf();
  6977. CharacterPool.roledict[resouceName].push(sp);
  6978. };
  6979. CharacterPool.roledict = {};
  6980. return CharacterPool;
  6981. }());
  6982. exports.CharacterPool = CharacterPool;
  6983. },{"../Config/AssetPath":15}],44:[function(require,module,exports){
  6984. "use strict";
  6985. Object.defineProperty(exports, "__esModule", { value: true });
  6986. var CharacterState = /** @class */ (function () {
  6987. function CharacterState() {
  6988. }
  6989. /**侧翻 cefan1 */
  6990. CharacterState.rollover1 = "rollover1";
  6991. /**侧翻 cefan2 */
  6992. CharacterState.rollover2 = "rollover2";
  6993. /**跑墙左 paoqiangleft */
  6994. CharacterState.runwallleft = "runwallleft";
  6995. /**右跳 rightjump */
  6996. CharacterState.rightjump = "rightjump";
  6997. /**跑墙右 paoqiangright */
  6998. CharacterState.runwallright = "runwallright";
  6999. /**左跳 leftjump*/
  7000. CharacterState.leftjump = "leftjump";
  7001. /**爬墙 paqiang */
  7002. CharacterState.climbwall = "climbwall";
  7003. /** ? climbend */
  7004. CharacterState.climbend = "climbend";
  7005. /**站立 stand*/
  7006. CharacterState.stand = "stand";
  7007. /**空中 kongzhong */
  7008. CharacterState.sky = "sky";
  7009. /**落地 luodi1 */
  7010. CharacterState.land1 = "land1";
  7011. /**落地 luodi2 */
  7012. CharacterState.land2 = "land2";
  7013. /**大跳 datiao1 */
  7014. CharacterState.highjump1 = "highjump1";
  7015. /**大跳 datiao2 */
  7016. CharacterState.highjump2 = "highjump2";
  7017. /**跑动 run */
  7018. CharacterState.run = "run";
  7019. /**跳跃 jump*/
  7020. CharacterState.jump = "jump";
  7021. /**爬升 Climb */
  7022. CharacterState.climbup = "climbup";
  7023. /**自由落体 Freefalling */
  7024. CharacterState.falldown = "falldown";
  7025. /**左爬 left_climb */
  7026. CharacterState.climbleft = "climbleft";
  7027. /**右爬 right_climb*/
  7028. CharacterState.climbright = "climbright";
  7029. /**右跳 right_jump */
  7030. CharacterState.jumpright = "jumpright";
  7031. /**左跳 left_jump */
  7032. CharacterState.jumpleft = "jumpleft";
  7033. /** PlayPalouAction*/
  7034. CharacterState.ClimbMotion = "ClimbMotion";
  7035. /** ? huachan */
  7036. CharacterState.huachan = "huachan";
  7037. /**跨栏 kualan */
  7038. CharacterState.hurdle = "hurdle";
  7039. /**
  7040. * 加速板跳跃 jiasuJump
  7041. */
  7042. CharacterState.speedupjump = "speedupjump";
  7043. /**
  7044. * x方向瞬移 xshunyi
  7045. */
  7046. CharacterState.MoveX = "MoveX";
  7047. /**
  7048. * 下滑位移 downSlide
  7049. */
  7050. CharacterState.downmove = "downmove";
  7051. /**
  7052. * 侧面加速 slidejiasu
  7053. */
  7054. CharacterState.sidespeedup = "sidespeedup";
  7055. /**
  7056. * 翻越 surmount
  7057. */
  7058. CharacterState.cross = "cross";
  7059. /**
  7060. * 锁定爬升 lockclimb
  7061. */
  7062. CharacterState.climbupblock = "climbupblock";
  7063. return CharacterState;
  7064. }());
  7065. exports.CharacterState = CharacterState;
  7066. },{}],45:[function(require,module,exports){
  7067. "use strict";
  7068. Object.defineProperty(exports, "__esModule", { value: true });
  7069. /*
  7070. * 对象池类
  7071. */
  7072. var Animation = Laya.Animation;
  7073. var GamePool = /** @class */ (function (_super) {
  7074. __extends(GamePool, _super);
  7075. function GamePool() {
  7076. var _this = _super.call(this) || this;
  7077. _this.AniConfPath = "res/fighter/fighter.json";
  7078. return _this;
  7079. }
  7080. GamePool.RemoveItem = function (key, obj) {
  7081. if (GamePool.contain[key]) {
  7082. var index = GamePool.contain[key].indexOf(obj);
  7083. if (index == -1) {
  7084. GamePool.contain[key].push(obj);
  7085. }
  7086. }
  7087. };
  7088. GamePool.GetItem = function (key) {
  7089. var args = [];
  7090. for (var _i = 1; _i < arguments.length; _i++) {
  7091. args[_i - 1] = arguments[_i];
  7092. }
  7093. if (GamePool.contain[key]) {
  7094. var arr = GamePool.contain[key];
  7095. if (arr.length == 0) {
  7096. var calssobj = GamePool.sprite3DArray[key];
  7097. var vo = new calssobj();
  7098. return vo;
  7099. }
  7100. return GamePool.contain[key].shift();
  7101. }
  7102. else {
  7103. console.log("此key值对应的类未被注册");
  7104. return null;
  7105. }
  7106. };
  7107. /******************************************* */
  7108. GamePool.prototype.createAnimation = function () {
  7109. var ani = new Animation();
  7110. ani.loadAtlas(this.AniConfPath); // 加载图集动画
  7111. ani.interval = 30; // 设置播放间隔(单位:毫秒)
  7112. ani.index = 1; // 当前播放索引
  7113. ani.play(); // 播放图集动画
  7114. // 获取动画的边界信息
  7115. var bounds = ani.getGraphicBounds();
  7116. ani.pivot(bounds.width / 2, bounds.height / 2);
  7117. ani.pos(Laya.stage.width / 2, Laya.stage.height / 2);
  7118. Laya.stage.addChild(ani);
  7119. };
  7120. /******************************************* */
  7121. GamePool.GetItemFairyGUI = function (url) {
  7122. if (!GamePool.contain[url]) {
  7123. GamePool.contain[url] = [];
  7124. }
  7125. var arr = GamePool.contain[url];
  7126. if (arr.length == 0) {
  7127. var vo = fairygui.UIPackage.createObjectFromURL(url);
  7128. return vo;
  7129. }
  7130. return GamePool.contain[url].shift();
  7131. };
  7132. GamePool.Mark = function (key, classarg) {
  7133. GamePool.sprite3DArray[key] = classarg;
  7134. GamePool.contain[key] = [];
  7135. };
  7136. GamePool.sprite3DArray = {};
  7137. GamePool.contain = {};
  7138. return GamePool;
  7139. }(Laya.EventDispatcher));
  7140. exports.GamePool = GamePool;
  7141. },{}],46:[function(require,module,exports){
  7142. "use strict";
  7143. Object.defineProperty(exports, "__esModule", { value: true });
  7144. var Singleton_1 = require("../utils/Singleton");
  7145. /*
  7146. * name;
  7147. */
  7148. var PanelResDic = /** @class */ (function (_super) {
  7149. __extends(PanelResDic, _super);
  7150. function PanelResDic() {
  7151. var _this = _super.call(this) || this;
  7152. PanelResDic.ins = _this;
  7153. return _this;
  7154. }
  7155. Object.defineProperty(PanelResDic, "Instance", {
  7156. get: function () {
  7157. if (PanelResDic.ins == null) {
  7158. return new PanelResDic();
  7159. }
  7160. return PanelResDic.ins;
  7161. },
  7162. enumerable: true,
  7163. configurable: true
  7164. });
  7165. PanelResDic.getView = function (viewkey) {
  7166. if (!PanelResDic._mapviewDict[viewkey]) {
  7167. throw "err0 未绑定的viewkey:" + viewkey;
  7168. }
  7169. return PanelResDic._mapviewDict[viewkey];
  7170. };
  7171. PanelResDic.prototype.getSingleTon = function (ref) {
  7172. return Singleton_1.Singleton.Instance(ref);
  7173. };
  7174. PanelResDic.prototype.mapView = function (viewkey, ref) {
  7175. if (!PanelResDic._mapviewDict[viewkey]) {
  7176. PanelResDic._mapviewDict[viewkey] = ref;
  7177. ref.key = viewkey;
  7178. }
  7179. };
  7180. PanelResDic.prototype.AgencyAdd = function (ref) {
  7181. Singleton_1.Singleton.create(ref);
  7182. };
  7183. PanelResDic.prototype.AgencyClear = function (ref) {
  7184. Singleton_1.Singleton.remove(ref);
  7185. };
  7186. PanelResDic._mapviewDict = {};
  7187. return PanelResDic;
  7188. }(Laya.EventDispatcher));
  7189. exports.PanelResDic = PanelResDic;
  7190. },{"../utils/Singleton":89}],47:[function(require,module,exports){
  7191. "use strict";
  7192. Object.defineProperty(exports, "__esModule", { value: true });
  7193. var AssetPath_1 = require("../Config/AssetPath");
  7194. var GameUtils_1 = require("../utils/GameUtils");
  7195. var PropManager = /** @class */ (function () {
  7196. function PropManager() {
  7197. this._outQUaternion4 = new Laya.Quaternion;
  7198. this._outQUaternion = new Laya.Quaternion;
  7199. PropManager.ins = this;
  7200. }
  7201. Object.defineProperty(PropManager, "Instance", {
  7202. get: function () {
  7203. if (PropManager.ins == null) {
  7204. return new PropManager();
  7205. }
  7206. return PropManager.ins;
  7207. },
  7208. enumerable: true,
  7209. configurable: true
  7210. });
  7211. PropManager.getPosVecbyScene = function (sceneName, buildname) {
  7212. if (PropManager.patternDict[sceneName]) {
  7213. return PropManager.patternDict[sceneName][buildname];
  7214. }
  7215. return null;
  7216. };
  7217. /**
  7218. * @param animator
  7219. * @param animatorDict
  7220. */
  7221. PropManager.setAnimator = function (animator) {
  7222. var chiddict;
  7223. for (var s in PropManager.actionDict) {
  7224. if (!animator.getControllerLayer().getAnimatorState(s)) {
  7225. chiddict = PropManager.actionDict[s];
  7226. //创建一个动画动作状态
  7227. var state1 = new Laya.AnimatorState();
  7228. //设置动作状态的名称
  7229. state1.name = s;
  7230. //设置动作状态播放的起始时间(起始时间与结束时间的设置为0-1的百分比数值) 要截取的时间点 / 动画的总时长
  7231. state1.clipStart = chiddict.s / PropManager.actionnums;
  7232. //设置动作状态播放的结束时间
  7233. state1.clipEnd = chiddict.e / PropManager.actionnums;
  7234. //得到默认动画赋值给Clip(getDefaultState默认动画为Unity中animation的数组顺序0下标的动画)
  7235. state1.clip = animator.getDefaultState().clip;
  7236. //动画播放是否循环
  7237. state1.clip.islooping = chiddict.islooping;
  7238. //添加动画状态到动画组件里
  7239. animator.addState(state1);
  7240. }
  7241. }
  7242. };
  7243. PropManager.prototype.InitEffect = function () {
  7244. var lizi = PropManager.getlizibyName("speedupeffect");
  7245. lizi.particleSystem.play();
  7246. lizi.active = false;
  7247. var lizi = PropManager.getlizibyName("color_white");
  7248. lizi.particleSystem.play();
  7249. lizi.active = false;
  7250. var lizi = PropManager.getlizibyName("color_yellow");
  7251. lizi.particleSystem.play();
  7252. lizi.active = false;
  7253. };
  7254. PropManager.prototype.SetEffectColor = function (name, pos) {
  7255. var closetime = 0;
  7256. Laya.timer.clear(this, this.EffectEnd);
  7257. this.EffectEndColor();
  7258. if (name == "color_white") {
  7259. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  7260. if (sort > 50) {
  7261. name = "color_yellow";
  7262. }
  7263. }
  7264. closetime = 500;
  7265. this._tanselizi = PropManager.getlizibyName(name);
  7266. this._tanselizi.transform.position = pos;
  7267. this._tanselizi.particleSystem.play();
  7268. if (closetime != 0) {
  7269. Laya.timer.once(closetime, this, this.EffectEndColor);
  7270. }
  7271. };
  7272. PropManager.prototype.EffectEndColor = function () {
  7273. if (this._tanselizi) {
  7274. this._tanselizi.particleSystem.stop();
  7275. this._tanselizi.active = false;
  7276. }
  7277. };
  7278. PropManager.prototype.SpeedUpEffect1 = function (name, pos) {
  7279. if (!this._engamelizi4 || (this._engamelizi4 && !this._engamelizi4.active)) {
  7280. this._engamelizi4 = PropManager.getlizibyName("speedupeffect");
  7281. this._engamelizi4.particleSystem.looping = true;
  7282. this._engamelizi4.transform.scale = new Laya.Vector3(20, 20, 20);
  7283. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion4);
  7284. this._engamelizi4.transform.rotation = this._outQUaternion4;
  7285. this._engamelizi4.particleSystem.play();
  7286. }
  7287. var lzpos = pos.clone();
  7288. lzpos.y += 5;
  7289. lzpos.z -= 10;
  7290. this._engamelizi4.transform.position = lzpos;
  7291. };
  7292. PropManager.prototype.CloseSpeedUpEffect1 = function () {
  7293. if (this._engamelizi4 && this._engamelizi4.active) {
  7294. this._engamelizi4.active = false;
  7295. }
  7296. };
  7297. PropManager.prototype.SpeedUpEffect = function (name, pos) {
  7298. if (!this._engamelizi3 || (this._engamelizi3 && !this._engamelizi3.active)) {
  7299. this._engamelizi3 = PropManager.getlizibyName("speedupeffect");
  7300. this._engamelizi3.particleSystem.looping = true;
  7301. this._engamelizi3.transform.scale = new Laya.Vector3(20, 20, 20);
  7302. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion);
  7303. this._engamelizi3.transform.rotation = this._outQUaternion;
  7304. this._engamelizi3.particleSystem.play();
  7305. }
  7306. var lzpos = pos.clone();
  7307. lzpos.y += 5;
  7308. this._engamelizi3.transform.position = lzpos;
  7309. };
  7310. PropManager.prototype.CloseSpeedUpEffect = function () {
  7311. if (this._engamelizi3 && this._engamelizi3.active) {
  7312. this._engamelizi3.active = false;
  7313. }
  7314. };
  7315. PropManager.prototype.GameOverEffecf = function (name, pos, iswin) {
  7316. this._engamelizi1 = PropManager.getlizibyName("fireworks");
  7317. this._engamelizi1.transform.position = pos;
  7318. this._engamelizi1.particleSystem.play();
  7319. if (iswin) {
  7320. this._engamelizi2 = PropManager.getlizibyName("winline");
  7321. this._engamelizi2.transform.position = pos;
  7322. this._engamelizi2.particleSystem.play();
  7323. }
  7324. };
  7325. PropManager.prototype.CloseGameOverEffect = function () {
  7326. if (this._engamelizi1) {
  7327. this._engamelizi1.particleSystem.stop();
  7328. this._engamelizi1.active = false;
  7329. }
  7330. if (this._engamelizi2) {
  7331. this._engamelizi2.particleSystem.stop();
  7332. this._engamelizi2.active = false;
  7333. }
  7334. };
  7335. // public setliziPlay( name:string,pos:Laya.Vector3 ):void
  7336. // {
  7337. // var closetime:number = 0;
  7338. // Laya.timer.clear( this,this.liziend );
  7339. // switch( name )
  7340. // {
  7341. // case "tanse_bai":
  7342. // if( name == "tanse_bai" )
  7343. // {
  7344. // var sort:number = GameUtils.randRangeint( 0,100 );
  7345. // if( sort > 50 )
  7346. // {
  7347. // name = "tanse_huang";
  7348. // }
  7349. // }
  7350. // closetime = 500;
  7351. // break;
  7352. // case "jiasulizi":
  7353. // break;
  7354. // case "win_xian":
  7355. // closetime = 0;
  7356. // break;
  7357. // case "yanhua":
  7358. // closetime = 0;
  7359. // break;
  7360. // }
  7361. // var lizi:Laya.ShuriKenParticle3D = PropManager.getlizibyName( name );
  7362. // lizi.transform.position = pos;
  7363. // lizi.particleSystem.play();
  7364. // if( closetime != 0 )
  7365. // {
  7366. // Laya.timer.once( closetime,this,this.liziend,[lizi] );
  7367. // }
  7368. // }
  7369. PropManager.prototype.EffectEnd = function (lizi) {
  7370. if (lizi) {
  7371. lizi.particleSystem.stop();
  7372. lizi.active = false;
  7373. }
  7374. };
  7375. PropManager.getlizibyName = function (name) {
  7376. var lizisp;
  7377. if (PropManager.liziDict[name]) {
  7378. lizisp = PropManager.liziDict[name];
  7379. }
  7380. else {
  7381. lizisp = Laya.Sprite3D.instantiate(Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel(name)));
  7382. PropManager.liziDict[name] = lizisp;
  7383. PropManager.scene3D.addChild(lizisp);
  7384. }
  7385. lizisp.active = true;
  7386. return lizisp;
  7387. };
  7388. PropManager.nowmapDict = {};
  7389. PropManager.diePosY = 0;
  7390. PropManager.gamewinPosZ = 0;
  7391. PropManager.patternDict = {};
  7392. PropManager.npcDict = {};
  7393. PropManager.npcscriptDict = {};
  7394. PropManager.npcnum = 0;
  7395. PropManager.iscarmanpc = false;
  7396. PropManager.liziDict = {};
  7397. PropManager.jiantouArr = [];
  7398. // /**
  7399. // * 判断是否爬到顶端
  7400. // */
  7401. // static checkisClimbTop( sceneName:string,buildname:string, pos:Laya.Vector3 ):boolean
  7402. // {
  7403. // var vec:Laya.Vector3 = PropManager.getPosVecbyScene( sceneName,buildname );
  7404. // if( vec && Math.abs(vec.y - pos.y) < 1.5 )
  7405. // {
  7406. // return true;
  7407. // }
  7408. // return false;
  7409. // }
  7410. PropManager.actionnums = 575;
  7411. PropManager.actionDict = {
  7412. "climbend": { s: 550, e: 575, islooping: false },
  7413. "stand": { s: 0, e: 80, islooping: true },
  7414. "run": { s: 90, e: 106, islooping: true },
  7415. "jump": { s: 110, e: 132, islooping: true },
  7416. "kongzhong": { s: 132, e: 145, islooping: true },
  7417. "luodi1": { s: 145, e: 160, islooping: true },
  7418. "luodi2": { s: 170, e: 202, islooping: true },
  7419. "datiao1": { s: 210, e: 235, islooping: true },
  7420. "datiao2": { s: 240, e: 273, islooping: true },
  7421. "huachan": { s: 280, e: 310, islooping: true },
  7422. "kualan": { s: 310, e: 346, islooping: true },
  7423. "cefan1": { s: 350, e: 391, islooping: true },
  7424. "cefan2": { s: 400, e: 434, islooping: true },
  7425. "paoqiangleft": { s: 440, islooping: true, e: 456 },
  7426. "rightjump": { s: 460, e: 477, islooping: true },
  7427. "paoqiangright": { s: 480, e: 496, islooping: true },
  7428. "leftjump": { s: 500, e: 517, islooping: true },
  7429. "paqiang": { s: 520, e: 542, islooping: true }
  7430. };
  7431. return PropManager;
  7432. }());
  7433. exports.PropManager = PropManager;
  7434. },{"../Config/AssetPath":15,"../utils/GameUtils":85}],48:[function(require,module,exports){
  7435. "use strict";
  7436. Object.defineProperty(exports, "__esModule", { value: true });
  7437. var PanelChildControl_1 = require("../Control/PanelChildControl");
  7438. var CpaEvent_1 = require("./CpaEvent");
  7439. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  7440. var RecommendView_1 = require("./RecommendView");
  7441. var TimerService_1 = require("../Time/TimerService");
  7442. var BaoKuanGameView = /** @class */ (function (_super) {
  7443. __extends(BaoKuanGameView, _super);
  7444. function BaoKuanGameView() {
  7445. var _this = _super.call(this) || this;
  7446. _this._time = 0;
  7447. _this.key = 0;
  7448. _this._istart = false;
  7449. return _this;
  7450. }
  7451. BaoKuanGameView.prototype.onInit = function () {
  7452. this.initView();
  7453. this.initEvent();
  7454. };
  7455. BaoKuanGameView.prototype.initView = function () {
  7456. this.c_state = this.getController("c_state");
  7457. this.t0 = this.getTransition("t0");
  7458. this.c_state.selectedIndex = 0;
  7459. };
  7460. BaoKuanGameView.prototype.initEvent = function () {
  7461. console.log("监听互推事件---BaokuanGame0");
  7462. this.AddEventData(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler);
  7463. };
  7464. BaoKuanGameView.prototype.yqhomedataHandler = function () {
  7465. console.log("监听互推事件---BaokuanGame1");
  7466. this.RefreshBKYX();
  7467. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  7468. };
  7469. BaoKuanGameView.prototype.update = function (dt) {
  7470. if (this._istart) {
  7471. this._time += dt;
  7472. if (this._time >= 5000) {
  7473. this._time = 0;
  7474. this.RefreshBKYX(true);
  7475. }
  7476. }
  7477. };
  7478. BaoKuanGameView.prototype.RefreshBKYX = function (isanmo) {
  7479. if (isanmo === void 0) { isanmo = false; }
  7480. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.recommend)
  7481. return;
  7482. console.log("监听互推事件---BaokuanGame2");
  7483. this.c_state.selectedIndex = 1;
  7484. var datas = RecommendView_1.Recommend.cainixihuanData;
  7485. var item;
  7486. for (var i = 0; i < 4; i++) {
  7487. if (this.key + i >= datas.length - 1) {
  7488. this.key = 0;
  7489. }
  7490. var curdata = datas[this.key + i];
  7491. item = this["item_" + i];
  7492. item.showData(curdata, true);
  7493. if (curdata == null)
  7494. continue;
  7495. }
  7496. this.key += 4;
  7497. if (this.key >= datas.length - 1) {
  7498. this.key = 0;
  7499. }
  7500. this._istart = true;
  7501. if (isanmo) {
  7502. this.t0.play(null, 1);
  7503. }
  7504. };
  7505. return BaoKuanGameView;
  7506. }(PanelChildControl_1.PanelChildControl));
  7507. exports.default = BaoKuanGameView;
  7508. },{"../Control/PanelChildControl":24,"../Time/TimerService":57,"../WXSDK/PlayerAccount":73,"./CpaEvent":51,"./RecommendView":53}],49:[function(require,module,exports){
  7509. "use strict";
  7510. Object.defineProperty(exports, "__esModule", { value: true });
  7511. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  7512. var RecommendView_1 = require("./RecommendView");
  7513. var ViewManager_1 = require("../View/ViewManager");
  7514. var TimerService_1 = require("../Time/TimerService");
  7515. var DispatcherManager_1 = require("../utils/DispatcherManager");
  7516. var GameState_1 = require("../utils/GameState");
  7517. var CompletePanel_1 = require("../View/CompletePanel");
  7518. var RoleData_1 = require("../Data/RoleData");
  7519. var ChoutiPanView = /** @class */ (function (_super) {
  7520. __extends(ChoutiPanView, _super);
  7521. function ChoutiPanView(end) {
  7522. var _this = _super.call(this, "main", "choutipanView") || this;
  7523. _this._iscanmove = false;
  7524. _this.isend = 0;
  7525. _this._movetime = 0;
  7526. _this._flushtime = 0;
  7527. _this.dir = true;
  7528. _this._nowvalue = 0;
  7529. _this.isend = end;
  7530. return _this;
  7531. }
  7532. ChoutiPanView.prototype.initView = function () {
  7533. this.list_0.setVirtual();
  7534. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  7535. this.list_1.setVirtual();
  7536. this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false);
  7537. this._nowList0 = RecommendView_1.Recommend.gdyxData;
  7538. this._nowList1 = RecommendView_1.Recommend.gdyxData;
  7539. this.list_0.numItems = this._nowList0.length;
  7540. this.list_1.numItems = this._nowList1.length;
  7541. this._isStart = true;
  7542. this._iscanmove = true;
  7543. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  7544. };
  7545. ChoutiPanView.prototype.initEvent = function () {
  7546. this.AddEventByType(this.btn_return, Laya.Event.CLICK, this, this.onclosefun);
  7547. this.AddEventByType(this.btn_jixugame, Laya.Event.CLICK, this, this.onclosefun);
  7548. this.AddEventByType(this.list_1, Laya.Event.MOUSE_DOWN, this, this.downclick);
  7549. this.AddEventByType(this.list_1, Laya.Event.MOUSE_UP, this, this.upclick);
  7550. this.AddEventByType(this.list_1, Laya.Event.MOUSE_OUT, this, this.upclick);
  7551. };
  7552. ChoutiPanView.prototype.itemrenderlist = function (index, item) {
  7553. if (index < this._nowList0.length) {
  7554. item.showData(this._nowList0[index]);
  7555. }
  7556. };
  7557. ChoutiPanView.prototype.itemrenderlist1 = function (index, item) {
  7558. if (index < this._nowList1.length) {
  7559. item.showData(this._nowList1[index]);
  7560. }
  7561. };
  7562. ChoutiPanView.prototype.downclick = function () {
  7563. this._isdown = true;
  7564. this._iscanmove = false;
  7565. Laya.timer.clear(this, this.timeoutCallback);
  7566. };
  7567. ChoutiPanView.prototype.timeoutCallback = function () {
  7568. this._iscanmove = true;
  7569. };
  7570. ChoutiPanView.prototype.upclick = function () {
  7571. if (this._isdown) {
  7572. this._isdown = false;
  7573. this._nowvalue = this.list_1.scrollPane.percY;
  7574. Laya.timer.once(2000, this, this.timeoutCallback);
  7575. }
  7576. };
  7577. ChoutiPanView.prototype.update = function (dt) {
  7578. if (this._isStart) {
  7579. if (this.list_1.scrollPane && this._nowList1 && this._iscanmove) {
  7580. if (this.dir) {
  7581. this._nowvalue += 0.001;
  7582. if (this._nowvalue >= 1) {
  7583. this._nowvalue = 1;
  7584. this.dir = false;
  7585. }
  7586. }
  7587. else {
  7588. this._nowvalue -= 0.001;
  7589. if (this._nowvalue <= 0) {
  7590. this._nowvalue = 0;
  7591. this.dir = true;
  7592. }
  7593. }
  7594. this.list_1.scrollPane.setPercY(this._nowvalue);
  7595. }
  7596. }
  7597. };
  7598. ChoutiPanView.prototype.onclosefun = function () {
  7599. if (this.isend == 1) {
  7600. ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
  7601. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
  7602. }
  7603. else if (this.isend == 2) {
  7604. var gold = RoleData_1.RoleData.Instance.levelcfg.winGold;
  7605. ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
  7606. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, gold);
  7607. }
  7608. else {
  7609. ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
  7610. }
  7611. };
  7612. ChoutiPanView.prototype.destory = function () {
  7613. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  7614. _super.prototype.destory.call(this);
  7615. };
  7616. ChoutiPanView.key = "ChoutiPanView";
  7617. return ChoutiPanView;
  7618. }(PanelBaseControl_1.PanelBaseControl));
  7619. exports.default = ChoutiPanView;
  7620. },{"../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){
  7621. "use strict";
  7622. Object.defineProperty(exports, "__esModule", { value: true });
  7623. var PanelChildControl_1 = require("../Control/PanelChildControl");
  7624. var CpaEvent_1 = require("./CpaEvent");
  7625. var RecommendView_1 = require("./RecommendView");
  7626. var TimerService_1 = require("../Time/TimerService");
  7627. var SceneControl_1 = require("../Control/SceneControl");
  7628. var CpaDownsView = /** @class */ (function (_super) {
  7629. __extends(CpaDownsView, _super);
  7630. function CpaDownsView() {
  7631. var _this = _super.call(this) || this;
  7632. _this._iscanmove = false;
  7633. _this._movetime = 0;
  7634. _this._flushtime = 0;
  7635. _this.dir = true;
  7636. _this._nowvalue = 0;
  7637. return _this;
  7638. }
  7639. CpaDownsView.prototype.onInit = function () {
  7640. this.c_state = this.getController("c_state");
  7641. this.c_state.selectedIndex = 0;
  7642. this.initView();
  7643. this.initEvent();
  7644. };
  7645. CpaDownsView.prototype.initView = function () {
  7646. this.list_0.setVirtual();
  7647. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  7648. this._isStart = false;
  7649. };
  7650. CpaDownsView.prototype.initEvent = function () {
  7651. this.AddEventData(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler);
  7652. this.AddEventByType(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick);
  7653. this.AddEventByType(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick);
  7654. this.AddEventByType(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick);
  7655. };
  7656. CpaDownsView.prototype.downclick = function () {
  7657. if (SceneControl_1.SceneControl.IsShowSign)
  7658. return;
  7659. this._isdown = true;
  7660. this._iscanmove = false;
  7661. Laya.timer.clear(this, this.timeoutCallback);
  7662. // ttad.CreateMoreGameBtn();
  7663. };
  7664. CpaDownsView.prototype.timeoutCallback = function () {
  7665. if (SceneControl_1.SceneControl.IsShowSign)
  7666. return;
  7667. this._iscanmove = true;
  7668. };
  7669. CpaDownsView.prototype.upclick = function () {
  7670. if (SceneControl_1.SceneControl.IsShowSign)
  7671. return;
  7672. if (this._isdown) {
  7673. this._isdown = false;
  7674. this._nowvalue = this.list_0.scrollPane.percX;
  7675. Laya.timer.once(2000, this, this.timeoutCallback);
  7676. }
  7677. };
  7678. CpaDownsView.prototype.update = function (dt) {
  7679. if (this._isStart) {
  7680. if (this.list_0.scrollPane && this._nowList && this._iscanmove) {
  7681. if (this.dir) {
  7682. this._nowvalue += 0.001;
  7683. if (this._nowvalue >= 1) {
  7684. this._nowvalue = 1;
  7685. this.dir = false;
  7686. }
  7687. }
  7688. else {
  7689. this._nowvalue -= 0.001;
  7690. if (this._nowvalue <= 0) {
  7691. this._nowvalue = 0;
  7692. this.dir = true;
  7693. }
  7694. }
  7695. this.list_0.scrollPane.setPercX(this._nowvalue);
  7696. }
  7697. }
  7698. };
  7699. CpaDownsView.prototype.itemrenderlist = function (index, item) {
  7700. if (index < this._nowList.length) {
  7701. item.showData(this._nowList[index], true);
  7702. }
  7703. };
  7704. CpaDownsView.prototype.yqhomedataHandler = function () {
  7705. this.c_state.selectedIndex = 1;
  7706. this._nowList = RecommendView_1.Recommend.cainixihuanData;
  7707. this.list_0.numItems = this._nowList.length;
  7708. for (var i = 0; i < this._nowList.length; i++) {
  7709. }
  7710. this._isStart = true;
  7711. this._iscanmove = true;
  7712. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  7713. };
  7714. CpaDownsView.prototype.dispose = function () {
  7715. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  7716. _super.prototype.dispose.call(this);
  7717. };
  7718. return CpaDownsView;
  7719. }(PanelChildControl_1.PanelChildControl));
  7720. exports.default = CpaDownsView;
  7721. },{"../Control/PanelChildControl":24,"../Control/SceneControl":27,"../Time/TimerService":57,"./CpaEvent":51,"./RecommendView":53}],51:[function(require,module,exports){
  7722. "use strict";
  7723. Object.defineProperty(exports, "__esModule", { value: true });
  7724. var CpaEvent = /** @class */ (function () {
  7725. function CpaEvent() {
  7726. }
  7727. CpaEvent.YQHomeData = "CpaEvent_YQHomeData";
  7728. return CpaEvent;
  7729. }());
  7730. exports.default = CpaEvent;
  7731. },{}],52:[function(require,module,exports){
  7732. "use strict";
  7733. Object.defineProperty(exports, "__esModule", { value: true });
  7734. var PanelChildControl_1 = require("../Control/PanelChildControl");
  7735. var GameUtils_1 = require("../utils/GameUtils");
  7736. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  7737. var CpaItem = /** @class */ (function (_super) {
  7738. __extends(CpaItem, _super);
  7739. function CpaItem() {
  7740. var _this = _super.call(this) || this;
  7741. _this.ispenchoutipan = false;
  7742. return _this;
  7743. }
  7744. CpaItem.prototype.onInit = function () {
  7745. this.name = "capItem";
  7746. this.AddEventByType(this, Laya.Event.CLICK, this, this.onbtnclick);
  7747. };
  7748. CpaItem.prototype.onbtnclick = function () {
  7749. if (this._vo) {
  7750. var data = this._vo;
  7751. FYHD_Sdk_1.FYHD_Sdk.ShowHuTuiJump(data, this.ispenchoutipan);
  7752. // var appid = data.to_appid;
  7753. // var path = data.jump_path;
  7754. // let param = {"appId":appid.toString(),"path":path.toString()};
  7755. // if(Laya.Browser.onMobile)
  7756. // {
  7757. // Laya.Browser.window.wx.navigateToMiniProgram(
  7758. // {
  7759. // appId:appid.toString(),
  7760. // path:path.toString(),
  7761. // success:res=>
  7762. // {
  7763. // WxApi.recordAldEvent("跳转到游戏失成功","1");
  7764. // },
  7765. // fail:res=>
  7766. // {
  7767. // if( this.ispenchoutipan )
  7768. // {
  7769. // ViewManager.Instance.add( ChoutiPanView );
  7770. // }
  7771. // }
  7772. // });
  7773. // }
  7774. }
  7775. };
  7776. CpaItem.prototype.showData = function (data, isopenchoutipan) {
  7777. if (isopenchoutipan === void 0) { isopenchoutipan = false; }
  7778. this.ispenchoutipan = isopenchoutipan;
  7779. this._vo = data;
  7780. if (data) {
  7781. this.load_icon.url = data.icon;
  7782. if (this.txt_word) {
  7783. this.txt_word.text = data.togame_name;
  7784. }
  7785. if (this.img_tip) {
  7786. this.img_tip.visible = Math.random() > 0.5 ? true : false;
  7787. }
  7788. if (this.txt_word1) {
  7789. this.txt_word1.text = GameUtils_1.GameUtils.randRangeint(235470, 1561430).toString() + "人玩";
  7790. }
  7791. }
  7792. };
  7793. return CpaItem;
  7794. }(PanelChildControl_1.PanelChildControl));
  7795. exports.default = CpaItem;
  7796. },{"../Control/PanelChildControl":24,"../WXSDK/FYHD_Sdk":69,"../utils/GameUtils":85}],53:[function(require,module,exports){
  7797. "use strict";
  7798. Object.defineProperty(exports, "__esModule", { value: true });
  7799. var DispatcherManager_1 = require("../utils/DispatcherManager");
  7800. var CpaEvent_1 = require("./CpaEvent");
  7801. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  7802. var recommendPan = /** @class */ (function () {
  7803. function recommendPan(data) {
  7804. this.game_flg = data["game_flg"];
  7805. this.game_id = data["game_id"];
  7806. this.game_name = data["game_name"];
  7807. this.id = data["id"];
  7808. this.location_flg = data["location_flg"];
  7809. this.location_id = data["location_id"];
  7810. this.location_name = data["location_name"];
  7811. this.matter_type = data["matter_type"];
  7812. }
  7813. return recommendPan;
  7814. }());
  7815. exports.recommendPan = recommendPan;
  7816. var Recommend = /** @class */ (function () {
  7817. function Recommend() {
  7818. Recommend.InitData();
  7819. }
  7820. Recommend.InitData = function () {
  7821. Recommend.cainixihuanData = Recommend.GetCaiNiXiaHuanDatas();
  7822. Recommend.jiesuanData = Recommend.GetJIeSuanDatas();
  7823. Recommend.gdyxData = Recommend.GetGDYXDatas();
  7824. Recommend.baokuanyouxiData = Recommend.GetBaoKuanYouXiDatas();
  7825. Recommend.moreData = Recommend.GetMoreDatas();
  7826. for (var key in FYHD_Sdk_1.FYHD_Sdk.pushData) {
  7827. Recommend.recommendDic[FYHD_Sdk_1.FYHD_Sdk.pushData[key].location_flg] = new recommendPan(FYHD_Sdk_1.FYHD_Sdk.pushData[key]);
  7828. }
  7829. Recommend.getdata = true;
  7830. DispatcherManager_1.DispatcherManager.dispatchEvent(CpaEvent_1.default.YQHomeData);
  7831. console.log("互推数据初始化recommend--------------");
  7832. };
  7833. Recommend.GetSSDatas = function () {
  7834. var items = [];
  7835. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7836. return items;
  7837. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7838. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7839. }
  7840. return items;
  7841. };
  7842. Recommend.GetCaiNiXiaHuanDatas = function () {
  7843. var items = [];
  7844. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7845. return items;
  7846. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7847. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7848. }
  7849. return items;
  7850. };
  7851. Recommend.GetMoreDatas = function () {
  7852. var items = [];
  7853. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7854. return items;
  7855. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7856. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7857. }
  7858. return items;
  7859. };
  7860. Recommend.GetBaoKuanYouXiDatas = function () {
  7861. var items = [];
  7862. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7863. return items;
  7864. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7865. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7866. }
  7867. return items;
  7868. };
  7869. Recommend.GetJIeSuanDatas = function () {
  7870. var items = [];
  7871. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7872. return items;
  7873. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7874. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7875. }
  7876. return items;
  7877. };
  7878. Recommend.GetGDYXDatas = function () {
  7879. var items = [];
  7880. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  7881. return items;
  7882. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  7883. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  7884. }
  7885. return items;
  7886. };
  7887. Recommend.getdata = false;
  7888. Recommend.recommendDic = {};
  7889. Recommend.cainixihuanData = [];
  7890. Recommend.baokuanyouxiData = [];
  7891. Recommend.gdyxData = [];
  7892. Recommend.jiesuanData = [];
  7893. Recommend.moreData = [];
  7894. return Recommend;
  7895. }());
  7896. exports.Recommend = Recommend;
  7897. var RecommendItem = /** @class */ (function () {
  7898. function RecommendItem(Data) {
  7899. this.icon = Data["icon"];
  7900. this.to_appid = Data["to_appid"];
  7901. this.togame_name = Data["togame_name"];
  7902. this.jump_path = Data["jump_path"];
  7903. this.jump_type = Data["jump_type"];
  7904. this.panel = Data["panel"];
  7905. this.qrcode = Data["qrcode"];
  7906. }
  7907. return RecommendItem;
  7908. }());
  7909. exports.RecommendItem = RecommendItem;
  7910. var RecommendView = /** @class */ (function () {
  7911. function RecommendView() {
  7912. }
  7913. return RecommendView;
  7914. }());
  7915. exports.default = RecommendView;
  7916. },{"../WXSDK/FYHD_Sdk":69,"../utils/DispatcherManager":83,"./CpaEvent":51}],54:[function(require,module,exports){
  7917. "use strict";
  7918. Object.defineProperty(exports, "__esModule", { value: true });
  7919. var PanelChildControl_1 = require("../Control/PanelChildControl");
  7920. var RecommendView_1 = require("./RecommendView");
  7921. var TimerService_1 = require("../Time/TimerService");
  7922. // import { ttad } from "../ttad";
  7923. var ShiwantuijianView = /** @class */ (function (_super) {
  7924. __extends(ShiwantuijianView, _super);
  7925. function ShiwantuijianView() {
  7926. var _this = _super.call(this) || this;
  7927. _this._iscanmove = false;
  7928. _this._movetime = 0;
  7929. _this._flushtime = 0;
  7930. _this.dir = true;
  7931. _this._nowvalue = 0;
  7932. return _this;
  7933. }
  7934. ShiwantuijianView.prototype.onInit = function () {
  7935. this.initView();
  7936. this.initEvent();
  7937. };
  7938. ShiwantuijianView.prototype.initView = function () {
  7939. this.list_0.setVirtual();
  7940. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  7941. this._nowlist = RecommendView_1.Recommend.jiesuanData;
  7942. if (this._nowlist.length > 0) {
  7943. this.list_0.numItems = this._nowlist.length;
  7944. this.visible = true;
  7945. for (var i = 0; i < this._nowlist.length; i++) {
  7946. }
  7947. this._isStart = true;
  7948. this._iscanmove = true;
  7949. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  7950. }
  7951. else {
  7952. this.visible = false;
  7953. }
  7954. };
  7955. ShiwantuijianView.prototype.initEvent = function () {
  7956. this.AddEventByType(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick);
  7957. this.AddEventByType(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick);
  7958. this.AddEventByType(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick);
  7959. };
  7960. ShiwantuijianView.prototype.downclick = function () {
  7961. this._isdown = true;
  7962. this._iscanmove = false;
  7963. Laya.timer.clear(this, this.timeoutCallback);
  7964. // ttad.CreateMoreGameBtn();
  7965. };
  7966. ShiwantuijianView.prototype.timeoutCallback = function () {
  7967. this._iscanmove = true;
  7968. };
  7969. ShiwantuijianView.prototype.upclick = function () {
  7970. if (this._isdown) {
  7971. this._isdown = false;
  7972. this._nowvalue = this.list_0.scrollPane.percY;
  7973. Laya.timer.once(2000, this, this.timeoutCallback);
  7974. }
  7975. };
  7976. ShiwantuijianView.prototype.itemrenderlist = function (index, item) {
  7977. if (index < this._nowlist.length) {
  7978. item.showData(this._nowlist[index], true);
  7979. }
  7980. };
  7981. ShiwantuijianView.prototype.update = function (dt) {
  7982. if (this._isStart) {
  7983. if (this.list_0.scrollPane && this._nowlist && this._nowlist.length > 0 && this._iscanmove) {
  7984. if (this.dir) {
  7985. this._nowvalue += 0.001;
  7986. if (this._nowvalue >= 1) {
  7987. this._nowvalue = 1;
  7988. this.dir = false;
  7989. }
  7990. }
  7991. else {
  7992. this._nowvalue -= 0.001;
  7993. if (this._nowvalue <= 0) {
  7994. this._nowvalue = 0;
  7995. this.dir = true;
  7996. }
  7997. }
  7998. this.list_0.scrollPane.setPercY(this._nowvalue);
  7999. }
  8000. }
  8001. };
  8002. ShiwantuijianView.prototype.dispose = function () {
  8003. this._iscanmove = false;
  8004. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  8005. _super.prototype.dispose.call(this);
  8006. };
  8007. return ShiwantuijianView;
  8008. }(PanelChildControl_1.PanelChildControl));
  8009. exports.default = ShiwantuijianView;
  8010. },{"../Control/PanelChildControl":24,"../Time/TimerService":57,"./RecommendView":53}],55:[function(require,module,exports){
  8011. "use strict";
  8012. Object.defineProperty(exports, "__esModule", { value: true });
  8013. var RecommendView_1 = require("./RecommendView");
  8014. var ViewManager_1 = require("../View/ViewManager");
  8015. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  8016. var GameUtils_1 = require("../utils/GameUtils");
  8017. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  8018. var TuijianView = /** @class */ (function (_super) {
  8019. __extends(TuijianView, _super);
  8020. function TuijianView() {
  8021. return _super.call(this, "main", "tuijianView") || this;
  8022. }
  8023. TuijianView.prototype.initView = function () {
  8024. this.list_1.setVirtual();
  8025. this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false);
  8026. this.list_2.setVirtual();
  8027. this.list_2.itemRenderer = Laya.Handler.create(this, this.itemrenderlist2, null, false);
  8028. this._nowlist1 = RecommendView_1.Recommend.gdyxData;
  8029. this._nowlist2 = RecommendView_1.Recommend.gdyxData;
  8030. this.list_1.numItems = 7;
  8031. this.list_2.numItems = this._nowlist2.length;
  8032. };
  8033. TuijianView.prototype.initEvent = function () {
  8034. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
  8035. this.AddEventByType(this.more, Laya.Event.CLICK, this, this.JumpApp);
  8036. };
  8037. TuijianView.prototype.itemrenderlist1 = function (index, item) {
  8038. if (index < 7) {
  8039. item.showData(this._nowlist1[index]);
  8040. }
  8041. };
  8042. TuijianView.prototype.itemrenderlist2 = function (index, item) {
  8043. if (index < this._nowlist2.length) {
  8044. item.showData(this._nowlist2[index]);
  8045. }
  8046. };
  8047. TuijianView.prototype.onclosefun = function () {
  8048. ViewManager_1.ViewManager.Instance.close(TuijianView);
  8049. };
  8050. //随机跳转游戏
  8051. TuijianView.prototype.JumpApp = function () {
  8052. var ran = GameUtils_1.GameUtils.randRangeint(0, this._nowlist1.length - 1);
  8053. FYHD_Sdk_1.FYHD_Sdk.ShowHuTuiJump(this._nowlist1[ran], false);
  8054. };
  8055. TuijianView.key = "TuijianView";
  8056. return TuijianView;
  8057. }(PanelBaseControl_1.PanelBaseControl));
  8058. exports.default = TuijianView;
  8059. },{"../Control/PanelBaseControl":23,"../View/ViewManager":68,"../WXSDK/FYHD_Sdk":69,"../utils/GameUtils":85,"./RecommendView":53}],56:[function(require,module,exports){
  8060. "use strict";
  8061. Object.defineProperty(exports, "__esModule", { value: true });
  8062. var TimeUtils = /** @class */ (function () {
  8063. function TimeUtils() {
  8064. }
  8065. /**
  8066. * 月/日 小时:分钟
  8067. * @param value
  8068. */
  8069. TimeUtils.formatData = function (value) {
  8070. var str = "";
  8071. var date = new Date(value * 1000);
  8072. str = this.getTwo(date.getMonth() + 1) + "/" + this.getTwo(date.getDate()) + " " + this.getTwo(date.getHours()) + ":" + this.getTwo(date.getMinutes());
  8073. return str;
  8074. };
  8075. /**
  8076. * 月/日
  8077. * @param value
  8078. */
  8079. TimeUtils.formatData1 = function (value) {
  8080. var str = "";
  8081. var date = new Date(value * 1000);
  8082. str = (date.getMonth() + 1) + "月" + date.getDate() + "日";
  8083. return str;
  8084. };
  8085. /**
  8086. * 年月日
  8087. * @param value
  8088. */
  8089. TimeUtils.formatYearMonthDate = function (value) {
  8090. var str = "";
  8091. var date = new Date(value * 1000);
  8092. str = date.getFullYear() + "." + (date.getMonth() + 1) + "." + date.getDate();
  8093. return str;
  8094. };
  8095. /**
  8096. * 年-月-日
  8097. * @param value
  8098. */
  8099. TimeUtils.formatYearMonthDate1 = function (value) {
  8100. var str = "";
  8101. var date = new Date(value * 1000);
  8102. var month = (date.getMonth() + 1) >= 10 ? (date.getMonth() + 1).toString() : "0" + (date.getMonth() + 1);
  8103. var dates = date.getDate() >= 10 ? date.getDate().toString() : "0" + date.getDate();
  8104. str = date.getFullYear() + "-" + month + "-" + dates;
  8105. return str;
  8106. };
  8107. TimeUtils.LXandJXTimeType = function (value) {
  8108. var str = "";
  8109. if (value < 0) {
  8110. str = "0秒";
  8111. }
  8112. else if (value < 60) {
  8113. str = Math.floor(value) + "秒";
  8114. }
  8115. else if (value < 60 * 60) {
  8116. str = Math.floor(value / 60) + "分钟";
  8117. }
  8118. else {
  8119. var hour;
  8120. hour = Math.floor(value / 60 / 60);
  8121. str = hour + "小时";
  8122. str += Math.floor((value - hour * 60 * 60) / 60) + "分钟";
  8123. }
  8124. return str;
  8125. };
  8126. /**
  8127. * 格式化时间
  8128. * @param time 秒
  8129. * @return 返回24:59:59
  8130. */
  8131. TimeUtils.formatTime = function (time) {
  8132. var str = "";
  8133. var hours = Math.floor(time / 3600);
  8134. if (hours > 0) {
  8135. str += hours >= 10 ? (hours + ":") : ("0" + hours + ":");
  8136. }
  8137. var minutes = Math.floor((time % 3600) / 60);
  8138. str += minutes >= 10 ? (minutes + ":") : ("0" + minutes + ":");
  8139. var second = Math.floor(time % 60);
  8140. str += second >= 10 ? (second + "") : ("0" + second);
  8141. return str;
  8142. };
  8143. /**
  8144. * 格式化时间
  8145. * @param time 秒
  8146. * @return 返回24小时59分59秒
  8147. */
  8148. TimeUtils.formatTime1 = function (time) {
  8149. var str = "";
  8150. var hours = Math.floor(time / 3600);
  8151. if (hours > 0) {
  8152. str += hours + "小时";
  8153. }
  8154. var minutes = Math.floor((time % 3600) / 60);
  8155. str += minutes + "分钟";
  8156. var second = Math.floor(time % 60);
  8157. str += second + "秒";
  8158. return str;
  8159. };
  8160. /**
  8161. * 格式化时间
  8162. * @param time 秒
  8163. * @return 返回1小时24分10秒
  8164. */
  8165. TimeUtils.formatTime5 = function (time) {
  8166. var str = "";
  8167. var hours = Math.floor(time / 3600);
  8168. if (hours > 0) {
  8169. str += hours + "小时";
  8170. }
  8171. var minutes = Math.floor((time % 3600) / 60);
  8172. if (minutes > 0) {
  8173. str += minutes + "分";
  8174. }
  8175. var second = Math.floor(time % 60);
  8176. str += second + "秒";
  8177. return str;
  8178. };
  8179. /**
  8180. * 格式化时间
  8181. * @param time 秒
  8182. * @return 返回1天24小时59分59秒
  8183. */
  8184. TimeUtils.formatTime2 = function (time) {
  8185. var str = "";
  8186. var day = Math.floor(time / 86400);
  8187. if (day > 0) {
  8188. str += day + "天";
  8189. }
  8190. var hours = Math.floor(time / 3600);
  8191. if (hours > 0) {
  8192. str += hours + "小时";
  8193. }
  8194. var minutes = Math.floor((time % 3600) / 60);
  8195. if (minutes > 0) {
  8196. str += minutes + "分钟";
  8197. }
  8198. var second = Math.ceil(time % 60);
  8199. str += second + "秒";
  8200. return str;
  8201. };
  8202. /**
  8203. * 格式化时间
  8204. * @param time 秒
  8205. * @return 返回1天24小时( 只保留两个 )
  8206. */
  8207. TimeUtils.formatTime6 = function (time) {
  8208. var str = "";
  8209. var index = 0;
  8210. var day = Math.floor(time / 86400);
  8211. if (day > 0) {
  8212. str += day + "天";
  8213. index++;
  8214. }
  8215. var hours = Math.floor((time % 86400) / 3600);
  8216. if (hours > 0) {
  8217. str += hours + "小时";
  8218. index++;
  8219. }
  8220. if (index < 2) {
  8221. var minutes = Math.floor((time % 3600) / 60);
  8222. if (minutes > 0) {
  8223. str += minutes + "分";
  8224. index++;
  8225. }
  8226. }
  8227. if (index < 2) {
  8228. var second = Math.ceil(time % 60);
  8229. str += second + "秒";
  8230. }
  8231. return str;
  8232. };
  8233. /**
  8234. * 格式化时间
  8235. * @param time 秒
  8236. * @return 返回1天24小时59分
  8237. */
  8238. TimeUtils.formatTime3 = function (time) {
  8239. var str = "";
  8240. var day = Math.floor(time / 86400);
  8241. str += day + "天";
  8242. var hours = Math.floor(time % 86400 / 3600);
  8243. str += hours + "小时";
  8244. var minutes = Math.floor((time % 86400 % 3600) / 60);
  8245. str += minutes + "分";
  8246. return str;
  8247. };
  8248. /**
  8249. * 格式化时间
  8250. * @param time 秒
  8251. * @return 返回1天24小时59分
  8252. */
  8253. TimeUtils.formatTime4 = function (time) {
  8254. var str = "";
  8255. if (time > 86400) {
  8256. var day = Math.floor(time / 86400);
  8257. str += day + "天";
  8258. }
  8259. if (time > 3600) {
  8260. var hours = Math.floor(time % 86400 / 3600);
  8261. str += hours + "小时";
  8262. }
  8263. if (time > 60) {
  8264. var minutes = Math.floor((time % 86400 % 3600) / 60);
  8265. str += minutes + "分钟";
  8266. }
  8267. return str;
  8268. };
  8269. /**
  8270. * 格式化时间
  8271. * @param time 秒
  8272. * @return 返回1天24小时59分
  8273. */
  8274. TimeUtils.formatTime4Arr = function (time) {
  8275. var arrTime = [];
  8276. var str = "";
  8277. // if (time >= 86400) {
  8278. // var day: number = Math.floor(time / 86400);
  8279. // arrTime.unshift(String(day));
  8280. // }
  8281. if (time >= 3600) {
  8282. var hours = Math.floor(time % 86400 / 3600);
  8283. arrTime.unshift(String(hours));
  8284. }
  8285. if (time >= 60) {
  8286. var minutes = Math.floor((time % 86400 % 3600) / 60);
  8287. arrTime.unshift(String(minutes));
  8288. }
  8289. return arrTime;
  8290. };
  8291. TimeUtils.getTwo = function (value) {
  8292. var str = String(value);
  8293. if (str.length < 2) {
  8294. str = "0" + str;
  8295. }
  8296. return str;
  8297. };
  8298. /**
  8299. * 日期转时间戳
  8300. * @param str 2018-1-1
  8301. */
  8302. TimeUtils.datetoTime = function (str) {
  8303. return Date.parse(str) / 1000;
  8304. };
  8305. return TimeUtils;
  8306. }());
  8307. exports.TimeUtils = TimeUtils;
  8308. },{}],57:[function(require,module,exports){
  8309. "use strict";
  8310. Object.defineProperty(exports, "__esModule", { value: true });
  8311. /*
  8312. * name;
  8313. */
  8314. var TimerService = /** @class */ (function (_super) {
  8315. __extends(TimerService, _super);
  8316. function TimerService() {
  8317. var _this = _super.call(this) || this;
  8318. _this._timeScale = 1;
  8319. _this._unscalableList = [];
  8320. TimerService.ins = _this;
  8321. return _this;
  8322. }
  8323. Object.defineProperty(TimerService, "Instance", {
  8324. get: function () {
  8325. if (TimerService.ins == null) {
  8326. return new TimerService();
  8327. }
  8328. return TimerService.ins;
  8329. },
  8330. enumerable: true,
  8331. configurable: true
  8332. });
  8333. TimerService.prototype.init = function () {
  8334. Laya.timer.frameLoop(1, this, this.onTimer);
  8335. };
  8336. TimerService.prototype.initEvent = function () {
  8337. };
  8338. TimerService.prototype.stop = function () {
  8339. Laya.timer.clear(this, this.onTimer);
  8340. };
  8341. TimerService.prototype.recover = function () {
  8342. this.stop();
  8343. Laya.timer.frameLoop(1, this, this.onTimer);
  8344. };
  8345. TimerService.prototype.onTimer = function () {
  8346. var i = 0;
  8347. for (i = 0; i < this._unscalableList.length; i++) {
  8348. this._unscalableList[i].update(Laya.timer.delta * this._timeScale);
  8349. }
  8350. };
  8351. TimerService.prototype.hasUpdataTarget = function (updateTarget) {
  8352. var index;
  8353. index = this._unscalableList.indexOf(updateTarget);
  8354. if (index != -1) {
  8355. return true;
  8356. }
  8357. return false;
  8358. };
  8359. TimerService.prototype.addUpdateTarget = function (updateTarget) {
  8360. var index;
  8361. index = this._unscalableList.indexOf(updateTarget);
  8362. if (index == -1) {
  8363. this._unscalableList.push(updateTarget);
  8364. }
  8365. };
  8366. TimerService.prototype.removeUpdateTarget = function (updateTarget) {
  8367. var index = this._unscalableList.indexOf(updateTarget);
  8368. if (index != -1) {
  8369. this._unscalableList.splice(index, 1);
  8370. }
  8371. };
  8372. Object.defineProperty(TimerService.prototype, "timeScale", {
  8373. get: function () {
  8374. return this._timeScale;
  8375. },
  8376. /**
  8377. * @private
  8378. */
  8379. set: function (value) {
  8380. if (value < 0 || isNaN(value)) {
  8381. value = 1;
  8382. }
  8383. this._timeScale = value;
  8384. },
  8385. enumerable: true,
  8386. configurable: true
  8387. });
  8388. return TimerService;
  8389. }(Laya.EventDispatcher));
  8390. exports.TimerService = TimerService;
  8391. },{}],58:[function(require,module,exports){
  8392. "use strict";
  8393. Object.defineProperty(exports, "__esModule", { value: true });
  8394. var UserDataInfo_1 = require("../Data/UserDataInfo");
  8395. var LocalDataControl_1 = require("../Control/LocalDataControl");
  8396. var TimesTamper = /** @class */ (function () {
  8397. function TimesTamper() {
  8398. this.lastgameTime = 0;
  8399. /**
  8400. * 同步服务器时间(秒)
  8401. */
  8402. this._serverTime = 0;
  8403. this.iscan = false;
  8404. this._onlinedistime = 0;
  8405. this._time = 0;
  8406. this._onlinetime = 0;
  8407. }
  8408. Object.defineProperty(TimesTamper, "Instance", {
  8409. get: function () {
  8410. if (TimesTamper.ins == null) {
  8411. return new TimesTamper();
  8412. }
  8413. return TimesTamper.ins;
  8414. },
  8415. enumerable: true,
  8416. configurable: true
  8417. });
  8418. TimesTamper.prototype.init = function () {
  8419. this.lastgameTime = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.lasttime);
  8420. Laya.timer.frameLoop(1, this, this.update);
  8421. };
  8422. TimesTamper.prototype.updateServiceTime = function (serverTime) {
  8423. this._serverTime = Number(serverTime);
  8424. this.iscan = true;
  8425. this._onlinedistime = this._serverTime;
  8426. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lasttime, this._serverTime.toString());
  8427. };
  8428. TimesTamper.prototype.update = function () {
  8429. if (this.iscan) {
  8430. this._time += Laya.timer.delta;
  8431. this._onlinetime += Laya.timer.delta;
  8432. this._serverTime += Laya.timer.delta / 1000;
  8433. if (this._time >= 30000) {
  8434. this._time = 0;
  8435. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lasttime, this._serverTime.toString());
  8436. }
  8437. if (this._onlinetime >= 90000) {
  8438. this._onlinetime = 0;
  8439. this.sendonlineTongji();
  8440. }
  8441. }
  8442. };
  8443. TimesTamper.prototype.sendonlineTongji = function () {
  8444. var distime = this.serverTime - this._onlinedistime;
  8445. if (distime > 0) {
  8446. this._onlinedistime = this.serverTime;
  8447. }
  8448. };
  8449. Object.defineProperty(TimesTamper.prototype, "serverTime", {
  8450. /**
  8451. * 服务器时间 ( 秒 )
  8452. * @return
  8453. *
  8454. */
  8455. get: function () {
  8456. return this._serverTime;
  8457. },
  8458. enumerable: true,
  8459. configurable: true
  8460. });
  8461. return TimesTamper;
  8462. }());
  8463. exports.TimesTamper = TimesTamper;
  8464. },{"../Control/LocalDataControl":22,"../Data/UserDataInfo":33}],59:[function(require,module,exports){
  8465. "use strict";
  8466. Object.defineProperty(exports, "__esModule", { value: true });
  8467. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  8468. var ViewAction_1 = require("../utils/ViewAction");
  8469. var GameStateControl_1 = require("../Control/GameStateControl");
  8470. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  8471. var AgencyInGame_1 = require("../Agency/AgencyInGame");
  8472. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  8473. var ViewManager_1 = require("../View/ViewManager");
  8474. var GuangGao_1 = require("../WXSDK/GuangGao");
  8475. var GameState_1 = require("../utils/GameState");
  8476. var Player_1 = require("../Game/Player");
  8477. var PropManager_1 = require("../PrefabControl/PropManager");
  8478. var DispatcherManager_1 = require("../utils/DispatcherManager");
  8479. var CharacterState_1 = require("../PrefabControl/CharacterState");
  8480. var RecordManager_1 = require("../WXSDK/RecordManager");
  8481. var ttad_1 = require("../WXSDK/ttad");
  8482. // import ChoutiPanView from "../Push/ChoutiPanView";
  8483. var CompletePanel = /** @class */ (function (_super) {
  8484. __extends(CompletePanel, _super);
  8485. function CompletePanel(gold) {
  8486. var _this = _super.call(this, "main", "gameresult", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  8487. _this.getgold = 0;
  8488. _this._position = new Laya.Vector3();
  8489. _this._outPos = new Laya.Vector3();
  8490. _this.scaleDelta = 0;
  8491. _this.scale = new Laya.Vector3(0.1, 0.1, 0.1);
  8492. _this.time = 9;
  8493. _this.count = false;
  8494. _this.fuhuo = false;
  8495. _this.getgold = gold;
  8496. return _this;
  8497. }
  8498. /*************************************************************** */
  8499. CompletePanel.prototype.loadScene = function () {
  8500. Laya.Scene3D.load("res/threeDimen/scene/ParticleScene/Example_01.ls", Laya.Handler.create(this, function (scene) {
  8501. this.scene = Laya.stage.addChildAt(scene, 0);
  8502. var camera = this.scene.addChild(new Laya.Camera(0, 0.1, 100));
  8503. camera.transform.translate(new Laya.Vector3(0, 1, 0));
  8504. }));
  8505. };
  8506. CompletePanel.prototype.garbageCollection = function () {
  8507. this.scene.destroy(); //销毁场景
  8508. this.scene = null;
  8509. Laya.Resource.destroyUnusedResources(); //销毁无用资源(没有被场景树引用,并且没有加资源锁的)
  8510. };
  8511. /*************************************************************** */
  8512. CompletePanel.prototype.btn1click = function () {
  8513. if (this.c_state.selectedIndex == 0) {
  8514. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
  8515. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).LevelUp();
  8516. this._gameProxy.returnmainview(true);
  8517. }
  8518. else if (this.c_state.selectedIndex == 1) {
  8519. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
  8520. this._gameProxy.returnmainview();
  8521. // ViewManager.Instance.add( ChoutiPanView );
  8522. }
  8523. else if (this.c_state.selectedIndex == 2) {
  8524. // ShareUtil.shareImage("分享复活----",this.sharerevive,"1")
  8525. this.sharerevive();
  8526. }
  8527. };
  8528. CompletePanel.prototype.onComplete = function () {
  8529. Laya.Sprite3D.load("res/threeDimen/skinModel/LayaMonkey/LayaMonkey.lh", Laya.Handler.create(this, function (layaMonkey3D) {
  8530. this.layaMonkey3D = layaMonkey3D;
  8531. this.scene.addChild(layaMonkey3D);
  8532. this.layaMonkey2D = Laya.stage.addChild(new Laya.Image("res/threeDimen/monkey.png"));
  8533. Laya.timer.frameLoop(1, this, this.animate);
  8534. }));
  8535. };
  8536. CompletePanel.prototype.animate = function () {
  8537. this._position.x = Math.sin(this.scaleDelta += 0.01);
  8538. this.layaMonkey3D.transform.position = this._position;
  8539. this.layaMonkey3D.transform.scale = this.scale;
  8540. //转换坐标
  8541. this.camera.viewport.project(this.layaMonkey3D.transform.position, this.camera.projectionViewMatrix, this._outPos);
  8542. //赋值给2D
  8543. this.layaMonkey2D.pos(this._outPos.x / Laya.stage.clientScaleX, this._outPos.y / Laya.stage.clientScaleY);
  8544. };
  8545. /******************************************** */
  8546. CompletePanel.prototype.btn0click = function () {
  8547. if (this.c_state.selectedIndex == 0) {
  8548. this.playvideocallback();
  8549. // pingtaiutils.Instance.playVideo( "",this,this.playvideocallback );
  8550. }
  8551. else if (this.c_state.selectedIndex == 1) {
  8552. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
  8553. this._gameProxy.returnmainview();
  8554. // ViewManager.Instance.add( ChoutiPanView );
  8555. }
  8556. else if (this.c_state.selectedIndex == 2) {
  8557. this.count = false;
  8558. // pingtaiutils.Instance.playVideo("",this,this.playvideorevive);
  8559. this.playvideorevive();
  8560. }
  8561. };
  8562. /**看视频复活成功 */
  8563. CompletePanel.prototype.playvideorevive = function () {
  8564. var _this = this;
  8565. ttad_1.ttad.ShowVideo((function (isLoad) {
  8566. if (isLoad) {
  8567. // ViewManager.Instance.add(ChoutiPanView);
  8568. GameState_1.GameState.fuhuocishu--;
  8569. ViewManager_1.ViewManager.Instance.close(CompletePanel);
  8570. GameState_1.GameState.isdie = false;
  8571. Player_1.Player.Instance._iscanMove = true;
  8572. // Player.Instance.PlayAnimator( CharacterState.run );
  8573. Player_1.Player.Instance.nowAction = CharacterState_1.CharacterState.run;
  8574. if (Player_1.Player.Instance._nowscenename == "" || Player_1.Player.Instance._nowbuildname == "") {
  8575. console.log("玩家位置----", Player_1.Player.Instance._initPosVec);
  8576. console.log("玩家速度_moveVec", Player_1.Player.Instance._moveVec);
  8577. Player_1.Player.Instance._transform.position = new Laya.Vector3(0, 1, 3);
  8578. }
  8579. else {
  8580. console.log("当前场景名字---", Player_1.Player.Instance._nowscenename);
  8581. console.log("当前建筑名字---", Player_1.Player.Instance._nowbuildname);
  8582. console.log("建筑物位置----", PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname));
  8583. Player_1.Player.Instance._transform.position = PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname).clone();
  8584. }
  8585. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed * 2;
  8586. Laya.timer.once(3000, _this, function () {
  8587. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed;
  8588. });
  8589. }
  8590. else {
  8591. _this.count = true;
  8592. }
  8593. }));
  8594. };
  8595. /**分享复活成功 */
  8596. CompletePanel.prototype.sharerevive = function () {
  8597. var _this = this;
  8598. RecordManager_1.RecordManager.Instance.ShareVideo(function (isLoad) {
  8599. if (isLoad) {
  8600. RecordManager_1.RecordManager.Instance.RecordStart();
  8601. GameState_1.GameState.fuhuocishu--;
  8602. // GameState.recordscree = true;
  8603. ViewManager_1.ViewManager.Instance.close(CompletePanel);
  8604. GameState_1.GameState.isdie = false;
  8605. Player_1.Player.Instance._iscanMove = true;
  8606. // Player.Instance.PlayAnimator( CharacterState.run );
  8607. Player_1.Player.Instance.nowAction = CharacterState_1.CharacterState.run;
  8608. if (Player_1.Player.Instance._nowscenename == "" || Player_1.Player.Instance._nowbuildname == "") {
  8609. console.log("玩家位置----", Player_1.Player.Instance._initPosVec);
  8610. Player_1.Player.Instance._transform.position = new Laya.Vector3(0, 1, 3);
  8611. }
  8612. else {
  8613. console.log("当前场景名字---", Player_1.Player.Instance._nowscenename);
  8614. console.log("当前建筑名字---", Player_1.Player.Instance._nowbuildname);
  8615. console.log("建筑物位置----", PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname));
  8616. Player_1.Player.Instance._transform.position = PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname).clone();
  8617. }
  8618. // GlobalTip.Instance.showWordTips("复活加速成功");
  8619. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed * 2;
  8620. Laya.timer.once(3000, _this, function () {
  8621. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed;
  8622. });
  8623. }
  8624. else {
  8625. _this.count = true;
  8626. }
  8627. });
  8628. // if(_success){
  8629. // // ViewManager.Instance.add(ChoutiPanView);
  8630. // GameState.fuhuocishu --;
  8631. // ViewManager.Instance.close( CompletePanel );
  8632. // GameState.isdie = false;
  8633. // Player.Instance._iscanMove = true;
  8634. // // Player.Instance.PlayAnimator( CharacterState.run );
  8635. // Player.Instance.nowAction = CharacterState.run;
  8636. // if (Player.Instance._nowscenename == "" || Player.Instance._nowbuildname == "") {
  8637. // console.log("玩家位置----",Player.Instance._initPosVec);
  8638. // Player.Instance._transform.position = Player.Instance._initPosVec.clone()
  8639. // }
  8640. // else {
  8641. // console.log("当前场景名字---",Player.Instance._nowscenename);
  8642. // console.log("当前建筑名字---",Player.Instance._nowbuildname);
  8643. // console.log("建筑物位置----",PropManager.getPosVecbyScene(Player.Instance._nowscenename, Player.Instance._nowbuildname));
  8644. // Player.Instance._transform.position = PropManager.getPosVecbyScene(Player.Instance._nowscenename, Player.Instance._nowbuildname).clone();
  8645. // }
  8646. // // GlobalTip.Instance.showWordTips("复活加速成功");
  8647. // Player.Instance._speedMoveV3.z = -Player.Instance._RoleData.movespeed*2;
  8648. // Laya.timer.once(3000,this,()=>{
  8649. // Player.Instance._speedMoveV3.z = -Player.Instance._RoleData.movespeed;
  8650. // })
  8651. // }
  8652. // else{
  8653. // this.count = true;
  8654. // }
  8655. };
  8656. CompletePanel.prototype.playvideocallback = function () {
  8657. var _this = this;
  8658. RecordManager_1.RecordManager.Instance.ShareVideo((function (isLoad) {
  8659. if (isLoad) {
  8660. _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(_this.getgold * 3);
  8661. _this._gameProxy.returnmainview(true);
  8662. _this.BattleBtn.visible = false;
  8663. }
  8664. }));
  8665. // ttad.ShowVideo((isLoad=>{
  8666. // if(isLoad){
  8667. // ( this.getProxy( AgencyUserMessage ) as AgencyUserMessage ).GoldUp( this.getgold*3 );
  8668. // this._gameProxy.returnmainview(true);
  8669. // }
  8670. // }))
  8671. };
  8672. //分享视频
  8673. CompletePanel.prototype.ShareVideoCallBack = function () {
  8674. var _this = this;
  8675. RecordManager_1.RecordManager.Instance.ShareVideo((function (isLoad) {
  8676. if (isLoad) {
  8677. _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(_this.getgold * 3);
  8678. _this.BattleBtn.visible = false;
  8679. _this.ShareVideo.visible = false;
  8680. }
  8681. }));
  8682. };
  8683. //点击勾选框
  8684. CompletePanel.prototype.ClickKuang = function () {
  8685. if (this.duihao.visible) {
  8686. this.duihao.visible = false;
  8687. this.btn_1.visible = this.duihao.visible;
  8688. this.btn_2.visible = !this.duihao.visible;
  8689. }
  8690. else {
  8691. this.duihao.visible = true;
  8692. this.btn_1.visible = this.duihao.visible;
  8693. this.btn_2.visible = !this.duihao.visible;
  8694. }
  8695. };
  8696. CompletePanel.prototype.destory = function () {
  8697. Laya.timer.clear(this, this.CountTime);
  8698. // Laya.timer.clear(this,this.playanimator);
  8699. // GuangGao.Clear();
  8700. ttad_1.ttad.Clear();
  8701. _super.prototype.destory.call(this);
  8702. };
  8703. CompletePanel.prototype.initView = function () {
  8704. var _this = this;
  8705. this.tianjia.visible = false;
  8706. this.TianJiaAni = this.getTransitionByName("tianjiaani");
  8707. this.TianJiaAni.stop();
  8708. // Laya.timer.loop(2000,this,this.playanimator);
  8709. this.count = true;
  8710. this._gameProxy = this.getProxy(AgencyInGame_1.AgencyInGame);
  8711. this.c_state = this.getControllerByBame("c_state");
  8712. this.txt_gold.text = this.getgold.toString();
  8713. this.duihao = this.kuang.getChildAt(1);
  8714. this.duihao.visible = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.Choose;
  8715. this.share_goldnum = this.ShareVideo.getChildAt(4);
  8716. this.ShareVideoBtn = this.ShareVideo.getChildAt(1);
  8717. this.jiesuanbtn = this.ShareVideo.getChildAt(2);
  8718. this.share_goldnum.text = this.getgold.toString();
  8719. this.btn_1.visible = this.duihao.visible;
  8720. this.btn_2.visible = !this.duihao.visible;
  8721. if (GameState_1.GameState.recordscree) {
  8722. this.BattleBtn.visible = false;
  8723. }
  8724. else {
  8725. this.BattleBtn.visible = true;
  8726. }
  8727. // this.BattleBtn.visible = !GameState.recordscree;
  8728. if (!GameState_1.GameState.isdie) { //玩家未死亡的状态
  8729. if (GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0) {
  8730. this.c_state.selectedIndex = 0;
  8731. }
  8732. else {
  8733. this.c_state.selectedIndex = 1;
  8734. }
  8735. }
  8736. else {
  8737. if (GameState_1.GameState.fuhuocishu > 0) {
  8738. this.c_state.selectedIndex = 2;
  8739. Laya.timer.loop(1000, this, this.CountTime);
  8740. }
  8741. else {
  8742. this.c_state.selectedIndex = 1;
  8743. }
  8744. }
  8745. if (this.c_state.selectedIndex == 0) {
  8746. this.ShareVideo.visible = true;
  8747. this.jiesuanbtn.visible = false;
  8748. Laya.timer.once(2000, this, function () {
  8749. _this.jiesuanbtn.visible = true;
  8750. });
  8751. }
  8752. else {
  8753. this.ShareVideo.visible = false;
  8754. }
  8755. GuangGao_1.GuangGao.CheatBanner(this.btn_1);
  8756. };
  8757. CompletePanel.prototype.playanimator = function () {
  8758. this.TianJiaAni.play(null, 1);
  8759. };
  8760. CompletePanel.prototype.ClickJieSuan = function () {
  8761. this.ShareVideo.visible = false;
  8762. };
  8763. CompletePanel.prototype.initEvent = function () {
  8764. this.AddEventByType(this.btn_0, Laya.Event.CLICK, this, this.btn0click);
  8765. this.AddEventByType(this.btn_1, Laya.Event.CLICK, this, this.btn1click);
  8766. this.AddEventByType(this.BattleBtn, Laya.Event.CLICK, this, this.ShareBattle);
  8767. this.AddEventByType(this.btn_2, Laya.Event.CLICK, this, this.btn1click);
  8768. this.AddEventByType(this.kuang, Laya.Event.CLICK, this, this.ClickKuang);
  8769. this.AddEventByType(this.ShareVideoBtn, Laya.Event.CLICK, this, this.ShareVideoCallBack);
  8770. this.AddEventByType(this.jiesuanbtn, Laya.Event.CLICK, this, this.ClickJieSuan);
  8771. };
  8772. //倒计时
  8773. CompletePanel.prototype.CountTime = function () {
  8774. if (this.count && this.time > 0) {
  8775. this.time -= 1;
  8776. this.timenum.text = this.time.toString();
  8777. if (this.time < 1) {
  8778. Laya.timer.clear(this, this.CountTime);
  8779. GameState_1.GameState.fuhuocishu--;
  8780. // Laya.timer.clear(this,this.playanimator);
  8781. ViewManager_1.ViewManager.Instance.close(CompletePanel);
  8782. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
  8783. }
  8784. }
  8785. };
  8786. //录屏分享
  8787. CompletePanel.prototype.ShareBattle = function () {
  8788. var _this = this;
  8789. RecordManager_1.RecordManager.Instance.ShareVideo(function (isLoad) {
  8790. if (isLoad) {
  8791. _this.BattleBtn.visible = false;
  8792. }
  8793. });
  8794. // RecordManager.Instance.ShareVideo((isLoad=>{
  8795. // if(isLoad){
  8796. // this.BattleBtn.visible = false;
  8797. // }
  8798. // }))
  8799. };
  8800. CompletePanel.key = "CompletePanel";
  8801. return CompletePanel;
  8802. }(PanelBaseControl_1.PanelBaseControl));
  8803. exports.CompletePanel = CompletePanel;
  8804. },{"../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/PlayerAccount":73,"../WXSDK/RecordManager":74,"../WXSDK/ttad":81,"../utils/DispatcherManager":83,"../utils/GameState":84,"../utils/ViewAction":91}],60:[function(require,module,exports){
  8805. "use strict";
  8806. Object.defineProperty(exports, "__esModule", { value: true });
  8807. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  8808. var GameUtils_1 = require("../utils/GameUtils");
  8809. var TimerService_1 = require("../Time/TimerService");
  8810. var GuangGao_1 = require("../WXSDK/GuangGao");
  8811. var ViewAction_1 = require("../utils/ViewAction");
  8812. var ViewManager_1 = require("./ViewManager");
  8813. var SceneControl_1 = require("../Control/SceneControl");
  8814. var GameStateControl_1 = require("../Control/GameStateControl");
  8815. var GlobalTip_1 = require("../utils/GlobalTip");
  8816. var ttad_1 = require("../WXSDK/ttad");
  8817. var EggPanel = /** @class */ (function (_super) {
  8818. __extends(EggPanel, _super);
  8819. function EggPanel() {
  8820. var _this = _super.call(this, "main", "eggview", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  8821. _this._isComplete = false;
  8822. _this._isShowBanner = false;
  8823. _this._bannerVal = 0.5;
  8824. _this._maxClickCnt = 18;
  8825. _this._clickCnt = 0;
  8826. _this._interval = 100;
  8827. _this._decrement = 1;
  8828. _this._time = 0;
  8829. return _this;
  8830. }
  8831. EggPanel.prototype.initView = function () {
  8832. this.hitani = this.getTransitionByName("hitani");
  8833. this.pro_0.value = 1;
  8834. this._bannerVal = GameUtils_1.GameUtils.randRangefloat(0.2, 0.4);
  8835. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  8836. // GuangGao.CheatBanner(this.btn_1);
  8837. // GuangGao.Clear();//h["default"].Clear()r["default"]
  8838. ttad_1.ttad.Clear();
  8839. var sceneheight = Laya.stage.height;
  8840. this.btn_1.y = sceneheight - this.btn_1.height - 15;
  8841. this.getrewardbtn.y = this.btn_1.y;
  8842. this.getrewardbtn.visible = false;
  8843. if (SceneControl_1.SceneControl.EggGGroup == 0) {
  8844. this.n6.visible = true;
  8845. }
  8846. };
  8847. EggPanel.prototype.bannercallback = function () {
  8848. };
  8849. EggPanel.prototype.initEvent = function () {
  8850. this.AddEventByType(this.btn_1, Laya.Event.CLICK, this, this.qiaoDa);
  8851. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, EggPanel.onclosefun);
  8852. this.AddEventByType(this.getrewardbtn, Laya.Event.CLICK, this, EggPanel.VideoGetReward);
  8853. };
  8854. EggPanel.prototype.update = function (dt) {
  8855. this._time += dt;
  8856. if (this._time >= this._interval) {
  8857. this._time = 0;
  8858. this.Daojishi();
  8859. }
  8860. };
  8861. EggPanel.prototype.Daojishi = function () {
  8862. var pv = this.pro_0.value;
  8863. pv -= this._decrement;
  8864. if (pv <= 0)
  8865. pv = 1;
  8866. this.pro_0.value = pv;
  8867. this._clickCnt = Math.ceil(pv * this._maxClickCnt / 100);
  8868. };
  8869. EggPanel.prototype.qiaoDa = function () {
  8870. var _this = this;
  8871. if (!this._isComplete) {
  8872. if (this.hitani != null && !this.hitani.playing) {
  8873. this.hitani.play(null, 1);
  8874. }
  8875. this._clickCnt++;
  8876. if (this._clickCnt > this._maxClickCnt)
  8877. this._clickCnt = this._maxClickCnt;
  8878. var pv = this._clickCnt / this._maxClickCnt;
  8879. if (pv > 1) {
  8880. pv = 1;
  8881. }
  8882. this.pro_0.value = pv * 100;
  8883. if (pv >= this._bannerVal && !this._isShowBanner) {
  8884. this._isShowBanner = true;
  8885. this.getrewardbtn.visible = true;
  8886. // GuangGao.OpenBanner();
  8887. Laya.timer.once(2000, this, function () {
  8888. _this.getrewardbtn.visible = false;
  8889. });
  8890. }
  8891. if (pv >= 1) {
  8892. this._isComplete = true;
  8893. EggPanel.getreward();
  8894. }
  8895. }
  8896. };
  8897. EggPanel.getreward = function () {
  8898. // var zpproxy:AgencyLottery = this.getProxy( AgencyLottery ) as AgencyLottery;
  8899. // var index = ( this.getProxy( AgencyLottery ) as AgencyLottery ).GetReward();
  8900. // var selectcfg:LotteryCFG = LotteryCFG.vec[ index ];
  8901. // zpproxy.getreward( selectcfg );
  8902. // TimerService.Instance.removeUpdateTarget( this );
  8903. GlobalTip_1.GlobalTip.Instance.showWordTips("获得开局加速");
  8904. EggPanel.onclosefun();
  8905. };
  8906. //看视频得奖励
  8907. EggPanel.VideoGetReward = function () {
  8908. ttad_1.ttad.ShowVideo((function (isLoad) {
  8909. if (isLoad) {
  8910. GlobalTip_1.GlobalTip.Instance.showWordTips("获得开局加速");
  8911. EggPanel.onclosefun();
  8912. }
  8913. else {
  8914. EggPanel.onclosefun();
  8915. }
  8916. }));
  8917. };
  8918. EggPanel.prototype.hidebanner = function () {
  8919. // PlatformTool.getInstance().hideBanner("EggView");
  8920. GuangGao_1.GuangGao.hidebanner();
  8921. };
  8922. EggPanel.onclosefun = function () {
  8923. ViewManager_1.ViewManager.Instance.close(EggPanel);
  8924. };
  8925. EggPanel.prototype.destory = function () {
  8926. // PlatformTool.getInstance().hideBanner("EggView");
  8927. // GuangGao.hidebanner();
  8928. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  8929. _super.prototype.destory.call(this);
  8930. GameStateControl_1.GameStateControl.Instance.entergame(true);
  8931. };
  8932. EggPanel.key = "EggPanel";
  8933. return EggPanel;
  8934. }(PanelBaseControl_1.PanelBaseControl));
  8935. exports.default = EggPanel;
  8936. },{"../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){
  8937. "use strict";
  8938. Object.defineProperty(exports, "__esModule", { value: true });
  8939. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  8940. var GameUtils_1 = require("../utils/GameUtils");
  8941. var TimerService_1 = require("../Time/TimerService");
  8942. var GuangGao_1 = require("../WXSDK/GuangGao");
  8943. var ViewManager_1 = require("./ViewManager");
  8944. var GlobalTip_1 = require("../utils/GlobalTip");
  8945. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  8946. var RoleData_1 = require("../Data/RoleData");
  8947. var ttad_1 = require("../WXSDK/ttad");
  8948. var GiftView = /** @class */ (function (_super) {
  8949. __extends(GiftView, _super);
  8950. function GiftView() {
  8951. var _this = _super.call(this, "main", "giftcheatview") || this;
  8952. _this._isComplete = false;
  8953. _this._isShowBanner = false;
  8954. _this._bannerVal = 0.5;
  8955. _this._maxClickCnt = 18;
  8956. _this._clickCnt = 0;
  8957. _this._interval = 100;
  8958. _this._decrement = 1;
  8959. _this._time = 0;
  8960. return _this;
  8961. }
  8962. GiftView.prototype.initView = function () {
  8963. this.anniu = this.item.asCom.getChildAt(2);
  8964. this.kuaisudianji = this.item.asCom.getChildAt(0);
  8965. this.shou = this.item.asCom.getChildAt(3);
  8966. this.di = this.item.asCom.getChildAt(1);
  8967. this.getrewardbtn = this.item.asCom.getChildAt(4);
  8968. this.getrewardbtn.visible = false;
  8969. this.clickani = this.item.getTransition("clickbtnani");
  8970. this.jindu.value = 1;
  8971. this._bannerVal = GameUtils_1.GameUtils.randRangefloat(0.2, 0.4);
  8972. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  8973. // GuangGao.Clear();
  8974. ttad_1.ttad.Clear();
  8975. Laya.timer.loop(2000, this, this.playAnimator);
  8976. // var sceneheight = Laya.stage.height;
  8977. // this.btnbox.y=sceneheight-this.btnbox.y-15;
  8978. };
  8979. GiftView.prototype.playAnimator = function () {
  8980. this.clickani.play(null, 1);
  8981. };
  8982. GiftView.prototype.initEvent = function () {
  8983. this.AddEventByType(this.anniu, Laya.Event.CLICK, this, this.qiaoDa);
  8984. this.AddEventByType(this.getrewardbtn, Laya.Event.CLICK, this, this.VideoGetReward);
  8985. };
  8986. GiftView.prototype.update = function (dt) {
  8987. this._time += dt;
  8988. if (this._time >= this._interval) {
  8989. this._time = 0;
  8990. this.Daojishi();
  8991. }
  8992. };
  8993. GiftView.prototype.Daojishi = function () {
  8994. var pv = this.jindu.value;
  8995. pv -= this._decrement;
  8996. if (pv <= 0)
  8997. pv = 1;
  8998. this.jindu.value = pv;
  8999. this._clickCnt = Math.ceil(pv * this._maxClickCnt / 100);
  9000. };
  9001. GiftView.prototype.qiaoDa = function () {
  9002. var _this = this;
  9003. if (this.shou.visible) {
  9004. this.shou.visible = false;
  9005. this.kuaisudianji.visible = false;
  9006. Laya.timer.clear(this, this.playAnimator);
  9007. }
  9008. if (!this._isComplete) {
  9009. this._clickCnt++;
  9010. if (this._clickCnt > this._maxClickCnt)
  9011. this._clickCnt = this._maxClickCnt;
  9012. var pv = this._clickCnt / this._maxClickCnt;
  9013. if (pv > 1) {
  9014. pv = 1;
  9015. }
  9016. this.jindu.value = pv * 100;
  9017. if (pv >= this._bannerVal && !this._isShowBanner) {
  9018. this._isShowBanner = true;
  9019. this.getrewardbtn.visible = true;
  9020. Laya.timer.once(2000, this, function () {
  9021. _this.getrewardbtn.visible = false;
  9022. });
  9023. }
  9024. if (pv >= 1) {
  9025. this._isComplete = true;
  9026. GiftView.getreward();
  9027. }
  9028. }
  9029. };
  9030. GiftView.getreward = function () {
  9031. RoleData_1.RoleData.Instance.Money += PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward;
  9032. // ( this.getProxy( AgencyUserMessage ) as AgencyUserMessage ).GoldUp( PlayerAccount.CurrentAccount.CurAccountData.CheatReward );
  9033. // var index = ( this.getProxy( AgencyLottery ) as AgencyLottery ).GetReward();
  9034. // var selectcfg:LotteryCFG = LotteryCFG.vec[ index ];
  9035. // zpproxy.getreward( selectcfg );
  9036. // TimerService.Instance.removeUpdateTarget( this );
  9037. GlobalTip_1.GlobalTip.Instance.showWordTips("获得" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward + "金币");
  9038. GiftView.onclosefun();
  9039. };
  9040. //看视频得奖励
  9041. GiftView.prototype.VideoGetReward = function () {
  9042. ttad_1.ttad.ShowVideo((function (isLoad) {
  9043. if (isLoad) {
  9044. RoleData_1.RoleData.Instance.Money += PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward;
  9045. GlobalTip_1.GlobalTip.Instance.showWordTips("获得" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward + "金币");
  9046. GiftView.onclosefun();
  9047. }
  9048. else {
  9049. GiftView.onclosefun();
  9050. }
  9051. }));
  9052. };
  9053. GiftView.prototype.hidebanner = function () {
  9054. GuangGao_1.GuangGao.hidebanner();
  9055. };
  9056. GiftView.onclosefun = function () {
  9057. ViewManager_1.ViewManager.Instance.close(GiftView);
  9058. };
  9059. GiftView.prototype.destory = function () {
  9060. GuangGao_1.GuangGao.hidebanner();
  9061. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  9062. _super.prototype.destory.call(this);
  9063. };
  9064. GiftView.key = "GiftView";
  9065. return GiftView;
  9066. }(PanelBaseControl_1.PanelBaseControl));
  9067. exports.default = GiftView;
  9068. },{"../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){
  9069. "use strict";
  9070. Object.defineProperty(exports, "__esModule", { value: true });
  9071. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9072. var DispatcherManager_1 = require("../utils/DispatcherManager");
  9073. var GameState_1 = require("../utils/GameState");
  9074. /*
  9075. * name;
  9076. */
  9077. var WordTipsPanel = /** @class */ (function (_super) {
  9078. __extends(WordTipsPanel, _super);
  9079. function WordTipsPanel() {
  9080. var _this = _super.call(this, "loading", "wordTips") || this;
  9081. _this.nowword = "";
  9082. return _this;
  9083. }
  9084. /****************************************** */
  9085. WordTipsPanel.prototype.showText = function () {
  9086. var text = new Laya.Text();
  9087. text.text = "Orientation-Portrait";
  9088. text.color = "gray";
  9089. text.font = "Impact";
  9090. text.fontSize = 50;
  9091. text.x = Laya.stage.width - text.width >> 1;
  9092. text.y = Laya.stage.height - text.height >> 1;
  9093. Laya.stage.addChild(text);
  9094. };
  9095. /****************************************** */
  9096. WordTipsPanel.prototype.showWord = function (word) {
  9097. this.nowword = word;
  9098. this.text_word.text = word;
  9099. this.t1.play(Laya.Handler.create(this, this.playEndCallback), 1);
  9100. };
  9101. WordTipsPanel.prototype.onInit = function () {
  9102. _super.prototype.onInit.call(this);
  9103. this.t1 = this.getpanelTransition("t1");
  9104. };
  9105. WordTipsPanel.prototype.createCantralRect = function () {
  9106. this.rect = new Laya.Sprite();
  9107. this.rect.graphics.drawRect(-100, -100, 200, 200, "gray");
  9108. Laya.stage.addChild(this.rect);
  9109. this.updateRectPos();
  9110. };
  9111. WordTipsPanel.prototype.updateRectPos = function () {
  9112. this.rect.x = Laya.stage.width / 2;
  9113. this.rect.y = Laya.stage.height / 2;
  9114. };
  9115. /*************************************************** */
  9116. WordTipsPanel.prototype.playEndCallback = function () {
  9117. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.removeselect, this);
  9118. };
  9119. WordTipsPanel.key = "WordTipsPanel";
  9120. return WordTipsPanel;
  9121. }(PanelBaseControl_1.PanelBaseControl));
  9122. exports.WordTipsPanel = WordTipsPanel;
  9123. },{"../Control/PanelBaseControl":23,"../utils/DispatcherManager":83,"../utils/GameState":84}],63:[function(require,module,exports){
  9124. "use strict";
  9125. Object.defineProperty(exports, "__esModule", { value: true });
  9126. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9127. var LoadingPanel = /** @class */ (function (_super) {
  9128. __extends(LoadingPanel, _super);
  9129. function LoadingPanel() {
  9130. return _super.call(this, "loading", "loading") || this;
  9131. }
  9132. LoadingPanel.prototype.onInit = function () {
  9133. _super.prototype.onInit.call(this);
  9134. };
  9135. LoadingPanel.prototype.showWord = function (value) {
  9136. this.pro.value = value;
  9137. };
  9138. LoadingPanel.prototype.onBoyClick = function (e) {
  9139. //点击后小人会放大缩小
  9140. var boy = e.target;
  9141. if (boy.scaleX === 1) {
  9142. boy.scale(1.2, 1.2);
  9143. }
  9144. else {
  9145. boy.scale(1, 1);
  9146. }
  9147. };
  9148. LoadingPanel.prototype.onTxtClick = function (e) {
  9149. //点击后切换适配模式
  9150. e.stopPropagation();
  9151. };
  9152. LoadingPanel.prototype.destory = function () {
  9153. this.clearEvent();
  9154. _super.prototype.destory.call(this);
  9155. };
  9156. LoadingPanel.key = "LoadingPanel";
  9157. return LoadingPanel;
  9158. }(PanelBaseControl_1.PanelBaseControl));
  9159. exports.LoadingPanel = LoadingPanel;
  9160. },{"../Control/PanelBaseControl":23}],64:[function(require,module,exports){
  9161. "use strict";
  9162. Object.defineProperty(exports, "__esModule", { value: true });
  9163. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9164. var ViewAction_1 = require("../utils/ViewAction");
  9165. var ViewManager_1 = require("../View/ViewManager");
  9166. var LotteryCFG_1 = require("../CFG/LotteryCFG");
  9167. var AssetPath_1 = require("../Config/AssetPath");
  9168. var RoleCFG_1 = require("../CFG/RoleCFG");
  9169. var AgencyLottery_1 = require("../Agency/AgencyLottery");
  9170. var GuangGao_1 = require("../WXSDK/GuangGao");
  9171. var ttad_1 = require("../WXSDK/ttad");
  9172. var LotteryPanel = /** @class */ (function (_super) {
  9173. __extends(LotteryPanel, _super);
  9174. function LotteryPanel() {
  9175. return _super.call(this, "main", "LotteryView", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  9176. }
  9177. LotteryPanel.prototype.showLogger = function () {
  9178. this.logger = new Laya.Text();
  9179. this.logger.fontSize = 30;
  9180. this.logger.color = "#FFFFFF";
  9181. this.logger.align = 'center';
  9182. this.logger.valign = 'middle';
  9183. this.logger.size(Laya.stage.width, Laya.stage.height);
  9184. this.logger.text = "等待响应...\n";
  9185. Laya.stage.addChild(this.logger);
  9186. };
  9187. /************************************* */
  9188. LotteryPanel.prototype.onHttpRequestError = function (e) {
  9189. console.log(e);
  9190. };
  9191. LotteryPanel.prototype.initEvent = function () {
  9192. this.AddEventByType(this.backbtn, Laya.Event.CLICK, this, this.onclosefun);
  9193. this.AddEventByType(this.lotterybtn, Laya.Event.CLICK, this, this.choujiangclick);
  9194. };
  9195. LotteryPanel.prototype.playComplte = function () {
  9196. if (this.tw) {
  9197. this.tw.clear();
  9198. this.tw = null;
  9199. }
  9200. this.backbtn.enabled = true;
  9201. this.lotterybtn.enabled = true;
  9202. this.agencylottery.getreward(this._selectcfg);
  9203. };
  9204. LotteryPanel.prototype.onclosefun = function () {
  9205. if (this.tw) {
  9206. this.tw.clear();
  9207. this.tw = null;
  9208. }
  9209. GuangGao_1.GuangGao.Clear();
  9210. ViewManager_1.ViewManager.Instance.close(LotteryPanel);
  9211. };
  9212. LotteryPanel.prototype.initView = function () {
  9213. this.agencylottery = this.getProxy(AgencyLottery_1.AgencyLottery);
  9214. var vec = LotteryCFG_1.default.vec;
  9215. for (var i = 0; i < vec.length; i++) {
  9216. var cfg = vec[i];
  9217. if (cfg.type == 1) {
  9218. this["icon_" + i].url = fairygui.UIPackage.getItemURL("main", "img_gold");
  9219. this["txt_" + i].text = "X" + cfg.value;
  9220. }
  9221. else {
  9222. var rolecfg = RoleCFG_1.default.dict[cfg.value];
  9223. this["icon_" + i].url = AssetPath_1.AssetPath.getroleicon(rolecfg.icon);
  9224. this["txt_" + i].text = rolecfg.rolename;
  9225. }
  9226. }
  9227. GuangGao_1.GuangGao.CheatBanner(this.lotterybtn);
  9228. };
  9229. /**************************************** */
  9230. LotteryPanel.prototype.onSocketClose = function () {
  9231. console.log("Socket closed");
  9232. };
  9233. LotteryPanel.prototype.onMessageReveived = function (message) {
  9234. console.log("Message from server:");
  9235. if (typeof message == "string") {
  9236. console.log(message);
  9237. }
  9238. else if (message instanceof ArrayBuffer) {
  9239. }
  9240. };
  9241. /**************************************** */
  9242. LotteryPanel.prototype.choujiangclick = function () {
  9243. this.videocallback();
  9244. // pingtaiutils.Instance.playVideo( "",this,this.videocallback );
  9245. };
  9246. LotteryPanel.prototype.videocallback = function () {
  9247. var _this = this;
  9248. ttad_1.ttad.ShowVideo((function (isLoad) {
  9249. if (isLoad) {
  9250. _this.startPlay();
  9251. }
  9252. }));
  9253. };
  9254. LotteryPanel.prototype.startPlay = function () {
  9255. var index = this.agencylottery.GetReward();
  9256. this._selectcfg = LotteryCFG_1.default.vec[index];
  9257. this.backbtn.enabled = false;
  9258. this.lotterybtn.enabled = false;
  9259. this._nowgetIndex = index;
  9260. var angle = 360 * 6 + (this._nowgetIndex) * 45 - 15;
  9261. if (this.item_panel.rotation == 0) {
  9262. this._tweeObject = { value: 0 };
  9263. }
  9264. else {
  9265. this._tweeObject = { value: this._preIndex * 45 - 15 };
  9266. }
  9267. this._preIndex = this._nowgetIndex;
  9268. this.tw = laya.utils.Tween.to(this._tweeObject, { value: angle }, 3000, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.playComplte));
  9269. this.tw.update = Laya.Handler.create(this, function () {
  9270. var value = this._tweeObject.value % 360;
  9271. this.item_panel.rotation = value;
  9272. }, null, false);
  9273. };
  9274. LotteryPanel.key = "LotteryPanel";
  9275. return LotteryPanel;
  9276. }(PanelBaseControl_1.PanelBaseControl));
  9277. exports.LotteryPanel = LotteryPanel;
  9278. },{"../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){
  9279. "use strict";
  9280. Object.defineProperty(exports, "__esModule", { value: true });
  9281. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9282. var GameStateControl_1 = require("../Control/GameStateControl");
  9283. var DispatcherManager_1 = require("../utils/DispatcherManager");
  9284. var GameState_1 = require("../utils/GameState");
  9285. var PropManager_1 = require("../PrefabControl/PropManager");
  9286. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  9287. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  9288. var AgencySkin_1 = require("../Agency/AgencySkin");
  9289. var AgencyInGame_1 = require("../Agency/AgencyInGame");
  9290. var ViewManager_1 = require("../View/ViewManager");
  9291. var AgencyLottery_1 = require("../Agency/AgencyLottery");
  9292. var TuijianView_1 = require("../Push/TuijianView");
  9293. var ttad_1 = require("../WXSDK/ttad");
  9294. var Sdk_1 = require("../WXSDK/Sdk");
  9295. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  9296. var AssetPath_1 = require("../Config/AssetPath");
  9297. var LocalDataControl_1 = require("../Control/LocalDataControl");
  9298. var UserDataInfo_1 = require("../Data/UserDataInfo");
  9299. var SceneControl_1 = require("../Control/SceneControl");
  9300. var MainPanel = /** @class */ (function (_super) {
  9301. __extends(MainPanel, _super);
  9302. function MainPanel() {
  9303. var _this = _super.call(this, "main", "mainview") || this;
  9304. /****************************************** */
  9305. // 一只凤凰的分辨率是550 * 400
  9306. _this.phoenixWidth = 550;
  9307. _this.phoenixHeight = 400;
  9308. _this.bgColorTweener = new Laya.Tween();
  9309. _this.gradientInterval = 2000;
  9310. _this.bgColorChannels = { r: 99, g: 0, b: 0xFF };
  9311. //#endregion
  9312. //#region 初始化签到
  9313. _this.isShowSign = false;
  9314. _this.PaoKuSign = "PaoKuSignInfo";
  9315. _this.SignInfo = null;
  9316. MainPanel.instance = _this;
  9317. return _this;
  9318. }
  9319. MainPanel.prototype.updateUserDataHandler = function () {
  9320. this.txt_gold.text = this.agencyusermessage.RoleData.Money.toString();
  9321. };
  9322. MainPanel.prototype.returnmainHandler = function () {
  9323. var RoleData = this.agencyusermessage.RoleData;
  9324. // if( RoleData.nowlevel <= 2 )
  9325. // {
  9326. // this.c_state.selectedIndex = 0;
  9327. // }
  9328. // else
  9329. // {
  9330. this.c_state.selectedIndex = 1;
  9331. // }
  9332. };
  9333. MainPanel.prototype.onInit = function () {
  9334. _super.prototype.onInit.call(this);
  9335. };
  9336. MainPanel.prototype.createPhoenixes = function () {
  9337. var scaleFactor = Math.min(Laya.stage.width / (this.phoenixWidth * 2), Laya.stage.height / this.phoenixHeight);
  9338. // 加了混合模式的凤凰
  9339. var blendedPhoenix;
  9340. blendedPhoenix.blendMode = "lighter";
  9341. blendedPhoenix.scale(scaleFactor, scaleFactor);
  9342. blendedPhoenix.y = (Laya.stage.height - this.phoenixHeight * scaleFactor) / 2;
  9343. // 正常模式的凤凰
  9344. var normalPhoenix;
  9345. normalPhoenix.scale(scaleFactor, scaleFactor);
  9346. normalPhoenix.x = this.phoenixWidth * scaleFactor;
  9347. normalPhoenix.y = (Laya.stage.height - this.phoenixHeight * scaleFactor) / 2;
  9348. };
  9349. /****************************************** */
  9350. MainPanel.prototype.initView = function () {
  9351. this.ExitBtn.visible = false;
  9352. this.MoreFunBtn.visible = false;
  9353. this.MoreGameBtn.visible = false;
  9354. ttad_1.ttad.Showbanner();
  9355. // Laya.timer.once(500,this,()=>{
  9356. // console.log("main界面白名单----",FYHD_Sdk.iswhite);
  9357. // if(FYHD_Sdk.iswhite){
  9358. // this.ExitBtn.visible = true;
  9359. // }
  9360. // else{
  9361. // this.ExitBtn.visible = false;
  9362. // }
  9363. // })
  9364. this.MoreFunBtnScale = this.getTransitionByName("morefunbtnscale");
  9365. Laya.timer.loop(1000, this, this.playanimator2);
  9366. this.SkinAni = this.SkinBtn.getTransition("skinani");
  9367. this.LotteryAni = this.LotteryBtn.getTransition("lotteryani");
  9368. this.MoreAni = this.MoreGameBtn.getTransition("moreani");
  9369. Laya.timer.loop(3000, this, this.playanimator);
  9370. this.agencyusermessage = this.getProxy(AgencyUserMessage_1.AgencyUserMessage);
  9371. PropManager_1.PropManager.pro_jindu = this.pro_dis;
  9372. PropManager_1.PropManager.txt_mingci = this.txt_mingci;
  9373. this.c_state = this.getControllerByBame("c_state");
  9374. GameStateControl_1.GameStateControl.Instance.setClickPanel(this.load_clickpanel);
  9375. this.returnmainHandler();
  9376. this.updateUserDataHandler();
  9377. this.InitSignItem();
  9378. };
  9379. MainPanel.prototype.playanimator = function () {
  9380. this.SkinAni.play(null, 1);
  9381. this.LotteryAni.play(null, 1);
  9382. this.MoreAni.play(null, 1);
  9383. };
  9384. MainPanel.prototype.playanimator2 = function () {
  9385. this.MoreFunBtnScale.play(null, 1);
  9386. };
  9387. MainPanel.prototype.choujiangclick = function () {
  9388. ttad_1.ttad.Clear();
  9389. this.getProxy(AgencyLottery_1.AgencyLottery).openView();
  9390. };
  9391. MainPanel.prototype.tuijianclick = function () {
  9392. ViewManager_1.ViewManager.Instance.add(TuijianView_1.default);
  9393. };
  9394. MainPanel.prototype.skinclick = function () {
  9395. ttad_1.ttad.Clear();
  9396. this.getProxy(AgencySkin_1.AgencySkin).openview();
  9397. };
  9398. MainPanel.prototype.moreclick = function () {
  9399. // ViewManager.Instance.add( ChoutiPanView );
  9400. ttad_1.ttad.CreateMoreGameBtn();
  9401. };
  9402. MainPanel.prototype.btnclick = function () {
  9403. GameState_1.GameState.GameNum++;
  9404. ttad_1.ttad.Clear();
  9405. this.c_state.selectedIndex = 2;
  9406. this.txt_lv.text = this.agencyusermessage.RoleData.getNowServerLevel().toString();
  9407. this.getProxy(AgencyInGame_1.AgencyInGame).startGame();
  9408. };
  9409. MainPanel.prototype.setclick = function () {
  9410. };
  9411. MainPanel.prototype.mapLoaded = function () {
  9412. this.layer = this.tiledMap.getLayerByIndex(0);
  9413. var radiusX = 32;
  9414. var radiusY = Math.tan(180 / Math.PI * 30) * radiusX;
  9415. var color = "#FF7F50";
  9416. this.sprite = new Laya.Sprite();
  9417. this.sprite.graphics.drawLine(0, 0, -radiusX, radiusY, color);
  9418. this.sprite.graphics.drawLine(0, 0, radiusX, radiusY, color);
  9419. this.sprite.graphics.drawLine(-radiusX, radiusY, 0, radiusY * 2, color);
  9420. this.sprite.graphics.drawLine(radiusX, radiusY, 0, radiusY * 2, color);
  9421. Laya.stage.addChild(this.sprite);
  9422. };
  9423. /*************************************** */
  9424. MainPanel.prototype.initEvent = function () {
  9425. this.AddEventByType(this.load_start, Laya.Event.CLICK, this, this.btnclick);
  9426. this.AddEventByType(this.SkinBtn, Laya.Event.CLICK, this, this.skinclick);
  9427. // this.AddEventByType( this.MoreGameBtn,Laya.Event.CLICK,this,this.moreclick );
  9428. // this.AddEventByType( this.MoreFunBtn,Laya.Event.CLICK,this,this.moreclick );
  9429. // this.AddEventByType( this.ExitBtn,Laya.Event.CLICK,this,this.tuijianclick );
  9430. this.addDataEvent(GameState_1.GameState.returnMainView, this, this.returnmainHandler);
  9431. this.AddEventByType(this.LotteryBtn, Laya.Event.CLICK, this, this.choujiangclick);
  9432. this.addDataEvent(UserInfoEvent_1.UserInfoEvent.UserInfoEvent_updateUserData, this, this.updateUserDataHandler);
  9433. };
  9434. MainPanel.prototype.InitSignItem = function () {
  9435. this.LoadSignData();
  9436. var _bo = true;
  9437. if (this.getSystemTime() == this.SignInfo["time"]) {
  9438. _bo = false;
  9439. }
  9440. else {
  9441. this.SignInfo["FisstLoad"] = 0;
  9442. }
  9443. if (this.SignInfo["FisstLoad"] == 1) {
  9444. _bo = false;
  9445. }
  9446. // if(PlayerAccount.CurrentAccount.CurAccountData.SignDebug)
  9447. // {
  9448. // _bo=true;
  9449. // }
  9450. SceneControl_1.SceneControl.IsShowSign = _bo;
  9451. this.SignPanel.visible = _bo;
  9452. if (!_bo) {
  9453. return;
  9454. }
  9455. this.SignFun();
  9456. };
  9457. MainPanel.prototype.btn_SignFun = function () {
  9458. if (this.getSystemTime() == this.SignInfo["time"]) {
  9459. this.isShowSign = true;
  9460. }
  9461. this.SignFun();
  9462. if (this.isShowSign) {
  9463. Sdk_1.WxApi.ShowTxt("已签到"); //y.WxApi.ShowTxt("已签到")
  9464. this.SignSelectedMoney = 0 + "";
  9465. }
  9466. };
  9467. MainPanel.prototype.SignFun = function () {
  9468. this.SignItem = new Array();
  9469. this.SignItem.push(this.SignItem1);
  9470. this.SignItem.push(this.SignItem2);
  9471. this.SignItem.push(this.SignItem3);
  9472. this.SignItem.push(this.SignItem4);
  9473. this.SignItem.push(this.SignItem5);
  9474. this.SignItem.push(this.SignItem6);
  9475. this.SignItem.push(this.SignItem7);
  9476. this.SignTickImage = this.SignAd.asCom.getChildAt(2);
  9477. var signTickButton = this.SignAd.asCom.getChildAt(1);
  9478. this.signAdButton = this.SignAd.asCom.getChildAt(3);
  9479. this.signNoramButton = this.SignAd.asCom.getChildAt(4);
  9480. this.SignDanbeiBtn = this.SignAd.asCom.getChildAt(5);
  9481. this.SignTickImage.visible = (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.ShowSign);
  9482. this.signNoramButton.visible = this.SignTickImage.visible;
  9483. this.SignDanbeiBtn.visible = !this.signNoramButton.visible;
  9484. this.AddEventByType(signTickButton, Laya.Event.CLICK, this, this.SignTickButtonFun);
  9485. this.AddEventByType(this.signAdButton, Laya.Event.CLICK, this, this.SignAdButtonFun);
  9486. this.AddEventByType(this.signNoramButton, Laya.Event.CLICK, this, this.SignAdButtonFun);
  9487. this.AddEventByType(this.SignDanbeiBtn, Laya.Event.CLICK, this, this.SignNormalButtonFun);
  9488. var num = this.SignInfo["day"];
  9489. var numIndex = 100;
  9490. if (num < 7) {
  9491. numIndex = 100;
  9492. }
  9493. else {
  9494. numIndex = 107;
  9495. num = num % 7;
  9496. }
  9497. this.SignPiFu = null;
  9498. this.SignSelectedMoney = 0 + "";
  9499. for (var index = 0; index < this.SignItem.length; index++) {
  9500. var data = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetRewardConfig((numIndex + 1 + index));
  9501. var pifu = null;
  9502. if (data["reward_item"] != 1000) {
  9503. if (Number(data["reward_item"]) > 6000) {
  9504. var pifuIndedx = Number(data["reward_item"]) % 6000;
  9505. pifu = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetSkinAttr(pifuIndedx);
  9506. console.log(pifu);
  9507. }
  9508. }
  9509. var isOk = true;
  9510. var isCnaSign = true;
  9511. if (index < num) {
  9512. isOk = true;
  9513. isCnaSign = false;
  9514. }
  9515. else if (index == num) {
  9516. isOk = false;
  9517. isCnaSign = true;
  9518. }
  9519. else {
  9520. isOk = false;
  9521. isCnaSign = false;
  9522. }
  9523. var text;
  9524. if (index < 6) {
  9525. text = "第 " + (index + 1) + " 天";
  9526. }
  9527. else {
  9528. text = "豪华皮肤";
  9529. }
  9530. this.SetSignItemInfo(this.SignItem[index], text, data, isOk, isCnaSign, pifu);
  9531. }
  9532. ttad_1.ttad.Showbanner(); //
  9533. };
  9534. /**签到*/
  9535. MainPanel.prototype.SetSignItemInfo = function (_signItem, text, data, _isOk, _isCanSign, pifu) {
  9536. console.log(data);
  9537. if (pifu == null) {
  9538. console.log(111111111111);
  9539. var mytext = _signItem.asCom.getChildAt(2);
  9540. mytext.text = text;
  9541. var mymoney = _signItem.asCom.getChildAt(3);
  9542. mymoney.text = data["reward_num"];
  9543. _signItem.asCom.getChildAt(5).visible = false;
  9544. if (_isOk) {
  9545. _signItem.asCom.getChildAt(1).visible = false;
  9546. _signItem.asCom.getChildAt(6).visible = true;
  9547. _signItem.asCom.getChildAt(7).visible = true;
  9548. }
  9549. else if (_isCanSign) {
  9550. _signItem.asCom.getChildAt(1).visible = true;
  9551. _signItem.asCom.getChildAt(7).visible = false;
  9552. _signItem.asCom.getChildAt(6).visible = false;
  9553. this.SignSelectedItem = _signItem;
  9554. this.SignSelectedText = text;
  9555. this.SignSelectedMoney = data["reward_num"];
  9556. // var child1=_signItem.asCom.getChildAt(7) as fairygui.GButton;
  9557. // child1.visible=true;
  9558. // this.addListener(child1,Laya.Event.CLICK,this.SignButtonFun,null);
  9559. // this.addListener( child1,Laya.Event.CLICK,this,this.SignButtonFun );
  9560. }
  9561. else {
  9562. _signItem.asCom.getChildAt(1).visible = false;
  9563. _signItem.asCom.getChildAt(6).visible = false;
  9564. _signItem.asCom.getChildAt(7).visible = false;
  9565. }
  9566. }
  9567. else {
  9568. console.log(2222222222);
  9569. var mytext = _signItem.asCom.getChildAt(2);
  9570. var mymoney = _signItem.asCom.getChildAt(3);
  9571. mymoney.visible = false;
  9572. var myimage = _signItem.asCom.getChildAt(4);
  9573. myimage.visible = false;
  9574. var GLoader = _signItem.asCom.getChildAt(5);
  9575. if (_isOk) {
  9576. GLoader.icon = AssetPath_1.AssetPath.getroleicon(pifu.icon);
  9577. _signItem.asCom.getChildAt(1).visible = false;
  9578. _signItem.asCom.getChildAt(6).visible = true;
  9579. _signItem.asCom.getChildAt(7).visible = true;
  9580. }
  9581. else if (_isCanSign) {
  9582. _signItem.asCom.getChildAt(1).visible = true;
  9583. _signItem.asCom.getChildAt(7).visible = false;
  9584. _signItem.asCom.getChildAt(6).visible = false;
  9585. this.SignSelectedItem = _signItem;
  9586. this.SignSelectedText = text;
  9587. this.SignSelectedMoney = 0 + "";
  9588. this.SignPiFu = pifu;
  9589. GLoader.visible = true;
  9590. GLoader.icon = AssetPath_1.AssetPath.getroleicon(this.SignPiFu.icon);
  9591. // this.addListener(child1,Laya.Event.CLICK,this.SignButtonFun,null);
  9592. // this.addListener( child1,Laya.Event.CLICK,this,this.SignButtonFun );
  9593. }
  9594. else {
  9595. GLoader.icon = AssetPath_1.AssetPath.getroleicon(pifu.icon);
  9596. _signItem.asCom.getChildAt(1).visible = false;
  9597. _signItem.asCom.getChildAt(6).visible = false;
  9598. _signItem.asCom.getChildAt(7).visible = false;
  9599. }
  9600. }
  9601. };
  9602. MainPanel.prototype.SignButtonFun = function () {
  9603. var _this = this;
  9604. console.log("收取了");
  9605. if (this.getSystemTime == this.SignInfo["time"]) {
  9606. return;
  9607. }
  9608. this.SignAd.visible = true;
  9609. Laya.timer.once(3000, this, function () { _this.signNoramButton.visible = true; });
  9610. this.SetSignItemInfo(this.SignSelectedItem, this.SignSelectedText, this.SignSelectedMoney, true, false, this.SignPiFu);
  9611. this.SaveSignData();
  9612. };
  9613. /*勾选方法*/
  9614. MainPanel.prototype.SignTickButtonFun = function () {
  9615. this.SignTickImage.visible = !this.SignTickImage.visible;
  9616. this.SignDanbeiBtn.visible = !this.SignTickImage.visible;
  9617. this.signNoramButton.visible = this.SignTickImage.visible;
  9618. };
  9619. /*点击视频双倍领取*/
  9620. MainPanel.prototype.SignAdButtonFun = function () {
  9621. this.WinAdButtonFun();
  9622. };
  9623. /*普通领取*/
  9624. MainPanel.prototype.SignNormalButtonFun = function () {
  9625. this.SaveSignData();
  9626. if (this.SignTickImage.visible == true) {
  9627. this.WinAdButtonFun();
  9628. }
  9629. else {
  9630. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(Number(this.SignSelectedMoney) * 1);
  9631. if (this.SignPiFu != null) {
  9632. this.SignAddPifu();
  9633. }
  9634. this.updateUserDataHandler();
  9635. }
  9636. SceneControl_1.SceneControl.IsShowSign = false;
  9637. this.SignPanel.visible = false;
  9638. ttad_1.ttad.Clear(); //;y.WxApi.ShowTxt("签到成功")
  9639. };
  9640. /**胜利界面广告按钮*/
  9641. MainPanel.prototype.WinAdButtonFun = function () {
  9642. var _this = this;
  9643. Sdk_1.WxApi.recordAldEvent("签到...");
  9644. if (!Laya.Browser.onMobile) {
  9645. return;
  9646. }
  9647. ttad_1.ttad.ShowVideo(function (flag) {
  9648. console.log("播放视频返回成功" + flag);
  9649. if (flag) {
  9650. console.log("播放视频返回");
  9651. _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(Number(_this.SignSelectedMoney) * 2);
  9652. if (_this.SignPiFu != null) {
  9653. _this.SignAddPifu();
  9654. }
  9655. _this.SaveSignData(); //this.SaveSignData()
  9656. _this.SignPanel.visible = false;
  9657. SceneControl_1.SceneControl.IsShowSign = false;
  9658. _this.updateUserDataHandler();
  9659. }
  9660. });
  9661. };
  9662. MainPanel.prototype.LoadSignData = function () {
  9663. // this.SignInfo={"day":0,"time":0,"FisstLoad":0};
  9664. // Laya.LocalStorage.setJSON("PaoKuSign",this.SignInfo);
  9665. this.SignInfo = Laya.LocalStorage.getJSON(this.PaoKuSign);
  9666. if (this.SignInfo == 0 || this.SignInfo == null) {
  9667. var time = this.getSystemTime();
  9668. this.SignInfo = { "day": 0, "time": 0, "FisstLoad": 0 };
  9669. Laya.LocalStorage.setJSON(this.PaoKuSign, this.SignInfo);
  9670. }
  9671. console.log("asdasd");
  9672. };
  9673. MainPanel.prototype.SaveSignData = function () {
  9674. this.SignInfo["FisstLoad"] = 1;
  9675. this.SignInfo["day"]++;
  9676. this.SignInfo["time"] = this.getSystemTime();
  9677. Laya.LocalStorage.setJSON(this.PaoKuSign, this.SignInfo);
  9678. };
  9679. MainPanel.prototype.getSystemTime = function () {
  9680. var curDate = new Date();
  9681. var month = curDate.getMonth() + 1;
  9682. console.log("月:" + month.toString());
  9683. var date = curDate.getDate();
  9684. console.log("日:" + date.toString());
  9685. return Number((month + "" + date));
  9686. };
  9687. MainPanel.prototype.SignAddPifu = function () {
  9688. var cachedata = LocalDataControl_1.LocalDataControl.Instance.GetLocalCaCheData(UserDataInfo_1.UserDataInfo.skin);
  9689. // var cachedata = CacheManager.getInstance().getCacheObj( UserCacheType.skin );
  9690. var id = this.SignPiFu["id"];
  9691. var _skinProxy = this.getProxy(AgencySkin_1.AgencySkin);
  9692. var piFuVO = null;
  9693. for (var index = 0; index < _skinProxy.pifuArr.length; index++) {
  9694. piFuVO = _skinProxy.pifuArr[index];
  9695. if (piFuVO.roleCFG.id == id) {
  9696. break;
  9697. }
  9698. }
  9699. piFuVO.state = 1;
  9700. AgencySkin_1.AgencySkin.instance.AddLocalSkinData(piFuVO.roleCFG.id, piFuVO.state, piFuVO.hasnum);
  9701. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.updateSKinView);
  9702. console.log("获取皮肤");
  9703. console.log(cachedata);
  9704. };
  9705. MainPanel.key = "MainPanel";
  9706. return MainPanel;
  9707. }(PanelBaseControl_1.PanelBaseControl));
  9708. exports.MainPanel = MainPanel;
  9709. },{"../Agency/AgencyInGame":2,"../Agency/AgencyLottery":4,"../Agency/AgencySkin":6,"../Agency/AgencyUserMessage":8,"../Config/AssetPath":15,"../Control/GameStateControl":20,"../Control/LocalDataControl":22,"../Control/PanelBaseControl":23,"../Control/SceneControl":27,"../Data/UserDataInfo":33,"../Data/UserInfoEvent":34,"../PrefabControl/PropManager":47,"../Push/TuijianView":55,"../View/ViewManager":68,"../WXSDK/PlayerAccount":73,"../WXSDK/Sdk":75,"../WXSDK/ttad":81,"../utils/DispatcherManager":83,"../utils/GameState":84}],66:[function(require,module,exports){
  9710. "use strict";
  9711. Object.defineProperty(exports, "__esModule", { value: true });
  9712. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9713. var ViewAction_1 = require("../utils/ViewAction");
  9714. var AgencySkin_1 = require("../Agency/AgencySkin");
  9715. var GameState_1 = require("../utils/GameState");
  9716. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  9717. var ResourceControl_1 = require("../Control/ResourceControl");
  9718. var AssetPath_1 = require("../Config/AssetPath");
  9719. var CharacterState_1 = require("../PrefabControl/CharacterState");
  9720. var ViewManager_1 = require("../View/ViewManager");
  9721. var CharacterPool_1 = require("../PrefabControl/CharacterPool");
  9722. var Player_1 = require("../Game/Player");
  9723. var SkinPanel = /** @class */ (function (_super) {
  9724. __extends(SkinPanel, _super);
  9725. function SkinPanel() {
  9726. var _this = _super.call(this, "main", "skinview", false, ViewAction_1.ViewAction.ActionType_none, 0) || this;
  9727. _this._isdestorys = false;
  9728. _this._out = new Laya.Quaternion;
  9729. return _this;
  9730. }
  9731. SkinPanel.prototype.initView = function () {
  9732. this._isdestorys = false;
  9733. this.c_title = this.getControllerByBame("c_title");
  9734. this.agencyskin = this.getProxy(AgencySkin_1.AgencySkin);
  9735. this.list_0.setVirtual();
  9736. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemlistrender, null, false);
  9737. this.c_title.selectedIndex = 0;
  9738. this.onchange();
  9739. //添加3D场景
  9740. this._ui3DScene = this.displayObject.addChildAt(new Laya.Scene3D(), 0);
  9741. //添加照相机
  9742. this._uicarma3D = (this._ui3DScene.addChild(new Laya.Camera(0, 0.1, 80)));
  9743. // this._uicarma3D.clearColor = null;
  9744. this._uicarma3D.viewport = new Laya.Viewport(this.x, this.y, this.width, this.height);
  9745. this._uicarma3D.transform.translate(new Laya.Vector3(0, 1.2, 5), false);
  9746. // //添加方向光
  9747. // this._uilight = PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  9748. // this._uilight.color = new Laya.Vector3(0.6,0.6,0.6);
  9749. // this._uilight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  9750. this.updateroleHandler();
  9751. };
  9752. SkinPanel.prototype.initEvent = function () {
  9753. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
  9754. this.AddEventByType(this.c_title, fairygui.Events.STATE_CHANGED, this, this.onchange);
  9755. this.addDataEvent(GameState_1.GameState.updateSKinView, this, this.onchange);
  9756. this.addDataEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid, this, this.updateroleHandler);
  9757. };
  9758. SkinPanel.prototype.ClearCharacter = function () {
  9759. if (this._rolemo) {
  9760. var script = this._rolemo.getComponent(Player_1.Player);
  9761. CharacterPool_1.CharacterPool.ClearCharacter(this._rolemo, script.resouseName, script);
  9762. this._rolemo = null;
  9763. }
  9764. };
  9765. SkinPanel.prototype.onclosefun = function () {
  9766. ViewManager_1.ViewManager.Instance.close(SkinPanel);
  9767. };
  9768. SkinPanel.prototype.destory = function () {
  9769. this._isdestorys = true;
  9770. this.ClearCharacter();
  9771. if (this._uicarma3D) {
  9772. this._uicarma3D.destroy();
  9773. this._uicarma3D = null;
  9774. }
  9775. if (this._ui3DScene) {
  9776. this._ui3DScene.destroy();
  9777. this._ui3DScene = null;
  9778. }
  9779. _super.prototype.destory.call(this);
  9780. };
  9781. SkinPanel.prototype.onchange = function () {
  9782. if (this.c_title.selectedIndex == 0) {
  9783. this.list_0.numItems = this.agencyskin.pifuArr.length;
  9784. }
  9785. else {
  9786. this.list_0.numItems = 0;
  9787. }
  9788. };
  9789. SkinPanel.prototype.itemlistrender = function (index, item) {
  9790. if (this.c_title.selectedIndex == 0) {
  9791. if (index < this.agencyskin.pifuArr.length) {
  9792. item.showData(this.agencyskin.pifuArr[index]);
  9793. }
  9794. }
  9795. };
  9796. SkinPanel.prototype.updateroleHandler = function () {
  9797. var RoleData = this.agencyskin.RoleData;
  9798. this.ClearCharacter();
  9799. var pathArr = [];
  9800. pathArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(RoleData.roleCfg.name) });
  9801. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.loadcomplete, null, true, RoleData.roleCfg.name);
  9802. };
  9803. SkinPanel.prototype.loadcomplete = function (resousename) {
  9804. var RoleData = this.agencyskin.RoleData;
  9805. if (!this._isdestorys && this._ui3DScene && resousename == RoleData.roleCfg.name) {
  9806. this._rolemo = CharacterPool_1.CharacterPool.AddCharacter(resousename, Player_1.Player, this._ui3DScene);
  9807. this._rolemo.transform.position = new Laya.Vector3(0, 2, 0);
  9808. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), -135 * 180 / Math.PI, this._out);
  9809. this._rolemo.transform.rotation = this._out;
  9810. this._rolemo.getComponent(Player_1.Player).PlayAnimator(CharacterState_1.CharacterState.stand);
  9811. }
  9812. };
  9813. SkinPanel.key = "SkinPanel";
  9814. return SkinPanel;
  9815. }(PanelBaseControl_1.PanelBaseControl));
  9816. exports.SkinPanel = SkinPanel;
  9817. },{"../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){
  9818. "use strict";
  9819. Object.defineProperty(exports, "__esModule", { value: true });
  9820. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9821. var ViewAction_1 = require("../utils/ViewAction");
  9822. var GameUtils_1 = require("../utils/GameUtils");
  9823. var AssetPath_1 = require("../Config/AssetPath");
  9824. var AgencyTrial_1 = require("../Agency/AgencyTrial");
  9825. var GuangGao_1 = require("../WXSDK/GuangGao");
  9826. var ttad_1 = require("../WXSDK/ttad");
  9827. var TrialPanel = /** @class */ (function (_super) {
  9828. __extends(TrialPanel, _super);
  9829. function TrialPanel(arr) {
  9830. var _this = _super.call(this, "main", "shiyongView", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  9831. _this.skinarr = arr;
  9832. return _this;
  9833. }
  9834. TrialPanel.prototype.onInit = function () {
  9835. _super.prototype.onInit.call(this);
  9836. };
  9837. TrialPanel.prototype.initView = function () {
  9838. this.agencytrial = this.getProxy(AgencyTrial_1.AgencyTrial);
  9839. var index = GameUtils_1.GameUtils.randRangeint(0, this.skinarr.length - 1);
  9840. this._selectvo = this.skinarr[index];
  9841. this.load_icon.url = AssetPath_1.AssetPath.getroleicon(this._selectvo.roleCFG.icon);
  9842. // pingtaiutils.Instance.createBanner( "ShiYongView" );
  9843. GuangGao_1.GuangGao.CheatBanner(this.btn_close);
  9844. };
  9845. TrialPanel.prototype.initEvent = function () {
  9846. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
  9847. this.AddEventByType(this.btn_video, Laya.Event.CLICK, this, this.videofun);
  9848. };
  9849. TrialPanel.prototype.videofun = function () {
  9850. // pingtaiutils.Instance.playVideo( "",this,this.videocallback );
  9851. this.videocallback();
  9852. };
  9853. TrialPanel.prototype.videocallback = function () {
  9854. var _this = this;
  9855. ttad_1.ttad.ShowVideo((function (isLoad) {
  9856. if (isLoad) {
  9857. _this.agencytrial.ExitPanel(_this._selectvo);
  9858. }
  9859. }));
  9860. };
  9861. TrialPanel.prototype.onclosefun = function () {
  9862. this.agencytrial.ExitPanel(null);
  9863. };
  9864. TrialPanel.prototype.destory = function () {
  9865. // GuangGao.Clear();
  9866. ttad_1.ttad.Clear();
  9867. _super.prototype.destory.call(this);
  9868. };
  9869. TrialPanel.key = "TrialPanel";
  9870. return TrialPanel;
  9871. }(PanelBaseControl_1.PanelBaseControl));
  9872. exports.TrialPanel = TrialPanel;
  9873. },{"../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){
  9874. "use strict";
  9875. Object.defineProperty(exports, "__esModule", { value: true });
  9876. var LayOUT_1 = require("../utils/LayOUT");
  9877. var LayoutControl_1 = require("../Control/LayoutControl");
  9878. /**
  9879. *
  9880. * @author
  9881. *
  9882. */
  9883. var ViewManager = /** @class */ (function (_super) {
  9884. __extends(ViewManager, _super);
  9885. function ViewManager() {
  9886. var _this = _super.call(this) || this;
  9887. ViewManager.ins = _this;
  9888. return _this;
  9889. }
  9890. Object.defineProperty(ViewManager, "Instance", {
  9891. get: function () {
  9892. if (ViewManager.ins == null) {
  9893. return new ViewManager();
  9894. }
  9895. return ViewManager.ins;
  9896. },
  9897. enumerable: true,
  9898. configurable: true
  9899. });
  9900. ViewManager.prototype.init = function () {
  9901. this._views = {};
  9902. this.initEvent();
  9903. };
  9904. ViewManager.prototype.initEvent = function () {
  9905. };
  9906. /**
  9907. * view 视图对象类
  9908. * data 绑定数据 ( data 如果不为空,代表构造函数传参 )
  9909. * layer 层级
  9910. */
  9911. ViewManager.prototype.add = function (view, data, layer) {
  9912. if (data === void 0) { data = null; }
  9913. if (layer === void 0) { layer = LayOUT_1.LayOUT.UI; }
  9914. if (view.key == null) {
  9915. throw new Error("view have no key");
  9916. }
  9917. var type = view.key;
  9918. if (this._views[type]) {
  9919. var itemview = this._views[type];
  9920. return itemview;
  9921. }
  9922. var d;
  9923. if (data != null) {
  9924. d = new view(data);
  9925. }
  9926. else {
  9927. d = new view();
  9928. }
  9929. d.viewKey = view;
  9930. d.gameLayer = layer;
  9931. LayoutControl_1.LayoutControl.Instance.AddLayerByName(d, layer);
  9932. this._views[type] = d;
  9933. return d;
  9934. };
  9935. /**
  9936. * 关闭界面
  9937. * @param view 界面
  9938. * @param isbgclose 是否是点击背景关闭的状态
  9939. * @param isplayAnmo 是否播放关闭动画( 主要用于强制关闭 )
  9940. */
  9941. ViewManager.prototype.close = function (view, isbgclose, isplayAnmo) {
  9942. if (isbgclose === void 0) { isbgclose = false; }
  9943. if (isplayAnmo === void 0) { isplayAnmo = true; }
  9944. var type = view.key;
  9945. var item = this._views[type];
  9946. if (!item) {
  9947. return;
  9948. }
  9949. LayoutControl_1.LayoutControl.Instance.ClearLayerByName(item.gameLayer);
  9950. if (isplayAnmo) {
  9951. item.ExitView();
  9952. }
  9953. else {
  9954. item.destory();
  9955. }
  9956. delete this._views[type];
  9957. };
  9958. ViewManager.prototype.onresize = function (w, h) {
  9959. if (this._views != null) {
  9960. var itemview;
  9961. for (var item in this._views) {
  9962. itemview = this._views[item];
  9963. itemview.setSize(w, h);
  9964. }
  9965. }
  9966. };
  9967. ViewManager.prototype.getView = function (view) {
  9968. var type = view.key;
  9969. return this._views[type];
  9970. };
  9971. return ViewManager;
  9972. }(Laya.EventDispatcher));
  9973. exports.ViewManager = ViewManager;
  9974. },{"../Control/LayoutControl":21,"../utils/LayOUT":88}],69:[function(require,module,exports){
  9975. "use strict";
  9976. Object.defineProperty(exports, "__esModule", { value: true });
  9977. var RecommendView_1 = require("../Push/RecommendView");
  9978. var ViewManager_1 = require("../View/ViewManager");
  9979. var ChoutiPanView_1 = require("../Push/ChoutiPanView");
  9980. // import { Main } from "../Main";
  9981. // import ListItem from "../GameTools/ListItem";
  9982. // import { PanelManager, PanelType } from "../View/PanelManager";
  9983. // import GuangGao from "./GuangGao";
  9984. // import { WXSDK } from "./WXSDK";
  9985. var FYHD_Sdk = /** @class */ (function () {
  9986. function FYHD_Sdk() {
  9987. }
  9988. //初始化sdk
  9989. FYHD_Sdk.InitSdk = function () {
  9990. Laya.Browser.window.sdk.getFyhd().startSdk();
  9991. FYHD_Sdk.UserInfoAuth();
  9992. // let white = Laya.LocalStorage.getItem("is_white");
  9993. // if(white){
  9994. // FYHD_Sdk.iswhite = true;
  9995. // }
  9996. // else{
  9997. // FYHD_Sdk.getWhiteConfig();
  9998. // }
  9999. // let newuser = Laya.LocalStorage.getItem("is_newuser");
  10000. // if(!newuser){
  10001. // FYHD_Sdk.isnewuser = true;
  10002. // Laya.LocalStorage.setItem("is_newuser","1");
  10003. // }
  10004. // else{
  10005. // FYHD_Sdk.isnewuser = false;
  10006. // }
  10007. // FYHD_Sdk.PushData();
  10008. };
  10009. //用户授权
  10010. FYHD_Sdk.UserInfoAuth = function () {
  10011. if (!Laya.Browser.onWeiXin)
  10012. return;
  10013. Laya.Browser.window.sdk.getFyhd().getFyhdUserInfo(null, false, function (data) {
  10014. console.log("无授权回调:" + JSON.stringify(data));
  10015. if (data.result.user) {
  10016. FYHD_Sdk.openid = data.result.user.openid;
  10017. FYHD_Sdk.AuthInfo();
  10018. }
  10019. });
  10020. };
  10021. FYHD_Sdk.AuthInfo = function () {
  10022. var args = {
  10023. openid: FYHD_Sdk.openid,
  10024. };
  10025. Laya.Browser.window.sdk.getFyhd().loginData(args, function (data) {
  10026. console.log("授权上报回调:" + JSON.stringify(data));
  10027. FYHD_Sdk.ValueUser();
  10028. });
  10029. };
  10030. FYHD_Sdk.ValueUser = function () {
  10031. var args = {
  10032. openid: FYHD_Sdk.openid,
  10033. };
  10034. Laya.Browser.window.sdk.getFyhd().valueuser(args, function (data) {
  10035. console.log("有效用户上报:" + JSON.stringify(data));
  10036. });
  10037. };
  10038. FYHD_Sdk.getWhiteConfig = function () {
  10039. Laya.Browser.window.sdk.getFyhd().whiteConfig(function (e) {
  10040. FYHD_Sdk.iswhite = e.data.is_white;
  10041. if (FYHD_Sdk.iswhite) {
  10042. Laya.LocalStorage.setItem("is_white", "1");
  10043. }
  10044. console.log("白名单---", e);
  10045. });
  10046. };
  10047. FYHD_Sdk.SetHuTuiList = function (list, scrol, type) {
  10048. if (scrol === void 0) { scrol = 1; }
  10049. if (type === void 0) { type = ""; }
  10050. var arr = this.pushData;
  10051. if (!arr || arr.length == 0)
  10052. return;
  10053. list.selectEnable = false;
  10054. scrol == 1 ? list.vScrollBarSkin = "" : list.hScrollBarSkin = "";
  10055. list.renderHandler = Laya.Handler.create(this, this.updateItem, [type], false);
  10056. list.array = arr;
  10057. list.refresh();
  10058. };
  10059. FYHD_Sdk.updateItem = function (type, cell, index) {
  10060. // var aditem = cell.getComponent(ListItem) as ListItem;
  10061. // aditem.Refresh(type);
  10062. };
  10063. //点击事件上报
  10064. FYHD_Sdk.ClickAd = function (ad_type) {
  10065. console.log("上报类型---", ad_type);
  10066. if (!Laya.Browser.onWeiXin)
  10067. return;
  10068. var param = {
  10069. ad_type: ad_type,
  10070. //此处添加openid
  10071. openid: FYHD_Sdk.openid
  10072. };
  10073. console.log("点击参数:" + param);
  10074. Laya.Browser.window.sdk.getFyhd().advertisement(param, function (data) {
  10075. console.log("点击结果:" + JSON.stringify(data));
  10076. });
  10077. };
  10078. //互推信息
  10079. FYHD_Sdk.PushData = function () {
  10080. //console.log("pushdata--",Main.WX);
  10081. if (!Laya.Browser.onWeiXin)
  10082. return;
  10083. var param = {};
  10084. Laya.Browser.window.sdk.getFyhd().shareRecommend(param, function (data) {
  10085. console.log("热门游戏数据--", data);
  10086. if (data.data) {
  10087. FYHD_Sdk.pushData = data.data;
  10088. FYHD_Sdk.pushData.sort(FYHD_Sdk.ListSort);
  10089. FYHD_Sdk.isHaveDate = true;
  10090. //此处派发事件,展示互推
  10091. //EventManager.event(FYHD_Sdk.ShowAd);
  10092. }
  10093. console.log("获取互推信息:" + JSON.stringify(FYHD_Sdk.pushData));
  10094. new RecommendView_1.Recommend();
  10095. });
  10096. };
  10097. FYHD_Sdk.ShowHuTuiJump = function (data, open) {
  10098. if (!Laya.Browser.onWeiXin)
  10099. return;
  10100. if (data.jump_type == 2) //二维码跳转方法
  10101. {
  10102. Laya.Browser.window.wx.previewImage({ current: data.qrcode, urls: [data.qrcode] });
  10103. }
  10104. else if (data.jump_type == 1) //直跳方法
  10105. {
  10106. Laya.Browser.window.wx.navigateToMiniProgram({
  10107. appId: data.to_appid,
  10108. path: data.jump_path,
  10109. success: function (res) {
  10110. // 打开成功
  10111. console.log("上报成功:" + JSON.stringify(res));
  10112. FYHD_Sdk.PushClick(data.to_appid);
  10113. },
  10114. fail: function (res) {
  10115. if (open) {
  10116. ViewManager_1.ViewManager.Instance.add(ChoutiPanView_1.default);
  10117. }
  10118. }
  10119. });
  10120. }
  10121. else if (data.jump_type == 0) //平台跳转方法
  10122. {
  10123. Laya.Browser.window.wx.navigateToMiniProgram({
  10124. appId: data.platform_appid,
  10125. path: data.jump_path,
  10126. success: function (res) {
  10127. // 打开成功
  10128. console.log("上报成功:" + JSON.stringify(res));
  10129. FYHD_Sdk.PushClick(data.to_appid);
  10130. },
  10131. fail: function (res) {
  10132. if (open) {
  10133. ViewManager_1.ViewManager.Instance.add(ChoutiPanView_1.default);
  10134. }
  10135. }
  10136. });
  10137. }
  10138. };
  10139. //互推点击
  10140. FYHD_Sdk.PushClick = function (to_appid) {
  10141. if (!Laya.Browser.onWeiXin)
  10142. return;
  10143. var param = {
  10144. openid: FYHD_Sdk.openid,
  10145. to_appid: to_appid,
  10146. };
  10147. Laya.Browser.window.sdk.getFyhd().sharePlay(param, function (data) {
  10148. console.log("点击上报结果:" + JSON.stringify(data));
  10149. });
  10150. };
  10151. FYHD_Sdk.ListSort = function (a, b) {
  10152. if (Number(a["panel"]) < Number(b["panel"])) {
  10153. return -1;
  10154. }
  10155. if (Number(a["panel"]) == Number(b["panel"])) {
  10156. return 0;
  10157. }
  10158. if (Number(a["panel"]) > Number(b["panel"])) {
  10159. return 1;
  10160. }
  10161. };
  10162. FYHD_Sdk.Ad_ClickType = {
  10163. Video: "video_click",
  10164. Watch: "watch",
  10165. Share: "share",
  10166. Banner: "banner",
  10167. Push: "push",
  10168. PushClick: "icon_click"
  10169. };
  10170. FYHD_Sdk.pushData = [];
  10171. FYHD_Sdk.isHaveDate = false;
  10172. FYHD_Sdk.ShowAd = "ShowAd";
  10173. return FYHD_Sdk;
  10174. }());
  10175. exports.FYHD_Sdk = FYHD_Sdk;
  10176. },{"../Push/ChoutiPanView":49,"../Push/RecommendView":53,"../View/ViewManager":68}],70:[function(require,module,exports){
  10177. "use strict";
  10178. Object.defineProperty(exports, "__esModule", { value: true });
  10179. var PlayerAccount_1 = require("./PlayerAccount");
  10180. var ttad_1 = require("./ttad");
  10181. var WxGameItem = /** @class */ (function () {
  10182. function WxGameItem() {
  10183. this.appNameHidden = false;
  10184. this.color = "C93B3BFF";
  10185. this.size = 100;
  10186. this.borderWidth = 50;
  10187. this.borderColor = "A1A0A0FF";
  10188. }
  10189. return WxGameItem;
  10190. }());
  10191. exports.WxGameItem = WxGameItem;
  10192. var GuangGao = /** @class */ (function () {
  10193. function GuangGao() {
  10194. this.isVideoLoadCom = false;
  10195. }
  10196. Object.defineProperty(GuangGao, "hasbanner", {
  10197. get: function () {
  10198. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.banner) {
  10199. return true;
  10200. }
  10201. else {
  10202. return false;
  10203. }
  10204. },
  10205. enumerable: true,
  10206. configurable: true
  10207. });
  10208. Object.defineProperty(GuangGao, "hasvideo", {
  10209. get: function () {
  10210. if (Laya.Browser.onWeiXin && PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video) {
  10211. var videonum = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetGlobe;
  10212. return true;
  10213. }
  10214. else {
  10215. return false;
  10216. }
  10217. },
  10218. enumerable: true,
  10219. configurable: true
  10220. });
  10221. //预先加载视屏广告
  10222. GuangGao.InitVideo = function () {
  10223. var _this = this;
  10224. if (!Laya.Browser.onWeiXin || !PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video)
  10225. return;
  10226. console.log(this.bannerAdUnitId);
  10227. //vedio
  10228. this.fsaasfafssfa = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: this.videlAdUnitId });
  10229. this.fsaasfafssfa.onLoad(function () {
  10230. console.log('激励视频 广告加载成功');
  10231. _this.asfasfsaffsa = true;
  10232. });
  10233. this.fsaasfafssfa.onError(function (err) {
  10234. console.log("激励视屏加载失败:" + err);
  10235. _this.asfasfsaffsa = false;
  10236. });
  10237. this.afsfsaafsfsa = true;
  10238. };
  10239. //看视频
  10240. GuangGao.ShowVideo = function (callback) {
  10241. var _this = this;
  10242. if (this.hasvideo) {
  10243. if (this.asfasfsaffsa) {
  10244. console.log("showVideoAd:" + this.asfasfsaffsa);
  10245. this.SetVideoCallBack(callback);
  10246. this.fsaasfafssfa.show().catch(function (err) {
  10247. _this.fsaasfafssfa.load().then(function () {
  10248. _this.SetVideoCallBack(callback);
  10249. _this.fsaasfafssfa.show();
  10250. });
  10251. });
  10252. }
  10253. else {
  10254. // ShareUtil.shareImage("视频没有分享", callback
  10255. // , "1");
  10256. }
  10257. }
  10258. else {
  10259. callback(false);
  10260. // ShareUtil.shareImage("视频没有分享", callback
  10261. // , "1");
  10262. }
  10263. };
  10264. GuangGao.SetVideoCallBack = function (callback) {
  10265. var _this = this;
  10266. this.fsaasfafssfa.offClose();
  10267. this.fsaasfafssfa.onClose(function (res) {
  10268. console.log("激励视频关闭:" + res.isEnded);
  10269. if (res && res.isEnded || res === undefined) {
  10270. callback && callback(true);
  10271. }
  10272. else {
  10273. callback && callback(false);
  10274. }
  10275. _this.fsaasfafssfa.offClose();
  10276. });
  10277. };
  10278. //打开banner
  10279. GuangGao.OpenBanner = function (gap, callVack, iswait) {
  10280. // if (!this.hasbanner)
  10281. // {
  10282. // callVack(null);
  10283. // return;
  10284. // }
  10285. var _this = this;
  10286. if (gap === void 0) { gap = 0; }
  10287. if (callVack === void 0) { callVack = null; }
  10288. if (iswait === void 0) { iswait = false; }
  10289. if (!Laya.Browser.onWeiXin) {
  10290. callVack(null);
  10291. return;
  10292. }
  10293. this.canshowbanner = true;
  10294. var idd = this.bannerAdUnitId;
  10295. console.log("adUnitId:" + idd);
  10296. var newBanner = Laya.Browser.window.wx.createBannerAd({
  10297. adUnitId: idd,
  10298. style: {
  10299. left: 0,
  10300. top: 0,
  10301. width: 460
  10302. }
  10303. });
  10304. newBanner.onError(function (err) {
  10305. console.log(err);
  10306. callVack(null);
  10307. });
  10308. newBanner.onLoad(function () {
  10309. if (_this.curbanner)
  10310. _this.curbanner.destroy();
  10311. _this.curbanner = newBanner;
  10312. var hight = _this.GetRealHight(gap);
  10313. if (callVack != null) {
  10314. callVack(hight);
  10315. }
  10316. if (_this.canshowbanner && !iswait) {
  10317. _this.curbanner.show();
  10318. }
  10319. else {
  10320. _this.curbanner.hide();
  10321. }
  10322. });
  10323. };
  10324. GuangGao.GetRealHight = function (gap) {
  10325. if (this.curbanner) {
  10326. var info = Laya.Browser.window.wx.getSystemInfoSync();
  10327. this.curbanner.style.width = info.windowWidth;
  10328. this.curbanner.style.top = info.windowHeight - this.curbanner.style.realHeight - gap;
  10329. return Laya.stage.height / info.windowHeight * this.curbanner.style.realHeight;
  10330. }
  10331. };
  10332. //clear
  10333. GuangGao.Clear = function () {
  10334. GuangGao.clearTween();
  10335. Laya.timer.clearAll(this);
  10336. Laya.Tween.clearAll(this);
  10337. this.canshowbanner = false;
  10338. if (this.curbanner)
  10339. this.curbanner.hide();
  10340. // if (!Laya.Browser.onWeiXin) return;
  10341. // if (this.curbanner) this.curbanner.hide();
  10342. };
  10343. GuangGao.hidebanner = function () {
  10344. if (!Laya.Browser.onWeiXin)
  10345. return;
  10346. if (this.curbanner)
  10347. this.curbanner.hide();
  10348. };
  10349. GuangGao.showbanner = function () {
  10350. if (!Laya.Browser.onWeiXin)
  10351. return;
  10352. if (this.curbanner)
  10353. this.curbanner.show();
  10354. };
  10355. Object.defineProperty(GuangGao, "cancheat", {
  10356. get: function () {
  10357. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.cheat) {
  10358. return true;
  10359. }
  10360. else {
  10361. return false;
  10362. }
  10363. // if(!PlayerAccount.CurrentAccount.CurAccountData.cheat)
  10364. // {
  10365. // console.log("cheat:false-> CurAccountData.cheat != 1");
  10366. // return false;
  10367. // }
  10368. // var checkscence = PlayerAccount.CurrentAccount.CurAccountData.checkscence;
  10369. // if (checkscence == false)
  10370. // {
  10371. // console.log("cheat:true-> " + WxApi.sceneValue);
  10372. // return true;
  10373. // }
  10374. // if (WxApi.sceneValue == "1037" || WxApi.sceneValue == "1058"|| WxApi.sceneValue == "1067" || WxApi.sceneValue == "1095")
  10375. // {
  10376. // console.log("cheat:true-> " + WxApi.sceneValue);
  10377. // return true;
  10378. // }
  10379. // console.log("cheat:false-> " + WxApi.sceneValue);
  10380. // return false;
  10381. },
  10382. enumerable: true,
  10383. configurable: true
  10384. });
  10385. GuangGao.SetPosBanner = function (btn, complete) {
  10386. var _this = this;
  10387. if (Laya.Browser.onPC) {
  10388. complete(false);
  10389. return;
  10390. }
  10391. var info = Laya.Browser.window.wx.getSystemInfoSync();
  10392. //console.log(info);
  10393. //console.log(btn);
  10394. //console.log(btn.y,Laya.stage.height,info.windowHeight);
  10395. var reshight = btn.y * info.windowHeight / Laya.stage.height;
  10396. //console.log("reshight",reshight);
  10397. var idd = this.bannerAdUnitId;
  10398. console.log("adUnitId:" + idd);
  10399. if (this.curbanner)
  10400. this.curbanner.destroy();
  10401. var newBanner = Laya.Browser.window.wx.createBannerAd({
  10402. adUnitId: idd,
  10403. style: {
  10404. left: 0,
  10405. top: 0,
  10406. width: 720
  10407. }
  10408. });
  10409. newBanner.onError(function (err) {
  10410. console.log(err);
  10411. complete(false);
  10412. });
  10413. newBanner.onLoad(function () {
  10414. _this.curbanner = newBanner;
  10415. _this.curbanner.style.top = reshight;
  10416. //console.log("top",this.asgagassga.style.top);
  10417. if (_this.curbanner) {
  10418. console.log("banner show");
  10419. _this.curbanner.show();
  10420. Laya.timer.once(2300, _this, function () {
  10421. _this.curbanner.style.top = info.windowHeight - GuangGao.bannerhigt;
  10422. complete(true);
  10423. });
  10424. }
  10425. });
  10426. newBanner.onResize(function (res) {
  10427. GuangGao.bannerhigt = res.height;
  10428. _this.curbanner.style.width = info.windowWidth;
  10429. _this.curbanner.style.top = reshight;
  10430. });
  10431. };
  10432. //按钮误导
  10433. GuangGao.CheatBanner = function (btn, complete, gap) {
  10434. if (complete === void 0) { complete = null; }
  10435. if (gap === void 0) { gap = 0; }
  10436. ttad_1.ttad.Showbanner();
  10437. // if(!GuangGao.cancheat)
  10438. // {
  10439. // console.log("ignorecheat");
  10440. // GuangGao.OpenBanner(0,(height) =>
  10441. // {
  10442. // if(height == null)
  10443. // {
  10444. // }
  10445. // });
  10446. // }
  10447. // else
  10448. // {
  10449. // btn.y = Laya.stage.height-btn.height - 100;
  10450. // GuangGao.OpenBanner(gap,(height) =>
  10451. // {
  10452. // if(height == null)
  10453. // {
  10454. // }
  10455. // else
  10456. // {
  10457. // console.log("cheatstart","bottom:100");
  10458. // // btn.mouseEnabled = false;
  10459. // var end=Laya.stage.height-height-btn.height - 80;
  10460. // console.log("y:" + end);
  10461. // Laya.timer.once(PlayerAccount.CurrentAccount.CurAccountData.cheattime*1000,this,()=>
  10462. // {
  10463. // // btn.mouseEnabled = true;
  10464. // this.showbanner();
  10465. // GuangGao.clearTween();
  10466. // GuangGao.tween = Laya.Tween.to(btn,{y:end},200,null,Laya.Handler.create(this,()=>
  10467. // {
  10468. // if(complete != null)
  10469. // {
  10470. // complete();
  10471. // }
  10472. // }))
  10473. // })
  10474. // }
  10475. // },true);
  10476. // }
  10477. };
  10478. GuangGao.clearTween = function () {
  10479. if (GuangGao.tween) {
  10480. GuangGao.tween.clear();
  10481. GuangGao.tween = null;
  10482. }
  10483. };
  10484. GuangGao.prototype.loadVideo = function (cb) {
  10485. var _this = this;
  10486. if (!Laya.Browser.onWeiXin) {
  10487. if (cb)
  10488. cb(true);
  10489. return;
  10490. }
  10491. ;
  10492. this._onLoadVideo = cb;
  10493. if (!this._rewardedVideoAd) {
  10494. var index = GuangGao.videlAdUnitId;
  10495. this._rewardedVideoAd = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: index });
  10496. var isc = false;
  10497. this._rewardedVideoAd.onLoad(function () {
  10498. console.log("[LOG] 激励视频广告加载成功");
  10499. _this.isVideoLoadCom = true;
  10500. if (isc)
  10501. return;
  10502. isc = true;
  10503. _this._onLoadVideo && _this._onLoadVideo(true);
  10504. _this._onLoadVideo = null;
  10505. });
  10506. this._rewardedVideoAd.onError(function (err) {
  10507. console.log("[LOG] 激励视频广告加载失败");
  10508. console.log(err);
  10509. _this.isVideoLoadCom = false;
  10510. _this._onLoadVideo && _this._onLoadVideo(false);
  10511. _this._onLoadVideo = null;
  10512. });
  10513. this._rewardedVideoAd.onClose(function (res) {
  10514. if (!res || res.isEnded) {
  10515. _this._onVideoClose && _this._onVideoClose(true);
  10516. _this._onVideoClose = null;
  10517. }
  10518. else {
  10519. _this._onVideoClose && _this._onVideoClose(false);
  10520. _this._onVideoClose = null;
  10521. }
  10522. });
  10523. }
  10524. else {
  10525. if (this.isVideoLoadCom) {
  10526. this._onLoadVideo && this._onLoadVideo(true);
  10527. this._onLoadVideo = null;
  10528. }
  10529. else {
  10530. this._onLoadVideo && this._onLoadVideo(false);
  10531. this._onLoadVideo = null;
  10532. }
  10533. }
  10534. };
  10535. GuangGao.prototype.showVideo = function (cb) {
  10536. var _this = this;
  10537. if (!Laya.Browser.onWeiXin) {
  10538. if (cb)
  10539. cb(true);
  10540. return;
  10541. }
  10542. ;
  10543. this._onVideoClose = cb;
  10544. this._rewardedVideoAd.show().catch(function (err) {
  10545. _this._rewardedVideoAd.load().then(function () {
  10546. _this._rewardedVideoAd.show();
  10547. });
  10548. });
  10549. };
  10550. GuangGao.videlAdUnitId = "adunit-0c687084c908ee89";
  10551. GuangGao.bannerAdUnitId = "adunit-8c2d586135fa6d4f";
  10552. GuangGao.afsfsaafsfsa = false;
  10553. //视屏广告是否加载成功
  10554. GuangGao.asfasfsaffsa = false;
  10555. GuangGao.canshowbanner = true;
  10556. GuangGao.bannerhigt = 0;
  10557. return GuangGao;
  10558. }());
  10559. exports.GuangGao = GuangGao;
  10560. },{"./PlayerAccount":73,"./ttad":81}],71:[function(require,module,exports){
  10561. "use strict";
  10562. Object.defineProperty(exports, "__esModule", { value: true });
  10563. var Event = Laya.Event;
  10564. var HttpRequest = Laya.HttpRequest;
  10565. var PlayerAccount_1 = require("./PlayerAccount");
  10566. var Sdk_1 = require("./Sdk");
  10567. var TimesTamper_1 = require("../Time/TimesTamper");
  10568. var Global_1 = require("../Global");
  10569. // const PROTOCOL_URL:string = "https://pipelineapi.xwxgame.com/";
  10570. var PROTOCOL_URL = "https://parkourracetoutiao2api.xwxgame.com/";
  10571. var PROTOCOLS = /** @class */ (function () {
  10572. function PROTOCOLS() {
  10573. }
  10574. PROTOCOLS.Login = "user/login"; // not token
  10575. PROTOCOLS.game = "game/start";
  10576. PROTOCOLS.end = "game/play";
  10577. PROTOCOLS.Sign = "sign/sign";
  10578. // public static EquipHero = "theme/equipHero";
  10579. // public static BuyHero = "theme/buyHero";
  10580. // public static EquipHat = "theme/equipHat";
  10581. // public static BuyHat = "theme/buyHat";
  10582. // public static BuyDance = "theme/buyDance";
  10583. // public static EquipDance = "theme/equipDance";
  10584. PROTOCOLS.Buy = "theme/buy";
  10585. PROTOCOLS.Equip = "theme/equip";
  10586. PROTOCOLS.share = "fission/share";
  10587. PROTOCOLS.vd = "fission/vd";
  10588. PROTOCOLS.revival = "game/revival";
  10589. PROTOCOLS.fission = "theme/fission";
  10590. PROTOCOLS.themefission = "theme/fission";
  10591. PROTOCOLS.treasure = "treasure/click";
  10592. PROTOCOLS.Config = "config/table";
  10593. PROTOCOLS.Lottery = "lottery/lottery";
  10594. PROTOCOLS.GetAchieve = "achievement/getRewards";
  10595. PROTOCOLS.usersync = "user/sync";
  10596. return PROTOCOLS;
  10597. }());
  10598. exports.PROTOCOLS = PROTOCOLS;
  10599. ;
  10600. var NetworkManager = /** @class */ (function () {
  10601. function NetworkManager() {
  10602. NetworkManager.instance = this;
  10603. }
  10604. Object.defineProperty(NetworkManager, "Instance", {
  10605. get: function () {
  10606. if (NetworkManager.instance) {
  10607. return NetworkManager.instance;
  10608. }
  10609. else {
  10610. return new NetworkManager();
  10611. }
  10612. },
  10613. enumerable: true,
  10614. configurable: true
  10615. });
  10616. //#region 登入
  10617. /******************************* login *****************************/
  10618. NetworkManager.prototype.login = function (progresscb, completecb, errorcb) {
  10619. var userInfor = PlayerAccount_1.PlayerAccount.CurrentAccount;
  10620. var ver = Global_1.Global.gameVersion;
  10621. 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;
  10622. var httpRequest = new HttpRequest();
  10623. httpRequest.once(Event.PROGRESS, this, this.onHttpRequestProgress, [progresscb, httpRequest]);
  10624. httpRequest.once(Event.COMPLETE, this, this.onLoginRequestComplete, [completecb, httpRequest]);
  10625. httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]);
  10626. httpRequest.send(PROTOCOL_URL + PROTOCOLS.Login, args, "post", "text");
  10627. };
  10628. NetworkManager.prototype.onHttpRequestProgress = function (progresscb, httpRequest) {
  10629. if (progresscb) {
  10630. console.log("HttpRequestProgress:...");
  10631. progresscb.run();
  10632. }
  10633. };
  10634. NetworkManager.prototype.onLoginRequestComplete = function (completecb, httpRequest) {
  10635. //console.log("登录数据:", httpRequest.data);
  10636. var data = JSON.parse(httpRequest.data);
  10637. if (data["code"] != "0") {
  10638. console.log("登录异常错误!错误信息:", httpRequest.data);
  10639. Sdk_1.WxApi.recordAldEvent("登录异常错误!错误信息:= " + data["code"], "httpRequest.dat");
  10640. //completecb.runWith(data);
  10641. return;
  10642. }
  10643. PlayerAccount_1.PlayerAccount.ServerTime = data["t"];
  10644. TimesTamper_1.TimesTamper.Instance.updateServiceTime(Number(data["t"]));
  10645. Sdk_1.WxApi.recordAldEvent("登录正式成功");
  10646. PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, completecb);
  10647. // ShareUtil.ShareMessage();
  10648. };
  10649. NetworkManager.prototype.onHttpRequestError = function (errorcb, httpRequest) {
  10650. if (errorcb != null) {
  10651. errorcb.runWith(httpRequest);
  10652. }
  10653. Sdk_1.WxApi.recordAldEvent("Error! Http request error.. ", "httpRequest.dat");
  10654. Sdk_1.WxApi.ShowLoading("连接网络失败...");
  10655. Laya.timer.once(8000, this, function () { Sdk_1.WxApi.HideLoading(); });
  10656. console.log("Error! Http request error..." + httpRequest.data);
  10657. };
  10658. //#endregion
  10659. /*
  10660. * 通用Http Post协议发送
  10661. * protocol 对应“PROTOCOLS”字典中协议名称
  10662. * hasToken 是否使用token,目前只有login协议不需要token,其他都需要token,所以此处自动组合
  10663. * param 参数列表,key是字段名,val是值,值需要先转string
  10664. * completecb 协议发送成功回调函数
  10665. * errorcb 协议发送失败回调函数
  10666. * return 返回值为void
  10667. */
  10668. NetworkManager.prototype.HttpPostRequest = function (protocol, param, completecb, errorcb, hasToken) {
  10669. if (hasToken === void 0) { hasToken = true; }
  10670. var args = "";
  10671. var url = PROTOCOL_URL + protocol;
  10672. // chechk add token
  10673. var account = PlayerAccount_1.PlayerAccount.CurrentAccount;
  10674. var accountdata = account.CurAccountData;
  10675. if (hasToken == true) {
  10676. args = "token=" + accountdata.m_token + "&";
  10677. }
  10678. Sdk_1.WxApi.ShowLoading("连接网络中...");
  10679. if (protocol == PROTOCOLS.game || protocol == PROTOCOLS.end || protocol == PROTOCOLS.fission || protocol == PROTOCOLS.vd ||
  10680. protocol == PROTOCOLS.themefission || protocol == PROTOCOLS.Lottery || protocol == PROTOCOLS.usersync) {
  10681. var str = "abcdefghijkimnopqrstuvwxyz0123456789";
  10682. var code = "{";
  10683. var mask = "";
  10684. for (var i = 0; i < 4; i++) {
  10685. mask += str[Math.floor(Math.random() * 100) % str.length];
  10686. }
  10687. for (var i = 0; i < param.length; i++) {
  10688. for (var key in param[i]) {
  10689. code += "\"" + key + "\":\"" + param[i][key] + "\"";
  10690. }
  10691. if (i < param.length - 1) {
  10692. code += ",";
  10693. }
  10694. else {
  10695. code += "}";
  10696. }
  10697. }
  10698. args += "_r=" + mask + this.base64Encode(code);
  10699. }
  10700. else {
  10701. if (param != null) {
  10702. for (var i = 0; i < param.length; i++) {
  10703. for (var key in param[i]) {
  10704. var val = param[i][key];
  10705. args += key + "=" + val;
  10706. if (i < param.length - 1) {
  10707. args += "&";
  10708. }
  10709. }
  10710. }
  10711. }
  10712. }
  10713. var httpRequest = new HttpRequest();
  10714. httpRequest.once(Event.COMPLETE, this, this.onHttpRequestComplete, [completecb, errorcb, httpRequest]);
  10715. httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]);
  10716. httpRequest.send(url, args, "post", "text");
  10717. };
  10718. NetworkManager.prototype.onHttpRequestComplete = function (succeedcb, failurecb, httpRequest) {
  10719. Sdk_1.WxApi.HideLoading();
  10720. var data = JSON.parse(httpRequest.data);
  10721. if (data["code"] == 0) {
  10722. PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, null);
  10723. if (succeedcb != null) {
  10724. succeedcb.runWith(data);
  10725. }
  10726. }
  10727. else {
  10728. if (failurecb != null) {
  10729. failurecb.runWith(data);
  10730. }
  10731. console.log("Error! Http request complete error, code: " + data["code"] + " message: " + data["message"]);
  10732. }
  10733. };
  10734. NetworkManager.prototype.base64Encode = function (str) {
  10735. var c1, c2, c3;
  10736. var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  10737. var i = 0, len = str.length, string = '';
  10738. while (i < len) {
  10739. c1 = str.charCodeAt(i++) & 0xff;
  10740. if (i == len) {
  10741. string += base64EncodeChars.charAt(c1 >> 2);
  10742. string += base64EncodeChars.charAt((c1 & 0x3) << 4);
  10743. string += "==";
  10744. break;
  10745. }
  10746. c2 = str.charCodeAt(i++);
  10747. if (i == len) {
  10748. string += base64EncodeChars.charAt(c1 >> 2);
  10749. string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  10750. string += base64EncodeChars.charAt((c2 & 0xF) << 2);
  10751. string += "=";
  10752. break;
  10753. }
  10754. c3 = str.charCodeAt(i++);
  10755. string += base64EncodeChars.charAt(c1 >> 2);
  10756. string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  10757. string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
  10758. string += base64EncodeChars.charAt(c3 & 0x3F);
  10759. }
  10760. return string;
  10761. };
  10762. return NetworkManager;
  10763. }());
  10764. exports.NetworkManager = NetworkManager;
  10765. },{"../Global":39,"../Time/TimesTamper":58,"./PlayerAccount":73,"./Sdk":75}],72:[function(require,module,exports){
  10766. "use strict";
  10767. Object.defineProperty(exports, "__esModule", { value: true });
  10768. var PlatfromType = /** @class */ (function () {
  10769. function PlatfromType() {
  10770. }
  10771. /**
  10772. * 电脑
  10773. */
  10774. PlatfromType.pc = "pc";
  10775. /**
  10776. * 微信小游戏
  10777. */
  10778. PlatfromType.wx = "wx";
  10779. /**
  10780. * qq小游戏
  10781. */
  10782. PlatfromType.qq = "qq";
  10783. /**
  10784. * 抖音
  10785. */
  10786. PlatfromType.tt = "tt";
  10787. return PlatfromType;
  10788. }());
  10789. exports.PlatfromType = PlatfromType;
  10790. },{}],73:[function(require,module,exports){
  10791. "use strict";
  10792. Object.defineProperty(exports, "__esModule", { value: true });
  10793. var Sdk_1 = require("../WXSDK/Sdk");
  10794. var GameUtils_1 = require("../utils/GameUtils");
  10795. var NetworkManager_1 = require("./NetworkManager");
  10796. var DispatcherManager_1 = require("../utils/DispatcherManager");
  10797. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  10798. var requiretype;
  10799. (function (requiretype) {
  10800. requiretype[requiretype["\u7CFB\u7EDF\u8D60\u9001"] = 1] = "\u7CFB\u7EDF\u8D60\u9001";
  10801. requiretype[requiretype["\u91D1\u5E01\u8D2D\u4E70"] = 2] = "\u91D1\u5E01\u8D2D\u4E70";
  10802. requiretype[requiretype["\u89C2\u770B\u89C6\u9891"] = 3] = "\u89C2\u770B\u89C6\u9891";
  10803. requiretype[requiretype["\u5206\u4EAB"] = 4] = "\u5206\u4EAB";
  10804. requiretype[requiretype["\u7B7E\u5230"] = 5] = "\u7B7E\u5230";
  10805. requiretype[requiretype["\u6D3B\u52A8"] = 6] = "\u6D3B\u52A8";
  10806. requiretype[requiretype["\u901A\u8FC7\u5173\u5361"] = 7] = "\u901A\u8FC7\u5173\u5361";
  10807. requiretype[requiretype["\u7D2F\u8BA1\u767B\u9646"] = 8] = "\u7D2F\u8BA1\u767B\u9646";
  10808. requiretype[requiretype["\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230"] = 9] = "\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230";
  10809. requiretype[requiretype["\u7816\u77F3\u8D2D\u4E70"] = 10] = "\u7816\u77F3\u8D2D\u4E70";
  10810. })(requiretype = exports.requiretype || (exports.requiretype = {}));
  10811. var AccountConfig;
  10812. (function (AccountConfig) {
  10813. AccountConfig[AccountConfig["crop"] = 0] = "crop";
  10814. AccountConfig[AccountConfig["things"] = 1] = "things";
  10815. AccountConfig[AccountConfig["land"] = 2] = "land";
  10816. AccountConfig[AccountConfig["global"] = 3] = "global";
  10817. AccountConfig[AccountConfig["entity"] = 4] = "entity";
  10818. AccountConfig[AccountConfig["sign"] = 5] = "sign";
  10819. AccountConfig[AccountConfig["rewards"] = 6] = "rewards";
  10820. AccountConfig[AccountConfig["achievement"] = 7] = "achievement";
  10821. AccountConfig[AccountConfig["invite"] = 8] = "invite";
  10822. AccountConfig[AccountConfig["mission"] = 9] = "mission";
  10823. AccountConfig[AccountConfig["treasure_click"] = 10] = "treasure_click";
  10824. AccountConfig[AccountConfig["theme"] = 11] = "theme";
  10825. AccountConfig[AccountConfig["lottery"] = 12] = "lottery";
  10826. })(AccountConfig = exports.AccountConfig || (exports.AccountConfig = {}));
  10827. var AccountUser;
  10828. (function (AccountUser) {
  10829. AccountUser[AccountUser["money"] = 0] = "money";
  10830. AccountUser[AccountUser["diamond"] = 1] = "diamond";
  10831. AccountUser[AccountUser["user_id"] = 2] = "user_id";
  10832. AccountUser[AccountUser["game_times"] = 3] = "game_times";
  10833. AccountUser[AccountUser["get_themes"] = 4] = "get_themes";
  10834. AccountUser[AccountUser["video_times"] = 5] = "video_times";
  10835. AccountUser[AccountUser["equip_themes"] = 6] = "equip_themes";
  10836. AccountUser[AccountUser["last_action_time"] = 7] = "last_action_time";
  10837. AccountUser[AccountUser["last_favorite_time"] = 8] = "last_favorite_time";
  10838. AccountUser[AccountUser["progress_themes"] = 9] = "progress_themes";
  10839. AccountUser[AccountUser["revival"] = 10] = "revival";
  10840. AccountUser[AccountUser["stage"] = 11] = "stage";
  10841. AccountUser[AccountUser["vmoney"] = 12] = "vmoney";
  10842. })(AccountUser = exports.AccountUser || (exports.AccountUser = {}));
  10843. var heroAttr;
  10844. (function (heroAttr) {
  10845. heroAttr[heroAttr["id"] = 0] = "id";
  10846. heroAttr[heroAttr["name"] = 1] = "name";
  10847. heroAttr[heroAttr["quality"] = 2] = "quality";
  10848. heroAttr[heroAttr["icon"] = 3] = "icon";
  10849. heroAttr[heroAttr["prefab"] = 4] = "prefab";
  10850. heroAttr[heroAttr["require_num"] = 5] = "require_num";
  10851. heroAttr[heroAttr["require_type"] = 6] = "require_type";
  10852. })(heroAttr = exports.heroAttr || (exports.heroAttr = {}));
  10853. var signdata;
  10854. (function (signdata) {
  10855. signdata[signdata["sign_days"] = 0] = "sign_days";
  10856. signdata[signdata["sign_time"] = 1] = "sign_time";
  10857. })(signdata = exports.signdata || (exports.signdata = {}));
  10858. var entity;
  10859. (function (entity) {
  10860. entity[entity["id"] = 0] = "id";
  10861. entity[entity["name"] = 1] = "name";
  10862. entity[entity["entity_id"] = 2] = "entity_id";
  10863. entity[entity["icon"] = 3] = "icon";
  10864. })(entity = exports.entity || (exports.entity = {}));
  10865. var skinattr;
  10866. (function (skinattr) {
  10867. skinattr[skinattr["effectValue_1"] = 0] = "effectValue_1";
  10868. skinattr[skinattr["effectValue_2"] = 1] = "effectValue_2";
  10869. skinattr[skinattr["effectValue_3"] = 2] = "effectValue_3";
  10870. skinattr[skinattr["effectValue_4"] = 3] = "effectValue_4";
  10871. })(skinattr = exports.skinattr || (exports.skinattr = {}));
  10872. var AccountData = /** @class */ (function () {
  10873. function AccountData(_token, _config, _appSetting, _user, _userbase, _useInvite, _user_stage, _user_sign, _user_achievement, _lottery, _use_land_task, _user_video) {
  10874. if (_useInvite === void 0) { _useInvite = null; }
  10875. if (_user_stage === void 0) { _user_stage = null; }
  10876. this.openid = "";
  10877. this.userId = "";
  10878. this.roadconfig = {};
  10879. this.m_RewardDic = {};
  10880. this.m_EntityDic = {};
  10881. this.m_AchievementDic = {};
  10882. this.m_token = _token;
  10883. this.m_app_setting = _appSetting;
  10884. this.m_user = _user;
  10885. this.m_user_base = _userbase;
  10886. this.m_sign = _user_sign;
  10887. this.m_task = _user_achievement;
  10888. this.lottery = _lottery;
  10889. this.m_use_land_task = _use_land_task;
  10890. this.m_user_video = _user_video;
  10891. this.userId = this.m_user["user_id"];
  10892. this.openid = this.m_user_base["openid"];
  10893. console.log("user_id:" + this.userId);
  10894. //console.log("open_id:"+this.openid);
  10895. }
  10896. Object.defineProperty(AccountData.prototype, "DieDistance", {
  10897. // public m_skinDic:Dictionary<number,SkinData> = new Dictionary();
  10898. //获取玩家落入空中死亡距离
  10899. get: function () {
  10900. return Number(this.m_app_setting["DieDistance"]);
  10901. },
  10902. enumerable: true,
  10903. configurable: true
  10904. });
  10905. Object.defineProperty(AccountData.prototype, "HitEgg", {
  10906. //获取开局砸蛋几率
  10907. get: function () {
  10908. return Number(this.m_app_setting["HitEgg"]);
  10909. },
  10910. enumerable: true,
  10911. configurable: true
  10912. });
  10913. Object.defineProperty(AccountData.prototype, "EndCheat", {
  10914. //获取结算后砸蛋出现几率
  10915. get: function () {
  10916. return Number(this.m_app_setting["EndCheat"]);
  10917. },
  10918. enumerable: true,
  10919. configurable: true
  10920. });
  10921. Object.defineProperty(AccountData.prototype, "CheatReward", {
  10922. //获取误触奖励金币数
  10923. get: function () {
  10924. return Number(this.m_app_setting["CheatReward"]);
  10925. },
  10926. enumerable: true,
  10927. configurable: true
  10928. });
  10929. Object.defineProperty(AccountData.prototype, "WhiteUser", {
  10930. //白名单用户
  10931. get: function () {
  10932. return this.m_app_setting["WhiteUser"] == "1";
  10933. },
  10934. enumerable: true,
  10935. configurable: true
  10936. });
  10937. Object.defineProperty(AccountData.prototype, "StrategySwitch", {
  10938. //签到功能是否开启
  10939. get: function () {
  10940. return this.m_app_setting["StrategySwitch"] == "1";
  10941. },
  10942. enumerable: true,
  10943. configurable: true
  10944. });
  10945. Object.defineProperty(AccountData.prototype, "ShowSign", {
  10946. //签到功能是否开启
  10947. get: function () {
  10948. return this.m_app_setting["ShowSign"] == "1";
  10949. },
  10950. enumerable: true,
  10951. configurable: true
  10952. });
  10953. Object.defineProperty(AccountData.prototype, "Choose", {
  10954. //自动勾选
  10955. get: function () {
  10956. return this.m_app_setting["choose"] == "1";
  10957. },
  10958. enumerable: true,
  10959. configurable: true
  10960. });
  10961. Object.defineProperty(AccountData.prototype, "lotterytime", {
  10962. get: function () {
  10963. return Number(this.lottery["day_video_times"]);
  10964. },
  10965. enumerable: true,
  10966. configurable: true
  10967. });
  10968. Object.defineProperty(AccountData.prototype, "share", {
  10969. get: function () {
  10970. return this.m_app_setting["share"] == "1";
  10971. },
  10972. enumerable: true,
  10973. configurable: true
  10974. });
  10975. Object.defineProperty(AccountData.prototype, "sharecontent", {
  10976. get: function () {
  10977. return this.m_app_setting["sharecontent"];
  10978. },
  10979. enumerable: true,
  10980. configurable: true
  10981. });
  10982. Object.defineProperty(AccountData.prototype, "ShareImage", {
  10983. get: function () {
  10984. return this.m_app_setting["ShareImage"];
  10985. },
  10986. enumerable: true,
  10987. configurable: true
  10988. });
  10989. Object.defineProperty(AccountData.prototype, "cheattime", {
  10990. get: function () {
  10991. return Number(this.m_app_setting["cheattime"]);
  10992. },
  10993. enumerable: true,
  10994. configurable: true
  10995. });
  10996. Object.defineProperty(AccountData.prototype, "banner", {
  10997. get: function () {
  10998. return this.m_app_setting["banner"] == "1";
  10999. },
  11000. enumerable: true,
  11001. configurable: true
  11002. });
  11003. Object.defineProperty(AccountData.prototype, "video", {
  11004. get: function () {
  11005. return this.m_app_setting["video"] == "1";
  11006. },
  11007. enumerable: true,
  11008. configurable: true
  11009. });
  11010. Object.defineProperty(AccountData.prototype, "BtnCanMove", {
  11011. get: function () {
  11012. return this.m_app_setting["BtnCanMove"] == "1";
  11013. },
  11014. enumerable: true,
  11015. configurable: true
  11016. });
  11017. Object.defineProperty(AccountData.prototype, "checkscence", {
  11018. get: function () {
  11019. return this.m_app_setting["checkscence"] == "1";
  11020. },
  11021. enumerable: true,
  11022. configurable: true
  11023. });
  11024. Object.defineProperty(AccountData.prototype, "banner_dis", {
  11025. get: function () {
  11026. return Number(this.m_app_setting["banner_dis"]);
  11027. },
  11028. enumerable: true,
  11029. configurable: true
  11030. });
  11031. Object.defineProperty(AccountData.prototype, "bannerMoveTime", {
  11032. get: function () {
  11033. return Number(this.m_app_setting["bannerMoveTime"]);
  11034. },
  11035. enumerable: true,
  11036. configurable: true
  11037. });
  11038. Object.defineProperty(AccountData.prototype, "createBannerTimes", {
  11039. get: function () {
  11040. return Number(this.m_app_setting["createBannerTimes"]);
  11041. },
  11042. enumerable: true,
  11043. configurable: true
  11044. });
  11045. Object.defineProperty(AccountData.prototype, "bannerMoveProp", {
  11046. get: function () {
  11047. return Number(this.m_app_setting["bannerMoveProp"]);
  11048. },
  11049. enumerable: true,
  11050. configurable: true
  11051. });
  11052. Object.defineProperty(AccountData.prototype, "isShareThenVideo", {
  11053. get: function () {
  11054. return this.m_app_setting["isShareThenVideo"] == "1";
  11055. },
  11056. enumerable: true,
  11057. configurable: true
  11058. });
  11059. Object.defineProperty(AccountData.prototype, "isShowHuiTui", {
  11060. get: function () {
  11061. return this.m_app_setting["isShowHuiTui"] == "1";
  11062. },
  11063. enumerable: true,
  11064. configurable: true
  11065. });
  11066. Object.defineProperty(AccountData.prototype, "start_sprint", {
  11067. get: function () {
  11068. return Number(this.m_app_setting["start_sprint"]);
  11069. },
  11070. enumerable: true,
  11071. configurable: true
  11072. });
  11073. Object.defineProperty(AccountData.prototype, "IsVideoModel", {
  11074. get: function () {
  11075. return this.m_app_setting["IsVideoModel"] == "1";
  11076. },
  11077. enumerable: true,
  11078. configurable: true
  11079. });
  11080. Object.defineProperty(AccountData.prototype, "videoModelNum", {
  11081. get: function () {
  11082. return Number(this.m_app_setting["videoModelNum"]);
  11083. },
  11084. enumerable: true,
  11085. configurable: true
  11086. });
  11087. Object.defineProperty(AccountData.prototype, "VideoModelTitle", {
  11088. get: function () {
  11089. return this.m_app_setting["VideoModelTitle"];
  11090. },
  11091. enumerable: true,
  11092. configurable: true
  11093. });
  11094. Object.defineProperty(AccountData.prototype, "failcount", {
  11095. get: function () {
  11096. return Number(this.m_app_setting["failcount"]);
  11097. },
  11098. enumerable: true,
  11099. configurable: true
  11100. });
  11101. Object.defineProperty(AccountData.prototype, "spminspeed", {
  11102. get: function () {
  11103. return Number(this.m_app_setting["spminspeed"]);
  11104. },
  11105. enumerable: true,
  11106. configurable: true
  11107. });
  11108. Object.defineProperty(AccountData.prototype, "bgm", {
  11109. get: function () {
  11110. return this.m_app_setting["bgm"] == "1";
  11111. },
  11112. enumerable: true,
  11113. configurable: true
  11114. });
  11115. Object.defineProperty(AccountData.prototype, "camerahight", {
  11116. get: function () {
  11117. return Number(this.m_app_setting["camerahight"]);
  11118. },
  11119. enumerable: true,
  11120. configurable: true
  11121. });
  11122. Object.defineProperty(AccountData.prototype, "ctnfilename", {
  11123. get: function () {
  11124. return this.m_app_setting["ctnfilename"];
  11125. },
  11126. enumerable: true,
  11127. configurable: true
  11128. });
  11129. Object.defineProperty(AccountData.prototype, "cheat", {
  11130. get: function () {
  11131. return this.m_app_setting["cheat"] == "1";
  11132. },
  11133. enumerable: true,
  11134. configurable: true
  11135. });
  11136. Object.defineProperty(AccountData.prototype, "shakestage", {
  11137. get: function () {
  11138. return this.m_app_setting["shakestage"] && this.m_app_setting["shakestage"] == "1";
  11139. },
  11140. enumerable: true,
  11141. configurable: true
  11142. });
  11143. Object.defineProperty(AccountData.prototype, "stageconfigcdn", {
  11144. get: function () {
  11145. return this.m_app_setting["stageconfigcdn"] == "1";
  11146. },
  11147. enumerable: true,
  11148. configurable: true
  11149. });
  11150. Object.defineProperty(AccountData.prototype, "playerspeed", {
  11151. get: function () {
  11152. return Number(this.m_app_setting["playerspeed"]);
  11153. },
  11154. enumerable: true,
  11155. configurable: true
  11156. });
  11157. Object.defineProperty(AccountData.prototype, "videlAdUnitId", {
  11158. get: function () {
  11159. return this.m_app_setting["videlAdUnitId"];
  11160. },
  11161. enumerable: true,
  11162. configurable: true
  11163. });
  11164. Object.defineProperty(AccountData.prototype, "bannerAdUnitId", {
  11165. get: function () {
  11166. return this.m_app_setting["bannerAdUnitId"];
  11167. },
  11168. enumerable: true,
  11169. configurable: true
  11170. });
  11171. Object.defineProperty(AccountData.prototype, "tri", {
  11172. get: function () {
  11173. return this.m_app_setting["tri"] == "1";
  11174. },
  11175. enumerable: true,
  11176. configurable: true
  11177. });
  11178. Object.defineProperty(AccountData.prototype, "recommend", {
  11179. get: function () {
  11180. return this.m_app_setting["recommend"] == "1";
  11181. },
  11182. enumerable: true,
  11183. configurable: true
  11184. });
  11185. Object.defineProperty(AccountData.prototype, "recommendflg", {
  11186. get: function () {
  11187. return this.m_app_setting["recommendflg"];
  11188. },
  11189. enumerable: true,
  11190. configurable: true
  11191. });
  11192. Object.defineProperty(AccountData.prototype, "egg", {
  11193. get: function () {
  11194. return this.m_app_setting["egg"] == "1";
  11195. },
  11196. enumerable: true,
  11197. configurable: true
  11198. });
  11199. Object.defineProperty(AccountData.prototype, "eggrate", {
  11200. get: function () {
  11201. return Number(this.m_app_setting["eggrate"]);
  11202. },
  11203. enumerable: true,
  11204. configurable: true
  11205. });
  11206. Object.defineProperty(AccountData.prototype, "UseId", {
  11207. get: function () {
  11208. return this.userId;
  11209. },
  11210. enumerable: true,
  11211. configurable: true
  11212. });
  11213. AccountData.prototype.GetConfig = function (_type) {
  11214. var type = AccountConfig[_type];
  11215. return this.m_configs[type];
  11216. };
  11217. AccountData.prototype.GetUser = function (_type) {
  11218. var type = AccountUser[_type];
  11219. return this.m_user[type];
  11220. };
  11221. Object.defineProperty(AccountData.prototype, "GetVideoTotal", {
  11222. get: function () {
  11223. return Number(this.m_user_video["total"]);
  11224. },
  11225. enumerable: true,
  11226. configurable: true
  11227. });
  11228. AccountData.prototype.GetSign = function (_datatype) {
  11229. var type = signdata[_datatype];
  11230. return this.m_sign[type];
  11231. };
  11232. AccountData.prototype.GetRewardConfig = function (_rewardid) {
  11233. var reward = this.m_RewardDic[_rewardid];
  11234. return reward;
  11235. };
  11236. AccountData.prototype.GetEntity = function (_id, attr) {
  11237. if (!this.m_EntityDic[_id])
  11238. return null;
  11239. return this.m_EntityDic[_id][entity[attr]];
  11240. };
  11241. AccountData.prototype.GetRewardDic = function () {
  11242. var config = this.GetConfig(AccountConfig.rewards);
  11243. for (var key in config) {
  11244. this.m_RewardDic[config[key].id] = config[key];
  11245. }
  11246. };
  11247. AccountData.prototype.GetEntityDic = function () {
  11248. var config = this.GetConfig(AccountConfig.entity);
  11249. for (var key in config) {
  11250. this.m_EntityDic[config[key].entity_id] = config[key];
  11251. }
  11252. };
  11253. AccountData.prototype.GetThemeById = function (_id) {
  11254. var data = this.GetConfig(AccountConfig.theme);
  11255. if (data) {
  11256. for (var index = 0; index < data.length; index++) {
  11257. var element = data[index];
  11258. if (element.id == _id) {
  11259. return element;
  11260. }
  11261. }
  11262. }
  11263. };
  11264. AccountData.prototype.GetSkinAttr = function (_id) {
  11265. var config = this.GetConfig(AccountConfig.theme);
  11266. for (var i = 0; i < config.length; i++) {
  11267. if (config[i].id == _id) {
  11268. return config[i];
  11269. }
  11270. }
  11271. };
  11272. AccountData.prototype.GetAchievementData = function () {
  11273. var data = this.GetConfig(AccountConfig.achievement);
  11274. var dic = {};
  11275. for (var key1 in data) {
  11276. var type1 = data[key1].type;
  11277. //var obj = {};
  11278. if (dic[type1]) {
  11279. continue;
  11280. }
  11281. var array = [];
  11282. for (var key2 in data) {
  11283. var type2 = data[key2].type;
  11284. if (type1 == type2) {
  11285. array.push(data[key2]);
  11286. }
  11287. }
  11288. dic[type1] = array;
  11289. }
  11290. this.m_AchievementDic = dic;
  11291. };
  11292. AccountData.prototype.HasTheme = function (_id) {
  11293. var has = false;
  11294. var getthemes = this.GetUser(AccountUser.get_themes);
  11295. for (var i = 0; i < getthemes.length; i++) {
  11296. if (getthemes[i] == _id) {
  11297. has = true;
  11298. }
  11299. }
  11300. return has;
  11301. };
  11302. AccountData.prototype.GetSkinDic = function (_config) {
  11303. };
  11304. AccountData.prototype.GetHeroProgress = function (_id) {
  11305. var config = this.m_user["progress_heroes"];
  11306. var progress = config[_id] ? config[_id] : 0;
  11307. return progress;
  11308. };
  11309. AccountData.prototype.GetHatProgress = function (_id) {
  11310. var config = this.m_user["progress_hats"];
  11311. var progress = config[_id] ? config[_id] : 0;
  11312. return progress;
  11313. };
  11314. AccountData.prototype.GetCbProgress = function (_id) {
  11315. var config = this.m_user["progress_dances"];
  11316. var progress = config[_id] ? config[_id] : 0;
  11317. return progress;
  11318. };
  11319. AccountData.prototype.HasMotor = function (_id) {
  11320. var data = this.GetUser(AccountUser.get_themes);
  11321. for (var i = 0; i < data.length; i++) {
  11322. var hd = data[i];
  11323. if (_id == hd) {
  11324. return true;
  11325. }
  11326. }
  11327. return false;
  11328. };
  11329. //获取皮肤的进度
  11330. AccountData.prototype.GetMotorProgress = function (_id) {
  11331. var config = this.m_user["progress_themes"];
  11332. var progress = config[_id] ? config[_id] : 0;
  11333. return progress;
  11334. };
  11335. AccountData.prototype.GetSeverConfig = function (_config) {
  11336. this.m_configs = _config;
  11337. this.GetSkinDic(this.m_configs);
  11338. this.GetRewardDic();
  11339. this.GetEntityDic();
  11340. // this.GetAchievementData();
  11341. var _globe = _config["global"];
  11342. for (var index = 0; index < _globe.length; index++) {
  11343. var element = _globe[index];
  11344. if (element.key == "tilirec") {
  11345. PlayerAccount.CurrentAccount.tilirec = Number(element.value);
  11346. return;
  11347. }
  11348. }
  11349. };
  11350. AccountData.prototype.UpdateSkinDic = function () {
  11351. this.GetSkinDic(this.m_configs);
  11352. };
  11353. AccountData.prototype.GetGlobe = function (_key) {
  11354. var globe = this.GetConfig(AccountConfig.global);
  11355. for (var key in globe) {
  11356. var obj = globe[key];
  11357. var kkk = obj["key"];
  11358. if (kkk == _key) {
  11359. var value = obj["value"];
  11360. return value;
  11361. }
  11362. }
  11363. return null;
  11364. };
  11365. return AccountData;
  11366. }());
  11367. exports.AccountData = AccountData;
  11368. var PlayerAccount = /** @class */ (function () {
  11369. function PlayerAccount(_code, _nickname, _avatar, _gender, _country, _province, _city, _device, _shareid, _scence, _ver) {
  11370. this.IsTest = false;
  11371. this.localTime = Laya.timer.currTimer;
  11372. this.Code = _code;
  11373. this.NickName = _nickname;
  11374. this.Avatar = _avatar;
  11375. this.Gender = _gender;
  11376. this.Country = _country;
  11377. this.Province = _province;
  11378. this.City = _city;
  11379. this.Device = _device;
  11380. this.ShareId = _shareid;
  11381. this.Scene = _scence;
  11382. this.ver = _ver;
  11383. this.IsTest = false;
  11384. PlayerAccount.instance = this;
  11385. }
  11386. Object.defineProperty(PlayerAccount, "CurrentAccount", {
  11387. get: function () {
  11388. if (PlayerAccount.instance == null) {
  11389. console.log("生成本地测试账号...");
  11390. return PlayerAccount.TestAccount;
  11391. }
  11392. return PlayerAccount.instance;
  11393. },
  11394. enumerable: true,
  11395. configurable: true
  11396. });
  11397. Object.defineProperty(PlayerAccount, "TestAccount", {
  11398. get: function () {
  11399. var code = Laya.LocalStorage.getItem("localcode");
  11400. if (!code) {
  11401. var time = new Date().getTime().toString();
  11402. var random = GameUtils_1.GameUtils.randRangeint(10000, 99999).toString();
  11403. code = "xj_" + time + random;
  11404. Laya.LocalStorage.setItem("localcode", code);
  11405. console.log(time, random);
  11406. console.log("新用户", code);
  11407. }
  11408. else {
  11409. console.log("老用户", code);
  11410. }
  11411. var curaccount = new PlayerAccount(code, null, null, null, null, null, null, null, null, null, null);
  11412. curaccount.IsTest = true;
  11413. return curaccount;
  11414. },
  11415. enumerable: true,
  11416. configurable: true
  11417. });
  11418. PlayerAccount.prototype.SetAccountData = function (data, completecb) {
  11419. var _this = this;
  11420. var token = data["token"];
  11421. var configs = data["configs"];
  11422. var app_setting = data["app_setting"];
  11423. var user = data["user"];
  11424. var user_base = data["user_base"];
  11425. var user_sign = data["user_sign"];
  11426. var user_achievement = data["user_achievement"];
  11427. var user_lottery = data["user_lottery"];
  11428. var user_land_task = data["user_land_task"];
  11429. var user_video = data["user_video"];
  11430. if (this.CurAccountData == null) {
  11431. Sdk_1.WxApi.recordAldEvent("开始获取config数据");
  11432. this.CurAccountData = new AccountData(token, configs, app_setting, user, user_base, null, null, user_sign, user_achievement, user_lottery, user_land_task, user_video);
  11433. this.CheckLocalConfig(data.table_version, function (_config) {
  11434. _this.CurAccountData.GetSeverConfig(_config);
  11435. _this.nowConfig = _config;
  11436. if (completecb != null) {
  11437. completecb.runWith(data);
  11438. }
  11439. });
  11440. }
  11441. else {
  11442. if (configs) {
  11443. this.CurAccountData.m_configs = configs;
  11444. }
  11445. if (app_setting) {
  11446. this.CurAccountData.m_app_setting = app_setting;
  11447. }
  11448. if (user) {
  11449. this.CurAccountData.m_user = user;
  11450. }
  11451. if (user_base) {
  11452. this.CurAccountData.m_user_base = user_base;
  11453. }
  11454. if (user_sign) {
  11455. this.CurAccountData.m_sign = user_sign;
  11456. }
  11457. if (user_achievement) {
  11458. this.CurAccountData.m_task = user_achievement;
  11459. }
  11460. if (user_lottery) {
  11461. this.CurAccountData.lottery = user_lottery;
  11462. }
  11463. if (user_land_task) {
  11464. this.CurAccountData.m_use_land_task = user_land_task;
  11465. }
  11466. if (user_video) {
  11467. this.CurAccountData.m_user_video = user_video;
  11468. }
  11469. }
  11470. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.updatePlayerInfo);
  11471. };
  11472. PlayerAccount.prototype.CheckLocalConfig = function (_ver, cb) {
  11473. var curconfig = Laya.LocalStorage.getJSON(PlayerAccount.localcofigkey);
  11474. if (curconfig) {
  11475. //Laya.LocalStorage.removeItem(PlayerAccount.localcofigkey);
  11476. if (curconfig.ver == _ver) {
  11477. console.log("sever配置是最新的...", _ver);
  11478. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  11479. cb(curconfig);
  11480. }
  11481. else {
  11482. NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) {
  11483. data.configs.ver = _ver;
  11484. Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs);
  11485. console.log("sever配置更新完成...", _ver);
  11486. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  11487. cb(data.configs);
  11488. }), Laya.Handler.create(this, function (data) {
  11489. console.log("配置获取失败" + data);
  11490. Sdk_1.WxApi.recordAldEvent("config接口获取失败");
  11491. }));
  11492. }
  11493. }
  11494. else {
  11495. NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) {
  11496. data.configs.ver = _ver;
  11497. Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs);
  11498. console.log("sever保存配置完成...", _ver);
  11499. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  11500. cb(data.configs);
  11501. }), Laya.Handler.create(this, function (data) {
  11502. console.log("配置获取失败" + data);
  11503. Sdk_1.WxApi.recordAldEvent("config接口获取失败");
  11504. }));
  11505. }
  11506. };
  11507. Object.defineProperty(PlayerAccount.prototype, "ServerTime", {
  11508. get: function () {
  11509. var time = Laya.timer.currTimer;
  11510. var stime = PlayerAccount.ServerTime + Math.ceil((time - this.localTime) / 1000);
  11511. return stime;
  11512. },
  11513. enumerable: true,
  11514. configurable: true
  11515. });
  11516. PlayerAccount.localcofigkey = "mconfig";
  11517. return PlayerAccount;
  11518. }());
  11519. exports.PlayerAccount = PlayerAccount;
  11520. },{"../Data/UserInfoEvent":34,"../WXSDK/Sdk":75,"../utils/DispatcherManager":83,"../utils/GameUtils":85,"./NetworkManager":71}],74:[function(require,module,exports){
  11521. "use strict";
  11522. Object.defineProperty(exports, "__esModule", { value: true });
  11523. var RecordManager = /** @class */ (function () {
  11524. function RecordManager() {
  11525. RecordManager.instance = this;
  11526. console.log("new record");
  11527. }
  11528. Object.defineProperty(RecordManager, "Instance", {
  11529. get: function () {
  11530. if (RecordManager.instance) {
  11531. return RecordManager.instance;
  11532. }
  11533. else {
  11534. var curmanager = new RecordManager();
  11535. curmanager.OnNew();
  11536. return curmanager;
  11537. }
  11538. },
  11539. enumerable: true,
  11540. configurable: true
  11541. });
  11542. RecordManager.prototype.RecordStart = function () {
  11543. if (!Laya.Browser.onMobile)
  11544. return;
  11545. console.log("RecordStart");
  11546. this.record.start({
  11547. duration: 60,
  11548. });
  11549. };
  11550. RecordManager.prototype.RecordStop = function () {
  11551. if (!Laya.Browser.onMobile)
  11552. return;
  11553. console.log("RecordStop");
  11554. this.record.stop();
  11555. };
  11556. RecordManager.prototype.ShareVideo = function (_cb) {
  11557. if (!Laya.Browser.onMobile)
  11558. return;
  11559. Laya.Browser.window.tt.shareAppMessage({
  11560. channel: "video",
  11561. query: "",
  11562. templateId: "266q4fgb8al7i3e7ie",
  11563. title: "赢得了我,认你做大哥又如何",
  11564. desc: "赢得了我,认你做大哥又如何",
  11565. extra: {
  11566. videoPath: this.completepath,
  11567. videoTopics: ["赢得了我,认你做大哥又如何"]
  11568. },
  11569. success: function () {
  11570. _cb && _cb(true);
  11571. console.log("分享视频成功");
  11572. },
  11573. fail: function (e) {
  11574. _cb && _cb(false);
  11575. console.log("分享视频失败");
  11576. }
  11577. });
  11578. };
  11579. RecordManager.prototype.OnNew = function () {
  11580. var _this = this;
  11581. if (!Laya.Browser.onMobile)
  11582. return;
  11583. this.record = Laya.Browser.window.tt.getGameRecorderManager();
  11584. this.record.onStart(function (res) {
  11585. // 录屏开始
  11586. console.log(res);
  11587. });
  11588. this.record.onStop(function (res) {
  11589. _this.completepath = res.videoPath;
  11590. console.log(res.videoPath);
  11591. });
  11592. };
  11593. return RecordManager;
  11594. }());
  11595. exports.RecordManager = RecordManager;
  11596. },{}],75:[function(require,module,exports){
  11597. "use strict";
  11598. Object.defineProperty(exports, "__esModule", { value: true });
  11599. var systemtype;
  11600. (function (systemtype) {
  11601. systemtype[systemtype["ios"] = 0] = "ios";
  11602. systemtype[systemtype["android"] = 1] = "android";
  11603. systemtype[systemtype["other"] = 2] = "other";
  11604. })(systemtype = exports.systemtype || (exports.systemtype = {}));
  11605. var WxApi = /** @class */ (function () {
  11606. function WxApi() {
  11607. }
  11608. WxApi.recordAldEvent = function (key, value) {
  11609. if (value === void 0) { value = ""; }
  11610. // if(Laya.Browser.window && Laya.Browser.window.wx)
  11611. // {
  11612. // Laya.Browser.window.wx.aldSendEvent(key,{key:value});
  11613. // }
  11614. console.log("事件: ", key);
  11615. };
  11616. WxApi.WXLogin = function (cb) {
  11617. var that = this;
  11618. Laya.Browser.window.wx.login({
  11619. success: function (res) {
  11620. if (res.code) {
  11621. console.log("code:", res.code);
  11622. cb(res);
  11623. }
  11624. else {
  11625. console.log('获取用户登录态失败!' + res.errMsg);
  11626. }
  11627. },
  11628. fail: function (res) { console.log("wx.login: failed, res=" + res); }
  11629. });
  11630. };
  11631. WxApi.WxInit = function () {
  11632. var _this = this;
  11633. if (!Laya.Browser.onWeiXin)
  11634. return;
  11635. Laya.Browser.window.wx.showShareMenu({
  11636. withShareTicket: true
  11637. });
  11638. Laya.Browser.window.wx.onShow(function (option) {
  11639. console.log(option);
  11640. _this.shareOpenId = option.query.userId;
  11641. _this.querychannel = option.query.channel;
  11642. if (option.referrerInfo) {
  11643. _this.referrerInfoappId = option.referrerInfo.appId;
  11644. console.log("onShow appId is:", option.referrerInfo.appId);
  11645. }
  11646. _this.sceneValue = option.scene;
  11647. var scene = Laya.LocalStorage.getItem("scene");
  11648. if (scene) {
  11649. _this.sceneValue = scene;
  11650. console.log("读取配置场景值:" + scene);
  11651. }
  11652. else {
  11653. console.log("第一次拉取场景值:" + _this.sceneValue);
  11654. Laya.LocalStorage.setItem("scene", _this.sceneValue);
  11655. }
  11656. });
  11657. };
  11658. WxApi.ShowLoading = function (title) {
  11659. if (title === void 0) { title = "加载中..."; }
  11660. // if (this.isShowing) return;
  11661. // this.isShowing = true;
  11662. // (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.showLoading({ title: title, mask: true });
  11663. };
  11664. WxApi.HideLoading = function () {
  11665. // this.isShowing = false;
  11666. // (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.hideLoading();
  11667. };
  11668. WxApi.aldSendOpenid = function (_openid) {
  11669. // if(Laya.Browser.onMiniGame)
  11670. // {
  11671. // console.log("aldSendOpenid",_openid);
  11672. // Laya.Browser.window.wx.aldSendOpenid(_openid);
  11673. // }
  11674. };
  11675. //检测更新
  11676. WxApi.CheckWXUpdate = function () {
  11677. var updateManager = Laya.Browser.window.tt.getUpdateManager();
  11678. updateManager.onCheckForUpdate(function (res) {
  11679. console.log("最新版本:" + res.hasUpdate);
  11680. });
  11681. updateManager.onUpdateReady(function () {
  11682. Laya.Browser.window.tt.showModal({
  11683. showCancel: false,
  11684. title: '更新提示',
  11685. content: '新版本已经准备好,是否重启应用?',
  11686. success: function (res) {
  11687. updateManager.applyUpdate();
  11688. },
  11689. fail: function (res) {
  11690. updateManager.applyUpdate();
  11691. }
  11692. });
  11693. });
  11694. };
  11695. WxApi.levelStart = function (stageId, stageName, userId) {
  11696. // console.log("开始记录关卡:" + stageId);
  11697. // if (Laya.Browser.window && Laya.Browser.window.wx) {
  11698. // Laya.Browser.window.wx.aldStage.onStart(
  11699. // {
  11700. // stageId: stageId, //关卡ID 该字段必传
  11701. // stageName: stageName, //关卡名称 该字段必传
  11702. // userId: userId //用户ID 可选
  11703. // }
  11704. // );
  11705. // if(WxApi.newaccount)
  11706. // {
  11707. // Laya.Browser.window.wx.aldStage.onStart(
  11708. // {
  11709. // stageId: "新用户:" + stageId, //关卡ID 该字段必传
  11710. // stageName: stageName, //关卡名称 该字段必传
  11711. // userId: userId //用户ID 可选
  11712. // }
  11713. // );
  11714. // }
  11715. // }
  11716. };
  11717. WxApi.levelRunning = function (stageId, stageName, userId, userevive) {
  11718. console.log("记录关卡中:" + stageId);
  11719. // if(Laya.Browser.window && Laya.Browser.window.wx)
  11720. // {
  11721. // Laya.Browser.window.wx.aldStage.onRunning({
  11722. // stageId : stageId, //关卡ID 该字段必传
  11723. // stageName : stageName, //关卡名称 该字段必传
  11724. // userId : userId, //用户ID 可选
  11725. // event : "revive", //使用道具 关卡进行中,用户触发的操作 该字段必传
  11726. // params : {
  11727. // itemName : "使用复活",//使用道具名称 该字段必传
  11728. // itemCount : 1, //使用道具数量 可选
  11729. // desc : userevive //使用道具描述
  11730. // }
  11731. // });
  11732. // if(WxApi.newaccount)
  11733. // {
  11734. // Laya.Browser.window.wx.aldStage.onRunning({
  11735. // stageId :"新用户:" + stageId, //关卡ID 该字段必传
  11736. // stageName : stageName, //关卡名称 该字段必传
  11737. // userId : userId, //用户ID 可选
  11738. // event : "revive", //使用道具 关卡进行中,用户触发的操作 该字段必传
  11739. // params : {
  11740. // itemName : "使用复活",//使用道具名称 该字段必传
  11741. // itemCount : 1, //使用道具数量 可选
  11742. // desc : userevive //使用道具描述
  11743. // }
  11744. // })
  11745. // }
  11746. // }
  11747. };
  11748. WxApi.levelSuccess = function (stageId, stageName, userId) {
  11749. console.log("记录关卡:完成" + stageId);
  11750. // if (Laya.Browser.window && Laya.Browser.window.wx) {
  11751. // Laya.Browser.window.wx.aldStage.onEnd(
  11752. // {
  11753. // stageId: stageId, //关卡ID 该字段必传
  11754. // stageName: stageName, //关卡名称 该字段必传
  11755. // userId: userId, //用户ID 可选
  11756. // event: "complete", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  11757. // params:
  11758. // {
  11759. // desc: "关卡完成" //描述
  11760. // }
  11761. // }
  11762. // );
  11763. // if(WxApi.newaccount)
  11764. // {
  11765. // Laya.Browser.window.wx.aldStage.onEnd(
  11766. // {
  11767. // stageId:"新用户:" + stageId, //关卡ID 该字段必传
  11768. // stageName: stageName, //关卡名称 该字段必传
  11769. // userId: userId, //用户ID 可选
  11770. // event: "complete", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  11771. // params:
  11772. // {
  11773. // desc: "关卡完成" //描述
  11774. // }
  11775. // }
  11776. // );
  11777. // }
  11778. // }
  11779. };
  11780. WxApi.levelFail = function (stageId, stageName, userId, score, carname) {
  11781. console.log("记录关卡:失败" + stageId);
  11782. // if (Laya.Browser.window && Laya.Browser.window.wx) {
  11783. // Laya.Browser.window.wx.aldStage.onEnd(
  11784. // {
  11785. // stageId: stageId, //关卡ID 该字段必传
  11786. // stageName: stageName, //关卡名称 该字段必传
  11787. // userId: userId, //用户ID 可选
  11788. // event: "fail", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  11789. // params:
  11790. // {
  11791. // desc: "失败",
  11792. // score: score,//描述
  11793. // car: carname//描述
  11794. // }
  11795. // }
  11796. // );
  11797. // if(WxApi.newaccount)
  11798. // {
  11799. // Laya.Browser.window.wx.aldStage.onEnd(
  11800. // {
  11801. // stageId:"新用户:" + stageId, //关卡ID 该字段必传
  11802. // stageName: stageName, //关卡名称 该字段必传
  11803. // userId: userId, //用户ID 可选
  11804. // event: "fail", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  11805. // params:
  11806. // {
  11807. // desc: "失败",
  11808. // score: score,//描述
  11809. // car: carname//描述
  11810. // }
  11811. // }
  11812. // );
  11813. // }
  11814. // }
  11815. };
  11816. WxApi.OnShow = function (cb) {
  11817. if (!Laya.Browser.window.tt)
  11818. return;
  11819. Laya.Browser.window.tt.onShow(cb);
  11820. };
  11821. WxApi.OffShow = function (cb) {
  11822. if (!Laya.Browser.onWeiXin)
  11823. return;
  11824. Laya.Browser.window.tt.offShow(cb);
  11825. };
  11826. WxApi.shake = function () {
  11827. Laya.Browser.window.tt.vibrateShort({});
  11828. };
  11829. WxApi.shakeLong = function () {
  11830. Laya.Browser.window.tt.vibrateLong({});
  11831. };
  11832. WxApi.Shake = function (_short) {
  11833. if (_short === void 0) { _short = true; }
  11834. if (Laya.Browser.window.tt && WxApi.CanShake) {
  11835. if (_short) {
  11836. this.shake();
  11837. }
  11838. else {
  11839. this.shakeLong();
  11840. }
  11841. }
  11842. if (!_short) {
  11843. this.stageShake();
  11844. }
  11845. };
  11846. WxApi.stageShake = function (callBack, speed) {
  11847. if (callBack === void 0) { callBack = null; }
  11848. if (speed === void 0) { speed = 32; }
  11849. if (this.isShake || !this.canshakestage)
  11850. return;
  11851. this.isShake = true;
  11852. var point = new Laya.Vector2(Laya.stage.x, Laya.stage.y);
  11853. Laya.stage.timerLoop(speed, this, this.shakeObject, [point, callBack]);
  11854. };
  11855. WxApi.shakeObject = function (_point, _callBack) {
  11856. var count = (this.num++) % 4;
  11857. this.offsetArr[this.num % 2] = count < 2 ? 0 : this.offset;
  11858. Laya.stage.x = this.offsetArr[0] + _point.x;
  11859. Laya.stage.y = this.offsetArr[1] + _point.y;
  11860. if (this.num > (this.times * 4 + 1)) {
  11861. Laya.stage.clearTimer(this, this.shakeObject);
  11862. Laya.stage.pos(0, 0);
  11863. this.num = 0;
  11864. this.isShake = false;
  11865. if (_callBack != null) {
  11866. _callBack();
  11867. }
  11868. }
  11869. };
  11870. WxApi.ShowTxt = function (text) {
  11871. if (Laya.Browser.window.tt) {
  11872. Laya.Browser.window.tt.showToast({ title: text });
  11873. }
  11874. else {
  11875. console.log(text);
  11876. }
  11877. };
  11878. Object.defineProperty(WxApi, "SystemFrom", {
  11879. get: function () {
  11880. if (!Laya.Browser.onWeiXin)
  11881. return systemtype.other;
  11882. var info = Laya.Browser.window.wx.getSystemInfoSync();
  11883. var system = info.system;
  11884. var IOS = system.indexOf("iOS") != -1;
  11885. var Android = system.indexOf("Android") != -1;
  11886. if (IOS) {
  11887. return systemtype.ios;
  11888. }
  11889. else if (Android) {
  11890. return systemtype.android;
  11891. }
  11892. else {
  11893. return systemtype.other;
  11894. }
  11895. },
  11896. enumerable: true,
  11897. configurable: true
  11898. });
  11899. Object.defineProperty(WxApi, "IsLongScreenSystem", {
  11900. get: function () {
  11901. if (!Laya.Browser.onWeiXin)
  11902. return false;
  11903. var systemInfo = Laya.Browser.window.wx.getSystemInfoSync();
  11904. var platformModel = "ipx";
  11905. if (systemInfo != null) {
  11906. var model = systemInfo.model;
  11907. platformModel = systemInfo.brand + "_" + model + "_" + systemInfo.system + "_wx" + systemInfo.version + "_SDKVer" + systemInfo.SDKVersion;
  11908. console.log("platformModel:" + platformModel);
  11909. return !(model.indexOf("X") < 0) ||
  11910. ((model.indexOf("oppo") >= 0 || model.indexOf("OPPO") >= 0) && (model.indexOf("R15") >= 0 || model.indexOf("r15") >= 0)) ||
  11911. systemInfo.statusBarHeight > 20 ||
  11912. (model.indexOf("Note") >= 0 && (model.indexOf("7") >= 0 || model.indexOf("8") >= 0)) ||
  11913. ((model.indexOf("iPhone") >= 0) && (model.indexOf("11") >= 0));
  11914. }
  11915. },
  11916. enumerable: true,
  11917. configurable: true
  11918. });
  11919. WxApi.writeStage = function (stage) {
  11920. var kvDataList = new Array();
  11921. var date = new Date().getTime();
  11922. var myValue = JSON.stringify({
  11923. "wxgame": {
  11924. "stage": stage,
  11925. "update_time": date.toString(),
  11926. }
  11927. });
  11928. kvDataList.push({ key: "stage", value: myValue });
  11929. if (Laya.Browser.window.wx) {
  11930. Laya.Browser.window.wx.setUserCloudStorage({
  11931. KVDataList: kvDataList,
  11932. success: function (r) {
  11933. console.log("上传分数成功");
  11934. }
  11935. });
  11936. }
  11937. };
  11938. WxApi.cpVersionGreaterOrEqual = function (v1, v2) {
  11939. console.log("[LOG]\u57FA\u7840\u5E93\u7248\u672C\u53F7 curVer:" + v1 + " targVer:" + v2);
  11940. var v1Arr = v1.split(".");
  11941. var v2Arr = v2.split(".");
  11942. var len = v1Arr.length;
  11943. if (v2Arr.length < len) {
  11944. len = v2Arr.length;
  11945. }
  11946. for (var i = 0; i < len; i++) {
  11947. var ver1 = Number(v1Arr[i]);
  11948. var ver2 = Number(v2Arr[i]);
  11949. if (ver1 > ver2) {
  11950. return true;
  11951. }
  11952. else if (ver1 < ver2) {
  11953. return false;
  11954. }
  11955. }
  11956. return v1Arr.length >= v2Arr.length;
  11957. };
  11958. WxApi.newaccount = false;
  11959. WxApi.sceneValue = "";
  11960. WxApi.shareOpenId = "";
  11961. WxApi.querychannel = "";
  11962. WxApi.referrerInfoappId = "";
  11963. //显示加载信息
  11964. WxApi.isShowing = false;
  11965. WxApi.CanShake = true;
  11966. WxApi.times = 1.3;
  11967. WxApi.num = 0;
  11968. WxApi.offsetArr = [0, 0];
  11969. WxApi.offset = 14;
  11970. WxApi.canshakestage = false;
  11971. return WxApi;
  11972. }());
  11973. exports.WxApi = WxApi;
  11974. },{}],76:[function(require,module,exports){
  11975. "use strict";
  11976. Object.defineProperty(exports, "__esModule", { value: true });
  11977. var DispatcherManager_1 = require("../utils/DispatcherManager");
  11978. var SocketNofify_1 = require("../WXSDK/SocketNofify");
  11979. var ServerSocket = /** @class */ (function () {
  11980. /**
  11981. * socket连接中
  11982. */
  11983. function ServerSocket() {
  11984. /**
  11985. * 1:自动断线,2:主动断线
  11986. */
  11987. this._offlinestate = 0;
  11988. /**
  11989. * 断线重连次数
  11990. */
  11991. this._connetNums = 0;
  11992. this._socketconneting = false;
  11993. ServerSocket.ins = this;
  11994. }
  11995. Object.defineProperty(ServerSocket, "Instance", {
  11996. get: function () {
  11997. if (ServerSocket.ins == null) {
  11998. return new ServerSocket();
  11999. }
  12000. return ServerSocket.ins;
  12001. },
  12002. enumerable: true,
  12003. configurable: true
  12004. });
  12005. //连接服务器
  12006. ServerSocket.prototype.connectServer = function (gameHost) {
  12007. this._socketconneting = true;
  12008. this.removeSocket();
  12009. if (!this.sock || !this.sock.connected) {
  12010. this.openwaitpanel();
  12011. if (!this.sock) {
  12012. this.sock = new Laya.Socket();
  12013. this.sock.on(Laya.Event.OPEN, this, this.onSocketOpen);
  12014. this.sock.on(Laya.Event.MESSAGE, this, this.onReceiveMessage);
  12015. this.sock.on(Laya.Event.CLOSE, this, this.onSocketClose);
  12016. this.sock.on(Laya.Event.ERROR, this, this.ioErro);
  12017. }
  12018. this.sock.connectByUrl(gameHost);
  12019. }
  12020. };
  12021. ServerSocket.prototype.isConnect = function () {
  12022. if (this.sock && this.sock.connected) {
  12023. return true;
  12024. }
  12025. return false;
  12026. };
  12027. ServerSocket.prototype.ioErro = function (e) {
  12028. if (e === void 0) { e = null; }
  12029. this._socketconneting = false;
  12030. this._connetNums++;
  12031. this.closewaitpanel();
  12032. this.removeSocket();
  12033. this._offlinestate = 1;
  12034. };
  12035. ServerSocket.prototype.removeSocket = function () {
  12036. this._socketconneting = false;
  12037. if (this.sock) {
  12038. this.sock.off(Laya.Event.OPEN, this, this.onSocketOpen);
  12039. this.sock.off(Laya.Event.MESSAGE, this, this.onReceiveMessage);
  12040. this.sock.off(Laya.Event.CLOSE, this, this.onSocketClose);
  12041. this.sock.off(Laya.Event.ERROR, this, this.ioErro);
  12042. this.sock.cleanSocket();
  12043. this.sock.close();
  12044. this.sock = null;
  12045. }
  12046. };
  12047. /**
  12048. * 手动关闭游戏socket
  12049. */
  12050. ServerSocket.prototype.colseSocket = function (offlinestate) {
  12051. if (offlinestate === void 0) { offlinestate = 1; }
  12052. if (this.isConnect()) {
  12053. this.closewaitpanel();
  12054. this.removeSocket();
  12055. if (offlinestate != -1) {
  12056. this._offlinestate = offlinestate;
  12057. }
  12058. DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CLOSE);
  12059. }
  12060. };
  12061. ServerSocket.prototype.onSocketClose = function (e) {
  12062. if (e === void 0) { e = null; }
  12063. this._socketconneting = false;
  12064. this.closewaitpanel();
  12065. this._offlinestate = 1;
  12066. DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CLOSE);
  12067. };
  12068. ServerSocket.prototype.closewaitpanel = function () {
  12069. fairygui.GRoot.inst.closeModalWait();
  12070. };
  12071. ServerSocket.prototype.openwaitpanel = function () {
  12072. fairygui.GRoot.inst.showModalWait();
  12073. };
  12074. //连接成功返回
  12075. ServerSocket.prototype.onSocketOpen = function (event) {
  12076. if (event === void 0) { event = null; }
  12077. this._connetNums = 0;
  12078. this.closewaitpanel();
  12079. this._offlinestate = 0;
  12080. DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CONNECT_SUCCEED, null, false);
  12081. };
  12082. //向服务端发送消息
  12083. ServerSocket.prototype.sendMessage = function (act, data, isShowWait) {
  12084. if (isShowWait === void 0) { isShowWait = true; }
  12085. if (this.sock && this.sock.connected) {
  12086. if (isShowWait) {
  12087. this.openwaitpanel();
  12088. }
  12089. if (!data) {
  12090. data = {};
  12091. }
  12092. data.ACTION = act;
  12093. this.sock.send(JSON.stringify(data));
  12094. }
  12095. else {
  12096. }
  12097. };
  12098. //消息返回后,会广播出去
  12099. //Global.addEventListener("你发送的cmd名称",监听方法,this)
  12100. ServerSocket.prototype.onReceiveMessage = function (msg) {
  12101. if (msg === void 0) { msg = null; }
  12102. var socketdata = JSON.parse(msg);
  12103. };
  12104. return ServerSocket;
  12105. }());
  12106. exports.ServerSocket = ServerSocket;
  12107. },{"../WXSDK/SocketNofify":77,"../utils/DispatcherManager":83}],77:[function(require,module,exports){
  12108. "use strict";
  12109. Object.defineProperty(exports, "__esModule", { value: true });
  12110. var SocketNofify = /** @class */ (function () {
  12111. function SocketNofify() {
  12112. }
  12113. /**
  12114. * socket连接成功
  12115. */
  12116. SocketNofify.SOCKET_CONNECT_SUCCEED = "SOCKET_CONNECT_SUCCEED";
  12117. /**
  12118. * socket关闭
  12119. */
  12120. SocketNofify.SOCKET_CLOSE = "SOCKET_CLOSE";
  12121. /**
  12122. * 游戏重新连接
  12123. */
  12124. SocketNofify.Game_againConnetSocket = "Game_againConnetSocket";
  12125. return SocketNofify;
  12126. }());
  12127. exports.SocketNofify = SocketNofify;
  12128. },{}],78:[function(require,module,exports){
  12129. "use strict";
  12130. Object.defineProperty(exports, "__esModule", { value: true });
  12131. var WECHATEVENT = /** @class */ (function () {
  12132. function WECHATEVENT() {
  12133. }
  12134. /**
  12135. * 游戏进入后台事件
  12136. */
  12137. WECHATEVENT.WECHATEVENT_onhide = "WECHATEVENT_onhide";
  12138. WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd = "WECHATEVENT_onAudioInterruptionEnd";
  12139. WECHATEVENT.WECHATEVENT_losefocus = "WECHATEVENT_losefocus";
  12140. WECHATEVENT.WECHATEVENT_getfocus = "WECHATEVENT_getfocus";
  12141. WECHATEVENT.WECHATEVENT_updateVideoNums = "WECHATEVENT_updateVideoNums";
  12142. /**
  12143. * 用户打点
  12144. */
  12145. WECHATEVENT.message_9891002 = "9891002";
  12146. /**
  12147. * 获取后台数据
  12148. */
  12149. WECHATEVENT.message_9891101 = "9891101";
  12150. WECHATEVENT.WECHATEVENT_loginSucceed = "WECHATEVENT_loginSucceed";
  12151. /**
  12152. * 游戏从后台恢复显示事件
  12153. */
  12154. WECHATEVENT.WECHATEVENT_onshow = "WECHATEVENT_onshow";
  12155. /**
  12156. * 从收藏或者浮窗进入游戏
  12157. */
  12158. WECHATEVENT.WECHATEVENT_fromscorfk = "WECHATEVENT_fromscorfk";
  12159. /**
  12160. * 登录
  12161. */
  12162. WECHATEVENT.message_9891001 = "9891001";
  12163. /**
  12164. * 广告点击
  12165. */
  12166. WECHATEVENT.message_9891102 = "9891102";
  12167. /**
  12168. * 点击确定跳转到外部游戏
  12169. */
  12170. WECHATEVENT.message_9891103 = "9891103";
  12171. return WECHATEVENT;
  12172. }());
  12173. exports.WECHATEVENT = WECHATEVENT;
  12174. },{}],79:[function(require,module,exports){
  12175. "use strict";
  12176. Object.defineProperty(exports, "__esModule", { value: true });
  12177. var GameUtils_1 = require("../utils/GameUtils");
  12178. var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
  12179. var Global_1 = require("../Global");
  12180. var DateControl_1 = require("../Control/DateControl");
  12181. var LocalDataControl_1 = require("../Control/LocalDataControl");
  12182. var UserDataInfo_1 = require("../Data/UserDataInfo");
  12183. var GlobalTip_1 = require("../utils/GlobalTip");
  12184. var DispatcherManager_1 = require("../utils/DispatcherManager");
  12185. var AudioControl_1 = require("../Control/AudioControl");
  12186. /*
  12187. * name;
  12188. */
  12189. var WXGamePlatform = /** @class */ (function () {
  12190. function WXGamePlatform() {
  12191. this.isShareing = false;
  12192. this.bannerRunTime = 0;
  12193. this._bannerTypeList = [];
  12194. this._screenwidth = 0;
  12195. this.bannerheight = 0;
  12196. this.bannerwidth = 0;
  12197. this.isonResize = false;
  12198. /**
  12199. * 排行榜打开类型存储
  12200. */
  12201. this._openrankDict = {};
  12202. WXGamePlatform.ins = this;
  12203. }
  12204. Object.defineProperty(WXGamePlatform, "Instance", {
  12205. get: function () {
  12206. if (WXGamePlatform.ins == null) {
  12207. return new WXGamePlatform();
  12208. }
  12209. return WXGamePlatform.ins;
  12210. },
  12211. enumerable: true,
  12212. configurable: true
  12213. });
  12214. WXGamePlatform.prototype.init = function () {
  12215. this.showShareMenu({ withShareTicket: true });
  12216. this.onAudioInterruptionBegin();
  12217. this.onAudioInterruptionEnd();
  12218. };
  12219. WXGamePlatform.prototype.initShareDian = function (data) {
  12220. if (data && data.length > 0) {
  12221. var itemd;
  12222. for (var s in data) {
  12223. itemd = data[s];
  12224. WXGamePlatform.ShareDict[itemd.key] = itemd;
  12225. }
  12226. var firstd = data[0];
  12227. this.onShareAppMessage(firstd.tile, Global_1.Global.cdnurl + firstd.img);
  12228. }
  12229. };
  12230. WXGamePlatform.prototype.initData = function () {
  12231. if (DateControl_1.DateControl.Fresh) {
  12232. WXGamePlatform.dayShareNum = 0;
  12233. WXGamePlatform.dayVideoNum = 0;
  12234. this.updateDayShareInfo();
  12235. this.updateDayVideoInfo();
  12236. }
  12237. else {
  12238. WXGamePlatform.dayShareNum = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.nowdayShare);
  12239. WXGamePlatform.dayVideoNum = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.nowdayVideo);
  12240. }
  12241. };
  12242. /**
  12243. * 存储当天分享的信息
  12244. */
  12245. WXGamePlatform.prototype.updateDayShareInfo = function () {
  12246. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.nowdayShare, WXGamePlatform.dayShareNum.toString());
  12247. };
  12248. WXGamePlatform.prototype.updateDayVideoInfo = function () {
  12249. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.nowdayVideo, WXGamePlatform.dayVideoNum.toString());
  12250. };
  12251. WXGamePlatform.prototype.createUserAndLogin = function (callobj, succeedcallback, progressCallback, failcallback) {
  12252. if (progressCallback === void 0) { progressCallback = null; }
  12253. if (failcallback === void 0) { failcallback = null; }
  12254. WXGamePlatform.loginCallobj = callobj;
  12255. WXGamePlatform.loginsucceedcallback = succeedcallback;
  12256. WXGamePlatform.loginprogressCallback = progressCallback;
  12257. var wx = Laya.Browser.window.wx;
  12258. if (wx) {
  12259. var login_info = WXGamePlatform.Instance.getLaunchOptionsSync();
  12260. if (login_info) {
  12261. var query = login_info.query;
  12262. if (query && query.ChanID) {
  12263. WXGamePlatform.QuDaoID = query.ChanID;
  12264. }
  12265. var referrerInfo = login_info.referrerInfo;
  12266. if (WXGamePlatform.QuDaoID == "" && referrerInfo && referrerInfo.appId) {
  12267. WXGamePlatform.QuDaoID = referrerInfo.appId;
  12268. }
  12269. if (login_info.scene) {
  12270. WXGamePlatform.fromscene = Number(login_info.scene);
  12271. }
  12272. }
  12273. var systemres = wx.getSystemInfoSync();
  12274. var version = systemres.SDKVersion;
  12275. if (wx.getUpdateManager) {
  12276. var updateManager = wx.getUpdateManager();
  12277. updateManager.onCheckForUpdate(function (res) {
  12278. // 请求完新版本信息的回调
  12279. if (res.hasUpdate == true) {
  12280. updateManager.onUpdateReady(function () {
  12281. Laya.Browser.window.wx.showModal({
  12282. title: '更新提示',
  12283. content: '新版本已经准备好,是否重启应用?',
  12284. success: function (res) {
  12285. if (res.confirm) {
  12286. // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
  12287. updateManager.applyUpdate();
  12288. }
  12289. else {
  12290. WXGamePlatform.Instance.exitGame();
  12291. }
  12292. }
  12293. });
  12294. });
  12295. updateManager.onUpdateFailed(function () {
  12296. // 新版本下载失败
  12297. WXGamePlatform.Instance.exitGame();
  12298. });
  12299. }
  12300. else {
  12301. // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback )
  12302. // {
  12303. // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 );
  12304. // }
  12305. var wxplatform = WXGamePlatform.Instance;
  12306. wxplatform.login(callobj, succeedcallback, failcallback);
  12307. }
  12308. });
  12309. }
  12310. else {
  12311. // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback )
  12312. // {
  12313. // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 );
  12314. // }
  12315. var wxplatform = WXGamePlatform.Instance;
  12316. wxplatform.login(callobj, succeedcallback, failcallback);
  12317. }
  12318. }
  12319. };
  12320. WXGamePlatform.prototype.createUserInfoButton = function (callobj, callback, failcallback) {
  12321. this.userinfocallobj = callobj;
  12322. this.userinfosuccallback = callback;
  12323. this.userinfofailcallback = failcallback;
  12324. var wx = Laya.Browser.window.wx;
  12325. var res = wx.getSystemInfoSync();
  12326. if (res) {
  12327. var posx = (res.windowWidth - 151) / 2;
  12328. var posy = res.windowHeight - 172 - 40;
  12329. WXGamePlatform.Instance.userinfobutton = wx.createUserInfoButton({
  12330. type: 'image',
  12331. image: 'wxlocal/login.png',
  12332. style: {
  12333. left: posx,
  12334. top: posy,
  12335. width: 151,
  12336. height: 72
  12337. }
  12338. });
  12339. WXGamePlatform.Instance.userinfobutton.onTap(WXGamePlatform.Instance.userinfoButtonClick);
  12340. }
  12341. };
  12342. /**
  12343. * 判断是否已经授权
  12344. */
  12345. WXGamePlatform.prototype.getaccredit = function (callobj, accreditCallback) {
  12346. if (WXGamePlatform.accreditstate == 0) {
  12347. var wx = Laya.Browser.window.wx;
  12348. if (wx) {
  12349. wx.getSetting({
  12350. success: function (res) {
  12351. var itemd = res.authSetting;
  12352. if (itemd.hasOwnProperty("scope.userInfo") && itemd["scope.userInfo"] == true) //已经授权过
  12353. {
  12354. if (accreditCallback && callobj) {
  12355. accreditCallback.call(callobj, true);
  12356. }
  12357. }
  12358. else {
  12359. if (accreditCallback && callobj) {
  12360. accreditCallback.call(callobj, false);
  12361. }
  12362. }
  12363. }
  12364. });
  12365. }
  12366. else {
  12367. if (accreditCallback && callobj) {
  12368. accreditCallback.call(callobj, true);
  12369. }
  12370. }
  12371. }
  12372. else {
  12373. if (accreditCallback && callobj) {
  12374. accreditCallback.call(callobj, true);
  12375. }
  12376. }
  12377. };
  12378. WXGamePlatform.prototype.userinfoButtonClick = function (res) {
  12379. var wxplatform = WXGamePlatform.Instance;
  12380. if (res) {
  12381. var errMsg = res.errMsg;
  12382. if (errMsg == "getUserInfo:ok") {
  12383. WXGamePlatform.accreditstate = 1;
  12384. wxplatform.closeuserinfobUtton();
  12385. wxplatform.getUserInfo(false, wxplatform.userinfocallobj, wxplatform.userinfosuccallback, wxplatform.userinfofailcallback);
  12386. }
  12387. else {
  12388. if (wxplatform.userinfocallobj && wxplatform.userinfofailcallback) {
  12389. wxplatform.userinfofailcallback.call(wxplatform.userinfocallobj);
  12390. }
  12391. }
  12392. }
  12393. };
  12394. WXGamePlatform.prototype.closeuserinfobUtton = function () {
  12395. var wxplatform = WXGamePlatform.Instance;
  12396. if (wxplatform.userinfobutton) {
  12397. wxplatform.userinfobutton.offTap(wxplatform.userinfoButtonClick);
  12398. wxplatform.userinfobutton.destroy();
  12399. wxplatform.userinfobutton = null;
  12400. }
  12401. };
  12402. WXGamePlatform.prototype.getUserInfo = function (islogin, callobj, callback, failcallback) {
  12403. fairygui.GRoot.inst.showModalWait();
  12404. var wxplatform = WXGamePlatform.Instance;
  12405. var wx = Laya.Browser.window.wx;
  12406. if (wx) {
  12407. wx.getUserInfo({
  12408. success: function (res) {
  12409. var userInfo = res.userInfo;
  12410. WXGamePlatform.nickName = userInfo.nickName;
  12411. if (islogin) {
  12412. wxplatform.login(callobj, callback, failcallback);
  12413. }
  12414. else {
  12415. if (callobj && callback) {
  12416. callback.call(callobj, WXGamePlatform.nickName);
  12417. }
  12418. }
  12419. }
  12420. });
  12421. }
  12422. };
  12423. /**
  12424. * 登录
  12425. * @param callobj
  12426. * @param succeedcallback
  12427. * @param failCallback
  12428. */
  12429. WXGamePlatform.prototype.login = function (callobj, callback, failcallback) {
  12430. var wxplatform = WXGamePlatform.Instance;
  12431. if (Laya.Browser.window.wx) {
  12432. Laya.Browser.window.wx.login({
  12433. success: function (res) {
  12434. WXGamePlatform.code = res.code;
  12435. var itemd = {};
  12436. if (WXGamePlatform.QuDaoID != "") {
  12437. itemd.ChanID = WXGamePlatform.QuDaoID;
  12438. }
  12439. itemd.Code = WXGamePlatform.code;
  12440. itemd.AppID = Global_1.Global.appid;
  12441. itemd.Version = Global_1.Global.gameVersion;
  12442. },
  12443. fail: function (res) {
  12444. wxplatform.login(callobj, callback, failcallback);
  12445. }
  12446. });
  12447. }
  12448. };
  12449. WXGamePlatform.prototype.loginSucceedCallback = function (data) {
  12450. if (WXGamePlatform.loginCallobj && WXGamePlatform.loginsucceedcallback) {
  12451. WXGamePlatform.loginsucceedcallback.call(WXGamePlatform.loginCallobj, data);
  12452. }
  12453. };
  12454. WXGamePlatform.prototype.loadSubpackage = function (name, subcallobj, subcallback, updatecallback, subfailcallback) {
  12455. if (Laya.Browser.window.wx) {
  12456. this._subcallobj = subcallobj;
  12457. this._subcallback = subcallback;
  12458. this._updatecallback = updatecallback;
  12459. this._subfailcallback = subfailcallback;
  12460. var wx = Laya.Browser.window.wx;
  12461. if (wx.loadSubpackage) {
  12462. var loadTask = wx.loadSubpackage({
  12463. name: name,
  12464. success: function (res) {
  12465. // 分包加载成功后通过 success 回调
  12466. var wxgamePlatform = WXGamePlatform.Instance;
  12467. if (wxgamePlatform._subcallback && wxgamePlatform._subcallobj) {
  12468. wxgamePlatform._subcallback.call(wxgamePlatform._subcallobj);
  12469. }
  12470. },
  12471. fail: function (res) {
  12472. // 分包加载失败通过 fail 回调
  12473. var wxgamePlatform = WXGamePlatform.Instance;
  12474. if (wxgamePlatform._subfailcallback && wxgamePlatform._subcallobj) {
  12475. wxgamePlatform._subfailcallback.call(wxgamePlatform._subcallobj);
  12476. }
  12477. }
  12478. });
  12479. if (loadTask.onProgressUpdate) {
  12480. loadTask.onProgressUpdate(function (res) {
  12481. var wxgamePlatform = WXGamePlatform.Instance;
  12482. if (wxgamePlatform._updatecallback && wxgamePlatform._subcallobj) {
  12483. wxgamePlatform._updatecallback.call(wxgamePlatform._subcallobj, res.progress);
  12484. }
  12485. });
  12486. }
  12487. }
  12488. else {
  12489. if (subcallobj && subcallback) {
  12490. subcallback.call(subcallobj);
  12491. }
  12492. }
  12493. }
  12494. else {
  12495. if (subcallobj && subcallback) {
  12496. subcallback.call(subcallobj);
  12497. }
  12498. }
  12499. };
  12500. /**
  12501. * 获取转发详细信息
  12502. * @param obj
  12503. * @param callobj
  12504. * @param succeedcallback
  12505. * @param failCallback
  12506. */
  12507. WXGamePlatform.prototype.getShareInfo = function (obj, callobj, succeedcallback, failCallback) {
  12508. if (failCallback === void 0) { failCallback = null; }
  12509. if (Laya.Browser.window.wx) {
  12510. Laya.Browser.window.wx.getShareInfo({
  12511. shareTicket: obj.shareTicket,
  12512. success: function (res) {
  12513. succeedcallback.call(callobj, res);
  12514. }
  12515. });
  12516. }
  12517. };
  12518. /**
  12519. * 监听用户点击右上角菜单的“转发”按钮时触发的事件
  12520. * @param title
  12521. * @param imageUrl
  12522. */
  12523. WXGamePlatform.prototype.onShareAppMessage = function (title, imageUrl) {
  12524. if (Laya.Browser.window.wx) {
  12525. Laya.Browser.window.wx.onShareAppMessage(function () {
  12526. return {
  12527. title: title,
  12528. imageUrl: imageUrl
  12529. };
  12530. });
  12531. }
  12532. };
  12533. /**
  12534. * 主动拉起转发,进入选择通讯录界面。
  12535. * @param title
  12536. * @param imageUrl
  12537. */
  12538. WXGamePlatform.prototype.shareAppMessage = function (d) {
  12539. if (Laya.Browser.window.wx) {
  12540. Laya.Browser.window.wx.shareAppMessage(d);
  12541. }
  12542. };
  12543. /**
  12544. * 显示当前页面的转发按钮
  12545. * @param obj
  12546. */
  12547. WXGamePlatform.prototype.showShareMenu = function (obj) {
  12548. if (obj === void 0) { obj = null; }
  12549. if (Laya.Browser.window.wx) {
  12550. Laya.Browser.window.wx.showShareMenu(obj);
  12551. }
  12552. };
  12553. /**
  12554. * 更新转发属性
  12555. * @param obj
  12556. */
  12557. WXGamePlatform.prototype.updateShareMenu = function (obj) {
  12558. if (obj === void 0) { obj = null; }
  12559. if (Laya.Browser.window.wx) {
  12560. Laya.Browser.window.wx.updateShareMenu(obj);
  12561. }
  12562. };
  12563. /**
  12564. * 显示当前页面的转发按钮
  12565. */
  12566. WXGamePlatform.prototype.showMenu = function () {
  12567. if (Laya.Browser.window.wx) {
  12568. Laya.Browser.window.wx.showShareMenu();
  12569. }
  12570. };
  12571. /**
  12572. * 本地存储
  12573. * @param key
  12574. * @param data
  12575. */
  12576. WXGamePlatform.prototype.setStorageSync = function (key, data) {
  12577. var wx = Laya.Browser.window.wx;
  12578. if (wx) {
  12579. wx.setStorageSync(key, data);
  12580. }
  12581. };
  12582. /**
  12583. * 获取本地存储
  12584. * @param key
  12585. */
  12586. WXGamePlatform.prototype.getStorageSync = function (key) {
  12587. var wx = Laya.Browser.window.wx;
  12588. if (wx) {
  12589. return wx.getStorageSync(key);
  12590. }
  12591. return null;
  12592. };
  12593. WXGamePlatform.prototype.setUserCloudStorage = function (obj, callobj, succeedcallback, failCallback) {
  12594. if (callobj === void 0) { callobj = null; }
  12595. if (succeedcallback === void 0) { succeedcallback = null; }
  12596. if (failCallback === void 0) { failCallback = null; }
  12597. var wx = Laya.Browser.window.wx;
  12598. if (wx && wx.setUserCloudStorage) {
  12599. wx.setUserCloudStorage({
  12600. KVDataList: obj,
  12601. success: function (res) {
  12602. if (succeedcallback) {
  12603. succeedcallback.call(callobj, res);
  12604. }
  12605. },
  12606. fail: function (res) {
  12607. if (failCallback) {
  12608. failCallback.call(callobj);
  12609. }
  12610. }
  12611. });
  12612. }
  12613. };
  12614. /**
  12615. * 显示消息提示框
  12616. * @param word
  12617. */
  12618. WXGamePlatform.prototype.toast = function (word) {
  12619. if (Laya.Browser.window.wx) {
  12620. Laya.Browser.window.wx.showToast({ title: word });
  12621. }
  12622. };
  12623. /**
  12624. * 向开放数据域发送消息
  12625. * @param obj
  12626. */
  12627. WXGamePlatform.prototype.postMessage = function (str, data) {
  12628. if (data === void 0) { data = null; }
  12629. var wx = Laya.Browser.window.wx;
  12630. if (wx) {
  12631. var context = wx.getOpenDataContext();
  12632. context.postMessage({ action: str, data: data });
  12633. }
  12634. };
  12635. /**
  12636. * 创建一个 InnerAudioContext 实例
  12637. */
  12638. WXGamePlatform.prototype.createInnerAudioContext = function () {
  12639. if (Laya.Browser.window.wx) {
  12640. return Laya.Browser.window.wx.createInnerAudioContext();
  12641. }
  12642. return null;
  12643. };
  12644. /**
  12645. * 获取系统信息
  12646. */
  12647. WXGamePlatform.prototype.getSystemInfoSync = function () {
  12648. if (Laya.Browser.window.wx) {
  12649. return Laya.Browser.window.wx.getSystemInfoSync();
  12650. }
  12651. return null;
  12652. };
  12653. /**
  12654. * 预览图片,调用之后会在新打开的页面中全屏预览传入的图片,预览的过程中用户可以进行保存图片、发送给朋友等操作
  12655. * @param obj
  12656. */
  12657. WXGamePlatform.prototype.previewImage = function (obj) {
  12658. if (Laya.Browser.window.wx) {
  12659. Laya.Browser.window.wx.previewImage(obj);
  12660. }
  12661. };
  12662. /**
  12663. * 监听小游戏隐藏到后台事件。锁屏、按 HOME 键退到桌面、显示在聊天顶部等操作会触发此事件。
  12664. * @param callobj
  12665. * @param succeedcallback
  12666. */
  12667. WXGamePlatform.prototype.onHide = function (callobj, succeedcallback) {
  12668. if (Laya.Browser.window.wx) {
  12669. Laya.Browser.window.wx.onHide(function (res) {
  12670. WXGamePlatform.isShowing = false;
  12671. if (succeedcallback && callobj) {
  12672. succeedcallback.call(callobj, res);
  12673. }
  12674. });
  12675. }
  12676. };
  12677. /**
  12678. * 返回小程序启动参数
  12679. * @param callobj
  12680. * @param succeedcallback
  12681. */
  12682. WXGamePlatform.prototype.getLaunchOptionsSync = function () {
  12683. if (Laya.Browser.window.wx) {
  12684. return Laya.Browser.window.wx.getLaunchOptionsSync();
  12685. }
  12686. return null;
  12687. };
  12688. /**
  12689. * 隐藏消息提示框
  12690. * @param obj
  12691. */
  12692. WXGamePlatform.prototype.hideToast = function (obj) {
  12693. if (Laya.Browser.window.wx) {
  12694. Laya.Browser.window.wx.hideToast(obj);
  12695. }
  12696. };
  12697. /**
  12698. * 显示模态对话框
  12699. * @param obj
  12700. */
  12701. WXGamePlatform.prototype.showModal = function (obj) {
  12702. if (Laya.Browser.window.wx) {
  12703. Laya.Browser.window.wx.showModal(obj);
  12704. }
  12705. };
  12706. /**
  12707. * 清理存储数据
  12708. */
  12709. WXGamePlatform.prototype.clearStorage = function () {
  12710. if (Laya.Browser.window.wx) {
  12711. Laya.Browser.window.wx.clearStorageSync();
  12712. }
  12713. };
  12714. /**
  12715. * 使手机发生较短时间的振动(15 ms)
  12716. * @param obj
  12717. */
  12718. WXGamePlatform.prototype.vibrateShort = function () {
  12719. if (Laya.Browser.window.wx) {
  12720. Laya.Browser.window.wx.vibrateShort();
  12721. }
  12722. };
  12723. /**
  12724. * 从本地缓存中移除指定 key
  12725. * @param key
  12726. */
  12727. WXGamePlatform.prototype.removeStorage = function (key) {
  12728. if (Laya.Browser.window.wx) {
  12729. Laya.Browser.window.wx.removeStorage(key);
  12730. }
  12731. };
  12732. WXGamePlatform.prototype.onAudioInterruptionBegin = function () {
  12733. if (Laya.Browser.window.wx) {
  12734. Laya.Browser.window.wx.onAudioInterruptionBegin(function () {
  12735. // SoundssManager.Instance.playbgSound("bgm");
  12736. AudioControl_1.AudioControl.Instance.ClearAllSOUND();
  12737. });
  12738. }
  12739. };
  12740. WXGamePlatform.prototype.onAudioInterruptionEnd = function () {
  12741. if (Laya.Browser.window.wx) {
  12742. Laya.Browser.window.wx.onAudioInterruptionEnd(function () {
  12743. var wxgameplatform = WXGamePlatform.Instance;
  12744. Laya.timer.clear(wxgameplatform, wxgameplatform.onAudioEndCallback);
  12745. Laya.timer.once(500, wxgameplatform, wxgameplatform.onAudioEndCallback);
  12746. });
  12747. }
  12748. };
  12749. WXGamePlatform.prototype.onAudioEndCallback = function () {
  12750. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd);
  12751. };
  12752. /**
  12753. * 退出游戏
  12754. */
  12755. WXGamePlatform.prototype.exitGame = function () {
  12756. var wx = Laya.Browser.window.wx;
  12757. if (wx) {
  12758. wx.exitMiniProgram();
  12759. }
  12760. };
  12761. /**
  12762. * 打开客服对话框
  12763. */
  12764. WXGamePlatform.prototype.openCustomerService = function () {
  12765. var wx = Laya.Browser.window.wx;
  12766. if (wx) {
  12767. var version = wx.getSystemInfoSync().SDKVersion;
  12768. if (GameUtils_1.GameUtils.compareVersion(version, '2.0.3') >= 0 && wx.openCustomerServiceConversation) {
  12769. wx.openCustomerServiceConversation({
  12770. showMessageCard: true,
  12771. sendMessageImg: "https://resource.51yoyoyo.com/res/wxsendmessageimg/smi.jpg"
  12772. });
  12773. }
  12774. else {
  12775. // AlertUtils.showWordTips("当前微信版本不支持");
  12776. }
  12777. }
  12778. };
  12779. /**
  12780. * 监听内存不足告警
  12781. */
  12782. WXGamePlatform.prototype.onMemoryWarning = function () {
  12783. var wx = Laya.Browser.window.wx;
  12784. if (wx && wx.onMemoryWarning) {
  12785. wx.onMemoryWarning(function () {
  12786. });
  12787. }
  12788. };
  12789. WXGamePlatform.prototype.onError = function () {
  12790. var wx = Laya.Browser.window.wx;
  12791. if (wx && wx.onError) {
  12792. wx.onError(function (res) {
  12793. console.log("*****onError", res);
  12794. });
  12795. }
  12796. };
  12797. /**
  12798. * 开始分享
  12799. */
  12800. WXGamePlatform.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) {
  12801. if (callobj === void 0) { callobj = null; }
  12802. if (succeedCallback === void 0) { succeedCallback = null; }
  12803. if (failCallback === void 0) { failCallback = null; }
  12804. WXGamePlatform.nowShareindex = 0;
  12805. if (WXGamePlatform.ShareDict[key]) {
  12806. this.shareApp(WXGamePlatform.ShareDict[key], callobj, succeedCallback, failCallback);
  12807. }
  12808. };
  12809. WXGamePlatform.prototype.shareApp = function (info, callobj, success, failCallback) {
  12810. this.nowshareObj = callobj;
  12811. this.nowshareinfo = info;
  12812. this.nowsharesucceedfun = success;
  12813. this.nowsharefailfun = failCallback;
  12814. this.startShareTime = Laya.Browser.now();
  12815. this.isShareing = true;
  12816. WXGamePlatform.callbackfailstate = 0;
  12817. this.shareAppMessage({
  12818. title: info.tile, imageUrl: Global_1.Global.cdnurl + info.img, query: "",
  12819. success: function (res) {
  12820. },
  12821. fail: function (res) {
  12822. GlobalTip_1.GlobalTip.Instance.showWordTips("您取消了分享");
  12823. if (failCallback && callobj) {
  12824. failCallback.call(callobj);
  12825. }
  12826. },
  12827. cancel: function (res) {
  12828. WXGamePlatform.callbackfailstate = 1;
  12829. }
  12830. });
  12831. };
  12832. /**
  12833. * 监听小游戏回到前台的事件
  12834. * @param callobj
  12835. * @param succeedcallback
  12836. * @param failCallback
  12837. */
  12838. WXGamePlatform.prototype.onShow = function (callobj, succeedcallback, failCallback) {
  12839. if (callobj === void 0) { callobj = null; }
  12840. if (succeedcallback === void 0) { succeedcallback = null; }
  12841. if (failCallback === void 0) { failCallback = null; }
  12842. this.showobj = callobj;
  12843. this.showCallback = succeedcallback;
  12844. var wx = Laya.Browser.window.wx;
  12845. if (wx) {
  12846. wx.onShow(function (res) {
  12847. WXGamePlatform.isShowing = true;
  12848. if (res && res.scene) {
  12849. WXGamePlatform.fromscene = Number(res.scene);
  12850. }
  12851. Laya.timer.frameOnce(1, WXGamePlatform.Instance, WXGamePlatform.Instance.onShowSucceed);
  12852. });
  12853. }
  12854. };
  12855. WXGamePlatform.prototype.onShowSucceed = function () {
  12856. var wxgameplatform = WXGamePlatform.Instance;
  12857. if (wxgameplatform.showobj && wxgameplatform.showCallback) {
  12858. wxgameplatform.showCallback.call(wxgameplatform.showobj);
  12859. }
  12860. if (wxgameplatform.isShareing) //如果是分享状态
  12861. {
  12862. wxgameplatform.isShareing = false;
  12863. var isShareSucceed = false;
  12864. if (WXGamePlatform.callbackfailstate == 0) {
  12865. var nowTime = Laya.Browser.now();
  12866. var disTime = (nowTime - wxgameplatform.startShareTime) / 1000;
  12867. if (disTime >= WXGamePlatform.ShareTime || WXGamePlatform.nowShareindex >= 3) {
  12868. isShareSucceed = true;
  12869. }
  12870. }
  12871. WXGamePlatform.callbackfailstate = 0;
  12872. if (isShareSucceed) {
  12873. WXGamePlatform.dayShareNum++;
  12874. wxgameplatform.updateDayShareInfo();
  12875. if (wxgameplatform.nowshareObj && wxgameplatform.nowsharesucceedfun) {
  12876. wxgameplatform.nowsharesucceedfun.call(wxgameplatform.nowshareObj);
  12877. }
  12878. }
  12879. else {
  12880. WXGamePlatform.nowShareindex++;
  12881. wxgameplatform.showModal({
  12882. title: "提示", content: "请每次分享到不同群,是否重新分享?", showCancel: true, cancelText: '取消', confirmText: '确定',
  12883. success: function (res) {
  12884. var wxplatform = WXGamePlatform.Instance;
  12885. if (res.confirm) {
  12886. WXGamePlatform.Instance.shareApp(wxplatform.nowshareinfo, wxplatform.nowshareObj, wxplatform.nowsharesucceedfun, wxplatform.nowsharefailfun);
  12887. }
  12888. else {
  12889. if (wxplatform.nowsharefailfun && wxplatform.nowshareObj) {
  12890. wxplatform.nowsharefailfun.call(wxplatform.nowshareObj);
  12891. }
  12892. }
  12893. },
  12894. fail: function () {
  12895. },
  12896. complete: function () {
  12897. }
  12898. });
  12899. }
  12900. }
  12901. };
  12902. /**
  12903. * 看视频领奖励
  12904. * @param callobj
  12905. * @param succeedcallback
  12906. */
  12907. WXGamePlatform.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) {
  12908. var _this = this;
  12909. if (callobj === void 0) { callobj = null; }
  12910. if (succeedcallback === void 0) { succeedcallback = null; }
  12911. if (failCallback === void 0) { failCallback = null; }
  12912. if (istongjiNum === void 0) { istongjiNum = true; }
  12913. var wx = Laya.Browser.window.wx;
  12914. if (wx && wx.createRewardedVideoAd) {
  12915. if (!WXGamePlatform.videoplaying) {
  12916. var time = this.lockVideoLeftTime();
  12917. if (time > 0) {
  12918. GlobalTip_1.GlobalTip.Instance.showWordTips("广告尚未准备好,请" + time + "秒后再试");
  12919. return;
  12920. }
  12921. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_losefocus);
  12922. WXGamePlatform.istongjiVideoNum = istongjiNum;
  12923. this.nowvideokey = key;
  12924. WXGamePlatform.videoplaying = true;
  12925. this.videocallobj = callobj;
  12926. this.videosucceedCallback = succeedcallback;
  12927. this.videofailCallback = failCallback;
  12928. this.videoAd = wx.createRewardedVideoAd({
  12929. adUnitId: 'adunit-0c687084c908ee89'
  12930. });
  12931. this.videoAd.onClose(this.closeAD);
  12932. this.videoAd.onError(this.onerro);
  12933. this.videoAd.load().then(function () { return _this.videoAd.show(); }).catch(function (err) { console.log(err.errMsg), WXGamePlatform.Instance.failVideo(); });
  12934. }
  12935. }
  12936. };
  12937. WXGamePlatform.prototype.lockVideoLeftTime = function () {
  12938. var time = (Laya.Browser.now() - WXGamePlatform.lastVideoTime) / 1000;
  12939. time = WXGamePlatform.VideoTime - time;
  12940. return Math.ceil(time);
  12941. };
  12942. WXGamePlatform.prototype.onerro = function (res) {
  12943. var wxgamePlatform = WXGamePlatform.Instance;
  12944. WXGamePlatform.videoplaying = false;
  12945. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  12946. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  12947. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  12948. };
  12949. // 关闭广告
  12950. WXGamePlatform.prototype.closeAD = function (status) {
  12951. WXGamePlatform.lastVideoTime = Laya.Browser.now();
  12952. var wxgamePlatform = WXGamePlatform.Instance;
  12953. if (status && status.isEnded || status == undefined) {
  12954. if (WXGamePlatform.istongjiVideoNum) {
  12955. WXGamePlatform.dayVideoNum++;
  12956. wxgamePlatform.updateDayVideoInfo();
  12957. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_updateVideoNums);
  12958. }
  12959. if (wxgamePlatform.videocallobj && wxgamePlatform.videosucceedCallback) {
  12960. wxgamePlatform.videosucceedCallback.call(wxgamePlatform.videocallobj);
  12961. }
  12962. }
  12963. else {
  12964. GlobalTip_1.GlobalTip.Instance.showWordTips("未观看完整视频,无法获得奖励");
  12965. if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) {
  12966. wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj);
  12967. }
  12968. }
  12969. WXGamePlatform.videoplaying = false;
  12970. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  12971. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  12972. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  12973. };
  12974. // 广告失败
  12975. WXGamePlatform.prototype.failVideo = function () {
  12976. WXGamePlatform.lastVideoTime = Laya.Browser.now();
  12977. WXGamePlatform.videoplaying = false;
  12978. GlobalTip_1.GlobalTip.Instance.showWordTips("广告加载失败,试试别的方式吧~");
  12979. var wxgamePlatform = WXGamePlatform.Instance;
  12980. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  12981. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  12982. if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) {
  12983. wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj);
  12984. }
  12985. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  12986. };
  12987. WXGamePlatform.prototype.isCanVideo = function () {
  12988. if (WXGamePlatform.dayVideoNum < WXGamePlatform.VideoNum) {
  12989. if (WXGamePlatform.dayVideoNum == 0) {
  12990. return true;
  12991. }
  12992. var videobs = Math.floor(WXGamePlatform.dayVideoNum / WXGamePlatform.VideotoShare);
  12993. var sharebs = Math.floor(WXGamePlatform.dayShareNum / WXGamePlatform.SharetoVideo);
  12994. if (videobs > sharebs) {
  12995. return false;
  12996. }
  12997. else if (videobs < sharebs) {
  12998. return true;
  12999. }
  13000. else {
  13001. var videoyushu = WXGamePlatform.dayVideoNum % WXGamePlatform.VideotoShare;
  13002. if (videoyushu != 0) {
  13003. return true;
  13004. }
  13005. var shareyushu = WXGamePlatform.dayShareNum % WXGamePlatform.SharetoVideo;
  13006. if (shareyushu != 0) {
  13007. return false;
  13008. }
  13009. return true;
  13010. }
  13011. }
  13012. return false;
  13013. };
  13014. WXGamePlatform.prototype.createBanner = function (bannertype, style) {
  13015. if (bannertype === void 0) { bannertype = ""; }
  13016. if (Laya.Browser.window.wx) {
  13017. if (bannertype != "") {
  13018. var bo = false;
  13019. for (var i = 0; i < this._bannerTypeList.length; i++) {
  13020. if (bannertype == this._bannerTypeList[i].type) {
  13021. this._bannerTypeList[i].style = style;
  13022. var arr = this._bannerTypeList.splice(i, 1);
  13023. this._bannerTypeList.push(arr[0]);
  13024. bo = true;
  13025. break;
  13026. }
  13027. }
  13028. if (!bo) {
  13029. this._bannerTypeList.push({ type: bannertype, style: style });
  13030. }
  13031. }
  13032. else {
  13033. if (this._bannerTypeList.length == 0) {
  13034. return;
  13035. }
  13036. else {
  13037. var item = this._bannerTypeList[this._bannerTypeList.length - 1];
  13038. style = item.style;
  13039. }
  13040. }
  13041. if (this.bannerAd) {
  13042. var now = Laya.Browser.now();
  13043. //超过3分钟刷新
  13044. if (now - this.bannerRunTime > 60000 * 3) {
  13045. this.bannerAd.offError(this.bannerError);
  13046. this.bannerAd.offResize(this.bannerResize);
  13047. this.bannerAd.destory();
  13048. this.createNewBanner(style);
  13049. }
  13050. else {
  13051. this.showBanner(style);
  13052. }
  13053. }
  13054. else {
  13055. this.createNewBanner(style);
  13056. }
  13057. }
  13058. };
  13059. WXGamePlatform.prototype.createNewBanner = function (style) {
  13060. var wx = Laya.Browser.window.wx;
  13061. if (wx && wx.createBannerAd) {
  13062. this.nowStype = style;
  13063. this.bannerRunTime = Laya.Browser.now();
  13064. var info = this.getSystemInfoSync();
  13065. this._screenwidth = info.screenWidth;
  13066. var scale = 1;
  13067. if (style.hasOwnProperty("scale")) {
  13068. scale = style.scale;
  13069. }
  13070. this.bannerAd = wx.createBannerAd({
  13071. adUnitId: 'adunit-8c2d586135fa6d4f',
  13072. adIntervals: 30,
  13073. style: {
  13074. left: 0,
  13075. top: info.screenHeight - 105,
  13076. width: info.screenWidth * scale
  13077. }
  13078. });
  13079. if (this.bannerAd) {
  13080. this.bannerAd.onError(this.bannerError);
  13081. this.showBanner(style);
  13082. }
  13083. }
  13084. };
  13085. WXGamePlatform.prototype.bannerResize = function (res) {
  13086. var self = WXGamePlatform.Instance;
  13087. self.bannerAd.offResize(self.bannerResize);
  13088. self.isonResize = false;
  13089. var nowstype = self.nowStype;
  13090. if (!nowstype) {
  13091. return;
  13092. }
  13093. var info = self.getSystemInfoSync();
  13094. var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight;
  13095. var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth;
  13096. self.bannerwidth = res.width;
  13097. self.bannerheight = res.height;
  13098. if (nowstype.hasOwnProperty("x") && nowstype.x != 0) {
  13099. self.bannerAd.style.left = nowstype.x * percentageW;
  13100. }
  13101. else {
  13102. self.bannerAd.style.left = (info.windowWidth - res.width) * 0.5;
  13103. }
  13104. if (nowstype.hasOwnProperty("y") && nowstype.y != 0) {
  13105. self.bannerAd.style.top = nowstype.y * percentageH;
  13106. }
  13107. else {
  13108. self.bannerAd.style.top = (info.windowHeight - res.height) - 15;
  13109. }
  13110. };
  13111. WXGamePlatform.prototype.bannerError = function (err) {
  13112. };
  13113. WXGamePlatform.prototype.showBanner = function (style) {
  13114. if (this.bannerAd) {
  13115. this.nowStype = style;
  13116. var info = this.getSystemInfoSync();
  13117. var nowstype = this.nowStype;
  13118. var scale = 1;
  13119. if (nowstype.hasOwnProperty("scale")) {
  13120. scale = nowstype.scale;
  13121. }
  13122. var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight;
  13123. var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth;
  13124. if (nowstype.hasOwnProperty("x") && nowstype.x != 0) {
  13125. this.bannerAd.style.left = nowstype.x * percentageW;
  13126. }
  13127. else {
  13128. this.bannerAd.style.left = (info.windowWidth - this.bannerwidth) * 0.5;
  13129. }
  13130. if (nowstype.hasOwnProperty("y") && nowstype.y != 0) {
  13131. this.bannerAd.style.top = nowstype.y * percentageH;
  13132. }
  13133. else {
  13134. this.bannerAd.style.top = (info.windowHeight - this.bannerheight) - 15;
  13135. }
  13136. this.bannerAd.style.width = info.screenWidth * scale;
  13137. if (!this.isonResize) {
  13138. this.isonResize = true;
  13139. this.bannerAd.onResize(this.bannerResize);
  13140. }
  13141. this.bannerAd.show();
  13142. }
  13143. };
  13144. WXGamePlatform.prototype.hideBanner = function (type) {
  13145. if (type === void 0) { type = ""; }
  13146. if (this.bannerAd) {
  13147. this.bannerAd.hide();
  13148. }
  13149. if (type != "") {
  13150. for (var i = 0; i < this._bannerTypeList.length; i++) {
  13151. if (type == this._bannerTypeList[i].type) {
  13152. this._bannerTypeList.splice(i, 1);
  13153. break;
  13154. }
  13155. }
  13156. if (this._bannerTypeList.length > 0) {
  13157. var item = this._bannerTypeList[this._bannerTypeList.length - 1];
  13158. this.createBanner(item.type, item.style);
  13159. }
  13160. }
  13161. };
  13162. // private _wxOpenDataViewer:WXOpenDataViewer;
  13163. /**
  13164. * 打开好友排行榜
  13165. */
  13166. WXGamePlatform.prototype.openFriendRank = function (type, viewType, rect, parent, data) {
  13167. if (parent === void 0) { parent = null; }
  13168. if (data === void 0) { data = null; }
  13169. this.closeziyuStage();
  13170. this._openrankDict[viewType] = { type: type, viewType: viewType, rect: rect, parent: parent, data: data };
  13171. this.initziyuStage(rect, parent);
  13172. this.postMessage(type, data);
  13173. };
  13174. /**
  13175. * 排行榜打开状态时候,切换显示类型
  13176. * @param type
  13177. */
  13178. WXGamePlatform.prototype.changeFriendRank = function (type) {
  13179. this.postMessage(type);
  13180. };
  13181. /**
  13182. * 排行榜上一页
  13183. */
  13184. WXGamePlatform.prototype.prePageRank = function () {
  13185. };
  13186. /**
  13187. * 排行榜下一页
  13188. */
  13189. WXGamePlatform.prototype.nextPageRank = function () {
  13190. };
  13191. /**
  13192. * 关闭好友排行榜
  13193. */
  13194. WXGamePlatform.prototype.closeFriendRank = function (viewType) {
  13195. this.closeziyuStage();
  13196. if (this._openrankDict[viewType]) {
  13197. delete this._openrankDict[viewType];
  13198. }
  13199. for (var s in this._openrankDict) {
  13200. var itemd = this._openrankDict[s];
  13201. this.openFriendRank(itemd.type, itemd.viewType, itemd.rect, itemd.parent, itemd.data);
  13202. break;
  13203. }
  13204. };
  13205. /**
  13206. * 初始化子域
  13207. * @param rect
  13208. * @param parent
  13209. */
  13210. WXGamePlatform.prototype.initziyuStage = function (rect, parent) {
  13211. // if( !this._wxOpenDataViewer )
  13212. // {
  13213. // this._wxOpenDataViewer = new WXOpenDataViewer();
  13214. // if( parent )
  13215. // {
  13216. // parent.addChild( this._wxOpenDataViewer );
  13217. // }
  13218. // else
  13219. // {
  13220. // GameLayerManager.Instance.topLayer.displayObject.addChild( this._wxOpenDataViewer );
  13221. // }
  13222. // }
  13223. // this._wxOpenDataViewer.x = rect.x;
  13224. // this._wxOpenDataViewer.y = rect.y;
  13225. // this._wxOpenDataViewer.width = rect.width;
  13226. // this._wxOpenDataViewer.height = rect.height;
  13227. };
  13228. /**
  13229. * 销毁子域
  13230. */
  13231. WXGamePlatform.prototype.closeziyuStage = function () {
  13232. // if( this._wxOpenDataViewer )
  13233. // {
  13234. // this._wxOpenDataViewer.destroy();
  13235. // this._wxOpenDataViewer.removeSelf();
  13236. // this._wxOpenDataViewer = null;
  13237. // }
  13238. };
  13239. /**
  13240. * 数据上传(用于排行榜数据显示)
  13241. * @param param1 上报数据
  13242. * @param param2 上报数据
  13243. */
  13244. WXGamePlatform.prototype.storeToCloud = function (param1, param2) {
  13245. var cacheMager = LocalDataControl_1.LocalDataControl.Instance;
  13246. var score1 = cacheMager.getnum("param1");
  13247. // var score2:number = cacheMager.getnum( "param2" );
  13248. param1 = Math.floor(param1);
  13249. param2 = Math.floor(param2);
  13250. var result1 = param1;
  13251. var result2 = param2;
  13252. if (result1 < score1) {
  13253. result1 = score1;
  13254. }
  13255. else {
  13256. cacheMager.addstr("param1", result1.toString());
  13257. }
  13258. var arr = [];
  13259. arr.push({ key: "param1", value: result1.toString() });
  13260. arr.push({ key: "param2", value: result2 + "" });
  13261. this.setUserCloudStorage(arr);
  13262. };
  13263. WXGamePlatform.prototype.createGameClubButton = function (style, icon) {
  13264. if (icon === void 0) { icon = "green"; }
  13265. var wx = Laya.Browser.window.wx;
  13266. if (wx && style) {
  13267. style.width = 40;
  13268. style.height = 40;
  13269. WXGamePlatform.gameclubButton = wx.createGameClubButton({
  13270. icon: icon,
  13271. style: style
  13272. });
  13273. if (WXGamePlatform.gameclubButton) {
  13274. WXGamePlatform.gameclubButton.show();
  13275. }
  13276. }
  13277. };
  13278. WXGamePlatform.QuDaoID = ""; //微信广告ID
  13279. WXGamePlatform.isShowing = true;
  13280. /**
  13281. * 授权状态 0:未判断,1:已授权
  13282. */
  13283. WXGamePlatform.accreditstate = 0;
  13284. /**
  13285. * 当天分享次数
  13286. */
  13287. WXGamePlatform.dayShareNum = 0;
  13288. /**
  13289. * 当天看视频次数
  13290. */
  13291. WXGamePlatform.dayVideoNum = 0;
  13292. /**
  13293. * 判断分享是否成功时间间隔
  13294. */
  13295. WXGamePlatform.ShareTime = 0;
  13296. /**
  13297. * 每日最大看视频次数(成功累加一次)
  13298. */
  13299. WXGamePlatform.VideoNum = 0;
  13300. /**
  13301. * 看视频冷却时间
  13302. */
  13303. WXGamePlatform.VideoTime = 0;
  13304. /**
  13305. * 8好位cpa可弹出时间间隔(秒)
  13306. */
  13307. WXGamePlatform.jiliweitime = 100;
  13308. /**
  13309. * 分享几次切换到视频
  13310. */
  13311. WXGamePlatform.SharetoVideo = 1;
  13312. /**
  13313. * 视频几次切换到分享
  13314. */
  13315. WXGamePlatform.VideotoShare = 1;
  13316. /**
  13317. * 分享数据容器
  13318. */
  13319. WXGamePlatform.ShareDict = {};
  13320. /**
  13321. * 用户来源id
  13322. */
  13323. WXGamePlatform.fromscene = 0;
  13324. WXGamePlatform.nowShareindex = 0;
  13325. WXGamePlatform.callbackfailstate = 0;
  13326. WXGamePlatform.lastVideoTime = 0;
  13327. /**
  13328. * 视频是否在播放中
  13329. */
  13330. WXGamePlatform.videoplaying = false;
  13331. WXGamePlatform.istongjiVideoNum = true;
  13332. return WXGamePlatform;
  13333. }());
  13334. exports.WXGamePlatform = WXGamePlatform;
  13335. },{"../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){
  13336. "use strict";
  13337. Object.defineProperty(exports, "__esModule", { value: true });
  13338. var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
  13339. var PlatfromType_1 = require("./PlatfromType");
  13340. var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
  13341. var Global_1 = require("../Global");
  13342. var DispatcherManager_1 = require("../utils/DispatcherManager");
  13343. var TimesTamper_1 = require("../Time/TimesTamper");
  13344. var DateControl_1 = require("../Control/DateControl");
  13345. var AudioControl_1 = require("../Control/AudioControl");
  13346. /*
  13347. * name;
  13348. */
  13349. var pingtaiutils = /** @class */ (function () {
  13350. function pingtaiutils() {
  13351. this._isenable = false;
  13352. pingtaiutils.ins = this;
  13353. }
  13354. Object.defineProperty(pingtaiutils, "Instance", {
  13355. get: function () {
  13356. if (pingtaiutils.ins == null) {
  13357. return new pingtaiutils();
  13358. }
  13359. return pingtaiutils.ins;
  13360. },
  13361. enumerable: true,
  13362. configurable: true
  13363. });
  13364. /**
  13365. * 初始化平台
  13366. */
  13367. pingtaiutils.prototype.initPlatfrom = function () {
  13368. if (Laya.Browser.window.tt) {
  13369. Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.tt;
  13370. }
  13371. else if (Laya.Browser.window.wx) //微信小游戏
  13372. {
  13373. Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.wx;
  13374. }
  13375. else {
  13376. Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.pc;
  13377. }
  13378. };
  13379. pingtaiutils.prototype.init = function () {
  13380. this.initPlatfrom();
  13381. // switch( Global.nowplatfrom )
  13382. // {
  13383. // case PlatfromType.wx:
  13384. // WXGamePlatform.Instance.init();
  13385. // break;
  13386. // case PlatfromType.qq:
  13387. // break;
  13388. // default:
  13389. // break;
  13390. // }
  13391. // this.onShow( this,this.showcallback );
  13392. // this.onHide(this,this.hidecallback);
  13393. };
  13394. pingtaiutils.prototype.initData = function () {
  13395. DateControl_1.DateControl.Instance.SetSelf();
  13396. switch (Global_1.Global.nowplatfrom) {
  13397. case PlatfromType_1.PlatfromType.wx:
  13398. WXGamePlatform_1.WXGamePlatform.Instance.initData();
  13399. break;
  13400. default:
  13401. break;
  13402. }
  13403. };
  13404. /**
  13405. * 合违规判断 true:合规,false:违规
  13406. */
  13407. pingtaiutils.checkEnable = function () {
  13408. if (pingtaiutils.islegal == 1) {
  13409. return true;
  13410. }
  13411. return false;
  13412. };
  13413. pingtaiutils.prototype.login = function (callobj, succeedcallback, progressCallback, failcallback) {
  13414. if (callobj === void 0) { callobj = null; }
  13415. if (succeedcallback === void 0) { succeedcallback = null; }
  13416. if (progressCallback === void 0) { progressCallback = null; }
  13417. if (failcallback === void 0) { failcallback = null; }
  13418. fairygui.GRoot.inst.showModalWait();
  13419. this._logincallobj = callobj;
  13420. this._loginsucceedcallback = succeedcallback;
  13421. switch (Global_1.Global.nowplatfrom) {
  13422. case PlatfromType_1.PlatfromType.wx:
  13423. WXGamePlatform_1.WXGamePlatform.Instance.createUserAndLogin(this, this.loginSucceed, this.loginprogressCallback, this.loginfailcallback);
  13424. break;
  13425. default:
  13426. this.loginSucceed(null);
  13427. break;
  13428. }
  13429. };
  13430. pingtaiutils.prototype.loginprogressCallback = function (value) {
  13431. };
  13432. pingtaiutils.prototype.loginSucceed = function (data) {
  13433. fairygui.GRoot.inst.closeModalWait();
  13434. };
  13435. pingtaiutils.prototype.loginfailcallback = function () {
  13436. };
  13437. pingtaiutils.prototype.onShow = function (callobj, succeedcallback, failCallback) {
  13438. if (callobj === void 0) { callobj = null; }
  13439. if (succeedcallback === void 0) { succeedcallback = null; }
  13440. if (failCallback === void 0) { failCallback = null; }
  13441. switch (Global_1.Global.nowplatfrom) {
  13442. case PlatfromType_1.PlatfromType.wx:
  13443. WXGamePlatform_1.WXGamePlatform.Instance.onShow(callobj, succeedcallback, failCallback);
  13444. break;
  13445. case PlatfromType_1.PlatfromType.qq:
  13446. break;
  13447. }
  13448. };
  13449. pingtaiutils.prototype.showcallback = function () {
  13450. Laya.timer.clear(this, this.againplaybgSound);
  13451. Laya.timer.once(500, this, this.againplaybgSound);
  13452. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onshow);
  13453. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  13454. var fromscene = pingtaiutils.fromscene();
  13455. if (fromscene == 1089 || fromscene == 1131) {
  13456. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_fromscorfk);
  13457. }
  13458. };
  13459. pingtaiutils.prototype.againplaybgSound = function () {
  13460. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd);
  13461. };
  13462. pingtaiutils.prototype.onHide = function (callobj, succeedcallback) {
  13463. if (callobj === void 0) { callobj = null; }
  13464. if (succeedcallback === void 0) { succeedcallback = null; }
  13465. switch (Global_1.Global.nowplatfrom) {
  13466. case PlatfromType_1.PlatfromType.wx:
  13467. WXGamePlatform_1.WXGamePlatform.Instance.onHide(callobj, succeedcallback);
  13468. break;
  13469. case PlatfromType_1.PlatfromType.qq:
  13470. break;
  13471. }
  13472. };
  13473. pingtaiutils.prototype.hidecallback = function () {
  13474. TimesTamper_1.TimesTamper.Instance.sendonlineTongji();
  13475. AudioControl_1.AudioControl.Instance.ClearAllSOUND();
  13476. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onhide);
  13477. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_losefocus);
  13478. };
  13479. Object.defineProperty(pingtaiutils.prototype, "isshow", {
  13480. /**
  13481. * 当前游戏是否在显示中
  13482. */
  13483. get: function () {
  13484. var bo = true;
  13485. switch (Global_1.Global.nowplatfrom) {
  13486. case PlatfromType_1.PlatfromType.wx:
  13487. if (WXGamePlatform_1.WXGamePlatform.isShowing) {
  13488. bo = true;
  13489. }
  13490. bo = false;
  13491. break;
  13492. }
  13493. return bo;
  13494. },
  13495. enumerable: true,
  13496. configurable: true
  13497. });
  13498. /**
  13499. * 分包加载
  13500. */
  13501. pingtaiutils.prototype.loadSubpackage = function (typename, callobj, callback, callprogress, failcallback) {
  13502. if (failcallback === void 0) { failcallback = null; }
  13503. switch (Global_1.Global.nowplatfrom) {
  13504. case PlatfromType_1.PlatfromType.wx:
  13505. WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage(typename, callobj, callback, callprogress, failcallback);
  13506. break;
  13507. default:
  13508. if (callobj && callback) {
  13509. callback.call(callobj);
  13510. }
  13511. break;
  13512. }
  13513. };
  13514. /**
  13515. * 获取是否已经授权
  13516. * @param callobj
  13517. * @param callback
  13518. */
  13519. pingtaiutils.prototype.isaccredit = function (callobj, accreditCallback) {
  13520. switch (Global_1.Global.nowplatfrom) {
  13521. case PlatfromType_1.PlatfromType.wx:
  13522. WXGamePlatform_1.WXGamePlatform.Instance.getaccredit(callobj, accreditCallback);
  13523. break;
  13524. case PlatfromType_1.PlatfromType.qq:
  13525. WXGamePlatform_1.WXGamePlatform.Instance.getaccredit(callobj, accreditCallback);
  13526. break;
  13527. default:
  13528. if (accreditCallback && callobj) {
  13529. accreditCallback.call(callobj, true);
  13530. }
  13531. break;
  13532. }
  13533. };
  13534. /**
  13535. * 拿角色信息授权
  13536. */
  13537. pingtaiutils.prototype.createaccredit = function (callobj, callback, failcallback) {
  13538. switch (Global_1.Global.nowplatfrom) {
  13539. case PlatfromType_1.PlatfromType.wx:
  13540. WXGamePlatform_1.WXGamePlatform.Instance.createUserInfoButton(callobj, callback, failcallback);
  13541. break;
  13542. }
  13543. };
  13544. pingtaiutils.prototype.closeuserinfoButton = function () {
  13545. switch (Global_1.Global.nowplatfrom) {
  13546. case PlatfromType_1.PlatfromType.wx:
  13547. WXGamePlatform_1.WXGamePlatform.Instance.closeuserinfobUtton();
  13548. break;
  13549. }
  13550. };
  13551. /**
  13552. * 退出游戏
  13553. */
  13554. pingtaiutils.prototype.exitGame = function () {
  13555. switch (Global_1.Global.nowplatfrom) {
  13556. case PlatfromType_1.PlatfromType.wx:
  13557. WXGamePlatform_1.WXGamePlatform.Instance.exitGame();
  13558. break;
  13559. }
  13560. };
  13561. /**
  13562. * 打开客服对话框
  13563. */
  13564. pingtaiutils.prototype.openCustomerService = function () {
  13565. switch (Global_1.Global.nowplatfrom) {
  13566. case PlatfromType_1.PlatfromType.wx:
  13567. WXGamePlatform_1.WXGamePlatform.Instance.openCustomerService();
  13568. break;
  13569. }
  13570. };
  13571. /**
  13572. * 短震动
  13573. */
  13574. pingtaiutils.prototype.vibrateShort = function () {
  13575. switch (Global_1.Global.nowplatfrom) {
  13576. case PlatfromType_1.PlatfromType.wx:
  13577. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  13578. break;
  13579. default:
  13580. break;
  13581. }
  13582. };
  13583. pingtaiutils.isCanVideo = function () {
  13584. var bo = false;
  13585. if (pingtaiutils.checkEnable()) {
  13586. bo = true;
  13587. }
  13588. else {
  13589. switch (Global_1.Global.nowplatfrom) {
  13590. case PlatfromType_1.PlatfromType.wx:
  13591. bo = WXGamePlatform_1.WXGamePlatform.Instance.isCanVideo();
  13592. break;
  13593. default:
  13594. bo = true;
  13595. break;
  13596. }
  13597. }
  13598. return bo;
  13599. };
  13600. pingtaiutils.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) {
  13601. if (callobj === void 0) { callobj = null; }
  13602. if (succeedCallback === void 0) { succeedCallback = null; }
  13603. if (failCallback === void 0) { failCallback = null; }
  13604. switch (Global_1.Global.nowplatfrom) {
  13605. case PlatfromType_1.PlatfromType.wx:
  13606. WXGamePlatform_1.WXGamePlatform.Instance.startShareApp(key, callobj, succeedCallback, failCallback);
  13607. break;
  13608. default:
  13609. if (callobj && succeedCallback) {
  13610. succeedCallback.call(callobj);
  13611. }
  13612. break;
  13613. }
  13614. };
  13615. pingtaiutils.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) {
  13616. if (callobj === void 0) { callobj = null; }
  13617. if (succeedcallback === void 0) { succeedcallback = null; }
  13618. if (failCallback === void 0) { failCallback = null; }
  13619. if (istongjiNum === void 0) { istongjiNum = true; }
  13620. switch (Global_1.Global.nowplatfrom) {
  13621. case PlatfromType_1.PlatfromType.wx:
  13622. WXGamePlatform_1.WXGamePlatform.Instance.playVideo(key, callobj, succeedcallback, failCallback, istongjiNum);
  13623. break;
  13624. default:
  13625. if (callobj && succeedcallback) {
  13626. succeedcallback.call(callobj);
  13627. }
  13628. break;
  13629. }
  13630. };
  13631. pingtaiutils.prototype.createBanner = function (bannertype, style) {
  13632. if (style === void 0) { style = { x: 0, y: 0, scale: 1 }; }
  13633. switch (Global_1.Global.nowplatfrom) {
  13634. case PlatfromType_1.PlatfromType.wx:
  13635. WXGamePlatform_1.WXGamePlatform.Instance.createBanner(bannertype, style);
  13636. break;
  13637. default:
  13638. break;
  13639. }
  13640. };
  13641. pingtaiutils.prototype.hideBanner = function (bannertype) {
  13642. switch (Global_1.Global.nowplatfrom) {
  13643. case PlatfromType_1.PlatfromType.wx:
  13644. WXGamePlatform_1.WXGamePlatform.Instance.hideBanner(bannertype);
  13645. break;
  13646. default:
  13647. break;
  13648. }
  13649. };
  13650. /**
  13651. * 数据上传(用于排行榜数据显示)
  13652. * @param param1 上报数据1
  13653. * @param param2 上报数据2
  13654. */
  13655. pingtaiutils.prototype.storeToCloud = function (param1, param2) {
  13656. switch (Global_1.Global.nowplatfrom) {
  13657. case PlatfromType_1.PlatfromType.wx:
  13658. WXGamePlatform_1.WXGamePlatform.Instance.storeToCloud(param1, param2);
  13659. break;
  13660. default:
  13661. break;
  13662. }
  13663. };
  13664. /**
  13665. * 打开好友排行榜
  13666. */
  13667. pingtaiutils.prototype.openFriendRank = function (type, viewType, rect, parent, data) {
  13668. if (parent === void 0) { parent = null; }
  13669. if (data === void 0) { data = null; }
  13670. switch (Global_1.Global.nowplatfrom) {
  13671. case PlatfromType_1.PlatfromType.wx:
  13672. WXGamePlatform_1.WXGamePlatform.Instance.openFriendRank(type, viewType, rect, parent, data);
  13673. break;
  13674. default:
  13675. break;
  13676. }
  13677. };
  13678. /**
  13679. * 排行榜打开状态时候,切换显示类型
  13680. * @param type
  13681. */
  13682. pingtaiutils.prototype.changeFriendRank = function (type) {
  13683. switch (Global_1.Global.nowplatfrom) {
  13684. case PlatfromType_1.PlatfromType.wx:
  13685. WXGamePlatform_1.WXGamePlatform.Instance.changeFriendRank(type);
  13686. break;
  13687. default:
  13688. break;
  13689. }
  13690. };
  13691. /**
  13692. * 排行榜上一页
  13693. */
  13694. pingtaiutils.prototype.prePageRank = function () {
  13695. switch (Global_1.Global.nowplatfrom) {
  13696. case PlatfromType_1.PlatfromType.wx:
  13697. WXGamePlatform_1.WXGamePlatform.Instance.prePageRank();
  13698. break;
  13699. default:
  13700. break;
  13701. }
  13702. };
  13703. /**
  13704. * 排行榜下一页
  13705. */
  13706. pingtaiutils.prototype.nextPageRank = function () {
  13707. switch (Global_1.Global.nowplatfrom) {
  13708. case PlatfromType_1.PlatfromType.wx:
  13709. WXGamePlatform_1.WXGamePlatform.Instance.nextPageRank();
  13710. break;
  13711. default:
  13712. break;
  13713. }
  13714. };
  13715. /**
  13716. * 关闭好友排行榜
  13717. */
  13718. pingtaiutils.prototype.closeFriendRank = function (viewType) {
  13719. switch (Global_1.Global.nowplatfrom) {
  13720. case PlatfromType_1.PlatfromType.wx:
  13721. WXGamePlatform_1.WXGamePlatform.Instance.closeFriendRank(viewType);
  13722. break;
  13723. default:
  13724. break;
  13725. }
  13726. };
  13727. pingtaiutils.prototype.lockVideoLeftTime = function () {
  13728. var time = 0;
  13729. switch (Global_1.Global.nowplatfrom) {
  13730. case PlatfromType_1.PlatfromType.wx:
  13731. time = WXGamePlatform_1.WXGamePlatform.Instance.lockVideoLeftTime();
  13732. break;
  13733. default:
  13734. break;
  13735. }
  13736. return time;
  13737. };
  13738. pingtaiutils.dayVideoNums = function () {
  13739. var time = 0;
  13740. switch (Global_1.Global.nowplatfrom) {
  13741. case PlatfromType_1.PlatfromType.wx:
  13742. time = WXGamePlatform_1.WXGamePlatform.dayVideoNum;
  13743. break;
  13744. default:
  13745. break;
  13746. }
  13747. return time;
  13748. };
  13749. /**
  13750. * 1089:添加到我的小程序,1131:添加到浮窗
  13751. */
  13752. pingtaiutils.fromscene = function () {
  13753. var scene = 0;
  13754. switch (Global_1.Global.nowplatfrom) {
  13755. case PlatfromType_1.PlatfromType.wx:
  13756. scene = WXGamePlatform_1.WXGamePlatform.fromscene;
  13757. break;
  13758. default:
  13759. break;
  13760. }
  13761. return scene;
  13762. };
  13763. pingtaiutils.createGameClubButton = function (style, icon) {
  13764. if (icon === void 0) { icon = "green"; }
  13765. switch (Global_1.Global.nowplatfrom) {
  13766. case PlatfromType_1.PlatfromType.wx:
  13767. WXGamePlatform_1.WXGamePlatform.Instance.createGameClubButton(style, icon);
  13768. break;
  13769. default:
  13770. break;
  13771. }
  13772. };
  13773. /**
  13774. * 是否合规
  13775. */
  13776. pingtaiutils.islegal = 0;
  13777. return pingtaiutils;
  13778. }());
  13779. exports.pingtaiutils = pingtaiutils;
  13780. },{"../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){
  13781. "use strict";
  13782. Object.defineProperty(exports, "__esModule", { value: true });
  13783. var PlayerAccount_1 = require("./PlayerAccount");
  13784. // import { Account } from "../Account/Account";
  13785. var ttshare = /** @class */ (function () {
  13786. function ttshare() {
  13787. }
  13788. ttshare.share = function () {
  13789. Laya.Browser.window.tt.shareAppMessage({
  13790. channel: "article",
  13791. templateId: "ocgf9b46464b9anlff",
  13792. title: "冲啊冲",
  13793. imageUrl: "jiazai/123.png",
  13794. query: "res.query",
  13795. success: function () { },
  13796. fail: function () { },
  13797. });
  13798. };
  13799. return ttshare;
  13800. }());
  13801. exports.ttshare = ttshare;
  13802. var ttad = /** @class */ (function () {
  13803. function ttad() {
  13804. ttad.instance = this;
  13805. }
  13806. Object.defineProperty(ttad, "Instance", {
  13807. get: function () {
  13808. if (ttad.instance) {
  13809. return ttad.instance;
  13810. }
  13811. else {
  13812. return new ttad();
  13813. }
  13814. },
  13815. enumerable: true,
  13816. configurable: true
  13817. });
  13818. ttad.InitAD = function () {
  13819. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video || !Laya.Browser.onMobile)
  13820. return;
  13821. ttad.bannerAdUnitId = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.bannerAdUnitId ? PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.bannerAdUnitId : ttad.bannerAdUnitId;
  13822. console.log("bannerAdUnitId", ttad.bannerAdUnitId);
  13823. ttad.videlAdUnitId = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.videlAdUnitId ? PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.videlAdUnitId : ttad.videlAdUnitId;
  13824. console.log("videlAdUnitId", ttad.videlAdUnitId);
  13825. ttad.videoAd = Laya.Browser.window.tt.createRewardedVideoAd({ adUnitId: this.videlAdUnitId });
  13826. ttad.videoAd.onClose(function (res) {
  13827. if (res.isEnded) {
  13828. if (ttad.closecallback) {
  13829. ttad.closecallback(true);
  13830. }
  13831. }
  13832. else {
  13833. if (ttad.closecallback) {
  13834. ttad.closecallback(false);
  13835. }
  13836. }
  13837. });
  13838. };
  13839. ttad.ShowVideo = function (_cb) {
  13840. var _this = this;
  13841. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video || !Laya.Browser.onMobile)
  13842. return;
  13843. console.log("show video");
  13844. ttad.closecallback = _cb;
  13845. ttad.videoAd.show().then(function () {
  13846. console.log("广告显示成功");
  13847. }).catch(function (err) {
  13848. ttad.ShowTxt("视频正在加载中");
  13849. console.log("广告组件出现问题", err);
  13850. // 可以手动加载一次
  13851. Laya.timer.once(200, _this, function () {
  13852. ttad.videoAd.load().then(function () {
  13853. console.log("手动加载成功");
  13854. // 加载成功后需要再显示广告
  13855. return ttad.videoAd.show();
  13856. });
  13857. });
  13858. });
  13859. };
  13860. ttad.Showbanner = function () {
  13861. if (!Laya.Browser.onMobile)
  13862. return;
  13863. console.log("show banner");
  13864. ttad.canshow = true;
  13865. var infor = Laya.Browser.window.tt.getSystemInfoSync();
  13866. var targetBannerAdWidth = 200;
  13867. if (ttad.bannerAd)
  13868. ttad.bannerAd.destroy();
  13869. Laya.timer.once(200, this, function () {
  13870. ttad.bannerAd = Laya.Browser.window.tt.createBannerAd({
  13871. adUnitId: ttad.bannerAdUnitId,
  13872. style: {
  13873. width: targetBannerAdWidth,
  13874. top: infor.windowHeight - (targetBannerAdWidth / 16) * 9 // 根据系统约定尺寸计算出广告高度
  13875. }
  13876. });
  13877. ttad.bannerAd.onLoad(function () {
  13878. if (ttad.canshow) {
  13879. ttad.bannerAd.show().then(function () {
  13880. console.log("广告显示成功");
  13881. }).catch(function (err) {
  13882. console.log("广告组件出现问题", err);
  13883. });
  13884. }
  13885. });
  13886. ttad.bannerAd.onResize(function (size) {
  13887. console.log(size.width, size.height);
  13888. ttad.bannerAd.style.top = infor.windowHeight - size.height;
  13889. ttad.bannerAd.style.left = (infor.windowWidth - size.width) / 2;
  13890. });
  13891. });
  13892. };
  13893. ttad.Clear = function () {
  13894. ttad.canshow = false;
  13895. ttad.closecallback = null;
  13896. if (ttad.bannerAd)
  13897. ttad.bannerAd.hide();
  13898. };
  13899. /**抖音更多游戏方法*/
  13900. ttad.CreateMoreGameBtn = function (fun) {
  13901. if (fun === void 0) { fun = null; }
  13902. if (!Laya.Browser.onMobile)
  13903. return;
  13904. if (Laya.Browser.onIOS) {
  13905. ttad.ShowTxt("暂未开放");
  13906. return;
  13907. }
  13908. Laya.Browser.window.tt.showMoreGamesModal({
  13909. appLaunchOptions: [
  13910. {
  13911. appId: "tt66d0106df9eaa083",
  13912. query: "foo=bar&baz=qux",
  13913. extraData: {}
  13914. }
  13915. ],
  13916. success: function (res) {
  13917. console.log("success", res.errMsg);
  13918. if (fun) {
  13919. fun();
  13920. }
  13921. },
  13922. fail: function (res) {
  13923. console.log("fail", res.errMsg);
  13924. }
  13925. });
  13926. // 监听弹窗关闭
  13927. // this.onMoreGamesModalClose();
  13928. };
  13929. /*监听弹窗关闭*/
  13930. // static onMoreGamesModalClose()
  13931. // {
  13932. // if(!Laya.Browser.onMobile)return;
  13933. // if( Laya.Browser.onIOS)
  13934. // {
  13935. // ttad.ShowTxt("暂未开放");
  13936. // return;
  13937. // }
  13938. // Laya.Browser.window.tt.onMoreGamesModalClose(function() {
  13939. // console.log("modal closed");
  13940. // if(Scene3DManager.getInstance().IsGamePasue)
  13941. // {
  13942. // EventUtils.dispatchEvent( GameEvent.continueGame );
  13943. // }
  13944. // });
  13945. // }
  13946. ttad.ShowTxt = function (text) {
  13947. if (Laya.Browser.window.tt) {
  13948. Laya.Browser.window.tt.showToast({ title: text });
  13949. }
  13950. else {
  13951. console.log(text);
  13952. }
  13953. };
  13954. ttad.videlAdUnitId = "15gfgp58pocp80hbkb";
  13955. ttad.bannerAdUnitId = "dsk7cohbl2f4jpjtq5";
  13956. ttad.canshow = true;
  13957. return ttad;
  13958. }());
  13959. exports.ttad = ttad;
  13960. },{"./PlayerAccount":73}],82:[function(require,module,exports){
  13961. "use strict";
  13962. Object.defineProperty(exports, "__esModule", { value: true });
  13963. /**
  13964. * 全局侦听类及消息处理
  13965. */
  13966. var DisPatcherOn = /** @class */ (function (_super) {
  13967. __extends(DisPatcherOn, _super);
  13968. function DisPatcherOn() {
  13969. var _this = _super.call(this) || this;
  13970. _this.isInit = false;
  13971. DisPatcherOn.ins = _this;
  13972. if (_this.isInit) {
  13973. }
  13974. if (_this._dispatcher == null) {
  13975. _this._dispatcher = new Laya.EventDispatcher();
  13976. _this.isInit = true;
  13977. }
  13978. return _this;
  13979. }
  13980. Object.defineProperty(DisPatcherOn, "Instance", {
  13981. get: function () {
  13982. if (DisPatcherOn.ins == null)
  13983. return new DisPatcherOn();
  13984. return DisPatcherOn.ins;
  13985. },
  13986. enumerable: true,
  13987. configurable: true
  13988. });
  13989. DisPatcherOn.prototype.addEventListener = function (type, listener, thisObject, useCapture, priority) {
  13990. if (useCapture === void 0) { useCapture = false; }
  13991. if (priority === void 0) { priority = 0; }
  13992. this._dispatcher.on(type, thisObject, listener);
  13993. };
  13994. DisPatcherOn.prototype.removeEventListener = function (type, listener, thisObject, useCapture) {
  13995. if (useCapture === void 0) { useCapture = false; }
  13996. this._dispatcher.off(type, thisObject, listener);
  13997. };
  13998. DisPatcherOn.prototype.hasEventListener = function (type) {
  13999. return this._dispatcher.hasListener(type);
  14000. };
  14001. DisPatcherOn.prototype.dispatchEvent = function (type, data) {
  14002. return this._dispatcher.event(type, data);
  14003. };
  14004. return DisPatcherOn;
  14005. }(Laya.EventDispatcher));
  14006. exports.DisPatcherOn = DisPatcherOn;
  14007. },{}],83:[function(require,module,exports){
  14008. "use strict";
  14009. Object.defineProperty(exports, "__esModule", { value: true });
  14010. var LEvent_1 = require("./LEvent");
  14011. var DisPatcherOn_1 = require("./DisPatcherOn");
  14012. /*
  14013. * name;
  14014. */
  14015. var DispatcherManager = /** @class */ (function () {
  14016. function DispatcherManager() {
  14017. }
  14018. DispatcherManager.init = function () {
  14019. DisPatcherOn_1.DisPatcherOn.Instance;
  14020. };
  14021. //新建事件
  14022. DispatcherManager.Event = function (type, obj, bubbles, cancelable) {
  14023. if (obj === void 0) { obj = null; }
  14024. if (bubbles === void 0) { bubbles = false; }
  14025. if (cancelable === void 0) { cancelable = false; }
  14026. return new LEvent_1.LEvent(type, obj, bubbles, cancelable);
  14027. };
  14028. //派发事件
  14029. DispatcherManager.dispatchEvent = function (type, obj, bubbles, cancelable) {
  14030. if (obj === void 0) { obj = null; }
  14031. if (bubbles === void 0) { bubbles = false; }
  14032. if (cancelable === void 0) { cancelable = false; }
  14033. DisPatcherOn_1.DisPatcherOn.Instance.dispatchEvent(type, obj);
  14034. };
  14035. //监听事件
  14036. DispatcherManager.addEventListener = function (type, thisObject, listener, useCapture, priority) {
  14037. if (useCapture === void 0) { useCapture = false; }
  14038. if (priority === void 0) { priority = 0; }
  14039. DisPatcherOn_1.DisPatcherOn.Instance.addEventListener(type, listener, thisObject, useCapture, priority);
  14040. };
  14041. DispatcherManager.hasEventListener = function (type) {
  14042. return DisPatcherOn_1.DisPatcherOn.Instance.hasEventListener(type);
  14043. };
  14044. DispatcherManager.removeEventListener = function (type, thisObject, listener, useCapture, priority) {
  14045. if (useCapture === void 0) { useCapture = false; }
  14046. if (priority === void 0) { priority = 0; }
  14047. DisPatcherOn_1.DisPatcherOn.Instance.removeEventListener(type, listener, thisObject);
  14048. };
  14049. return DispatcherManager;
  14050. }());
  14051. exports.DispatcherManager = DispatcherManager;
  14052. },{"./DisPatcherOn":82,"./LEvent":87}],84:[function(require,module,exports){
  14053. "use strict";
  14054. Object.defineProperty(exports, "__esModule", { value: true });
  14055. var Sprite = Laya.Sprite;
  14056. var GameState = /** @class */ (function () {
  14057. function GameState() {
  14058. /*********************************************************************** */
  14059. this.btnArr = ["res/button.png", "res/button.png", "res/button.png"];
  14060. this.nameArr = ["canvas截图", "sprite截图", "清理"];
  14061. }
  14062. GameState.prototype.drawSomething = function () {
  14063. this.sp = new Sprite();
  14064. Laya.stage.addChild(this.sp);
  14065. //画线
  14066. this.sp.graphics.drawLine(10, 58, 146, 58, "#ff0000", 3);
  14067. //画连续直线
  14068. this.sp.graphics.drawLines(176, 58, [0, 0, 39, -50, 78, 0, 117, 50, 156, 0], "#ff0000", 5);
  14069. //画曲线
  14070. 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);
  14071. //画矩形
  14072. this.sp.graphics.drawRect(10, 166, 166, 90, "#ffff00");
  14073. //画多边形
  14074. this.sp.graphics.drawPoly(264, 166, [0, 0, 60, 0, 78.48, 57, 30, 93.48, -18.48, 57], "#ffff00");
  14075. //画三角形
  14076. this.sp.graphics.drawPoly(400, 166, [0, 100, 50, 0, 100, 100], "#ffff00");
  14077. //画圆
  14078. this.sp.graphics.drawCircle(98, 332, 50, "#00ffff");
  14079. //画扇形
  14080. this.sp.graphics.drawPie(240, 290, 100, 10, 60, "#00ffff");
  14081. //绘制圆角矩形,自定义路径
  14082. 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" });
  14083. };
  14084. GameState.prototype._onclick = function (e) {
  14085. switch (e.target.name) {
  14086. case this.nameArr[0]:
  14087. var base64Url = this._canvas.toDataURL("image/png", 1);
  14088. this.drawImage.skin = base64Url;
  14089. break;
  14090. case this.nameArr[1]:
  14091. var text = Laya.stage.drawToTexture(Laya.Browser.clientWidth, Laya.Browser.clientHeight, 0, 0);
  14092. this.drawSp.graphics.drawTexture(text, 0, 0, this.drawSp.width, this.drawSp.height);
  14093. break;
  14094. case this.nameArr[2]:
  14095. this.drawImage.skin = null;
  14096. this.drawSp.graphics.clear();
  14097. this.drawSp.graphics.drawRect(0, 0, this.drawSp.width, this.drawSp.height, "#ff0000");
  14098. break;
  14099. }
  14100. };
  14101. GameState.removeselect = "GameState_removeselect";
  14102. GameState.npcend = "GameState_npcendGame";
  14103. /**
  14104. * 通关成功
  14105. */
  14106. GameState.win = "GameState_winGame";
  14107. /**
  14108. * 通关失败
  14109. */
  14110. GameState.fail = "GameState_failGame";
  14111. GameState.jump = "GameState_jumpgame";
  14112. /**
  14113. * 暂停游戏
  14114. */
  14115. GameState.stop = "GameState_stopGame";
  14116. /**
  14117. * 回到主界面
  14118. */
  14119. GameState.returnMainView = "returnMainView";
  14120. GameState.updateSKinView = "GameState_updateSKinView";
  14121. /*********************************************************************** */
  14122. /**
  14123. * 开始游戏
  14124. */
  14125. GameState.start = "GameState_startGame";
  14126. /**
  14127. * 结束游戏
  14128. */
  14129. GameState.end = "GameState_endGame";
  14130. /**失败 */
  14131. GameState.lose = "GameState_loseGame";
  14132. /**
  14133. * 复活
  14134. */
  14135. GameState.revive = "GameState_reviveGame";
  14136. /**是否复活 */
  14137. GameState.isdie = false;
  14138. /**允许复活次数 */
  14139. GameState.fuhuocishu = 1;
  14140. /**是否已经发布过录屏 */
  14141. GameState.recordscree = false;
  14142. /**游戏次数*/
  14143. GameState.GameNum = 0;
  14144. return GameState;
  14145. }());
  14146. exports.GameState = GameState;
  14147. },{}],85:[function(require,module,exports){
  14148. "use strict";
  14149. Object.defineProperty(exports, "__esModule", { value: true });
  14150. /*
  14151. * 公共接口
  14152. */
  14153. var GameUtils;
  14154. (function (GameUtils) {
  14155. /**
  14156. * 随机函数(返回整型)
  14157. */
  14158. function randRangeint(min, max) {
  14159. var value = Math.floor(Math.random() * (max - min + 1)) + min;
  14160. if (value > max) {
  14161. value = max;
  14162. }
  14163. return value;
  14164. }
  14165. GameUtils.randRangeint = randRangeint;
  14166. /**
  14167. * 随机函数( 不取整 )
  14168. */
  14169. function randRangefloat(min, max) {
  14170. var value = Math.random() * (max - min + 1) + min;
  14171. if (value > max) {
  14172. value = max;
  14173. }
  14174. return value;
  14175. }
  14176. GameUtils.randRangefloat = randRangefloat;
  14177. function getTexbyPkgAndName(pkgname, texname) {
  14178. var uipackage = fairygui.UIPackage.getByName(pkgname);
  14179. if (uipackage) {
  14180. return uipackage.getItemAssetByName(texname);
  14181. }
  14182. return null;
  14183. }
  14184. GameUtils.getTexbyPkgAndName = getTexbyPkgAndName;
  14185. /**
  14186. * 切割分号变成Point对象
  14187. * @param str
  14188. */
  14189. function cutfenhaoPoint(str) {
  14190. var arr = str.split(";");
  14191. return new Laya.Point(Number(arr[0]), Number(arr[1]));
  14192. }
  14193. GameUtils.cutfenhaoPoint = cutfenhaoPoint;
  14194. /**
  14195. * 切割分号变成数据(number)
  14196. */
  14197. function cutfenhaotoArrnum(str) {
  14198. var numArr = [];
  14199. if (str == "") {
  14200. return numArr;
  14201. }
  14202. var arr = str.split(";");
  14203. var i = 0;
  14204. for (i; i < arr.length; i++) {
  14205. numArr.push(Number(arr[i]));
  14206. }
  14207. return numArr;
  14208. }
  14209. GameUtils.cutfenhaotoArrnum = cutfenhaotoArrnum;
  14210. /**
  14211. * 切割分号变成数据(string)
  14212. */
  14213. function cutfenhaotoArrstr(str) {
  14214. return str.split(";");
  14215. }
  14216. GameUtils.cutfenhaotoArrstr = cutfenhaotoArrstr;
  14217. /**
  14218. * 切割分号变成数据( { key:1,value:1 } )
  14219. */
  14220. function cutfenhaotoObj(str) {
  14221. var obj = {};
  14222. var arr = str.split(";");
  14223. obj.key = arr[0];
  14224. obj.value = arr[1];
  14225. return obj;
  14226. }
  14227. GameUtils.cutfenhaotoObj = cutfenhaotoObj;
  14228. /**切割str*/
  14229. function cutstrtoArr(str) {
  14230. var arr = str.split("|");
  14231. return arr;
  14232. }
  14233. GameUtils.cutstrtoArr = cutstrtoArr;
  14234. /**切割str( 1:1|1:1 ) to Array<{ key:1,value:1 }> */
  14235. function cutstrtoArr1(str) {
  14236. var reslutArr = [];
  14237. var arr = str.split("|");
  14238. var i = 0;
  14239. for (i = 0; i < arr.length; i++) {
  14240. var itemarr = arr[i].split(";");
  14241. reslutArr.push({ key: itemarr[0], value: itemarr[1] });
  14242. }
  14243. return reslutArr;
  14244. }
  14245. GameUtils.cutstrtoArr1 = cutstrtoArr1;
  14246. function cutstrtoObj(str) {
  14247. var resultobj = {};
  14248. var arr = str.split("|");
  14249. var i = 0;
  14250. for (i = 0; i < arr.length; i++) {
  14251. var itemarr = arr[i].split(";");
  14252. resultobj[itemarr[0]] = itemarr[1];
  14253. }
  14254. return resultobj;
  14255. }
  14256. GameUtils.cutstrtoObj = cutstrtoObj;
  14257. function compareVersion(v1, v2) {
  14258. v1 = v1.split('.');
  14259. v2 = v2.split('.');
  14260. var len = Math.max(v1.length, v2.length);
  14261. while (v1.length < len) {
  14262. v1.push('0');
  14263. }
  14264. while (v2.length < len) {
  14265. v2.push('0');
  14266. }
  14267. for (var i = 0; i < len; i++) {
  14268. var num1 = parseInt(v1[i]);
  14269. var num2 = parseInt(v2[i]);
  14270. if (num1 > num2) {
  14271. return 1;
  14272. }
  14273. else if (num1 < num2) {
  14274. return -1;
  14275. }
  14276. }
  14277. return 0;
  14278. }
  14279. GameUtils.compareVersion = compareVersion;
  14280. })(GameUtils = exports.GameUtils || (exports.GameUtils = {}));
  14281. },{}],86:[function(require,module,exports){
  14282. "use strict";
  14283. Object.defineProperty(exports, "__esModule", { value: true });
  14284. var GlobalTipPanel_1 = require("../View/GlobalTipPanel");
  14285. var LayoutControl_1 = require("../Control/LayoutControl");
  14286. var LayOUT_1 = require("../utils/LayOUT");
  14287. var DispatcherManager_1 = require("../utils/DispatcherManager");
  14288. var GameState_1 = require("../utils/GameState");
  14289. /*
  14290. * name;
  14291. */
  14292. var GlobalTip = /** @class */ (function () {
  14293. function GlobalTip() {
  14294. GlobalTip.ins = this;
  14295. }
  14296. Object.defineProperty(GlobalTip, "Instance", {
  14297. get: function () {
  14298. if (GlobalTip.ins == null) {
  14299. return new GlobalTip();
  14300. }
  14301. return GlobalTip.ins;
  14302. },
  14303. enumerable: true,
  14304. configurable: true
  14305. });
  14306. GlobalTip.prototype.initEvent = function () {
  14307. GlobalTip.isEvent = true;
  14308. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.removeselect, this, this.addwordList);
  14309. };
  14310. GlobalTip.prototype.showWordTips = function (word) {
  14311. if (!GlobalTip.isEvent) {
  14312. GlobalTip.Instance.initEvent();
  14313. }
  14314. if (GlobalTip.showWordList.length > 0) {
  14315. var lastword = GlobalTip.showWordList[GlobalTip.showWordList.length - 1].nowword;
  14316. // if( lastword == word )
  14317. // {
  14318. // return;
  14319. // }
  14320. }
  14321. if (GlobalTip.wordList.length > 0) {
  14322. var item = GlobalTip.wordList.shift();
  14323. LayoutControl_1.LayoutControl.Instance.AddLayerByName(item, LayOUT_1.LayOUT.TIP);
  14324. GlobalTip.showWordList.push(item);
  14325. item.showWord(word);
  14326. }
  14327. else {
  14328. if (GlobalTip.showWordList.length < 10) {
  14329. var item1 = new GlobalTipPanel_1.WordTipsPanel();
  14330. LayoutControl_1.LayoutControl.Instance.AddLayerByName(item1, LayOUT_1.LayOUT.TIP);
  14331. GlobalTip.showWordList.push(item1);
  14332. item1.showWord(word);
  14333. }
  14334. else {
  14335. var item1 = GlobalTip.showWordList.shift();
  14336. item1.showWord(word);
  14337. GlobalTip.showWordList.push(item1);
  14338. }
  14339. }
  14340. };
  14341. GlobalTip.prototype.addwordList = function (item) {
  14342. if (item) {
  14343. item.removeFromParent();
  14344. var index = GlobalTip.showWordList.indexOf(item);
  14345. if (index != -1) {
  14346. GlobalTip.showWordList.splice(index, 1);
  14347. }
  14348. LayoutControl_1.LayoutControl.Instance.ClearLayerByName(LayOUT_1.LayOUT.TIP);
  14349. GlobalTip.wordList.push(item);
  14350. }
  14351. };
  14352. GlobalTip.wordList = [];
  14353. GlobalTip.showWordList = [];
  14354. GlobalTip.maxNum = 10;
  14355. GlobalTip.isEvent = false;
  14356. return GlobalTip;
  14357. }());
  14358. exports.GlobalTip = GlobalTip;
  14359. },{"../Control/LayoutControl":21,"../View/GlobalTipPanel":62,"../utils/DispatcherManager":83,"../utils/GameState":84,"../utils/LayOUT":88}],87:[function(require,module,exports){
  14360. "use strict";
  14361. Object.defineProperty(exports, "__esModule", { value: true });
  14362. var LEvent = /** @class */ (function (_super) {
  14363. __extends(LEvent, _super);
  14364. function LEvent(type, obj, bubbles, cancelable) {
  14365. if (obj === void 0) { obj = null; }
  14366. if (bubbles === void 0) { bubbles = false; }
  14367. if (cancelable === void 0) { cancelable = false; }
  14368. var _this = _super.call(this) || this;
  14369. _this.CLASS_NAME = "LEvent";
  14370. if (obj) {
  14371. _this._obj = obj;
  14372. }
  14373. return _this;
  14374. }
  14375. LEvent.prototype.clone = function (obj) {
  14376. return new LEvent(this.type, obj ? obj : this._obj);
  14377. };
  14378. LEvent.prototype.toString = function () {
  14379. console.log(this.CLASS_NAME, "type", "bubbles", "cancelable");
  14380. };
  14381. Object.defineProperty(LEvent.prototype, "param", {
  14382. /**
  14383. * 传参获取
  14384. * @returns {any}
  14385. */
  14386. get: function () {
  14387. return this._obj;
  14388. },
  14389. enumerable: true,
  14390. configurable: true
  14391. });
  14392. return LEvent;
  14393. }(Laya.Event));
  14394. exports.LEvent = LEvent;
  14395. },{}],88:[function(require,module,exports){
  14396. "use strict";
  14397. Object.defineProperty(exports, "__esModule", { value: true });
  14398. var LayOUT = /** @class */ (function () {
  14399. function LayOUT() {
  14400. }
  14401. /**
  14402. * 背景层
  14403. */
  14404. LayOUT.BG = "BG";
  14405. /**
  14406. * ui层
  14407. */
  14408. LayOUT.UI = "UI";
  14409. /**
  14410. * ui层上层
  14411. */
  14412. LayOUT.UITop = "UITop";
  14413. /**
  14414. * tips层
  14415. */
  14416. LayOUT.TIP = "TIP";
  14417. /**
  14418. * 新手引导层
  14419. */
  14420. LayOUT.GUIDE = "GUIDE";
  14421. return LayOUT;
  14422. }());
  14423. exports.LayOUT = LayOUT;
  14424. },{}],89:[function(require,module,exports){
  14425. "use strict";
  14426. Object.defineProperty(exports, "__esModule", { value: true });
  14427. /*
  14428. * name;
  14429. */
  14430. var Singleton = /** @class */ (function (_super) {
  14431. __extends(Singleton, _super);
  14432. function Singleton() {
  14433. return _super.call(this) || this;
  14434. }
  14435. /**
  14436. * 获取单例类,若不存在则返回空
  14437. * @param ref 继承自Singleton的类
  14438. * @return *
  14439. */
  14440. Singleton.Instance = function (ref) {
  14441. if (ref.key == null) {
  14442. throw new Error("getinstance erro");
  14443. }
  14444. return this._dict[ref.key];
  14445. };
  14446. /**
  14447. * 获取单例类,若不存在则创建
  14448. * @param ref 继承自Singleton的类
  14449. * @return *
  14450. */
  14451. Singleton.getInstanceOrCreate = function (ref) {
  14452. if (ref.key == null) {
  14453. throw new Error("getInstanceOrCreate erro");
  14454. }
  14455. this.create(ref);
  14456. return this._dict[ref.key];
  14457. };
  14458. /**
  14459. * 创建单例类
  14460. * @param ref 继承自Singleton的类
  14461. * @return void
  14462. */
  14463. Singleton.create = function (ref) {
  14464. if (ref.key == null) {
  14465. throw new Error("create erro");
  14466. }
  14467. if (this._dict[ref.key] == null) {
  14468. this._dict[ref.key] = new ref();
  14469. }
  14470. return this._dict[ref.key];
  14471. };
  14472. /**
  14473. * 删除单例类
  14474. * @param ref 继承自Singleton的类
  14475. * @return void
  14476. */
  14477. Singleton.remove = function (ref) {
  14478. var key = ref.key;
  14479. if (this._dict[key] != null) {
  14480. this._dict[key].destory();
  14481. }
  14482. };
  14483. /**
  14484. * 销毁方法
  14485. */
  14486. Singleton.prototype.destory = function () {
  14487. };
  14488. Singleton._dict = {};
  14489. return Singleton;
  14490. }(Laya.EventDispatcher));
  14491. exports.Singleton = Singleton;
  14492. },{}],90:[function(require,module,exports){
  14493. "use strict";
  14494. Object.defineProperty(exports, "__esModule", { value: true });
  14495. var AgencySkin_1 = require("../Agency/AgencySkin");
  14496. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  14497. var GlobalTip_1 = require("../utils/GlobalTip");
  14498. var AssetPath_1 = require("../Config/AssetPath");
  14499. var MovieClip = Laya.MovieClip;
  14500. var ttad_1 = require("../WXSDK/ttad");
  14501. var SkinItem = /** @class */ (function (_super) {
  14502. __extends(SkinItem, _super);
  14503. function SkinItem() {
  14504. var _this = _super.call(this) || this;
  14505. /********************************************************** */
  14506. _this.bgColorChannels = { r: 99, g: 0, b: 0xFF };
  14507. /********************************************** */
  14508. _this.SWFPath = "res/swf/dragon.swf";
  14509. _this.MCWidth = 318;
  14510. _this.MCHeight = 406;
  14511. return _this;
  14512. }
  14513. SkinItem.prototype.getHexColorString = function () {
  14514. this.bgColorChannels.r = Math.floor(this.bgColorChannels.r);
  14515. // 绿色通道使用0
  14516. this.bgColorChannels.g = 0;
  14517. //obj.g = Math.floor(obj.g);
  14518. this.bgColorChannels.b = Math.floor(this.bgColorChannels.b);
  14519. var r = this.bgColorChannels.r.toString(16);
  14520. r = r.length == 2 ? r : "0" + r;
  14521. var g = this.bgColorChannels.g.toString(16);
  14522. g = g.length == 2 ? g : "0" + g;
  14523. var b = this.bgColorChannels.b.toString(16);
  14524. b = b.length == 2 ? b : "0" + b;
  14525. return "#" + r + g + b;
  14526. };
  14527. /********************************************************** */
  14528. SkinItem.prototype.constructFromXML = function (xml) {
  14529. _super.prototype.constructFromXML.call(this, xml);
  14530. for (var str in this._children) {
  14531. var item = this._children[str];
  14532. this[item.name] = item;
  14533. }
  14534. this.onInit();
  14535. };
  14536. SkinItem.prototype.onInit = function () {
  14537. this.initView();
  14538. this.initEvent();
  14539. };
  14540. SkinItem.prototype.initView = function () {
  14541. this.agencyskin = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencySkin_1.AgencySkin);
  14542. this.c_state = this.getController("c_state");
  14543. };
  14544. SkinItem.prototype.initEvent = function () {
  14545. this.on(Laya.Event.CLICK, this, this.btnclick);
  14546. };
  14547. SkinItem.prototype.btnclick = function () {
  14548. if (this.pifuvo) {
  14549. switch (this.c_state.selectedIndex) {
  14550. case 0:
  14551. break;
  14552. case 1: //拥有
  14553. this.agencyskin.GainPifu(this.pifuvo);
  14554. break;
  14555. case 2: //活动获取
  14556. GlobalTip_1.GlobalTip.Instance.showWordTips("暂未开放");
  14557. break;
  14558. case 3: //看视频获取
  14559. this.playvideocallback();
  14560. // pingtaiutils.Instance.playVideo( "",this,this.playvideocallback );
  14561. break;
  14562. case 4: //金币购买
  14563. this.agencyskin.GainPifu(this.pifuvo);
  14564. break;
  14565. }
  14566. }
  14567. };
  14568. SkinItem.prototype.createMovieClip = function () {
  14569. var mc = new MovieClip();
  14570. mc.load(this.SWFPath);
  14571. mc.x = (Laya.stage.width - this.MCWidth) / 2;
  14572. mc.y = (Laya.stage.height - this.MCHeight) / 2;
  14573. Laya.stage.addChild(mc);
  14574. };
  14575. /********************************************** */
  14576. SkinItem.prototype.playvideocallback = function () {
  14577. var _this = this;
  14578. ttad_1.ttad.ShowVideo((function (isLoad) {
  14579. if (isLoad) {
  14580. _this.agencyskin.GainPifu(_this.pifuvo);
  14581. }
  14582. }));
  14583. };
  14584. SkinItem.prototype.showData = function (vo) {
  14585. this.pifuvo = vo;
  14586. if (this.pifuvo) {
  14587. this.load_icon.icon = AssetPath_1.AssetPath.getroleicon(this.pifuvo.roleCFG.icon);
  14588. if (this.agencyskin.RoleData.CharacterID == this.pifuvo.roleCFG.id) {
  14589. this.c_state.selectedIndex = 0;
  14590. }
  14591. else if (this.pifuvo.state == 1) {
  14592. this.c_state.selectedIndex = 1;
  14593. }
  14594. else {
  14595. switch (this.pifuvo.roleCFG.getState) {
  14596. case 1:
  14597. this.c_state.selectedIndex = 3;
  14598. this.txt_need.text = this.pifuvo.hasnum + "/" + this.pifuvo.roleCFG.need;
  14599. break;
  14600. case 2:
  14601. this.c_state.selectedIndex = 4;
  14602. this.txt_need.text = this.pifuvo.roleCFG.need.toString();
  14603. break;
  14604. case 3:
  14605. this.c_state.selectedIndex = 2;
  14606. break;
  14607. }
  14608. }
  14609. }
  14610. };
  14611. /******************************************************** */
  14612. SkinItem.prototype.preFixNumber = function (num, strLen) {
  14613. return ("0000000000" + num).slice(-strLen);
  14614. };
  14615. SkinItem.prototype.evalBgColor = function () {
  14616. var color = Math.random() * 0xFFFFFF;
  14617. var channels = this.getColorChannals(color);
  14618. };
  14619. SkinItem.prototype.getColorChannals = function (color) {
  14620. var result = [];
  14621. result.push(color >> 16);
  14622. result.push(color >> 8 & 0xFF);
  14623. result.push(color & 0xFF);
  14624. return result;
  14625. };
  14626. /******************************************************** */
  14627. SkinItem.prototype.dispose = function () {
  14628. this.off(Laya.Event.CLICK, this, this.btnclick);
  14629. _super.prototype.dispose.call(this);
  14630. };
  14631. return SkinItem;
  14632. }(fairygui.GButton));
  14633. exports.SkinItem = SkinItem;
  14634. },{"../Agency/AgencySkin":6,"../Config/AssetPath":15,"../PrefabControl/PanelResDic":46,"../WXSDK/ttad":81,"../utils/GlobalTip":86}],91:[function(require,module,exports){
  14635. "use strict";
  14636. Object.defineProperty(exports, "__esModule", { value: true });
  14637. /**
  14638. * 继承baseView界面的打开关闭动效类型
  14639. */
  14640. var ViewAction = /** @class */ (function () {
  14641. function ViewAction() {
  14642. /************************ */
  14643. this._text = null;
  14644. }
  14645. /**
  14646. * 动画状态开始时执行。
  14647. */
  14648. ViewAction.prototype.onStateEnter = function () {
  14649. console.log("动画开始播放了");
  14650. this._text.text = "动画状态:动画开始播放";
  14651. };
  14652. /**
  14653. * 动画状态更新时执行。
  14654. */
  14655. ViewAction.prototype.onStateUpdate = function () {
  14656. console.log("动画状态更新了");
  14657. this._text.text = "动画状态:动画更新中";
  14658. };
  14659. /**
  14660. * 动画状态退出时执行。
  14661. */
  14662. ViewAction.prototype.onStateExit = function () {
  14663. console.log("动画退出了");
  14664. this._text.text = "动画状态:动画开始退出";
  14665. };
  14666. ViewAction.prototype.addBox = function () {
  14667. for (var i = 0; i < 8; i++) {
  14668. this.addVerticalBox(-0.65, 0.165 + i * 0.33 * 2, 0);
  14669. this.addVerticalBox(0, 0.165 + i * 0.33 * 2, 0);
  14670. this.addVerticalBox(0.65, 0.165 + i * 0.33 * 2, 0);
  14671. }
  14672. };
  14673. ViewAction.prototype.addVerticalBox = function (x, y, z) {
  14674. var box = this.scene.addChild(new Laya.MeshSprite3D(this.mesh1));
  14675. box.meshRenderer.material = this.mat1;
  14676. box.meshRenderer.castShadow = true;
  14677. box.meshRenderer.receiveShadow = true;
  14678. box.transform.position = new Laya.Vector3(x, y, z);
  14679. var rigidBody = box.addComponent(Laya.Rigidbody3D);
  14680. rigidBody.mass = 10;
  14681. rigidBody.friction = 0.4;
  14682. rigidBody.restitution = 0.2;
  14683. var boxShape = new Laya.BoxColliderShape(0.5, 0.33, 2);
  14684. rigidBody.colliderShape = boxShape;
  14685. };
  14686. /**
  14687. * 从小变大
  14688. */
  14689. ViewAction.ActionType_addscaleMinToMax = "ActionType_addscaleMinToMax";
  14690. /**
  14691. * 从大变小移出
  14692. */
  14693. ViewAction.ActionType_removescaleMaxToMin = "ActionType_removescaleMaxToMin";
  14694. /**
  14695. * 没有动效
  14696. */
  14697. ViewAction.ActionType_none = "ActionType_none";
  14698. /********************************************** */
  14699. /**
  14700. * 从右边移动到中央
  14701. */
  14702. ViewAction.ActionType_addmoveToMiddle = "ActionType_addmoveToMiddle";
  14703. /**
  14704. * 从最右边移出
  14705. */
  14706. ViewAction.ActionType_removemoveToRight = "ActionType_removemoveToRight";
  14707. /**
  14708. * 从底部向上移动
  14709. */
  14710. ViewAction.ActionType_addmoveFromBottom = "ActionType_addmoveFromBottom";
  14711. /**
  14712. * 从上向底部移动
  14713. */
  14714. ViewAction.ActionType_addmoveFromup = "ActionType_addmoveFromup";
  14715. return ViewAction;
  14716. }());
  14717. exports.ViewAction = ViewAction;
  14718. },{}]},{},[42])
  14719. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL0xheWFBaXIvTGF5YTIuMy4wL3Jlc291cmNlcy9hcHAvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInNyYy9BZ2VuY3kvQWdlbmN5QmFzZUNvbnRyb2wudHMiLCJzcmMvQWdlbmN5L0FnZW5jeUluR2FtZS50cyIsInNyYy9BZ2VuY3kvQWdlbmN5TG9naW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeUxvdHRlcnkudHMiLCJzcmMvQWdlbmN5L0FnZW5jeU1haW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeVNraW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeVRyaWFsLnRzIiwic3JjL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZS50cyIsInNyYy9DRkcvQnVpbGRDRkcudHMiLCJzcmMvQ0ZHL0dhbWVDRkcudHMiLCJzcmMvQ0ZHL0xldmVsQ0ZHLnRzIiwic3JjL0NGRy9Mb3R0ZXJ5Q0ZHLnRzIiwic3JjL0NGRy9OcGNDRkcudHMiLCJzcmMvQ0ZHL1JvbGVDRkcudHMiLCJzcmMvQ29uZmlnL0Fzc2V0UGF0aC50cyIsInNyYy9Db25maWcvUmVjQ29uZmlncy50cyIsInNyYy9Db250cm9sL0F1ZGlvQ29udHJvbC50cyIsInNyYy9Db250cm9sL0Nvbm5lY3RDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvRGF0ZUNvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9HYW1lU3RhdGVDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvTGF5b3V0Q29udHJvbC50cyIsInNyYy9Db250cm9sL0xvY2FsRGF0YUNvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9QYW5lbEJhc2VDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9SZXNEYXRhQ29udHJvbC50cyIsInNyYy9Db250cm9sL1Jlc291cmNlQ29udHJvbC50cyIsInNyYy9Db250cm9sL1NjZW5lQ29udHJvbC50cyIsInNyYy9EYXRhL0NvbXBvbmVudEV2ZW50RGF0YS50cyIsInNyYy9EYXRhL0RhdGFJbmZvQmFzZS50cyIsInNyYy9EYXRhL0xvY2FsRGF0YS50cyIsInNyYy9EYXRhL1JvbGVEYXRhLnRzIiwic3JjL0RhdGEvU2tpbkRhdGEudHMiLCJzcmMvRGF0YS9Vc2VyRGF0YUluZm8udHMiLCJzcmMvRGF0YS9Vc2VySW5mb0V2ZW50LnRzIiwic3JjL0dhbWVDb250ZW50cy50cyIsInNyYy9HYW1lL0NhbWVyYU1hbmFnZXIudHMiLCJzcmMvR2FtZS9OcGNTY3JpcHQudHMiLCJzcmMvR2FtZS9QbGF5ZXIudHMiLCJzcmMvR2xvYmFsLnRzIiwic3JjL0dsb2JhbFdhaXRpbmcudHMiLCJzcmMvSm95c3RpY2tNb2R1bGUudHMiLCJzcmMvTWFpbi50cyIsInNyYy9QcmVmYWJDb250cm9sL0NoYXJhY3RlclBvb2wudHMiLCJzcmMvUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZS50cyIsInNyYy9QcmVmYWJDb250cm9sL0dhbWVQb29sLnRzIiwic3JjL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWMudHMiLCJzcmMvUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlci50cyIsInNyYy9QdXNoL0Jhb0t1YW5HYW1lVmlldy50cyIsInNyYy9QdXNoL0Nob3V0aVBhblZpZXcudHMiLCJzcmMvUHVzaC9DcGFEb3duc1ZpZXcudHMiLCJzcmMvUHVzaC9DcGFFdmVudC50cyIsInNyYy9QdXNoL0NwYUl0ZW0udHMiLCJzcmMvUHVzaC9SZWNvbW1lbmRWaWV3LnRzIiwic3JjL1B1c2gvU2hpd2FudHVpamlhblZpZXcudHMiLCJzcmMvUHVzaC9UdWlqaWFuVmlldy50cyIsInNyYy9UaW1lL1RpbWVVdGlscy50cyIsInNyYy9UaW1lL1RpbWVyU2VydmljZS50cyIsInNyYy9UaW1lL1RpbWVzVGFtcGVyLnRzIiwic3JjL1ZpZXcvQ29tcGxldGVQYW5lbC50cyIsInNyYy9WaWV3L0VnZ1BhbmVsLnRzIiwic3JjL1ZpZXcvR2lmdFZpZXcudHMiLCJzcmMvVmlldy9HbG9iYWxUaXBQYW5lbC50cyIsInNyYy9WaWV3L0xvYWRpbmdQYW5lbC50cyIsInNyYy9WaWV3L0xvdHRlcnlQYW5lbC50cyIsInNyYy9WaWV3L01haW5QYW5lbC50cyIsInNyYy9WaWV3L1NraW5QYW5lbC50cyIsInNyYy9WaWV3L1RyaWFsUGFuZWwudHMiLCJzcmMvVmlldy9WaWV3TWFuYWdlci50cyIsInNyYy9XWFNESy9GWUhEX1Nkay50cyIsInNyYy9XWFNESy9HdWFuZ0dhby50cyIsInNyYy9XWFNESy9OZXR3b3JrTWFuYWdlci50cyIsInNyYy9XWFNESy9QbGF0ZnJvbVR5cGUudHMiLCJzcmMvV1hTREsvUGxheWVyQWNjb3VudC50cyIsInNyYy9XWFNESy9SZWNvcmRNYW5hZ2VyLnRzIiwic3JjL1dYU0RLL1Nkay50cyIsInNyYy9XWFNESy9TZXJ2ZXJTb2NrZXQudHMiLCJzcmMvV1hTREsvU29ja2V0Tm9maWZ5LnRzIiwic3JjL1dYU0RLL1dFQ0hBVEVWRU5ULnRzIiwic3JjL1dYU0RLL1dYR2FtZVBsYXRmb3JtLnRzIiwic3JjL1dYU0RLL3Bpbmd0YWl1dGlscy50cyIsInNyYy9XWFNESy90dGFkLnRzIiwic3JjL3V0aWxzL0Rpc1BhdGNoZXJPbi50cyIsInNyYy91dGlscy9EaXNwYXRjaGVyTWFuYWdlci50cyIsInNyYy91dGlscy9HYW1lU3RhdGUudHMiLCJzcmMvdXRpbHMvR2FtZVV0aWxzLnRzIiwic3JjL3V0aWxzL0dsb2JhbFRpcC50cyIsInNyYy91dGlscy9MRXZlbnQudHMiLCJzcmMvdXRpbHMvTGF5T1VULnRzIiwic3JjL3V0aWxzL1NpbmdsZXRvbi50cyIsInNyYy91dGlscy9Ta2luSXRlbS50cyIsInNyYy91dGlscy9WaWV3QWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1ZBLDREQUF5RDtBQUN6RCxnRUFBK0Q7QUFDL0QsZ0RBQTZDO0FBQzdDLHNEQUFtRDtBQUNuRCw2Q0FBMEM7QUFFMUM7O0VBRUU7QUFDRjtJQUF1QyxxQ0FBUztJQU01QztRQUFBLFlBQ0ksaUJBQU8sU0FHVjtRQUZHLEtBQUksQ0FBQyxXQUFXLEdBQUcseUJBQVcsQ0FBQyxRQUFRLENBQUM7UUFDeEMsS0FBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztJQUNwQixDQUFDO0lBQ1Msb0NBQVEsR0FBbEI7SUFHQSxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IseUNBQWEsR0FBckI7UUFDSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QixJQUFJO1FBQ0osSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsT0FBTztRQUNQLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0YsS0FBSztRQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hJLEtBQUs7UUFDTCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU07UUFDTixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEcsTUFBTTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRSxJQUFJO1FBQ0osSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELEtBQUs7UUFDTCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRCxjQUFjO1FBQ2QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FB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eEMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsY0FBYyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxTQUFTLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUU7UUFDN0MsV0FBVyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDMUMsZUFBZSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDOUMsVUFBVSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDekMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7S0FDMUMsQ0FBQztJQTJOUCxrQkFBQztDQWxURCxBQWtUQyxJQUFBO0FBbFRZLGtDQUFXOzs7O0FDSHhCLGtFQUErRDtBQUMvRCx1Q0FBa0M7QUFDbEMsd0RBQXVE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SSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hHLE1BQU07UUFDTixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUUsSUFBSTtRQUNKLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRCxLQUFLO1FBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0QsY0FBYztRQUNkLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFD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OiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcclxuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxuICAgIH07XHJcbn0pKCk7XHJcbihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJpbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbmltcG9ydCB7U2luZ2xldG9ufSBmcm9tIFwiLi4vdXRpbHMvU2luZ2xldG9uXCI7XG5pbXBvcnQge1NlcnZlclNvY2tldH0gZnJvbSBcIi4uL1dYU0RLL1NlcnZlclNvY2tldFwiO1xuaW1wb3J0IHtSb2xlRGF0YX0gZnJvbSBcIi4uL0RhdGEvUm9sZURhdGFcIjtcblxuLypcbiogbmFtZTtcbiovXG5leHBvcnQgY2xhc3MgQWdlbmN5QmFzZUNvbnRyb2wgZXh0ZW5kcyBTaW5nbGV0b25cbntcbiAgICBwcml2YXRlIF9vYmplY3RQb29sOiBQYW5lbFJlc0RpYztcblxuICAgIHByaXZhdGUgc3A6TGF5YS5TcHJpdGU7XG5cbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9vYmplY3RQb29sID0gUGFuZWxSZXNEaWMuSW5zdGFuY2U7XG4gICAgICAgIHRoaXMuaW5pdFNlbGYoKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGluaXRTZWxmKCk6dm9pZFxuICAgIHtcblxuICAgIH1cblxuICAgIC8qKioqKioqKioq5re35reGICovXG4gICAgcHJpdmF0ZSBkcmF3U29tZXRoaW5nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNwID0gbmV3IExheWEuU3ByaXRlKCk7XG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5zcCk7XG4gICAgICAgIC8v55S757q/XG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0xpbmUoMTAsIDU4LCAxNDYsIDU4LCBcIiNmZjAwMDBcIiwgMyk7XG4gICAgICAgIC8v55S76L+e57ut55u057q/XG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0xpbmVzKDE3NiwgNTgsIFswLCAwLCAzOSwgLTUwLCA3OCwgMCwgMTE3LCA1MCwgMTU2LCAwXSwgXCIjZmYwMDAwXCIsIDUpO1xuICAgICAgICAvL+eUu+absue6v1xuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdDdXJ2ZXMoMzUyLCA1OCwgWzAsIDAsIDE5LCAtMTAwLCAzOSwgMCwgNTgsIDEwMCwgNzgsIDAsIDk3LCAtMTAwLCAxMTcsIDAsIDEzNiwgMTAwLCAxNTYsIDBdLCBcIiNmZjAwMDBcIiwgNSk7XG4gICAgICAgIC8v55S755+p5b2iXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1JlY3QoMTAsIDE2NiwgMTY2LCA5MCwgXCIjZmZmZjAwXCIpO1xuICAgICAgICAvL+eUu+Wkmui+ueW9olxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQb2x5KDI2NCwgMTY2LCBbMCwgMCwgNjAsIDAsIDc4LjQ4LCA1NywgMzAsIDkzLjQ4LCAtMTguNDgsIDU3XSwgXCIjZmZmZjAwXCIpO1xuICAgICAgICAvL+eUu+S4ieinkuW9olxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQb2x5KDQwMCwgMTY2LCBbMCwgMTAwLCA1MCwgMCwgMTAwLCAxMDBdLCBcIiNmZmZmMDBcIik7XG4gICAgICAgIC8v55S75ZyGXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0NpcmNsZSg5OCwgMzMyLCA1MCwgXCIjMDBmZmZmXCIpO1xuICAgICAgICAvL+eUu+aJh+W9olxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQaWUoMjQwLCAyOTAsIDEwMCwgMTAsIDYwLCBcIiMwMGZmZmZcIik7XG4gICAgICAgIC8v57uY5Yi25ZyG6KeS55+p5b2i77yM6Ieq5a6a5LmJ6Lev5b6EXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1BhdGgoNDAwLCAzMTAsIFtbXCJtb3ZlVG9cIiwgNSwgMF0sIFtcImxpbmVUb1wiLCAxMDUsIDBdLCBbXCJhcmNUb1wiLCAxMTAsIDAsIDExMCwgNSwgNV0sIFtcImxpbmVUb1wiLCAxMTAsIDU1XSwgW1wiYXJjVG9cIiwgMTEwLCA2MCwgMTA1LCA2MCwgNV0sIFtcImxpbmVUb1wiLCA1LCA2MF0sIFtcImFyY1RvXCIsIDAsIDYwLCAwLCA1NSwgNV0sIFtcImxpbmVUb1wiLCAwLCA1XSwgW1wiYXJjVG9cIiwgMCwgMCwgNSwgMCwgNV0sIFtcImNsb3NlUGF0aFwiXV0sIHtmaWxsU3R5bGU6IFwiIzAwZmZmZlwifSk7XG4gICAgfVxuICAgIC8qKioqKioqKioqICovXG5cbiAgICAvKipcbiAgICAgKiAg5rOo5YaM5YWo5bGA5L6m5ZCs5LqL5Lu2XG4gICAgICogXG4gICAgICovXG4gICAgcHJvdGVjdGVkIERpc09uKCB0eXBlOnN0cmluZywgY2FsbGJhY2tvYmo6YW55LCBjYWxsYmFja0hhbmRsZXI6RnVuY3Rpb24gKTp2b2lkXG4gICAge1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrb2JqLCBjYWxsYmFja0hhbmRsZXIgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAg5oqb5Ye65YWo5bGA5LqL5Lu2IFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBEaXNUcmlnZ2VyKHR5cGU6c3RyaW5nLCBkYXRhOmFueSA9IG51bGwpOnZvaWRcblx0e1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCB0eXBlLCBkYXRhICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog56e76Zmk5YWo5bGA5L6m5ZCs5LqL5Lu2XG4gICAgICovXG4gICAgcHJvdGVjdGVkIERpc09mZih0eXBlOnN0cmluZyxjYWxsYmFja29iajphbnksIGNhbGxiYWNrSGFuZGxlcjpGdW5jdGlvbik6dm9pZFxuICAgIHtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFja29iaiwgY2FsbGJhY2tIYW5kbGVyICk7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBzZXR1cCgpOiB2b2lkIHtcbiAgICAgICAgdmFyIHRleHRCb3g6TGF5YS5TcHJpdGUgPSBuZXcgTGF5YS5TcHJpdGUoKTtcblxuICAgICAgICAvLyDpmo/mnLrmkYbmlL7mlofmnKxcbiAgICAgICAgdmFyIHRleHQ6TGF5YS5UZXh0O1xuICAgICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgMTAwMDsgaSsrKSB7XG4gICAgICAgICAgICB0ZXh0ID0gbmV3IExheWEuVGV4dCgpO1xuICAgICAgICAgICAgdGV4dC5mb250U2l6ZSA9IDIwO1xuICAgICAgICAgICAgdGV4dC50ZXh0ID0gKE1hdGgucmFuZG9tKCkgKiAxMDApLnRvRml4ZWQoMCk7XG4gICAgICAgICAgICB0ZXh0LnJvdGF0aW9uID0gTWF0aC5yYW5kb20oKSAqIDM2MDtcbiAgICAgICAgICAgIHRleHQuY29sb3IgPSBcIiNDQ0NDQ0NcIjtcblxuICAgICAgICAgICAgdGV4dC54ID0gTWF0aC5yYW5kb20oKSAqIExheWEuc3RhZ2Uud2lkdGg7XG4gICAgICAgICAgICB0ZXh0LnkgPSBNYXRoLnJhbmRvbSgpICogTGF5YS5zdGFnZS5oZWlnaHQ7XG5cbiAgICAgICAgICAgIHRleHRCb3guYWRkQ2hpbGQodGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgLy/nvJPlrZjkuLrpnZnmgIHlm77lg49cbiAgICAgICAgdGV4dEJveC5jYWNoZUFzID0gXCJiaXRtYXBcIjtcblxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRleHRCb3gpO1xuICAgIH1cbiAgICAvKioqKioqKioqICoqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgcHJvdGVjdGVkIGdldFNpbmdsZVRvbihyZWY6YW55KTphbnlcblx0e1xuICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0UG9vbC5nZXRTaW5nbGVUb24ocmVmKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VuZE1lc3NhZ2UoIGFjdDpzdHJpbmcsZGF0YTphbnkgPSBudWxsLGlzU2hvd1dhaXQ6Ym9vbGVhbiA9IHRydWUgKTp2b2lkXG4gICAge1xuICAgICAgICBTZXJ2ZXJTb2NrZXQuSW5zdGFuY2Uuc2VuZE1lc3NhZ2UoYWN0LCBkYXRhLCBpc1Nob3dXYWl0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJvbGVEYXRhOlJvbGVEYXRhO1xuXG4gICAgcHVibGljIGdldCBSb2xlRGF0YSgpOlJvbGVEYXRhXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMucm9sZURhdGEpe1xuICAgICAgICAgICAgdGhpcy5yb2xlRGF0YSA9IFJvbGVEYXRhLkluc3RhbmNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJvbGVEYXRhO1xuICAgIH1cbn0iLCJpbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcbmltcG9ydCB7Q29tcGxldGVQYW5lbH0gZnJvbSBcIi4uL1ZpZXcvQ29tcGxldGVQYW5lbFwiO1xuaW1wb3J0IHtHYW1lU3RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9HYW1lU3RhdGVDb250cm9sXCI7XG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XG5pbXBvcnQge1NjZW5lQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvU2NlbmVDb250cm9sXCI7XG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xuaW1wb3J0IHsgUFJPVE9DT0xTLCBOZXR3b3JrTWFuYWdlciB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi4vV1hTREsvU2RrXCI7XG5pbXBvcnQge0FnZW5jeVRyaWFsfSBmcm9tIFwiLi9BZ2VuY3lUcmlhbFwiO1xuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcbmltcG9ydCBGcmllbmRJbnZpdGVWaWV3IGZyb20gXCIuLi9QdXNoL0ZyaWVuZEludml0ZVZpZXdcIjtcbmltcG9ydCBHaWZ0VmlldyBmcm9tIFwiLi4vVmlldy9HaWZ0Vmlld1wiO1xuaW1wb3J0IENob3V0aVBhblZpZXcgZnJvbSBcIi4uL1B1c2gvQ2hvdXRpUGFuVmlld1wiO1xuaW1wb3J0IHsgUmVjb3JkTWFuYWdlciB9IGZyb20gXCIuLi9XWFNESy9SZWNvcmRNYW5hZ2VyXCI7XG5pbXBvcnQgeyBNYWluUGFuZWwgfSBmcm9tIFwiLi4vVmlldy9NYWluUGFuZWxcIjtcblxuZXhwb3J0ICBjbGFzcyBBZ2VuY3lJbkdhbWUgZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbCBcbntcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5SW5HYW1lXCI7XG4gICAgc3RhdGljIGdhbWVudW06bnVtYmVyID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XG5cbiAgICBwcm90ZWN0ZWQgaW5pdFNlbGYoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLkRpc09uKCBHYW1lU3RhdGUuZW5kLHRoaXMsdGhpcy5lbmRnYW1lSGFuZGxlciApO1xuICAgICAgICB0aGlzLkRpc09uKEdhbWVTdGF0ZS5yZXZpdmUsdGhpcyx0aGlzLlJldml2ZWdhbWVIYW5kbGVyKTtcbiAgICAgICAgdGhpcy5EaXNPbihHYW1lU3RhdGUubG9zZSx0aGlzLHRoaXMuTG9zZWdhbWVIYW5kbGVyKTtcbiAgICB9XG4gICAgLyoq5aSN5rS755WM6Z2iICovXG4gICAgcHJpdmF0ZSBSZXZpdmVnYW1lSGFuZGxlcigpOnZvaWR7XG4gICAgICAgIExheWEudGltZXIub25jZSgxMDAwLHRoaXMsdGhpcy5yZXZpdmVWaWV3KTtcbiAgICB9XG4gICAgLyoq5aSx6LSl55WM6Z2iICovXG4gICAgcHJpdmF0ZSBMb3NlZ2FtZUhhbmRsZXIoKTp2b2lke1xuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMTAwMCx0aGlzLHRoaXMubG9zZVZpZXcpO1xuICAgIH1cbiAgICBwcml2YXRlIHJldml2ZVZpZXcoKXtcbiAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5SZWNvcmRTdG9wKCk7XG4gICAgICAgIHZhciBub3dtaW5nY3ZpOm51bWJlciA9IEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2Uubm93TWluZ0NpO1xuICAgICAgICB2YXIgZ2V0R29sZDpudW1iZXIgPSAwO1xuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuaJk+W8gOe7k+eul+eVjOmdoijlpI3mtLspXCIpO1xuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENvbXBsZXRlUGFuZWwsZ2V0R29sZCApO1xuICAgIH1cbiAgICBwcml2YXRlIGxvc2VWaWV3KCk6dm9pZHtcbiAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5SZWNvcmRTdG9wKCk7XG4gICAgICAgIHZhciBub3dtaW5nY3ZpOm51bWJlciA9IEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2Uubm93TWluZ0NpO1xuICAgICAgICB2YXIgZ2V0R29sZDpudW1iZXIgPSAwO1xuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuaJk+W8gOe7k+eul+eVjOmdoijlpLHotKUpXCIpO1xuICAgICAgICB0aGlzLlJlY3JvcExldmVsRW5kKCBmYWxzZSApO1xuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENvbXBsZXRlUGFuZWwsZ2V0R29sZCApO1xuICAgIH1cbiAgICBwcml2YXRlIGVuZGdhbWVIYW5kbGVyKCk6dm9pZFxuICAgIHtcbiAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5SZWNvcmRTdG9wKCk7XG4gICAgICAgIExheWEudGltZXIub25jZSggMTAwMCx0aGlzLHRoaXMuc3RhcnRFbmRWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhcnRFbmRWaWV3KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIG5vd21pbmdjdmk6bnVtYmVyID0gR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5ub3dNaW5nQ2k7XG4gICAgICAgIHZhciBnZXRHb2xkOm51bWJlciA9IDA7XG4gICAgICAgIGlmKCBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmVuZEdhbWVQbGF5ZXJBcnIubGVuZ3RoID09IDAgKVxuICAgICAgICB7XG4gICAgICAgICAgICBnZXRHb2xkID0gdGhpcy5Sb2xlRGF0YS5sZXZlbGNmZy53aW5Hb2xkO1xuICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLmiZPlvIDnu5PnrpfnlYzpnaIo5ri45oiP6IOc5YipKVwiKTtcbiAgICAgICAgICAgIHRoaXMuUmVjcm9wTGV2ZWxFbmQoIHRydWUgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggdGhpcy5Sb2xlRGF0YS5sZXZlbGNmZy5mYWlsR29kICk7XG4gICAgICAgICAgICBnZXRHb2xkID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggTnVtYmVyKGFyclswXSksTnVtYmVyKGFyclsxXSkgKTtcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5omT5byA57uT566X55WM6Z2iKOa4uOaIj+Wksei0pSlcIik7XG4gICAgICAgICAgICB0aGlzLlJlY3JvcExldmVsRW5kKCBmYWxzZSApO1xuICAgICAgICB9XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ29tcGxldGVQYW5lbCxnZXRHb2xkICk7XG4gICAgICAgIC8vIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ2hvdXRpUGFuVmlldywyICk7XG4gICAgfVxuXG4gICAgUmVjcm9wTGV2ZWxFbmQoX3dpbjpib29sZWFuKVxuICAgIHtcbiAgICAgICAgLy8gaWYoIUxheWEuQnJvd3Nlci5vbldlaVhpbilyZXR1cm47XG4gICAgICAgIC8vIHZhciBzdGFnZWlkID0gdGhpcy5Sb2xlRGF0YS5MZXZlbElELnRvU3RyaW5nKCk7XG4gICAgICAgIC8vIHZhciB1c2VpZCA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuVXNlSWQ7XG4gICAgICAgIC8vIHZhciBzdGFnZW5hbWUgPSBcIuesrFwiICsgdGhpcy5Sb2xlRGF0YS5MZXZlbElEICsgXCLlhbNcIjtcbiAgICAgICAgLy8gaWYoX3dpbilcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgV3hBcGkubGV2ZWxTdWNjZXNzKHN0YWdlaWQsc3RhZ2VuYW1lLHN0YWdlaWQpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGVsc2VcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgdmFyIGVxdWlwaWQgPSB0aGlzLlJvbGVEYXRhLkNoYXJhY3RlcklELnRvU3RyaW5nKCk7XG4gICAgICAgIC8vICAgICB2YXIgY2FybmFtZSA9IHRoaXMuUm9sZURhdGEucm9sZUNmZy5uYW1lO1xuICAgICAgICAvLyAgICAgV3hBcGkubGV2ZWxGYWlsKHN0YWdlaWQsc3RhZ2VuYW1lLHN0YWdlaWQsXCIwXCIsY2FybmFtZSk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmV0dXJubWFpbnZpZXcod2luPyk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYgKHdpbiAmJiBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLldoaXRlVXNlcikge1xuICAgICAgICAgICAgbGV0IHJhbiA9IE1hdGgucmFuZG9tKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuivr+inpuWHoOeOh+S4ui0tLVwiLCByYW4pO1xuICAgICAgICAgICAgaWYgKHJhbiA8PSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkVuZENoZWF0KSB7XG4gICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKEdpZnRWaWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEdhbWVTdGF0ZS5mdWh1b2Npc2h1ID0gMTtcbiAgICAgICAgICAgIEdhbWVTdGF0ZS5yZWNvcmRzY3JlZSA9IGZhbHNlO1xuICAgICAgICAgICAgR2FtZVN0YXRlLmlzZGllID0gZmFsc2U7XG4gICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5DbG9zZUdhbWVPdmVyRWZmZWN0KCk7XG4gICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZShDb21wbGV0ZVBhbmVsKTtcbiAgICAgICAgICAgIHRoaXMuRGlzVHJpZ2dlcihHYW1lU3RhdGUucmV0dXJuTWFpblZpZXcpO1xuICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLlNob3dUaGVHYW1lU2NlbmUoKTtcbiAgICAgICAgICAgIHZhciBhZ2VuY3l0cmlhbDogQWdlbmN5VHJpYWwgPSB0aGlzLmdldFNpbmdsZVRvbihBZ2VuY3lUcmlhbCk7XG4gICAgICAgICAgICBpZiAoYWdlbmN5dHJpYWwuaXNzaGl5b25naW5nKSAge1xuICAgICAgICAgICAgICAgIFNjZW5lQ29udHJvbC5JbnN0YW5jZS5DcmVhdGVQbGF5ZXIodGhpcy5Sb2xlRGF0YS5yb2xlQ2ZnKTtcbiAgICAgICAgICAgICAgICBhZ2VuY3l0cmlhbC5pc3NoaXlvbmdpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgR2FtZVN0YXRlLmZ1aHVvY2lzaHUgPSAxO1xuICAgICAgICAgICAgR2FtZVN0YXRlLnJlY29yZHNjcmVlID0gZmFsc2U7XG4gICAgICAgICAgICBHYW1lU3RhdGUuaXNkaWUgPSBmYWxzZTtcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLkluc3RhbmNlLkNsb3NlR2FtZU92ZXJFZmZlY3QoKTtcbiAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKENvbXBsZXRlUGFuZWwpO1xuICAgICAgICAgICAgdGhpcy5EaXNUcmlnZ2VyKEdhbWVTdGF0ZS5yZXR1cm5NYWluVmlldyk7XG4gICAgICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuU2hvd1RoZUdhbWVTY2VuZSgpO1xuICAgICAgICAgICAgdmFyIGFnZW5jeXRyaWFsOiBBZ2VuY3lUcmlhbCA9IHRoaXMuZ2V0U2luZ2xlVG9uKEFnZW5jeVRyaWFsKTtcbiAgICAgICAgICAgIGlmIChhZ2VuY3l0cmlhbC5pc3NoaXlvbmdpbmcpICB7XG4gICAgICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLkNyZWF0ZVBsYXllcih0aGlzLlJvbGVEYXRhLnJvbGVDZmcpO1xuICAgICAgICAgICAgICAgIGFnZW5jeXRyaWFsLmlzc2hpeW9uZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKEdhbWVTdGF0ZS5HYW1lTnVtJTMgPT0gMCl7XG4gICAgICAgICAgICBNYWluUGFuZWwuaW5zdGFuY2Uuc2tpbmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy/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+e1xuICAgICAgICAgICAgICAgIGlmKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuV2hpdGVVc2VyKXtcbiAgICAgICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKEdpZnRWaWV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaXNfbmV3dXNlclwiLFwiMVwiKTtcbiAgICAgICAgfVxuICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuU2V0U2NlbmUoKTtcbiAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuSW5pdEVmZmVjdCgpO1xuICAgIH1cbn0iLCJpbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xuaW1wb3J0IHtMb2NhbERhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9Mb2NhbERhdGFDb250cm9sXCI7XG5pbXBvcnQge1VzZXJEYXRhSW5mb30gZnJvbSBcIi4uL0RhdGEvVXNlckRhdGFJbmZvXCI7XG5pbXBvcnQge1NraW5EYXRhfSBmcm9tIFwiLi4vRGF0YS9Ta2luRGF0YVwiO1xuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XG5pbXBvcnQge1NraW5QYW5lbH0gZnJvbSBcIi4uL1ZpZXcvU2tpblBhbmVsXCI7XG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xuaW1wb3J0IHsgTmV0d29ya01hbmFnZXIsIFBST1RPQ09MUyB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4vQWdlbmN5VXNlck1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEFnZW5jeVNraW4gZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbCBcbntcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5U2tpblwiO1xuICAgIHN0YXRpYyBpbnN0YW5jZTpBZ2VuY3lTa2luO1xuICAgIFxuICAgIGxvY2FsZGF0YTphbnk7XG4gICAgcGlmdUFycjpBcnJheTxTa2luRGF0YT47XG4gICAgcGlmdURpY3Q6YW55O1xuXG4gICAgY29uc3RydWN0b3IoKSBcbiAgICB7IFxuICAgICAgICBzdXBlcigpOyBcbiAgICAgICAgQWdlbmN5U2tpbi5pbnN0YW5jZSA9IHRoaXM7XG5cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5pdFNlbGYoKTp2b2lkXG4gICAge1xuXG4gICAgfVxuXG4gICAgcHVibGljIGluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmxvY2FsZGF0YSA9IExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuR2V0TG9jYWxDYUNoZURhdGEoIFVzZXJEYXRhSW5mby5za2luICk7XG4gICAgICAgIHZhciBwaWZ1RGF0YTphbnk7XG4gICAgICAgIGlmKCAhdGhpcy5sb2NhbGRhdGEuaGFzT3duUHJvcGVydHkoIFwicGlmdVwiICkgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZGF0YVtcInBpZnVcIl0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBwaWZ1RGF0YSA9IHRoaXMubG9jYWxkYXRhW1wicGlmdVwiXTtcbiAgICAgICAgdGhpcy5waWZ1QXJyID0gW107XG4gICAgICAgIHRoaXMucGlmdURpY3QgPSB7fTtcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcbiAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gUm9sZUNGRy52ZWMubGVuZ3RoO1xuICAgICAgICBmb3IoIGkgPSAwO2kgPCBudW1zO2krKyApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwaWZ1dm86U2tpbkRhdGEgPSBuZXcgU2tpbkRhdGE7XG4gICAgICAgICAgICB2YXIgY2ZnOlJvbGVDRkcgPSBSb2xlQ0ZHLnZlY1tpXTtcbiAgICAgICAgICAgIHBpZnV2by5yb2xlQ0ZHID0gY2ZnO1xuICAgICAgICAgICAgdmFyIGQ6YW55ID0gcGlmdURhdGFbIGNmZy5pZCBdO1xuICAgICAgICAgICAgaWYoIGQgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBpZnV2by5zdGF0ZSA9IE51bWJlciggZC5zdGF0ZSApO1xuICAgICAgICAgICAgICAgIHBpZnV2by5oYXNudW0gPSBOdW1iZXIoIGQuaGFzbnVtICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICBwaWZ1dm8uaGFzbnVtID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCBjZmcuZ2V0U3RhdGUgPT0gMCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGlmdUFyci5wdXNoKCBwaWZ1dm8gKTtcbiAgICAgICAgICAgIHRoaXMucGlmdURpY3RbIHBpZnV2by5yb2xlQ0ZHLmlkIF0gPSBwaWZ1dm87XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHB1YmxpYyBvcGVudmlldygpOnZvaWRcbiAgICB7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggU2tpblBhbmVsICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFJvbGVTdGF0ZSggY2ZnOlJvbGVDRkcsdmFsdWU6bnVtYmVyICk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHBpZnV2bzpTa2luRGF0YSA9IHRoaXMucGlmdURpY3RbIGNmZy5pZCBdO1xuICAgICAgICBpZiggcGlmdXZvIClcbiAgICAgICAge1xuICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gMTtcbiAgICAgICAgICAgIHRoaXMuQWRkTG9jYWxTa2luRGF0YShwaWZ1dm8ucm9sZUNGRy5pZCxwaWZ1dm8uc3RhdGUscGlmdXZvLmhhc251bSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgIEFkZExvY2FsU2tpbkRhdGEoIGlkOmFueSxzdGF0ZTpudW1iZXIsaGFzbnVtOm51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubG9jYWxkYXRhW1wicGlmdVwiXVtpZF0gPSB7fTtcbiAgICAgICAgdGhpcy5sb2NhbGRhdGFbXCJwaWZ1XCJdW2lkXVtcInN0YXRlXCJdID0gc3RhdGU7XG4gICAgICAgIHRoaXMubG9jYWxkYXRhW1wicGlmdVwiXVtpZF1bXCJoYXNudW1cIl0gPSBoYXNudW07XG4gICAgICAgIExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuQWRkRGF0YSggVXNlckRhdGFJbmZvLnNraW4sdGhpcy5sb2NhbGRhdGEgKTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSByZWN0OkxheWEuU3ByaXRlO1xuXG5cdFx0cHJpdmF0ZSBjcmVhdGVDYW50cmFsUmVjdCgpOiB2b2lkIHtcblx0XHRcdHRoaXMucmVjdCA9IG5ldyBMYXlhLlNwcml0ZSgpO1xuXHRcdFx0dGhpcy5yZWN0LmdyYXBoaWNzLmRyYXdSZWN0KC0xMDAsIC0xMDAsIDIwMCwgMjAwLCBcImdyYXlcIik7XG5cdFx0XHRMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMucmVjdCk7XG5cblx0XHRcdHRoaXMudXBkYXRlUmVjdFBvcygpO1xuXHRcdH1cblxuXHRcdHByaXZhdGUgdXBkYXRlUmVjdFBvcygpOiB2b2lkIHtcblx0XHRcdHRoaXMucmVjdC54ID0gTGF5YS5zdGFnZS53aWR0aCAvIDI7XG5cdFx0XHR0aGlzLnJlY3QueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC8gMjtcblx0XHR9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHVibGljIEdhaW5QaWZ1KCBfc2tpbml0ZW06U2tpbkRhdGEgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggX3NraW5pdGVtLnN0YXRlID09IDEgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLlJvbGVEYXRhLkNoYXJhY3RlcklEID0gX3NraW5pdGVtLnJvbGVDRkcuaWQ7XG4gICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoIEdhbWVTdGF0ZS51cGRhdGVTS2luVmlldyApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgc3dpdGNoKCBfc2tpbml0ZW0ucm9sZUNGRy5nZXRTdGF0ZSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOi8v6KeG6aKR6I635Y+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+8jDDvvJrnoLjom4ssMTrlrp3nrrEqL1xuICAgIHN0YXRpYyBFZ2dHR3JvdXA6bnVtYmVyPTA7XG5cbiAgICAvKirnrb7liLDmmK/lkKbmraPlnKjmmL7npLogKi9cbiAgICBzdGF0aWMgSXNTaG93U2lnbjpib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlNjZW5lQ29udHJvbFxuICAgIHtcbiAgICAgICAgaWYoIFNjZW5lQ29udHJvbC5pbnMgPT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2NlbmVDb250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNjZW5lQ29udHJvbC5pbnM7XG4gICAgfVxuXG4gICAgLy/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+PSAxIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSAtPSAwLjAwMTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3ZhbHVlIDw9IDAgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0XzEuc2Nyb2xsUGFuZS5zZXRQZXJjWSggdGhpcy5fbm93dmFsdWUgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25jbG9zZWZ1bigpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLmlzZW5kID09IDEpe1xuICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIENob3V0aVBhblZpZXcgKTtcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5sb3NlICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiggdGhpcy5pc2VuZCA9PSAyKXtcbiAgICAgICAgICAgbGV0IGdvbGQgPSAgUm9sZURhdGEuSW5zdGFuY2UubGV2ZWxjZmcud2luR29sZDtcbiAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoQ2hvdXRpUGFuVmlldyk7XG4gICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZChDb21wbGV0ZVBhbmVsLGdvbGQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggQ2hvdXRpUGFuVmlldyApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXG4gICAge1xuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XG4gICAgICAgIHN1cGVyLmRlc3RvcnkoKTtcbiAgICB9XG4gICAgXG59IiwiaW1wb3J0IHtQYW5lbENoaWxkQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2xcIjtcbmltcG9ydCBDcGFFdmVudCBmcm9tIFwiLi9DcGFFdmVudFwiO1xuaW1wb3J0IHsgUmVjb21tZW5kLCBSZWNvbW1lbmRJdGVtIH0gZnJvbSBcIi4vUmVjb21tZW5kVmlld1wiO1xuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4vQ3BhSXRlbVwiO1xuaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xuLy8gaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi90dGFkXCI7XG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcbmltcG9ydCB7IFNjZW5lQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcGFEb3duc1ZpZXcgZXh0ZW5kcyBQYW5lbENoaWxkQ29udHJvbCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxue1xuICAgIGNfc3RhdGU6ZmFpcnlndWkuQ29udHJvbGxlcjtcbiAgICBsaXN0XzA6ZmFpcnlndWkuR0xpc3Q7XG4gICAgcHJpdmF0ZSBfbm93TGlzdDpSZWNvbW1lbmRJdGVtW107XG4gICAgcHJpdmF0ZSBfaXNTdGFydDpib29sZWFuO1xuICAgIHByaXZhdGUgX2lzY2FubW92ZTpib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaXNkb3duOmJvb2xlYW47XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cblxuICAgIHByb3RlY3RlZCBvbkluaXQoKTp2b2lkXG4gICAge1xuXG4gICAgICAgIHRoaXMuY19zdGF0ZSA9IHRoaXMuZ2V0Q29udHJvbGxlciggXCJjX3N0YXRlXCIgKTtcbiAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XG5cblxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFZpZXcoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmxpc3RfMC5zZXRWaXJ0dWFsKCk7XG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdCxudWxsLGZhbHNlICk7XG4gICAgICAgIHRoaXMuX2lzU3RhcnQgPSBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBpbml0RXZlbnQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLkFkZEV2ZW50RGF0YSggQ3BhRXZlbnQuWVFIb21lRGF0YSx0aGlzLHRoaXMueXFob21lZGF0YUhhbmRsZXIgKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9ET1dOLHRoaXMsdGhpcy5kb3duY2xpY2sgKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9VUCx0aGlzLHRoaXMudXBjbGljayApO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMudXBjbGljayApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZG93bmNsaWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoU2NlbmVDb250cm9sLklzU2hvd1NpZ24pcmV0dXJuO1xuICAgICAgICB0aGlzLl9pc2Rvd24gPSB0cnVlO1xuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSBmYWxzZTtcbiAgICAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xuXG4gICAgICAgIC8vIHR0YWQuQ3JlYXRlTW9yZUdhbWVCdG4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRpbWVvdXRDYWxsYmFjaygpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKFNjZW5lQ29udHJvbC5Jc1Nob3dTaWduKXJldHVybjtcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICBpZihTY2VuZUNvbnRyb2wuSXNTaG93U2lnbilyZXR1cm47XG4gICAgICAgIGlmKCB0aGlzLl9pc2Rvd24gKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9pc2Rvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gdGhpcy5saXN0XzAuc2Nyb2xsUGFuZS5wZXJjWDtcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSggMjAwMCx0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9tb3ZldGltZTpudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgX2ZsdXNodGltZTpudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgZGlyOmJvb2xlYW4gPSB0cnVlO1xuICAgIHByaXZhdGUgX25vd3ZhbHVlOm51bWJlciA9IDA7XG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuX2lzU3RhcnQgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggdGhpcy5saXN0XzAuc2Nyb2xsUGFuZSAmJiB0aGlzLl9ub3dMaXN0ICYmIHRoaXMuX2lzY2FubW92ZSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuZGlyIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlICs9IDAuMDAxO1xuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPj0gMSApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgLT0gMC4wMDE7XG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA8PSAwIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUuc2V0UGVyY1goIHRoaXMuX25vd3ZhbHVlICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGl0ZW1yZW5kZXJsaXN0KCBpbmRleDpudW1iZXIsaXRlbTpDcGFJdGVtICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIGluZGV4IDwgdGhpcy5fbm93TGlzdC5sZW5ndGggKVxuICAgICAgICB7XG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dMaXN0W2luZGV4XSx0cnVlICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHlxaG9tZWRhdGFIYW5kbGVyKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAxO1xuICAgICAgICB0aGlzLl9ub3dMaXN0ID0gUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YTtcbiAgICAgICAgdGhpcy5saXN0XzAubnVtSXRlbXMgPSB0aGlzLl9ub3dMaXN0Lmxlbmd0aDtcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgdGhpcy5fbm93TGlzdC5sZW5ndGg7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxuICAgIHtcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCh0aGlzKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cblxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIENwYUV2ZW50XG57XG4gICAgc3RhdGljIFlRSG9tZURhdGE6c3RyaW5nID0gXCJDcGFFdmVudF9ZUUhvbWVEYXRhXCI7XG59IiwiaW1wb3J0IHtQYW5lbENoaWxkQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2xcIjtcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcbmltcG9ydCBDaG91dGlQYW5WaWV3IGZyb20gXCIuL0Nob3V0aVBhblZpZXdcIjtcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uL1dYU0RLL1Nka1wiO1xuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3BhSXRlbSBleHRlbmRzIFBhbmVsQ2hpbGRDb250cm9sIFxue1xuICAgIGltZ190aXA6ZmFpcnlndWkuR0ltYWdlO1xuICAgIGxvYWRfaWNvbjpmYWlyeWd1aS5HTG9hZGVyO1xuICAgIHR4dF93b3JkOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgdHh0X3dvcmQxOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgcHJpdmF0ZSBfdm86UmVjb21tZW5kSXRlbTtcbiAgICBwcml2YXRlIGlzcGVuY2hvdXRpcGFuOmJvb2xlYW4gPSBmYWxzZTtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxuICAgIFxuICAgIHB1YmxpYyBvbkluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLm5hbWUgPSBcImNhcEl0ZW1cIjtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcyxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmJ0bmNsaWNrICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbmJ0bmNsaWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuX3ZvIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGRhdGE6UmVjb21tZW5kSXRlbSA9IHRoaXMuX3ZvO1xuICAgICAgICAgICAgRllIRF9TZGsuU2hvd0h1VHVpSnVtcChkYXRhLHRoaXMuaXNwZW5jaG91dGlwYW4pO1xuICAgICAgICAgICAgLy8gdmFyIGFwcGlkID0gZGF0YS50b19hcHBpZDtcbiAgICAgICAgICAgIC8vIHZhciBwYXRoID0gZGF0YS5qdW1wX3BhdGg7XG4gICAgICAgICAgICAvLyBsZXQgcGFyYW0gPSB7XCJhcHBJZFwiOmFwcGlkLnRvU3RyaW5nKCksXCJwYXRoXCI6cGF0aC50b1N0cmluZygpfTtcbiAgICAgICAgICAgIC8vIGlmKExheWEuQnJvd3Nlci5vbk1vYmlsZSlcbiAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgIC8vICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm5hdmlnYXRlVG9NaW5pUHJvZ3JhbShcbiAgICAgICAgICAgIC8vICAgICB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGFwcElkOmFwcGlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAvLyAgICAgICAgIHBhdGg6cGF0aC50b1N0cmluZygpLFxuICAgICAgICAgICAgLy8gICAgICAgICBzdWNjZXNzOnJlcz0+XG4gICAgICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi6Lez6L2s5Yiw5ri45oiP5aSx5oiQ5YqfXCIsXCIxXCIpO1xuICAgICAgICAgICAgLy8gICAgICAgICB9LFxuICAgICAgICAgICAgLy8gICAgICAgICBmYWlsOnJlcz0+XG4gICAgICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGlmKCB0aGlzLmlzcGVuY2hvdXRpcGFuIClcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dEYXRhKCBkYXRhOlJlY29tbWVuZEl0ZW0saXNvcGVuY2hvdXRpcGFuOmJvb2xlYW4gPSBmYWxzZSApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuaXNwZW5jaG91dGlwYW4gPSBpc29wZW5jaG91dGlwYW47XG4gICAgICAgIHRoaXMuX3ZvID0gZGF0YTtcbiAgICAgICAgaWYoIGRhdGEgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmxvYWRfaWNvbi51cmwgPSBkYXRhLmljb247XG4gICAgICAgICAgICBpZiggdGhpcy50eHRfd29yZCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy50eHRfd29yZC50ZXh0ID0gZGF0YS50b2dhbWVfbmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCB0aGlzLmltZ190aXAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1nX3RpcC52aXNpYmxlID0gTWF0aC5yYW5kb20oKSA+IDAuNT90cnVlOmZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIHRoaXMudHh0X3dvcmQxIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnR4dF93b3JkMS50ZXh0ID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCgyMzU0NzAsMTU2MTQzMCkudG9TdHJpbmcoKSArIFwi5Lq6546pXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgfVxufSIsImltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQgQ3BhRXZlbnQgZnJvbSBcIi4vQ3BhRXZlbnRcIjtcbmltcG9ydCB7IEZZSERfU2RrIH0gZnJvbSBcIi4uL1dYU0RLL0ZZSERfU2RrXCI7XG5cbmV4cG9ydCBjbGFzcyByZWNvbW1lbmRQYW5cbntcbiAgICBjb25zdHJ1Y3RvcihkYXRhOk9iamVjdClcbiAgICB7XG4gICAgICAgIHRoaXMuZ2FtZV9mbGcgPSBkYXRhW1wiZ2FtZV9mbGdcIl07XG4gICAgICAgIHRoaXMuZ2FtZV9pZCA9IGRhdGFbXCJnYW1lX2lkXCJdO1xuICAgICAgICB0aGlzLmdhbWVfbmFtZSA9IGRhdGFbXCJnYW1lX25hbWVcIl07XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhW1wiaWRcIl07XG4gICAgICAgIHRoaXMubG9jYXRpb25fZmxnID0gZGF0YVtcImxvY2F0aW9uX2ZsZ1wiXTtcbiAgICAgICAgdGhpcy5sb2NhdGlvbl9pZCA9IGRhdGFbXCJsb2NhdGlvbl9pZFwiXTtcbiAgICAgICAgdGhpcy5sb2NhdGlvbl9uYW1lID0gZGF0YVtcImxvY2F0aW9uX25hbWVcIl07XG4gICAgICAgIHRoaXMubWF0dGVyX3R5cGUgPSBkYXRhW1wibWF0dGVyX3R5cGVcIl07XG4gICAgfVxuICAgIGdhbWVfZmxnOnN0cmluZztcbiAgICBnYW1lX2lkOm51bWJlcjtcbiAgICBnYW1lX25hbWU6c3RyaW5nO1xuICAgIGlkOnN0cmluZztcbiAgICBsb2NhdGlvbl9mbGc6c3RyaW5nO1xuICAgIGxvY2F0aW9uX2lkOm51bWJlcjtcbiAgICBsb2NhdGlvbl9uYW1lOnN0cmluZztcbiAgICBtYXR0ZXJfdHlwZTpzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWNvbW1lbmRcbntcbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICBSZWNvbW1lbmQuSW5pdERhdGEoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0ZGF0YSA9IGZhbHNlO1xuICAgIHN0YXRpYyBJbml0RGF0YSgpXG4gICAge1xuICAgICAgICBSZWNvbW1lbmQuY2Fpbml4aWh1YW5EYXRhID0gUmVjb21tZW5kLkdldENhaU5pWGlhSHVhbkRhdGFzKCk7XG4gICAgICAgIFJlY29tbWVuZC5qaWVzdWFuRGF0YSA9IFJlY29tbWVuZC5HZXRKSWVTdWFuRGF0YXMoKTtcbiAgICAgICAgUmVjb21tZW5kLmdkeXhEYXRhID0gUmVjb21tZW5kLkdldEdEWVhEYXRhcygpO1xuICAgICAgICBSZWNvbW1lbmQuYmFva3VhbnlvdXhpRGF0YSA9IFJlY29tbWVuZC5HZXRCYW9LdWFuWW91WGlEYXRhcygpO1xuICAgICAgICBSZWNvbW1lbmQubW9yZURhdGEgPSBSZWNvbW1lbmQuR2V0TW9yZURhdGFzKCk7XG4gICAgICAgIGZvcih2YXIga2V5IGluIEZZSERfU2RrLnB1c2hEYXRhKVxuICAgICAgICB7XG4gICAgICAgICAgICBSZWNvbW1lbmQucmVjb21tZW5kRGljW0ZZSERfU2RrLnB1c2hEYXRhW2tleV0ubG9jYXRpb25fZmxnXSAgPSBuZXcgcmVjb21tZW5kUGFuKEZZSERfU2RrLnB1c2hEYXRhW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIFJlY29tbWVuZC5nZXRkYXRhID0gdHJ1ZTtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggQ3BhRXZlbnQuWVFIb21lRGF0YSApO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuS6kuaOqOaVsOaNruWIneWni+WMlnJlY29tbWVuZC0tLS0tLS0tLS0tLS0tXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyByZWNvbW1lbmREaWMgPSB7fTtcbiAgICBzdGF0aWMgY2Fpbml4aWh1YW5EYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xuICAgIHN0YXRpYyBiYW9rdWFueW91eGlEYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xuICAgIHN0YXRpYyBnZHl4RGF0YTpSZWNvbW1lbmRJdGVtW10gPSBbXTtcbiAgICBzdGF0aWMgamllc3VhbkRhdGE6UmVjb21tZW5kSXRlbVtdID0gW107XG4gICAgc3RhdGljIG1vcmVEYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xuXG5cbiAgICBzdGF0aWMgR2V0U1NEYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxuICAgIHtcbiAgICAgICAgdmFyIGl0ZW1zOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xuICAgICAgICBpZighRllIRF9TZGsucHVzaERhdGEpcmV0dXJuIGl0ZW1zO1xuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBGWUhEX1Nkay5wdXNoRGF0YS5sZW5ndGg7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKEZZSERfU2RrLnB1c2hEYXRhW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHN0YXRpYyBHZXRDYWlOaVhpYUh1YW5EYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxuICAgIHtcbiAgICAgICAgdmFyIGl0ZW1zOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xuICAgICAgICBpZighRllIRF9TZGsucHVzaERhdGEpcmV0dXJuIGl0ZW1zO1xuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBGWUhEX1Nkay5wdXNoRGF0YS5sZW5ndGg7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKEZZSERfU2RrLnB1c2hEYXRhW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0TW9yZURhdGFzKCk6UmVjb21tZW5kSXRlbVtdXG4gICAge1xuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XG4gICAgICAgIGlmKCFGWUhEX1Nkay5wdXNoRGF0YSlyZXR1cm4gaXRlbXM7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IEZZSERfU2RrLnB1c2hEYXRhLmxlbmd0aDtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3IFJlY29tbWVuZEl0ZW0oRllIRF9TZGsucHVzaERhdGFbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgc3RhdGljIEdldEJhb0t1YW5Zb3VYaURhdGFzKCk6UmVjb21tZW5kSXRlbVtdXG4gICAge1xuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XG4gICAgICAgIGlmKCFGWUhEX1Nkay5wdXNoRGF0YSlyZXR1cm4gaXRlbXM7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IEZZSERfU2RrLnB1c2hEYXRhLmxlbmd0aDtpKyspXG4gICAgICAgIHsgXG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKEZZSERfU2RrLnB1c2hEYXRhW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHN0YXRpYyBHZXRKSWVTdWFuRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cbiAgICB7XG4gICAgICAgIHZhciBpdGVtczpSZWNvbW1lbmRJdGVtW10gPSBbXTtcbiAgICAgICAgaWYoIUZZSERfU2RrLnB1c2hEYXRhKXJldHVybiBpdGVtcztcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgRllIRF9TZGsucHVzaERhdGEubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShGWUhEX1Nkay5wdXNoRGF0YVtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBzdGF0aWMgR2V0R0RZWERhdGFzKCk6UmVjb21tZW5kSXRlbVtdXG4gICAge1xuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XG4gICAgICAgIGlmKCFGWUhEX1Nkay5wdXNoRGF0YSlyZXR1cm4gaXRlbXM7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IEZZSERfU2RrLnB1c2hEYXRhLmxlbmd0aDtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3IFJlY29tbWVuZEl0ZW0oRllIRF9TZGsucHVzaERhdGFbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVjb21tZW5kSXRlbVxue1xuICAgIGNvbnN0cnVjdG9yKERhdGE6T2JqZWN0KVxuICAgIHtcbiAgICAgICAgdGhpcy5pY29uID0gRGF0YVtcImljb25cIl07XG4gICAgICAgIHRoaXMudG9fYXBwaWQgPSBEYXRhW1widG9fYXBwaWRcIl07XG4gICAgICAgIHRoaXMudG9nYW1lX25hbWUgPSBEYXRhW1widG9nYW1lX25hbWVcIl07XG4gICAgICAgIHRoaXMuanVtcF9wYXRoID0gRGF0YVtcImp1bXBfcGF0aFwiXTtcbiAgICAgICAgdGhpcy5qdW1wX3R5cGUgPSBEYXRhW1wianVtcF90eXBlXCJdO1xuICAgICAgICB0aGlzLnBhbmVsID0gRGF0YVtcInBhbmVsXCJdO1xuICAgICAgICB0aGlzLnFyY29kZSA9IERhdGFbXCJxcmNvZGVcIl07XG4gICAgfVxuICAgIGljb246c3RyaW5nO1xuICAgIHRvX2FwcGlkOnN0cmluZztcbiAgICB0b2dhbWVfbmFtZTpzdHJpbmc7XG4gICAganVtcF9wYXRoOnN0cmluZztcbiAgICBqdW1wX3R5cGU6bnVtYmVyO1xuICAgIHBhbmVsOm51bWJlcjtcbiAgICBxcmNvZGU6c3RyaW5nO1xufVxuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY29tbWVuZFZpZXdcbntcbiAgICBcbiAgICBjb25zdHJ1Y3RvcigpIHsgXG4gICAgICAgIFxuICAgICB9XG59IiwiaW1wb3J0IHtQYW5lbENoaWxkQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2xcIjtcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcbmltcG9ydCBDcGFJdGVtIGZyb20gXCIuL0NwYUl0ZW1cIjtcbmltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcbi8vIGltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vdHRhZFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGl3YW50dWlqaWFuVmlldyBleHRlbmRzIFBhbmVsQ2hpbGRDb250cm9sIGltcGxlbWVudHMgVGltZXJDb250cm9sXG57XG4gICAgXG4gICAgbGlzdF8wOmZhaXJ5Z3VpLkdMaXN0O1xuICAgIHByaXZhdGUgX25vd2xpc3Q6UmVjb21tZW5kSXRlbVtdO1xuICAgIHByaXZhdGUgX2lzU3RhcnQ6Ym9vbGVhbjtcbiAgICBwcml2YXRlIF9pc2Nhbm1vdmU6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2lzZG93bjpib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKCkgXG4gICAgeyBcbiAgICAgICAgc3VwZXIoKTsgXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRWaWV3KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xuICAgICAgICB0aGlzLmxpc3RfMC5pdGVtUmVuZGVyZXIgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKCB0aGlzLHRoaXMuaXRlbXJlbmRlcmxpc3QsbnVsbCxmYWxzZSApO1xuICAgICAgICB0aGlzLl9ub3dsaXN0ID0gUmVjb21tZW5kLmppZXN1YW5EYXRhO1xuICAgICAgICBpZiggdGhpcy5fbm93bGlzdC5sZW5ndGggPiAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5saXN0XzAubnVtSXRlbXMgPSB0aGlzLl9ub3dsaXN0Lmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLl9ub3dsaXN0Lmxlbmd0aDtpKyspXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9pc1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IHRydWU7XG4gICAgICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9ET1dOLHRoaXMsdGhpcy5kb3duY2xpY2sgKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9VUCx0aGlzLHRoaXMudXBjbGljayApO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMudXBjbGljayApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZG93bmNsaWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5faXNkb3duID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gZmFsc2U7XG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy50aW1lb3V0Q2FsbGJhY2sgKTtcblxuICAgICAgICAvLyB0dGFkLkNyZWF0ZU1vcmVHYW1lQnRuKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0aW1lb3V0Q2FsbGJhY2soKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBjbGljaygpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLl9pc2Rvd24gKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9pc2Rvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gdGhpcy5saXN0XzAuc2Nyb2xsUGFuZS5wZXJjWTtcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSggMjAwMCx0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGl0ZW1yZW5kZXJsaXN0KCBpbmRleDpudW1iZXIsaXRlbTpDcGFJdGVtICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIGluZGV4IDwgdGhpcy5fbm93bGlzdC5sZW5ndGggKVxuICAgICAgICB7XG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dsaXN0W2luZGV4XSx0cnVlICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9tb3ZldGltZTpudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgX2ZsdXNodGltZTpudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgZGlyOmJvb2xlYW4gPSB0cnVlO1xuICAgIHByaXZhdGUgX25vd3ZhbHVlOm51bWJlciA9IDA7XG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuX2lzU3RhcnQgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggdGhpcy5saXN0XzAuc2Nyb2xsUGFuZSAmJiB0aGlzLl9ub3dsaXN0ICYmIHRoaXMuX25vd2xpc3QubGVuZ3RoID4gMCAmJiB0aGlzLl9pc2Nhbm1vdmUgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKCB0aGlzLmRpciApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSArPSAwLjAwMTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3ZhbHVlID49IDEgKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlIC09IDAuMDAxO1xuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPD0gMCApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RfMC5zY3JvbGxQYW5lLnNldFBlcmNZKCB0aGlzLl9ub3d2YWx1ZSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSBmYWxzZTtcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIFxufSIsImltcG9ydCBDcGFJdGVtIGZyb20gXCIuL0NwYUl0ZW1cIjtcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcbmltcG9ydCB7IFBhbmVsQmFzZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUdWlqaWFuVmlldyBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2wgXG57XG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIlR1aWppYW5WaWV3XCI7XG4gICAgYnRuX2Nsb3NlOmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgbGlzdF8xOmZhaXJ5Z3VpLkdMaXN0O1xuICAgIGxpc3RfMjpmYWlyeWd1aS5HTGlzdDtcbiAgICBwcml2YXRlIF9ub3dsaXN0MTpSZWNvbW1lbmRJdGVtW107XG4gICAgcHJpdmF0ZSBfbm93bGlzdDI6UmVjb21tZW5kSXRlbVtdO1xuICAgIHByaXZhdGUgbW9yZTpmYWlyeWd1aS5HTG9hZGVyO1xuXG4gICAgY29uc3RydWN0b3IoKSBcbiAgICB7IFxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJ0dWlqaWFuVmlld1wiICk7IFxuICAgIH1cbiAgICBcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmxpc3RfMS5zZXRWaXJ0dWFsKCk7XG4gICAgICAgIHRoaXMubGlzdF8xLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdDEsbnVsbCxmYWxzZSApO1xuICAgICAgICB0aGlzLmxpc3RfMi5zZXRWaXJ0dWFsKCk7XG4gICAgICAgIHRoaXMubGlzdF8yLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUodGhpcyx0aGlzLml0ZW1yZW5kZXJsaXN0MixudWxsLGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9ub3dsaXN0MSA9IFJlY29tbWVuZC5nZHl4RGF0YTtcbiAgICAgICAgdGhpcy5fbm93bGlzdDIgPSBSZWNvbW1lbmQuZ2R5eERhdGE7XG4gICAgICAgIHRoaXMubGlzdF8xLm51bUl0ZW1zID0gNztcbiAgICAgICAgdGhpcy5saXN0XzIubnVtSXRlbXMgPSB0aGlzLl9ub3dsaXN0Mi5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYnRuX2Nsb3NlLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLm9uY2xvc2VmdW4gKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5tb3JlLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLkp1bXBBcHAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGl0ZW1yZW5kZXJsaXN0MSggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBpbmRleCA8IDcgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dsaXN0MVtpbmRleF0gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIGl0ZW1yZW5kZXJsaXN0MiggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBpbmRleCA8IHRoaXMuX25vd2xpc3QyLmxlbmd0aCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIHRoaXMuX25vd2xpc3QyW2luZGV4XSApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbmNsb3NlZnVuKCk6dm9pZFxuICAgIHtcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIFR1aWppYW5WaWV3ICk7XG4gICAgfVxuXG4gICAgLy/pmo/mnLrot7PovazmuLjmiI9cbiAgICBwcml2YXRlIEp1bXBBcHAoKTp2b2lke1xuICAgICAgICBsZXQgcmFuID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCgwLHRoaXMuX25vd2xpc3QxLmxlbmd0aC0xKTtcbiAgICAgICAgRllIRF9TZGsuU2hvd0h1VHVpSnVtcCh0aGlzLl9ub3dsaXN0MVtyYW5dLGZhbHNlKTtcbiAgICB9XG59IiwiZXhwb3J0IGNsYXNzIFRpbWVVdGlscyB7XG5cbiAgICAvKipcbiAgICAgKiDmnIgv5pelIOWwj+aXtjrliIbpkp9cbiAgICAgKiBAcGFyYW0gdmFsdWUgXG4gICAgICovXG4gICAgc3RhdGljICBmb3JtYXREYXRhKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XG4gICAgICAgIHN0ciA9IHRoaXMuZ2V0VHdvKGRhdGUuZ2V0TW9udGgoKSArIDEpICsgXCIvXCIgKyB0aGlzLmdldFR3byhkYXRlLmdldERhdGUoKSkgKyBcIiBcIiArIHRoaXMuZ2V0VHdvKGRhdGUuZ2V0SG91cnMoKSkgKyBcIjpcIiArIHRoaXMuZ2V0VHdvKGRhdGUuZ2V0TWludXRlcygpKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmnIgv5pelXG4gICAgICogQHBhcmFtIHZhbHVlIFxuICAgICAqL1xuICAgIHN0YXRpYyAgZm9ybWF0RGF0YTEodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHZhciBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgKiAxMDAwKTtcbiAgICAgICAgc3RyID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpICsgXCLmnIhcIiArIGRhdGUuZ2V0RGF0ZSgpICsgXCLml6VcIjtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlubTmnIjml6VcbiAgICAgKiBAcGFyYW0gdmFsdWUgXG4gICAgICovXG4gICAgc3RhdGljICBmb3JtYXRZZWFyTW9udGhEYXRlKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XG4gICAgICAgIHN0ciA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiLlwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpICsgXCIuXCIgKyBkYXRlLmdldERhdGUoKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlubQt5pyILeaXpVxuICAgICAqIEBwYXJhbSB2YWx1ZSBcbiAgICAgKi9cbiAgICBzdGF0aWMgIGZvcm1hdFllYXJNb250aERhdGUxKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XG4gICAgICAgIHZhciBtb250aDogc3RyaW5nID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpID49IDEwID8gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkgOiBcIjBcIiArIChkYXRlLmdldE1vbnRoKCkgKyAxKTtcbiAgICAgICAgdmFyIGRhdGVzOiBzdHJpbmcgPSBkYXRlLmdldERhdGUoKSA+PSAxMCA/IGRhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkgOiBcIjBcIiArIGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICBzdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIi1cIiArIG1vbnRoICsgXCItXCIgKyBkYXRlcztcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cblxuICAgIHN0YXRpYyAgTFhhbmRKWFRpbWVUeXBlKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICAgICAgICBzdHIgPSBcIjDnp5JcIjtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8IDYwKSB7XG4gICAgICAgICAgICBzdHIgPSBNYXRoLmZsb29yKHZhbHVlKSArIFwi56eSXCI7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCA2MCAqIDYwKSB7XG4gICAgICAgICAgICBzdHIgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjApICsgXCLliIbpkp9cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBob3VyOiBudW1iZXI7XG4gICAgICAgICAgICBob3VyID0gTWF0aC5mbG9vcih2YWx1ZSAvIDYwIC8gNjApO1xuICAgICAgICAgICAgc3RyID0gaG91ciArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICBzdHIgKz0gTWF0aC5mbG9vcigodmFsdWUgLSBob3VyICogNjAgKiA2MCkgLyA2MCkgKyBcIuWIhumSn1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5qC85byP5YyW5pe26Ze0XG4gICAgICogQHBhcmFtIHRpbWUg56eSXG4gICAgICogQHJldHVybiDov5Tlm54yNDo1OTo1OVxuICAgICAqL1xuICAgIHN0YXRpYyAgZm9ybWF0VGltZSh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xuICAgICAgICBpZiggaG91cnMgPiAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgc3RyICs9IGhvdXJzID49IDEwID8gKGhvdXJzICsgXCI6XCIpIDogKFwiMFwiICsgaG91cnMgKyBcIjpcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSAzNjAwKSAvIDYwKTtcbiAgICAgICAgc3RyICs9IG1pbnV0ZXMgPj0gMTAgPyAobWludXRlcyArIFwiOlwiKSA6IChcIjBcIiArIG1pbnV0ZXMgKyBcIjpcIik7XG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIDYwKTtcbiAgICAgICAgc3RyICs9IHNlY29uZCA+PSAxMCA/IChzZWNvbmQgKyBcIlwiKSA6IChcIjBcIiArIHNlY29uZCk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5qC85byP5YyW5pe26Ze0XG4gICAgICogQHBhcmFtIHRpbWUg56eSXG4gICAgICogQHJldHVybiDov5Tlm54yNOWwj+aXtjU55YiGNTnnp5IgXG4gICAgICovXG4gICAgc3RhdGljICBmb3JtYXRUaW1lMSh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xuICAgICAgICBpZiggaG91cnMgPiAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDM2MDApIC8gNjApO1xuICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiG6ZKfXCI7XG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIDYwKTtcbiAgICAgICAgc3RyICs9IHNlY29uZCArIFwi56eSXCI7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5qC85byP5YyW5pe26Ze0XG4gICAgICogQHBhcmFtIHRpbWUg56eSXG4gICAgICogQHJldHVybiDov5Tlm54x5bCP5pe2MjTliIYxMOenklxuICAgICAqL1xuICAgIHN0YXRpYyAgZm9ybWF0VGltZTUodGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyAzNjAwKTtcbiAgICAgICAgaWYoIGhvdXJzID4gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHN0ciArPSBob3VycyArIFwi5bCP5pe2XCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSAzNjAwKSAvIDYwKTtcbiAgICAgICAgaWYobWludXRlcz4wKVxuICAgICAgICB7XG4gICAgICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiGXCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgNjApO1xuICAgICAgICBzdHIgKz0gc2Vjb25kICsgXCLnp5JcIjtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmoLzlvI/ljJbml7bpl7RcbiAgICAgKiBAcGFyYW0gdGltZSDnp5JcbiAgICAgKiBAcmV0dXJuIOi/lOWbnjHlpKkyNOWwj+aXtjU55YiGNTnnp5JcbiAgICAgKi9cbiAgICBzdGF0aWMgIGZvcm1hdFRpbWUyKHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHZhciBkYXk6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDg2NDAwKTtcbiAgICAgICAgaWYoZGF5PjApe1xuICAgICAgICAgICAgc3RyICs9IGRheSArIFwi5aSpXCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyAzNjAwKTtcbiAgICAgICAgaWYoaG91cnM+MCl7XG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgMzYwMCkgLyA2MCk7XG4gICAgICAgIGlmKG1pbnV0ZXM+MCl7XG4gICAgICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiG6ZKfXCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gTWF0aC5jZWlsKHRpbWUgJSA2MCk7XG4gICAgICAgIHN0ciArPSBzZWNvbmQgKyBcIuenklwiO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOagvOW8j+WMluaXtumXtFxuICAgICAqIEBwYXJhbSB0aW1lIOenklxuICAgICAqIEByZXR1cm4g6L+U5ZueMeWkqTI05bCP5pe277yIIOWPquS/neeVmeS4pOS4qiDvvIlcbiAgICAgKi9cbiAgICBzdGF0aWMgIGZvcm1hdFRpbWU2KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHZhciBpbmRleDpudW1iZXIgPSAwO1xuICAgICAgICB2YXIgZGF5OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyA4NjQwMCk7XG4gICAgICAgIGlmIChkYXk+MCl7XG4gICAgICAgICAgICBzdHIgKz0gZGF5ICsgXCLlpKlcIjtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgODY0MDApIC8gMzYwMCk7XG4gICAgICAgIGlmIChob3Vycz4wKXtcbiAgICAgICAgICAgIHN0ciArPSBob3VycyArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA8IDIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgMzYwMCkgLyA2MCk7XG4gICAgICAgICAgICBpZihtaW51dGVzPjApe1xuICAgICAgICAgICAgICAgIHN0ciArPSBtaW51dGVzICsgXCLliIZcIjtcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA8IDIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IE1hdGguY2VpbCh0aW1lICUgNjApO1xuICAgICAgICAgICAgc3RyICs9IHNlY29uZCArIFwi56eSXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvKipcbiAqIOagvOW8j+WMluaXtumXtFxuICogQHBhcmFtIHRpbWUg56eSXG4gKiBAcmV0dXJuIOi/lOWbnjHlpKkyNOWwj+aXtjU55YiGXG4gKi9cbnN0YXRpYyAgZm9ybWF0VGltZTModGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGRheTogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gODY0MDApO1xuICAgICAgICBzdHIgKz0gZGF5ICsgXCLlpKlcIjtcbiAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSA4NjQwMCAvIDM2MDApO1xuICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xuXG4gICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgODY0MDAgJSAzNjAwKSAvIDYwKTtcbiAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhlwiO1xuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqXG4qIOagvOW8j+WMluaXtumXtFxuKiBAcGFyYW0gdGltZSDnp5JcbiogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhlxuKi9cbnN0YXRpYyAgZm9ybWF0VGltZTQodGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgaWYgKHRpbWUgPiA4NjQwMCkge1xuICAgICAgICAgICAgdmFyIGRheTogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gODY0MDApO1xuICAgICAgICAgICAgc3RyICs9IGRheSArIFwi5aSpXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWUgPiAzNjAwKSB7XG4gICAgICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIDg2NDAwIC8gMzYwMCk7XG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lID4gNjApIHtcbiAgICAgICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgODY0MDAgJSAzNjAwKSAvIDYwKTtcbiAgICAgICAgICAgIHN0ciArPSBtaW51dGVzICsgXCLliIbpkp9cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgICAgIC8qKlxuKiDmoLzlvI/ljJbml7bpl7RcbiogQHBhcmFtIHRpbWUg56eSXG4qIEByZXR1cm4g6L+U5ZueMeWkqTI05bCP5pe2NTnliIZcbiovXG5zdGF0aWMgIGZvcm1hdFRpbWU0QXJyKHRpbWU6IG51bWJlcik6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICB2YXIgYXJyVGltZTpBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIC8vIGlmICh0aW1lID49IDg2NDAwKSB7XG4gICAgICAgIC8vICAgICB2YXIgZGF5OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyA4NjQwMCk7XG4gICAgICAgIC8vICAgICBhcnJUaW1lLnVuc2hpZnQoU3RyaW5nKGRheSkpO1xuICAgICAgICAvLyB9XG4gICAgICAgIGlmICh0aW1lID49IDM2MDApIHtcbiAgICAgICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgODY0MDAgLyAzNjAwKTtcbiAgICAgICAgICAgIGFyclRpbWUudW5zaGlmdChTdHJpbmcoaG91cnMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZSA+PSA2MCkge1xuICAgICAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSA4NjQwMCAlIDM2MDApIC8gNjApO1xuICAgICAgICAgICAgYXJyVGltZS51bnNoaWZ0KFN0cmluZyhtaW51dGVzKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJyVGltZTtcbiAgICB9XG5cblxuICAgIHN0YXRpYyAgZ2V0VHdvKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICBpZiAoc3RyLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHN0ciA9IFwiMFwiICsgc3RyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pel5pyf6L2s5pe26Ze05oizXG4gICAgICogQHBhcmFtIHN0ciAyMDE4LTEtMSBcbiAgICAgKi9cbiAgICBzdGF0aWMgIGRhdGV0b1RpbWUoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gRGF0ZS5wYXJzZShzdHIpIC8gMTAwMDtcbiAgICB9XG59IiwiaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIFRpbWVyU2VydmljZSBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXG57XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlRpbWVyU2VydmljZTtcbiAgICBwcml2YXRlIF90aW1lU2NhbGU6bnVtYmVyID0gMTtcblxuICAgIHByaXZhdGUgX3Vuc2NhbGFibGVMaXN0OkFycmF5PFRpbWVyQ29udHJvbD4gPSBbXTtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBUaW1lclNlcnZpY2UuaW5zID0gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlRpbWVyU2VydmljZVxuICAgIHtcbiAgICAgICAgaWYoIFRpbWVyU2VydmljZS5pbnMgPT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGltZXJTZXJ2aWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbWVyU2VydmljZS5pbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICBMYXlhLnRpbWVyLmZyYW1lTG9vcCggMSwgdGhpcywgdGhpcy5vblRpbWVyICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RXZlbnQoKTp2b2lkXG4gICAge1xuICAgICAgIFxuICAgIH1cblxuICAgIHB1YmxpYyBzdG9wKCk6dm9pZFxuICAgIHtcbiAgICAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcywgdGhpcy5vblRpbWVyICk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlY292ZXIoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoIDEsIHRoaXMsIHRoaXMub25UaW1lciApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25UaW1lcigpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XG4gICAgICAgIGZvcihpPTA7IGk8dGhpcy5fdW5zY2FsYWJsZUxpc3QubGVuZ3RoOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3Vuc2NhbGFibGVMaXN0W2ldLnVwZGF0ZShMYXlhLnRpbWVyLmRlbHRhICogdGhpcy5fdGltZVNjYWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNVcGRhdGFUYXJnZXQoIHVwZGF0ZVRhcmdldDpUaW1lckNvbnRyb2wgKTpCb29sZWFuXG4gICAge1xuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyO1xuICAgICAgICBpbmRleCA9IHRoaXMuX3Vuc2NhbGFibGVMaXN0LmluZGV4T2YodXBkYXRlVGFyZ2V0KTtcbiAgICAgICAgaWYoIGluZGV4ICE9IC0xIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRVcGRhdGVUYXJnZXQodXBkYXRlVGFyZ2V0OlRpbWVyQ29udHJvbCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGluZGV4Om51bWJlcjtcbiAgICAgICAgaW5kZXggPSB0aGlzLl91bnNjYWxhYmxlTGlzdC5pbmRleE9mKHVwZGF0ZVRhcmdldCk7XG4gICAgICAgIGlmKGluZGV4PT0tMSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fdW5zY2FsYWJsZUxpc3QucHVzaCh1cGRhdGVUYXJnZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZVVwZGF0ZVRhcmdldCh1cGRhdGVUYXJnZXQ6VGltZXJDb250cm9sKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gdGhpcy5fdW5zY2FsYWJsZUxpc3QuaW5kZXhPZih1cGRhdGVUYXJnZXQpO1xuICAgICAgICBpZihpbmRleCE9LTEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3Vuc2NhbGFibGVMaXN0LnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGltZVNjYWxlKCk6bnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGltZVNjYWxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdGltZVNjYWxlKHZhbHVlOm51bWJlcilcbiAgICB7XG4gICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgaXNOYU4odmFsdWUpKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGltZVNjYWxlID0gdmFsdWU7XG4gICAgfVxufSIsImltcG9ydCB7VXNlckRhdGFJbmZvfSBmcm9tIFwiLi4vRGF0YS9Vc2VyRGF0YUluZm9cIjtcbmltcG9ydCB7TG9jYWxEYXRhQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvTG9jYWxEYXRhQ29udHJvbFwiO1xuaW1wb3J0IHtwaW5ndGFpdXRpbHN9IGZyb20gXCIuLi9XWFNESy9waW5ndGFpdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIFRpbWVzVGFtcGVyIGltcGxlbWVudHMgVGltZXJDb250cm9sXG57XG5cdHB1YmxpYyBsYXN0Z2FtZVRpbWU6bnVtYmVyID0gMDtcblx0cHVibGljIGNvbnN0cnVjdG9yKCkgXG5cdHtcblxuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgaW5zOiBUaW1lc1RhbXBlcjtcblxuXHRwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBUaW1lc1RhbXBlciB7XG4gICAgICAgIGlmIChUaW1lc1RhbXBlci5pbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lc1RhbXBlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaW1lc1RhbXBlci5pbnM7XG4gICAgfVxuXG5cdHB1YmxpYyBpbml0KCApOnZvaWRcblx0e1xuXHRcdHRoaXMubGFzdGdhbWVUaW1lID0gTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5nZXRudW0oIFVzZXJEYXRhSW5mby5sYXN0dGltZSApO1xuXHRcdExheWEudGltZXIuZnJhbWVMb29wKDEsIHRoaXMsIHRoaXMudXBkYXRlICk7XG5cdH1cblxuXHQvKipcblx0ICog5ZCM5q2l5pyN5Yqh5Zmo5pe26Ze0KOenkilcblx0ICovXG5cdHByaXZhdGUgX3NlcnZlclRpbWU6IG51bWJlciA9IDA7XG5cblx0cHJpdmF0ZSBpc2Nhbjpib29sZWFuID0gZmFsc2U7XG5cdHByaXZhdGUgX29ubGluZWRpc3RpbWU6bnVtYmVyID0gMDtcblx0XG5cdHB1YmxpYyB1cGRhdGVTZXJ2aWNlVGltZShzZXJ2ZXJUaW1lOiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLl9zZXJ2ZXJUaW1lID0gTnVtYmVyKHNlcnZlclRpbWUpO1xuXHRcdHRoaXMuaXNjYW4gPSB0cnVlO1xuXHRcdHRoaXMuX29ubGluZWRpc3RpbWUgPSB0aGlzLl9zZXJ2ZXJUaW1lO1xuXHRcdExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuYWRkc3RyKCBVc2VyRGF0YUluZm8ubGFzdHRpbWUsdGhpcy5fc2VydmVyVGltZS50b1N0cmluZygpICk7XG5cdH1cblxuXHRwcml2YXRlIF90aW1lOm51bWJlciA9IDA7XG5cdHByaXZhdGUgX29ubGluZXRpbWU6bnVtYmVyID0gMDtcblx0cHVibGljIHVwZGF0ZSgpOiB2b2lkIFxuXHR7XG5cdFx0aWYoIHRoaXMuaXNjYW4gKVxuXHRcdHtcblx0XHRcdHRoaXMuX3RpbWUgKz0gTGF5YS50aW1lci5kZWx0YTtcblx0XHRcdHRoaXMuX29ubGluZXRpbWUgKz0gTGF5YS50aW1lci5kZWx0YTtcblx0XHRcdHRoaXMuX3NlcnZlclRpbWUgKz0gTGF5YS50aW1lci5kZWx0YSAvIDEwMDA7XG5cdFx0XHRpZiggdGhpcy5fdGltZSA+PSAzMDAwMCApXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuX3RpbWUgPSAwO1xuXHRcdFx0XHRMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLmxhc3R0aW1lLHRoaXMuX3NlcnZlclRpbWUudG9TdHJpbmcoKSApO1xuXHRcdFx0fVxuXHRcdFx0aWYoIHRoaXMuX29ubGluZXRpbWUgPj0gOTAwMDAgKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLl9vbmxpbmV0aW1lID0gMDtcblx0XHRcdFx0dGhpcy5zZW5kb25saW5lVG9uZ2ppKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNlbmRvbmxpbmVUb25namkoKTp2b2lkXG5cdHtcblx0XHR2YXIgZGlzdGltZTpudW1iZXIgPSB0aGlzLnNlcnZlclRpbWUgLSB0aGlzLl9vbmxpbmVkaXN0aW1lO1xuXHRcdGlmKCBkaXN0aW1lID4gMCApXG5cdFx0e1xuXHRcdFx0dGhpcy5fb25saW5lZGlzdGltZSA9IHRoaXMuc2VydmVyVGltZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICog5pyN5Yqh5Zmo5pe26Ze0ICgg56eSICkgXG5cdCAqIEByZXR1cm4gXG5cdCAqIFxuXHQgKi9cblx0cHVibGljIGdldCBzZXJ2ZXJUaW1lKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX3NlcnZlclRpbWU7XG5cdH1cblxufSIsImltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xuaW1wb3J0IHtWaWV3QWN0aW9ufSBmcm9tIFwiLi4vdXRpbHMvVmlld0FjdGlvblwiO1xuaW1wb3J0IHtHYW1lU3RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9HYW1lU3RhdGVDb250cm9sXCI7XG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVVzZXJNZXNzYWdlXCI7XG5pbXBvcnQge0FnZW5jeUluR2FtZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lJbkdhbWVcIjtcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcbmltcG9ydCB7IFBST1RPQ09MUywgTmV0d29ya01hbmFnZXIgfSBmcm9tIFwiLi4vV1hTREsvTmV0d29ya01hbmFnZXJcIjtcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcbmltcG9ydCB7cGluZ3RhaXV0aWxzfSBmcm9tIFwiLi4vV1hTREsvcGluZ3RhaXV0aWxzXCI7XG5pbXBvcnQge0d1YW5nR2FvfSBmcm9tIFwiLi4vV1hTREsvR3VhbmdHYW9cIjtcbmltcG9ydCB7IEdhbWVTdGF0ZSB9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9HYW1lL1BsYXllclwiO1xuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQge0NoYXJhY3RlclN0YXRlfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZVwiO1xuaW1wb3J0IHsgU2hhcmVVdGlsIH0gZnJvbSBcIi4uL1dYU0RLL1NoYXJlVXRpbFwiO1xuaW1wb3J0IHsgUmVjb3JkTWFuYWdlciB9IGZyb20gXCIuLi9XWFNESy9SZWNvcmRNYW5hZ2VyXCI7XG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL1dYU0RLL3R0YWRcIjtcbi8vIGltcG9ydCBDaG91dGlQYW5WaWV3IGZyb20gXCIuLi9QdXNoL0Nob3V0aVBhblZpZXdcIjtcbmV4cG9ydCBjbGFzcyBDb21wbGV0ZVBhbmVsIGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBcbntcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQ29tcGxldGVQYW5lbFwiO1xuXG4gICAgQnRuQm94OmZhaXJ5Z3VpLkdHcm91cDtcbiAgICBjX3N0YXRlOmZhaXJ5Z3VpLkNvbnRyb2xsZXI7XG4gICAgdHh0X2dvbGQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcbiAgICBidG5fMDpmYWlyeWd1aS5HQnV0dG9uO1xuICAgIGJ0bl8xOmZhaXJ5Z3VpLkdCdXR0b247XG4gICAgYnRuXzI6ZmFpcnlndWkuR0J1dHRvbjtcbiAgICB0aW1lbnVtOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgVGlhbkppYUFuaTpmYWlyeWd1aS5UcmFuc2l0aW9uO1xuICAgIEJhdHRsZUJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xuXG4gICAgdGlhbmppYTpmYWlyeWd1aS5HTG9hZGVyO1xuXG4gICAgLy/liIbkuqvnlYzpnaJcbiAgICBTaGFyZVZpZGVvOmZhaXJ5Z3VpLkdDb21wb25lbnQ7XG4gICAgU2hhcmVWaWRlb0J0bjpmYWlyeWd1aS5HQnV0dG9uO1xuICAgIGppZXN1YW5idG46ZmFpcnlndWkuR0J1dHRvbjtcbiAgICBzaGFyZV9nb2xkbnVtOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG5cbiAgICAvL+ahhlxuICAgIGt1YW5nOmZhaXJ5Z3VpLkdCdXR0b247XG4gICAgLy/lr7nlj7dcbiAgICBkdWloYW86ZmFpcnlndWkuR0ltYWdlO1xuXG5cbiAgICBnZXRnb2xkOm51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBfZ2FtZVByb3h5OkFnZW5jeUluR2FtZTtcbiAgICBcbiAgICBjb25zdHJ1Y3RvciggZ29sZDpudW1iZXIgKSBcbiAgICB7IFxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJnYW1lcmVzdWx0XCIsZmFsc2UsVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmUsMSApOyBcbiAgICAgICAgdGhpcy5nZXRnb2xkID0gZ29sZDtcbiAgICB9XG4gICAgXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgbG9hZFNjZW5lKCk6dm9pZCB7XG5cdFx0TGF5YS5TY2VuZTNELmxvYWQoXCJyZXMvdGhyZWVEaW1lbi9zY2VuZS9QYXJ0aWNsZVNjZW5lL0V4YW1wbGVfMDEubHNcIiwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBmdW5jdGlvbihzY2VuZTpMYXlhLlNjZW5lM0QpIHtcblx0XHRcdHRoaXMuc2NlbmUgPSBMYXlhLnN0YWdlLmFkZENoaWxkQXQoc2NlbmUsIDApO1xuXHRcdFx0dmFyIGNhbWVyYTpMYXlhLkNhbWVyYSA9IHRoaXMuc2NlbmUuYWRkQ2hpbGQobmV3IExheWEuQ2FtZXJhKDAsIDAuMSwgMTAwKSk7XG5cdFx0XHRjYW1lcmEudHJhbnNmb3JtLnRyYW5zbGF0ZShuZXcgTGF5YS5WZWN0b3IzKDAsIDEsIDApKTtcblx0XHR9KSk7XG5cdH1cblx0cHJpdmF0ZSBnYXJiYWdlQ29sbGVjdGlvbigpOnZvaWQge1xuXHRcdHRoaXMuc2NlbmUuZGVzdHJveSgpOy8v6ZSA5q+B5Zy65pmvXG5cdFx0dGhpcy5zY2VuZSA9IG51bGw7XG5cdFx0TGF5YS5SZXNvdXJjZS5kZXN0cm95VW51c2VkUmVzb3VyY2VzKCk7Ly/plIDmr4Hml6DnlKjotYTmupAo5rKh5pyJ6KKr5Zy65pmv5qCR5byV55SoLOW5tuS4lOayoeacieWKoOi1hOa6kOmUgeeahClcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHJpdmF0ZSBidG4xY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkdvbGRVcCggdGhpcy5nZXRnb2xkICk7XG4gICAgICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5MZXZlbFVwKCAgKTtcbiAgICAgICAgICAgIHRoaXMuX2dhbWVQcm94eS5yZXR1cm5tYWludmlldyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID09IDEpXG4gICAgICAgIHtcbiAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkdvbGRVcCggdGhpcy5nZXRnb2xkICk7XG4gICAgICAgICAgICB0aGlzLl9nYW1lUHJveHkucmV0dXJubWFpbnZpZXcoICk7XG4gICAgICAgICAgICAvLyBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID09IDIpe1xuICAgICAgICAgICAgLy8gU2hhcmVVdGlsLnNoYXJlSW1hZ2UoXCLliIbkuqvlpI3mtLstLS0tXCIsdGhpcy5zaGFyZXJldml2ZSxcIjFcIilcbiAgICAgICAgICAgIHRoaXMuc2hhcmVyZXZpdmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkNvbXBsZXRlKCk6IHZvaWQge1xuICAgICAgICBMYXlhLlNwcml0ZTNELmxvYWQoXCJyZXMvdGhyZWVEaW1lbi9za2luTW9kZWwvTGF5YU1vbmtleS9MYXlhTW9ua2V5LmxoXCIsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgZnVuY3Rpb24obGF5YU1vbmtleTNEOkxheWEuU3ByaXRlM0QpOnZvaWQge1xuICAgICAgICAgICAgdGhpcy5sYXlhTW9ua2V5M0QgPSBsYXlhTW9ua2V5M0Q7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLmFkZENoaWxkKGxheWFNb25rZXkzRCk7XG4gICAgICAgICAgICB0aGlzLmxheWFNb25rZXkyRCA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuSW1hZ2UoXCJyZXMvdGhyZWVEaW1lbi9tb25rZXkucG5nXCIpKSBhcyBMYXlhLkltYWdlO1xuICAgICAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoMSwgdGhpcywgdGhpcy5hbmltYXRlKTtcbiAgICAgICAgfSkpXG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBzY2VuZTpMYXlhLlNjZW5lM0Q7XG4gICAgcHJpdmF0ZSBjYW1lcmE6TGF5YS5DYW1lcmE7XG4gICAgcHJpdmF0ZSBsYXlhTW9ua2V5M0Q6TGF5YS5TcHJpdGUzRDtcbiAgICBwcml2YXRlIGxheWFNb25rZXkyRDpMYXlhLkltYWdlO1xuICAgIHByaXZhdGUgX3Bvc2l0aW9uOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcbiAgICBwcml2YXRlIF9vdXRQb3M6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMygpO1xuICAgIHByaXZhdGUgc2NhbGVEZWx0YTpudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgc2NhbGU6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMygwLjEsMC4xLDAuMSk7XG4gICAgcHJpdmF0ZSBhbmltYXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wb3NpdGlvbi54ID0gTWF0aC5zaW4odGhpcy5zY2FsZURlbHRhICs9IDAuMDEpO1xuICAgICAgICB0aGlzLmxheWFNb25rZXkzRC50cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl9wb3NpdGlvbjtcbiAgICAgICAgdGhpcy5sYXlhTW9ua2V5M0QudHJhbnNmb3JtLnNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICAgICAgLy/ovazmjaLlnZDmoIdcbiAgICAgICAgdGhpcy5jYW1lcmEudmlld3BvcnQucHJvamVjdCh0aGlzLmxheWFNb25rZXkzRC50cmFuc2Zvcm0ucG9zaXRpb24sIHRoaXMuY2FtZXJhLnByb2plY3Rpb25WaWV3TWF0cml4LCB0aGlzLl9vdXRQb3MpO1xuICAgICAgICAvL+i1i+WAvOe7mTJEXG4gICAgICAgIHRoaXMubGF5YU1vbmtleTJELnBvcyh0aGlzLl9vdXRQb3MueCAvIExheWEuc3RhZ2UuY2xpZW50U2NhbGVYLCB0aGlzLl9vdXRQb3MueSAvIExheWEuc3RhZ2UuY2xpZW50U2NhbGVZKTtcbiAgICB9XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBcblxuICAgIHByaXZhdGUgYnRuMGNsaWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID09IDAgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnBsYXl2aWRlb2NhbGxiYWNrKCk7XG4gICAgICAgICAgICAvLyBwaW5ndGFpdXRpbHMuSW5zdGFuY2UucGxheVZpZGVvKCBcIlwiLHRoaXMsdGhpcy5wbGF5dmlkZW9jYWxsYmFjayApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPT0gMSlcbiAgICAgICAge1xuICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCB0aGlzLmdldGdvbGQgKTtcbiAgICAgICAgICAgIHRoaXMuX2dhbWVQcm94eS5yZXR1cm5tYWludmlldyggKTtcbiAgICAgICAgICAgIC8vIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ2hvdXRpUGFuVmlldyApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPT0gMil7XG4gICAgICAgICAgICB0aGlzLmNvdW50ID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBwaW5ndGFpdXRpbHMuSW5zdGFuY2UucGxheVZpZGVvKFwiXCIsdGhpcyx0aGlzLnBsYXl2aWRlb3Jldml2ZSk7XG4gICAgICAgICAgICB0aGlzLnBsYXl2aWRlb3Jldml2ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoq55yL6KeG6aKR5aSN5rS75oiQ5YqfICovXG4gICAgcHJpdmF0ZSBwbGF5dmlkZW9yZXZpdmUoKTp2b2lke1xuICAgICAgICB0dGFkLlNob3dWaWRlbygoaXNMb2FkPT57XG4gICAgICAgICAgICBpZihpc0xvYWQpe1xuICAgICAgICAgICAgICAgIC8vIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZChDaG91dGlQYW5WaWV3KTtcbiAgICAgICAgICAgICAgICBHYW1lU3RhdGUuZnVodW9jaXNodSAtLTtcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggQ29tcGxldGVQYW5lbCApO1xuICAgICAgICAgICAgICAgIEdhbWVTdGF0ZS5pc2RpZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5faXNjYW5Nb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBQbGF5ZXIuSW5zdGFuY2UuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcbiAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2Uubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xuICAgICAgICAgICAgICAgIGlmIChQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSA9PSBcIlwiIHx8IFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lID09IFwiXCIpICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi546p5a625L2N572uLS0tLVwiLFBsYXllci5JbnN0YW5jZS5faW5pdFBvc1ZlYyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi546p5a626YCf5bqmX21vdmVWZWNcIixQbGF5ZXIuSW5zdGFuY2UuX21vdmVWZWMpO1xuICAgICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoMCwxLDMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5Zy65pmv5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW9k+WJjeW7uuetkeWQjeWtly0tLVwiLFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlu7rnrZHniankvY3nva4tLS0tXCIsUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZShQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSwgUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lLCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSkuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl9zcGVlZE1vdmVWMy56ID0gLVBsYXllci5JbnN0YW5jZS5fUm9sZURhdGEubW92ZXNwZWVkKjI7XG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKDMwMDAsdGhpcywoKT0+e1xuICAgICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3NwZWVkTW92ZVYzLnogPSAtUGxheWVyLkluc3RhbmNlLl9Sb2xlRGF0YS5tb3Zlc3BlZWQ7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKVxuICAgIH1cbiAgICAvKirliIbkuqvlpI3mtLvmiJDlip8gKi9cbiAgICBwcml2YXRlIHNoYXJlcmV2aXZlKCl7XG4gICAgICAgIFJlY29yZE1hbmFnZXIuSW5zdGFuY2UuU2hhcmVWaWRlbygoaXNMb2FkKT0+e1xuICAgICAgICAgICAgIGlmKGlzTG9hZCl7XG4gICAgICAgICAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5SZWNvcmRTdGFydCgpO1xuICAgICAgICAgICAgICAgIEdhbWVTdGF0ZS5mdWh1b2Npc2h1IC0tO1xuICAgICAgICAgICAgICAgIC8vIEdhbWVTdGF0ZS5yZWNvcmRzY3JlZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIENvbXBsZXRlUGFuZWwgKTtcbiAgICAgICAgICAgICAgICBHYW1lU3RhdGUuaXNkaWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX2lzY2FuTW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gUGxheWVyLkluc3RhbmNlLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVuICk7XG4gICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcbiAgICAgICAgICAgICAgICBpZiAoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUgPT0gXCJcIiB8fCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSA9PSBcIlwiKSAge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIueOqeWutuS9jee9ri0tLS1cIixQbGF5ZXIuSW5zdGFuY2UuX2luaXRQb3NWZWMpO1xuICAgICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoMCwxLDMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5Zy65pmv5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW9k+WJjeW7uuetkeWQjeWtly0tLVwiLFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlu7rnrZHniankvY3nva4tLS0tXCIsUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZShQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSwgUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lLCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSkuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoXCLlpI3mtLvliqDpgJ/miJDlip9cIik7XG4gICAgICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fc3BlZWRNb3ZlVjMueiA9IC1QbGF5ZXIuSW5zdGFuY2UuX1JvbGVEYXRhLm1vdmVzcGVlZCoyO1xuICAgICAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMzAwMCx0aGlzLCgpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3NwZWVkTW92ZVYzLnogPSAtUGxheWVyLkluc3RhbmNlLl9Sb2xlRGF0YS5tb3Zlc3BlZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSB0cnVlOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLy8gaWYoX3N1Y2Nlc3Mpe1xuICAgICAgICAvLyAgICAgLy8gVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKENob3V0aVBhblZpZXcpO1xuICAgICAgICAvLyAgICAgICAgIEdhbWVTdGF0ZS5mdWh1b2Npc2h1IC0tO1xuICAgICAgICAvLyAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBDb21wbGV0ZVBhbmVsICk7XG4gICAgICAgIC8vICAgICAgICAgR2FtZVN0YXRlLmlzZGllID0gZmFsc2U7XG4gICAgICAgIC8vICAgICAgICAgUGxheWVyLkluc3RhbmNlLl9pc2Nhbk1vdmUgPSB0cnVlO1xuICAgICAgICAvLyAgICAgICAgIC8vIFBsYXllci5JbnN0YW5jZS5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xuICAgICAgICAvLyAgICAgICAgIFBsYXllci5JbnN0YW5jZS5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XG4gICAgICAgIC8vICAgICAgICAgaWYgKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lID09IFwiXCIgfHwgUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUgPT0gXCJcIikgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCLnjqnlrrbkvY3nva4tLS0tXCIsUGxheWVyLkluc3RhbmNlLl9pbml0UG9zVmVjKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBQbGF5ZXIuSW5zdGFuY2UuX2luaXRQb3NWZWMuY2xvbmUoKVxuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICBlbHNlICB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5Zy65pmv5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUpO1xuICAgICAgICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW9k+WJjeW7uuetkeWQjeWtly0tLVwiLFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCLlu7rnrZHniankvY3nva4tLS0tXCIsUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZShQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSwgUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lLCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSkuY2xvbmUoKTtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICAgICAgICAgIC8vIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoXCLlpI3mtLvliqDpgJ/miJDlip9cIik7XG4gICAgICAgIC8vICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fc3BlZWRNb3ZlVjMueiA9IC1QbGF5ZXIuSW5zdGFuY2UuX1JvbGVEYXRhLm1vdmVzcGVlZCoyO1xuICAgICAgICAvLyAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMzAwMCx0aGlzLCgpPT57XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3NwZWVkTW92ZVYzLnogPSAtUGxheWVyLkluc3RhbmNlLl9Sb2xlRGF0YS5tb3Zlc3BlZWQ7XG4gICAgICAgIC8vICAgICAgICAgICAgIH0pXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gZWxzZXtcbiAgICAgICAgLy8gICAgIHRoaXMuY291bnQgPSB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwbGF5dmlkZW9jYWxsYmFjaygpOnZvaWRcbiAgICB7XG4gICAgICAgIFJlY29yZE1hbmFnZXIuSW5zdGFuY2UuU2hhcmVWaWRlbygoaXNMb2FkPT57XG4gICAgICAgICAgICBpZihpc0xvYWQpe1xuICAgICAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkdvbGRVcCggdGhpcy5nZXRnb2xkKjMgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nYW1lUHJveHkucmV0dXJubWFpbnZpZXcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5CYXR0bGVCdG4udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSlcbiAgICAgICAgLy8gdHRhZC5TaG93VmlkZW8oKGlzTG9hZD0+e1xuICAgICAgICAvLyAgICAgaWYoaXNMb2FkKXtcbiAgICAgICAgLy8gICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5Hb2xkVXAoIHRoaXMuZ2V0Z29sZCozICk7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fZ2FtZVByb3h5LnJldHVybm1haW52aWV3KHRydWUpO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9KSlcbiAgICB9XG5cbiAgICAvL+WIhuS6q+inhumikVxuICAgIHByaXZhdGUgU2hhcmVWaWRlb0NhbGxCYWNrKCl7XG4gICAgICAgIFJlY29yZE1hbmFnZXIuSW5zdGFuY2UuU2hhcmVWaWRlbygoaXNMb2FkPT57XG4gICAgICAgICAgICBpZihpc0xvYWQpe1xuICAgICAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkdvbGRVcCggdGhpcy5nZXRnb2xkKjMgKTtcbiAgICAgICAgICAgICAgICB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5TaGFyZVZpZGVvLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpXG4gICAgfVxuXG4gICAgLy/ngrnlh7vli77pgInmoYZcbiAgICBDbGlja0t1YW5nKCl7XG4gICAgICAgIGlmKHRoaXMuZHVpaGFvLnZpc2libGUpe1xuICAgICAgICAgICAgdGhpcy5kdWloYW8udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5idG5fMS52aXNpYmxlID0gdGhpcy5kdWloYW8udmlzaWJsZTtcbiAgICAgICAgICAgIHRoaXMuYnRuXzIudmlzaWJsZSA9ICF0aGlzLmR1aWhhby52aXNpYmxlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICB0aGlzLmR1aWhhby52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYnRuXzEudmlzaWJsZSA9IHRoaXMuZHVpaGFvLnZpc2libGU7XG4gICAgICAgICAgICB0aGlzLmJ0bl8yLnZpc2libGUgPSAhdGhpcy5kdWloYW8udmlzaWJsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIFxuXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXG4gICAge1xuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKHRoaXMsdGhpcy5Db3VudFRpbWUpO1xuICAgICAgICAvLyBMYXlhLnRpbWVyLmNsZWFyKHRoaXMsdGhpcy5wbGF5YW5pbWF0b3IpO1xuICAgICAgICAvLyBHdWFuZ0dhby5DbGVhcigpO1xuICAgICAgICB0dGFkLkNsZWFyKCk7XG4gICAgICAgIHN1cGVyLmRlc3RvcnkoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLnRpYW5qaWEudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLlRpYW5KaWFBbmkgPSB0aGlzLmdldFRyYW5zaXRpb25CeU5hbWUoXCJ0aWFuamlhYW5pXCIpO1xuICAgICAgICB0aGlzLlRpYW5KaWFBbmkuc3RvcCgpO1xuICAgICAgICAvLyBMYXlhLnRpbWVyLmxvb3AoMjAwMCx0aGlzLHRoaXMucGxheWFuaW1hdG9yKTtcbiAgICAgICAgdGhpcy5jb3VudCA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICB0aGlzLl9nYW1lUHJveHkgPSB0aGlzLmdldFByb3h5KCBBZ2VuY3lJbkdhbWUgKTtcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyQnlCYW1lKCBcImNfc3RhdGVcIiApO1xuICAgICAgICB0aGlzLnR4dF9nb2xkLnRleHQgPSB0aGlzLmdldGdvbGQudG9TdHJpbmcoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuZHVpaGFvID0gdGhpcy5rdWFuZy5nZXRDaGlsZEF0KDEpIGFzIGZhaXJ5Z3VpLkdJbWFnZTtcbiAgICAgICAgdGhpcy5kdWloYW8udmlzaWJsZSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuQ2hvb3NlO1xuICAgICAgICB0aGlzLnNoYXJlX2dvbGRudW0gPSB0aGlzLlNoYXJlVmlkZW8uZ2V0Q2hpbGRBdCg0KSBhcyBmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgICAgICB0aGlzLlNoYXJlVmlkZW9CdG4gPSB0aGlzLlNoYXJlVmlkZW8uZ2V0Q2hpbGRBdCgxKSBhcyBmYWlyeWd1aS5HQnV0dG9uO1xuICAgICAgICB0aGlzLmppZXN1YW5idG4gPSB0aGlzLlNoYXJlVmlkZW8uZ2V0Q2hpbGRBdCgyKSBhcyBmYWlyeWd1aS5HQnV0dG9uO1xuICAgICAgICB0aGlzLnNoYXJlX2dvbGRudW0udGV4dCA9IHRoaXMuZ2V0Z29sZC50b1N0cmluZygpO1xuICAgICAgICB0aGlzLmJ0bl8xLnZpc2libGUgPSB0aGlzLmR1aWhhby52aXNpYmxlO1xuICAgICAgICB0aGlzLmJ0bl8yLnZpc2libGUgPSAhdGhpcy5kdWloYW8udmlzaWJsZTtcblxuICAgICAgICBpZihHYW1lU3RhdGUucmVjb3Jkc2NyZWUpe1xuICAgICAgICAgICAgdGhpcy5CYXR0bGVCdG4udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gIUdhbWVTdGF0ZS5yZWNvcmRzY3JlZTtcbiAgICAgICAgaWYoIUdhbWVTdGF0ZS5pc2RpZSl7Ly/njqnlrrbmnKrmrbvkuqHnmoTnirbmgIFcbiAgICAgICAgICAgIGlmKCBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmVuZEdhbWVQbGF5ZXJBcnIubGVuZ3RoID09IDAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGlmKEdhbWVTdGF0ZS5mdWh1b2Npc2h1PjApe1xuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMjtcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLmxvb3AoMTAwMCx0aGlzLHRoaXMuQ291bnRUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID09IDApe1xuICAgICAgICAgICAgdGhpcy5TaGFyZVZpZGVvLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5qaWVzdWFuYnRuLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSgyMDAwLHRoaXMsKCk9PntcbiAgICAgICAgICAgICAgICB0aGlzLmppZXN1YW5idG4udmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICB0aGlzLlNoYXJlVmlkZW8udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIEd1YW5nR2FvLkNoZWF0QmFubmVyKHRoaXMuYnRuXzEpO1xuICAgIH1cbiAgICBwbGF5YW5pbWF0b3IoKXtcbiAgICAgICAgdGhpcy5UaWFuSmlhQW5pLnBsYXkobnVsbCwxKTtcbiAgICB9XG5cbiAgICBDbGlja0ppZVN1YW4oKXtcbiAgICAgICAgdGhpcy5TaGFyZVZpZGVvLnZpc2libGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fMCxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5idG4wY2xpY2sgKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fMSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5idG4xY2xpY2sgKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5CYXR0bGVCdG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuU2hhcmVCYXR0bGUpO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl8yLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bjFjbGljayk7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMua3VhbmcsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuQ2xpY2tLdWFuZyk7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuU2hhcmVWaWRlb0J0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5TaGFyZVZpZGVvQ2FsbEJhY2spO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmppZXN1YW5idG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuQ2xpY2tKaWVTdWFuKTtcbiAgICB9XG5cbiAgICAgdGltZSA9IDk7XG4gICAgIGNvdW50ID0gZmFsc2U7XG4gICAgIGZ1aHVvID0gZmFsc2U7XG4gICAgIC8v5YCS6K6h5pe2XG4gICAgIENvdW50VGltZSgpXG4gICAgIHtcbiAgICAgICAgIGlmKHRoaXMuY291bnQgJiYgdGhpcy50aW1lID4gMClcbiAgICAgICAgIHtcbiAgICAgICAgICAgICB0aGlzLnRpbWUgLT0gMTtcbiAgICAgICAgICAgICB0aGlzLnRpbWVudW0udGV4dCA9IHRoaXMudGltZS50b1N0cmluZygpO1xuICAgICAgICAgICAgIGlmKHRoaXMudGltZSA8IDEpXG4gICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIExheWEudGltZXIuY2xlYXIodGhpcyx0aGlzLkNvdW50VGltZSk7XG4gICAgICAgICAgICAgICAgR2FtZVN0YXRlLmZ1aHVvY2lzaHUtLTtcbiAgICAgICAgICAgICAgICAvLyBMYXlhLnRpbWVyLmNsZWFyKHRoaXMsdGhpcy5wbGF5YW5pbWF0b3IpO1xuICAgICAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKENvbXBsZXRlUGFuZWwpO1xuICAgICAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5sb3NlICk7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICB9XG5cbiAgICAgLy/lvZXlsY/liIbkuqtcbiAgICAgU2hhcmVCYXR0bGUoKXtcbiAgICAgICAgIFJlY29yZE1hbmFnZXIuSW5zdGFuY2UuU2hhcmVWaWRlbygoaXNMb2FkKT0+e1xuICAgICAgICAgICAgaWYoaXNMb2FkKXtcbiAgICAgICAgICAgICAgICB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9KVxuICAgICAgICAvLyAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5TaGFyZVZpZGVvKChpc0xvYWQ9PntcbiAgICAgICAgLy8gICAgICBpZihpc0xvYWQpe1xuICAgICAgICAvLyAgICAgICAgICB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIC8vICAgICAgfVxuICAgICAgICAvLyAgfSkpXG5cbiAgICAgfVxufSIsImltcG9ydCB7IFBhbmVsQmFzZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEd1YW5nR2FvIH0gZnJvbSBcIi4uL1dYU0RLL0d1YW5nR2FvXCI7XHJcbmltcG9ydCB7IFZpZXdBY3Rpb24gfSBmcm9tIFwiLi4vdXRpbHMvVmlld0FjdGlvblwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuL1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEFnZW5jeUluR2FtZSB9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5SW5HYW1lXCI7XHJcbmltcG9ydCB7IEFnZW5jeUxvdHRlcnkgfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeUxvdHRlcnlcIjtcclxuaW1wb3J0IExvdHRlcnlDRkcgZnJvbSBcIi4uL0NGRy9Mb3R0ZXJ5Q0ZHXCI7XHJcbmltcG9ydCB7IFNjZW5lQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHYW1lU3RhdGVDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvR2FtZVN0YXRlQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uL1dYU0RLL1Nka1wiO1xyXG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL1dYU0RLL3R0YWRcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVnZ1BhbmVsIGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiRWdnUGFuZWxcIjtcclxuXHJcbiAgICBsb2FkX2NsaWNrOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBwcm9fMDpmYWlyeWd1aS5HUHJvZ3Jlc3NCYXI7XHJcbiAgICBidG5fMTpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgYnRuX2Nsb3NlOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBoaXRhbmk6ZmFpcnlndWkuVHJhbnNpdGlvbjtcclxuICAgIGdldHJld2FyZGJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xyXG5cclxuICAgIHByaXZhdGUgX2lzQ29tcGxldGUgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2lzU2hvd0Jhbm5lciA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfYmFubmVyVmFsID0gMC41O1xyXG4gICAgcHJpdmF0ZSBfbWF4Q2xpY2tDbnQgPSAxODtcclxuICAgIHByaXZhdGUgX2NsaWNrQ250ID0gMDtcclxuICAgIHByaXZhdGUgX2ludGVydmFsID0gMTAwO1xyXG4gICAgcHJpdmF0ZSBfZGVjcmVtZW50ID0gMTtcclxuXHJcbiAgICBuNjpmYWlyeWd1aS5HR3JvdXA7XHJcbiAgICBDaGVzdDpmYWlyeWd1aS5HR3JvdXA7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCBcIm1haW5cIixcImVnZ3ZpZXdcIixmYWxzZSxWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZSwxICk7IFxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmhpdGFuaSA9IHRoaXMuZ2V0VHJhbnNpdGlvbkJ5TmFtZSggXCJoaXRhbmlcIiApO1xyXG4gICAgICAgIHRoaXMucHJvXzAudmFsdWUgPSAxO1xyXG4gICAgICAgIHRoaXMuX2Jhbm5lclZhbCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VmbG9hdCgwLjIsIDAuNCk7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIC8vIEd1YW5nR2FvLkNoZWF0QmFubmVyKHRoaXMuYnRuXzEpO1xyXG4gICAgICAgIC8vIEd1YW5nR2FvLkNsZWFyKCk7Ly9oW1wiZGVmYXVsdFwiXS5DbGVhcigpcltcImRlZmF1bHRcIl1cclxuICAgICAgICB0dGFkLkNsZWFyKCk7XHJcbiAgICAgICAgdmFyIHNjZW5laGVpZ2h0ID0gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5idG5fMS55PXNjZW5laGVpZ2h0LXRoaXMuYnRuXzEuaGVpZ2h0LTE1O1xyXG4gICAgICAgIHRoaXMuZ2V0cmV3YXJkYnRuLnkgPSB0aGlzLmJ0bl8xLnk7XHJcbiAgICAgICAgdGhpcy5nZXRyZXdhcmRidG4udmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZihTY2VuZUNvbnRyb2wuRWdnR0dyb3VwPT0wKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5uNi52aXNpYmxlPXRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJhbm5lcmNhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYnRuXzEsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMucWlhb0RhICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fY2xvc2UsTGF5YS5FdmVudC5DTElDSyx0aGlzLEVnZ1BhbmVsLm9uY2xvc2VmdW4gKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmdldHJld2FyZGJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsRWdnUGFuZWwuVmlkZW9HZXRSZXdhcmQgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF90aW1lOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fdGltZSArPSBkdDtcclxuICAgICAgICBpZiggdGhpcy5fdGltZSA+PSB0aGlzLl9pbnRlcnZhbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lID0gMDtcclxuICAgICAgICAgICAgdGhpcy5EYW9qaXNoaSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBEYW9qaXNoaSgpIHtcclxuICAgICAgICBsZXQgcHYgPSB0aGlzLnByb18wLnZhbHVlO1xyXG4gICAgICAgIHB2IC09IHRoaXMuX2RlY3JlbWVudDtcclxuICAgICAgICBpZiAocHYgPD0gMCkgcHYgPSAxO1xyXG4gICAgICAgIHRoaXMucHJvXzAudmFsdWUgPSBwdjtcclxuICAgICAgICB0aGlzLl9jbGlja0NudCA9IE1hdGguY2VpbChwdiAqdGhpcy5fbWF4Q2xpY2tDbnQgLzEwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBxaWFvRGEoKSBcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzQ29tcGxldGUpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYodGhpcy5oaXRhbmkhPW51bGwmJiAhdGhpcy5oaXRhbmkucGxheWluZyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGl0YW5pLnBsYXkoIG51bGwsMSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQ250Kys7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jbGlja0NudCA+IHRoaXMuX21heENsaWNrQ250KSBcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQ250ID0gdGhpcy5fbWF4Q2xpY2tDbnQ7XHJcbiAgICAgICAgICAgIGxldCBwdiA9IHRoaXMuX2NsaWNrQ250IC8gdGhpcy5fbWF4Q2xpY2tDbnQ7XHJcbiAgICAgICAgICAgIGlmKCBwdiA+IDEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwdiA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wcm9fMC52YWx1ZSA9IHB2KjEwMDtcclxuICAgICAgICAgICAgaWYgKHB2ID49IHRoaXMuX2Jhbm5lclZhbCAmJiAhdGhpcy5faXNTaG93QmFubmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1Nob3dCYW5uZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRyZXdhcmRidG4udmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAvLyBHdWFuZ0dhby5PcGVuQmFubmVyKCk7XHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMDAsdGhpcywoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0cmV3YXJkYnRuLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocHYgPj0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNDb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBFZ2dQYW5lbC5nZXRyZXdhcmQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0cmV3YXJkKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIC8vIHZhciB6cHByb3h5OkFnZW5jeUxvdHRlcnkgPSB0aGlzLmdldFByb3h5KCBBZ2VuY3lMb3R0ZXJ5ICkgYXMgQWdlbmN5TG90dGVyeTtcclxuICAgICAgICAvLyB2YXIgaW5kZXggPSAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeUxvdHRlcnkgKSBhcyBBZ2VuY3lMb3R0ZXJ5ICkuR2V0UmV3YXJkKCk7XHJcbiAgICAgICAgLy8gdmFyIHNlbGVjdGNmZzpMb3R0ZXJ5Q0ZHID0gTG90dGVyeUNGRy52ZWNbIGluZGV4IF07XHJcbiAgICAgICAgLy8genBwcm94eS5nZXRyZXdhcmQoIHNlbGVjdGNmZyApO1xyXG4gICAgICAgIC8vIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuiOt+W+l+W8gOWxgOWKoOmAn1wiICk7XHJcbiAgICAgICAgRWdnUGFuZWwub25jbG9zZWZ1bigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v55yL6KeG6aKR5b6X5aWW5YqxXHJcbiAgc3RhdGljIFZpZGVvR2V0UmV3YXJkKCl7XHJcbiAgICAgICAgdHRhZC5TaG93VmlkZW8oKGlzTG9hZD0+e1xyXG4gICAgICAgICAgICBpZihpc0xvYWQpe1xyXG4gICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLojrflvpflvIDlsYDliqDpgJ9cIiApO1xyXG4gICAgICAgICAgICAgICAgRWdnUGFuZWwub25jbG9zZWZ1bigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICBFZ2dQYW5lbC5vbmNsb3NlZnVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgIH1cclxuICAgIHByaXZhdGUgaGlkZWJhbm5lcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAvLyBQbGF0Zm9ybVRvb2wuZ2V0SW5zdGFuY2UoKS5oaWRlQmFubmVyKFwiRWdnVmlld1wiKTtcclxuICAgICAgICBHdWFuZ0dhby5oaWRlYmFubmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG9uY2xvc2VmdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIEVnZ1BhbmVsICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gUGxhdGZvcm1Ub29sLmdldEluc3RhbmNlKCkuaGlkZUJhbm5lcihcIkVnZ1ZpZXdcIik7XHJcbiAgICAgICAgLy8gR3VhbmdHYW8uaGlkZWJhbm5lcigpO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICAgICAgR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5lbnRlcmdhbWUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIFxyXG59IiwiaW1wb3J0IHsgUGFuZWxCYXNlQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgeyBUaW1lclNlcnZpY2UgfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcclxuaW1wb3J0IHsgR3VhbmdHYW8gfSBmcm9tIFwiLi4vV1hTREsvR3VhbmdHYW9cIjtcclxuaW1wb3J0IHsgVmlld0FjdGlvbiB9IGZyb20gXCIuLi91dGlscy9WaWV3QWN0aW9uXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4vVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHsgQWdlbmN5SW5HYW1lIH0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lJbkdhbWVcIjtcclxuaW1wb3J0IHsgQWdlbmN5TG90dGVyeSB9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5TG90dGVyeVwiO1xyXG5pbXBvcnQgTG90dGVyeUNGRyBmcm9tIFwiLi4vQ0ZHL0xvdHRlcnlDRkdcIjtcclxuaW1wb3J0IHsgU2NlbmVDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvU2NlbmVDb250cm9sXCI7XHJcbmltcG9ydCB7IEdhbWVTdGF0ZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9HYW1lU3RhdGVDb250cm9sXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi4vV1hTREsvU2RrXCI7XHJcbmltcG9ydCB7IEFnZW5jeVVzZXJNZXNzYWdlIH0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgR2FtZVN0YXRlIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQgeyBQcm9wTWFuYWdlciB9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IENvbXBsZXRlUGFuZWwgfSBmcm9tIFwiLi9Db21wbGV0ZVBhbmVsXCI7XHJcbmltcG9ydCB7IEFnZW5jeVRyaWFsIH0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lUcmlhbFwiO1xyXG5pbXBvcnQgeyBSb2xlRGF0YSB9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vV1hTREsvdHRhZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2lmdFZpZXcgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiR2lmdFZpZXdcIjtcclxuXHJcbiAgICBwcml2YXRlIGNsaWNrYW5pOmZhaXJ5Z3VpLlRyYW5zaXRpb247XHJcbiAgICBwcml2YXRlIGppbmR1OmZhaXJ5Z3VpLkdQcm9ncmVzc0JhcjtcclxuICAgIHByaXZhdGUgYnRuYm94OmZhaXJ5Z3VpLkdHcm91cDtcclxuICAgIHByaXZhdGUgYW5uaXU6ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIHByaXZhdGUgc2hvdTpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgcHJpdmF0ZSBrdWFpc3VkaWFuamk6ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIHByaXZhdGUgZGk6ZmFpcnlndWkuR0xvYWRlcjtcclxuXHJcbiAgICBwcml2YXRlIGdldHJld2FyZGJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xyXG5cclxuICAgIHByaXZhdGUgaXRlbTpmYWlyeWd1aS5HQ29tcG9uZW50O1xyXG5cclxuXHJcbiAgICBwcml2YXRlIF9pc0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pc1Nob3dCYW5uZXIgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2Jhbm5lclZhbCA9IDAuNTtcclxuICAgIHByaXZhdGUgX21heENsaWNrQ250ID0gMTg7XHJcbiAgICBwcml2YXRlIF9jbGlja0NudCA9IDA7XHJcbiAgICBwcml2YXRlIF9pbnRlcnZhbCA9IDEwMDtcclxuICAgIHByaXZhdGUgX2RlY3JlbWVudCA9IDE7XHJcblxyXG4gICAgbjY6ZmFpcnlndWkuR0dyb3VwO1xyXG4gICAgQ2hlc3Q6ZmFpcnlndWkuR0dyb3VwO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJnaWZ0Y2hlYXR2aWV3XCIgKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYW5uaXUgPSB0aGlzLml0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgyKSBhcyBmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgICAgIHRoaXMua3VhaXN1ZGlhbmppID0gdGhpcy5pdGVtLmFzQ29tLmdldENoaWxkQXQoMCkgYXMgZmFpcnlndWkuR0xvYWRlcjtcclxuICAgICAgICB0aGlzLnNob3UgPSB0aGlzLml0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgzKSBhcyBmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgICAgIHRoaXMuZGkgPSB0aGlzLml0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgxKSBhcyBmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgICAgIHRoaXMuZ2V0cmV3YXJkYnRuID0gdGhpcy5pdGVtLmFzQ29tLmdldENoaWxkQXQoNCkgYXMgZmFpcnlndWkuR0J1dHRvbjtcclxuICAgICAgICB0aGlzLmdldHJld2FyZGJ0bi52aXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuY2xpY2thbmkgPSB0aGlzLml0ZW0uZ2V0VHJhbnNpdGlvbiggXCJjbGlja2J0bmFuaVwiICk7XHJcbiAgICAgICAgdGhpcy5qaW5kdS52YWx1ZSA9IDE7XHJcbiAgICAgICAgdGhpcy5fYmFubmVyVmFsID0gR2FtZVV0aWxzLnJhbmRSYW5nZWZsb2F0KDAuMiwgMC40KTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgLy8gR3VhbmdHYW8uQ2xlYXIoKTtcclxuICAgICAgICB0dGFkLkNsZWFyKCk7XHJcbiAgICAgICAgTGF5YS50aW1lci5sb29wKDIwMDAsdGhpcyx0aGlzLnBsYXlBbmltYXRvcik7XHJcbiAgICAgICAgLy8gdmFyIHNjZW5laGVpZ2h0ID0gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcbiAgICAgICAgLy8gdGhpcy5idG5ib3gueT1zY2VuZWhlaWdodC10aGlzLmJ0bmJveC55LTE1O1xyXG4gICAgfVxyXG5cclxuICAgIHBsYXlBbmltYXRvcigpe1xyXG4gICAgICAgIHRoaXMuY2xpY2thbmkucGxheShudWxsLDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5hbm5pdSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5xaWFvRGEgKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmdldHJld2FyZGJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5WaWRlb0dldFJld2FyZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3RpbWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl90aW1lICs9IGR0O1xyXG4gICAgICAgIGlmKCB0aGlzLl90aW1lID49IHRoaXMuX2ludGVydmFsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWUgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLkRhb2ppc2hpKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIERhb2ppc2hpKCkge1xyXG4gICAgICAgIGxldCBwdiA9IHRoaXMuamluZHUudmFsdWU7XHJcbiAgICAgICAgcHYgLT0gdGhpcy5fZGVjcmVtZW50O1xyXG4gICAgICAgIGlmIChwdiA8PSAwKSBwdiA9IDE7XHJcbiAgICAgICAgdGhpcy5qaW5kdS52YWx1ZSA9IHB2O1xyXG4gICAgICAgIHRoaXMuX2NsaWNrQ250ID0gTWF0aC5jZWlsKHB2ICp0aGlzLl9tYXhDbGlja0NudCAvMTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHFpYW9EYSgpIFxyXG4gICAge1xyXG4gICAgICAgIGlmKHRoaXMuc2hvdS52aXNpYmxlKXtcclxuICAgICAgICAgICAgdGhpcy5zaG91LnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5rdWFpc3VkaWFuamkudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKHRoaXMsdGhpcy5wbGF5QW5pbWF0b3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXRoaXMuX2lzQ29tcGxldGUpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tDbnQrKztcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NsaWNrQ250ID4gdGhpcy5fbWF4Q2xpY2tDbnQpIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tDbnQgPSB0aGlzLl9tYXhDbGlja0NudDtcclxuICAgICAgICAgICAgbGV0IHB2ID0gdGhpcy5fY2xpY2tDbnQgLyB0aGlzLl9tYXhDbGlja0NudDtcclxuICAgICAgICAgICAgaWYoIHB2ID4gMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHB2ID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmppbmR1LnZhbHVlID0gcHYqMTAwO1xyXG4gICAgICAgICAgICBpZiAocHYgPj0gdGhpcy5fYmFubmVyVmFsICYmICF0aGlzLl9pc1Nob3dCYW5uZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd0Jhbm5lciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldHJld2FyZGJ0bi52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIExheWEudGltZXIub25jZSggMjAwMCx0aGlzLCgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRyZXdhcmRidG4udmlzaWJsZSA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9ICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHB2ID49IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgR2lmdFZpZXcuZ2V0cmV3YXJkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldHJld2FyZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBcclxuICAgICAgICBSb2xlRGF0YS5JbnN0YW5jZS5Nb25leSArPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkNoZWF0UmV3YXJkO1xyXG4gICAgICAgIC8vICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkdvbGRVcCggUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5DaGVhdFJld2FyZCApO1xyXG4gICAgICAgIC8vIHZhciBpbmRleCA9ICggdGhpcy5nZXRQcm94eSggQWdlbmN5TG90dGVyeSApIGFzIEFnZW5jeUxvdHRlcnkgKS5HZXRSZXdhcmQoKTtcclxuICAgICAgICAvLyB2YXIgc2VsZWN0Y2ZnOkxvdHRlcnlDRkcgPSBMb3R0ZXJ5Q0ZHLnZlY1sgaW5kZXggXTtcclxuICAgICAgICAvLyB6cHByb3h5LmdldHJld2FyZCggc2VsZWN0Y2ZnICk7XHJcbiAgICAgICAgLy8gVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi6I635b6XXCIrUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5DaGVhdFJld2FyZCtcIumHkeW4gVwiICk7XHJcbiAgICAgICAgR2lmdFZpZXcub25jbG9zZWZ1bigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v55yL6KeG6aKR5b6X5aWW5YqxXHJcbiAgICBWaWRlb0dldFJld2FyZCgpe1xyXG4gICAgICAgIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcclxuICAgICAgICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAgICAgICAgIFJvbGVEYXRhLkluc3RhbmNlLk1vbmV5ICs9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuQ2hlYXRSZXdhcmQ7XHJcbiAgICAgICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuiOt+W+l1wiK1BsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuQ2hlYXRSZXdhcmQrXCLph5HluIFcIiApO1xyXG4gICAgICAgICAgICAgICAgR2lmdFZpZXcub25jbG9zZWZ1bigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICBHaWZ0Vmlldy5vbmNsb3NlZnVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhpZGViYW5uZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgR3VhbmdHYW8uaGlkZWJhbm5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBHaWZ0VmlldyApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEd1YW5nR2FvLmhpZGViYW5uZXIoKTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgc3VwZXIuZGVzdG9yeSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBcclxufSIsImltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIFdvcmRUaXBzUGFuZWwgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sXG57XG4gICAgcHVibGljIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJXb3JkVGlwc1BhbmVsXCI7XG4gICAgdGV4dF93b3JkOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgdDE6ZmFpcnlndWkuVHJhbnNpdGlvbjtcbiAgICBwdWJsaWMgbm93d29yZDpzdHJpbmcgPSBcIlwiO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKCBcImxvYWRpbmdcIixcIndvcmRUaXBzXCIgKTtcbiAgICB9ICAgXG5cbiAgICBcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIHNob3dUZXh0KCk6IHZvaWQge1xuICAgICAgICB2YXIgdGV4dDpMYXlhLiBUZXh0ID0gbmV3IExheWEuVGV4dCgpO1xuXG4gICAgICAgIHRleHQudGV4dCA9IFwiT3JpZW50YXRpb24tUG9ydHJhaXRcIjtcbiAgICAgICAgdGV4dC5jb2xvciA9IFwiZ3JheVwiO1xuICAgICAgICB0ZXh0LmZvbnQgPSBcIkltcGFjdFwiO1xuICAgICAgICB0ZXh0LmZvbnRTaXplID0gNTA7XG5cbiAgICAgICAgdGV4dC54ID0gTGF5YS5zdGFnZS53aWR0aCAtIHRleHQud2lkdGggPj4gMTtcbiAgICAgICAgdGV4dC55ID0gTGF5YS5zdGFnZS5oZWlnaHQgLSB0ZXh0LmhlaWdodCA+PiAxO1xuXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGV4dCk7XG4gICAgfVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5cbiAgICBwdWJsaWMgc2hvd1dvcmQoIHdvcmQ6c3RyaW5nICk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5ub3d3b3JkID0gd29yZDtcbiAgICAgICAgdGhpcy50ZXh0X3dvcmQudGV4dCA9IHdvcmQ7XG4gICAgICAgIHRoaXMudDEucGxheSggTGF5YS5IYW5kbGVyLmNyZWF0ZSggdGhpcywgdGhpcy5wbGF5RW5kQ2FsbGJhY2sgKSwxICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHN1cGVyLm9uSW5pdCgpO1xuICAgICAgICB0aGlzLnQxID0gdGhpcy5nZXRwYW5lbFRyYW5zaXRpb24oXCJ0MVwiKTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cdHByaXZhdGUgcmVjdDpMYXlhLiBTcHJpdGU7XG4gICAgcHJpdmF0ZSBjcmVhdGVDYW50cmFsUmVjdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWN0ID0gbmV3IExheWEuU3ByaXRlKCk7XG4gICAgICAgIHRoaXMucmVjdC5ncmFwaGljcy5kcmF3UmVjdCgtMTAwLCAtMTAwLCAyMDAsIDIwMCwgXCJncmF5XCIpO1xuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMucmVjdCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVSZWN0UG9zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVSZWN0UG9zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlY3QueCA9IExheWEuc3RhZ2Uud2lkdGggLyAyO1xuICAgICAgICB0aGlzLnJlY3QueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC8gMjtcbiAgICB9XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHJpdmF0ZSBwbGF5RW5kQ2FsbGJhY2soKTp2b2lkXG4gICAge1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUucmVtb3Zlc2VsZWN0LHRoaXMgKTtcbiAgICB9XG59IiwiaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XG5cbmV4cG9ydCBjbGFzcyBMb2FkaW5nUGFuZWwgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sXG57XG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkxvYWRpbmdQYW5lbFwiO1xuICAgIHBybzpmYWlyeWd1aS5HUHJvZ3Jlc3NCYXI7XG4gICAgY29uc3RydWN0b3IoKSBcbiAgICB7IFxuICAgICAgICBzdXBlcihcImxvYWRpbmdcIixcImxvYWRpbmdcIik7IFxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICBzdXBlci5vbkluaXQoKTtcbiAgICB9XG5cbiAgICBcbiAgICBwdWJsaWMgc2hvd1dvcmQoIHZhbHVlOm51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMucHJvLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkJveUNsaWNrKGU6TGF5YS5FdmVudCk6IHZvaWQge1xuICAgICAgICAvL+eCueWHu+WQjuWwj+S6uuS8muaUvuWkp+e8qeWwj1xuICAgICAgICB2YXIgYm95OkxheWEuIFNwcml0ZSA9IGUudGFyZ2V0O1xuICAgICAgICBpZiAoYm95LnNjYWxlWCA9PT0gMSkge1xuICAgICAgICAgICAgYm95LnNjYWxlKDEuMiwgMS4yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJveS5zY2FsZSgxLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25UeHRDbGljayhlOiBFdmVudCk6IHZvaWQge1xuICAgICAgICAvL+eCueWHu+WQjuWIh+aNoumAgumFjeaooeW8j1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgIFxuICAgIH1cblxuICAgXG5cbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuY2xlYXJFdmVudCgpO1xuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XG4gICAgfVxufSIsImltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xuaW1wb3J0IHtWaWV3QWN0aW9ufSBmcm9tIFwiLi4vdXRpbHMvVmlld0FjdGlvblwiO1xuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xuaW1wb3J0IHtwaW5ndGFpdXRpbHN9IGZyb20gXCIuLi9XWFNESy9waW5ndGFpdXRpbHNcIjtcbmltcG9ydCBMb3R0ZXJ5Q0ZHIGZyb20gXCIuLi9DRkcvTG90dGVyeUNGR1wiO1xuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi9DRkcvUm9sZUNGR1wiO1xuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xuaW1wb3J0IHtBZ2VuY3lMb3R0ZXJ5fSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeUxvdHRlcnlcIjtcbmltcG9ydCB7R3VhbmdHYW99IGZyb20gXCIuLi9XWFNESy9HdWFuZ0dhb1wiO1xuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi9XWFNESy90dGFkXCI7XG5cbmV4cG9ydCBjbGFzcyBMb3R0ZXJ5UGFuZWwgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sIFxue1xuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJMb3R0ZXJ5UGFuZWxcIjtcblxuICAgIGJhY2tidG46ZmFpcnlndWkuR0J1dHRvbjtcbiAgICBsb3R0ZXJ5YnRuOmZhaXJ5Z3VpLkdCdXR0b247XG4gICAgaWNvbl8wOmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgdHh0XzA6ZmFpcnlndWkuR1RleHRGaWVsZDtcbiAgICBpY29uXzE6ZmFpcnlndWkuR0xvYWRlcjtcbiAgICB0eHRfMTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgIGljb25fMjpmYWlyeWd1aS5HTG9hZGVyO1xuICAgIHR4dF8yOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgaWNvbl8zOmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgdHh0XzM6ZmFpcnlndWkuR1RleHRGaWVsZDtcbiAgICBpY29uXzQ6ZmFpcnlndWkuR0xvYWRlcjtcbiAgICB0eHRfNDpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgIGljb25fNTpmYWlyeWd1aS5HTG9hZGVyO1xuICAgIHR4dF81OmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgaWNvbl82OmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgdHh0XzY6ZmFpcnlndWkuR1RleHRGaWVsZDtcbiAgICBpY29uXzc6ZmFpcnlndWkuR0xvYWRlcjtcbiAgICB0eHRfNzpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuXG4gICAgcHJpdmF0ZSBhZ2VuY3lsb3R0ZXJ5OkFnZW5jeUxvdHRlcnk7XG4gICAgXG4gICAgY29uc3RydWN0b3IoKSBcbiAgICB7IFxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJMb3R0ZXJ5Vmlld1wiLGZhbHNlLFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lLDEgKTsgXG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIGxvZ2dlcjpMYXlhLlRleHQ7XG4gICAgcHJpdmF0ZSBzaG93TG9nZ2VyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZ2dlciA9IG5ldyBMYXlhLlRleHQoKTtcblxuICAgICAgICB0aGlzLmxvZ2dlci5mb250U2l6ZSA9IDMwO1xuICAgICAgICB0aGlzLmxvZ2dlci5jb2xvciA9IFwiI0ZGRkZGRlwiO1xuICAgICAgICB0aGlzLmxvZ2dlci5hbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICB0aGlzLmxvZ2dlci52YWxpZ24gPSAnbWlkZGxlJztcblxuICAgICAgICB0aGlzLmxvZ2dlci5zaXplKExheWEuc3RhZ2Uud2lkdGgsIExheWEuc3RhZ2UuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5sb2dnZXIudGV4dCA9IFwi562J5b6F5ZON5bqULi4uXFxuXCI7XG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5sb2dnZXIpO1xuICAgIH1cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5cbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RFcnJvcihlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYmFja2J0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmNsb3NlZnVuICk7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubG90dGVyeWJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5jaG91amlhbmdjbGljayApO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBfdHdlZU9iamVjdDphbnk7XG4gICAgcHJpdmF0ZSBfbm93Z2V0SW5kZXg6bnVtYmVyO1xuICAgIHByaXZhdGUgX3ByZUluZGV4Om51bWJlcjtcbiAgICBwcml2YXRlIHR3OiBsYXlhLnV0aWxzLlR3ZWVuO1xuICAgIFxuXG4gICAgcHJpdmF0ZSBwbGF5Q29tcGx0ZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLnR3IClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy50dy5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy50dyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYWNrYnRuLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvdHRlcnlidG4uZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuYWdlbmN5bG90dGVyeS5nZXRyZXdhcmQoIHRoaXMuX3NlbGVjdGNmZyApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25jbG9zZWZ1bigpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCB0aGlzLnR3IClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy50dy5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy50dyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgR3VhbmdHYW8uQ2xlYXIoKTtcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIExvdHRlcnlQYW5lbCApO1xuICAgIH1cblxuXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5hZ2VuY3lsb3R0ZXJ5ID0gdGhpcy5nZXRQcm94eSggQWdlbmN5TG90dGVyeSApO1xuICAgICAgICB2YXIgdmVjOkFycmF5PExvdHRlcnlDRkc+ID0gTG90dGVyeUNGRy52ZWM7XG4gICAgICAgIGZvciggdmFyIGk6bnVtYmVyID0gMDtpIDwgdmVjLmxlbmd0aDtpKysgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgY2ZnOkxvdHRlcnlDRkcgPSB2ZWNbaV07XG4gICAgICAgICAgICBpZiggY2ZnLnR5cGUgPT0gMSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpc1tcImljb25fXCIraV0udXJsID0gZmFpcnlndWkuVUlQYWNrYWdlLmdldEl0ZW1VUkwoIFwibWFpblwiLFwiaW1nX2dvbGRcIiApO1xuICAgICAgICAgICAgICAgIHRoaXNbXCJ0eHRfXCIraV0udGV4dCA9IFwiWFwiICsgY2ZnLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciByb2xlY2ZnOlJvbGVDRkcgPSBSb2xlQ0ZHLmRpY3RbY2ZnLnZhbHVlXTtcbiAgICAgICAgICAgICAgICB0aGlzW1wiaWNvbl9cIitpXS51cmwgPSBBc3NldFBhdGguZ2V0cm9sZWljb24oIHJvbGVjZmcuaWNvbiApO1xuICAgICAgICAgICAgICAgIHRoaXNbXCJ0eHRfXCIraV0udGV4dCA9IHJvbGVjZmcucm9sZW5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgR3VhbmdHYW8uQ2hlYXRCYW5uZXIodGhpcy5sb3R0ZXJ5YnRuKTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgb25Tb2NrZXRDbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJTb2NrZXQgY2xvc2VkXCIpO1xuICAgIH1cbiAgICBwcml2YXRlIG9uTWVzc2FnZVJldmVpdmVkKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZyhcIk1lc3NhZ2UgZnJvbSBzZXJ2ZXI6XCIpO1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5cblxuICAgIHByaXZhdGUgY2hvdWppYW5nY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLnZpZGVvY2FsbGJhY2soKTtcbiAgICAgICAgLy8gcGluZ3RhaXV0aWxzLkluc3RhbmNlLnBsYXlWaWRlbyggXCJcIix0aGlzLHRoaXMudmlkZW9jYWxsYmFjayApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NlbGVjdGNmZzpMb3R0ZXJ5Q0ZHO1xuICAgIHByaXZhdGUgdmlkZW9jYWxsYmFjaygpOnZvaWRcbiAgICB7XG4gICAgICAgIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcbiAgICAgICAgICAgIGlmKGlzTG9hZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFBsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFBsYXkoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmFnZW5jeWxvdHRlcnkuR2V0UmV3YXJkKCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGNmZyA9IExvdHRlcnlDRkcudmVjWyBpbmRleCBdO1xuICAgICAgICB0aGlzLmJhY2tidG4uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvdHRlcnlidG4uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9ub3dnZXRJbmRleCA9IGluZGV4O1xuICAgICAgICB2YXIgYW5nbGU6bnVtYmVyID0gMzYwICogNiArICh0aGlzLl9ub3dnZXRJbmRleCkqIDQ1IC0gMTU7XG4gICAgICAgIGlmKCB0aGlzLml0ZW1fcGFuZWwucm90YXRpb24gPT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3R3ZWVPYmplY3QgPSB7IHZhbHVlOjAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3R3ZWVPYmplY3QgPSB7IHZhbHVlOnRoaXMuX3ByZUluZGV4ICogNDUgLSAxNSB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ByZUluZGV4ID0gdGhpcy5fbm93Z2V0SW5kZXg7XG4gICAgICAgIHRoaXMudHcgPSBsYXlhLnV0aWxzLlR3ZWVuLnRvKHRoaXMuX3R3ZWVPYmplY3QsIHsgdmFsdWU6YW5nbGUgfSwgMzAwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCxMYXlhLkhhbmRsZXIuY3JlYXRlKCB0aGlzLHRoaXMucGxheUNvbXBsdGUgKSk7XG4gICAgICAgIHRoaXMudHcudXBkYXRlID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlOm51bWJlciA9IHRoaXMuX3R3ZWVPYmplY3QudmFsdWUgJSAzNjA7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtX3BhbmVsLnJvdGF0aW9uID0gIHZhbHVlO1xuICAgICAgICAgICAgfSwgbnVsbCwgZmFsc2UpO1xuICAgIH1cbiAgICBcbn0iLCJpbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcbmltcG9ydCB7R2FtZVN0YXRlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvR2FtZVN0YXRlQ29udHJvbFwiO1xuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xuaW1wb3J0IHtSb2xlRGF0YX0gZnJvbSBcIi4uL0RhdGEvUm9sZURhdGFcIjtcbmltcG9ydCB7VXNlckluZm9FdmVudH0gZnJvbSBcIi4uL0RhdGEvVXNlckluZm9FdmVudFwiO1xuaW1wb3J0IHtBZ2VuY3lTa2lufSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVNraW5cIjtcbmltcG9ydCB7QWdlbmN5SW5HYW1lfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeUluR2FtZVwiO1xuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xuaW1wb3J0IHtBZ2VuY3lMb3R0ZXJ5fSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeUxvdHRlcnlcIjtcbmltcG9ydCBDaG91dGlQYW5WaWV3IGZyb20gXCIuLi9QdXNoL0Nob3V0aVBhblZpZXdcIjtcbmltcG9ydCBUdWlqaWFuVmlldyBmcm9tIFwiLi4vUHVzaC9UdWlqaWFuVmlld1wiO1xuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vV1hTREsvdHRhZFwiO1xuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi4vV1hTREsvU2RrXCI7XG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XG5pbXBvcnQgeyBMb2NhbERhdGFDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvTG9jYWxEYXRhQ29udHJvbFwiO1xuaW1wb3J0IHsgVXNlckRhdGFJbmZvIH0gZnJvbSBcIi4uL0RhdGEvVXNlckRhdGFJbmZvXCI7XG5pbXBvcnQgeyBTa2luRGF0YSB9IGZyb20gXCIuLi9EYXRhL1NraW5EYXRhXCI7XG5pbXBvcnQgeyBTY2VuZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9TY2VuZUNvbnRyb2xcIjtcblxuZXhwb3J0IGNsYXNzIE1haW5QYW5lbCBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2xcbntcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiTWFpblBhbmVsXCI7XG4gICAgc3RhdGljIGluc3RhbmNlOk1haW5QYW5lbDtcblxuICAgIGNfc3RhdGU6ZmFpcnlndWkuQ29udHJvbGxlcjtcbiAgICBsb2FkX2NsaWNrcGFuZWw6ZmFpcnlndWkuR0xvYWRlcjtcbiAgICBsb2FkX3N0YXJ0OmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgdHh0X2x2OmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgcHJvX2RpczpmYWlyeWd1aS5HUHJvZ3Jlc3NCYXI7XG4gICAgdHh0X21pbmdjaTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgIHR4dF9nb2xkOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgU2tpbkJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xuICAgIE1vcmVHYW1lQnRuOmZhaXJ5Z3VpLkdCdXR0b247XG4gICAgRXhpdEJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xuICAgIExvdHRlcnlCdG46ZmFpcnlndWkuR0J1dHRvbjtcbiAgICBTZXRCdG46ZmFpcnlndWkuR0J1dHRvbjtcblxuICAgIE1vcmVGdW5CdG5TY2FsZTpmYWlyeWd1aS5UcmFuc2l0aW9uO1xuXG4gICAgLy/mm7TlpJrlpb3njqnmjInpkq5cbiAgICBNb3JlRnVuQnRuOmZhaXJ5Z3VpLkdCdXR0b247XG5cbiAgICAvL+earuiCpOaMiemSruWKqOaViFxuICAgIFNraW5Bbmk6ZmFpcnlndWkuVHJhbnNpdGlvbjtcbiAgICAvL+abtOWkmuWlveeOqeaMiemSruWKqOaViFxuICAgIE1vcmVBbmk6ZmFpcnlndWkuVHJhbnNpdGlvbjtcbiAgICAvL+aKveWlluaMiemSruWKqOaViFxuICAgIExvdHRlcnlBbmk6ZmFpcnlndWkuVHJhbnNpdGlvbjtcblxuICAgIHByaXZhdGUgYWdlbmN5dXNlcm1lc3NhZ2U6QWdlbmN5VXNlck1lc3NhZ2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIFxuICAgIHsgXG4gICAgICAgIHN1cGVyKFwibWFpblwiLFwibWFpbnZpZXdcIik7IFxuICAgICAgICBNYWluUGFuZWwuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVXNlckRhdGFIYW5kbGVyKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy50eHRfZ29sZC50ZXh0ID0gdGhpcy5hZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YS5Nb25leS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmV0dXJubWFpbkhhbmRsZXIoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSB0aGlzLmFnZW5jeXVzZXJtZXNzYWdlLlJvbGVEYXRhO1xuICAgICAgICAvLyBpZiggUm9sZURhdGEubm93bGV2ZWwgPD0gMiApXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBlbHNlXG4gICAgICAgIC8vIHtcbiAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICBzdXBlci5vbkluaXQoKTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgIC8vIOS4gOWPquWHpOWHsOeahOWIhui+qOeOh+aYrzU1MCAqIDQwMFxuICAgICBwcml2YXRlIHBob2VuaXhXaWR0aDogbnVtYmVyID0gNTUwO1xuICAgICBwcml2YXRlIHBob2VuaXhIZWlnaHQ6IG51bWJlciA9IDQwMDtcblxuICAgICBwcml2YXRlIGJnQ29sb3JUd2VlbmVyOkxheWEuVHdlZW4gPSBuZXcgTGF5YS5Ud2VlbigpO1xuICAgICBwcml2YXRlIGdyYWRpZW50SW50ZXJ2YWw6IG51bWJlciA9IDIwMDA7XG4gICAgIHByaXZhdGUgYmdDb2xvckNoYW5uZWxzOiBhbnkgPSB7IHI6IDk5LCBnOiAwLCBiOiAweEZGIH07XG4gICAgcHJpdmF0ZSBjcmVhdGVQaG9lbml4ZXMoKTogdm9pZCB7XG4gICAgICAgIHZhciBzY2FsZUZhY3RvcjogbnVtYmVyID0gTWF0aC5taW4oXG4gICAgICAgICAgICBMYXlhLnN0YWdlLndpZHRoIC8gKHRoaXMucGhvZW5peFdpZHRoICogMiksXG4gICAgICAgICAgICBMYXlhLnN0YWdlLmhlaWdodCAvIHRoaXMucGhvZW5peEhlaWdodCk7XG5cbiAgICAgICAgLy8g5Yqg5LqG5re35ZCI5qih5byP55qE5Yek5YewXG4gICAgICAgIHZhciBibGVuZGVkUGhvZW5peDpMYXlhLkFuaW1hdGlvbiBcbiAgICAgICAgYmxlbmRlZFBob2VuaXguYmxlbmRNb2RlID0gXCJsaWdodGVyXCI7XG4gICAgICAgIGJsZW5kZWRQaG9lbml4LnNjYWxlKHNjYWxlRmFjdG9yLCBzY2FsZUZhY3Rvcik7XG4gICAgICAgIGJsZW5kZWRQaG9lbml4LnkgPSAoTGF5YS5zdGFnZS5oZWlnaHQgLSB0aGlzLnBob2VuaXhIZWlnaHQgKiBzY2FsZUZhY3RvcikgLyAyO1xuXG4gICAgICAgIC8vIOato+W4uOaooeW8j+eahOWHpOWHsFxuICAgICAgICB2YXIgbm9ybWFsUGhvZW5peDpMYXlhLkFuaW1hdGlvbjtcbiAgICAgICAgbm9ybWFsUGhvZW5peC5zY2FsZShzY2FsZUZhY3Rvciwgc2NhbGVGYWN0b3IpO1xuICAgICAgICBub3JtYWxQaG9lbml4LnggPSB0aGlzLnBob2VuaXhXaWR0aCAqIHNjYWxlRmFjdG9yO1xuICAgICAgICBub3JtYWxQaG9lbml4LnkgPSAoTGF5YS5zdGFnZS5oZWlnaHQgLSB0aGlzLnBob2VuaXhIZWlnaHQgKiBzY2FsZUZhY3RvcikgLyAyO1xuICAgIH1cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBcblxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuRXhpdEJ0bi52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuTW9yZUZ1bkJ0bi52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuTW9yZUdhbWVCdG4udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0dGFkLlNob3diYW5uZXIoKTtcbiAgICAgICAgLy8gTGF5YS50aW1lci5vbmNlKDUwMCx0aGlzLCgpPT57XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcIm1haW7nlYzpnaLnmb3lkI3ljZUtLS0tXCIsRllIRF9TZGsuaXN3aGl0ZSk7XG4gICAgICAgIC8vICAgICBpZihGWUhEX1Nkay5pc3doaXRlKXtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLkV4aXRCdG4udmlzaWJsZSA9IHRydWU7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICBlbHNle1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuRXhpdEJ0bi52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0pXG4gICAgICAgIHRoaXMuTW9yZUZ1bkJ0blNjYWxlID0gdGhpcy5nZXRUcmFuc2l0aW9uQnlOYW1lKFwibW9yZWZ1bmJ0bnNjYWxlXCIpO1xuICAgICAgICBcbiAgICAgICAgTGF5YS50aW1lci5sb29wKDEwMDAsdGhpcyx0aGlzLnBsYXlhbmltYXRvcjIpO1xuICAgICAgICB0aGlzLlNraW5BbmkgPSB0aGlzLlNraW5CdG4uZ2V0VHJhbnNpdGlvbihcInNraW5hbmlcIik7XG4gICAgICAgIHRoaXMuTG90dGVyeUFuaSA9IHRoaXMuTG90dGVyeUJ0bi5nZXRUcmFuc2l0aW9uKFwibG90dGVyeWFuaVwiKTtcbiAgICAgICAgdGhpcy5Nb3JlQW5pID0gdGhpcy5Nb3JlR2FtZUJ0bi5nZXRUcmFuc2l0aW9uKFwibW9yZWFuaVwiKTtcbiAgICAgICAgTGF5YS50aW1lci5sb29wKDMwMDAsdGhpcyx0aGlzLnBsYXlhbmltYXRvcik7XG5cbiAgICAgICAgdGhpcy5hZ2VuY3l1c2VybWVzc2FnZSA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICk7XG4gICAgICAgIFByb3BNYW5hZ2VyLnByb19qaW5kdSA9IHRoaXMucHJvX2RpcztcbiAgICAgICAgUHJvcE1hbmFnZXIudHh0X21pbmdjaSA9IHRoaXMudHh0X21pbmdjaTtcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyQnlCYW1lKCBcImNfc3RhdGVcIiApO1xuICAgICAgICBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLnNldENsaWNrUGFuZWwoIHRoaXMubG9hZF9jbGlja3BhbmVsICk7XG4gICAgICAgIHRoaXMucmV0dXJubWFpbkhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy51cGRhdGVVc2VyRGF0YUhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy5Jbml0U2lnbkl0ZW0oKTtcbiAgICB9XG4gICAgcGxheWFuaW1hdG9yKCl7XG4gICAgICAgIHRoaXMuU2tpbkFuaS5wbGF5KG51bGwsMSk7XG4gICAgICAgIHRoaXMuTG90dGVyeUFuaS5wbGF5KG51bGwsMSk7XG4gICAgICAgIHRoaXMuTW9yZUFuaS5wbGF5KG51bGwsMSk7XG4gICAgfVxuICAgIHBsYXlhbmltYXRvcjIoKXtcbiAgICAgICAgdGhpcy5Nb3JlRnVuQnRuU2NhbGUucGxheShudWxsLDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hvdWppYW5nY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICB0dGFkLkNsZWFyKCk7XG4gICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5TG90dGVyeSApIGFzIEFnZW5jeUxvdHRlcnkgKS5vcGVuVmlldygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdHVpamlhbmNsaWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBUdWlqaWFuVmlldyApO1xuICAgIH1cblxuICAgIHB1YmxpYyBza2luY2xpY2soKTp2b2lkXG4gICAge1xuICAgICAgICB0dGFkLkNsZWFyKCk7XG4gICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5U2tpbiApIGFzIEFnZW5jeVNraW4gKS5vcGVudmlldygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW9yZWNsaWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgLy8gVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3ICk7XG4gICAgICAgIHR0YWQuQ3JlYXRlTW9yZUdhbWVCdG4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ0bmNsaWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgR2FtZVN0YXRlLkdhbWVOdW0rKztcbiAgICAgICAgdHRhZC5DbGVhcigpO1xuICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDI7XG4gICAgICAgIHRoaXMudHh0X2x2LnRleHQgPSB0aGlzLmFnZW5jeXVzZXJtZXNzYWdlLlJvbGVEYXRhLmdldE5vd1NlcnZlckxldmVsKCkudG9TdHJpbmcoKTtcbiAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lJbkdhbWUgKSBhcyBBZ2VuY3lJbkdhbWUgKS5zdGFydEdhbWUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldGNsaWNrKCk6dm9pZHtcbiAgICAgICAgXG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgdGlsZWRNYXA6TGF5YS5UaWxlZE1hcDtcbiAgICBwcml2YXRlIGxheWVyOkxheWEuTWFwTGF5ZXI7XG4gICAgcHJpdmF0ZSBzcHJpdGU6TGF5YS5TcHJpdGU7XG4gICAgcHJpdmF0ZSBtYXBMb2FkZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubGF5ZXIgPSB0aGlzLnRpbGVkTWFwLmdldExheWVyQnlJbmRleCgwKTtcblxuICAgICAgICB2YXIgcmFkaXVzWDogbnVtYmVyID0gMzI7XG4gICAgICAgIHZhciByYWRpdXNZOiBudW1iZXIgPSBNYXRoLnRhbigxODAgLyBNYXRoLlBJICogMzApICogcmFkaXVzWDtcbiAgICAgICAgdmFyIGNvbG9yOiBzdHJpbmcgPSBcIiNGRjdGNTBcIjtcbiAgICAgICAgdGhpcy5zcHJpdGUgPSBuZXcgTGF5YS5TcHJpdGUoKTtcbiAgICAgICAgdGhpcy5zcHJpdGUuZ3JhcGhpY3MuZHJhd0xpbmUoMCwgMCwgLXJhZGl1c1gsIHJhZGl1c1ksIGNvbG9yKTtcbiAgICAgICAgdGhpcy5zcHJpdGUuZ3JhcGhpY3MuZHJhd0xpbmUoMCwgMCwgcmFkaXVzWCwgcmFkaXVzWSwgY29sb3IpO1xuICAgICAgICB0aGlzLnNwcml0ZS5ncmFwaGljcy5kcmF3TGluZSgtcmFkaXVzWCwgcmFkaXVzWSwgMCwgcmFkaXVzWSAqIDIsIGNvbG9yKTtcbiAgICAgICAgdGhpcy5zcHJpdGUuZ3JhcGhpY3MuZHJhd0xpbmUocmFkaXVzWCwgcmFkaXVzWSwgMCwgcmFkaXVzWSAqIDIsIGNvbG9yKTtcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLnNwcml0ZSk7XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxvYWRfc3RhcnQsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuYnRuY2xpY2sgKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5Ta2luQnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLnNraW5jbGljayApO1xuICAgICAgICAvLyB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLk1vcmVHYW1lQnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLm1vcmVjbGljayApO1xuICAgICAgICAvLyB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLk1vcmVGdW5CdG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMubW9yZWNsaWNrICk7XG4gICAgICAgIC8vIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuRXhpdEJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy50dWlqaWFuY2xpY2sgKTtcbiAgICAgICAgdGhpcy5hZGREYXRhRXZlbnQoIEdhbWVTdGF0ZS5yZXR1cm5NYWluVmlldyx0aGlzLHRoaXMucmV0dXJubWFpbkhhbmRsZXIgKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5Mb3R0ZXJ5QnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmNob3VqaWFuZ2NsaWNrICk7XG4gICAgICAgIHRoaXMuYWRkRGF0YUV2ZW50KCBVc2VySW5mb0V2ZW50LlVzZXJJbmZvRXZlbnRfdXBkYXRlVXNlckRhdGEsdGhpcyx0aGlzLnVwZGF0ZVVzZXJEYXRhSGFuZGxlciApO1xuICAgIH1cblxuICAgICAvLyNyZWdpb24g562+5YiwXG4gICAgIGJ0bl9TaWduOmZhaXJ5Z3VpLkdCdXR0b247XG5cbiAgICAgU2lnblBhbmVsOmZhaXJ5Z3VpLkdHcm91cDtcbiAgICAgU2lnbkl0ZW0xOmZhaXJ5Z3VpLkdJbWFnZTtcbiAgICAgU2lnbkl0ZW0yOmZhaXJ5Z3VpLkdJbWFnZTtcbiAgICAgU2lnbkl0ZW0zOmZhaXJ5Z3VpLkdJbWFnZTtcbiAgICAgU2lnbkl0ZW00OmZhaXJ5Z3VpLkdJbWFnZTtcbiAgICAgU2lnbkl0ZW01OmZhaXJ5Z3VpLkdJbWFnZTtcbiAgICAgU2lnbkl0ZW02OmZhaXJ5Z3VpLkdJbWFnZTtcbiAgICAgU2lnbkl0ZW03OmZhaXJ5Z3VpLkdJbWFnZTtcbiBcbiAgICAgU2lnbkFkOmZhaXJ5Z3VpLkdJbWFnZTtcbiBcbiAgICAgU2lnbkl0ZW06ZmFpcnlndWkuR0ltYWdlW107XG4gICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgXG4gICAgLy8jcmVnaW9uIOWIneWni+WMluetvuWIsFxuXG4gICAgcHJpdmF0ZSBpc1Nob3dTaWduOmJvb2xlYW49ZmFsc2U7XG5cbiAgICAvKuWLvumAieWbviovXG4gICAgcHJpdmF0ZSBTaWduVGlja0ltYWdlOmZhaXJ5Z3VpLkdJbWFnZTtcbiAgICBwcml2YXRlIHNpZ25Ob3JhbUJ1dHRvbjpmYWlyeWd1aS5HQnV0dG9uO1xuICAgIHByaXZhdGUgc2lnbkFkQnV0dG9uOmZhaXJ5Z3VpLkdCdXR0b247XG5cbiAgICBwcml2YXRlIFNpZ25EYW5iZWlCdG46ZmFpcnlndWkuR0J1dHRvbjtcblxuICAgIHByaXZhdGUgSW5pdFNpZ25JdGVtKClcbiAgICB7XG4gICAgICAgIHRoaXMuTG9hZFNpZ25EYXRhKCk7XG4gICAgICAgIHZhciBfYm89dHJ1ZTtcbiAgICAgICAgaWYodGhpcy5nZXRTeXN0ZW1UaW1lKCk9PXRoaXMuU2lnbkluZm9bXCJ0aW1lXCJdKVxuICAgICAgICB7XG4gICAgICAgICAgICBfYm89ZmFsc2U7XG4gICAgICAgIH1lbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuU2lnbkluZm9bXCJGaXNzdExvYWRcIl09MDtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLlNpZ25JbmZvW1wiRmlzc3RMb2FkXCJdPT0xKVxuICAgICAgICB7XG4gICAgICAgICAgICBfYm89ZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5TaWduRGVidWcpXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICAgIF9ibz10cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIFNjZW5lQ29udHJvbC5Jc1Nob3dTaWduPV9ibztcbiAgICAgICAgdGhpcy5TaWduUGFuZWwudmlzaWJsZT1fYm87XG4gICAgICAgIGlmKCFfYm8pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuU2lnbkZ1bigpO1xuICAgIH1cblxuICAgIGJ0bl9TaWduRnVuKClcbiAgICB7XG4gICAgICAgIGlmKHRoaXMuZ2V0U3lzdGVtVGltZSgpPT10aGlzLlNpZ25JbmZvW1widGltZVwiXSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5pc1Nob3dTaWduPXRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLlNpZ25GdW4oKTtcblxuICAgICAgICBpZih0aGlzLmlzU2hvd1NpZ24pXG4gICAgICAgIHtcbiAgICAgICAgICAgIFd4QXBpLlNob3dUeHQoXCLlt7Lnrb7liLBcIik7Ly95Lld4QXBpLlNob3dUeHQoXCLlt7Lnrb7liLBcIilcbiAgICAgICAgICAgIHRoaXMuU2lnblNlbGVjdGVkTW9uZXk9MCtcIlwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgU2lnbkZ1bigpXG4gICAge1xuICAgICAgICB0aGlzLlNpZ25JdGVtPW5ldyBBcnJheSgpO1xuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTEpO1xuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTIpO1xuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTMpO1xuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTQpO1xuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTUpO1xuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTYpO1xuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTcpO1xuXG4gICAgICAgIHRoaXMuU2lnblRpY2tJbWFnZT10aGlzLlNpZ25BZC5hc0NvbS5nZXRDaGlsZEF0KDIpIGFzIGZhaXJ5Z3VpLkdJbWFnZTtcbiAgICAgICAgdmFyIHNpZ25UaWNrQnV0dG9uPXRoaXMuU2lnbkFkLmFzQ29tLmdldENoaWxkQXQoMSkgYXMgZmFpcnlndWkuR0J1dHRvbjtcbiAgICAgICAgdGhpcy5zaWduQWRCdXR0b249dGhpcy5TaWduQWQuYXNDb20uZ2V0Q2hpbGRBdCgzKSBhcyBmYWlyeWd1aS5HQnV0dG9uO1xuICAgICAgICB0aGlzLnNpZ25Ob3JhbUJ1dHRvbj10aGlzLlNpZ25BZC5hc0NvbS5nZXRDaGlsZEF0KDQpIGFzIGZhaXJ5Z3VpLkdCdXR0b247XG4gICAgICAgIHRoaXMuU2lnbkRhbmJlaUJ0biA9IHRoaXMuU2lnbkFkLmFzQ29tLmdldENoaWxkQXQoNSkgYXMgZmFpcnlndWkuR0J1dHRvbjtcblxuICAgICAgICB0aGlzLlNpZ25UaWNrSW1hZ2UudmlzaWJsZT0oUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5TaG93U2lnbik7XG4gICAgICAgIHRoaXMuc2lnbk5vcmFtQnV0dG9uLnZpc2libGUgPSB0aGlzLlNpZ25UaWNrSW1hZ2UudmlzaWJsZTtcbiAgICAgICAgdGhpcy5TaWduRGFuYmVpQnRuLnZpc2libGUgPSAhdGhpcy5zaWduTm9yYW1CdXR0b24udmlzaWJsZTtcblxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCBzaWduVGlja0J1dHRvbixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5TaWduVGlja0J1dHRvbkZ1biApO1xuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLnNpZ25BZEJ1dHRvbixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5TaWduQWRCdXR0b25GdW4gKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5zaWduTm9yYW1CdXR0b24sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuU2lnbkFkQnV0dG9uRnVuICk7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUodGhpcy5TaWduRGFuYmVpQnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLlNpZ25Ob3JtYWxCdXR0b25GdW4pO1xuICAgICAgICBcbiAgICAgICAgdmFyIG51bT10aGlzLlNpZ25JbmZvW1wiZGF5XCJdO1xuICAgICAgICB2YXIgbnVtSW5kZXg9MTAwO1xuICAgICAgICBpZihudW08NylcbiAgICAgICAge1xuICAgICAgICAgICAgbnVtSW5kZXg9MTAwO1xuICAgICAgICB9ZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBudW1JbmRleD0xMDc7XG4gICAgICAgICAgICBudW09bnVtJTc7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuU2lnblBpRnU9bnVsbDtcbiAgICAgICAgdGhpcy5TaWduU2VsZWN0ZWRNb25leT0wK1wiXCI7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLlNpZ25JdGVtLmxlbmd0aDsgaW5kZXgrKykge1xuXG4gICAgICAgICAgICB2YXIgZGF0YT0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5HZXRSZXdhcmRDb25maWcoKG51bUluZGV4KzEraW5kZXgpKTtcblxuICAgICAgICAgICAgdmFyIHBpZnU9bnVsbDtcbiAgICAgICAgICAgIGlmKGRhdGFbXCJyZXdhcmRfaXRlbVwiXSE9MTAwMClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZihOdW1iZXIoZGF0YVtcInJld2FyZF9pdGVtXCJdKT42MDAwKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBpZnVJbmRlZHg9TnVtYmVyKGRhdGFbXCJyZXdhcmRfaXRlbVwiXSklNjAwMDtcbiAgICAgICAgICAgICAgICAgICAgcGlmdT1QbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkdldFNraW5BdHRyKHBpZnVJbmRlZHgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwaWZ1ICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBpc09rPXRydWU7XG4gICAgICAgICAgICB2YXIgaXNDbmFTaWduPXRydWU7XG4gICAgICAgICAgICBpZihpbmRleDxudW0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaXNPaz10cnVlO1xuICAgICAgICAgICAgICAgIGlzQ25hU2lnbj1mYWxzZTtcbiAgICAgICAgICAgIH1lbHNlIGlmKGluZGV4PT1udW0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaXNPaz1mYWxzZTtcbiAgICAgICAgICAgICAgICBpc0NuYVNpZ249dHJ1ZTtcbiAgICAgICBcbiAgICAgICAgICAgIH1lbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaXNPaz1mYWxzZTtcbiAgICAgICAgICAgICAgICBpc0NuYVNpZ249ZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGV4dDtcbiAgICAgICAgICAgIGlmKGluZGV4PDYpe1xuICAgICAgICAgICAgICAgIHRleHQ9XCLnrKwgXCIrKGluZGV4KzEpK1wiIOWkqVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICB0ZXh0PVwi6LGq5Y2O55qu6IKkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLlNldFNpZ25JdGVtSW5mbyh0aGlzLlNpZ25JdGVtW2luZGV4XSx0ZXh0LGRhdGEsaXNPayxpc0NuYVNpZ24scGlmdSk7XG4gICAgICAgIH1cblxuICAgICAgICB0dGFkLlNob3diYW5uZXIoKTsvL1xuICAgICAgICBcbiAgICB9XG5cbiAgICAvKirnrb7liLAqL1xuICAgIHByaXZhdGUgU2V0U2lnbkl0ZW1JbmZvKF9zaWduSXRlbTpmYWlyeWd1aS5HSW1hZ2UsdGV4dDpzdHJpbmcsZGF0YTphbnksX2lzT2s6Ym9vbGVhbixfaXNDYW5TaWduOmJvb2xlYW4scGlmdTphbnkpXG4gICAge1xuICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgICAgaWYocGlmdT09bnVsbClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5sb2coMTExMTExMTExMTExKTtcbiAgICAgICAgICAgIHZhciBteXRleHQ9X3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoMikgYXMgZmFpcnlndWkuR1RleHRGaWVsZDtcbiAgICAgICAgICAgIG15dGV4dC50ZXh0PXRleHQ7XG4gICAgICAgICAgICB2YXIgbXltb25leT1fc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgzKSBhcyBmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgICAgICAgICAgbXltb25leS50ZXh0PWRhdGFbXCJyZXdhcmRfbnVtXCJdO1xuICAgIFxuICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNSkudmlzaWJsZT1mYWxzZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYoX2lzT2spXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoMSkudmlzaWJsZT1mYWxzZTtcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg2KS52aXNpYmxlPXRydWU7XG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNykudmlzaWJsZT10cnVlO1xuICAgICAgICAgICAgfWVsc2UgaWYoX2lzQ2FuU2lnbilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgxKS52aXNpYmxlPXRydWU7XG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNykudmlzaWJsZT1mYWxzZTtcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg2KS52aXNpYmxlPWZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuU2lnblNlbGVjdGVkSXRlbT1fc2lnbkl0ZW07XG4gICAgICAgICAgICAgICAgdGhpcy5TaWduU2VsZWN0ZWRUZXh0PXRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5TaWduU2VsZWN0ZWRNb25leT1kYXRhW1wicmV3YXJkX251bVwiXTtcbiAgICAgICAgICAgICAgICAvLyB2YXIgY2hpbGQxPV9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDcpIGFzIGZhaXJ5Z3VpLkdCdXR0b247XG4gICAgICAgICAgICAgICAgLy8gY2hpbGQxLnZpc2libGU9dHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmFkZExpc3RlbmVyKGNoaWxkMSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMuU2lnbkJ1dHRvbkZ1bixudWxsKTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmFkZExpc3RlbmVyKCBjaGlsZDEsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuU2lnbkJ1dHRvbkZ1biApO1xuICAgICAgICAgICAgfWVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgxKS52aXNpYmxlPWZhbHNlO1xuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDYpLnZpc2libGU9ZmFsc2U7XG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNykudmlzaWJsZT1mYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKDIyMjIyMjIyMjIpO1xuICAgICAgICAgICAgdmFyIG15dGV4dD1fc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgyKSBhcyBmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgICAgICAgICAgdmFyIG15bW9uZXk9X3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoMykgYXMgZmFpcnlndWkuR1RleHRGaWVsZDtcbiAgICAgICAgICAgIG15bW9uZXkudmlzaWJsZT1mYWxzZTtcbiAgICAgICAgICAgIHZhciBteWltYWdlPV9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDQpIGFzIGZhaXJ5Z3VpLkdUZXh0RmllbGQ7XG4gICAgICAgICAgICBteWltYWdlLnZpc2libGU9ZmFsc2U7XG4gICAgXG4gICAgICAgICAgICB2YXIgR0xvYWRlcj1fc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg1KSBhcyBmYWlyeWd1aS5HTG9hZGVyO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZihfaXNPaylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBHTG9hZGVyLmljb24gPSBBc3NldFBhdGguZ2V0cm9sZWljb24oIHBpZnUuaWNvbiApO1xuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDEpLnZpc2libGU9ZmFsc2U7XG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNikudmlzaWJsZT10cnVlO1xuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDcpLnZpc2libGU9dHJ1ZTtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfWVsc2UgaWYoX2lzQ2FuU2lnbilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgxKS52aXNpYmxlPXRydWU7XG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNykudmlzaWJsZT1mYWxzZTtcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg2KS52aXNpYmxlPWZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuU2lnblNlbGVjdGVkSXRlbT1fc2lnbkl0ZW07XG4gICAgICAgICAgICAgICAgdGhpcy5TaWduU2VsZWN0ZWRUZXh0PXRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5TaWduU2VsZWN0ZWRNb25leT0wK1wiXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5TaWduUGlGdT1waWZ1O1xuICAgICAgICAgICAgICAgIEdMb2FkZXIudmlzaWJsZT10cnVlO1xuICAgICAgICAgICAgICAgIEdMb2FkZXIuaWNvbiA9IEFzc2V0UGF0aC5nZXRyb2xlaWNvbiggdGhpcy5TaWduUGlGdS5pY29uICk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5hZGRMaXN0ZW5lcihjaGlsZDEsTGF5YS5FdmVudC5DTElDSyx0aGlzLlNpZ25CdXR0b25GdW4sbnVsbCk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5hZGRMaXN0ZW5lciggY2hpbGQxLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLlNpZ25CdXR0b25GdW4gKTtcbiAgICAgICAgICAgIH1lbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgR0xvYWRlci5pY29uID0gQXNzZXRQYXRoLmdldHJvbGVpY29uKCBwaWZ1Lmljb24gKTtcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgxKS52aXNpYmxlPWZhbHNlO1xuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDYpLnZpc2libGU9ZmFsc2U7XG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNykudmlzaWJsZT1mYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBTaWduU2VsZWN0ZWRJdGVtOmZhaXJ5Z3VpLkdJbWFnZTtcbiAgICBwcml2YXRlIFNpZ25TZWxlY3RlZFRleHQ6c3RyaW5nO1xuICAgIHByaXZhdGUgU2lnblNlbGVjdGVkTW9uZXk6c3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBTaWduUGlGdTphbnk7XG5cbiAgICBwdWJsaWMgU2lnbkJ1dHRvbkZ1bigpXG4gICAge1xuXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5pS25Y+W5LqGXCIpO1xuICAgICAgICBpZih0aGlzLmdldFN5c3RlbVRpbWU9PXRoaXMuU2lnbkluZm9bXCJ0aW1lXCJdKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5TaWduQWQudmlzaWJsZT10cnVlO1xuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMzAwMCx0aGlzLCgpPT57dGhpcy5zaWduTm9yYW1CdXR0b24udmlzaWJsZT10cnVlfSk7XG5cbiAgICAgICAgdGhpcy5TZXRTaWduSXRlbUluZm8odGhpcy5TaWduU2VsZWN0ZWRJdGVtLHRoaXMuU2lnblNlbGVjdGVkVGV4dCx0aGlzLlNpZ25TZWxlY3RlZE1vbmV5LHRydWUsZmFsc2UsdGhpcy5TaWduUGlGdSk7XG4gICAgICAgIHRoaXMuU2F2ZVNpZ25EYXRhKCk7XG4gICAgfVxuXG5cbiAgICAvKuWLvumAieaWueazlSovXG4gICAgcHJpdmF0ZSBTaWduVGlja0J1dHRvbkZ1bigpXG4gICAge1xuICAgICAgICB0aGlzLlNpZ25UaWNrSW1hZ2UudmlzaWJsZT0hdGhpcy5TaWduVGlja0ltYWdlLnZpc2libGU7XG4gICAgICAgIHRoaXMuU2lnbkRhbmJlaUJ0bi52aXNpYmxlID0gIXRoaXMuU2lnblRpY2tJbWFnZS52aXNpYmxlO1xuICAgICAgICB0aGlzLnNpZ25Ob3JhbUJ1dHRvbi52aXNpYmxlID0gdGhpcy5TaWduVGlja0ltYWdlLnZpc2libGU7XG4gICAgfVxuXG4gICAgLyrngrnlh7vop4bpopHlj4zlgI3pooblj5YqL1xuICAgIHByaXZhdGUgU2lnbkFkQnV0dG9uRnVuKClcbiAgICB7XG4gICAgICAgIHRoaXMuV2luQWRCdXR0b25GdW4oKTtcbiAgICB9XG5cbiAgICAvKuaZrumAmumihuWPliovXG4gICAgcHJpdmF0ZSBTaWduTm9ybWFsQnV0dG9uRnVuKClcbiAgICB7XG4gICAgICAgIHRoaXMuU2F2ZVNpZ25EYXRhKCk7XG4gICAgICAgIGlmKHRoaXMuU2lnblRpY2tJbWFnZS52aXNpYmxlPT10cnVlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLldpbkFkQnV0dG9uRnVuKCk7XG4gICAgICAgIH1lbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgICh0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCBOdW1iZXIodGhpcy5TaWduU2VsZWN0ZWRNb25leSkgKiAxICk7XG4gICAgICAgICAgICBpZih0aGlzLlNpZ25QaUZ1IT1udWxsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuU2lnbkFkZFBpZnUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgIFxuICAgICAgICAgICAgdGhpcy51cGRhdGVVc2VyRGF0YUhhbmRsZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFNjZW5lQ29udHJvbC5Jc1Nob3dTaWduPWZhbHNlO1xuICAgICAgICB0aGlzLlNpZ25QYW5lbC52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHR0YWQuQ2xlYXIoKTsvLzt5Lld4QXBpLlNob3dUeHQoXCLnrb7liLDmiJDlip9cIilcbiAgICB9XG5cbiAgICAgICAgICAgIC8qKuiDnOWIqeeVjOmdouW5v+WRiuaMiemSriovXG4gICAgICAgIHByaXZhdGUgV2luQWRCdXR0b25GdW4oKVxuICAgICAgICB7XG4gICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuetvuWIsC4uLlwiKTtcbiAgICAgICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHRhZC5TaG93VmlkZW8oKGZsYWcpPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pKt5pS+6KeG6aKR6L+U5Zue5oiQ5YqfXCIrZmxhZyk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGZsYWcpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pKt5pS+6KeG6aKR6L+U5ZueXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCBOdW1iZXIodGhpcy5TaWduU2VsZWN0ZWRNb25leSkgKiAyICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLlNpZ25QaUZ1IT1udWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2lnbkFkZFBpZnUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2F2ZVNpZ25EYXRhKCk7Ly90aGlzLlNhdmVTaWduRGF0YSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNpZ25QYW5lbC52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBTY2VuZUNvbnRyb2wuSXNTaG93U2lnbj1mYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVXNlckRhdGFIYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9XG5cblxuICAgICAgICBwcml2YXRlIFBhb0t1U2lnbjpzdHJpbmc9XCJQYW9LdVNpZ25JbmZvXCI7XG4gICAgICAgIFNpZ25JbmZvOmFueT1udWxsO1xuICAgICAgICBwcml2YXRlIExvYWRTaWduRGF0YSgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIHRoaXMuU2lnbkluZm89e1wiZGF5XCI6MCxcInRpbWVcIjowLFwiRmlzc3RMb2FkXCI6MH07XG4gICAgICAgICAgICAvLyAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihcIlBhb0t1U2lnblwiLHRoaXMuU2lnbkluZm8pO1xuICAgICAgICAgICAgdGhpcy5TaWduSW5mbz1MYXlhLkxvY2FsU3RvcmFnZS5nZXRKU09OKHRoaXMuUGFvS3VTaWduKTtcbiAgICAgICAgICAgIGlmKHRoaXMuU2lnbkluZm89PTB8fHRoaXMuU2lnbkluZm89PW51bGwpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIHRpbWU9dGhpcy5nZXRTeXN0ZW1UaW1lKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5TaWduSW5mbz17XCJkYXlcIjowLFwidGltZVwiOjAsXCJGaXNzdExvYWRcIjowfTtcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRKU09OKHRoaXMuUGFvS3VTaWduLHRoaXMuU2lnbkluZm8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJhc2Rhc2RcIik7XG4gICAgICAgIH1cblxuICAgICAgICBwcml2YXRlIFNhdmVTaWduRGF0YSgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuU2lnbkluZm9bXCJGaXNzdExvYWRcIl09MTtcbiAgICAgICAgICAgIHRoaXMuU2lnbkluZm9bXCJkYXlcIl0rKztcblxuICAgICAgICAgICAgdGhpcy5TaWduSW5mb1tcInRpbWVcIl09dGhpcy5nZXRTeXN0ZW1UaW1lKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04odGhpcy5QYW9LdVNpZ24sdGhpcy5TaWduSW5mbyk7XG4gICAgICAgIH1cblxuICAgICAgICBwcml2YXRlIGdldFN5c3RlbVRpbWUoKTogbnVtYmVyIHtcbiAgICAgICAgICAgIHZhciBjdXJEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIHZhciBtb250aDogbnVtYmVyID0gY3VyRGF0ZS5nZXRNb250aCgpICsgMTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pyIOlwiICsgbW9udGgudG9TdHJpbmcoKSk7XG4gICAgXG4gICAgICAgICAgICB2YXIgZGF0ZTogbnVtYmVyID0gY3VyRGF0ZS5nZXREYXRlKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaXpTpcIiArIGRhdGUudG9TdHJpbmcoKSk7XG4gICAgXG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKCAobW9udGggKyBcIlwiICsgZGF0ZSkpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIHByaXZhdGUgU2lnbkFkZFBpZnUoKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgY2FjaGVkYXRhID0gTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5HZXRMb2NhbENhQ2hlRGF0YSggVXNlckRhdGFJbmZvLnNraW4gKTtcbiAgICAgICAgICAgIC8vIHZhciBjYWNoZWRhdGEgPSBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDYWNoZU9iaiggVXNlckNhY2hlVHlwZS5za2luICk7XG4gICAgICAgICAgICB2YXIgaWQ9dGhpcy5TaWduUGlGdVtcImlkXCJdO1xuICAgICAgICAgICAgdmFyIF9za2luUHJveHk6QWdlbmN5U2tpbiA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeVNraW4gKTtcblxuICAgICAgICAgICAgdmFyIHBpRnVWTzpTa2luRGF0YT1udWxsXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgX3NraW5Qcm94eS5waWZ1QXJyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHBpRnVWTz1fc2tpblByb3h5LnBpZnVBcnJbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmKHBpRnVWTy5yb2xlQ0ZHLmlkPT1pZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBpRnVWTy5zdGF0ZSA9IDE7XG4gICAgICAgICAgICBBZ2VuY3lTa2luLmluc3RhbmNlLkFkZExvY2FsU2tpbkRhdGEocGlGdVZPLnJvbGVDRkcuaWQscGlGdVZPLnN0YXRlLHBpRnVWTy5oYXNudW0pO1xuICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLnVwZGF0ZVNLaW5WaWV3KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6I635Y+W55qu6IKkXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2FjaGVkYXRhKTtcbiAgICAgICAgfVxuXG5cbiAgICAvLyNlbmRyZWdpb25cblxuICAgIFxuXG59IiwiaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XG5pbXBvcnQge1ZpZXdBY3Rpb259IGZyb20gXCIuLi91dGlscy9WaWV3QWN0aW9uXCI7XG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5U2tpblwiO1xuaW1wb3J0IHtTa2luSXRlbX0gZnJvbSBcIi4uL3V0aWxzL1NraW5JdGVtXCI7XG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xuaW1wb3J0IHtVc2VySW5mb0V2ZW50fSBmcm9tIFwiLi4vRGF0YS9Vc2VySW5mb0V2ZW50XCI7XG5pbXBvcnQge1JvbGVEYXRhfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xuaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1Jlc291cmNlQ29udHJvbFwiO1xuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XG5pbXBvcnQge0NoYXJhY3RlclN0YXRlfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZVwiO1xuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xuaW1wb3J0IHtDaGFyYWN0ZXJQb29sfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJQb29sXCI7XG5pbXBvcnQge1BsYXllcn0gZnJvbSBcIi4uL0dhbWUvUGxheWVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTa2luUGFuZWwgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sIFxue1xuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJTa2luUGFuZWxcIjtcbiAgICBjX3RpdGxlOmZhaXJ5Z3VpLkNvbnRyb2xsZXI7XG4gICAgbGlzdF8wOmZhaXJ5Z3VpLkdMaXN0O1xuICAgIGJ0bl9jbG9zZTpmYWlyeWd1aS5HQnV0dG9uO1xuICAgIHByaXZhdGUgX3VpM0RTY2VuZTpMYXlhLlNjZW5lM0Q7XG4gICAgcHJpdmF0ZSBfdWljYXJtYTNEOkxheWEuQ2FtZXJhO1xuICAgIC8vIHByaXZhdGUgX3VpbGlnaHQ6TGF5YS5EaXJlY3Rpb25MaWdodDtcbiAgICBwcml2YXRlIGFnZW5jeXNraW46QWdlbmN5U2tpbjtcbiAgICBwcml2YXRlIF9yb2xlbW86TGF5YS5TcHJpdGUzRDtcbiAgICBwcml2YXRlIF9pc2Rlc3RvcnlzOmJvb2xlYW4gPSBmYWxzZTtcbiAgICBjb25zdHJ1Y3RvcigpIFxuICAgIHsgXG4gICAgICAgIHN1cGVyKCBcIm1haW5cIixcInNraW52aWV3XCIsZmFsc2UsVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmUsMCApOyBcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl9pc2Rlc3RvcnlzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY190aXRsZSA9IHRoaXMuZ2V0Q29udHJvbGxlckJ5QmFtZSggXCJjX3RpdGxlXCIgKTtcbiAgICAgICAgdGhpcy5hZ2VuY3lza2luID0gdGhpcy5nZXRQcm94eSggQWdlbmN5U2tpbiApO1xuICAgICAgICB0aGlzLmxpc3RfMC5zZXRWaXJ0dWFsKCk7XG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtbGlzdHJlbmRlcixudWxsLGZhbHNlICk7XG4gICAgICAgIHRoaXMuY190aXRsZS5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5vbmNoYW5nZSgpO1xuICAgICAgICAvL+a3u+WKoDNE5Zy65pmvXG4gICAgICAgIHRoaXMuX3VpM0RTY2VuZSA9IHRoaXMuZGlzcGxheU9iamVjdC5hZGRDaGlsZEF0KG5ldyBMYXlhLlNjZW5lM0QoKSwwKSBhcyBMYXlhLlNjZW5lM0Q7XG4gICAgICAgIC8v5re75Yqg54Wn55u45py6XG4gICAgICAgIHRoaXMuX3VpY2FybWEzRCA9ICh0aGlzLl91aTNEU2NlbmUuYWRkQ2hpbGQobmV3IExheWEuQ2FtZXJhKDAsIDAuMSwgODApKSkgYXMgTGF5YS5DYW1lcmE7XG4gICAgICAgIC8vIHRoaXMuX3VpY2FybWEzRC5jbGVhckNvbG9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdWljYXJtYTNELnZpZXdwb3J0ID0gbmV3IExheWEuVmlld3BvcnQodGhpcy54LHRoaXMueSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5fdWljYXJtYTNELnRyYW5zZm9ybS50cmFuc2xhdGUobmV3IExheWEuVmVjdG9yMygwLDEuMiw1KSxmYWxzZSk7XG5cbiAgICAgICAgLy8gLy/mt7vliqDmlrnlkJHlhYlcbiAgICAgICAgLy8gdGhpcy5fdWlsaWdodCA9IFByb3BNYW5hZ2VyLnNjZW5lM0QuYWRkQ2hpbGQobmV3IExheWEuRGlyZWN0aW9uTGlnaHQoKSkgYXMgTGF5YS5EaXJlY3Rpb25MaWdodDtcbiAgICAgICAgLy8gdGhpcy5fdWlsaWdodC5jb2xvciA9IG5ldyBMYXlhLlZlY3RvcjMoMC42LDAuNiwwLjYpO1xuICAgICAgICAvLyB0aGlzLl91aWxpZ2h0LnRyYW5zZm9ybS53b3JsZE1hdHJpeC5zZXRGb3J3YXJkKG5ldyBMYXlhLlZlY3RvcjMoMSwgLTEsIDApKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZXJvbGVIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYnRuX2Nsb3NlLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLm9uY2xvc2VmdW4gKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5jX3RpdGxlLGZhaXJ5Z3VpLkV2ZW50cy5TVEFURV9DSEFOR0VELHRoaXMsdGhpcy5vbmNoYW5nZSApO1xuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggR2FtZVN0YXRlLnVwZGF0ZVNLaW5WaWV3LHRoaXMsdGhpcy5vbmNoYW5nZSApO1xuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZCx0aGlzLHRoaXMudXBkYXRlcm9sZUhhbmRsZXIgKTtcbiAgICB9XG5cbiAgICBcblxuICAgIHByaXZhdGUgQ2xlYXJDaGFyYWN0ZXIoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5fcm9sZW1vIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHNjcmlwdDpQbGF5ZXIgPSB0aGlzLl9yb2xlbW8uZ2V0Q29tcG9uZW50KCBQbGF5ZXIgKSBhcyBQbGF5ZXI7XG4gICAgICAgICAgICBDaGFyYWN0ZXJQb29sLkNsZWFyQ2hhcmFjdGVyKCB0aGlzLl9yb2xlbW8sc2NyaXB0LnJlc291c2VOYW1lLHNjcmlwdCApO1xuICAgICAgICAgICAgdGhpcy5fcm9sZW1vID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25jbG9zZWZ1bigpOnZvaWRcbiAgICB7XG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBTa2luUGFuZWwgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2lzZGVzdG9yeXMgPSB0cnVlO1xuICAgICAgICB0aGlzLkNsZWFyQ2hhcmFjdGVyKCk7XG4gICAgICAgIGlmKCB0aGlzLl91aWNhcm1hM0QgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl91aWNhcm1hM0QuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fdWljYXJtYTNEID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiggdGhpcy5fdWkzRFNjZW5lIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fdWkzRFNjZW5lLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX3VpM0RTY2VuZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGVzdG9yeSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25jaGFuZ2UoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5jX3RpdGxlLnNlbGVjdGVkSW5kZXggPT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubGlzdF8wLm51bUl0ZW1zID0gdGhpcy5hZ2VuY3lza2luLnBpZnVBcnIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5saXN0XzAubnVtSXRlbXMgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpdGVtbGlzdHJlbmRlciggaW5kZXg6bnVtYmVyLGl0ZW06U2tpbkl0ZW0gKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggdGhpcy5jX3RpdGxlLnNlbGVjdGVkSW5kZXggPT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCBpbmRleCA8IHRoaXMuYWdlbmN5c2tpbi5waWZ1QXJyLmxlbmd0aCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5hZ2VuY3lza2luLnBpZnVBcnJbaW5kZXhdICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZXJvbGVIYW5kbGVyKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gdGhpcy5hZ2VuY3lza2luLlJvbGVEYXRhO1xuICAgICAgICB0aGlzLkNsZWFyQ2hhcmFjdGVyKCk7XG4gICAgICAgIHZhciBwYXRoQXJyOkFycmF5PGFueT4gPSBbXTtcbiAgICAgICAgcGF0aEFyci5wdXNoKCB7IHVybDpBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoIFJvbGVEYXRhLnJvbGVDZmcubmFtZSApfSApO1xuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLmxvYWRjb21wbGV0ZSxudWxsLHRydWUsUm9sZURhdGEucm9sZUNmZy5uYW1lICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb3V0OkxheWEuUXVhdGVybmlvbiA9IG5ldyBMYXlhLlF1YXRlcm5pb247XG4gICAgcHJpdmF0ZSBsb2FkY29tcGxldGUoIHJlc291c2VuYW1lOnN0cmluZyApOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciBSb2xlRGF0YTpSb2xlRGF0YSA9IHRoaXMuYWdlbmN5c2tpbi5Sb2xlRGF0YTtcbiAgICAgICAgaWYoICF0aGlzLl9pc2Rlc3RvcnlzICYmIHRoaXMuX3VpM0RTY2VuZSAmJiByZXNvdXNlbmFtZSA9PSBSb2xlRGF0YS5yb2xlQ2ZnLm5hbWUgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9yb2xlbW8gPSBDaGFyYWN0ZXJQb29sLkFkZENoYXJhY3RlciggcmVzb3VzZW5hbWUsUGxheWVyLHRoaXMuX3VpM0RTY2VuZSApO1xuICAgICAgICAgICAgdGhpcy5fcm9sZW1vLnRyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIDAsMiwwICk7XG4gICAgICAgICAgICBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSggbmV3IExheWEuVmVjdG9yMyggMCwxLDAgKSwtMTM1KjE4MC9NYXRoLlBJLHRoaXMuX291dCApO1xuICAgICAgICAgICAgdGhpcy5fcm9sZW1vLnRyYW5zZm9ybS5yb3RhdGlvbiA9IHRoaXMuX291dDtcbiAgICAgICAgICAgICggdGhpcy5fcm9sZW1vLmdldENvbXBvbmVudCggUGxheWVyICkgYXMgUGxheWVyICkuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5zdGFuZCApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICBcblxufSIsImltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xuaW1wb3J0IHtwaW5ndGFpdXRpbHN9IGZyb20gXCIuLi9XWFNESy9waW5ndGFpdXRpbHNcIjtcbmltcG9ydCB7Vmlld0FjdGlvbn0gZnJvbSBcIi4uL3V0aWxzL1ZpZXdBY3Rpb25cIjtcbmltcG9ydCB7U2tpbkRhdGF9IGZyb20gXCIuLi9EYXRhL1NraW5EYXRhXCI7XG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xuaW1wb3J0IHtBZ2VuY3lUcmlhbH0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lUcmlhbFwiO1xuaW1wb3J0IHtHdWFuZ0dhb30gZnJvbSBcIi4uL1dYU0RLL0d1YW5nR2FvXCI7XG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL1dYU0RLL3R0YWRcIjtcbmltcG9ydCB7IFRpbWVyU2VydmljZSB9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgVHJpYWxQYW5lbCBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2wgXG57XG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIlRyaWFsUGFuZWxcIjtcblxuXG4gICAgbG9hZF9pY29uOmZhaXJ5Z3VpLkdMb2FkZXI7XG4gICAgYnRuX3ZpZGVvOmZhaXJ5Z3VpLkdCdXR0b247XG4gICAgYnRuX2Nsb3NlOmZhaXJ5Z3VpLkdMb2FkZXI7XG5cbiAgICBza2luYXJyOkFycmF5PFNraW5EYXRhPjtcbiAgICBwcml2YXRlIF9zZWxlY3R2bzpTa2luRGF0YTtcbiAgICBwcml2YXRlIGFnZW5jeXRyaWFsOkFnZW5jeVRyaWFsO1xuXG4gICAgY29uc3RydWN0b3IoIGFycjpBcnJheTxTa2luRGF0YT4gKSBcbiAgICB7IFxuICAgICAgICBzdXBlcihcIm1haW5cIixcInNoaXlvbmdWaWV3XCIsZmFsc2UsVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmUsMSk7IFxuICAgICAgICB0aGlzLnNraW5hcnIgPSBhcnI7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHN1cGVyLm9uSW5pdCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuYWdlbmN5dHJpYWwgPSB0aGlzLmdldFByb3h5KCBBZ2VuY3lUcmlhbCApO1xuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCx0aGlzLnNraW5hcnIubGVuZ3RoLTEgKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0dm8gPSB0aGlzLnNraW5hcnJbIGluZGV4IF07XG4gICAgICAgIHRoaXMubG9hZF9pY29uLnVybCA9IEFzc2V0UGF0aC5nZXRyb2xlaWNvbiggdGhpcy5fc2VsZWN0dm8ucm9sZUNGRy5pY29uICk7XG4gICAgICAgIC8vIHBpbmd0YWl1dGlscy5JbnN0YW5jZS5jcmVhdGVCYW5uZXIoIFwiU2hpWW9uZ1ZpZXdcIiApO1xuICAgICAgICBHdWFuZ0dhby5DaGVhdEJhbm5lcih0aGlzLmJ0bl9jbG9zZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYnRuX2Nsb3NlLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLm9uY2xvc2VmdW4gKTtcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fdmlkZW8sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMudmlkZW9mdW4gKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpZGVvZnVuKCk6dm9pZFxuICAgIHtcbiAgICAgICAgLy8gcGluZ3RhaXV0aWxzLkluc3RhbmNlLnBsYXlWaWRlbyggXCJcIix0aGlzLHRoaXMudmlkZW9jYWxsYmFjayApO1xuICAgICAgICB0aGlzLnZpZGVvY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpZGVvY2FsbGJhY2soKTp2b2lkXG4gICAge1xuICAgICAgICB0dGFkLlNob3dWaWRlbygoaXNMb2FkPT57XG4gICAgICAgICAgICBpZihpc0xvYWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuYWdlbmN5dHJpYWwuRXhpdFBhbmVsKCB0aGlzLl9zZWxlY3R2byApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSlcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uY2xvc2VmdW4oKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmFnZW5jeXRyaWFsLkV4aXRQYW5lbCggbnVsbCApO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxuICAgIHtcbiAgICAgICAgLy8gR3VhbmdHYW8uQ2xlYXIoKTtcbiAgICAgICAgdHRhZC5DbGVhcigpO1xuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XG4gICAgfVxufSIsImltcG9ydCB7IExheU9VVCB9IGZyb20gXCIuLi91dGlscy9MYXlPVVRcIjtcbmltcG9ydCB7IExheW91dENvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9MYXlvdXRDb250cm9sXCI7XG5pbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcblxuXG4vKipcbiAqXG4gKiBAYXV0aG9yIFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFZpZXdNYW5hZ2VyIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcbntcbiAgICBcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6IFZpZXdNYW5hZ2VyO1xuICAgIC8qKlxuICAgICAqIOW3suazqOWGjOeahFVJXG4gICAgICovXG4gICAgcHJpdmF0ZSBfdmlld3M6IGFueTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoKSBcblx0e1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBWaWV3TWFuYWdlci5pbnMgPSB0aGlzO1xuXHR9XG5cdFxuXHRwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlZpZXdNYW5hZ2VyXG5cdHtcblx0ICAgIGlmKCBWaWV3TWFuYWdlci5pbnMgPT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmlld01hbmFnZXIoKTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFZpZXdNYW5hZ2VyLmlucztcblx0fVxuXG4gICAgcHVibGljIGluaXQoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLl92aWV3cyA9IHt9O1xuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0RXZlbnQoKTp2b2lkXG4gICAge1xuICAgIH1cblx0XG4gICAgLyoqXG4gICAgICogIHZpZXcg6KeG5Zu+5a+56LGh57G7XG4gICAgICogIGRhdGEg57uR5a6a5pWw5o2uIO+8iCBkYXRhIOWmguaenOS4jeS4uuepuu+8jOS7o+ihqOaehOmAoOWHveaVsOS8oOWPgiDvvIlcbiAgICAgKiAgbGF5ZXIg5bGC57qnXG4gICAgICovXG4gICAgcHVibGljIGFkZCggdmlldzphbnksZGF0YTphbnkgPSBudWxsLGxheWVyOiBzdHJpbmcgPSBMYXlPVVQuVUkgKTphbnlcblx0e1xuICAgICAgICBpZiggdmlldy5rZXkgPT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZpZXcgaGF2ZSBubyBrZXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHR5cGU6IHN0cmluZyA9IHZpZXcua2V5O1xuICAgICAgICBpZih0aGlzLl92aWV3c1t0eXBlXSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGl0ZW12aWV3OmZhaXJ5Z3VpLkdDb21wb25lbnQgPSB0aGlzLl92aWV3c1t0eXBlXTtcbiAgICAgICAgICAgIHJldHVybiBpdGVtdmlldztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZDogYW55O1xuICAgICAgICBpZihkYXRhICE9IG51bGwgKVxuICAgICAgICB7XG4gICAgICAgICAgICBkID0gbmV3IHZpZXcoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBkID0gbmV3IHZpZXcoKTtcbiAgICAgICAgfVxuICAgICAgICBkLnZpZXdLZXkgPSB2aWV3O1xuICAgICAgICBkLmdhbWVMYXllciA9IGxheWVyO1xuICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLkFkZExheWVyQnlOYW1lKCBkLGxheWVyICk7XG4gICAgICAgIHRoaXMuX3ZpZXdzW3R5cGVdID0gZDtcbiAgICAgICAgcmV0dXJuIGQ7XG5cdH1cbiAgICBcbiAgICAvKipcbiAgICAgKiDlhbPpl63nlYzpnaJcbiAgICAgKiBAcGFyYW0gdmlldyDnlYzpnaIgXG4gICAgICogQHBhcmFtIGlzYmdjbG9zZSDmmK/lkKbmmK/ngrnlh7vog4zmma/lhbPpl63nmoTnirbmgIEgXG4gICAgICogQHBhcmFtIGlzcGxheUFubW8g5piv5ZCm5pKt5pS+5YWz6Zet5Yqo55S777yIIOS4u+imgeeUqOS6juW8uuWItuWFs+mXrSDvvIlcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2UoIHZpZXc6IGFueSxpc2JnY2xvc2U6Ym9vbGVhbj1mYWxzZSxpc3BsYXlBbm1vOmJvb2xlYW49dHJ1ZSApOnZvaWRcblx0e1xuICAgICAgICB2YXIgdHlwZTogc3RyaW5nID0gdmlldy5rZXk7XG4gICAgICAgIHZhciBpdGVtOiBQYW5lbEJhc2VDb250cm9sID0gdGhpcy5fdmlld3NbdHlwZV07XG4gICAgICAgIGlmKCFpdGVtKSBcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UuQ2xlYXJMYXllckJ5TmFtZSggaXRlbS5nYW1lTGF5ZXIgKTtcbiAgICAgICAgaWYoaXNwbGF5QW5tbylcbiAgICAgICAge1xuICAgICAgICAgICAgaXRlbS5FeGl0VmlldygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaXRlbS5kZXN0b3J5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuX3ZpZXdzW3R5cGVdO1xuXHR9XG5cbiAgICBwdWJsaWMgb25yZXNpemUoIHc6bnVtYmVyLGg6bnVtYmVyICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuX3ZpZXdzICE9IG51bGwgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgaXRlbXZpZXc6UGFuZWxCYXNlQ29udHJvbDtcbiAgICAgICAgICAgIGZvciggdmFyIGl0ZW0gaW4gdGhpcy5fdmlld3MgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGl0ZW12aWV3ID0gdGhpcy5fdmlld3NbaXRlbV07XG4gICAgICAgICAgICAgICAgaXRlbXZpZXcuc2V0U2l6ZSggdyxoICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cdFxuICAgIHB1YmxpYyBnZXRWaWV3KCB2aWV3OiBhbnkgKTphbnlcblx0e1xuICAgICAgICB2YXIgdHlwZTogc3RyaW5nID0gdmlldy5rZXk7XG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3c1t0eXBlXTtcblx0fVxufVxuIiwiaW1wb3J0IHsgUmVjb21tZW5kIH0gZnJvbSBcIi4uL1B1c2gvUmVjb21tZW5kVmlld1wiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCBDaG91dGlQYW5WaWV3IGZyb20gXCIuLi9QdXNoL0Nob3V0aVBhblZpZXdcIjtcclxuXHJcbi8vIGltcG9ydCB7IE1haW4gfSBmcm9tIFwiLi4vTWFpblwiO1xyXG4vLyBpbXBvcnQgTGlzdEl0ZW0gZnJvbSBcIi4uL0dhbWVUb29scy9MaXN0SXRlbVwiO1xyXG4vLyBpbXBvcnQgeyBQYW5lbE1hbmFnZXIsIFBhbmVsVHlwZSB9IGZyb20gXCIuLi9WaWV3L1BhbmVsTWFuYWdlclwiO1xyXG4vLyBpbXBvcnQgR3VhbmdHYW8gZnJvbSBcIi4vR3VhbmdHYW9cIjtcclxuLy8gaW1wb3J0IHsgV1hTREsgfSBmcm9tIFwiLi9XWFNES1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZZSERfU2RrIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgQWRfQ2xpY2tUeXBlID0ge1xyXG4gICAgICAgIFZpZGVvOiBcInZpZGVvX2NsaWNrXCIsXHJcbiAgICAgICAgV2F0Y2g6IFwid2F0Y2hcIixcclxuICAgICAgICBTaGFyZTogXCJzaGFyZVwiLFxyXG4gICAgICAgIEJhbm5lcjogXCJiYW5uZXJcIixcclxuICAgICAgICBQdXNoOiBcInB1c2hcIixcclxuICAgICAgICBQdXNoQ2xpY2s6XCJpY29uX2NsaWNrXCJcclxuICAgIH1cclxuXHJcbiAgICAvL+aYr+WQpuS4uueZveWQjeWNleeUqOaIt1xyXG4gICAgcHVibGljIHN0YXRpYyBpc3doaXRlOmJvb2xlYW47XHJcbiAgICAvL+aYr+WQpuS4uuaWsOeUqOaIt1xyXG4gICAgcHVibGljIHN0YXRpYyBpc25ld3VzZXI6Ym9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHB1c2hEYXRhID0gW107XHJcbiAgICBwcml2YXRlIHN0YXRpYyBvcGVuaWQ6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzSGF2ZURhdGUgPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNob3dBZCA9IFwiU2hvd0FkXCI7XHJcbiAgICAvL+WIneWni+WMlnNka1xyXG4gICAgcHVibGljIHN0YXRpYyBJbml0U2RrKCkge1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5zdGFydFNkaygpO1xyXG4gICAgICAgIEZZSERfU2RrLlVzZXJJbmZvQXV0aCgpO1xyXG4gICAgICAgIC8vIGxldCB3aGl0ZSA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJpc193aGl0ZVwiKTtcclxuICAgICAgICAvLyBpZih3aGl0ZSl7XHJcbiAgICAgICAgLy8gICAgIEZZSERfU2RrLmlzd2hpdGUgPSB0cnVlO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBlbHNle1xyXG4gICAgICAgIC8vICAgICBGWUhEX1Nkay5nZXRXaGl0ZUNvbmZpZygpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gbGV0IG5ld3VzZXIgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNfbmV3dXNlclwiKTtcclxuICAgICAgICAvLyBpZighbmV3dXNlcil7XHJcbiAgICAgICAgLy8gICAgIEZZSERfU2RrLmlzbmV3dXNlciA9IHRydWU7XHJcbiAgICAgICAgLy8gICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJpc19uZXd1c2VyXCIsXCIxXCIpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBlbHNle1xyXG4gICAgICAgIC8vICAgICBGWUhEX1Nkay5pc25ld3VzZXIgPSBmYWxzZTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gRllIRF9TZGsuUHVzaERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+eUqOaIt+aOiOadg1xyXG4gICAgcHVibGljIHN0YXRpYyBVc2VySW5mb0F1dGgoKSB7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkuZ2V0RnloZFVzZXJJbmZvKG51bGwsIGZhbHNlLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaXoOaOiOadg+WbnuiwgzpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0LnVzZXIpIHtcclxuICAgICAgICAgICAgICAgIEZZSERfU2RrLm9wZW5pZCA9IGRhdGEucmVzdWx0LnVzZXIub3BlbmlkO1xyXG4gICAgICAgICAgICAgICAgRllIRF9TZGsuQXV0aEluZm8oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQXV0aEluZm8oKSB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSB7XHJcbiAgICAgICAgICAgIG9wZW5pZDogRllIRF9TZGsub3BlbmlkLFxyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkubG9naW5EYXRhKGFyZ3MsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5o6I5p2D5LiK5oql5Zue6LCDOlwiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICBGWUhEX1Nkay5WYWx1ZVVzZXIoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgc3RhdGljIFZhbHVlVXNlcigpIHtcclxuICAgICAgICB2YXIgYXJncyA9IHtcclxuICAgICAgICAgICAgb3BlbmlkOiBGWUhEX1Nkay5vcGVuaWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS52YWx1ZXVzZXIoYXJncywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnInmlYjnlKjmiLfkuIrmiqU6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgICBcclxuICAgIH1cclxuICAgIHByaXZhdGUgc3RhdGljIGdldFdoaXRlQ29uZmlnKCl7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLndoaXRlQ29uZmlnKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIEZZSERfU2RrLmlzd2hpdGUgPSBlLmRhdGEuaXNfd2hpdGU7XHJcbiAgICAgICAgICAgIGlmKEZZSERfU2RrLmlzd2hpdGUpe1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImlzX3doaXRlXCIsXCIxXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLnmb3lkI3ljZUtLS1cIixlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNldEh1VHVpTGlzdChsaXN0OiBMYXlhLkxpc3QsIHNjcm9sOiBudW1iZXIgPSAxLCB0eXBlOiBzdHJpbmcgPSBcIlwiKSB7IC8vc2Nyb2wgMTrnq5bnmoQgIDLmqKrnmoRcclxuICAgICAgICBsZXQgYXJyID0gdGhpcy5wdXNoRGF0YTtcclxuICAgICAgICBpZiAoIWFyciB8fCBhcnIubGVuZ3RoID09IDApIHJldHVybjtcclxuICAgICAgICBsaXN0LnNlbGVjdEVuYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHNjcm9sID09IDEgPyBsaXN0LnZTY3JvbGxCYXJTa2luID0gXCJcIiA6IGxpc3QuaFNjcm9sbEJhclNraW4gPSBcIlwiO1xyXG4gICAgICAgIGxpc3QucmVuZGVySGFuZGxlciA9IExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy51cGRhdGVJdGVtLCBbdHlwZV0sIGZhbHNlKTtcclxuICAgICAgICBsaXN0LmFycmF5ID0gYXJyO1xyXG4gICAgICAgIGxpc3QucmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdXBkYXRlSXRlbSh0eXBlOiBzdHJpbmcsIGNlbGw6IExheWEuQm94LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gdmFyIGFkaXRlbSA9IGNlbGwuZ2V0Q29tcG9uZW50KExpc3RJdGVtKSBhcyBMaXN0SXRlbTtcclxuICAgICAgICAvLyBhZGl0ZW0uUmVmcmVzaCh0eXBlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy/ngrnlh7vkuovku7bkuIrmiqVcclxuICAgIHB1YmxpYyBzdGF0aWMgQ2xpY2tBZChhZF90eXBlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuaKpeexu+Weiy0tLVwiLGFkX3R5cGUpO1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XHJcbiAgICAgICAgdmFyIHBhcmFtID0ge1xyXG4gICAgICAgICAgICBhZF90eXBlOiBhZF90eXBlLFxyXG4gICAgICAgICAgICAvL+atpOWkhOa3u+WKoG9wZW5pZFxyXG4gICAgICAgICAgICBvcGVuaWQ6RllIRF9TZGsub3BlbmlkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi54K55Ye75Y+C5pWwOlwiICsgcGFyYW0pO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5hZHZlcnRpc2VtZW50KHBhcmFtLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIueCueWHu+e7k+aenDpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgIC8v5LqS5o6o5L+h5oGvXHJcbiAgICBwdWJsaWMgc3RhdGljIFB1c2hEYXRhKCkge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJwdXNoZGF0YS0tXCIsTWFpbi5XWCk7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcclxuICAgICAgICB2YXIgcGFyYW0gPSB7fTtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkuc2hhcmVSZWNvbW1lbmQocGFyYW0sIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi54Ot6Zeo5ri45oiP5pWw5o2uLS1cIixkYXRhKVxyXG4gICAgICAgICAgICBpZiAoZGF0YS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBGWUhEX1Nkay5wdXNoRGF0YSA9IGRhdGEuZGF0YTtcclxuICAgICAgICAgICAgICAgIEZZSERfU2RrLnB1c2hEYXRhLnNvcnQoRllIRF9TZGsuTGlzdFNvcnQpO1xyXG4gICAgICAgICAgICAgICAgRllIRF9TZGsuaXNIYXZlRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAvL+atpOWkhOa0vuWPkeS6i+S7tu+8jOWxleekuuS6kuaOqFxyXG4gICAgICAgICAgICAgICAgLy9FdmVudE1hbmFnZXIuZXZlbnQoRllIRF9TZGsuU2hvd0FkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+WPluS6kuaOqOS/oeaBrzpcIiArIEpTT04uc3RyaW5naWZ5KEZZSERfU2RrLnB1c2hEYXRhKSk7XHJcbiAgICAgICAgICAgIG5ldyBSZWNvbW1lbmQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd0h1VHVpSnVtcChkYXRhLG9wZW4pIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG4gICAgICAgIGlmIChkYXRhLmp1bXBfdHlwZSA9PSAyKSAvL+S6jOe7tOeggei3s+i9rOaWueazlVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5wcmV2aWV3SW1hZ2UoeyBjdXJyZW50OiBkYXRhLnFyY29kZSwgdXJsczogW2RhdGEucXJjb2RlXSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZGF0YS5qdW1wX3R5cGUgPT0gMSkgLy/nm7Tot7Pmlrnms5VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gubmF2aWdhdGVUb01pbmlQcm9ncmFtKHtcclxuICAgICAgICAgICAgICAgIGFwcElkOiBkYXRhLnRvX2FwcGlkLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogZGF0YS5qdW1wX3BhdGgsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOaJk+W8gOaIkOWKn1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql5oiQ5YqfOlwiICsgSlNPTi5zdHJpbmdpZnkocmVzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgRllIRF9TZGsuUHVzaENsaWNrKGRhdGEudG9fYXBwaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGZhaWwocmVzKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihvcGVuKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhLmp1bXBfdHlwZSA9PSAwKS8v5bmz5Y+w6Lez6L2s5pa55rOVXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm5hdmlnYXRlVG9NaW5pUHJvZ3JhbSh7XHJcbiAgICAgICAgICAgICAgICBhcHBJZDogZGF0YS5wbGF0Zm9ybV9hcHBpZCxcclxuICAgICAgICAgICAgICAgIHBhdGg6IGRhdGEuanVtcF9wYXRoLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyDmiZPlvIDmiJDlip9cclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuaKpeaIkOWKnzpcIiArIEpTT04uc3RyaW5naWZ5KHJlcykpO1xyXG4gICAgICAgICAgICAgICAgICAgIEZZSERfU2RrLlB1c2hDbGljayhkYXRhLnRvX2FwcGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBmYWlsKHJlcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYob3Blbil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ2hvdXRpUGFuVmlldyApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvL+S6kuaOqOeCueWHu1xyXG4gICAgcHVibGljIHN0YXRpYyBQdXNoQ2xpY2sodG9fYXBwaWQpIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG4gICAgICAgIHZhciBwYXJhbSA9IHtcclxuICAgICAgICAgICAgb3BlbmlkOiBGWUhEX1Nkay5vcGVuaWQsXHJcbiAgICAgICAgICAgIHRvX2FwcGlkOiB0b19hcHBpZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLnNoYXJlUGxheShwYXJhbSwgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLngrnlh7vkuIrmiqXnu5Pmnpw6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdFNvcnQoYSwgYik6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKE51bWJlcihhW1wicGFuZWxcIl0pIDwgTnVtYmVyKGJbXCJwYW5lbFwiXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoTnVtYmVyKGFbXCJwYW5lbFwiXSkgPT0gTnVtYmVyKGJbXCJwYW5lbFwiXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChOdW1iZXIoYVtcInBhbmVsXCJdKSA+IE51bWJlcihiW1wicGFuZWxcIl0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIlxuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi9TZGtcIjtcbmltcG9ydCB7IFNoYXJlVXRpbCB9IGZyb20gXCIuL1NoYXJlVXRpbFwiO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuL1BsYXllckFjY291bnRcIjtcbmltcG9ydCB7IEZZSERfU2RrIH0gZnJvbSBcIi4vRllIRF9TZGtcIjtcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi90dGFkXCI7XG5cbmV4cG9ydCBjbGFzcyBXeEdhbWVJdGVtXG57XG4gICAgYXBwTmFtZUhpZGRlbjpib29sZWFuID0gZmFsc2U7XG4gICAgY29sb3I6c3RyaW5nID0gXCJDOTNCM0JGRlwiO1xuICAgIHNpemU6bnVtYmVyID0gMTAwO1xuICAgIGJvcmRlcldpZHRoOm51bWJlciA9IDUwO1xuICAgIGJvcmRlckNvbG9yOnN0cmluZyA9IFwiQTFBMEEwRkZcIjtcbiAgICBsZWZ0Om51bWJlcjtcbiAgICB0b3A6bnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgR3VhbmdHYW8gXG57XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmc2Fhc2ZhZnNzZmE7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjdXJiYW5uZXI7XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB2aWRlbEFkVW5pdElkID0gXCJhZHVuaXQtMGM2ODcwODRjOTA4ZWU4OVwiO1xuICAgIHByaXZhdGUgc3RhdGljIGJhbm5lckFkVW5pdElkID0gXCJhZHVuaXQtOGMyZDU4NjEzNWZhNmQ0ZlwiO1xuICAgIHByaXZhdGUgc3RhdGljIGFmc2ZzYWFmc2ZzYTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8v6KeG5bGP5bm/5ZGK5piv5ZCm5Yqg6L295oiQ5YqfXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXNmYXNmc2FmZnNhOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBzdGF0aWMgZ2V0IGhhc2Jhbm5lcigpOmJvb2xlYW5cbiAgICB7XG4gICAgICAgIGlmKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuYmFubmVyKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgaGFzdmlkZW8oKTpib29sZWFuXG4gICAge1xuICAgICAgICBpZihMYXlhLkJyb3dzZXIub25XZWlYaW4gJiYgUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS52aWRlbylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHZpZGVvbnVtID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5HZXRHbG9iZVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL+mihOWFiOWKoOi9veinhuWxj+W5v+WRilxuICAgIHB1YmxpYyBzdGF0aWMgSW5pdFZpZGVvKClcbiAgICB7XG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluIHx8ICFQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnZpZGVvKSByZXR1cm47XG5cbiAgICAgICAgY29uc29sZS5sb2codGhpcy5iYW5uZXJBZFVuaXRJZCk7XG5cbiAgICAgICAgLy92ZWRpb1xuICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYSA9IExheWEuQnJvd3Nlci53aW5kb3cud3guY3JlYXRlUmV3YXJkZWRWaWRlb0FkKHsgYWRVbml0SWQ6IHRoaXMudmlkZWxBZFVuaXRJZCB9KTtcblxuICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5vbkxvYWQoKCkgPT4gXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmv4DlirHop4bpopEg5bm/5ZGK5Yqg6L295oiQ5YqfJyk7XG4gICAgICAgICAgICB0aGlzLmFzZmFzZnNhZmZzYSA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLm9uRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5r+A5Yqx6KeG5bGP5Yqg6L295aSx6LSlOlwiICsgZXJyKTtcbiAgICAgICAgICAgIHRoaXMuYXNmYXNmc2FmZnNhID0gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWZzZnNhYWZzZnNhID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvL+eci+inhumikVxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd1ZpZGVvKGNhbGxiYWNrOiBGdW5jdGlvbikgXG4gICAge1xuICAgICAgICBpZiAodGhpcy5oYXN2aWRlbykgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKHRoaXMuYXNmYXNmc2FmZnNhKVxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInNob3dWaWRlb0FkOlwiICsgdGhpcy5hc2Zhc2ZzYWZmc2EpO1xuXG4gICAgICAgICAgICB0aGlzLlNldFZpZGVvQ2FsbEJhY2soY2FsbGJhY2spO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5zaG93KCkuY2F0Y2goZXJyID0+IFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEubG9hZCgpLnRoZW4oKCkgPT4gXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2V0VmlkZW9DYWxsQmFjayhjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICAvLyBTaGFyZVV0aWwuc2hhcmVJbWFnZShcIuinhumikeayoeacieWIhuS6q1wiLCBjYWxsYmFja1xuICAgICAgICAgICAgICAgIC8vICAgICAsIFwiMVwiKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBcbiAgICAgICAgfSBcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjYWxsYmFjayhmYWxzZSk7XG4gICAgICAgICAgICAvLyBTaGFyZVV0aWwuc2hhcmVJbWFnZShcIuinhumikeayoeacieWIhuS6q1wiLCBjYWxsYmFja1xuICAgICAgICAgICAgLy8gICAgICAgICAsIFwiMVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIFNldFZpZGVvQ2FsbEJhY2soY2FsbGJhY2s6RnVuY3Rpb24pXG4gICAge1xuICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5vZmZDbG9zZSgpO1xuICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5vbkNsb3NlKHJlcyA9PiBcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmv4DlirHop4bpopHlhbPpl606XCIrcmVzLmlzRW5kZWQpO1xuICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMuaXNFbmRlZCB8fCByZXMgPT09IHVuZGVmaW5lZCkge2NhbGxiYWNrICYmIGNhbGxiYWNrKHRydWUpfVxuICAgICAgICAgICAgZWxzZSB7IGNhbGxiYWNrICYmIGNhbGxiYWNrKGZhbHNlKSB9XG4gICAgICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5vZmZDbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2Fuc2hvd2Jhbm5lciA9IHRydWU7XG4gICAgLy/miZPlvIBiYW5uZXJcbiAgICBwdWJsaWMgc3RhdGljIE9wZW5CYW5uZXIoZ2FwOiBudW1iZXIgPSAwLGNhbGxWYWNrOiBGdW5jdGlvbiA9IG51bGwsIGlzd2FpdDogYm9vbGVhbiA9IGZhbHNlKSBcbiAgICB7XG4gICAgICAgIC8vIGlmICghdGhpcy5oYXNiYW5uZXIpXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICAgIGNhbGxWYWNrKG51bGwpO1xuICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAvLyB9IFxuXG4gICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhbGxWYWNrKG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYW5zaG93YmFubmVyID0gdHJ1ZTtcbiAgICAgICAgXG4gICAgICAgIHZhciBpZGQgPSB0aGlzLmJhbm5lckFkVW5pdElkO1xuICAgICAgICBjb25zb2xlLmxvZyhcImFkVW5pdElkOlwiK2lkZCk7XG4gICAgICAgIGxldCBuZXdCYW5uZXIgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZUJhbm5lckFkKHtcbiAgICAgICAgICAgIGFkVW5pdElkOiBpZGQsXG4gICAgICAgICAgICBzdHlsZTogXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDQ2MFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbmV3QmFubmVyLm9uRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICBjYWxsVmFjayhudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG5ld0Jhbm5lci5vbkxvYWQoKCkgPT4gXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cmJhbm5lcikgdGhpcy5jdXJiYW5uZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIgPSBuZXdCYW5uZXI7XG4gICAgICAgICAgICB2YXIgaGlnaHQ6IG51bWJlciA9IHRoaXMuR2V0UmVhbEhpZ2h0KGdhcCk7XG5cbiAgICAgICAgICAgIGlmIChjYWxsVmFjayAhPSBudWxsKSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYWxsVmFjayhoaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLmNhbnNob3diYW5uZXIgJiYgIWlzd2FpdClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zaG93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIEdldFJlYWxIaWdodChnYXApXG4gICAge1xuICAgICAgICBpZiAodGhpcy5jdXJiYW5uZXIpIFxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgaW5mbyA9IExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLndpZHRoID0gaW5mby53aW5kb3dXaWR0aDtcblxuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUudG9wID0gaW5mby53aW5kb3dIZWlnaHQgLSB0aGlzLmN1cmJhbm5lci5zdHlsZS5yZWFsSGVpZ2h0IC0gZ2FwO1xuICAgICAgICAgICAgcmV0dXJuIExheWEuc3RhZ2UuaGVpZ2h0IC8gaW5mby53aW5kb3dIZWlnaHQgKiB0aGlzLmN1cmJhbm5lci5zdHlsZS5yZWFsSGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9jbGVhclxuICAgIHN0YXRpYyBDbGVhcigpXG4gICAge1xuICAgICAgICBHdWFuZ0dhby5jbGVhclR3ZWVuKCk7XG4gICAgICAgIExheWEudGltZXIuY2xlYXJBbGwodGhpcyk7XG4gICAgICAgIExheWEuVHdlZW4uY2xlYXJBbGwodGhpcyk7XG4gICAgICAgIHRoaXMuY2Fuc2hvd2Jhbm5lciA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5jdXJiYW5uZXIpIHRoaXMuY3VyYmFubmVyLmhpZGUoKTtcblxuICAgICAgICAvLyBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xuICAgICAgICAvLyBpZiAodGhpcy5jdXJiYW5uZXIpIHRoaXMuY3VyYmFubmVyLmhpZGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhpZGViYW5uZXIoKSBcbiAgICB7XG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmN1cmJhbm5lcikgdGhpcy5jdXJiYW5uZXIuaGlkZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNob3diYW5uZXIoKSBcbiAgICB7XG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmN1cmJhbm5lcikgdGhpcy5jdXJiYW5uZXIuc2hvdygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGNhbmNoZWF0KCk6Ym9vbGVhblxuXHR7XG4gICAgICAgIGlmKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuY2hlYXQpe1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZighUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5jaGVhdClcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJjaGVhdDpmYWxzZS0+IEN1ckFjY291bnREYXRhLmNoZWF0ICE9IDFcIik7XG4gICAgICAgIC8vICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIH1cblx0XHQvLyB2YXIgY2hlY2tzY2VuY2UgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLmNoZWNrc2NlbmNlO1xuICAgICAgICAvLyBpZiAoY2hlY2tzY2VuY2UgPT0gZmFsc2UpXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiY2hlYXQ6dHJ1ZS0+IFwiICsgV3hBcGkuc2NlbmVWYWx1ZSk7XG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBpZiAoV3hBcGkuc2NlbmVWYWx1ZSA9PSBcIjEwMzdcIiB8fCBXeEFwaS5zY2VuZVZhbHVlID09IFwiMTA1OFwifHwgV3hBcGkuc2NlbmVWYWx1ZSA9PSBcIjEwNjdcIiB8fCBXeEFwaS5zY2VuZVZhbHVlID09IFwiMTA5NVwiKSBcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJjaGVhdDp0cnVlLT4gXCIgKyBXeEFwaS5zY2VuZVZhbHVlKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2hlYXQ6ZmFsc2UtPiBcIiArIFd4QXBpLnNjZW5lVmFsdWUpO1xuICAgICAgICAvLyByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgYmFubmVyaGlndCA9IDA7XG4gICAgcHVibGljIHN0YXRpYyBTZXRQb3NCYW5uZXIoYnRuOkxheWEuVUlDb21wb25lbnQsY29tcGxldGU6RnVuY3Rpb24pXG4gICAge1xuICAgICAgICBpZihMYXlhLkJyb3dzZXIub25QQylcbiAgICAgICAge1xuICAgICAgICAgICAgY29tcGxldGUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGluZm8gPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XG4gICAgICAgIC8vY29uc29sZS5sb2coaW5mbyk7XG4gICAgICAgIC8vY29uc29sZS5sb2coYnRuKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhidG4ueSxMYXlhLnN0YWdlLmhlaWdodCxpbmZvLndpbmRvd0hlaWdodCk7XG4gICAgICAgIHZhciByZXNoaWdodCA9IGJ0bi55ICogaW5mby53aW5kb3dIZWlnaHQgLyBMYXlhLnN0YWdlLmhlaWdodDtcblxuICAgICAgICAvL2NvbnNvbGUubG9nKFwicmVzaGlnaHRcIixyZXNoaWdodCk7XG5cbiAgICAgICAgdmFyIGlkZCA9IHRoaXMuYmFubmVyQWRVbml0SWQ7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWRVbml0SWQ6XCIraWRkKTtcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5kZXN0cm95KCk7XG4gICAgICAgIGxldCBuZXdCYW5uZXIgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZUJhbm5lckFkKHtcbiAgICAgICAgICAgIGFkVW5pdElkOiBpZGQsXG4gICAgICAgICAgICBzdHlsZTogXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDcyMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbmV3QmFubmVyLm9uRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICBjb21wbGV0ZShmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgbmV3QmFubmVyLm9uTG9hZCgoKSA9PiBcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIgPSBuZXdCYW5uZXI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLnRvcCA9IHJlc2hpZ2h0O1xuXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwidG9wXCIsdGhpcy5hc2dhZ2Fzc2dhLnN0eWxlLnRvcCk7XG4gICAgICAgICAgICBpZih0aGlzLmN1cmJhbm5lcilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImJhbm5lciBzaG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnNob3coKTtcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMjMwMCx0aGlzLCgpPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLnRvcCA9IGluZm8ud2luZG93SGVpZ2h0IC0gR3VhbmdHYW8uYmFubmVyaGlndDtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG5ld0Jhbm5lci5vblJlc2l6ZSgocmVzKT0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIEd1YW5nR2FvLmJhbm5lcmhpZ3QgPSByZXMuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUud2lkdGggPSBpbmZvLndpbmRvd1dpZHRoO1xuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUudG9wID0gcmVzaGlnaHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyB0d2VlbjpMYXlhLlR3ZWVuO1xuICAgIC8v5oyJ6ZKu6K+v5a+8XG4gICAgc3RhdGljIENoZWF0QmFubmVyKGJ0bjpmYWlyeWd1aS5HT2JqZWN0LGNvbXBsZXRlOkZ1bmN0aW9uID0gbnVsbCxnYXAgPSAwKVxuICAgIHtcbiAgICAgICAgdHRhZC5TaG93YmFubmVyKCk7XG4gICAgICAgIC8vIGlmKCFHdWFuZ0dhby5jYW5jaGVhdClcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJpZ25vcmVjaGVhdFwiKTtcbiAgICAgICAgLy8gICAgIEd1YW5nR2FvLk9wZW5CYW5uZXIoMCwoaGVpZ2h0KSA9PlxuICAgICAgICAvLyAgICAge1xuICAgICAgICAvLyAgICAgICAgIGlmKGhlaWdodCA9PSBudWxsKVxuICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgXG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gZWxzZVxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICBidG4ueSA9IExheWEuc3RhZ2UuaGVpZ2h0LWJ0bi5oZWlnaHQgLSAxMDA7XG4gICAgICAgIC8vICAgICBHdWFuZ0dhby5PcGVuQmFubmVyKGdhcCwoaGVpZ2h0KSA9PiBcbiAgICAgICAgLy8gICAgIHtcbiAgICAgICAgLy8gICAgICAgICBpZihoZWlnaHQgPT0gbnVsbClcbiAgICAgICAgLy8gICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgIGVsc2VcbiAgICAgICAgLy8gICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2hlYXRzdGFydFwiLFwiYm90dG9tOjEwMFwiKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgLy8gYnRuLm1vdXNlRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAvLyAgICAgICAgICAgICB2YXIgZW5kPUxheWEuc3RhZ2UuaGVpZ2h0LWhlaWdodC1idG4uaGVpZ2h0IC0gODA7XG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwieTpcIiArIGVuZCk7XG4gICAgICAgIC8vICAgICAgICAgICAgIExheWEudGltZXIub25jZShQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLmNoZWF0dGltZSoxMDAwLHRoaXMsKCk9PlxuICAgICAgICAvLyAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyBidG4ubW91c2VFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHRoaXMuc2hvd2Jhbm5lcigpO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgR3VhbmdHYW8uY2xlYXJUd2VlbigpO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgIEd1YW5nR2FvLnR3ZWVuID0gTGF5YS5Ud2Vlbi50byhidG4se3k6ZW5kfSwyMDAsbnVsbCxMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsKCk9PlxuICAgICAgICAvLyAgICAgICAgICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlmKGNvbXBsZXRlICE9IG51bGwpXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAvLyAgICAgICAgICAgICB9KVxuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH0sdHJ1ZSk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyVHdlZW4oKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggR3VhbmdHYW8udHdlZW4gKVxuICAgICAgICB7XG4gICAgICAgICAgICBHdWFuZ0dhby50d2Vlbi5jbGVhcigpO1xuICAgICAgICAgICAgR3VhbmdHYW8udHdlZW4gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmV3YXJkZWRWaWRlb0FkO1xuICAgIHByaXZhdGUgX2dhbWVCYW5uZXI7XG4gICAgcHJpdmF0ZSBfb25WaWRlb0Nsb3NlOiBGdW5jdGlvbjtcbiAgICBwcml2YXRlIF9vbkxvYWRWaWRlbzogRnVuY3Rpb247XG5cbiAgICBwcml2YXRlIGlzVmlkZW9Mb2FkQ29tID0gZmFsc2U7XG4gICBwdWJsaWMgIGxvYWRWaWRlbyhjYj86IEZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSB7IGlmIChjYikgY2IodHJ1ZSk7IHJldHVybiB9O1xuXG4gICAgICAgIHRoaXMuX29uTG9hZFZpZGVvID0gY2I7XG4gICAgICAgIGlmICghdGhpcy5fcmV3YXJkZWRWaWRlb0FkKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBHdWFuZ0dhby52aWRlbEFkVW5pdElkO1xuICAgICAgICAgICAgdGhpcy5fcmV3YXJkZWRWaWRlb0FkID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVSZXdhcmRlZFZpZGVvQWQoeyBhZFVuaXRJZDogaW5kZXggfSk7XG5cbiAgICAgICAgICAgIHZhciBpc2MgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3Jld2FyZGVkVmlkZW9BZC5vbkxvYWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW0xPR10g5r+A5Yqx6KeG6aKR5bm/5ZGK5Yqg6L295oiQ5YqfXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNWaWRlb0xvYWRDb20gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChpc2MpIHJldHVybjtcbiAgICAgICAgICAgICAgICBpc2MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvICYmIHRoaXMuX29uTG9hZFZpZGVvKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fcmV3YXJkZWRWaWRlb0FkLm9uRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIltMT0ddIOa/gOWKseinhumikeW5v+WRiuWKoOi9veWksei0pVwiKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNWaWRlb0xvYWRDb20gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRWaWRlbyAmJiB0aGlzLl9vbkxvYWRWaWRlbyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkVmlkZW8gPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9yZXdhcmRlZFZpZGVvQWQub25DbG9zZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVzIHx8IHJlcy5pc0VuZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uVmlkZW9DbG9zZSAmJiB0aGlzLl9vblZpZGVvQ2xvc2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uVmlkZW9DbG9zZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblZpZGVvQ2xvc2UgJiYgdGhpcy5fb25WaWRlb0Nsb3NlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25WaWRlb0Nsb3NlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlkZW9Mb2FkQ29tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkVmlkZW8gJiYgdGhpcy5fb25Mb2FkVmlkZW8odHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkVmlkZW8gPSBudWxsO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkVmlkZW8gJiYgdGhpcy5fb25Mb2FkVmlkZW8oZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNob3dWaWRlbyhjYj86IEZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSB7IGlmIChjYikgY2IodHJ1ZSk7IHJldHVybiB9O1xuICAgICAgICB0aGlzLl9vblZpZGVvQ2xvc2UgPSBjYjtcbiAgICAgICAgdGhpcy5fcmV3YXJkZWRWaWRlb0FkLnNob3coKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmV3YXJkZWRWaWRlb0FkLmxvYWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXdhcmRlZFZpZGVvQWQuc2hvdygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn0iLCJpbXBvcnQgU3RhZ2UgPSBMYXlhLlN0YWdlO1xuaW1wb3J0IFdlYkdMID0gTGF5YS5XZWJHTDtcbmltcG9ydCBFdmVudCA9IExheWEuRXZlbnQ7XG5pbXBvcnQgSHR0cFJlcXVlc3QgPSBMYXlhLkh0dHBSZXF1ZXN0O1xuaW1wb3J0IFRleHQgPSBMYXlhLlRleHQ7XG5pbXBvcnQgQnJvd3NlciA9IExheWEuQnJvd3NlcjtcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi9QbGF5ZXJBY2NvdW50XCI7XG5pbXBvcnQgeyBNYWluQ29uZmlnIH0gZnJvbSBcIi4uL01haW5Db25maWdcIjtcbmltcG9ydCB7IFNoYXJlVXRpbCB9IGZyb20gXCIuL1NoYXJlVXRpbFwiO1xuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi9TZGtcIjtcbmltcG9ydCB7IFRpbWVzVGFtcGVyIH0gZnJvbSBcIi4uL1RpbWUvVGltZXNUYW1wZXJcIjtcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcblxuLy8gY29uc3QgUFJPVE9DT0xfVVJMOnN0cmluZyA9IFwiaHR0cHM6Ly9waXBlbGluZWFwaS54d3hnYW1lLmNvbS9cIjtcbmNvbnN0IFBST1RPQ09MX1VSTDpzdHJpbmcgPSBcImh0dHBzOi8vcGFya291cnJhY2V0b3V0aWFvMmFwaS54d3hnYW1lLmNvbS9cIjtcblxuZXhwb3J0IGNsYXNzIFBST1RPQ09MUyB7XG5cbiAgICBwdWJsaWMgc3RhdGljIExvZ2luXHRcdFx0XHQ9IFwidXNlci9sb2dpblwiO1x0XHRcdFx0Ly8gbm90IHRva2VuXG5cbiAgICBwdWJsaWMgc3RhdGljIGdhbWUgICAgICAgICAgICAgICAgID0gXCJnYW1lL3N0YXJ0XCI7XG4gICAgcHVibGljIHN0YXRpYyBlbmQgICAgICAgICAgICAgICAgICA9IFwiZ2FtZS9wbGF5XCI7XG5cbiAgICBwdWJsaWMgc3RhdGljIFNpZ24gICAgICAgICAgICAgID0gXCJzaWduL3NpZ25cIjtcblxuICAgIC8vIHB1YmxpYyBzdGF0aWMgRXF1aXBIZXJvICAgICAgICAgICA9IFwidGhlbWUvZXF1aXBIZXJvXCI7XG4gICAgLy8gcHVibGljIHN0YXRpYyBCdXlIZXJvICAgICAgICAgICAgID0gXCJ0aGVtZS9idXlIZXJvXCI7XG4gICAgLy8gcHVibGljIHN0YXRpYyBFcXVpcEhhdCAgICAgICAgICAgPSBcInRoZW1lL2VxdWlwSGF0XCI7XG4gICAgLy8gcHVibGljIHN0YXRpYyBCdXlIYXQgICAgICAgICAgICAgPSBcInRoZW1lL2J1eUhhdFwiO1xuICAgIC8vIHB1YmxpYyBzdGF0aWMgQnV5RGFuY2UgICAgICAgICAgICAgPSBcInRoZW1lL2J1eURhbmNlXCI7XG4gICAgLy8gcHVibGljIHN0YXRpYyBFcXVpcERhbmNlICAgICAgICAgICA9IFwidGhlbWUvZXF1aXBEYW5jZVwiO1xuXG4gICAgcHVibGljIHN0YXRpYyBCdXk9XCJ0aGVtZS9idXlcIjtcbiAgICBwdWJsaWMgc3RhdGljIEVxdWlwPVwidGhlbWUvZXF1aXBcIjtcbiAgICBwdWJsaWMgc3RhdGljIHNoYXJlICAgICAgICAgICAgICAgID0gXCJmaXNzaW9uL3NoYXJlXCI7XG4gICAgcHVibGljIHN0YXRpYyB2ZCAgICAgICAgICAgICAgICAgICA9IFwiZmlzc2lvbi92ZFwiO1xuICAgIHB1YmxpYyBzdGF0aWMgcmV2aXZhbCAgICAgICAgICAgICAgPSBcImdhbWUvcmV2aXZhbFwiO1xuICAgIHB1YmxpYyBzdGF0aWMgZmlzc2lvbiAgICAgICAgICAgPSBcInRoZW1lL2Zpc3Npb25cIjtcbiAgICBwdWJsaWMgc3RhdGljIHRoZW1lZmlzc2lvbiAgICAgICAgICA9XCJ0aGVtZS9maXNzaW9uXCI7XG4gICAgcHVibGljIHN0YXRpYyB0cmVhc3VyZSAgICAgICA9IFwidHJlYXN1cmUvY2xpY2tcIjtcblxuICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlnICAgICAgICAgICAgPSBcImNvbmZpZy90YWJsZVwiO1xuICAgIHB1YmxpYyBzdGF0aWMgTG90dGVyeT1cImxvdHRlcnkvbG90dGVyeVwiO1xuICAgIHB1YmxpYyBzdGF0aWMgR2V0QWNoaWV2ZT1cImFjaGlldmVtZW50L2dldFJld2FyZHNcIjtcblxuICAgIHB1YmxpYyBzdGF0aWMgdXNlcnN5bmMgPSBcInVzZXIvc3luY1wiO1xufTtcblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtNYW5hZ2VyXG57XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6TmV0d29ya01hbmFnZXI7XG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKVxuICAgIHtcbiAgICAgICAgaWYoTmV0d29ya01hbmFnZXIuaW5zdGFuY2UpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBOZXR3b3JrTWFuYWdlci5pbnN0YW5jZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmV0d29ya01hbmFnZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgICAgIE5ldHdvcmtNYW5hZ2VyLmluc3RhbmNlID0gdGhpcztcbiAgICB9XG5cbiAgICAvLyNyZWdpb24g55m75YWlXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogbG9naW4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgcHVibGljIGxvZ2luKHByb2dyZXNzY2I6TGF5YS5IYW5kbGVyLCBjb21wbGV0ZWNiOkxheWEuSGFuZGxlciwgZXJyb3JjYjpMYXlhLkhhbmRsZXIpOiB2b2lkXG4gICAge1xuICAgICAgICB2YXIgdXNlckluZm9yID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudDtcbiAgICAgICAgdmFyIHZlciA9IEdsb2JhbC5nYW1lVmVyc2lvbjtcblxuICAgICAgICBsZXQgYXJnczpzdHJpbmcgPSBgY29kZT0ke3VzZXJJbmZvci5Db2RlfSZuaWNrbmFtZT0ke3VzZXJJbmZvci5OaWNrTmFtZX0mYXZhdGFyPSR7dXNlckluZm9yLkF2YXRhcn0mZ2VuZGVyPSR7dXNlckluZm9yLkdlbmRlcn0mY291bnRyeT0ke3VzZXJJbmZvci5Db3VudHJ5fSZwcm92aW5jZT0ke3VzZXJJbmZvci5Qcm92aW5jZX0mY2l0eT0ke3VzZXJJbmZvci5DaXR5fSYgZGV2aWNlPSR7dXNlckluZm9yLkRldmljZX0kJnNoYXJlX2lkPSR7dXNlckluZm9yLlNoYXJlSWR9JnNjZW5lPSR7dXNlckluZm9yLlNjZW5lfSZ2PSR7dmVyfWA7XG4gICAgICAgIFxuICAgICAgICBsZXQgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgaHR0cFJlcXVlc3Qub25jZShFdmVudC5QUk9HUkVTUywgdGhpcywgdGhpcy5vbkh0dHBSZXF1ZXN0UHJvZ3Jlc3MsIFtwcm9ncmVzc2NiLCBodHRwUmVxdWVzdF0pO1xuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LkNPTVBMRVRFLCB0aGlzLCB0aGlzLm9uTG9naW5SZXF1ZXN0Q29tcGxldGUsIFtjb21wbGV0ZWNiLCBodHRwUmVxdWVzdF0pO1xuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RFcnJvciwgW2Vycm9yY2IsIGh0dHBSZXF1ZXN0XSk7XG4gICAgICAgIGh0dHBSZXF1ZXN0LnNlbmQoUFJPVE9DT0xfVVJMK1BST1RPQ09MUy5Mb2dpbiAsIGFyZ3MsIFwicG9zdFwiLCBcInRleHRcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkh0dHBSZXF1ZXN0UHJvZ3Jlc3MocHJvZ3Jlc3NjYjpMYXlhLkhhbmRsZXIsaHR0cFJlcXVlc3Q6SHR0cFJlcXVlc3QpXG4gICAge1xuICAgICAgICBpZihwcm9ncmVzc2NiKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkh0dHBSZXF1ZXN0UHJvZ3Jlc3M6Li4uXCIpO1xuICAgICAgICAgICAgcHJvZ3Jlc3NjYi5ydW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Mb2dpblJlcXVlc3RDb21wbGV0ZShjb21wbGV0ZWNiOkxheWEuSGFuZGxlcixodHRwUmVxdWVzdDpIdHRwUmVxdWVzdClcbiAgICB7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCLnmbvlvZXmlbDmja7vvJpcIiwgaHR0cFJlcXVlc3QuZGF0YSk7XG4gICAgICAgIGxldCBkYXRhOiBKU09OID0gSlNPTi5wYXJzZShodHRwUmVxdWVzdC5kYXRhKTtcblx0XHRcdGlmIChkYXRhW1wiY29kZVwiXSAhPSBcIjBcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi55m75b2V5byC5bi46ZSZ6K+v77yB6ZSZ6K+v5L+h5oGv77yaXCIsIGh0dHBSZXF1ZXN0LmRhdGEpO1xuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi55m75b2V5byC5bi46ZSZ6K+v77yB6ZSZ6K+v5L+h5oGv77yaPSBcIiArIGRhdGFbXCJjb2RlXCJdLFwiaHR0cFJlcXVlc3QuZGF0XCIpO1xuXHRcdFx0XHQvL2NvbXBsZXRlY2IucnVuV2l0aChkYXRhKTtcblx0XHRcdFx0cmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUGxheWVyQWNjb3VudC5TZXJ2ZXJUaW1lID0gZGF0YVtcInRcIl07XG4gICAgICAgICAgICBUaW1lc1RhbXBlci5JbnN0YW5jZS51cGRhdGVTZXJ2aWNlVGltZSggTnVtYmVyKGRhdGFbXCJ0XCJdKSApO1xuICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLnmbvlvZXmraPlvI/miJDlip9cIik7XG4gICAgICAgICAgICBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LlNldEFjY291bnREYXRhKGRhdGEsY29tcGxldGVjYik7XG4gICAgICAgICAgICAvLyBTaGFyZVV0aWwuU2hhcmVNZXNzYWdlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkh0dHBSZXF1ZXN0RXJyb3IoZXJyb3JjYjpMYXlhLkhhbmRsZXIsaHR0cFJlcXVlc3Q6SHR0cFJlcXVlc3QpXG4gICAge1xuICAgICAgICBpZiAoZXJyb3JjYiAhPSBudWxsKSB7XG4gICAgICAgICAgICBlcnJvcmNiLnJ1bldpdGgoaHR0cFJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBlcnJvci4uIFwiICxcImh0dHBSZXF1ZXN0LmRhdFwiKTtcbiAgICAgICAgV3hBcGkuU2hvd0xvYWRpbmcoXCLov57mjqXnvZHnu5zlpLHotKUuLi5cIik7XG4gICAgICAgIExheWEudGltZXIub25jZSg4MDAwLHRoaXMsKCk9PntXeEFwaS5IaWRlTG9hZGluZygpO30pXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBlcnJvci4uLlwiICsgaHR0cFJlcXVlc3QuZGF0YSk7XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuICAgIFxuXG4gICAgLypcbiAgICAqIOmAmueUqEh0dHAgUG9zdOWNj+iuruWPkemAgVxuICAgICogcHJvdG9jb2wgXHRcdOWvueW6lOKAnFBST1RPQ09MU+KAneWtl+WFuOS4reWNj+iuruWQjeensFxuICAgICogaGFzVG9rZW5cdFx05piv5ZCm5L2/55SodG9rZW7vvIznm67liY3lj6rmnIlsb2dpbuWNj+iuruS4jemcgOimgXRva2Vu77yM5YW25LuW6YO96ZyA6KaBdG9rZW7vvIzmiYDku6XmraTlpIToh6rliqjnu4TlkIhcbiAgICAqIHBhcmFtXHRcdFx05Y+C5pWw5YiX6KGo77yMa2V55piv5a2X5q615ZCN77yMdmFs5piv5YC877yM5YC86ZyA6KaB5YWI6L2sc3RyaW5nXG4gICAgKiBjb21wbGV0ZWNiXHTljY/orq7lj5HpgIHmiJDlip/lm57osIPlh73mlbBcbiAgICAqIGVycm9yY2JcdFx05Y2P6K6u5Y+R6YCB5aSx6LSl5Zue6LCD5Ye95pWwXG4gICAgKiByZXR1cm5cdFx06L+U5Zue5YC85Li6dm9pZFxuICAgICovXG4gICAgcHVibGljIEh0dHBQb3N0UmVxdWVzdChwcm90b2NvbDpzdHJpbmcsIHBhcmFtOkFycmF5PHtba2V5OnN0cmluZ106c3RyaW5nfT4sIGNvbXBsZXRlY2I6TGF5YS5IYW5kbGVyLCBlcnJvcmNiOkxheWEuSGFuZGxlciwgaGFzVG9rZW46Ym9vbGVhbiA9IHRydWUpOnZvaWQgXG4gICAge1xuICAgICAgICBsZXQgYXJnczpzdHJpbmcgPSBcIlwiO1xuICAgICAgICBsZXQgdXJsOnN0cmluZyA9IFBST1RPQ09MX1VSTCArIHByb3RvY29sO1xuICAgICAgICAvLyBjaGVjaGsgYWRkIHRva2VuXG4gICAgICAgIHZhciBhY2NvdW50ID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudDtcbiAgICAgICAgdmFyIGFjY291bnRkYXRhID0gYWNjb3VudC5DdXJBY2NvdW50RGF0YTtcbiAgICAgICAgaWYgKGhhc1Rva2VuID09IHRydWUpIFxuICAgICAgICB7XG4gICAgICAgICAgICBhcmdzID0gYHRva2VuPSR7YWNjb3VudGRhdGEubV90b2tlbn0mYDtcbiAgICAgICAgfVxuXG4gICAgICAgIFd4QXBpLlNob3dMb2FkaW5nKFwi6L+e5o6l572R57uc5LitLi4uXCIpO1xuICAgICAgICBpZiAocHJvdG9jb2wgPT0gUFJPVE9DT0xTLmdhbWUgfHwgcHJvdG9jb2wgPT0gUFJPVE9DT0xTLmVuZCB8fCBwcm90b2NvbCA9PSBQUk9UT0NPTFMuZmlzc2lvbiB8fCBwcm90b2NvbCA9PSBQUk9UT0NPTFMudmR8fFxuICAgICAgICAgICAgcHJvdG9jb2w9PVBST1RPQ09MUy50aGVtZWZpc3Npb258fHByb3RvY29sPT1QUk9UT0NPTFMuTG90dGVyeSB8fCBwcm90b2NvbCA9PSBQUk9UT0NPTFMudXNlcnN5bmMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBzdHIgID0gXCJhYmNkZWZnaGlqa2ltbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtcbiAgICAgICAgICAgIGxldCBjb2RlID0gXCJ7XCI7XG4gICAgICAgICAgICBsZXQgbWFzayA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFzayArPSBzdHJbTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqIDEwMCkgJSBzdHIubGVuZ3RoXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW0ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHBhcmFtW2ldKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGUgKz0gYFxcXCIke2tleX1cXFwiOlxcXCIke3BhcmFtW2ldW2tleV19XFxcImA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpIDwgcGFyYW0ubGVuZ3RoIC0gMSkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb2RlICs9IFwiLFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb2RlICs9IFwifVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZ3MgKz0gXCJfcj1cIiArIG1hc2sgKyB0aGlzLmJhc2U2NEVuY29kZShjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtLmxlbmd0aDsgaSsrKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBwYXJhbVtpXSkgXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWw6c3RyaW5nID0gcGFyYW1baV1ba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gYCR7a2V5fT0ke3ZhbH1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBwYXJhbS5sZW5ndGggLSAxKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzICs9IFwiJlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBodHRwUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdCgpO1xuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LkNPTVBMRVRFLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RDb21wbGV0ZSwgW2NvbXBsZXRlY2IsIGVycm9yY2IsIGh0dHBSZXF1ZXN0XSk7XG4gICAgICAgIGh0dHBSZXF1ZXN0Lm9uY2UoRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMub25IdHRwUmVxdWVzdEVycm9yLCBbZXJyb3JjYiwgaHR0cFJlcXVlc3RdKTtcbiAgICAgICAgaHR0cFJlcXVlc3Quc2VuZCh1cmwsIGFyZ3MsIFwicG9zdFwiLCBcInRleHRcIik7XG4gICAgfVxuICAgICAgICBcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RDb21wbGV0ZShzdWNjZWVkY2I6TGF5YS5IYW5kbGVyLCBmYWlsdXJlY2I6TGF5YS5IYW5kbGVyLCBodHRwUmVxdWVzdDpIdHRwUmVxdWVzdCk6dm9pZCBcbiAgICB7XG4gICAgICAgIFd4QXBpLkhpZGVMb2FkaW5nKCk7XG4gICAgICAgIGxldCBkYXRhOiBKU09OID0gSlNPTi5wYXJzZShodHRwUmVxdWVzdC5kYXRhKTtcbiAgICAgICAgaWYgKGRhdGFbXCJjb2RlXCJdID09IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuU2V0QWNjb3VudERhdGEoZGF0YSxudWxsKTtcbiAgICAgICAgICAgIGlmIChzdWNjZWVkY2IgIT0gbnVsbClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdWNjZWVkY2IucnVuV2l0aChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmIChmYWlsdXJlY2IgIT0gbnVsbCkgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZmFpbHVyZWNiLnJ1bldpdGgoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBjb21wbGV0ZSBlcnJvciwgY29kZTogXCIgKyBkYXRhW1wiY29kZVwiXSArIFwiIG1lc3NhZ2U6IFwiICsgZGF0YVtcIm1lc3NhZ2VcIl0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiYXNlNjRFbmNvZGUgKHN0cik6c3RyaW5nIHtcbiAgICAgICAgdmFyIGMxLCBjMiwgYzM7XG4gICAgICAgIHZhciBiYXNlNjRFbmNvZGVDaGFycyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO1xuICAgICAgICB2YXIgaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGgsIHN0cmluZyA9ICcnO1xuICAgICAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgICAgIGMxID0gc3RyLmNoYXJDb2RlQXQoaSsrKSAmIDB4ZmY7XG4gICAgICAgICAgaWYgKGkgPT0gbGVuKSB7XG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMxID4+IDIpO1xuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoYzEgJiAweDMpIDw8IDQpO1xuICAgICAgICAgICAgc3RyaW5nICs9IFwiPT1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICAgICAgaWYgKGkgPT0gbGVuKSB7XG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMxID4+IDIpO1xuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoKGMxICYgMHgzKSA8PCA0KSB8ICgoYzIgJiAweEYwKSA+PiA0KSk7XG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KChjMiAmIDB4RikgPDwgMik7XG4gICAgICAgICAgICBzdHJpbmcgKz0gXCI9XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYzMgPSBzdHIuY2hhckNvZGVBdChpKyspO1xuICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoYzEgPj4gMik7XG4gICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoKGMxICYgMHgzKSA8PCA0KSB8ICgoYzIgJiAweEYwKSA+PiA0KSk7XG4gICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoKGMyICYgMHhGKSA8PCAyKSB8ICgoYzMgJiAweEMwKSA+PiA2KSk7XG4gICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdChjMyAmIDB4M0YpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbn0iLCJleHBvcnQgY2xhc3MgUGxhdGZyb21UeXBlXG4ge1xuICAgIC8qKlxuICAgICAqIOeUteiEkVxuICAgICAqL1xuICAgIHN0YXRpYyBwYzpzdHJpbmcgPSBcInBjXCI7XG4gICAgLyoqXG4gICAgICog5b6u5L+h5bCP5ri45oiPXG4gICAgICovXG4gICAgc3RhdGljIHd4OnN0cmluZyA9IFwid3hcIjtcblxuICAgIC8qKlxuICAgICAqIHFx5bCP5ri45oiPXG4gICAgICovXG4gICAgc3RhdGljIHFxOnN0cmluZyA9IFwicXFcIjtcblxuICAgIC8qKlxuICAgICAqIOaKlumfs1xuICAgICAqL1xuICAgIHN0YXRpYyB0dDpzdHJpbmcgPSBcInR0XCI7XG59IiwiaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi4vV1hTREsvU2RrXCI7XG5pbXBvcnQge0RpY3Rpb25hcnl9IGZyb20gXCIuLi91dGlscy9EaWN0aW9uYXJ5XCI7XG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlciwgUFJPVE9DT0xTIH0gZnJvbSBcIi4vTmV0d29ya01hbmFnZXJcIjtcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcblxuXG5leHBvcnQgZW51bSByZXF1aXJldHlwZSB7XG4gICAg57O757uf6LWg6YCBID0gMSwg6YeR5biB6LSt5LmwID0gMiwg6KeC55yL6KeG6aKRID0gMywg5YiG5LqrID0gNCwg562+5YiwID0gNSwg5rS75YqoID0gNiwg6YCa6L+H5YWz5Y2hID0gNywg57Sv6K6h55m76ZmGID0gOCwg6YKA6K+35Lq65pWw6L6+5YiwID0gOSwg56CW55+z6LSt5LmwID0gMTBcbn1cblxuZXhwb3J0IGVudW0gQWNjb3VudENvbmZpZyB7XG4gICAgY3JvcCx0aGluZ3MsIGxhbmQsIGdsb2JhbCwgZW50aXR5LCBzaWduLCByZXdhcmRzLCBhY2hpZXZlbWVudCwgaW52aXRlLCBtaXNzaW9uLCB0cmVhc3VyZV9jbGljaywgdGhlbWUsIGxvdHRlcnlcbn1cblxuZXhwb3J0IGVudW0gQWNjb3VudFVzZXIge1xuICAgIG1vbmV5LCBkaWFtb25kLCB1c2VyX2lkLCBnYW1lX3RpbWVzLCBnZXRfdGhlbWVzLCB2aWRlb190aW1lcywgZXF1aXBfdGhlbWVzLCBsYXN0X2FjdGlvbl90aW1lLCBsYXN0X2Zhdm9yaXRlX3RpbWUsIHByb2dyZXNzX3RoZW1lcywgcmV2aXZhbCwgc3RhZ2Usdm1vbmV5XG59XG5cbmV4cG9ydCBlbnVtIGhlcm9BdHRyIHtcbiAgICBpZCwgbmFtZSwgcXVhbGl0eSwgaWNvbiwgcHJlZmFiLCByZXF1aXJlX251bSwgcmVxdWlyZV90eXBlXG59XG5cbmV4cG9ydCBlbnVtIHNpZ25kYXRhIHtcbiAgICBzaWduX2RheXMsIHNpZ25fdGltZVxufVxuXG5leHBvcnQgZW51bSBlbnRpdHkge1xuICAgIGlkLCBuYW1lLCBlbnRpdHlfaWQsIGljb25cbn1cblxuZXhwb3J0IGVudW0gc2tpbmF0dHIge1xuICAgIGVmZmVjdFZhbHVlXzEsXG4gICAgZWZmZWN0VmFsdWVfMixcbiAgICBlZmZlY3RWYWx1ZV8zLFxuICAgIGVmZmVjdFZhbHVlXzRcbn1cblxuZXhwb3J0IGNsYXNzIEFjY291bnREYXRhIHtcbiAgICBjb25zdHJ1Y3RvcihfdG9rZW46IHN0cmluZywgX2NvbmZpZzogT2JqZWN0LCBfYXBwU2V0dGluZzogT2JqZWN0LCBfdXNlcjogT2JqZWN0LCBfdXNlcmJhc2U6IE9iamVjdCwgX3VzZUludml0ZTogT2JqZWN0ID0gbnVsbCwgX3VzZXJfc3RhZ2U6IE9iamVjdCA9IG51bGwsIF91c2VyX3NpZ24sIF91c2VyX2FjaGlldmVtZW50LCBfbG90dGVyeSxfdXNlX2xhbmRfdGFzayxfdXNlcl92aWRlbykge1xuICAgICAgICB0aGlzLm1fdG9rZW4gPSBfdG9rZW47XG4gICAgICAgIHRoaXMubV9hcHBfc2V0dGluZyA9IF9hcHBTZXR0aW5nO1xuICAgICAgICB0aGlzLm1fdXNlciA9IF91c2VyO1xuICAgICAgICB0aGlzLm1fdXNlcl9iYXNlID0gX3VzZXJiYXNlO1xuICAgICAgICB0aGlzLm1fc2lnbiA9IF91c2VyX3NpZ247XG4gICAgICAgIHRoaXMubV90YXNrID0gX3VzZXJfYWNoaWV2ZW1lbnQ7XG4gICAgICAgIHRoaXMubG90dGVyeSA9IF9sb3R0ZXJ5O1xuICAgICAgICB0aGlzLm1fdXNlX2xhbmRfdGFzayA9IF91c2VfbGFuZF90YXNrO1xuICAgICAgICB0aGlzLm1fdXNlcl92aWRlbyA9IF91c2VyX3ZpZGVvO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHRoaXMubV91c2VyW1widXNlcl9pZFwiXTtcbiAgICAgICAgdGhpcy5vcGVuaWQgPSB0aGlzLm1fdXNlcl9iYXNlW1wib3BlbmlkXCJdO1xuICAgICAgICBjb25zb2xlLmxvZyhcInVzZXJfaWQ6XCIgKyB0aGlzLnVzZXJJZCk7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJvcGVuX2lkOlwiK3RoaXMub3BlbmlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbV90b2tlbjogc3RyaW5nO1xuICAgIHB1YmxpYyBtX2NvbmZpZ3M6IE9iamVjdDtcbiAgICBwdWJsaWMgbV9hcHBfc2V0dGluZzogT2JqZWN0O1xuICAgIHB1YmxpYyBtX3VzZXI6IE9iamVjdDtcbiAgICBwdWJsaWMgbV91c2VyX2Jhc2U6IE9iamVjdDtcbiAgICBwdWJsaWMgbV9zaWduOiBPYmplY3Q7XG4gICAgcHVibGljIG1fdGFzazogT2JqZWN0O1xuICAgIHB1YmxpYyBtX3VzZV9sYW5kX3Rhc2s6YW55O1xuICAgIHB1YmxpYyBtX3VzZXJfdmlkZW86T2JqZWN0O1xuICAgIHB1YmxpYyBvcGVuaWQ6IHN0cmluZyA9IFwiXCI7XG4gICAgcHJpdmF0ZSB1c2VySWQ6IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGxvdHRlcnk6IGFueTtcbiAgICBwdWJsaWMgcm9hZGNvbmZpZzogeyBba2V5OiBudW1iZXJdOiBhbnkgfSA9IHt9O1xuICAgIHB1YmxpYyBtX1Jld2FyZERpYzogT2JqZWN0ID0ge307XG4gICAgcHVibGljIG1fRW50aXR5RGljOiB7IFtrZXk6IG51bWJlcl06IGFueSB9ID0ge307XG4gICAgcHVibGljIG1fQWNoaWV2ZW1lbnREaWM6IE9iamVjdCA9IHt9O1xuICAgIC8vIHB1YmxpYyBtX3NraW5EaWM6RGljdGlvbmFyeTxudW1iZXIsU2tpbkRhdGE+ID0gbmV3IERpY3Rpb25hcnkoKTtcblxuICAgIC8v6I635Y+W546p5a626JC95YWl56m65Lit5q275Lqh6Led56a7XG4gICAgcHVibGljIGdldCBEaWVEaXN0YW5jZSgpOm51bWJlcntcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJEaWVEaXN0YW5jZVwiXSk7XG4gICAgfVxuICAgIC8v6I635Y+W5byA5bGA56C46JuL5Yeg546HXG4gICAgcHVibGljIGdldCBIaXRFZ2coKTpudW1iZXJ7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiSGl0RWdnXCJdKTtcbiAgICB9XG4gICAgLy/ojrflj5bnu5PnrpflkI7noLjom4vlh7rnjrDlh6DnjodcbiAgICBwdWJsaWMgZ2V0IEVuZENoZWF0KCk6bnVtYmVye1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcIkVuZENoZWF0XCJdKTtcbiAgICB9XG4gICAgLy/ojrflj5bor6/op6blpZblirHph5HluIHmlbBcbiAgICBwdWJsaWMgZ2V0IENoZWF0UmV3YXJkKCk6bnVtYmVye1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcIkNoZWF0UmV3YXJkXCJdKTtcbiAgICB9XG4gICAgLy/nmb3lkI3ljZXnlKjmiLdcbiAgICBwdWJsaWMgZ2V0IFdoaXRlVXNlcigpOmJvb2xlYW57XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJXaGl0ZVVzZXJcIl0gPT0gXCIxXCI7XG4gICAgfVxuXG4gICAgLy/nrb7liLDlip/og73mmK/lkKblvIDlkK9cbiAgICBwdWJsaWMgZ2V0IFN0cmF0ZWd5U3dpdGNoKCk6Ym9vbGVhbntcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcIlN0cmF0ZWd5U3dpdGNoXCJdID09IFwiMVwiO1xuICAgIH1cblxuICAgIC8v562+5Yiw5Yqf6IO95piv5ZCm5byA5ZCvXG4gICAgcHVibGljIGdldCBTaG93U2lnbigpOmJvb2xlYW57XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJTaG93U2lnblwiXSA9PSBcIjFcIjtcbiAgICB9XG4gICAgLy/oh6rliqjli77pgIlcbiAgICBwdWJsaWMgZ2V0IENob29zZSgpOmJvb2xlYW57XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJjaG9vc2VcIl0gPT0gXCIxXCI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb3R0ZXJ5dGltZSgpOm51bWJlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLmxvdHRlcnlbXCJkYXlfdmlkZW9fdGltZXNcIl0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2hhcmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJzaGFyZVwiXSA9PSBcIjFcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNoYXJlY29udGVudCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wic2hhcmVjb250ZW50XCJdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IFNoYXJlSW1hZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcIlNoYXJlSW1hZ2VcIl07XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgY2hlYXR0aW1lKCkge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImNoZWF0dGltZVwiXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYmFubmVyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiYmFubmVyXCJdID09IFwiMVwiO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHZpZGVvKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1widmlkZW9cIl0gPT0gXCIxXCI7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgQnRuQ2FuTW92ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcIkJ0bkNhbk1vdmVcIl0gPT0gXCIxXCI7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgY2hlY2tzY2VuY2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJjaGVja3NjZW5jZVwiXSA9PSBcIjFcIjtcbiAgICB9XG4gICAgcHVibGljIGdldCBiYW5uZXJfZGlzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiYmFubmVyX2Rpc1wiXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYmFubmVyTW92ZVRpbWUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJiYW5uZXJNb3ZlVGltZVwiXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgY3JlYXRlQmFubmVyVGltZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJjcmVhdGVCYW5uZXJUaW1lc1wiXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYmFubmVyTW92ZVByb3AoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJiYW5uZXJNb3ZlUHJvcFwiXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNTaGFyZVRoZW5WaWRlbygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImlzU2hhcmVUaGVuVmlkZW9cIl0gPT0gXCIxXCI7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNTaG93SHVpVHVpKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiaXNTaG93SHVpVHVpXCJdID09IFwiMVwiO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHN0YXJ0X3NwcmludCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcInN0YXJ0X3NwcmludFwiXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBJc1ZpZGVvTW9kZWwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJJc1ZpZGVvTW9kZWxcIl0gPT0gXCIxXCI7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdmlkZW9Nb2RlbE51bSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcInZpZGVvTW9kZWxOdW1cIl0pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IFZpZGVvTW9kZWxUaXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiVmlkZW9Nb2RlbFRpdGxlXCJdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZhaWxjb3VudCgpOm51bWJlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJmYWlsY291bnRcIl0pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHNwbWluc3BlZWQoKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wic3BtaW5zcGVlZFwiXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYmdtKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImJnbVwiXSA9PSBcIjFcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNhbWVyYWhpZ2h0KCk6bnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImNhbWVyYWhpZ2h0XCJdKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBjdG5maWxlbmFtZSgpOnN0cmluZ1xuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImN0bmZpbGVuYW1lXCJdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNoZWF0KCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImNoZWF0XCJdID09IFwiMVwiO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHNoYWtlc3RhZ2UoKTpib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wic2hha2VzdGFnZVwiXSAmJiB0aGlzLm1fYXBwX3NldHRpbmdbXCJzaGFrZXN0YWdlXCJdID09IFwiMVwiO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHN0YWdlY29uZmlnY2RuKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInN0YWdlY29uZmlnY2RuXCJdID09IFwiMVwiO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHBsYXllcnNwZWVkKCk6bnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcInBsYXllcnNwZWVkXCJdKTtcbiAgICB9XG4gICAgcHVibGljIGdldCB2aWRlbEFkVW5pdElkKCk6c3RyaW5nXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1widmlkZWxBZFVuaXRJZFwiXTtcbiAgICB9XG4gICAgcHVibGljIGdldCBiYW5uZXJBZFVuaXRJZCgpOnN0cmluZ1xuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lckFkVW5pdElkXCJdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHRyaSgpOmJvb2xlYW5cbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJ0cmlcIl0gPT0gXCIxXCI7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgcmVjb21tZW5kKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInJlY29tbWVuZFwiXSA9PSBcIjFcIjtcbiAgICB9XG4gICAgcHVibGljIGdldCByZWNvbW1lbmRmbGcoKTpzdHJpbmdcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJyZWNvbW1lbmRmbGdcIl07XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZWdnKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImVnZ1wiXSA9PSBcIjFcIjtcbiAgICB9XG4gICAgcHVibGljIGdldCBlZ2dyYXRlKCk6bnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImVnZ3JhdGVcIl0pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IFVzZUlkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJJZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgR2V0Q29uZmlnKF90eXBlOiBBY2NvdW50Q29uZmlnKTogYW55IHtcbiAgICAgICAgdmFyIHR5cGUgPSBBY2NvdW50Q29uZmlnW190eXBlXTtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9jb25maWdzW3R5cGVdO1xuICAgIH1cblxuICAgIHB1YmxpYyBHZXRVc2VyKF90eXBlOiBBY2NvdW50VXNlcikge1xuICAgICAgICB2YXIgdHlwZSA9IEFjY291bnRVc2VyW190eXBlXTtcbiAgICAgICAgcmV0dXJuIHRoaXMubV91c2VyW3R5cGVdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IEdldFZpZGVvVG90YWwoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fdXNlcl92aWRlb1tcInRvdGFsXCJdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgR2V0U2lnbihfZGF0YXR5cGU6IHNpZ25kYXRhKSB7XG4gICAgICAgIHZhciB0eXBlID0gc2lnbmRhdGFbX2RhdGF0eXBlXTtcbiAgICAgICAgcmV0dXJuIHRoaXMubV9zaWduW3R5cGVdO1xuICAgIH1cblxuICAgIHB1YmxpYyBHZXRSZXdhcmRDb25maWcoX3Jld2FyZGlkOiBudW1iZXIpOiBhbnkge1xuICAgICAgICB2YXIgcmV3YXJkID0gdGhpcy5tX1Jld2FyZERpY1tfcmV3YXJkaWRdO1xuICAgICAgICByZXR1cm4gcmV3YXJkO1xuICAgIH1cblxuICAgIHB1YmxpYyBHZXRFbnRpdHkoX2lkOiBzdHJpbmcsIGF0dHI6IGVudGl0eSkge1xuICAgICAgICBpZighdGhpcy5tX0VudGl0eURpY1tfaWRdKXJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5tX0VudGl0eURpY1tfaWRdW2VudGl0eVthdHRyXV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBHZXRSZXdhcmREaWMoKSB7XG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLkdldENvbmZpZyhBY2NvdW50Q29uZmlnLnJld2FyZHMpO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICB0aGlzLm1fUmV3YXJkRGljW2NvbmZpZ1trZXldLmlkXSA9IGNvbmZpZ1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIEdldEVudGl0eURpYygpIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcuZW50aXR5KTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGNvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5tX0VudGl0eURpY1tjb25maWdba2V5XS5lbnRpdHlfaWRdID0gY29uZmlnW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIEdldFRoZW1lQnlJZChfaWQ6IG51bWJlcik6IGFueSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZXRDb25maWcoQWNjb3VudENvbmZpZy50aGVtZSk7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZGF0YVtpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaWQgPT0gX2lkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBHZXRTa2luQXR0cihfaWQ6IG51bWJlcikgIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcudGhlbWUpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmZpZy5sZW5ndGg7IGkrKykgIHtcbiAgICAgICAgICAgIGlmIChjb25maWdbaV0uaWQgPT0gX2lkKSAge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgR2V0QWNoaWV2ZW1lbnREYXRhKCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcuYWNoaWV2ZW1lbnQpO1xuICAgICAgICB2YXIgZGljID0ge307XG5cbiAgICAgICAgZm9yICh2YXIga2V5MSBpbiBkYXRhKSB7XG4gICAgICAgICAgICB2YXIgdHlwZTEgPSBkYXRhW2tleTFdLnR5cGU7XG4gICAgICAgICAgICAvL3ZhciBvYmogPSB7fTtcblxuICAgICAgICAgICAgaWYgKGRpY1t0eXBlMV0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkyIGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgdHlwZTIgPSBkYXRhW2tleTJdLnR5cGU7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZTEgPT0gdHlwZTIpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChkYXRhW2tleTJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRpY1t0eXBlMV0gPSBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1fQWNoaWV2ZW1lbnREaWMgPSBkaWM7XG4gICAgfVxuXG4gICAgSGFzVGhlbWUoX2lkOm51bWJlcik6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgdmFyIGhhcyA9IGZhbHNlO1xuICAgICAgICB2YXIgZ2V0dGhlbWVzID0gdGhpcy5HZXRVc2VyKEFjY291bnRVc2VyLmdldF90aGVtZXMpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZ2V0dGhlbWVzLmxlbmd0aDtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKGdldHRoZW1lc1tpXSA9PSBfaWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGFzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzO1xuICAgIH1cblxuICAgIEdldFNraW5EaWMoX2NvbmZpZzphbnkpXG4gICAge1xuICAgICAgICBcbiAgICB9XG5cbiAgICBwdWJsaWMgR2V0SGVyb1Byb2dyZXNzKF9pZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMubV91c2VyW1wicHJvZ3Jlc3NfaGVyb2VzXCJdO1xuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBjb25maWdbX2lkXSA/IGNvbmZpZ1tfaWRdIDogMDtcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBHZXRIYXRQcm9ncmVzcyhfaWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm1fdXNlcltcInByb2dyZXNzX2hhdHNcIl07XG4gICAgICAgIHZhciBwcm9ncmVzcyA9IGNvbmZpZ1tfaWRdID8gY29uZmlnW19pZF0gOiAwO1xuICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gICAgfVxuXG4gICAgcHVibGljIEdldENiUHJvZ3Jlc3MoX2lkOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5tX3VzZXJbXCJwcm9ncmVzc19kYW5jZXNcIl07XG4gICAgICAgIHZhciBwcm9ncmVzcyA9IGNvbmZpZ1tfaWRdID8gY29uZmlnW19pZF0gOiAwO1xuICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gICAgfVxuXG4gICAgcHVibGljIEhhc01vdG9yKF9pZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZXRVc2VyKEFjY291bnRVc2VyLmdldF90aGVtZXMpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBoZCA9IGRhdGFbaV07XG4gICAgICAgICAgICBpZiAoX2lkID09IGhkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvL+iOt+WPluearuiCpOeahOi/m+W6plxuICAgIHB1YmxpYyBHZXRNb3RvclByb2dyZXNzKF9pZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMubV91c2VyW1wicHJvZ3Jlc3NfdGhlbWVzXCJdO1xuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBjb25maWdbX2lkXSA/IGNvbmZpZ1tfaWRdIDogMDtcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBHZXRTZXZlckNvbmZpZyhfY29uZmlnOiBhbnkpIHtcbiAgICAgICAgdGhpcy5tX2NvbmZpZ3MgPSBfY29uZmlnO1xuICAgICAgICB0aGlzLkdldFNraW5EaWModGhpcy5tX2NvbmZpZ3MpO1xuICAgICAgICB0aGlzLkdldFJld2FyZERpYygpO1xuICAgICAgICB0aGlzLkdldEVudGl0eURpYygpO1xuICAgICAgICAvLyB0aGlzLkdldEFjaGlldmVtZW50RGF0YSgpO1xuICAgICAgICBsZXQgX2dsb2JlPV9jb25maWdbXCJnbG9iYWxcIl07XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBfZ2xvYmUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gX2dsb2JlW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmtleSA9PSBcInRpbGlyZWNcIikge1xuICAgICAgICAgICAgICAgIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQudGlsaXJlYz0gTnVtYmVyKGVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIFVwZGF0ZVNraW5EaWMoKVxuICAgIHtcbiAgICAgICAgdGhpcy5HZXRTa2luRGljKHRoaXMubV9jb25maWdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgR2V0R2xvYmUoX2tleTpzdHJpbmcpXG4gICAge1xuICAgICAgICB2YXIgZ2xvYmUgPSB0aGlzLkdldENvbmZpZyhBY2NvdW50Q29uZmlnLmdsb2JhbCk7XG4gICAgICAgIGZvcih2YXIga2V5IGluIGdsb2JlKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgb2JqID0gZ2xvYmVba2V5XTtcbiAgICAgICAgICAgIHZhciBra2sgPSBvYmpbXCJrZXlcIl07XG4gICAgICAgICAgICBpZihra2sgPT0gX2tleSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBvYmpbXCJ2YWx1ZVwiXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyQWNjb3VudCB7XG4gICAgY29uc3RydWN0b3IoX2NvZGU6IHN0cmluZywgX25pY2tuYW1lOiBzdHJpbmcsIF9hdmF0YXI6IHN0cmluZywgX2dlbmRlcjogbnVtYmVyLCBfY291bnRyeTogc3RyaW5nLCBfcHJvdmluY2U6IHN0cmluZywgX2NpdHk6IHN0cmluZywgX2RldmljZTogc3RyaW5nLCBfc2hhcmVpZDogc3RyaW5nLCBfc2NlbmNlOiBzdHJpbmcsIF92ZXI6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvY2FsVGltZSA9IExheWEudGltZXIuY3VyclRpbWVyO1xuXG4gICAgICAgIHRoaXMuQ29kZSA9IF9jb2RlO1xuICAgICAgICB0aGlzLk5pY2tOYW1lID0gX25pY2tuYW1lO1xuICAgICAgICB0aGlzLkF2YXRhciA9IF9hdmF0YXI7XG4gICAgICAgIHRoaXMuR2VuZGVyID0gX2dlbmRlcjtcbiAgICAgICAgdGhpcy5Db3VudHJ5ID0gX2NvdW50cnk7XG4gICAgICAgIHRoaXMuUHJvdmluY2UgPSBfcHJvdmluY2U7XG4gICAgICAgIHRoaXMuQ2l0eSA9IF9jaXR5O1xuICAgICAgICB0aGlzLkRldmljZSA9IF9kZXZpY2U7XG4gICAgICAgIHRoaXMuU2hhcmVJZCA9IF9zaGFyZWlkO1xuICAgICAgICB0aGlzLlNjZW5lID0gX3NjZW5jZTtcbiAgICAgICAgdGhpcy52ZXIgPSBfdmVyO1xuICAgICAgICB0aGlzLklzVGVzdCA9IGZhbHNlO1xuXG4gICAgICAgIFBsYXllckFjY291bnQuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBQbGF5ZXJBY2NvdW50O1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgQ3VycmVudEFjY291bnQoKSB7XG4gICAgICAgIGlmIChQbGF5ZXJBY2NvdW50Lmluc3RhbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi55Sf5oiQ5pys5Zyw5rWL6K+V6LSm5Y+3Li4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFBsYXllckFjY291bnQuVGVzdEFjY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBsYXllckFjY291bnQuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBUZXN0QWNjb3VudCgpIHtcbiAgICAgICAgdmFyIGNvZGUgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibG9jYWxjb2RlXCIpO1xuICAgICAgICBpZighY29kZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgdmFyIHJhbmRvbSA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoMTAwMDAsOTk5OTkpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb2RlID0gXCJ4al9cIiArIHRpbWUgKyByYW5kb207XG4gICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibG9jYWxjb2RlXCIsY29kZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aW1lLHJhbmRvbSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaWsOeUqOaIt1wiLGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLogIHnlKjmiLdcIixjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3VyYWNjb3VudCA9IG5ldyBQbGF5ZXJBY2NvdW50KGNvZGUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuICAgICAgICBjdXJhY2NvdW50LklzVGVzdCA9IHRydWU7XG4gICAgICAgIHJldHVybiBjdXJhY2NvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBDb2RlOiBzdHJpbmc7XG4gICAgcHVibGljIE5pY2tOYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIEF2YXRhcjogc3RyaW5nO1xuICAgIHB1YmxpYyBHZW5kZXI6IG51bWJlcjtcbiAgICBwdWJsaWMgQ291bnRyeTogc3RyaW5nO1xuICAgIHB1YmxpYyBQcm92aW5jZTogc3RyaW5nO1xuICAgIHB1YmxpYyBDaXR5OiBzdHJpbmc7XG4gICAgcHVibGljIERldmljZTogc3RyaW5nO1xuICAgIHB1YmxpYyBTaGFyZUlkOiBzdHJpbmc7XG4gICAgcHVibGljIFNjZW5lOiBzdHJpbmc7XG4gICAgcHVibGljIHZlcjogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgU2VydmVyVGltZTogbnVtYmVyO1xuICAgIHByaXZhdGUgbG9jYWxUaW1lO1xuICAgIHN0YXRpYyBsb2NhbGNvZmlna2V5ID0gXCJtY29uZmlnXCI7XG5cbiAgICBwdWJsaWMgSXNUZXN0ID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgQ3VyQWNjb3VudERhdGE6IEFjY291bnREYXRhO1xuXG4gICAgcHVibGljIHRpbGlyZWM6bnVtYmVyO1xuXG4gICAgcHVibGljIG5vd0NvbmZpZzphbnk7XG5cbiAgICBwdWJsaWMgU2V0QWNjb3VudERhdGEoZGF0YSxjb21wbGV0ZWNiOkxheWEuSGFuZGxlcikge1xuICAgICAgICB2YXIgdG9rZW4gPSBkYXRhW1widG9rZW5cIl07XG4gICAgICAgIHZhciBjb25maWdzID0gZGF0YVtcImNvbmZpZ3NcIl07XG4gICAgICAgIHZhciBhcHBfc2V0dGluZyA9IGRhdGFbXCJhcHBfc2V0dGluZ1wiXTtcbiAgICAgICAgdmFyIHVzZXIgPSBkYXRhW1widXNlclwiXTtcbiAgICAgICAgdmFyIHVzZXJfYmFzZSA9IGRhdGFbXCJ1c2VyX2Jhc2VcIl07XG4gICAgICAgIHZhciB1c2VyX3NpZ24gPSBkYXRhW1widXNlcl9zaWduXCJdO1xuICAgICAgICB2YXIgdXNlcl9hY2hpZXZlbWVudCA9IGRhdGFbXCJ1c2VyX2FjaGlldmVtZW50XCJdO1xuICAgICAgICB2YXIgdXNlcl9sb3R0ZXJ5ID0gZGF0YVtcInVzZXJfbG90dGVyeVwiXTtcbiAgICAgICAgdmFyIHVzZXJfbGFuZF90YXNrID0gZGF0YVtcInVzZXJfbGFuZF90YXNrXCJdO1xuICAgICAgICB2YXIgdXNlcl92aWRlbyA9IGRhdGFbXCJ1c2VyX3ZpZGVvXCJdO1xuICAgICAgICBpZiAodGhpcy5DdXJBY2NvdW50RGF0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuW8gOWni+iOt+WPlmNvbmZpZ+aVsOaNrlwiKTtcbiAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEgPSBuZXcgQWNjb3VudERhdGEodG9rZW4sIGNvbmZpZ3MsIGFwcF9zZXR0aW5nLCB1c2VyLCB1c2VyX2Jhc2UsIG51bGwsIG51bGwsIHVzZXJfc2lnbiwgdXNlcl9hY2hpZXZlbWVudCwgdXNlcl9sb3R0ZXJ5LHVzZXJfbGFuZF90YXNrLHVzZXJfdmlkZW8pO1xuICAgICAgICAgICAgdGhpcy5DaGVja0xvY2FsQ29uZmlnKGRhdGEudGFibGVfdmVyc2lvbiwgKF9jb25maWcpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLkdldFNldmVyQ29uZmlnKF9jb25maWcpO1xuICAgICAgICAgICAgICAgIHRoaXMubm93Q29uZmlnID0gX2NvbmZpZztcbiAgICAgICAgICAgICAgICBpZihjb21wbGV0ZWNiICE9IG51bGwpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWNiLnJ1bldpdGgoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29uZmlncykge1xuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV9jb25maWdzID0gY29uZmlncztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcHBfc2V0dGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV9hcHBfc2V0dGluZyA9IGFwcF9zZXR0aW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fdXNlciA9IHVzZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXNlcl9iYXNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3VzZXJfYmFzZSA9IHVzZXJfYmFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1c2VyX3NpZ24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fc2lnbiA9IHVzZXJfc2lnbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1c2VyX2FjaGlldmVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3Rhc2sgPSB1c2VyX2FjaGlldmVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVzZXJfbG90dGVyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubG90dGVyeSA9IHVzZXJfbG90dGVyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHVzZXJfbGFuZF90YXNrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV91c2VfbGFuZF90YXNrID0gdXNlcl9sYW5kX3Rhc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih1c2VyX3ZpZGVvKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV91c2VyX3ZpZGVvID0gdXNlcl92aWRlbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LnVwZGF0ZVBsYXllckluZm8gKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIENoZWNrTG9jYWxDb25maWcoX3Zlcjogc3RyaW5nLCBjYjogRnVuY3Rpb24pIHtcbiAgICAgICAgdmFyIGN1cmNvbmZpZyA9IExheWEuTG9jYWxTdG9yYWdlLmdldEpTT04oUGxheWVyQWNjb3VudC5sb2NhbGNvZmlna2V5KTtcbiAgICAgICAgaWYgKGN1cmNvbmZpZykge1xuICAgICAgICAgICAgLy9MYXlhLkxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFBsYXllckFjY291bnQubG9jYWxjb2ZpZ2tleSk7XG4gICAgICAgICAgICBpZiAoY3VyY29uZmlnLnZlciA9PSBfdmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZXZlcumFjee9ruaYr+acgOaWsOeahC4uLlwiLCBfdmVyKTtcbiAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcImNvbmZpZ+aOpeWPo+iOt+WPluaIkOWKn1wiKTtcbiAgICAgICAgICAgICAgICBjYihjdXJjb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgTmV0d29ya01hbmFnZXIuSW5zdGFuY2UuSHR0cFBvc3RSZXF1ZXN0KFBST1RPQ09MUy5Db25maWcsIG51bGwsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb25maWdzLnZlciA9IF92ZXI7XG4gICAgICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04oUGxheWVyQWNjb3VudC5sb2NhbGNvZmlna2V5LCBkYXRhLmNvbmZpZ3MpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInNldmVy6YWN572u5pu05paw5a6M5oiQLi4uXCIsIF92ZXIpO1xuICAgICAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcImNvbmZpZ+aOpeWPo+iOt+WPluaIkOWKn1wiKTtcbiAgICAgICAgICAgICAgICAgICAgY2IoZGF0YS5jb25maWdzKTtcbiAgICAgICAgICAgICAgICB9KSwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIumFjee9ruiOt+WPluWksei0pVwiICsgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5aSx6LSlXCIpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyLkluc3RhbmNlLkh0dHBQb3N0UmVxdWVzdChQUk9UT0NPTFMuQ29uZmlnLCBudWxsLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YS5jb25maWdzLnZlciA9IF92ZXI7XG4gICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihQbGF5ZXJBY2NvdW50LmxvY2FsY29maWdrZXksIGRhdGEuY29uZmlncyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZXZlcuS/neWtmOmFjee9ruWujOaIkC4uLlwiLCBfdmVyKTtcbiAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcImNvbmZpZ+aOpeWPo+iOt+WPluaIkOWKn1wiKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjYihkYXRhLmNvbmZpZ3MpO1xuXG4gICAgICAgICAgICB9KSwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6YWN572u6I635Y+W5aSx6LSlXCIgKyBkYXRhKTtcbiAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcImNvbmZpZ+aOpeWPo+iOt+WPluWksei0pVwiKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgU2VydmVyVGltZSgpOiBudW1iZXIge1xuICAgICAgICBsZXQgdGltZSA9IExheWEudGltZXIuY3VyclRpbWVyO1xuICAgICAgICBsZXQgc3RpbWUgPSBQbGF5ZXJBY2NvdW50LlNlcnZlclRpbWUgKyBNYXRoLmNlaWwoKHRpbWUgLSB0aGlzLmxvY2FsVGltZSkgLyAxMDAwKTtcbiAgICAgICAgcmV0dXJuIHN0aW1lO1xuICAgIH1cbn0iLCJcclxuXHJcbmV4cG9ydCBjbGFzcyBSZWNvcmRNYW5hZ2VyXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOlJlY29yZE1hbmFnZXI7XHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgUmVjb3JkTWFuYWdlci5pbnN0YW5jZSA9IHRoaXM7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJuZXcgcmVjb3JkXCIpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpSZWNvcmRNYW5hZ2VyXHJcbiAgICB7XHJcbiAgICAgICAgaWYoUmVjb3JkTWFuYWdlci5pbnN0YW5jZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWNvcmRNYW5hZ2VyLmluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY3VybWFuYWdlciA9IG5ldyBSZWNvcmRNYW5hZ2VyKCk7XHJcbiAgICAgICAgICAgIGN1cm1hbmFnZXIuT25OZXcoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGN1cm1hbmFnZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFJlY29yZFN0YXJ0KClcclxuICAgIHtcclxuICAgICAgICBpZighTGF5YS5Ccm93c2VyLm9uTW9iaWxlKXJldHVybjtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlJlY29yZFN0YXJ0XCIpO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLnN0YXJ0KHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDYwLFxyXG4gICAgICAgICAgfSlcclxuICAgIH1cclxuICAgIFJlY29yZFN0b3AoKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiUmVjb3JkU3RvcFwiKTtcclxuICAgICAgICB0aGlzLnJlY29yZC5zdG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcGxldGVwYXRoOnN0cmluZztcclxuXHJcbiAgICBTaGFyZVZpZGVvKF9jYjpGdW5jdGlvbilcclxuICAgIHtcclxuICAgICAgICBpZighTGF5YS5Ccm93c2VyLm9uTW9iaWxlKXJldHVybjtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnNoYXJlQXBwTWVzc2FnZSh7XHJcbiAgICAgICAgICAgIGNoYW5uZWw6IFwidmlkZW9cIixcclxuICAgICAgICAgICAgcXVlcnk6IFwiXCIsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlSWQ6IFwiMjY2cTRmZ2I4YWw3aTNlN2llXCIsIC8vIOabv+aNouaIkOmAmui/h+WuoeaguOeahOWIhuS6q0lEXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIui1ouW+l+S6huaIke+8jOiupOS9oOWBmuWkp+WTpeWPiOWmguS9lVwiLFxyXG4gICAgICAgICAgICBkZXNjOiBcIui1ouW+l+S6huaIke+8jOiupOS9oOWBmuWkp+WTpeWPiOWmguS9lVwiLFxyXG4gICAgICAgICAgICBleHRyYToge1xyXG4gICAgICAgICAgICAgIHZpZGVvUGF0aDogdGhpcy5jb21wbGV0ZXBhdGgsIC8vIOWPr+eUqOW9leWxj+W+l+WIsOeahOacrOWcsOaWh+S7tui3r+W+hFxyXG4gICAgICAgICAgICAgIHZpZGVvVG9waWNzOiBbXCLotaLlvpfkuobmiJHvvIzorqTkvaDlgZrlpKflk6Xlj4jlpoLkvZVcIl1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3VjY2VzcygpIHtcclxuICAgICAgICAgICAgICAgIF9jYiAmJiBfY2IodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLliIbkuqvop4bpopHmiJDlip9cIik7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGZhaWwoZSkge1xyXG4gICAgICAgICAgICAgICAgX2NiICYmIF9jYihmYWxzZSk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLliIbkuqvop4bpopHlpLHotKVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY29yZDphbnk7XHJcbiAgICBPbk5ldygpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZWNvcmQgPSBMYXlhLkJyb3dzZXIud2luZG93LnR0LmdldEdhbWVSZWNvcmRlck1hbmFnZXIoKTtcclxuICAgICAgICB0aGlzLnJlY29yZC5vblN0YXJ0KHJlcyA9PiB7XHJcbiAgICAgICAgICAgIC8vIOW9leWxj+W8gOWni1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB0aGlzLnJlY29yZC5vblN0b3AocmVzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXBhdGggPSByZXMudmlkZW9QYXRoO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMudmlkZW9QYXRoKTtcclxuICAgICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG5cclxufSIsIlxuXG5cblxuZXhwb3J0IGVudW0gc3lzdGVtdHlwZSB7XG4gICAgaW9zLCBhbmRyb2lkLCBvdGhlclxufVxuXG5leHBvcnQgY2xhc3MgV3hBcGlcbntcbiAgICBwdWJsaWMgc3RhdGljIHJlY29yZEFsZEV2ZW50KGtleTpzdHJpbmcsdmFsdWU6c3RyaW5nPVwiXCIpOnZvaWRcbiAgICB7XG4gICAgICAgIC8vIGlmKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eClcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTZW5kRXZlbnQoa2V5LHtrZXk6dmFsdWV9KTtcbiAgICAgICAgLy8gfVxuICAgICAgICBjb25zb2xlLmxvZyhcIuS6i+S7tjogXCIsa2V5KTtcbiAgICB9XG4gICAgc3RhdGljIG5ld2FjY291bnQgPSBmYWxzZTtcbiAgICBzdGF0aWMgc2NlbmVWYWx1ZSA9IFwiXCI7XG4gICAgc3RhdGljIHNoYXJlT3BlbklkID0gXCJcIjtcbiAgICBzdGF0aWMgcXVlcnljaGFubmVsID0gXCJcIjtcbiAgICBzdGF0aWMgcmVmZXJyZXJJbmZvYXBwSWQgPSBcIlwiO1xuICAgIHN0YXRpYyBXWExvZ2luKGNiOiBGdW5jdGlvbikgXG4gICAge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gubG9naW4oe1xuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgIGlmIChyZXMuY29kZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImNvZGU6XCIscmVzLmNvZGUpO1xuICAgICAgICAgICAgICAgICAgICBjYihyZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+iOt+WPlueUqOaIt+eZu+W9leaAgeWksei0pe+8gScgKyByZXMuZXJyTXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKHJlcykgeyBjb25zb2xlLmxvZyhcInd4LmxvZ2luOiBmYWlsZWQsIHJlcz1cIiArIHJlcyk7IH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIFd4SW5pdCgpIFxuICAgIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcblxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dTaGFyZU1lbnUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2l0aFNoYXJlVGlja2V0OiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25TaG93KChvcHRpb24pID0+IFxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhvcHRpb24pO1xuICAgICAgICAgICAgdGhpcy5zaGFyZU9wZW5JZCA9IG9wdGlvbi5xdWVyeS51c2VySWQ7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5Y2hhbm5lbCA9IG9wdGlvbi5xdWVyeS5jaGFubmVsO1xuICAgICAgICAgICAgaWYob3B0aW9uLnJlZmVycmVySW5mbylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZmVycmVySW5mb2FwcElkID0gb3B0aW9uLnJlZmVycmVySW5mby5hcHBJZDtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm9uU2hvdyBhcHBJZCBpczpcIiwgb3B0aW9uLnJlZmVycmVySW5mby5hcHBJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNjZW5lVmFsdWUgPSBvcHRpb24uc2NlbmU7XG4gICAgICAgICAgICB2YXIgc2NlbmUgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKFwic2NlbmVcIik7XG4gICAgICAgICAgICBpZiAoc2NlbmUpIFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmVWYWx1ZSA9IHNjZW5lO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6K+75Y+W6YWN572u5Zy65pmv5YC8OlwiICsgc2NlbmUpO1xuICAgICAgICAgICAgfSAgXG4gICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLnrKzkuIDmrKHmi4nlj5blnLrmma/lgLw6XCIgKyB0aGlzLnNjZW5lVmFsdWUpO1xuICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInNjZW5lXCIsIHRoaXMuc2NlbmVWYWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy/mmL7npLrliqDovb3kv6Hmga9cbiAgICBwcml2YXRlIHN0YXRpYyBpc1Nob3dpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgc3RhdGljIFNob3dMb2FkaW5nKHRpdGxlOiBzdHJpbmcgPSBcIuWKoOi9veS4rS4uLlwiKSBcbiAgICB7XG4gICAgICAgIC8vIGlmICh0aGlzLmlzU2hvd2luZykgcmV0dXJuO1xuICAgICAgICAvLyB0aGlzLmlzU2hvd2luZyA9IHRydWU7XG4gICAgICAgIC8vIChMYXlhLkJyb3dzZXIub25NaW5pR2FtZSkgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93TG9hZGluZyh7IHRpdGxlOiB0aXRsZSwgbWFzazogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIEhpZGVMb2FkaW5nKCkgXG4gICAge1xuICAgICAgICAvLyB0aGlzLmlzU2hvd2luZyA9IGZhbHNlO1xuICAgICAgICAvLyAoTGF5YS5Ccm93c2VyLm9uTWluaUdhbWUpICYmIExheWEuQnJvd3Nlci53aW5kb3cud3guaGlkZUxvYWRpbmcoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYWxkU2VuZE9wZW5pZChfb3BlbmlkOnN0cmluZylcbiAgICB7XG4gICAgICAgIC8vIGlmKExheWEuQnJvd3Nlci5vbk1pbmlHYW1lKVxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImFsZFNlbmRPcGVuaWRcIixfb3BlbmlkKTtcbiAgICAgICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU2VuZE9wZW5pZChfb3BlbmlkKTtcbiAgICAgICAgLy8gfVxuICAgIH1cbiAgICBcbiAgICAvL+ajgOa1i+abtOaWsFxuICAgIHN0YXRpYyBDaGVja1dYVXBkYXRlKCkgXG4gICAge1xuICAgICAgICBjb25zdCB1cGRhdGVNYW5hZ2VyID0gTGF5YS5Ccm93c2VyLndpbmRvdy50dC5nZXRVcGRhdGVNYW5hZ2VyKCk7XG5cbiAgICAgICAgdXBkYXRlTWFuYWdlci5vbkNoZWNrRm9yVXBkYXRlKChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pyA5paw54mI5pysOlwiICsgcmVzLmhhc1VwZGF0ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHVwZGF0ZU1hbmFnZXIub25VcGRhdGVSZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnNob3dNb2RhbCh7XG4gICAgICAgICAgICAgICAgc2hvd0NhbmNlbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfmm7TmlrDmj5DnpLonLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfmlrDniYjmnKzlt7Lnu4/lh4blpIflpb3vvIzmmK/lkKbph43lkK/lupTnlKjvvJ8nLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIuYXBwbHlVcGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZhaWwocmVzPykge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVNYW5hZ2VyLmFwcGx5VXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBsZXZlbFN0YXJ0KHN0YWdlSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCBcbiAgICB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5byA5aeL6K6w5b2V5YWz5Y2hOlwiICsgc3RhZ2VJZCk7XG4gICAgICAgIC8vIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcbiAgICAgICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25TdGFydChcbiAgICAgICAgLy8gICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgIHN0YWdlSWQ6IHN0YWdlSWQsICAgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgICBzdGFnZU5hbWU6IHN0YWdlTmFtZSwgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCAvL+eUqOaIt0lEIOWPr+mAiVxuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICk7XG4gICAgICAgIC8vICAgICBpZihXeEFwaS5uZXdhY2NvdW50KVxuICAgICAgICAvLyAgICAge1xuICAgICAgICAvLyAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25TdGFydChcbiAgICAgICAgLy8gICAgICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgc3RhZ2VJZDogXCLmlrDnlKjmiLc6XCIgKyBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCAvL+eUqOaIt0lEIOWPr+mAiVxuICAgICAgICAvLyAgICAgICAgICAgICB9XG4gICAgICAgIC8vICAgICAgICAgKTsgXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgbGV2ZWxSdW5uaW5nKHN0YWdlSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLHVzZXJldml2ZTpzdHJpbmcpXG4gICAge1xuICAgICAgICBjb25zb2xlLmxvZyhcIuiusOW9leWFs+WNoeS4rTpcIiArIHN0YWdlSWQpO1xuICAgICAgICAvLyBpZihMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25SdW5uaW5nKHtcbiAgICAgICAgLy8gICAgICAgICBzdGFnZUlkICAgOiBzdGFnZUlkLCAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgc3RhZ2VOYW1lIDogc3RhZ2VOYW1lLCAgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgIHVzZXJJZCAgICA6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcbiAgICAgICAgLy8gICAgICAgICBldmVudCAgICAgOiBcInJldml2ZVwiLCAgLy/kvb/nlKjpgZPlhbcgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICBwYXJhbXMgICAgOiB7XG4gICAgICAgIC8vICAgICAgICAgICBpdGVtTmFtZSAgOiBcIuS9v+eUqOWkjea0u1wiLC8v5L2/55So6YGT5YW35ZCN56ewIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgaXRlbUNvdW50IDogMSwgICAvL+S9v+eUqOmBk+WFt+aVsOmHjyAg5Y+v6YCJXG4gICAgICAgIC8vICAgICAgICAgICBkZXNjICAgICAgOiB1c2VyZXZpdmUgLy/kvb/nlKjpgZPlhbfmj4/ov7BcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICAgIH0pO1xuICAgICAgICAvLyAgICAgICBpZihXeEFwaS5uZXdhY2NvdW50KVxuICAgICAgICAvLyAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblJ1bm5pbmcoe1xuICAgICAgICAvLyAgICAgICAgICAgICBzdGFnZUlkICAgOlwi5paw55So5oi3OlwiICsgIHN0YWdlSWQsICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VOYW1lIDogc3RhZ2VOYW1lLCAgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgICB1c2VySWQgICAgOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgIC8vICAgICAgICAgICAgIGV2ZW50ICAgICA6IFwicmV2aXZlXCIsICAvL+S9v+eUqOmBk+WFtyAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgICBwYXJhbXMgICAgOiB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgaXRlbU5hbWUgIDogXCLkvb/nlKjlpI3mtLtcIiwvL+S9v+eUqOmBk+WFt+WQjeensCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgICBpdGVtQ291bnQgOiAxLCAgIC8v5L2/55So6YGT5YW35pWw6YePICDlj6/pgIlcbiAgICAgICAgLy8gICAgICAgICAgICAgICBkZXNjICAgICAgOiB1c2VyZXZpdmUgLy/kvb/nlKjpgZPlhbfmj4/ov7BcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgICAgfSlcbiAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgc3RhdGljIGxldmVsU3VjY2VzcyhzdGFnZUlkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQgXG4gICAge1xuICAgICAgICBjb25zb2xlLmxvZyhcIuiusOW9leWFs+WNoTrlrozmiJBcIiArIHN0YWdlSWQpO1xuICAgICAgICAvLyBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdyAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4KSB7XG4gICAgICAgIC8vICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uRW5kKFxuICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VJZDogc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgIHVzZXJJZDogdXNlcklkLCAvL+eUqOaIt0lEIOWPr+mAiVxuICAgICAgICAvLyAgICAgICAgICAgICBldmVudDogXCJjb21wbGV0ZVwiLCAgIC8v5YWz5Y2h5a6M5oiQICDlhbPljaHov5vooYzkuK3vvIznlKjmiLfop6blj5HnmoTmk43kvZwgICAg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgIHBhcmFtczpcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBkZXNjOiBcIuWFs+WNoeWujOaIkFwiICAgLy/mj4/ov7BcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIC8vICAgICApO1xuICAgICAgICAvLyAgICAgaWYoV3hBcGkubmV3YWNjb3VudClcbiAgICAgICAgLy8gICAgIHtcbiAgICAgICAgLy8gICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uRW5kKFxuICAgICAgICAvLyAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBzdGFnZUlkOlwi5paw55So5oi3OlwiICsgc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBzdGFnZU5hbWU6IHN0YWdlTmFtZSwgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdXNlcklkOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBldmVudDogXCJjb21wbGV0ZVwiLCAgIC8v5YWz5Y2h5a6M5oiQICDlhbPljaHov5vooYzkuK3vvIznlKjmiLfop6blj5HnmoTmk43kvZwgICAg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBwYXJhbXM6XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBcIuWFs+WNoeWujOaIkFwiICAgLy/mj4/ov7BcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgIC8vICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIC8vICAgICAgICAgKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHN0YXRpYyBsZXZlbEZhaWwoc3RhZ2VJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIHNjb3JlOiBzdHJpbmcsIGNhcm5hbWU6IHN0cmluZyk6IHZvaWQgXG4gICAge1xuICAgICAgICBjb25zb2xlLmxvZyhcIuiusOW9leWFs+WNoTrlpLHotKVcIiArIHN0YWdlSWQpO1xuICAgICAgICAvLyBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdyAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4KSB7XG4gICAgICAgIC8vICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uRW5kKFxuICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VJZDogc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgIHVzZXJJZDogdXNlcklkLCAvL+eUqOaIt0lEIOWPr+mAiVxuICAgICAgICAvLyAgICAgICAgICAgICBldmVudDogXCJmYWlsXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFyYW1zOlxuICAgICAgICAvLyAgICAgICAgICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5aSx6LSlXCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgc2NvcmU6IHNjb3JlLC8v5o+P6L+wXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgY2FyOiBjYXJuYW1lLy/mj4/ov7BcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICApO1xuICAgICAgICAvLyAgICAgaWYoV3hBcGkubmV3YWNjb3VudClcbiAgICAgICAgLy8gICAgIHtcbiAgICAgICAgLy8gICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uRW5kKFxuICAgICAgICAvLyAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBzdGFnZUlkOlwi5paw55So5oi3OlwiICsgc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBzdGFnZU5hbWU6IHN0YWdlTmFtZSwgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdXNlcklkOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBldmVudDogXCJmYWlsXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHBhcmFtczpcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5aSx6LSlXCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlOiBzY29yZSwvL+aPj+i/sFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjYXI6IGNhcm5hbWUvL+aPj+i/sFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgICk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgT25TaG93KGNiOiBGdW5jdGlvbikge1xuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci53aW5kb3cudHQpIHJldHVybjtcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy50dC5vblNob3coY2IpO1xuICAgIH1cblxuICAgIHN0YXRpYyBPZmZTaG93KGNiOiBGdW5jdGlvbikge1xuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0Lm9mZlNob3coY2IpO1xuICAgIH1cblxuICAgIHN0YXRpYyBDYW5TaGFrZSA9IHRydWU7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBzaGFrZSgpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy50dC52aWJyYXRlU2hvcnQoe30pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHNoYWtlTG9uZygpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy50dC52aWJyYXRlTG9uZyh7fSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBTaGFrZShfc2hvcnQgPSB0cnVlKSBcbiAgICB7XG4gICAgICAgIGlmKExheWEuQnJvd3Nlci53aW5kb3cudHQgJiYgV3hBcGkuQ2FuU2hha2UpIFxuICAgICAgICB7XG4gICAgICAgICAgICBpZihfc2hvcnQpIFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hha2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFrZUxvbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZighX3Nob3J0KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnN0YWdlU2hha2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiDmmK/lkKbpnIfliqjkuK0gKi9cbiAgICBzdGF0aWMgaXNTaGFrZTpib29sZWFuO1xuICAgIHN0YXRpYyB0aW1lcyA9IDEuMztcbiAgICBzdGF0aWMgbnVtOm51bWJlciA9IDA7XG4gICAgc3RhdGljIG9mZnNldEFyciA9IFswLCAwXTtcbiAgICBzdGF0aWMgb2Zmc2V0ID0gMTQ7XG4gICAgc3RhdGljIGNhbnNoYWtlc3RhZ2UgPSBmYWxzZTtcblxuICAgIHN0YXRpYyBzdGFnZVNoYWtlKGNhbGxCYWNrOkZ1bmN0aW9uID0gbnVsbCxzcGVlZDpudW1iZXIgPSAzMik6dm9pZFxuICAgIHtcbiAgICAgICAgaWYodGhpcy5pc1NoYWtlIHx8ICF0aGlzLmNhbnNoYWtlc3RhZ2UpIHJldHVybjtcbiAgICAgICAgdGhpcy5pc1NoYWtlID0gdHJ1ZTtcblxuICAgICAgICB2YXIgcG9pbnQ6TGF5YS5WZWN0b3IyID0gbmV3IExheWEuVmVjdG9yMihMYXlhLnN0YWdlLngsIExheWEuc3RhZ2UueSk7XG4gICAgICAgIExheWEuc3RhZ2UudGltZXJMb29wKHNwZWVkLCB0aGlzLCB0aGlzLnNoYWtlT2JqZWN0LFtwb2ludCxjYWxsQmFja10pO1xuICAgIH1cblxuICAgIHN0YXRpYyBzaGFrZU9iamVjdChfcG9pbnQ6TGF5YS5WZWN0b3IyLF9jYWxsQmFjayk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGNvdW50Om51bWJlciA9ICh0aGlzLm51bSsrKSAlIDQ7XG4gICAgICAgIHRoaXMub2Zmc2V0QXJyW3RoaXMubnVtICUgMl0gPSBjb3VudCA8IDIgPyAwIDogdGhpcy5vZmZzZXQ7XG4gICAgICAgIExheWEuc3RhZ2UueCA9IHRoaXMub2Zmc2V0QXJyWzBdICsgX3BvaW50Lng7XG4gICAgICAgIExheWEuc3RhZ2UueSA9IHRoaXMub2Zmc2V0QXJyWzFdICsgX3BvaW50Lnk7XG5cbiAgICAgICAgaWYodGhpcy5udW0gPiAodGhpcy50aW1lcyAqIDQgKyAxKSlcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5zdGFnZS5jbGVhclRpbWVyKHRoaXMsIHRoaXMuc2hha2VPYmplY3QpO1xuICAgICAgICAgICAgTGF5YS5zdGFnZS5wb3MoMCwwKTtcbiAgICAgICAgICAgIHRoaXMubnVtID0gMDtcbiAgICAgICAgICAgIHRoaXMuaXNTaGFrZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYoX2NhbGxCYWNrICE9IG51bGwpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgX2NhbGxCYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIFNob3dUeHQodGV4dDogc3RyaW5nKSBcbiAgICB7XG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93LnR0KSBcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy50dC5zaG93VG9hc3QoeyB0aXRsZTogdGV4dCB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIFxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFN5c3RlbUZyb20oKTogc3lzdGVtdHlwZSBcbiAgICB7XG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm4gc3lzdGVtdHlwZS5vdGhlcjtcblxuICAgICAgICBsZXQgaW5mbyA9IExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcbiAgICAgICAgdmFyIHN5c3RlbTogc3RyaW5nID0gaW5mby5zeXN0ZW07XG4gICAgICAgIHZhciBJT1MgPSBzeXN0ZW0uaW5kZXhPZihcImlPU1wiKSAhPSAtMTtcbiAgICAgICAgdmFyIEFuZHJvaWQgPSBzeXN0ZW0uaW5kZXhPZihcIkFuZHJvaWRcIikgIT0gLTE7XG5cbiAgICAgICAgaWYgKElPUykge1xuICAgICAgICAgICAgcmV0dXJuIHN5c3RlbXR5cGUuaW9zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFuZHJvaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzeXN0ZW10eXBlLmFuZHJvaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3lzdGVtdHlwZS5vdGhlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgSXNMb25nU2NyZWVuU3lzdGVtKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHN5c3RlbUluZm8gPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XG4gICAgICAgIGxldCBwbGF0Zm9ybU1vZGVsID0gXCJpcHhcIjtcbiAgICAgICAgaWYgKHN5c3RlbUluZm8gIT0gbnVsbCkge1xuICAgICAgICB2YXIgbW9kZWwgPSBzeXN0ZW1JbmZvLm1vZGVsO1xuICAgICAgICBwbGF0Zm9ybU1vZGVsID0gYCR7c3lzdGVtSW5mby5icmFuZH1fJHttb2RlbH1fJHtzeXN0ZW1JbmZvLnN5c3RlbX1fd3gke3N5c3RlbUluZm8udmVyc2lvbn1fU0RLVmVyJHtzeXN0ZW1JbmZvLlNES1ZlcnNpb259YDtcbiAgICAgICAgY29uc29sZS5sb2coXCJwbGF0Zm9ybU1vZGVsOlwiICsgcGxhdGZvcm1Nb2RlbCk7XG4gICAgICAgIHJldHVybiAgIShtb2RlbC5pbmRleE9mKFwiWFwiKSA8IDApIHx8XG4gICAgICAgICgobW9kZWwuaW5kZXhPZihcIm9wcG9cIikgPj0gMCB8fCBtb2RlbC5pbmRleE9mKFwiT1BQT1wiKSA+PSAwKSAmJiAobW9kZWwuaW5kZXhPZihcIlIxNVwiKSA+PSAwIHx8IG1vZGVsLmluZGV4T2YoXCJyMTVcIikgPj0gMCkpIHx8XG4gICAgICAgIHN5c3RlbUluZm8uc3RhdHVzQmFySGVpZ2h0ID4gMjAgfHxcbiAgICAgICAgKG1vZGVsLmluZGV4T2YoXCJOb3RlXCIpID49IDAgJiYgKG1vZGVsLmluZGV4T2YoXCI3XCIpID49IDAgfHwgbW9kZWwuaW5kZXhPZihcIjhcIikgPj0gMCkpIHx8XG4gICAgICAgICgobW9kZWwuaW5kZXhPZihcImlQaG9uZVwiKSA+PSAwKSAmJiAobW9kZWwuaW5kZXhPZihcIjExXCIpID49IDApKVxufVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgd3JpdGVTdGFnZShzdGFnZTogbnVtYmVyKVxuICAgIHtcbiAgICAgICAgdmFyIGt2RGF0YUxpc3QgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdmFyIG15VmFsdWUgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBcInd4Z2FtZVwiOiBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInN0YWdlXCI6IHN0YWdlLFxuICAgICAgICAgICAgICAgIFwidXBkYXRlX3RpbWVcIjogZGF0ZS50b1N0cmluZygpLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBrdkRhdGFMaXN0LnB1c2goe2tleTpcInN0YWdlXCIsIHZhbHVlOiBteVZhbHVlfSk7XG4gICAgICBcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3gpXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2V0VXNlckNsb3VkU3RvcmFnZShcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIEtWRGF0YUxpc3Q6IGt2RGF0YUxpc3QsXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHI9PlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuS8oOWIhuaVsOaIkOWKn1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgY3BWZXJzaW9uR3JlYXRlck9yRXF1YWwodjE6IHN0cmluZywgdjI6IHN0cmluZykgXG4gICAge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0xPR13ln7rnoYDlupPniYjmnKzlj7cgY3VyVmVyOiR7djF9IHRhcmdWZXI6JHt2Mn1gKTtcbiAgICAgICAgbGV0IHYxQXJyID0gdjEuc3BsaXQoXCIuXCIpO1xuICAgICAgICBsZXQgdjJBcnIgPSB2Mi5zcGxpdChcIi5cIik7XG4gICAgICAgIGxldCBsZW4gPSB2MUFyci5sZW5ndGg7XG4gICAgICAgIGlmICh2MkFyci5sZW5ndGggPCBsZW4pIHtcbiAgICAgICAgICAgIGxlbiA9IHYyQXJyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmVyMSA9IE51bWJlcih2MUFycltpXSk7XG4gICAgICAgICAgICBsZXQgdmVyMiA9IE51bWJlcih2MkFycltpXSk7XG4gICAgICAgICAgICBpZiAodmVyMSA+IHZlcjIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZlcjEgPCB2ZXIyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2MUFyci5sZW5ndGggPj0gdjJBcnIubGVuZ3RoO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xuaW1wb3J0IHtTb2NrZXROb2ZpZnl9IGZyb20gXCIuLi9XWFNESy9Tb2NrZXROb2ZpZnlcIjtcblxuZXhwb3J0IGNsYXNzIFNlcnZlclNvY2tldFxue1xuICAgIHByaXZhdGUgc29jazogTGF5YS5Tb2NrZXQ7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6IFNlcnZlclNvY2tldDtcblxuICAgIC8qKlxuICAgICAqIDE66Ieq5Yqo5pat57q/77yMMu+8muS4u+WKqOaWree6v1xuICAgICAqL1xuICAgIHByaXZhdGUgX29mZmxpbmVzdGF0ZTpudW1iZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICog5pat57q/6YeN6L+e5qyh5pWwXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY29ubmV0TnVtczpudW1iZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogc29ja2V06L+e5o6l5LitXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgU2VydmVyU29ja2V0LmlucyA9IHRoaXM7XG4gICAgfVxuICAgIHByaXZhdGUgX3NvY2tldGNvbm5ldGluZzpib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBTZXJ2ZXJTb2NrZXQge1xuICAgICAgICBpZiAoU2VydmVyU29ja2V0LmlucyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlclNvY2tldCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTZXJ2ZXJTb2NrZXQuaW5zO1xuICAgIH1cblxuICAgIC8v6L+e5o6l5pyN5Yqh5ZmoXG4gICAgcHVibGljIGNvbm5lY3RTZXJ2ZXIoZ2FtZUhvc3Q6c3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3NvY2tldGNvbm5ldGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVtb3ZlU29ja2V0KCk7XG4gICAgICAgIGlmICghdGhpcy5zb2NrIHx8ICF0aGlzLnNvY2suY29ubmVjdGVkKSBcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5vcGVud2FpdHBhbmVsKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc29jaykge1xuICAgICAgICAgICAgICAgIHRoaXMuc29jayA9IG5ldyBMYXlhLlNvY2tldCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc29jay5vbihMYXlhLkV2ZW50Lk9QRU4sIHRoaXMsIHRoaXMub25Tb2NrZXRPcGVuKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2sub24oTGF5YS5FdmVudC5NRVNTQUdFLCB0aGlzLCB0aGlzLm9uUmVjZWl2ZU1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc29jay5vbihMYXlhLkV2ZW50LkNMT1NFLCB0aGlzLCB0aGlzLm9uU29ja2V0Q2xvc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc29jay5vbihMYXlhLkV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLmlvRXJybyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2suY29ubmVjdEJ5VXJsKGdhbWVIb3N0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc0Nvbm5lY3QoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnNvY2sgJiYgdGhpcy5zb2NrLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW9FcnJvKGU6IGFueSA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc29ja2V0Y29ubmV0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2Nvbm5ldE51bXMrKztcbiAgICAgICAgdGhpcy5jbG9zZXdhaXRwYW5lbCgpO1xuICAgICAgICB0aGlzLnJlbW92ZVNvY2tldCgpO1xuICAgICAgICB0aGlzLl9vZmZsaW5lc3RhdGU9MTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZVNvY2tldCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX3NvY2tldGNvbm5ldGluZyA9IGZhbHNlO1xuICAgICAgICBpZih0aGlzLnNvY2spXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc29jay5vZmYoTGF5YS5FdmVudC5PUEVOLCB0aGlzLCB0aGlzLm9uU29ja2V0T3Blbik7XG4gICAgICAgICAgICB0aGlzLnNvY2sub2ZmKExheWEuRXZlbnQuTUVTU0FHRSwgdGhpcywgdGhpcy5vblJlY2VpdmVNZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMuc29jay5vZmYoTGF5YS5FdmVudC5DTE9TRSwgdGhpcywgdGhpcy5vblNvY2tldENsb3NlKTtcbiAgICAgICAgICAgIHRoaXMuc29jay5vZmYoTGF5YS5FdmVudC5FUlJPUiwgdGhpcywgdGhpcy5pb0Vycm8pO1xuICAgICAgICAgICAgdGhpcy5zb2NrLmNsZWFuU29ja2V0KCk7XG4gICAgICAgICAgICB0aGlzLnNvY2suY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuc29jayA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmiYvliqjlhbPpl63muLjmiI9zb2NrZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sc2VTb2NrZXQoIG9mZmxpbmVzdGF0ZTpudW1iZXIgPSAxICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMuaXNDb25uZWN0KCkgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmNsb3Nld2FpdHBhbmVsKCk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVNvY2tldCgpO1xuICAgICAgICAgICAgaWYoIG9mZmxpbmVzdGF0ZSAhPSAtMSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb2ZmbGluZXN0YXRlPSBvZmZsaW5lc3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBTb2NrZXROb2ZpZnkuU09DS0VUX0NMT1NFICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU29ja2V0Q2xvc2UoZTogYW55ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zb2NrZXRjb25uZXRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbG9zZXdhaXRwYW5lbCgpO1xuICAgICAgICB0aGlzLl9vZmZsaW5lc3RhdGU9MTtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggU29ja2V0Tm9maWZ5LlNPQ0tFVF9DTE9TRSApO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBjbG9zZXdhaXRwYW5lbCgpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5jbG9zZU1vZGFsV2FpdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb3BlbndhaXRwYW5lbCgpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XG4gICAgfVxuXG5cbiAgICAvL+i/nuaOpeaIkOWKn+i/lOWbnlxuICAgIHByaXZhdGUgb25Tb2NrZXRPcGVuKGV2ZW50OiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Nvbm5ldE51bXMgPSAwO1xuICAgICAgICB0aGlzLmNsb3Nld2FpdHBhbmVsKCk7XG4gICAgICAgIHRoaXMuX29mZmxpbmVzdGF0ZSA9IDA7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoU29ja2V0Tm9maWZ5LlNPQ0tFVF9DT05ORUNUX1NVQ0NFRUQsIG51bGwsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvL+WQkeacjeWKoeerr+WPkemAgea2iOaBr1xuICAgIHB1YmxpYyBzZW5kTWVzc2FnZShhY3Q6IHN0cmluZywgZGF0YTogYW55LCBpc1Nob3dXYWl0OiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICBpZiggdGhpcy5zb2NrICYmIHRoaXMuc29jay5jb25uZWN0ZWQgKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggaXNTaG93V2FpdCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVud2FpdHBhbmVsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiggIWRhdGEgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE9e307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLkFDVElPTiA9IGFjdDtcbiAgICAgICAgICAgIHRoaXMuc29jay5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy/mtojmga/ov5Tlm57lkI7vvIzkvJrlub/mkq3lh7rljrtcbiAgICAvL0dsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwi5L2g5Y+R6YCB55qEY21k5ZCN56ewXCIs55uR5ZCs5pa55rOVLHRoaXMpXG4gICAgcHJpdmF0ZSBvblJlY2VpdmVNZXNzYWdlKG1zZzogYW55ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICB2YXIgc29ja2V0ZGF0YTogYW55ID0gSlNPTi5wYXJzZShtc2cpO1xuXG4gICAgfVxufSIsImV4cG9ydCBjbGFzcyBTb2NrZXROb2ZpZnlcbnsgICBcbiAgICAvKipcbiAgICAgKiBzb2NrZXTov57mjqXmiJDlip9cbiAgICAgKi9cbiAgICBzdGF0aWMgU09DS0VUX0NPTk5FQ1RfU1VDQ0VFRDpzdHJpbmcgPSBcIlNPQ0tFVF9DT05ORUNUX1NVQ0NFRURcIjtcblxuICAgIC8qKlxuICAgICAqIHNvY2tldOWFs+mXrVxuICAgICAqL1xuICAgIHN0YXRpYyBTT0NLRVRfQ0xPU0U6c3RyaW5nID0gXCJTT0NLRVRfQ0xPU0VcIjtcblxuICAgIC8qKlxuICAgICAqIOa4uOaIj+mHjeaWsOi/nuaOpVxuICAgICAqL1xuICAgIHN0YXRpYyBHYW1lX2FnYWluQ29ubmV0U29ja2V0OnN0cmluZyA9IFwiR2FtZV9hZ2FpbkNvbm5ldFNvY2tldFwiO1xufSIsImV4cG9ydCBjbGFzcyBXRUNIQVRFVkVOVCBcbntcbiAgICBcblxuICAgICAvKipcbiAgICAgKiDmuLjmiI/ov5vlhaXlkI7lj7Dkuovku7ZcbiAgICAgKi9cbiAgICBzdGF0aWMgV0VDSEFURVZFTlRfb25oaWRlOnN0cmluZyA9IFwiV0VDSEFURVZFTlRfb25oaWRlXCI7XG5cbiAgICBzdGF0aWMgV0VDSEFURVZFTlRfb25BdWRpb0ludGVycnVwdGlvbkVuZDpzdHJpbmcgPSBcIldFQ0hBVEVWRU5UX29uQXVkaW9JbnRlcnJ1cHRpb25FbmRcIjtcblxuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9sb3NlZm9jdXM6c3RyaW5nID0gXCJXRUNIQVRFVkVOVF9sb3NlZm9jdXNcIjtcbiAgICBzdGF0aWMgV0VDSEFURVZFTlRfZ2V0Zm9jdXM6c3RyaW5nID0gXCJXRUNIQVRFVkVOVF9nZXRmb2N1c1wiO1xuXG4gICAgc3RhdGljIFdFQ0hBVEVWRU5UX3VwZGF0ZVZpZGVvTnVtczpzdHJpbmcgPSBcIldFQ0hBVEVWRU5UX3VwZGF0ZVZpZGVvTnVtc1wiO1xuXG4gICAgLyoqXG4gICAgICog55So5oi35omT54K5XG4gICAgICovXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTAwMjpzdHJpbmcgPSBcIjk4OTEwMDJcIjtcblxuICAgIC8qKlxuICAgICAqIOiOt+WPluWQjuWPsOaVsOaNrlxuICAgICAqL1xuICAgIHN0YXRpYyBtZXNzYWdlXzk4OTExMDE6c3RyaW5nID0gXCI5ODkxMTAxXCI7XG5cbiAgICBzdGF0aWMgV0VDSEFURVZFTlRfbG9naW5TdWNjZWVkOnN0cmluZyA9IFwiV0VDSEFURVZFTlRfbG9naW5TdWNjZWVkXCI7XG4gICAgLyoqXG4gICAgICog5ri45oiP5LuO5ZCO5Y+w5oGi5aSN5pi+56S65LqL5Lu2XG4gICAgICovXG4gICAgc3RhdGljIFdFQ0hBVEVWRU5UX29uc2hvdzpzdHJpbmcgPSBcIldFQ0hBVEVWRU5UX29uc2hvd1wiO1xuXG4gICBcblxuICAgIC8qKlxuICAgICAqIOS7juaUtuiXj+aIluiAhea1rueql+i/m+WFpea4uOaIj1xuICAgICAqL1xuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9mcm9tc2NvcmZrOnN0cmluZyA9IFwiV0VDSEFURVZFTlRfZnJvbXNjb3Jma1wiO1xuXG4gICAgLyoqXG4gICAgICog55m75b2VXG4gICAgICovXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTAwMTpzdHJpbmcgPSBcIjk4OTEwMDFcIjtcbiAgICAvKipcbiAgICAgKiDlub/lkYrngrnlh7tcbiAgICAgKi9cbiAgICBzdGF0aWMgbWVzc2FnZV85ODkxMTAyOnN0cmluZyA9IFwiOTg5MTEwMlwiO1xuICAgIC8qKlxuICAgICAqIOeCueWHu+ehruWumui3s+i9rOWIsOWklumDqOa4uOaIj1xuICAgICAqL1xuICAgIHN0YXRpYyBtZXNzYWdlXzk4OTExMDM6c3RyaW5nID0gXCI5ODkxMTAzXCI7XG59IiwiaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xuaW1wb3J0IHtTZXJ2ZXJIdHRwc30gZnJvbSBcIi4uL1dYU0RLL1NlcnZlckh0dHBzXCI7XG5pbXBvcnQge1dFQ0hBVEVWRU5UfSBmcm9tIFwiLi4vV1hTREsvV0VDSEFURVZFTlRcIjtcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcbmltcG9ydCB7RGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0RhdGVDb250cm9sXCI7XG5pbXBvcnQge0xvY2FsRGF0YUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0xvY2FsRGF0YUNvbnRyb2xcIjtcbmltcG9ydCB7VXNlckRhdGFJbmZvfSBmcm9tIFwiLi4vRGF0YS9Vc2VyRGF0YUluZm9cIjtcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQge0F1ZGlvQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvQXVkaW9Db250cm9sXCI7XG5pbXBvcnQgeyBMYXlvdXRDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvTGF5b3V0Q29udHJvbFwiO1xuaW1wb3J0IHtwaW5ndGFpdXRpbHN9IGZyb20gXCIuLi9XWFNESy9waW5ndGFpdXRpbHNcIjtcblxuLypcbiogbmFtZTtcbiovXG5leHBvcnQgIGNsYXNzIFdYR2FtZVBsYXRmb3JtXG57XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOldYR2FtZVBsYXRmb3JtO1xuXG4gICAgc3RhdGljIGNvZGU6c3RyaW5nO1xuICAgIHN0YXRpYyBuaWNrTmFtZTpzdHJpbmc7XG4gICAgc3RhdGljIFF1RGFvSUQ6c3RyaW5nID0gXCJcIjsvL+W+ruS/oeW5v+WRiklEXG5cbiAgICBzdGF0aWMgaXNTaG93aW5nOmJvb2xlYW49dHJ1ZTtcbiAgICAvKipcbiAgICAgKiDmjojmnYPnirbmgIEgMDrmnKrliKTmlq3vvIwx77ya5bey5o6I5p2DXG4gICAgICovXG4gICAgc3RhdGljIGFjY3JlZGl0c3RhdGU6bnVtYmVyID0gMDtcblxuICAgIC8qKlxuICAgICAqIOW9k+WkqeWIhuS6q+asoeaVsFxuICAgICAqL1xuICAgIHN0YXRpYyBkYXlTaGFyZU51bTpudW1iZXIgPSAwO1xuICAgIC8qKlxuICAgICAqIOW9k+Wkqeeci+inhumikeasoeaVsFxuICAgICAqL1xuICAgIHN0YXRpYyBkYXlWaWRlb051bTpudW1iZXIgPSAwO1xuICAgIC8qKlxuICAgICAqIOWIpOaWreWIhuS6q+aYr+WQpuaIkOWKn+aXtumXtOmXtOmalFxuICAgICAqL1xuICAgIHN0YXRpYyBTaGFyZVRpbWU6bnVtYmVyID0gMDtcbiAgICAvKipcbiAgICAgKiDmr4/ml6XmnIDlpKfnnIvop4bpopHmrKHmlbDvvIjmiJDlip/ntK/liqDkuIDmrKHvvIlcbiAgICAgKi9cbiAgICBzdGF0aWMgVmlkZW9OdW06bnVtYmVyID0gMDtcbiAgICAvKipcbiAgICAgKiDnnIvop4bpopHlhrfljbTml7bpl7RcbiAgICAgKi9cbiAgICBzdGF0aWMgVmlkZW9UaW1lOm51bWJlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiA45aW95L2NY3Bh5Y+v5by55Ye65pe26Ze06Ze06ZqUKOenkilcbiAgICAgKi9cbiAgICBzdGF0aWMgamlsaXdlaXRpbWU6bnVtYmVyID0gMTAwO1xuICAgIC8qKlxuICAgICAqIOWIhuS6q+WHoOasoeWIh+aNouWIsOinhumikVxuICAgICAqL1xuICAgIHN0YXRpYyBTaGFyZXRvVmlkZW86bnVtYmVyID0gMTtcblxuICAgIC8qKlxuICAgICAqIOinhumikeWHoOasoeWIh+aNouWIsOWIhuS6q1xuICAgICAqL1xuICAgIHN0YXRpYyBWaWRlb3RvU2hhcmU6bnVtYmVyID0gMTtcblxuICAgIC8qKlxuICAgICAqIOWIhuS6q+aVsOaNruWuueWZqFxuICAgICAqL1xuICAgIHN0YXRpYyBTaGFyZURpY3Q6YW55ID0ge307XG5cbiAgICAvKipcbiAgICAgKiDnlKjmiLfmnaXmupBpZFxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tc2NlbmU6bnVtYmVyID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmlucyA9IHRoaXM7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOldYR2FtZVBsYXRmb3JtXG4gICAge1xuICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uaW5zID09IG51bGwgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFdYR2FtZVBsYXRmb3JtKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdYR2FtZVBsYXRmb3JtLmlucztcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCgpOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuc2hvd1NoYXJlTWVudSh7d2l0aFNoYXJlVGlja2V0OnRydWV9KTtcbiAgICAgICAgdGhpcy5vbkF1ZGlvSW50ZXJydXB0aW9uQmVnaW4oKTtcbiAgICAgICAgdGhpcy5vbkF1ZGlvSW50ZXJydXB0aW9uRW5kKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXRTaGFyZURpYW4oIGRhdGE6QXJyYXk8YW55PiApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBpdGVtZDphbnk7XG4gICAgICAgICAgICBmb3IoIHZhciBzIGluIGRhdGEgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGl0ZW1kID0gZGF0YVtzXTtcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5TaGFyZURpY3RbaXRlbWQua2V5XSA9IGl0ZW1kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGZpcnN0ZDphbnkgPSBkYXRhWzBdO1xuICAgICAgICAgICAgdGhpcy5vblNoYXJlQXBwTWVzc2FnZShmaXJzdGQudGlsZSxHbG9iYWwuY2RudXJsICsgZmlyc3RkLmltZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdERhdGEoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggRGF0ZUNvbnRyb2wuRnJlc2ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlTaGFyZU51bT0wO1xuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW09MDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGF5U2hhcmVJbmZvKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURheVZpZGVvSW5mbygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW09TG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5nZXRudW0oVXNlckRhdGFJbmZvLm5vd2RheVNoYXJlKTtcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtPUxvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuZ2V0bnVtKFVzZXJEYXRhSW5mby5ub3dkYXlWaWRlbyk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWtmOWCqOW9k+WkqeWIhuS6q+eahOS/oeaBr1xuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVEYXlTaGFyZUluZm8oKTp2b2lkXG4gICAge1xuICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLm5vd2RheVNoYXJlLFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtLnRvU3RyaW5nKCkgKTtcblxuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVEYXlWaWRlb0luZm8oKTp2b2lkXG4gICAge1xuICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLm5vd2RheVZpZGVvLFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtLnRvU3RyaW5nKCkgKTtcblxuICAgIH1cblxuICAgIHB1YmxpYyB1c2VyaW5mb2J1dHRvbjtcbiAgICBzdGF0aWMgbG9naW5DYWxsb2JqOmFueTtcbiAgICBzdGF0aWMgbG9naW5zdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb247XG4gICAgc3RhdGljIGxvZ2lucHJvZ3Jlc3NDYWxsYmFjazpGdW5jdGlvbjtcbiAgICBwdWJsaWMgY3JlYXRlVXNlckFuZExvZ2luKCBjYWxsb2JqOmFueSxzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb24scHJvZ3Jlc3NDYWxsYmFjazpGdW5jdGlvbiA9bnVsbCwgZmFpbGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwgKTp2b2lkXG4gICAge1xuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmogPSBjYWxsb2JqO1xuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5sb2dpbnN1Y2NlZWRjYWxsYmFjayA9IHN1Y2NlZWRjYWxsYmFjaztcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrID0gcHJvZ3Jlc3NDYWxsYmFjaztcbiAgICAgICAgdmFyIHd4OmFueSA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XG4gICAgICAgIGlmKCB3eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBsb2dpbl9pbmZvOmFueSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmdldExhdW5jaE9wdGlvbnNTeW5jKCk7XG4gICAgICAgICAgICBpZihsb2dpbl9pbmZvKVxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbGV0IHF1ZXJ5ID1sb2dpbl9pbmZvLnF1ZXJ5O1xuICAgICAgICAgICAgICAgIGlmKHF1ZXJ5ICYmIHF1ZXJ5LkNoYW5JRCl7XG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLlF1RGFvSUQgPSBxdWVyeS5DaGFuSUQ7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlZmVycmVySW5mbyA9IGxvZ2luX2luZm8ucmVmZXJyZXJJbmZvO1xuICAgICAgICAgICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEID09IFwiXCIgJiYgcmVmZXJyZXJJbmZvICYmIHJlZmVycmVySW5mby5hcHBJZCApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEID0gcmVmZXJyZXJJbmZvLmFwcElkO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKCBsb2dpbl9pbmZvLnNjZW5lIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmZyb21zY2VuZSA9IE51bWJlciggbG9naW5faW5mby5zY2VuZSApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzeXN0ZW1yZXMgPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBzeXN0ZW1yZXMuU0RLVmVyc2lvbjtcbiAgICAgICAgICAgIGlmICh3eC5nZXRVcGRhdGVNYW5hZ2VyKSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgdXBkYXRlTWFuYWdlciA9IHd4LmdldFVwZGF0ZU1hbmFnZXIoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVNYW5hZ2VyLm9uQ2hlY2tGb3JVcGRhdGUoZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgICAgICAvLyDor7fmsYLlrozmlrDniYjmnKzkv6Hmga/nmoTlm57osINcblxuICAgICAgICAgICAgICAgICAgICBpZiggcmVzLmhhc1VwZGF0ZT09dHJ1ZSApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIub25VcGRhdGVSZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93TW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+abtOaWsOaPkOekuicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfmlrDniYjmnKzlt7Lnu4/lh4blpIflpb3vvIzmmK/lkKbph43lkK/lupTnlKjvvJ8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmNvbmZpcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmlrDnmoTniYjmnKzlt7Lnu4/kuIvovb3lpb3vvIzosIPnlKggYXBwbHlVcGRhdGUg5bqU55So5paw54mI5pys5bm26YeN5ZCvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5hcHBseVVwZGF0ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5leGl0R2FtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZUZhaWxlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5paw54mI5pys5LiL6L295aSx6LSlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuZXhpdEdhbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiAmJiBXWEdhbWVQbGF0Zm9ybS5sb2dpbnByb2dyZXNzQ2FsbGJhY2sgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIFdYR2FtZVBsYXRmb3JtLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjay5jYWxsKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmosMTAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eHBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLmxvZ2luKGNhbGxvYmosc3VjY2VlZGNhbGxiYWNrLGZhaWxjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGlmKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmogJiYgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrIClcbiAgICAgICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAgICAgLy8gICAgIFdYR2FtZVBsYXRmb3JtLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjay5jYWxsKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmosMTAgKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcbiAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLmxvZ2luKGNhbGxvYmosc3VjY2VlZGNhbGxiYWNrLGZhaWxjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1c2VyaW5mb2NhbGxvYmo6YW55O1xuICAgIHVzZXJpbmZvc3VjY2FsbGJhY2s6RnVuY3Rpb247XG4gICAgdXNlcmluZm9mYWlsY2FsbGJhY2s6RnVuY3Rpb247XG4gICAgcHVibGljIGNyZWF0ZVVzZXJJbmZvQnV0dG9uKCAgY2FsbG9iajphbnksY2FsbGJhY2s6RnVuY3Rpb24sZmFpbGNhbGxiYWNrOkZ1bmN0aW9uKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLnVzZXJpbmZvY2FsbG9iaiA9IGNhbGxvYmo7XG4gICAgICAgIHRoaXMudXNlcmluZm9zdWNjYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLnVzZXJpbmZvZmFpbGNhbGxiYWNrID0gZmFpbGNhbGxiYWNrO1xuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICBsZXQgcmVzID0gd3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcbiAgICAgICAgaWYoIHJlcyApXG4gICAgICAgIHtcblxuICAgICAgICAgICAgdmFyIHBvc3g6bnVtYmVyID0gKHJlcy53aW5kb3dXaWR0aC0xNTEpLzI7XG4gICAgICAgICAgICB2YXIgcG9zeTpudW1iZXIgPSByZXMud2luZG93SGVpZ2h0LTE3MiAtIDQwO1xuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudXNlcmluZm9idXR0b24gPSB3eC5jcmVhdGVVc2VySW5mb0J1dHRvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAgICAgICAgICAgIGltYWdlOid3eGxvY2FsL2xvZ2luLnBuZycsXG4gICAgICAgICAgICAgICAgc3R5bGU6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBwb3N4LFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHBvc3ksXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxNTEsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogNzJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnVzZXJpbmZvYnV0dG9uLm9uVGFwKCBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS51c2VyaW5mb0J1dHRvbkNsaWNrICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblt7Lnu4/mjojmnYNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0YWNjcmVkaXQoIGNhbGxvYmo6YW55LGFjY3JlZGl0Q2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uYWNjcmVkaXRzdGF0ZSA9PSAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgICAgIGlmKCB3eCApXG4gICAgICAgICAgICB7ICAgXG4gICAgICAgICAgICAgICAgd3guZ2V0U2V0dGluZyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgKHJlcykgXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtZCA9IHJlcy5hdXRoU2V0dGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpdGVtZC5oYXNPd25Qcm9wZXJ0eSggXCJzY29wZS51c2VySW5mb1wiICkgJiYgaXRlbWRbXCJzY29wZS51c2VySW5mb1wiXSA9PSB0cnVlICkgLy/lt7Lnu4/mjojmnYPov4dcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhY2NyZWRpdENhbGxiYWNrJiZjYWxsb2JqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjcmVkaXRDYWxsYmFjay5jYWxsKCBjYWxsb2JqLHRydWUgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3JlZGl0Q2FsbGJhY2suY2FsbCggY2FsbG9iaixmYWxzZSApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKGFjY3JlZGl0Q2FsbGJhY2smJmNhbGxvYmopXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosdHJ1ZSApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKGFjY3JlZGl0Q2FsbGJhY2smJmNhbGxvYmopXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWNjcmVkaXRDYWxsYmFjay5jYWxsKCBjYWxsb2JqLHRydWUgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB1c2VyaW5mb0J1dHRvbkNsaWNrKCByZXM6YW55ICk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcblxuICAgICAgICBpZiggcmVzIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGVyck1zZzpzdHJpbmcgPSByZXMuZXJyTXNnO1xuICAgICAgICAgICAgaWYoIGVyck1zZyA9PSBcImdldFVzZXJJbmZvOm9rXCIgKVxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uYWNjcmVkaXRzdGF0ZSA9IDE7XG4gICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5jbG9zZXVzZXJpbmZvYlV0dG9uKCk7XG4gICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5nZXRVc2VySW5mbyggZmFsc2Usd3hwbGF0Zm9ybS51c2VyaW5mb2NhbGxvYmosd3hwbGF0Zm9ybS51c2VyaW5mb3N1Y2NhbGxiYWNrLHd4cGxhdGZvcm0udXNlcmluZm9mYWlsY2FsbGJhY2sgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIGlmKCB3eHBsYXRmb3JtLnVzZXJpbmZvY2FsbG9iaiAmJiB3eHBsYXRmb3JtLnVzZXJpbmZvZmFpbGNhbGxiYWNrIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9mYWlsY2FsbGJhY2suY2FsbCggd3hwbGF0Zm9ybS51c2VyaW5mb2NhbGxvYmogKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2V1c2VyaW5mb2JVdHRvbigpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciB3eHBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgIGlmKHd4cGxhdGZvcm0udXNlcmluZm9idXR0b24pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9idXR0b24ub2ZmVGFwKHd4cGxhdGZvcm0udXNlcmluZm9CdXR0b25DbGljayk7XG4gICAgICAgICAgICB3eHBsYXRmb3JtLnVzZXJpbmZvYnV0dG9uLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9idXR0b249bnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVc2VySW5mbyggaXNsb2dpbjpib29sZWFuLGNhbGxvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcbiAgICB7XG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3Quc2hvd01vZGFsV2FpdCgpO1xuICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICBpZiggd3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICB3eC5nZXRVc2VySW5mbyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXJJbmZvID0gcmVzLnVzZXJJbmZvO1xuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5uaWNrTmFtZSA9IHVzZXJJbmZvLm5pY2tOYW1lO1xuICAgICAgICAgICAgICAgICAgICBpZiggaXNsb2dpbiApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0ubG9naW4oY2FsbG9iaixjYWxsYmFjayxmYWlsY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGxvYmogJiYgY2FsbGJhY2sgKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoIGNhbGxvYmosV1hHYW1lUGxhdGZvcm0ubmlja05hbWUgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnmbvlvZVcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxuICAgICAqIEBwYXJhbSBmYWlsQ2FsbGJhY2sgXG4gICAgICovXG4gICAgcHVibGljIGxvZ2luKCBjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gubG9naW4oe1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uICggcmVzICkgXG4gICAgICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmNvZGUgPSByZXMuY29kZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1kOmFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uUXVEYW9JRCAhPSBcIlwiIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbWQuQ2hhbklEID0gV1hHYW1lUGxhdGZvcm0uUXVEYW9JRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpdGVtZC5Db2RlID0gV1hHYW1lUGxhdGZvcm0uY29kZTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbWQuQXBwSUQgPSBHbG9iYWwuYXBwaWQ7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1kLlZlcnNpb24gPSBHbG9iYWwuZ2FtZVZlcnNpb247XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmYWlsOmZ1bmN0aW9uKHJlcyl7XG5cbiAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbiggY2FsbG9iaixjYWxsYmFjayxmYWlsY2FsbGJhY2sgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dpblN1Y2NlZWRDYWxsYmFjayggZGF0YTphbnkgKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0ubG9naW5DYWxsb2JqICYmIFdYR2FtZVBsYXRmb3JtLmxvZ2luc3VjY2VlZGNhbGxiYWNrIClcbiAgICAgICAge1xuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5zdWNjZWVkY2FsbGJhY2suY2FsbCggV1hHYW1lUGxhdGZvcm0ubG9naW5DYWxsb2JqLGRhdGEgKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHVibGljIF9zdWJjYWxsb2JqOmFueTtcbiAgICBwdWJsaWMgX3N1YmNhbGxiYWNrOkZ1bmN0aW9uO1xuICAgIHB1YmxpYyBfdXBkYXRlY2FsbGJhY2s6RnVuY3Rpb247XG4gICAgcHVibGljIF9zdWJmYWlsY2FsbGJhY2s6RnVuY3Rpb247XG4gICAgcHVibGljIGxvYWRTdWJwYWNrYWdlKCBuYW1lOnN0cmluZyxzdWJjYWxsb2JqOmFueSxzdWJjYWxsYmFjazpGdW5jdGlvbix1cGRhdGVjYWxsYmFjazpGdW5jdGlvbixzdWJmYWlsY2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YmNhbGxvYmogPSBzdWJjYWxsb2JqO1xuICAgICAgICAgICAgdGhpcy5fc3ViY2FsbGJhY2sgPSBzdWJjYWxsYmFjaztcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWNhbGxiYWNrID0gdXBkYXRlY2FsbGJhY2s7XG4gICAgICAgICAgICB0aGlzLl9zdWJmYWlsY2FsbGJhY2sgPSBzdWJmYWlsY2FsbGJhY2s7XG4gICAgICAgICAgICB2YXIgd3g6YW55ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgICAgIGlmKCB3eC5sb2FkU3VicGFja2FnZSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZFRhc2sgPSB3eC5sb2FkU3VicGFja2FnZSh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6bmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDliIbljIXliqDovb3miJDlip/lkI7pgJrov4cgc3VjY2VzcyDlm57osINcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHd4Z2FtZVBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxiYWNrICYmIHd4Z2FtZVBsYXRmb3JtLl9zdWJjYWxsb2JqIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDliIbljIXliqDovb3lpLHotKXpgJrov4cgZmFpbCDlm57osINcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLl9zdWJmYWlsY2FsbGJhY2sgJiYgd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLl9zdWJmYWlsY2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pOyAgXG4gICAgICAgICAgICAgICAgaWYobG9hZFRhc2sub25Qcm9ncmVzc1VwZGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRUYXNrLm9uUHJvZ3Jlc3NVcGRhdGUocmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLl91cGRhdGVjYWxsYmFjayAmJiB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbG9iaiApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3hnYW1lUGxhdGZvcm0uX3VwZGF0ZWNhbGxiYWNrLmNhbGwoIHd4Z2FtZVBsYXRmb3JtLl9zdWJjYWxsb2JqLHJlcy5wcm9ncmVzcyApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiggc3ViY2FsbG9iaiAmJiBzdWJjYWxsYmFjayApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdWJjYWxsYmFjay5jYWxsKCBzdWJjYWxsb2JqICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIHN1YmNhbGxvYmogJiYgc3ViY2FsbGJhY2sgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN1YmNhbGxiYWNrLmNhbGwoIHN1YmNhbGxvYmogKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiOt+WPlui9rOWPkeivpue7huS/oeaBr1xuICAgICAqIEBwYXJhbSBvYmogXG4gICAgICogQHBhcmFtIGNhbGxvYmogXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcbiAgICAgKiBAcGFyYW0gZmFpbENhbGxiYWNrIFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTaGFyZUluZm8oIG9iajphbnksY2FsbG9iajphbnksIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbixmYWlsQ2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsIClcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTaGFyZUluZm8oe1xuICAgICAgICAgICAgICAgIHNoYXJlVGlja2V0Om9iai5zaGFyZVRpY2tldCxcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmoscmVzICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOebkeWQrOeUqOaIt+eCueWHu+WPs+S4iuinkuiPnOWNleeahOKAnOi9rOWPkeKAneaMiemSruaXtuinpuWPkeeahOS6i+S7tlxuICAgICAqIEBwYXJhbSB0aXRsZSBcbiAgICAgKiBAcGFyYW0gaW1hZ2VVcmwgXG4gICAgICovXG4gICAgcHVibGljIG9uU2hhcmVBcHBNZXNzYWdlKCB0aXRsZTpzdHJpbmcsaW1hZ2VVcmw6c3RyaW5nICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uU2hhcmVBcHBNZXNzYWdlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTp0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VVcmw6aW1hZ2VVcmxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Li75Yqo5ouJ6LW36L2s5Y+R77yM6L+b5YWl6YCJ5oup6YCa6K6v5b2V55WM6Z2i44CCXG4gICAgICogQHBhcmFtIHRpdGxlIFxuICAgICAqIEBwYXJhbSBpbWFnZVVybCBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2hhcmVBcHBNZXNzYWdlKCBkOmFueSApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaGFyZUFwcE1lc3NhZ2UoZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmmL7npLrlvZPliY3pobXpnaLnmoTovazlj5HmjInpkq5cbiAgICAgKiBAcGFyYW0gb2JqIFxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93U2hhcmVNZW51KCBvYmo6YW55ID0gbnVsbCApOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93U2hhcmVNZW51KG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmm7TmlrDovazlj5HlsZ7mgKdcbiAgICAgKiBAcGFyYW0gb2JqIFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVTaGFyZU1lbnUoIG9iajphbnkgPSBudWxsICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnVwZGF0ZVNoYXJlTWVudShvYmopO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pi+56S65b2T5YmN6aG16Z2i55qE6L2s5Y+R5oyJ6ZKuXG4gICAgICovXG4gICAgcHVibGljIHNob3dNZW51KCkgXG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1NoYXJlTWVudSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pys5Zyw5a2Y5YKoXG4gICAgICogQHBhcmFtIGtleSBcbiAgICAgKiBAcGFyYW0gZGF0YSBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U3RvcmFnZVN5bmMoa2V5OnN0cmluZywgZGF0YTphbnkpIFxuICAgIHtcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgaWYoIHd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgd3guc2V0U3RvcmFnZVN5bmMoa2V5LCBkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiDojrflj5bmnKzlnLDlrZjlgqhcbiAgICAgKiBAcGFyYW0ga2V5IFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTdG9yYWdlU3luYyhrZXk6c3RyaW5nKTphbnkgXG4gICAge1xuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICBpZiggd3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gd3guZ2V0U3RvcmFnZVN5bmMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VXNlckNsb3VkU3RvcmFnZShvYmosY2FsbG9iajphbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCkgXG4gICAge1xuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICBpZiggd3ggJiYgd3guc2V0VXNlckNsb3VkU3RvcmFnZSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHd4LnNldFVzZXJDbG91ZFN0b3JhZ2Uoe1xuICAgICAgICAgICAgICAgIEtWRGF0YUxpc3Q6IG9iaixcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKHN1Y2NlZWRjYWxsYmFjaylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmoscmVzICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoZmFpbENhbGxiYWNrKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsQ2FsbGJhY2suY2FsbCggY2FsbG9iaiApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmmL7npLrmtojmga/mj5DnpLrmoYZcbiAgICAgKiBAcGFyYW0gd29yZCBcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9hc3Qod29yZDpzdHJpbmcpOnZvaWQgXG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1RvYXN0KHsgdGl0bGU6IHdvcmQgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkJHlvIDmlL7mlbDmja7ln5/lj5HpgIHmtojmga9cbiAgICAgKiBAcGFyYW0gb2JqIFxuICAgICAqL1xuICAgIHB1YmxpYyBwb3N0TWVzc2FnZShzdHI6c3RyaW5nLGRhdGE6YW55PW51bGwpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XG4gICAgICAgIGlmKCB3eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gd3guZ2V0T3BlbkRhdGFDb250ZXh0KCk7XG4gICAgICAgICAgICBjb250ZXh0LnBvc3RNZXNzYWdlKHsgYWN0aW9uOiBzdHIsZGF0YTpkYXRhIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yib5bu65LiA5LiqIElubmVyQXVkaW9Db250ZXh0IOWunuS+i1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVJbm5lckF1ZGlvQ29udGV4dCgpOmFueVxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVJbm5lckF1ZGlvQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiOt+WPluezu+e7n+S/oeaBr1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTeXN0ZW1JbmZvU3luYygpOmFueVxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmihOiniOWbvueJh++8jOiwg+eUqOS5i+WQjuS8muWcqOaWsOaJk+W8gOeahOmhtemdouS4reWFqOWxj+mihOiniOS8oOWFpeeahOWbvueJh++8jOmihOiniOeahOi/h+eoi+S4reeUqOaIt+WPr+S7pei/m+ihjOS/neWtmOWbvueJh+OAgeWPkemAgee7meaci+WPi+etieaTjeS9nFxuICAgICAqIEBwYXJhbSBvYmogXG4gICAgICovXG4gICAgcHVibGljIHByZXZpZXdJbWFnZShvYmopIFxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnByZXZpZXdJbWFnZShvYmopO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog55uR5ZCs5bCP5ri45oiP6ZqQ6JeP5Yiw5ZCO5Y+w5LqL5Lu244CC6ZSB5bGP44CB5oyJIEhPTUUg6ZSu6YCA5Yiw5qGM6Z2i44CB5pi+56S65Zyo6IGK5aSp6aG26YOo562J5pON5L2c5Lya6Kem5Y+R5q2k5LqL5Lu244CCXG4gICAgICogQHBhcmFtIGNhbGxvYmogXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcbiAgICAgKi9cbiAgICBwdWJsaWMgb25IaWRlKGNhbGxvYmo6YW55LCBzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5vbkhpZGUoZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmlzU2hvd2luZz1mYWxzZTtcbiAgICAgICAgICAgICAgICBpZihzdWNjZWVkY2FsbGJhY2smJmNhbGxvYmopXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZWVkY2FsbGJhY2suY2FsbChjYWxsb2JqLCByZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDov5Tlm57lsI/nqIvluo/lkK/liqjlj4LmlbBcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMYXVuY2hPcHRpb25zU3luYygpOmFueVxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRMYXVuY2hPcHRpb25zU3luYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDpmpDol4/mtojmga/mj5DnpLrmoYZcbiAgICAgKiBAcGFyYW0gb2JqIFxuICAgICAqL1xuICAgIHB1YmxpYyBoaWRlVG9hc3Qob2JqKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guaGlkZVRvYXN0KG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmmL7npLrmqKHmgIHlr7nor53moYZcbiAgICAgKiBAcGFyYW0gb2JqIFxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93TW9kYWwob2JqKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd01vZGFsKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcblxuICAgIC8qKlxuICAgICAqIOa4heeQhuWtmOWCqOaVsOaNrlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclN0b3JhZ2UoKTp2b2lkXG4gICAge1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guY2xlYXJTdG9yYWdlU3luYygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5L2/5omL5py65Y+R55Sf6L6D55+t5pe26Ze055qE5oyv5Yqo77yIMTUgbXPvvIlcbiAgICAgKiBAcGFyYW0gb2JqIFxuICAgICAqL1xuICAgIHB1YmxpYyB2aWJyYXRlU2hvcnQoKSBcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC52aWJyYXRlU2hvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS7juacrOWcsOe8k+WtmOS4reenu+mZpOaMh+WumiBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IFxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVTdG9yYWdlKGtleTpzdHJpbmcpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5yZW1vdmVTdG9yYWdlKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25BdWRpb0ludGVycnVwdGlvbkJlZ2luKCk6dm9pZHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKXtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25BdWRpb0ludGVycnVwdGlvbkJlZ2luKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgLy8gU291bmRzc01hbmFnZXIuSW5zdGFuY2UucGxheWJnU291bmQoXCJiZ21cIik7XG4gICAgICAgICAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLkNsZWFyQWxsU09VTkQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uQXVkaW9JbnRlcnJ1cHRpb25FbmQoKTp2b2lke1xuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApe1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5vbkF1ZGlvSW50ZXJydXB0aW9uRW5kKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgdmFyIHd4Z2FtZXBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5jbGVhciggd3hnYW1lcGxhdGZvcm0sd3hnYW1lcGxhdGZvcm0ub25BdWRpb0VuZENhbGxiYWNrICk7XG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKCA1MDAsd3hnYW1lcGxhdGZvcm0sd3hnYW1lcGxhdGZvcm0ub25BdWRpb0VuZENhbGxiYWNrICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkF1ZGlvRW5kQ2FsbGJhY2soKTp2b2lkXG4gICAge1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9vbkF1ZGlvSW50ZXJydXB0aW9uRW5kICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6YCA5Ye65ri45oiPXG4gICAgICovXG4gICAgcHVibGljIGV4aXRHYW1lKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgaWYoIHd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgd3guZXhpdE1pbmlQcm9ncmFtKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmiZPlvIDlrqLmnI3lr7nor53moYZcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlbkN1c3RvbWVyU2VydmljZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XG4gICAgICAgIGlmICh3eClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHZlcnNpb24gPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpLlNES1ZlcnNpb247XG4gICAgICAgICAgICBpZiggR2FtZVV0aWxzLmNvbXBhcmVWZXJzaW9uKHZlcnNpb24sICcyLjAuMycpID49IDAgJiYgd3gub3BlbkN1c3RvbWVyU2VydmljZUNvbnZlcnNhdGlvbiApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd3gub3BlbkN1c3RvbWVyU2VydmljZUNvbnZlcnNhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlQ2FyZDp0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZUltZzpcImh0dHBzOi8vcmVzb3VyY2UuNTF5b3lveW8uY29tL3Jlcy93eHNlbmRtZXNzYWdlaW1nL3NtaS5qcGdcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIEFsZXJ0VXRpbHMuc2hvd1dvcmRUaXBzKFwi5b2T5YmN5b6u5L+h54mI5pys5LiN5pSv5oyBXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog55uR5ZCs5YaF5a2Y5LiN6Laz5ZGK6K2mXG4gICAgICovXG4gICAgcHVibGljIG9uTWVtb3J5V2FybmluZygpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XG4gICAgICAgIGlmKCB3eCAmJiB3eC5vbk1lbW9yeVdhcm5pbmcgKVxuICAgICAgICB7XG4gICAgICAgICAgICB3eC5vbk1lbW9yeVdhcm5pbmcoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkVycm9yKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgaWYoIHd4ICYmIHd4Lm9uRXJyb3IgKVxuICAgICAgICB7XG4gICAgICAgICAgICB3eC5vbkVycm9yKGZ1bmN0aW9uKCByZXMgKXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqb25FcnJvclwiLHJlcyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIG5vd1NoYXJlaW5kZXg6bnVtYmVyID0gMDtcbiAgICBwdWJsaWMgbm93c2hhcmVPYmo6YW55O1xuICAgIHB1YmxpYyBub3dzaGFyZXN1Y2NlZWRmdW46RnVuY3Rpb247XG4gICAgcHVibGljIG5vd3NoYXJlZmFpbGZ1bjpGdW5jdGlvbjtcbiAgICBwdWJsaWMgbm93c2hhcmVpbmZvOmFueTtcbiAgICBwdWJsaWMgc3RhcnRTaGFyZVRpbWU6bnVtYmVyO1xuICAgIHB1YmxpYyBpc1NoYXJlaW5nOmJvb2xlYW4gPSBmYWxzZTtcbiAgICBzdGF0aWMgY2FsbGJhY2tmYWlsc3RhdGU6bnVtYmVyID0gMDtcbiAgICAvKipcbiAgICAgKiDlvIDlp4vliIbkuqtcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhcnRTaGFyZUFwcChrZXk6c3RyaW5nLGNhbGxvYmo6YW55PW51bGwsc3VjY2VlZENhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCk6dm9pZFxuICAgIHtcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubm93U2hhcmVpbmRleD0wO1xuICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uU2hhcmVEaWN0W2tleV0gKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnNoYXJlQXBwKCBXWEdhbWVQbGF0Zm9ybS5TaGFyZURpY3Rba2V5XSxjYWxsb2JqLHN1Y2NlZWRDYWxsYmFjayxmYWlsQ2FsbGJhY2sgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2hhcmVBcHAoaW5mbzphbnksY2FsbG9iajphbnksIHN1Y2Nlc3M6IEZ1bmN0aW9uLGZhaWxDYWxsYmFjazpGdW5jdGlvbikgXG4gICAge1xuICAgICAgICB0aGlzLm5vd3NoYXJlT2JqID0gY2FsbG9iajtcbiAgICAgICAgdGhpcy5ub3dzaGFyZWluZm8gPSBpbmZvO1xuICAgICAgICB0aGlzLm5vd3NoYXJlc3VjY2VlZGZ1biA9IHN1Y2Nlc3M7XG4gICAgICAgIHRoaXMubm93c2hhcmVmYWlsZnVuID0gZmFpbENhbGxiYWNrO1xuICAgICAgICB0aGlzLnN0YXJ0U2hhcmVUaW1lID0gTGF5YS5Ccm93c2VyLm5vdygpO1xuICAgICAgICB0aGlzLmlzU2hhcmVpbmcgPSB0cnVlO1xuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5jYWxsYmFja2ZhaWxzdGF0ZSA9IDA7XG4gICAgICAgIHRoaXMuc2hhcmVBcHBNZXNzYWdlKHtcbiAgICAgICAgICAgIHRpdGxlOmluZm8udGlsZSxpbWFnZVVybDpHbG9iYWwuY2RudXJsICsgaW5mby5pbWcscXVlcnk6XCJcIixcbiAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24gKHJlcylcbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAocmVzKXtcbiAgICAgICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKFwi5oKo5Y+W5raI5LqG5YiG5LqrXCIpO1xuICAgICAgICAgICAgICAgIGlmIChmYWlsQ2FsbGJhY2sgJiYgY2FsbG9iaiApIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbENhbGxiYWNrLmNhbGwoY2FsbG9iaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5jYWxsYmFja2ZhaWxzdGF0ZSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuICAgICAgICBcblxuICAgIHB1YmxpYyBzaG93b2JqOmFueTtcbiAgICBwdWJsaWMgc2hvd0NhbGxiYWNrOkZ1bmN0aW9uO1xuICAgIC8qKlxuICAgICAqIOebkeWQrOWwj+a4uOaIj+WbnuWIsOWJjeWPsOeahOS6i+S7tlxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxuICAgICAqIEBwYXJhbSBzdWNjZWVkY2FsbGJhY2sgXG4gICAgICogQHBhcmFtIGZhaWxDYWxsYmFjayBcbiAgICAgKi9cbiAgICBwdWJsaWMgb25TaG93KGNhbGxvYmo6YW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwpIFxuICAgIHtcbiAgICAgICAgdGhpcy5zaG93b2JqID0gY2FsbG9iajtcbiAgICAgICAgdGhpcy5zaG93Q2FsbGJhY2sgPSBzdWNjZWVkY2FsbGJhY2s7XG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XG4gICAgICAgIGlmKCB3eCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHd4Lm9uU2hvdyhmdW5jdGlvbiAocmVzKSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5pc1Nob3dpbmc9dHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmKCByZXMgJiYgcmVzLnNjZW5lIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmZyb21zY2VuZSA9IE51bWJlciggcmVzLnNjZW5lICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIExheWEudGltZXIuZnJhbWVPbmNlKCAxLFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLm9uU2hvd1N1Y2NlZWQgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2hvd1N1Y2NlZWQoKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgd3hnYW1lcGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcbiAgICAgICAgaWYoIHd4Z2FtZXBsYXRmb3JtLnNob3dvYmogJiYgd3hnYW1lcGxhdGZvcm0uc2hvd0NhbGxiYWNrIClcbiAgICAgICAge1xuICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0uc2hvd0NhbGxiYWNrLmNhbGwoIHd4Z2FtZXBsYXRmb3JtLnNob3dvYmogKTtcbiAgICAgICAgfVxuICAgICAgICBpZiggd3hnYW1lcGxhdGZvcm0uaXNTaGFyZWluZyApIC8v5aaC5p6c5piv5YiG5Lqr54q25oCBXG4gICAgICAgIHtcbiAgICAgICAgICAgIHd4Z2FtZXBsYXRmb3JtLmlzU2hhcmVpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBpc1NoYXJlU3VjY2VlZDpib29sZWFuPWZhbHNlO1xuICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmNhbGxiYWNrZmFpbHN0YXRlPT0wICkgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIG5vd1RpbWU6bnVtYmVyID1MYXlhLkJyb3dzZXIubm93KCk7XG4gICAgICAgICAgICAgICAgdmFyIGRpc1RpbWU6bnVtYmVyID0obm93VGltZSAtIHd4Z2FtZXBsYXRmb3JtLnN0YXJ0U2hhcmVUaW1lKS8xMDAwO1xuICAgICAgICAgICAgICAgIGlmKCBkaXNUaW1lPj1XWEdhbWVQbGF0Zm9ybS5TaGFyZVRpbWUgfHwgV1hHYW1lUGxhdGZvcm0ubm93U2hhcmVpbmRleCA+PSAzIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlzU2hhcmVTdWNjZWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5jYWxsYmFja2ZhaWxzdGF0ZT0wO1xuICAgICAgICAgICAgaWYoIGlzU2hhcmVTdWNjZWVkIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlTaGFyZU51bSsrO1xuICAgICAgICAgICAgICAgIHd4Z2FtZXBsYXRmb3JtLnVwZGF0ZURheVNoYXJlSW5mbygpO1xuICAgICAgICAgICAgICAgIGlmKCB3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZU9iaiAmJiB3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZXN1Y2NlZWRmdW4gKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0ubm93c2hhcmVzdWNjZWVkZnVuLmNhbGwoIHd4Z2FtZXBsYXRmb3JtLm5vd3NoYXJlT2JqICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLm5vd1NoYXJlaW5kZXgrKztcbiAgICAgICAgICAgICAgICB3eGdhbWVwbGF0Zm9ybS5zaG93TW9kYWwoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCLmj5DnpLpcIiwgY29udGVudDogXCLor7fmr4/mrKHliIbkuqvliLDkuI3lkIznvqQs5piv5ZCm6YeN5paw5YiG5Lqr77yfXCIsIHNob3dDYW5jZWw6IHRydWUsIGNhbmNlbFRleHQ6ICflj5bmtognLCBjb25maXJtVGV4dDogJ+ehruWumicsXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXMpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eHBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmNvbmZpcm0pIFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnNoYXJlQXBwKCB3eHBsYXRmb3JtLm5vd3NoYXJlaW5mbyx3eHBsYXRmb3JtLm5vd3NoYXJlT2JqLHd4cGxhdGZvcm0ubm93c2hhcmVzdWNjZWVkZnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLm5vd3NoYXJlZmFpbGZ1biApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHd4cGxhdGZvcm0ubm93c2hhcmVmYWlsZnVuICYmIHd4cGxhdGZvcm0ubm93c2hhcmVPYmogKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5ub3dzaGFyZWZhaWxmdW4uY2FsbCggd3hwbGF0Zm9ybS5ub3dzaGFyZU9iaiApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uICgpIFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGxhc3RWaWRlb1RpbWU6bnVtYmVyID0gMDtcbiAgICBwcml2YXRlIHZpZGVvQWQ7XG4gICAgcHVibGljIHZpZGVvY2FsbG9iajphbnk7XG4gICAgcHVibGljIHZpZGVvc3VjY2VlZENhbGxiYWNrOkZ1bmN0aW9uO1xuICAgIHByaXZhdGUgdmlkZW9mYWlsQ2FsbGJhY2s6RnVuY3Rpb247XG4gICAgcHVibGljIG5vd3ZpZGVva2V5OnN0cmluZztcbiAgICAgLyoqXG4gICAgICog6KeG6aKR5piv5ZCm5Zyo5pKt5pS+5LitXG4gICAgICovXG4gICAgc3RhdGljIHZpZGVvcGxheWluZzpib29sZWFuID0gZmFsc2U7XG5cbiAgICBzdGF0aWMgaXN0b25namlWaWRlb051bTpib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIOeci+inhumikemihuWlluWKsVxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxuICAgICAqIEBwYXJhbSBzdWNjZWVkY2FsbGJhY2sgXG4gICAgICovXG4gICAgcHVibGljIHBsYXlWaWRlbygga2V5OnN0cmluZywgY2FsbG9iajphbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uPW51bGwsaXN0b25namlOdW06Ym9vbGVhbiA9IHRydWUgKVxuICAgIHtcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcbiAgICAgICAgaWYoIHd4ICYmIHd4LmNyZWF0ZVJld2FyZGVkVmlkZW9BZCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCAhV1hHYW1lUGxhdGZvcm0udmlkZW9wbGF5aW5nIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgdGltZTpudW1iZXIgPSB0aGlzLmxvY2tWaWRlb0xlZnRUaW1lKCk7XG4gICAgICAgICAgICAgICAgaWYoIHRpbWUgPiAwIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi5bm/5ZGK5bCa5pyq5YeG5aSH5aW977yM6K+3XCIrIHRpbWUgK1wi56eS5ZCO5YaN6K+VXCIgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9sb3NlZm9jdXMgKTtcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5pc3RvbmdqaVZpZGVvTnVtID0gaXN0b25namlOdW07XG4gICAgICAgICAgICAgICAgdGhpcy5ub3d2aWRlb2tleSA9IGtleTtcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS52aWRlb3BsYXlpbmc9dHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvY2FsbG9iaiA9IGNhbGxvYmo7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb3N1Y2NlZWRDYWxsYmFjayA9IHN1Y2NlZWRjYWxsYmFjaztcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvZmFpbENhbGxiYWNrID0gZmFpbENhbGxiYWNrO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9BZCA9IHd4LmNyZWF0ZVJld2FyZGVkVmlkZW9BZChcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFkVW5pdElkOidhZHVuaXQtMGM2ODcwODRjOTA4ZWU4OSdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvQWQub25DbG9zZSh0aGlzLmNsb3NlQUQpO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9BZC5vbkVycm9yKCB0aGlzLm9uZXJybyApO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9BZC5sb2FkKCkudGhlbigoKSA9PiB0aGlzLnZpZGVvQWQuc2hvdygpKS5jYXRjaChlcnIgPT4geyBjb25zb2xlLmxvZyhlcnIuZXJyTXNnKSxXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5mYWlsVmlkZW8oKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvY2tWaWRlb0xlZnRUaW1lKCk6bnVtYmVyXG4gICAge1xuICAgICAgICB2YXIgdGltZTpudW1iZXIgPSAoTGF5YS5Ccm93c2VyLm5vdygpLVdYR2FtZVBsYXRmb3JtLmxhc3RWaWRlb1RpbWUpLzEwMDA7IFxuICAgICAgICB0aW1lID0gV1hHYW1lUGxhdGZvcm0uVmlkZW9UaW1lIC0gdGltZTtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aW1lKTtcbiAgICB9XG4gICAgcHVibGljIG9uZXJybyhyZXMpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xuICAgICAgICBXWEdhbWVQbGF0Zm9ybS52aWRlb3BsYXlpbmc9ZmFsc2U7XG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmRXJyb3Iod3hnYW1lUGxhdGZvcm0ub25lcnJvKTsgLy/np7vpmaQg5LiN54S26KKr5aSa5qyh6LCD55SoXG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmQ2xvc2Uod3hnYW1lUGxhdGZvcm0uY2xvc2VBRCk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9nZXRmb2N1cyApO1xuICAgIH1cblxuICAgIC8vIOWFs+mXreW5v+WRilxuICAgIHB1YmxpYyBjbG9zZUFEKHN0YXR1cyk6dm9pZFxuICAgIHtcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubGFzdFZpZGVvVGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcbiAgICAgICAgdmFyIHd4Z2FtZVBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XG4gICAgICAgIGlmIChzdGF0dXMgJiYgc3RhdHVzLmlzRW5kZWQgfHwgc3RhdHVzID09IHVuZGVmaW5lZCkgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5pc3RvbmdqaVZpZGVvTnVtIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bSsrO1xuICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLnVwZGF0ZURheVZpZGVvSW5mbygpO1xuICAgICAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX3VwZGF0ZVZpZGVvTnVtcyApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiAmJiB3eGdhbWVQbGF0Zm9ybS52aWRlb3N1Y2NlZWRDYWxsYmFjayApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9zdWNjZWVkQ2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0udmlkZW9jYWxsb2JqICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgICAgIGVsc2UgXG4gICAgICAgIHtcbiAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi5pyq6KeC55yL5a6M5pW06KeG6aKR77yM5peg5rOV6I635b6X5aWW5YqxXCIgKTtcbiAgICAgICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogJiYgd3hnYW1lUGxhdGZvcm0udmlkZW9mYWlsQ2FsbGJhY2sgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvZmFpbENhbGxiYWNrLmNhbGwoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZz1mYWxzZTtcbiAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9BZC5vZmZFcnJvcih3eGdhbWVQbGF0Zm9ybS5vbmVycm8pOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcbiAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9BZC5vZmZDbG9zZSh3eGdhbWVQbGF0Zm9ybS5jbG9zZUFEKTsgLy/np7vpmaQg5LiN54S26KKr5aSa5qyh6LCD55SoXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2dldGZvY3VzICk7XG4gICAgfVxuXG4gICAgLy8g5bm/5ZGK5aSx6LSlXG4gICAgcHVibGljIGZhaWxWaWRlbygpOnZvaWRcbiAgICB7XG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxhc3RWaWRlb1RpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZz1mYWxzZTtcbiAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLlub/lkYrliqDovb3lpLHotKUs6K+V6K+V5Yir55qE5pa55byP5ZCnflwiICk7XG4gICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkVycm9yKHd4Z2FtZVBsYXRmb3JtLm9uZXJybyk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkNsb3NlKHd4Z2FtZVBsYXRmb3JtLmNsb3NlQUQpOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcbiAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiAmJiB3eGdhbWVQbGF0Zm9ybS52aWRlb2ZhaWxDYWxsYmFjayApIFxuICAgICAgICB7XG4gICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb2ZhaWxDYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogKTtcbiAgICAgICAgfVxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9nZXRmb2N1cyApO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NhblZpZGVvKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtIDwgV1hHYW1lUGxhdGZvcm0uVmlkZW9OdW0gKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0gPT0gMCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdmlkZW9iczpudW1iZXIgPSBNYXRoLmZsb29yKFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtL1dYR2FtZVBsYXRmb3JtLlZpZGVvdG9TaGFyZSk7XG4gICAgICAgICAgICB2YXIgc2hhcmViczpudW1iZXIgPSBNYXRoLmZsb29yKFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtL1dYR2FtZVBsYXRmb3JtLlNoYXJldG9WaWRlbyk7XG4gICAgICAgICAgICBpZiggdmlkZW9icyA+IHNoYXJlYnMgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoIHZpZGVvYnMgPCBzaGFyZWJzIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgdmlkZW95dXNodTpudW1iZXIgPSBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bSVXWEdhbWVQbGF0Zm9ybS5WaWRlb3RvU2hhcmU7XG4gICAgICAgICAgICAgICAgaWYoIHZpZGVveXVzaHUgIT0gMCApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHNoYXJleXVzaHU6bnVtYmVyID0gV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW0lV1hHYW1lUGxhdGZvcm0uU2hhcmV0b1ZpZGVvO1xuICAgICAgICAgICAgICAgIGlmKCBzaGFyZXl1c2h1ICE9IDAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiYW5uZXJSdW5UaW1lOm51bWJlcj0wO1xuICAgIHByaXZhdGUgYmFubmVyQWQ7XG4gICAgcHVibGljIG5vd1N0eXBlOmFueTtcbiAgICBwcml2YXRlIF9iYW5uZXJUeXBlTGlzdDpBcnJheTxhbnk+ID0gW107XG4gICAgcHVibGljIGNyZWF0ZUJhbm5lciggYmFubmVydHlwZTpzdHJpbmc9XCJcIixzdHlsZTphbnkpOnZvaWRcbiAgICB7XG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIGJhbm5lcnR5cGUgIT0gXCJcIiApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGJvOmJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IoIHZhciBpOm51bWJlciA9IDA7aSA8IHRoaXMuX2Jhbm5lclR5cGVMaXN0Lmxlbmd0aDtpKysgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIGJhbm5lcnR5cGUgPT0gdGhpcy5fYmFubmVyVHlwZUxpc3RbaV0udHlwZSApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Jhbm5lclR5cGVMaXN0W2ldLnN0eWxlID0gc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSB0aGlzLl9iYW5uZXJUeXBlTGlzdC5zcGxpY2UoIGksMSApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmFubmVyVHlwZUxpc3QucHVzaCggYXJyWzBdICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBibyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiggIWJvIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Jhbm5lclR5cGVMaXN0LnB1c2goIHsgdHlwZTpiYW5uZXJ0eXBlLHN0eWxlOnN0eWxlIH0gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX2Jhbm5lclR5cGVMaXN0Lmxlbmd0aD09MCApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtOmFueSA9IHRoaXMuX2Jhbm5lclR5cGVMaXN0W3RoaXMuX2Jhbm5lclR5cGVMaXN0Lmxlbmd0aC0xXTtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSBpdGVtLnN0eWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmJhbm5lckFkKSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgbm93ID0gTGF5YS5Ccm93c2VyLm5vdygpO1xuICAgICAgICAgICAgICAgIC8v6LaF6L+HM+WIhumSn+WIt+aWsFxuICAgICAgICAgICAgICAgIGlmIChub3cgLSB0aGlzLmJhbm5lclJ1blRpbWUgPiA2MDAwMCAqIDMpIFxuICAgICAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLm9mZkVycm9yKHRoaXMuYmFubmVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLm9mZlJlc2l6ZSh0aGlzLmJhbm5lclJlc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuZGVzdG9yeSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU5ld0Jhbm5lcihzdHlsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Jhbm5lcihzdHlsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVOZXdCYW5uZXIoc3R5bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2NyZWVud2lkdGg6bnVtYmVyID0gMDtcbiAgICBiYW5uZXJoZWlnaHQ6bnVtYmVyID0gMDtcbiAgICBiYW5uZXJ3aWR0aDpudW1iZXIgPSAwO1xuICAgIGlzb25SZXNpemU6Ym9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBjcmVhdGVOZXdCYW5uZXIoc3R5bGU6IGFueSkge1xuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICBpZiggd3ggJiYgd3guY3JlYXRlQmFubmVyQWQgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5vd1N0eXBlID0gc3R5bGU7XG4gICAgICAgICAgICB0aGlzLmJhbm5lclJ1blRpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XG4gICAgICAgICAgICB2YXIgaW5mbyA9IHRoaXMuZ2V0U3lzdGVtSW5mb1N5bmMoKTtcbiAgICAgICAgICAgIHRoaXMuX3NjcmVlbndpZHRoID0gaW5mby5zY3JlZW5XaWR0aDtcbiAgICAgICAgICAgIHZhciBzY2FsZTpudW1iZXIgPSAxO1xuICAgICAgICAgICAgaWYoIHN0eWxlLmhhc093blByb3BlcnR5KFwic2NhbGVcIikgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNjYWxlID0gc3R5bGUuc2NhbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJhbm5lckFkID0gd3guY3JlYXRlQmFubmVyQWQoe1xuICAgICAgICAgICAgICAgIGFkVW5pdElkOiAnYWR1bml0LThjMmQ1ODYxMzVmYTZkNGYnLFxuICAgICAgICAgICAgICAgIGFkSW50ZXJ2YWxzOjMwLFxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogaW5mby5zY3JlZW5IZWlnaHQgLSAxMDUsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpbmZvLnNjcmVlbldpZHRoICogc2NhbGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhbm5lckFkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5vbkVycm9yKHRoaXMuYmFubmVyRXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Jhbm5lcihzdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGJhbm5lclJlc2l6ZSggcmVzICk6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIHNlbGYgPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcbiAgICAgICAgc2VsZi5iYW5uZXJBZC5vZmZSZXNpemUoc2VsZi5iYW5uZXJSZXNpemUpO1xuICAgICAgICBzZWxmLmlzb25SZXNpemUgPSBmYWxzZTtcbiAgICAgICAgdmFyIG5vd3N0eXBlOmFueSA9IHNlbGYubm93U3R5cGU7XG4gICAgICAgIGlmKCAhbm93c3R5cGUgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGluZm8gPSBzZWxmLmdldFN5c3RlbUluZm9TeW5jKCk7XG4gICAgICAgIHZhciBwZXJjZW50YWdlSDpudW1iZXIgPSBMYXlhLkJyb3dzZXIuY2xpZW50SGVpZ2h0L0xheWEuc3RhZ2UuZGlzcGxheUhlaWdodDtcbiAgICAgICAgdmFyIHBlcmNlbnRhZ2VXOm51bWJlciA9IExheWEuQnJvd3Nlci5jbGllbnRXaWR0aC9MYXlhLnN0YWdlLmRpc3BsYXlXaWR0aDtcbiAgICAgICAgc2VsZi5iYW5uZXJ3aWR0aCA9IHJlcy53aWR0aDtcbiAgICAgICAgc2VsZi5iYW5uZXJoZWlnaHQgPSByZXMuaGVpZ2h0O1xuICAgICAgICBpZiggbm93c3R5cGUuaGFzT3duUHJvcGVydHkoXCJ4XCIpICYmIG5vd3N0eXBlLnggIT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNlbGYuYmFubmVyQWQuc3R5bGUubGVmdCA9IG5vd3N0eXBlLnggKiBwZXJjZW50YWdlVztcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNlbGYuYmFubmVyQWQuc3R5bGUubGVmdCA9IChpbmZvLndpbmRvd1dpZHRoIC0gcmVzLndpZHRoKSAqIDAuNTtcbiAgICAgICAgfVxuICAgICAgICBpZiggbm93c3R5cGUuaGFzT3duUHJvcGVydHkoXCJ5XCIpICYmIG5vd3N0eXBlLnkgIT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNlbGYuYmFubmVyQWQuc3R5bGUudG9wID0gbm93c3R5cGUueSAqIHBlcmNlbnRhZ2VIO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgc2VsZi5iYW5uZXJBZC5zdHlsZS50b3AgPSAoaW5mby53aW5kb3dIZWlnaHQgLSByZXMuaGVpZ2h0KSAtIDE1O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiYW5uZXJFcnJvcihlcnI6YW55KTp2b2lkXG4gICAge1xuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93QmFubmVyKCBzdHlsZSApIHtcbiAgICAgICAgaWYgKHRoaXMuYmFubmVyQWQpIFxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5vd1N0eXBlID0gc3R5bGU7XG4gICAgICAgICAgICB2YXIgaW5mbyA9IHRoaXMuZ2V0U3lzdGVtSW5mb1N5bmMoKTtcblxuICAgICAgICAgICAgdmFyIG5vd3N0eXBlOmFueSA9IHRoaXMubm93U3R5cGU7XG4gICAgICAgICAgICB2YXIgc2NhbGU6bnVtYmVyID0gMTtcbiAgICAgICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInNjYWxlXCIpIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzY2FsZSA9IG5vd3N0eXBlLnNjYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHBlcmNlbnRhZ2VIOm51bWJlciA9IExheWEuQnJvd3Nlci5jbGllbnRIZWlnaHQvTGF5YS5zdGFnZS5kaXNwbGF5SGVpZ2h0O1xuICAgICAgICAgICAgdmFyIHBlcmNlbnRhZ2VXOm51bWJlciA9IExheWEuQnJvd3Nlci5jbGllbnRXaWR0aC9MYXlhLnN0YWdlLmRpc3BsYXlXaWR0aDtcbiAgICAgICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInhcIikgJiYgbm93c3R5cGUueCAhPSAwIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLmxlZnQgPSBub3dzdHlwZS54ICogcGVyY2VudGFnZVc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5zdHlsZS5sZWZ0ID0gKGluZm8ud2luZG93V2lkdGggLSB0aGlzLmJhbm5lcndpZHRoKSAqIDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInlcIikgJiYgbm93c3R5cGUueSAhPSAwIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLnRvcCA9IG5vd3N0eXBlLnkgKiBwZXJjZW50YWdlSDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLnRvcCA9IChpbmZvLndpbmRvd0hlaWdodCAtIHRoaXMuYmFubmVyaGVpZ2h0KSAtIDE1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5zdHlsZS53aWR0aCA9IGluZm8uc2NyZWVuV2lkdGggKiBzY2FsZTtcbiAgICAgICAgICAgIGlmKCAhdGhpcy5pc29uUmVzaXplIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzb25SZXNpemUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQub25SZXNpemUodGhpcy5iYW5uZXJSZXNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZUJhbm5lciggdHlwZTpzdHJpbmcgPSBcIlwiICkge1xuICAgICAgICBpZiAodGhpcy5iYW5uZXJBZCkge1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoIHR5cGUgIT0gXCJcIiApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvciggdmFyIGk6bnVtYmVyID0gMDtpIDwgdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoO2krKyApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoIHR5cGUgPT0gdGhpcy5fYmFubmVyVHlwZUxpc3RbaV0udHlwZSApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYW5uZXJUeXBlTGlzdC5zcGxpY2UoIGksMSApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiggdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoID4gMCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW06YW55ID0gdGhpcy5fYmFubmVyVHlwZUxpc3RbdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQmFubmVyKCBpdGVtLnR5cGUsaXRlbS5zdHlsZSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5o6S6KGM5qac5omT5byA57G75Z6L5a2Y5YKoXG4gICAgICovXG4gICAgcHJpdmF0ZSBfb3BlbnJhbmtEaWN0OmFueT17fTtcbiAgICAvLyBwcml2YXRlIF93eE9wZW5EYXRhVmlld2VyOldYT3BlbkRhdGFWaWV3ZXI7XG4gICAgLyoqXG4gICAgICog5omT5byA5aW95Y+L5o6S6KGM5qacXG4gICAgICovXG4gICAgcHVibGljIG9wZW5GcmllbmRSYW5rKCB0eXBlOnN0cmluZyx2aWV3VHlwZTpzdHJpbmcscmVjdDpMYXlhLlJlY3RhbmdsZSxwYXJlbnQ6TGF5YS5TcHJpdGUgPSBudWxsLGRhdGE6YW55ID0gbnVsbCApOnZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuY2xvc2V6aXl1U3RhZ2UoKTtcbiAgICAgICAgdGhpcy5fb3BlbnJhbmtEaWN0W3ZpZXdUeXBlXSA9IHt0eXBlOnR5cGUsdmlld1R5cGU6dmlld1R5cGUscmVjdDpyZWN0LHBhcmVudDpwYXJlbnQsZGF0YTpkYXRhfTtcbiAgICAgICAgdGhpcy5pbml0eml5dVN0YWdlKHJlY3QscGFyZW50KTtcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSggdHlwZSxkYXRhICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5o6S6KGM5qac5omT5byA54q25oCB5pe25YCZ77yM5YiH5o2i5pi+56S657G75Z6LXG4gICAgICogQHBhcmFtIHR5cGUgXG4gICAgICovXG4gICAgcHVibGljIGNoYW5nZUZyaWVuZFJhbmsoIHR5cGU6c3RyaW5nICk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSggdHlwZSApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaOkuihjOamnOS4iuS4gOmhtVxuICAgICAqL1xuICAgIHB1YmxpYyBwcmVQYWdlUmFuaygpOnZvaWRcbiAgICB7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmjpLooYzmppzkuIvkuIDpobVcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2VSYW5rKCk6dm9pZFxuICAgIHtcbiAgICAgICAgXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5YWz6Zet5aW95Y+L5o6S6KGM5qacXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlRnJpZW5kUmFuayggdmlld1R5cGU6c3RyaW5nICk6dm9pZFxuICAgIHtcblxuICAgICAgICB0aGlzLmNsb3Nleml5dVN0YWdlKCk7XG4gICAgICAgIGlmKCB0aGlzLl9vcGVucmFua0RpY3Rbdmlld1R5cGVdIClcbiAgICAgICAge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX29wZW5yYW5rRGljdFt2aWV3VHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgZm9yKCB2YXIgcyBpbiB0aGlzLl9vcGVucmFua0RpY3QgKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgaXRlbWQ6YW55ID0gdGhpcy5fb3BlbnJhbmtEaWN0W3NdO1xuICAgICAgICAgICAgdGhpcy5vcGVuRnJpZW5kUmFuayggaXRlbWQudHlwZSxpdGVtZC52aWV3VHlwZSxpdGVtZC5yZWN0LGl0ZW1kLnBhcmVudCxpdGVtZC5kYXRhICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIneWni+WMluWtkOWfn1xuICAgICAqIEBwYXJhbSByZWN0IFxuICAgICAqIEBwYXJhbSBwYXJlbnQgXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbml0eml5dVN0YWdlKCByZWN0OkxheWEuUmVjdGFuZ2xlLHBhcmVudDpMYXlhLlNwcml0ZSApOnZvaWRcbiAgICB7XG4gICAgICAgIC8vIGlmKCAhdGhpcy5fd3hPcGVuRGF0YVZpZXdlciApXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICAgIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIgPSBuZXcgV1hPcGVuRGF0YVZpZXdlcigpO1xuICAgICAgICAvLyAgICAgaWYoIHBhcmVudCApXG4gICAgICAgIC8vICAgICB7XG4gICAgICAgIC8vICAgICAgICAgcGFyZW50LmFkZENoaWxkKCB0aGlzLl93eE9wZW5EYXRhVmlld2VyICk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICBlbHNlXG4gICAgICAgIC8vICAgICB7XG4gICAgICAgIC8vICAgICAgICAgR2FtZUxheWVyTWFuYWdlci5JbnN0YW5jZS50b3BMYXllci5kaXNwbGF5T2JqZWN0LmFkZENoaWxkKCB0aGlzLl93eE9wZW5EYXRhVmlld2VyICk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdGhpcy5fd3hPcGVuRGF0YVZpZXdlci54ID0gcmVjdC54O1xuICAgICAgICAvLyB0aGlzLl93eE9wZW5EYXRhVmlld2VyLnkgPSByZWN0Lnk7XG4gICAgICAgIC8vIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIud2lkdGggPSByZWN0LndpZHRoO1xuICAgICAgICAvLyB0aGlzLl93eE9wZW5EYXRhVmlld2VyLmhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmUgOavgeWtkOWfn1xuICAgICAqL1xuICAgIHByaXZhdGUgY2xvc2V6aXl1U3RhZ2UoKTp2b2lkXG4gICAge1xuICAgICAgICAvLyBpZiggdGhpcy5fd3hPcGVuRGF0YVZpZXdlciApXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICAgIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIuZGVzdHJveSgpO1xuICAgICAgICAvLyAgICAgdGhpcy5fd3hPcGVuRGF0YVZpZXdlci5yZW1vdmVTZWxmKCk7XG4gICAgICAgIC8vICAgICB0aGlzLl93eE9wZW5EYXRhVmlld2VyID0gbnVsbDtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaVsOaNruS4iuS8oO+8iOeUqOS6juaOkuihjOamnOaVsOaNruaYvuekuu+8iVxuICAgICAqIEBwYXJhbSBwYXJhbTEg5LiK5oql5pWw5o2uXG4gICAgICogQHBhcmFtIHBhcmFtMiDkuIrmiqXmlbDmja5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcmVUb0Nsb3VkKHBhcmFtMTpudW1iZXIscGFyYW0yOm51bWJlcik6dm9pZFxuICAgIHtcbiAgICAgICAgdmFyIGNhY2hlTWFnZXI6TG9jYWxEYXRhQ29udHJvbCA9IExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2U7XG4gICAgICAgIHZhciBzY29yZTE6bnVtYmVyID0gY2FjaGVNYWdlci5nZXRudW0oIFwicGFyYW0xXCIgKTtcbiAgICAgICAgLy8gdmFyIHNjb3JlMjpudW1iZXIgPSBjYWNoZU1hZ2VyLmdldG51bSggXCJwYXJhbTJcIiApO1xuICAgICAgICBwYXJhbTEgPSBNYXRoLmZsb29yKHBhcmFtMSk7XG4gICAgICAgIHBhcmFtMiA9IE1hdGguZmxvb3IocGFyYW0yKTtcbiAgICAgICAgdmFyIHJlc3VsdDE6bnVtYmVyID0gcGFyYW0xO1xuICAgICAgICB2YXIgcmVzdWx0MjpudW1iZXIgPSBwYXJhbTI7XG5cbiAgICAgICAgaWYoIHJlc3VsdDEgPCBzY29yZTEgKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXN1bHQxID0gc2NvcmUxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY2FjaGVNYWdlci5hZGRzdHIoIFwicGFyYW0xXCIscmVzdWx0MS50b1N0cmluZygpICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFycjpBcnJheTxhbnk+ID0gW107XG4gICAgICAgIGFyci5wdXNoKCB7IGtleTpcInBhcmFtMVwiLHZhbHVlOnJlc3VsdDEudG9TdHJpbmcoKSB9ICk7XG4gICAgICAgIGFyci5wdXNoKCB7IGtleTpcInBhcmFtMlwiLHZhbHVlOnJlc3VsdDIgKyBcIlwiIH0gKTtcbiAgICAgICAgdGhpcy5zZXRVc2VyQ2xvdWRTdG9yYWdlKGFycik7XG4gICAgfVxuXG4gICAgc3RhdGljIGdhbWVjbHViQnV0dG9uOmFueTtcbiAgICBwdWJsaWMgY3JlYXRlR2FtZUNsdWJCdXR0b24oIHN0eWxlOmFueSxpY29uOnN0cmluZyA9IFwiZ3JlZW5cIiApOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciB3eDphbnkgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xuICAgICAgICBpZiggd3ggJiYgc3R5bGUgKVxuICAgICAgICB7XG4gICAgICAgICAgICBzdHlsZS53aWR0aCA9IDQwO1xuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gNDA7XG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nYW1lY2x1YkJ1dHRvbiA9IHd4LmNyZWF0ZUdhbWVDbHViQnV0dG9uKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogaWNvbixcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYoV1hHYW1lUGxhdGZvcm0uZ2FtZWNsdWJCdXR0b24pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2FtZWNsdWJCdXR0b24uc2hvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH1cbn1cblxuIiwiaW1wb3J0IHtXWEdhbWVQbGF0Zm9ybX0gZnJvbSBcIi4uL1dYU0RLL1dYR2FtZVBsYXRmb3JtXCI7XG5pbXBvcnQge1BsYXRmcm9tVHlwZX0gZnJvbSBcIi4vUGxhdGZyb21UeXBlXCI7XG5pbXBvcnQge1dFQ0hBVEVWRU5UfSBmcm9tIFwiLi4vV1hTREsvV0VDSEFURVZFTlRcIjtcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQgeyBUaW1lc1RhbXBlciB9IGZyb20gXCIuLi9UaW1lL1RpbWVzVGFtcGVyXCI7XG5pbXBvcnQge0RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9EYXRlQ29udHJvbFwiO1xuaW1wb3J0IHtBdWRpb0NvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0F1ZGlvQ29udHJvbFwiO1xuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xuXG4vKlxuKiBuYW1lO1xuKi8gXG5leHBvcnQgY2xhc3MgcGluZ3RhaXV0aWxzXG57XG4gICAgcHJpdmF0ZSBfaXNlbmFibGU6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIOaYr+WQpuWQiOinhFxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGlzbGVnYWw6bnVtYmVyID0gMDtcblxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHBpbmd0YWl1dGlscy5pbnMgPSB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGluczogcGluZ3RhaXV0aWxzO1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogcGluZ3RhaXV0aWxzIHtcbiAgICAgICAgaWYgKHBpbmd0YWl1dGlscy5pbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBwaW5ndGFpdXRpbHMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGluZ3RhaXV0aWxzLmlucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliJ3lp4vljJblubPlj7BcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdFBsYXRmcm9tKCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cudHQgKVxuICAgICAgICB7XG4gICAgICAgICAgICBHbG9iYWwubm93cGxhdGZyb20gPSBQbGF0ZnJvbVR5cGUudHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdy53eCkgLy/lvq7kv6HlsI/muLjmiI9cbiAgICAgICAge1xuICAgICAgICAgICAgR2xvYmFsLm5vd3BsYXRmcm9tID0gUGxhdGZyb21UeXBlLnd4O1xuICAgICAgICB9IFxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIEdsb2JhbC5ub3dwbGF0ZnJvbSA9IFBsYXRmcm9tVHlwZS5wYztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KCk6dm9pZCBcbiAgICB7XG4gICAgICAgIHRoaXMuaW5pdFBsYXRmcm9tKCk7XG4gICAgICAgIC8vIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuaW5pdCgpO1xuICAgICAgICAvLyAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIFBsYXRmcm9tVHlwZS5xcTpcbiAgICAgICAgLy8gICAgIGJyZWFrO1xuICAgICAgICAvLyAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gICAgIGJyZWFrO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHRoaXMub25TaG93KCB0aGlzLHRoaXMuc2hvd2NhbGxiYWNrICk7XG4gICAgICAgIC8vIHRoaXMub25IaWRlKHRoaXMsdGhpcy5oaWRlY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdERhdGEoKTp2b2lkXG4gICAge1xuICAgICAgICBEYXRlQ29udHJvbC5JbnN0YW5jZS5TZXRTZWxmKCk7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuaW5pdERhdGEoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5ZCI6L+d6KeE5Yik5patIHRydWXvvJrlkIjop4TvvIxmYWxzZTrov53op4RcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrRW5hYmxlKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgaWYgKHBpbmd0YWl1dGlscy5pc2xlZ2FsID09IDEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9sb2dpbmNhbGxvYmo6YW55O1xuICAgIHByaXZhdGUgX2xvZ2luc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uO1xuICAgIHB1YmxpYyBsb2dpbiggY2FsbG9iajphbnk9bnVsbCxzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb249bnVsbCxwcm9ncmVzc0NhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbGNhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCApOnZvaWRcbiAgICB7XG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3Quc2hvd01vZGFsV2FpdCgpO1xuICAgICAgICB0aGlzLl9sb2dpbmNhbGxvYmogPSBjYWxsb2JqO1xuICAgICAgICB0aGlzLl9sb2dpbnN1Y2NlZWRjYWxsYmFjayA9IHN1Y2NlZWRjYWxsYmFjaztcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5jcmVhdGVVc2VyQW5kTG9naW4odGhpcyx0aGlzLmxvZ2luU3VjY2VlZCx0aGlzLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjayx0aGlzLmxvZ2luZmFpbGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luU3VjY2VlZChudWxsKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dpbnByb2dyZXNzQ2FsbGJhY2soIHZhbHVlOm51bWJlciApOnZvaWRcbiAgICB7XG4gICAgICAgIFxuICAgIH1cblxuICAgIHByaXZhdGUgbG9naW5TdWNjZWVkKCBkYXRhOmFueSApOnZvaWRcbiAgICB7IFxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dpbmZhaWxjYWxsYmFjaygpOnZvaWRcbiAgICB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgb25TaG93KGNhbGxvYmo6IGFueT1udWxsLCBzdWNjZWVkY2FsbGJhY2s6IEZ1bmN0aW9uPW51bGwsIGZhaWxDYWxsYmFjazogRnVuY3Rpb24gPSBudWxsKTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uub25TaG93KGNhbGxvYmosIHN1Y2NlZWRjYWxsYmFjaywgZmFpbENhbGxiYWNrKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUucXE6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd2NhbGxiYWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcyx0aGlzLmFnYWlucGxheWJnU291bmQgKTtcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKCA1MDAsdGhpcyx0aGlzLmFnYWlucGxheWJnU291bmQgKTtcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfb25zaG93ICk7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2dldGZvY3VzICk7XG4gICAgICAgIHZhciBmcm9tc2NlbmU6bnVtYmVyID0gcGluZ3RhaXV0aWxzLmZyb21zY2VuZSgpO1xuICAgICAgICBpZiggZnJvbXNjZW5lID09IDEwODkgfHwgZnJvbXNjZW5lID09IDExMzEgKVxuICAgICAgICB7XG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9mcm9tc2NvcmZrICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFnYWlucGxheWJnU291bmQoKTp2b2lkXG4gICAge1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9vbkF1ZGlvSW50ZXJydXB0aW9uRW5kICk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSGlkZShjYWxsb2JqOiBhbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOiBGdW5jdGlvbj1udWxsKTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uub25IaWRlKGNhbGxvYmosIHN1Y2NlZWRjYWxsYmFjayk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnFxOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBoaWRlY2FsbGJhY2soKTp2b2lkXG4gICAge1xuICAgICAgICBUaW1lc1RhbXBlci5JbnN0YW5jZS5zZW5kb25saW5lVG9uZ2ppKCk7XG4gICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5DbGVhckFsbFNPVU5EKCk7XG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX29uaGlkZSApO1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9sb3NlZm9jdXMgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlvZPliY3muLjmiI/mmK/lkKblnKjmmL7npLrkuK1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzc2hvdygpOmJvb2xlYW5cbiAgICB7XG4gICAgICAgIHZhciBibzpib29sZWFuID0gdHJ1ZTtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uaXNTaG93aW5nIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJvID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm8gPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBibztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliIbljIXliqDovb1cbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZFN1YnBhY2thZ2UoIHR5cGVuYW1lOnN0cmluZyxjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixjYWxscHJvZ3Jlc3M6RnVuY3Rpb24sZmFpbGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwgKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmxvYWRTdWJwYWNrYWdlKCB0eXBlbmFtZSxjYWxsb2JqLGNhbGxiYWNrLGNhbGxwcm9ncmVzcyxmYWlsY2FsbGJhY2sgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiggY2FsbG9iaiAmJiBjYWxsYmFjayApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKCBjYWxsb2JqICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDojrflj5bmmK/lkKblt7Lnu4/mjojmnYNcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgXG4gICAgICovXG4gICAgcHVibGljIGlzYWNjcmVkaXQoIGNhbGxvYmo6YW55LGFjY3JlZGl0Q2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmdldGFjY3JlZGl0KCBjYWxsb2JqLGFjY3JlZGl0Q2FsbGJhY2sgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUucXE6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuZ2V0YWNjcmVkaXQoIGNhbGxvYmosYWNjcmVkaXRDYWxsYmFjayApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmKGFjY3JlZGl0Q2FsbGJhY2smJmNhbGxvYmopXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosdHJ1ZSApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5ou/6KeS6Imy5L+h5oGv5o6I5p2DXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZWFjY3JlZGl0KCBjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNyZWF0ZVVzZXJJbmZvQnV0dG9uKGNhbGxvYmosY2FsbGJhY2ssZmFpbGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsb3NldXNlcmluZm9CdXR0b24oKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNsb3NldXNlcmluZm9iVXR0b24oKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6YCA5Ye65ri45oiPXG4gICAgICovXG4gICAgcHVibGljIGV4aXRHYW1lKCk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5leGl0R2FtZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmiZPlvIDlrqLmnI3lr7nor53moYZcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlbkN1c3RvbWVyU2VydmljZSgpOnZvaWRcbiAgICB7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uub3BlbkN1c3RvbWVyU2VydmljZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnn63pnIfliqhcbiAgICAgKi9cbiAgICBwdWJsaWMgdmlicmF0ZVNob3J0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS52aWJyYXRlU2hvcnQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0NhblZpZGVvKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgdmFyIGJvOmJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgaWYoIHBpbmd0YWl1dGlscy5jaGVja0VuYWJsZSgpIClcbiAgICAgICAge1xuICAgICAgICAgICAgYm8gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgICAgICBibyA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmlzQ2FuVmlkZW8oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBibyA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJvO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGFydFNoYXJlQXBwKGtleTpzdHJpbmcsY2FsbG9iajphbnk9bnVsbCxzdWNjZWVkQ2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsQ2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnN0YXJ0U2hhcmVBcHAoIGtleSxjYWxsb2JqLHN1Y2NlZWRDYWxsYmFjayxmYWlsQ2FsbGJhY2sgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiggY2FsbG9iaiAmJiBzdWNjZWVkQ2FsbGJhY2sgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZENhbGxiYWNrLmNhbGwoIGNhbGxvYmogKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwbGF5VmlkZW8oIGtleTpzdHJpbmcsIGNhbGxvYmo6YW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbj1udWxsLGlzdG9uZ2ppTnVtOmJvb2xlYW4gPSB0cnVlIClcbiAgICB7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UucGxheVZpZGVvKCBrZXksY2FsbG9iaixzdWNjZWVkY2FsbGJhY2ssZmFpbENhbGxiYWNrLGlzdG9uZ2ppTnVtICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYoIGNhbGxvYmogJiYgc3VjY2VlZGNhbGxiYWNrIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2NlZWRjYWxsYmFjay5jYWxsKCBjYWxsb2JqICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlQmFubmVyKGJhbm5lcnR5cGU6c3RyaW5nLHN0eWxlOmFueT17eDowLHk6MCxzY2FsZToxfSk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5jcmVhdGVCYW5uZXIoIGJhbm5lcnR5cGUsc3R5bGUgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhpZGVCYW5uZXIoIGJhbm5lcnR5cGU6c3RyaW5nICk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5oaWRlQmFubmVyKCBiYW5uZXJ0eXBlICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaVsOaNruS4iuS8oO+8iOeUqOS6juaOkuihjOamnOaVsOaNruaYvuekuu+8iVxuICAgICAqIEBwYXJhbSBwYXJhbTEg5LiK5oql5pWw5o2uMVxuICAgICAqIEBwYXJhbSBwYXJhbTIg5LiK5oql5pWw5o2uMlxuICAgICAqL1xuICAgIHB1YmxpYyBzdG9yZVRvQ2xvdWQocGFyYW0xOm51bWJlcixwYXJhbTI6bnVtYmVyKTp2b2lkXG4gICAge1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnN0b3JlVG9DbG91ZCggcGFyYW0xLHBhcmFtMiApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmiZPlvIDlpb3lj4vmjpLooYzmppxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlbkZyaWVuZFJhbmsoIHR5cGU6c3RyaW5nLHZpZXdUeXBlOnN0cmluZyxyZWN0OkxheWEuUmVjdGFuZ2xlLHBhcmVudDpMYXlhLlNwcml0ZSA9IG51bGwsZGF0YTphbnkgPSBudWxsICk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5vcGVuRnJpZW5kUmFuayggdHlwZSx2aWV3VHlwZSxyZWN0LHBhcmVudCxkYXRhICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaOkuihjOamnOaJk+W8gOeKtuaAgeaXtuWAme+8jOWIh+aNouaYvuekuuexu+Wei1xuICAgICAqIEBwYXJhbSB0eXBlIFxuICAgICAqL1xuICAgIHB1YmxpYyBjaGFuZ2VGcmllbmRSYW5rKCB0eXBlOnN0cmluZyApOnZvaWRcbiAgICB7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuY2hhbmdlRnJpZW5kUmFuayh0eXBlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5o6S6KGM5qac5LiK5LiA6aG1XG4gICAgICovXG4gICAgcHVibGljIHByZVBhZ2VSYW5rKCk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5wcmVQYWdlUmFuaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmjpLooYzmppzkuIvkuIDpobVcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2VSYW5rKCk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5uZXh0UGFnZVJhbmsoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5YWz6Zet5aW95Y+L5o6S6KGM5qacXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlRnJpZW5kUmFuayggdmlld1R5cGU6c3RyaW5nICk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5jbG9zZUZyaWVuZFJhbmsodmlld1R5cGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9ja1ZpZGVvTGVmdFRpbWUoKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHZhciB0aW1lOm51bWJlciA9IDA7XG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XG4gICAgICAgICAgICAgICAgdGltZSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmxvY2tWaWRlb0xlZnRUaW1lKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGltZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRheVZpZGVvTnVtcygpOm51bWJlclxuICAgIHtcbiAgICAgICAgdmFyIHRpbWU6bnVtYmVyID0gMDtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICB0aW1lID0gV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGltZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAxMDg5Oua3u+WKoOWIsOaIkeeahOWwj+eoi+W6j++8jDExMzE65re75Yqg5Yiw5rWu56qXXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tc2NlbmUoKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHZhciBzY2VuZTpudW1iZXIgPSAwO1xuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxuICAgICAgICAgICAgc2NlbmUgPSBXWEdhbWVQbGF0Zm9ybS5mcm9tc2NlbmU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NlbmU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVHYW1lQ2x1YkJ1dHRvbiggc3R5bGU6YW55LGljb246c3RyaW5nID0gXCJncmVlblwiICk6dm9pZFxuICAgIHtcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5jcmVhdGVHYW1lQ2x1YkJ1dHRvbiggc3R5bGUsaWNvbiApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuL1BsYXllckFjY291bnRcIjtcclxuXHJcbi8vIGltcG9ydCB7IEFjY291bnQgfSBmcm9tIFwiLi4vQWNjb3VudC9BY2NvdW50XCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIHR0c2hhcmVcclxue1xyXG4gICAgc3RhdGljIHNoYXJlKClcclxuICAgIHtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnNoYXJlQXBwTWVzc2FnZSh7XHJcbiAgICAgICAgICAgIGNoYW5uZWw6IFwiYXJ0aWNsZVwiLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZUlkOiBcIm9jZ2Y5YjQ2NDY0YjlhbmxmZlwiLCAvLyDmm7/mjaLmiJDpgJrov4flrqHmoLjnmoTliIbkuqtJRFxyXG4gICAgICAgICAgICB0aXRsZTogXCLlhrLllYrlhrJcIixcclxuICAgICAgICAgICAgaW1hZ2VVcmw6IFwiamlhemFpLzEyMy5wbmdcIixcclxuICAgICAgICAgICAgcXVlcnk6IFwicmVzLnF1ZXJ5XCIsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6ICgpID0+e30sXHJcbiAgICAgICAgICAgIGZhaWw6ICgpID0+e30sXHJcbiAgICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIHR0YWRcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6dHRhZDtcclxuICAgIGNvbnN0cnVjdG9yKClcclxuICAgIHtcclxuICAgICAgICB0dGFkLmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6dHRhZFxyXG4gICAge1xyXG4gICAgICAgIGlmKHR0YWQuaW5zdGFuY2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdHRhZC5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyB0dGFkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHZpZGVsQWRVbml0SWQgPSBcIjE1Z2ZncDU4cG9jcDgwaGJrYlwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYmFubmVyQWRVbml0SWQgPSBcImRzazdjb2hibDJmNGpwanRxNVwiO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHZpZGVvQWQ7XHJcbiAgICBcclxuICAgIHN0YXRpYyBjbG9zZWNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIHN0YXRpYyBJbml0QUQoKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnZpZGVvIHx8ICFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG5cclxuICAgICAgICB0dGFkLmJhbm5lckFkVW5pdElkID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5iYW5uZXJBZFVuaXRJZD9QbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLmJhbm5lckFkVW5pdElkOnR0YWQuYmFubmVyQWRVbml0SWQ7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJiYW5uZXJBZFVuaXRJZFwiLHR0YWQuYmFubmVyQWRVbml0SWQpO1xyXG4gICAgICAgIHR0YWQudmlkZWxBZFVuaXRJZCA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEudmlkZWxBZFVuaXRJZD9QbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnZpZGVsQWRVbml0SWQ6dHRhZC52aWRlbEFkVW5pdElkO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidmlkZWxBZFVuaXRJZFwiLHR0YWQudmlkZWxBZFVuaXRJZCk7XHJcblxyXG4gICAgICAgIHR0YWQudmlkZW9BZCA9IExheWEuQnJvd3Nlci53aW5kb3cudHQuY3JlYXRlUmV3YXJkZWRWaWRlb0FkKHsgYWRVbml0SWQ6IHRoaXMudmlkZWxBZFVuaXRJZCB9KTtcclxuICAgICAgICB0dGFkLnZpZGVvQWQub25DbG9zZShyZXMgPT4gXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXMuaXNFbmRlZCkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodHRhZC5jbG9zZWNhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHRhZC5jbG9zZWNhbGxiYWNrKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0dGFkLmNsb3NlY2FsbGJhY2spXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0dGFkLmNsb3NlY2FsbGJhY2soZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgU2hvd1ZpZGVvKF9jYjpGdW5jdGlvbilcclxuICAgIHtcclxuICAgICAgICBpZighUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS52aWRlbyB8fCAhTGF5YS5Ccm93c2VyLm9uTW9iaWxlKXJldHVybjtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInNob3cgdmlkZW9cIik7XHJcbiAgICAgICAgdHRhZC5jbG9zZWNhbGxiYWNrID0gX2NiO1xyXG4gICAgICAgIHR0YWQudmlkZW9BZC5zaG93KCkudGhlbigoKSA9PiBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5bm/5ZGK5pi+56S65oiQ5YqfXCIpO1xyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHRhZC5TaG93VHh0KFwi6KeG6aKR5q2j5Zyo5Yqg6L295LitXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlub/lkYrnu4Tku7blh7rnjrDpl67pophcIiwgZXJyKTtcclxuICAgICAgICAgICAgICAgIC8vIOWPr+S7peaJi+WKqOWKoOi9veS4gOasoVxyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKDIwMCx0aGlzLCgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdHRhZC52aWRlb0FkLmxvYWQoKS50aGVuKCgpID0+IFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmiYvliqjliqDovb3miJDlip9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWKoOi9veaIkOWKn+WQjumcgOimgeWGjeaYvuekuuW5v+WRilxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHRhZC52aWRlb0FkLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjYW5zaG93ID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgc3RhdGljIGJhbm5lckFkO1xyXG4gICAgc3RhdGljIFNob3diYW5uZXIoKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwic2hvdyBiYW5uZXJcIik7XHJcbiAgICAgICAgdHRhZC5jYW5zaG93ID0gdHJ1ZTtcclxuICAgICAgICB2YXIgaW5mb3IgPSBMYXlhLkJyb3dzZXIud2luZG93LnR0LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgdmFyIHRhcmdldEJhbm5lckFkV2lkdGggPSAyMDA7XHJcbiAgICAgICAgaWYodHRhZC5iYW5uZXJBZCl0dGFkLmJhbm5lckFkLmRlc3Ryb3koKTtcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMjAwLHRoaXMsKCk9PntcclxuICAgICAgICAgICAgdHRhZC5iYW5uZXJBZCA9IExheWEuQnJvd3Nlci53aW5kb3cudHQuY3JlYXRlQmFubmVyQWQoe1xyXG4gICAgICAgICAgICAgICAgYWRVbml0SWQ6IHR0YWQuYmFubmVyQWRVbml0SWQsXHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0YXJnZXRCYW5uZXJBZFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogaW5mb3Iud2luZG93SGVpZ2h0IC0gKHRhcmdldEJhbm5lckFkV2lkdGggLyAxNikgKiA5IC8vIOagueaNruezu+e7n+e6puWumuWwuuWvuOiuoeeul+WHuuW5v+WRiumrmOW6plxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHR0YWQuYmFubmVyQWQub25Mb2FkKCgpPT5cclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYodHRhZC5jYW5zaG93KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHR0YWQuYmFubmVyQWQuc2hvdygpLnRoZW4oKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5bm/5ZGK5pi+56S65oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiBcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlub/lkYrnu4Tku7blh7rnjrDpl67pophcIiwgZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHR0YWQuYmFubmVyQWQub25SZXNpemUoc2l6ZSA9PiBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhzaXplLndpZHRoLCBzaXplLmhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHRhZC5iYW5uZXJBZC5zdHlsZS50b3AgPSBpbmZvci53aW5kb3dIZWlnaHQgLSBzaXplLmhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB0dGFkLmJhbm5lckFkLnN0eWxlLmxlZnQgPSAoaW5mb3Iud2luZG93V2lkdGggLSBzaXplLndpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBDbGVhcigpXHJcbiAgICB7XHJcbiAgICAgICAgdHRhZC5jYW5zaG93ID0gZmFsc2U7XHJcbiAgICAgICAgdHRhZC5jbG9zZWNhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICBpZih0dGFkLmJhbm5lckFkKXR0YWQuYmFubmVyQWQuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKuaKlumfs+abtOWkmua4uOaIj+aWueazlSovXHJcbiAgICBzdGF0aWMgQ3JlYXRlTW9yZUdhbWVCdG4oZnVuOkZ1bmN0aW9uPW51bGwpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcbiAgICAgICAgaWYoTGF5YS5Ccm93c2VyLm9uSU9TKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHRhZC5TaG93VHh0KFwi5pqC5pyq5byA5pS+XCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQuc2hvd01vcmVHYW1lc01vZGFsKHtcclxuICAgICAgICAgICAgYXBwTGF1bmNoT3B0aW9uczogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFwcElkOiBcInR0NjZkMDEwNmRmOWVhYTA4M1wiLFxyXG4gICAgICAgICAgICAgICAgcXVlcnk6IFwiZm9vPWJhciZiYXo9cXV4XCIsXHJcbiAgICAgICAgICAgICAgICBleHRyYURhdGE6IHt9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1Y2Nlc3NcIiwgcmVzLmVyck1zZyk7XHJcbiAgICAgICAgICAgICAgaWYoZnVuKVxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZ1bigpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmFpbChyZXMpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImZhaWxcIiwgcmVzLmVyck1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLy8g55uR5ZCs5by556qX5YWz6ZetXHJcbiAgICAgICAgLy8gICB0aGlzLm9uTW9yZUdhbWVzTW9kYWxDbG9zZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKuebkeWQrOW8ueeql+WFs+mXrSovXHJcbiAgICAvLyBzdGF0aWMgb25Nb3JlR2FtZXNNb2RhbENsb3NlKClcclxuICAgIC8vIHtcclxuICAgIC8vICAgICBpZighTGF5YS5Ccm93c2VyLm9uTW9iaWxlKXJldHVybjtcclxuICAgIC8vICAgICBpZiggTGF5YS5Ccm93c2VyLm9uSU9TKVxyXG4gICAgLy8gICAgIHtcclxuICAgIC8vICAgICAgICAgdHRhZC5TaG93VHh0KFwi5pqC5pyq5byA5pS+XCIpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQub25Nb3JlR2FtZXNNb2RhbENsb3NlKGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcIm1vZGFsIGNsb3NlZFwiKTtcclxuICAgIC8vICAgICAgICAgaWYoU2NlbmUzRE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5Jc0dhbWVQYXN1ZSlcclxuICAgIC8vICAgICAgICAge1xyXG4gICAgLy8gICAgICAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBHYW1lRXZlbnQuY29udGludWVHYW1lICk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNob3dUeHQodGV4dDogc3RyaW5nKSBcclxuICAgIHtcclxuICAgICAgICBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdy50dCkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnNob3dUb2FzdCh7IHRpdGxlOiB0ZXh0IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2codGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLyoqXG4gKiDlhajlsYDkvqblkKznsbvlj4rmtojmga/lpITnkIZcbiAqL1xuZXhwb3J0ICBjbGFzcyBEaXNQYXRjaGVyT24gZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxue1xuICAgIHB1YmxpYyBzdGF0aWMgaW5zOkRpc1BhdGNoZXJPbjtcbiAgICBwcml2YXRlIF9kaXNwYXRjaGVyOkxheWEuRXZlbnREaXNwYXRjaGVyO1xuICAgIHByaXZhdGUgaXNJbml0OmJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgRGlzUGF0Y2hlck9uLmlucyA9IHRoaXM7XG4gICAgICAgIGlmKHRoaXMuaXNJbml0KXsgICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5fZGlzcGF0Y2hlciA9PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoZXIgPSBuZXcgTGF5YS5FdmVudERpc3BhdGNoZXIoKTtcbiAgICAgICAgICAgIHRoaXMuaXNJbml0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6RGlzUGF0Y2hlck9ue1xuICAgICAgICBpZihEaXNQYXRjaGVyT24uaW5zPT1udWxsKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXNQYXRjaGVyT24oKTtcbiAgICAgICAgcmV0dXJuIERpc1BhdGNoZXJPbi5pbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcsbGlzdGVuZXI6RnVuY3Rpb24sdGhpc09iamVjdDphbnksdXNlQ2FwdHVyZTpib29sZWFuPWZhbHNlLHByaW9yaXR5Om51bWJlcj0wKTp2b2lke1xuICAgICAgICB0aGlzLl9kaXNwYXRjaGVyLm9uKCB0eXBlLHRoaXNPYmplY3QsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOnN0cmluZyxsaXN0ZW5lcjpGdW5jdGlvbix0aGlzT2JqZWN0OmFueSx1c2VDYXB0dXJlOmJvb2xlYW49ZmFsc2UpOnZvaWR7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoZXIub2ZmKCB0eXBlLHRoaXNPYmplY3QsIGxpc3RlbmVyICk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0V2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcpOmJvb2xlYW5cbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaGVyLmhhc0xpc3RlbmVyKHR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwYXRjaEV2ZW50KHR5cGU6c3RyaW5nLGRhdGE/OiBhbnkpOmJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hlci5ldmVudCh0eXBlLGRhdGEpO1xuICAgIH1cbn0iLCJpbXBvcnQge0xFdmVudH0gZnJvbSBcIi4vTEV2ZW50XCI7XG5pbXBvcnQge0Rpc1BhdGNoZXJPbn0gZnJvbSBcIi4vRGlzUGF0Y2hlck9uXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIERpc3BhdGNoZXJNYW5hZ2VyXG57XG4gICAgc3RhdGljICBpbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgRGlzUGF0Y2hlck9uLkluc3RhbmNlO1xuICAgIH1cblxuICAgIC8v5paw5bu65LqL5Lu2XG4gICAgc3RhdGljICBFdmVudCh0eXBlOiBzdHJpbmcsIG9iajogT2JqZWN0ID0gbnVsbCwgYnViYmxlczogYm9vbGVhbiA9IGZhbHNlLCBjYW5jZWxhYmxlOiBib29sZWFuID0gZmFsc2UpOiBMYXlhLkV2ZW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBMRXZlbnQodHlwZSwgb2JqLCBidWJibGVzLCBjYW5jZWxhYmxlKTtcbiAgICB9XG5cbiAgICAvL+a0vuWPkeS6i+S7tlxuICAgIHN0YXRpYyAgZGlzcGF0Y2hFdmVudCh0eXBlOiBzdHJpbmcsIG9iajogT2JqZWN0ID0gbnVsbCwgYnViYmxlczogYm9vbGVhbiA9IGZhbHNlLCBjYW5jZWxhYmxlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgRGlzUGF0Y2hlck9uLkluc3RhbmNlLmRpc3BhdGNoRXZlbnQodHlwZSwgb2JqKTtcbiAgICB9XG5cbiAgICAvL+ebkeWQrOS6i+S7tlxuICAgIHN0YXRpYyAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIHRoaXNPYmplY3Q6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uLCB1c2VDYXB0dXJlOiBib29sZWFuID0gZmFsc2UsIHByaW9yaXR5OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgICAgIERpc1BhdGNoZXJPbi5JbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB0aGlzT2JqZWN0LCB1c2VDYXB0dXJlLCBwcmlvcml0eSk7XG4gICAgfVxuXG4gICAgc3RhdGljICBoYXNFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gRGlzUGF0Y2hlck9uLkluc3RhbmNlLmhhc0V2ZW50TGlzdGVuZXIodHlwZSk7XG4gICAgfVxuXG4gICAgc3RhdGljICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIHVzZUNhcHR1cmU6IGJvb2xlYW4gPSBmYWxzZSwgcHJpb3JpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICAgICAgRGlzUGF0Y2hlck9uLkluc3RhbmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXNPYmplY3QpO1xuICAgIH1cbn0iLCJpbXBvcnQgU3ByaXRlID0gTGF5YS5TcHJpdGU7XG5leHBvcnQgIGNsYXNzIEdhbWVTdGF0ZVxue1xuICAgIHN0YXRpYyByZW1vdmVzZWxlY3Q6c3RyaW5nID0gXCJHYW1lU3RhdGVfcmVtb3Zlc2VsZWN0XCI7XG5cbiAgICBcblxuICAgIHN0YXRpYyBucGNlbmQ6c3RyaW5nID0gXCJHYW1lU3RhdGVfbnBjZW5kR2FtZVwiO1xuXG4gICAgXG5cbiAgICAvKipcbiAgICAgKiDpgJrlhbPmiJDlip9cbiAgICAgKi9cbiAgICBzdGF0aWMgd2luOnN0cmluZyA9IFwiR2FtZVN0YXRlX3dpbkdhbWVcIjtcblxuICAgIHByaXZhdGUgc3A6IFNwcml0ZTtcbiAgICBwcml2YXRlIGRyYXdTb21ldGhpbmcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3AgPSBuZXcgU3ByaXRlKCk7XG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5zcCk7XG4gICAgICAgIC8v55S757q/XG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0xpbmUoMTAsIDU4LCAxNDYsIDU4LCBcIiNmZjAwMDBcIiwgMyk7XG4gICAgICAgIC8v55S76L+e57ut55u057q/XG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0xpbmVzKDE3NiwgNTgsIFswLCAwLCAzOSwgLTUwLCA3OCwgMCwgMTE3LCA1MCwgMTU2LCAwXSwgXCIjZmYwMDAwXCIsIDUpO1xuICAgICAgICAvL+eUu+absue6v1xuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdDdXJ2ZXMoMzUyLCA1OCwgWzAsIDAsIDE5LCAtMTAwLCAzOSwgMCwgNTgsIDEwMCwgNzgsIDAsIDk3LCAtMTAwLCAxMTcsIDAsIDEzNiwgMTAwLCAxNTYsIDBdLCBcIiNmZjAwMDBcIiwgNSk7XG4gICAgICAgIC8v55S755+p5b2iXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1JlY3QoMTAsIDE2NiwgMTY2LCA5MCwgXCIjZmZmZjAwXCIpO1xuICAgICAgICAvL+eUu+Wkmui+ueW9olxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQb2x5KDI2NCwgMTY2LCBbMCwgMCwgNjAsIDAsIDc4LjQ4LCA1NywgMzAsIDkzLjQ4LCAtMTguNDgsIDU3XSwgXCIjZmZmZjAwXCIpO1xuICAgICAgICAvL+eUu+S4ieinkuW9olxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQb2x5KDQwMCwgMTY2LCBbMCwgMTAwLCA1MCwgMCwgMTAwLCAxMDBdLCBcIiNmZmZmMDBcIik7XG4gICAgICAgIC8v55S75ZyGXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0NpcmNsZSg5OCwgMzMyLCA1MCwgXCIjMDBmZmZmXCIpO1xuICAgICAgICAvL+eUu+aJh+W9olxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQaWUoMjQwLCAyOTAsIDEwMCwgMTAsIDYwLCBcIiMwMGZmZmZcIik7XG4gICAgICAgIC8v57uY5Yi25ZyG6KeS55+p5b2i77yM6Ieq5a6a5LmJ6Lev5b6EXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1BhdGgoNDAwLCAzMTAsIFtbXCJtb3ZlVG9cIiwgNSwgMF0sIFtcImxpbmVUb1wiLCAxMDUsIDBdLCBbXCJhcmNUb1wiLCAxMTAsIDAsIDExMCwgNSwgNV0sIFtcImxpbmVUb1wiLCAxMTAsIDU1XSwgW1wiYXJjVG9cIiwgMTEwLCA2MCwgMTA1LCA2MCwgNV0sIFtcImxpbmVUb1wiLCA1LCA2MF0sIFtcImFyY1RvXCIsIDAsIDYwLCAwLCA1NSwgNV0sIFtcImxpbmVUb1wiLCAwLCA1XSwgW1wiYXJjVG9cIiwgMCwgMCwgNSwgMCwgNV0sIFtcImNsb3NlUGF0aFwiXV0sIHtmaWxsU3R5bGU6IFwiIzAwZmZmZlwifSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOmAmuWFs+Wksei0pVxuICAgICAqL1xuICAgIHN0YXRpYyBmYWlsOnN0cmluZyA9IFwiR2FtZVN0YXRlX2ZhaWxHYW1lXCI7XG5cbiAgICBzdGF0aWMganVtcDpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9qdW1wZ2FtZVwiO1xuXG4gICAgLyoqXG4gICAgICog5pqC5YGc5ri45oiPXG4gICAgICovXG4gICAgc3RhdGljIHN0b3A6c3RyaW5nID0gXCJHYW1lU3RhdGVfc3RvcEdhbWVcIjtcblxuICAgIC8qKlxuICAgICAqIOWbnuWIsOS4u+eVjOmdolxuICAgICAqL1xuICAgIHN0YXRpYyByZXR1cm5NYWluVmlldzpzdHJpbmcgPSBcInJldHVybk1haW5WaWV3XCI7XG5cbiAgICBzdGF0aWMgdXBkYXRlU0tpblZpZXc6c3RyaW5nID0gXCJHYW1lU3RhdGVfdXBkYXRlU0tpblZpZXdcIjtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIHByaXZhdGUgYnRuQXJyOkFycmF5PHN0cmluZz4gPSBbXCJyZXMvYnV0dG9uLnBuZ1wiLCBcInJlcy9idXR0b24ucG5nXCIsIFwicmVzL2J1dHRvbi5wbmdcIl07XG4gICAgcHJpdmF0ZSBuYW1lQXJyOkFycmF5PHN0cmluZz4gPSBbXCJjYW52YXPmiKrlm75cIixcInNwcml0ZeaIquWbvlwiLFwi5riF55CGXCJdO1xuICAgIHByaXZhdGUgX2NhbnZhczpIVE1MQ2FudmFzRWxlbWVudDtcbiAgICBwcml2YXRlIGFpbVNwOlNwcml0ZTtcbiAgICBwcml2YXRlIGRyYXdJbWFnZTpMYXlhLkltYWdlO1xuICAgIHByaXZhdGUgZHJhd1NwOlNwcml0ZTtcblx0cHJpdmF0ZSBtb25rZXlUZXh0dXJlOkxheWEuVGV4dHVyZTtcblxuICAgIHByaXZhdGUgX29uY2xpY2soZTpMYXlhLkV2ZW50KXtcbiAgICAgICAgc3dpdGNoIChlLnRhcmdldC5uYW1lKSB7XG4gICAgICAgICAgICBjYXNlIHRoaXMubmFtZUFyclswXTpcbiAgICAgICAgICAgICAgICB2YXIgYmFzZTY0VXJsOnN0cmluZyA9IHRoaXMuX2NhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIiwxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYXdJbWFnZS5za2luID0gYmFzZTY0VXJsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB0aGlzLm5hbWVBcnJbMV06XG4gICAgICAgICAgICAgICAgdmFyIHRleHQ6TGF5YS5UZXh0dXJlID0gTGF5YS5zdGFnZS5kcmF3VG9UZXh0dXJlKExheWEuQnJvd3Nlci5jbGllbnRXaWR0aCxMYXlhLkJyb3dzZXIuY2xpZW50SGVpZ2h0LDAsMCkgYXMgTGF5YS5UZXh0dXJlO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1NwLmdyYXBoaWNzLmRyYXdUZXh0dXJlKHRleHQsMCwwLHRoaXMuZHJhd1NwLndpZHRoLHRoaXMuZHJhd1NwLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHRoaXMubmFtZUFyclsyXTpcbiAgICAgICAgICAgICAgICB0aGlzLmRyYXdJbWFnZS5za2luID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYXdTcC5ncmFwaGljcy5jbGVhcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1NwLmdyYXBoaWNzLmRyYXdSZWN0KDAsMCx0aGlzLmRyYXdTcC53aWR0aCx0aGlzLmRyYXdTcC5oZWlnaHQsXCIjZmYwMDAwXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuICAgIC8qKlxuICAgICAqIOW8gOWni+a4uOaIj1xuICAgICAqL1xuICAgIHN0YXRpYyBzdGFydDpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9zdGFydEdhbWVcIjtcblxuICAgIC8qKlxuICAgICAqIOe7k+adn+a4uOaIj1xuICAgICAqL1xuICAgIHN0YXRpYyBlbmQ6c3RyaW5nID0gXCJHYW1lU3RhdGVfZW5kR2FtZVwiO1xuICAgIFxuICAgIC8qKuWksei0pSAqL1xuICAgIHN0YXRpYyBsb3NlOnN0cmluZyA9IFwiR2FtZVN0YXRlX2xvc2VHYW1lXCJcbiAgICAvKipcbiAgICAgKiDlpI3mtLtcbiAgICAgKi9cbiAgICBzdGF0aWMgcmV2aXZlOnN0cmluZyA9IFwiR2FtZVN0YXRlX3Jldml2ZUdhbWVcIjtcblxuICAgIC8qKuaYr+WQpuWkjea0uyAqL1xuICAgIHN0YXRpYyBpc2RpZTpib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKirlhYHorrjlpI3mtLvmrKHmlbAgKi9cbiAgICBzdGF0aWMgZnVodW9jaXNodTpudW1iZXIgPSAxO1xuXG4gICAgLyoq5piv5ZCm5bey57uP5Y+R5biD6L+H5b2V5bGPICovXG4gICAgc3RhdGljIHJlY29yZHNjcmVlOmJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKua4uOaIj+asoeaVsCovXG4gICAgc3RhdGljIEdhbWVOdW06bnVtYmVyID0gMDtcblxuXG5cbn0iLCJcbi8qXG4qIOWFrOWFseaOpeWPo1xuKi9cbmV4cG9ydCBtb2R1bGUgR2FtZVV0aWxzIHtcbiAgICAvKipcbiAgICAgKiDpmo/mnLrlh73mlbAo6L+U5Zue5pW05Z6LKVxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByYW5kUmFuZ2VpbnQobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyICB7XG4gICAgICAgIHZhciB2YWx1ZTpudW1iZXI9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcbiAgICAgICAgaWYodmFsdWU+bWF4KXtcbiAgICAgICAgICAgIHZhbHVlID0gbWF4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpmo/mnLrlh73mlbAoIOS4jeWPluaVtCApXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJhbmRSYW5nZWZsb2F0KG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciAge1xuICAgICAgICB2YXIgdmFsdWU6bnVtYmVyID0gTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSArIG1pbjtcbiAgICAgICAgaWYodmFsdWU+bWF4KXtcbiAgICAgICAgICAgIHZhbHVlID0gbWF4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0VGV4YnlQa2dBbmROYW1lKCBwa2duYW1lOnN0cmluZyx0ZXhuYW1lOnN0cmluZyApOkxheWEuVGV4dHVyZVxuICAgIHtcbiAgICAgICAgdmFyIHVpcGFja2FnZTpmYWlyeWd1aS5VSVBhY2thZ2UgPSBmYWlyeWd1aS5VSVBhY2thZ2UuZ2V0QnlOYW1lKHBrZ25hbWUpO1xuICAgICAgICBpZiggdWlwYWNrYWdlIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHVpcGFja2FnZS5nZXRJdGVtQXNzZXRCeU5hbWUodGV4bmFtZSkgYXMgTGF5YS5UZXh0dXJlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIh+WJsuWIhuWPt+WPmOaIkFBvaW505a+56LGhXG4gICAgICogQHBhcmFtIHN0ciBcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0ZmVuaGFvUG9pbnQoIHN0cjpzdHJpbmcgKTpMYXlhLlBvaW50XG4gICAge1xuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCI7XCIpO1xuICAgICAgICByZXR1cm4gbmV3IExheWEuUG9pbnQoIE51bWJlciggYXJyWzBdICksTnVtYmVyKCBhcnJbMV0gKSApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIh+WJsuWIhuWPt+WPmOaIkOaVsOaNrihudW1iZXIpXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dGZlbmhhb3RvQXJybnVtKCBzdHI6c3RyaW5nICk6QXJyYXk8bnVtYmVyPlxuICAgIHtcbiAgICAgICAgdmFyIG51bUFycjpBcnJheTxudW1iZXI+PVtdO1xuICAgICAgICBpZiAoc3RyID09IFwiXCIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBudW1BcnI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiO1wiKTtcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcbiAgICAgICAgZm9yKCBpO2k8YXJyLmxlbmd0aDtpKysgKVxuICAgICAgICB7XG4gICAgICAgICAgICBudW1BcnIucHVzaCggTnVtYmVyKCBhcnJbaV0gKSApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1BcnI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5YiH5Ymy5YiG5Y+35Y+Y5oiQ5pWw5o2uKHN0cmluZylcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0ZmVuaGFvdG9BcnJzdHIoIHN0cjpzdHJpbmcgKTpBcnJheTxzdHJpbmc+XG4gICAge1xuICAgICAgICByZXR1cm4gc3RyLnNwbGl0KFwiO1wiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliIflibLliIblj7flj5jmiJDmlbDmja4oIHsga2V5OjEsdmFsdWU6MSB9IClcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0ZmVuaGFvdG9PYmooIHN0cjpzdHJpbmcgKTphbnlcbiAgICB7XG4gICAgICAgIHZhciBvYmo6YW55ID0ge307XG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdCggXCI7XCIgKTtcbiAgICAgICAgb2JqLmtleSA9IGFyclswXTtcbiAgICAgICAgb2JqLnZhbHVlID0gYXJyWzFdO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8qKuWIh+WJsnN0ciovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dHN0cnRvQXJyKCBzdHI6c3RyaW5nICk6QXJyYXk8c3RyaW5nPlxuICAgIHtcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KCBcInxcIiApO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIC8qKuWIh+WJsnN0ciggMToxfDE6MSApIHRvIEFycmF5PHsga2V5OjEsdmFsdWU6MSB9PiAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRzdHJ0b0FycjEoIHN0cjpzdHJpbmcgKTpBcnJheTxhbnk+XG4gICAge1xuICAgICAgICB2YXIgcmVzbHV0QXJyOkFycmF5PGFueT49W107XG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdCggXCJ8XCIgKTtcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcbiAgICAgICAgZm9yKCBpPTA7aTxhcnIubGVuZ3RoO2krKyApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBpdGVtYXJyOkFycmF5PHN0cmluZz4gPSBhcnJbaV0uc3BsaXQoIFwiO1wiICk7XG4gICAgICAgICAgICByZXNsdXRBcnIucHVzaCggeyBrZXk6aXRlbWFyclswXSx2YWx1ZTppdGVtYXJyWzFdIH0gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzbHV0QXJyO1xuICAgIH1cblxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRzdHJ0b09iaiggc3RyOnN0cmluZyApOmFueVxuICAgIHtcbiAgICAgICAgdmFyIHJlc3VsdG9iajphbnkgPSB7fTtcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KCBcInxcIiApO1xuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xuICAgICAgICBmb3IoIGk9MDtpPGFyci5sZW5ndGg7aSsrIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGl0ZW1hcnI6QXJyYXk8c3RyaW5nPiA9IGFycltpXS5zcGxpdCggXCI7XCIgKTtcbiAgICAgICAgICAgIHJlc3VsdG9ialtpdGVtYXJyWzBdXSA9IGl0ZW1hcnJbMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdG9iajtcbiAgICB9XG5cbiAgICBleHBvcnQgZnVuY3Rpb24gY29tcGFyZVZlcnNpb24odjEsIHYyKTpudW1iZXJcbiAgICB7XG4gICAgICAgIHYxID0gdjEuc3BsaXQoJy4nKTtcbiAgICAgICAgdjIgPSB2Mi5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1heCh2MS5sZW5ndGgsIHYyLmxlbmd0aCk7XG4gICAgICAgIHdoaWxlICh2MS5sZW5ndGggPCBsZW4pIHtcbiAgICAgICAgICAgIHYxLnB1c2goJzAnKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodjIubGVuZ3RoIDwgbGVuKSB7XG4gICAgICAgICAgICB2Mi5wdXNoKCcwJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbnVtMSA9IHBhcnNlSW50KHYxW2ldKTtcbiAgICAgICAgICAgIGNvbnN0IG51bTIgPSBwYXJzZUludCh2MltpXSk7XG4gICAgICAgICAgICBpZiAobnVtMSA+IG51bTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtMSA8IG51bTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufSIsImltcG9ydCB7IFdvcmRUaXBzUGFuZWwgfSBmcm9tIFwiLi4vVmlldy9HbG9iYWxUaXBQYW5lbFwiO1xuaW1wb3J0IHsgTGF5b3V0Q29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL0xheW91dENvbnRyb2xcIjtcbmltcG9ydCB7IExheU9VVCB9IGZyb20gXCIuLi91dGlscy9MYXlPVVRcIjtcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xuXG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBjbGFzcyBHbG9iYWxUaXBcbntcbiAgICBzdGF0aWMgd29yZExpc3Q6QXJyYXk8V29yZFRpcHNQYW5lbD4gPSBbXTtcbiAgICBzdGF0aWMgc2hvd1dvcmRMaXN0OkFycmF5PFdvcmRUaXBzUGFuZWw+ID0gW107XG4gICAgc3RhdGljIG1heE51bTpudW1iZXIgPSAxMDtcbiAgICBzdGF0aWMgaXNFdmVudDpib29sZWFuID0gZmFsc2U7XG4gICAgXG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6R2xvYmFsVGlwO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIEdsb2JhbFRpcC5pbnMgPSB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6R2xvYmFsVGlwXG4gICAge1xuICAgICAgICBpZiggR2xvYmFsVGlwLmlucyA9PSBudWxsIClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBHbG9iYWxUaXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gR2xvYmFsVGlwLmlucztcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgR2xvYmFsVGlwLmlzRXZlbnQgPSB0cnVlO1xuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKCBHYW1lU3RhdGUucmVtb3Zlc2VsZWN0LHRoaXMsdGhpcy5hZGR3b3JkTGlzdCApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93V29yZFRpcHMoIHdvcmQ6c3RyaW5nICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoICFHbG9iYWxUaXAuaXNFdmVudCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5pbml0RXZlbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiggR2xvYmFsVGlwLnNob3dXb3JkTGlzdC5sZW5ndGggPiAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGxhc3R3b3JkOnN0cmluZyA9IEdsb2JhbFRpcC5zaG93V29yZExpc3RbR2xvYmFsVGlwLnNob3dXb3JkTGlzdC5sZW5ndGgtMV0ubm93d29yZDtcbiAgICAgICAgICAgIC8vIGlmKCBsYXN0d29yZCA9PSB3b3JkIClcbiAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYoIEdsb2JhbFRpcC53b3JkTGlzdC5sZW5ndGggPiAwIClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGl0ZW06V29yZFRpcHNQYW5lbCA9IEdsb2JhbFRpcC53b3JkTGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5BZGRMYXllckJ5TmFtZSggaXRlbSxMYXlPVVQuVElQICk7XG4gICAgICAgICAgICBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICBpdGVtLnNob3dXb3JkKCB3b3JkICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiggR2xvYmFsVGlwLnNob3dXb3JkTGlzdC5sZW5ndGggPCAxMCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0xOldvcmRUaXBzUGFuZWwgPSBuZXcgV29yZFRpcHNQYW5lbCgpO1xuICAgICAgICAgICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UuQWRkTGF5ZXJCeU5hbWUoIGl0ZW0xLExheU9VVC5USVAgKTtcbiAgICAgICAgICAgICAgICBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0LnB1c2goaXRlbTEpO1xuICAgICAgICAgICAgICAgIGl0ZW0xLnNob3dXb3JkKCB3b3JkICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0xOldvcmRUaXBzUGFuZWwgPSBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaXRlbTEuc2hvd1dvcmQoIHdvcmQgKTtcbiAgICAgICAgICAgICAgICBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0LnB1c2goaXRlbTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhZGR3b3JkTGlzdCggaXRlbTpXb3JkVGlwc1BhbmVsICk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIGl0ZW0gKVxuICAgICAgICB7XG4gICAgICAgICAgICBpdGVtLnJlbW92ZUZyb21QYXJlbnQoKTtcbiAgICAgICAgICAgIHZhciBpbmRleDpudW1iZXIgPSBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0LmluZGV4T2YoIGl0ZW0gKTtcbiAgICAgICAgICAgIGlmKCBpbmRleCAhPSAtMSApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgR2xvYmFsVGlwLnNob3dXb3JkTGlzdC5zcGxpY2UoIGluZGV4LDEgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UuQ2xlYXJMYXllckJ5TmFtZShMYXlPVVQuVElQICk7XG4gICAgICAgICAgICBHbG9iYWxUaXAud29yZExpc3QucHVzaCggaXRlbSApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4iLCJleHBvcnQgIGNsYXNzIExFdmVudCBleHRlbmRzIExheWEuRXZlbnRcbntcbiAgICBwdWJsaWMgQ0xBU1NfTkFNRTpzdHJpbmcgPSBcIkxFdmVudFwiO1xuICAgIHByaXZhdGUgX29iajphbnk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6c3RyaW5nLCBvYmo6YW55ID0gbnVsbCwgYnViYmxlczpib29sZWFuID0gZmFsc2UsIGNhbmNlbGFibGU6Ym9vbGVhbiA9IGZhbHNlKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYob2JqKXtcbiAgICAgICAgICAgIHRoaXMuX29iaiA9IG9iajtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbG9uZShvYmo/Ok9iamVjdCk6TEV2ZW50e1xuICAgICAgICByZXR1cm4gbmV3IExFdmVudCh0aGlzLnR5cGUsIG9iaj9vYmo6dGhpcy5fb2JqKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTp2b2lke1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLkNMQVNTX05BTUUsIFwidHlwZVwiLCBcImJ1YmJsZXNcIiwgXCJjYW5jZWxhYmxlXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS8oOWPguiOt+WPllxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgcHVibGljIGdldCBwYXJhbSgpOmFueXtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29iajtcbiAgICB9XG5cbn0iLCJcbmV4cG9ydCBjbGFzcyBMYXlPVVQge1xuICAgIC8qKlxuICAgICAqIOiDjOaZr+WxglxuICAgICAqL1xuICAgIHN0YXRpYyAgQkc6IHN0cmluZyA9IFwiQkdcIjtcbiAgICAvKipcbiAgICAgKiB1aeWxglxuICAgICAqL1xuICAgIHN0YXRpYyAgVUk6IHN0cmluZyA9IFwiVUlcIjtcblxuICAgIC8qKlxuICAgICAqIHVp5bGC5LiK5bGCXG4gICAgICovXG4gICAgc3RhdGljICBVSVRvcDogc3RyaW5nID0gXCJVSVRvcFwiO1xuICAgIC8qKlxuICAgICAqIHRpcHPlsYJcbiAgICAgKi9cbiAgICBzdGF0aWMgIFRJUDogc3RyaW5nID0gXCJUSVBcIjtcblxuICAgIC8qKlxuICAgICAqIOaWsOaJi+W8leWvvOWxglxuICAgICAqL1xuICAgIHN0YXRpYyAgR1VJREU6c3RyaW5nID0gXCJHVUlERVwiO1xuXG59XG4iLCIvKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCAgY2xhc3MgU2luZ2xldG9uIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcbntcbiAgICBwcml2YXRlIHN0YXRpYyBfZGljdDphbnkgPSB7fTtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgICAvKipcbiAgICAgKiDojrflj5bljZXkvovnsbvvvIzoi6XkuI3lrZjlnKjliJnov5Tlm57nqbpcbiAgICAgKiBAcGFyYW1cdHJlZiDnu6fmib/oh6pTaW5nbGV0b27nmoTnsbtcbiAgICAgKiBAcmV0dXJuXHQqXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBJbnN0YW5jZShyZWY6YW55KTphbnlcbiAgICB7XG4gICAgICAgIGlmKCByZWYua2V5ID09IG51bGwgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnZXRpbnN0YW5jZSBlcnJvXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kaWN0W3JlZi5rZXldO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiDojrflj5bljZXkvovnsbvvvIzoi6XkuI3lrZjlnKjliJnliJvlu7pcbiAgICAgKiBAcGFyYW1cdHJlZlx0XHTnu6fmib/oh6pTaW5nbGV0b27nmoTnsbtcbiAgICAgKiBAcmV0dXJuXHQqXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZU9yQ3JlYXRlKHJlZjphbnkpOmFueVxuICAgIHtcbiAgICAgICAgaWYoIHJlZi5rZXkgPT0gbnVsbCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdldEluc3RhbmNlT3JDcmVhdGUgZXJyb1wiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNyZWF0ZShyZWYpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGljdFtyZWYua2V5XTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAqIOWIm+W7uuWNleS+i+exu1xuICAgKiBAcGFyYW1cdHJlZlx0XHTnu6fmib/oh6pTaW5nbGV0b27nmoTnsbtcbiAgICogQHJldHVyblx0dm9pZFxuICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShyZWY6YW55KTphbnlcbiAgICB7XG4gICAgICAgIGlmKCByZWYua2V5ID09IG51bGwgKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjcmVhdGUgZXJyb1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLl9kaWN0W3JlZi5rZXldID09IG51bGwpIFxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9kaWN0W3JlZi5rZXldID0gbmV3IHJlZigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kaWN0W3JlZi5rZXldO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgICAgICog5Yig6Zmk5Y2V5L6L57G7XG4gICAgICAgICAqIEBwYXJhbVx0cmVmXHRcdOe7p+aJv+iHqlNpbmdsZXRvbueahOexu1xuICAgICAgICAgKiBAcmV0dXJuXHR2b2lkXG4gICAgICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlKHJlZjphbnkpOnZvaWRcblx0e1xuICAgICAgICB2YXIga2V5OnN0cmluZyA9IHJlZi5rZXk7XG4gICAgICAgIGlmKHRoaXMuX2RpY3Rba2V5XSAhPSBudWxsKSBcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fZGljdFtrZXldLmRlc3RvcnkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAqIOmUgOavgeaWueazlVxuICAgICovXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXG4gICAge1xuICAgICAgICBcbiAgICB9XG59IiwiaW1wb3J0IHtQYW5lbENoaWxkQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2xcIjtcbmltcG9ydCB7U2tpbkRhdGF9IGZyb20gXCIuLi9EYXRhL1NraW5EYXRhXCI7XG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5U2tpblwiO1xuaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWNcIjtcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XG5pbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4uL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xuaW1wb3J0IE1vdmllQ2xpcCA9IExheWEuTW92aWVDbGlwO1xuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi9XWFNESy90dGFkXCI7XG5leHBvcnQgY2xhc3MgU2tpbkl0ZW0gZXh0ZW5kcyBmYWlyeWd1aS5HQnV0dG9uIFxue1xuICAgIGxvYWRfaWNvbjpmYWlyeWd1aS5HTG9hZGVyO1xuICAgIGNfc3RhdGU6ZmFpcnlndWkuQ29udHJvbGxlcjtcbiAgICB0eHRfbmVlZDpmYWlyeWd1aS5HVGV4dEZpZWxkO1xuICAgIHBpZnV2bzpTa2luRGF0YTtcbiAgICBidG5fMDpmYWlyeWd1aS5HTG9hZGVyO1xuICAgIHByaXZhdGUgYWdlbmN5c2tpbjpBZ2VuY3lTa2luO1xuICAgIGNvbnN0cnVjdG9yKCkgXG4gICAgeyBcbiAgICAgICAgc3VwZXIoKTsgXG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIGJnQ29sb3JDaGFubmVsczogYW55ID0geyByOiA5OSwgZzogMCwgYjogMHhGRiB9O1xuICAgIHByaXZhdGUgZ2V0SGV4Q29sb3JTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgdGhpcy5iZ0NvbG9yQ2hhbm5lbHMuciA9IE1hdGguZmxvb3IodGhpcy5iZ0NvbG9yQ2hhbm5lbHMucik7XG4gICAgICAgIC8vIOe7v+iJsumAmumBk+S9v+eUqDBcbiAgICAgICAgdGhpcy5iZ0NvbG9yQ2hhbm5lbHMuZyA9IDA7XG4gICAgICAgIC8vb2JqLmcgPSBNYXRoLmZsb29yKG9iai5nKTtcbiAgICAgICAgdGhpcy5iZ0NvbG9yQ2hhbm5lbHMuYiA9IE1hdGguZmxvb3IodGhpcy5iZ0NvbG9yQ2hhbm5lbHMuYik7XG5cbiAgICAgICAgdmFyIHI6IFN0cmluZyA9IHRoaXMuYmdDb2xvckNoYW5uZWxzLnIudG9TdHJpbmcoMTYpO1xuICAgICAgICByID0gci5sZW5ndGggPT0gMiA/IHIgOiBcIjBcIiArIHI7XG4gICAgICAgIHZhciBnOiBTdHJpbmcgPSB0aGlzLmJnQ29sb3JDaGFubmVscy5nLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgZyA9IGcubGVuZ3RoID09IDIgPyBnIDogXCIwXCIgKyBnO1xuICAgICAgICB2YXIgYjogU3RyaW5nID0gdGhpcy5iZ0NvbG9yQ2hhbm5lbHMuYi50b1N0cmluZygxNik7XG4gICAgICAgIGIgPSBiLmxlbmd0aCA9PSAyID8gYiA6IFwiMFwiICsgYjtcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgciArIGcgKyBiO1xuICAgIH1cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEZyb21YTUwoeG1sOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIuY29uc3RydWN0RnJvbVhNTCh4bWwpO1xuICAgICAgICBmb3IgKHZhciBzdHIgaW4gdGhpcy5fY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHZhciBpdGVtOiBmYWlyeWd1aS5HT2JqZWN0ID0gdGhpcy5fY2hpbGRyZW5bc3RyXTtcbiAgICAgICAgICAgIHRoaXNbaXRlbS5uYW1lXSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkluaXQoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5pbml0VmlldygpO1xuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFZpZXcoKTp2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmFnZW5jeXNraW4gPSBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oIEFnZW5jeVNraW4gKTtcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyKCBcImNfc3RhdGVcIiApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5vbiggTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuYnRuY2xpY2sgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ0bmNsaWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoIHRoaXMucGlmdXZvIClcbiAgICAgICAge1xuICAgICAgICAgICAgc3dpdGNoKCB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTogLy/mi6XmnIlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZ2VuY3lza2luLkdhaW5QaWZ1KCB0aGlzLnBpZnV2byApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjovL+a0u+WKqOiOt+WPllxuICAgICAgICAgICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKFwi5pqC5pyq5byA5pS+XCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzovL+eci+inhumikeiOt+WPllxuICAgICAgICAgICAgICAgIHRoaXMucGxheXZpZGVvY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGluZ3RhaXV0aWxzLkluc3RhbmNlLnBsYXlWaWRlbyggXCJcIix0aGlzLHRoaXMucGxheXZpZGVvY2FsbGJhY2sgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6Ly/ph5HluIHotK3kubBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZ2VuY3lza2luLkdhaW5QaWZ1KCB0aGlzLnBpZnV2byApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIFNXRlBhdGg6IHN0cmluZyA9IFwicmVzL3N3Zi9kcmFnb24uc3dmXCI7XG5cblx0XHRwcml2YXRlIE1DV2lkdGg6IG51bWJlciA9IDMxODtcblx0XHRwcml2YXRlIE1DSGVpZ2h0OiBudW1iZXIgPSA0MDY7XG4gICAgcHJpdmF0ZSBjcmVhdGVNb3ZpZUNsaXAoKTogdm9pZCB7XG4gICAgICAgIHZhciBtYzogTW92aWVDbGlwID0gbmV3IE1vdmllQ2xpcCgpO1xuICAgICAgICBtYy5sb2FkKHRoaXMuU1dGUGF0aCk7XG5cbiAgICAgICAgbWMueCA9IChMYXlhLnN0YWdlLndpZHRoIC0gdGhpcy5NQ1dpZHRoKSAvIDI7XG4gICAgICAgIG1jLnkgPSAoTGF5YS5zdGFnZS5oZWlnaHQgLSB0aGlzLk1DSGVpZ2h0KSAvIDI7XG5cbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChtYyk7XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbiAgICBwcml2YXRlIHBsYXl2aWRlb2NhbGxiYWNrKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdHRhZC5TaG93VmlkZW8oKGlzTG9hZD0+e1xuICAgICAgICAgICAgaWYoaXNMb2FkKXtcbiAgICAgICAgICAgICAgICB0aGlzLmFnZW5jeXNraW4uR2FpblBpZnUoIHRoaXMucGlmdXZvICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKSBcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd0RhdGEoIHZvOlNraW5EYXRhICk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5waWZ1dm8gPSB2bztcbiAgICAgICAgaWYoIHRoaXMucGlmdXZvIClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5sb2FkX2ljb24uaWNvbiA9IEFzc2V0UGF0aC5nZXRyb2xlaWNvbiggdGhpcy5waWZ1dm8ucm9sZUNGRy5pY29uICk7XG4gICAgICAgICAgICBpZiggdGhpcy5hZ2VuY3lza2luLlJvbGVEYXRhLkNoYXJhY3RlcklEID09IHRoaXMucGlmdXZvLnJvbGVDRkcuaWQgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMucGlmdXZvLnN0YXRlID09IDEgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMucGlmdXZvLnJvbGVDRkcuZ2V0U3RhdGUgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eHRfbmVlZC50ZXh0ID0gdGhpcy5waWZ1dm8uaGFzbnVtICsgXCIvXCIgKyB0aGlzLnBpZnV2by5yb2xlQ0ZHLm5lZWQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR4dF9uZWVkLnRleHQgPSB0aGlzLnBpZnV2by5yb2xlQ0ZHLm5lZWQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4gICAgcHJpdmF0ZSBwcmVGaXhOdW1iZXIobnVtOm51bWJlciwgc3RyTGVuOm51bWJlcik6c3RyaW5nXG4gICAge1xuICAgICAgICByZXR1cm4gKFwiMDAwMDAwMDAwMFwiICsgbnVtKS5zbGljZSgtc3RyTGVuKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV2YWxCZ0NvbG9yKCk6IHZvaWQge1xuICAgICAgICB2YXIgY29sb3I6IG51bWJlciA9IE1hdGgucmFuZG9tKCkgKiAweEZGRkZGRjtcbiAgICAgICAgdmFyIGNoYW5uZWxzOiBBcnJheTxudW1iZXI+ID0gdGhpcy5nZXRDb2xvckNoYW5uYWxzKGNvbG9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbG9yQ2hhbm5hbHMoY29sb3I6IG51bWJlcik6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICB2YXIgcmVzdWx0OiBBcnJheTxudW1iZXI+ID0gW107XG4gICAgICAgIHJlc3VsdC5wdXNoKGNvbG9yID4+IDE2KTtcbiAgICAgICAgcmVzdWx0LnB1c2goY29sb3IgPj4gOCAmIDB4RkYpO1xuICAgICAgICByZXN1bHQucHVzaChjb2xvciAmIDB4RkYpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5vZmYoIExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bmNsaWNrICk7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgXG59IiwiLyoqXG4gKiDnu6fmib9iYXNlVmlld+eVjOmdoueahOaJk+W8gOWFs+mXreWKqOaViOexu+Wei1xuICovXG5leHBvcnQgY2xhc3MgVmlld0FjdGlvbiBcbnsgICBcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIF90ZXh0OkxheWEuVGV4dCA9IG51bGw7XG4gICAgXHQvKipcblx0ICog5Yqo55S754q25oCB5byA5aeL5pe25omn6KGM44CCXG5cdCAqL1xuXHRwdWJsaWMgb25TdGF0ZUVudGVyKCk6dm9pZCB7XG5cdFx0Y29uc29sZS5sb2coXCLliqjnlLvlvIDlp4vmkq3mlL7kuoZcIik7XG5cdFx0dGhpcy5fdGV4dC50ZXh0ID0gXCLliqjnlLvnirbmgIHvvJrliqjnlLvlvIDlp4vmkq3mlL5cIjtcblx0fVxuXHRcdFxuXHQvKipcblx0ICog5Yqo55S754q25oCB5pu05paw5pe25omn6KGM44CCXG5cdCAqL1xuXHRwdWJsaWMgb25TdGF0ZVVwZGF0ZSgpOnZvaWQge1xuXHRcdGNvbnNvbGUubG9nKFwi5Yqo55S754q25oCB5pu05paw5LqGXCIpO1xuXHRcdHRoaXMuX3RleHQudGV4dCA9IFwi5Yqo55S754q25oCB77ya5Yqo55S75pu05paw5LitXCI7XG5cdH1cblx0XHRcblx0LyoqXG5cdCAqIOWKqOeUu+eKtuaAgemAgOWHuuaXtuaJp+ihjOOAglxuXHQgKi9cblx0cHVibGljIG9uU3RhdGVFeGl0KCk6dm9pZCB7XG5cdFx0Y29uc29sZS5sb2coXCLliqjnlLvpgIDlh7rkuoZcIik7XG5cdFx0dGhpcy5fdGV4dC50ZXh0ID0gXCLliqjnlLvnirbmgIHvvJrliqjnlLvlvIDlp4vpgIDlh7pcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICog5LuO5bCP5Y+Y5aSnXG4gICAgICovXG4gICAgc3RhdGljIEFjdGlvblR5cGVfYWRkc2NhbGVNaW5Ub01heDpzdHJpbmcgPSBcIkFjdGlvblR5cGVfYWRkc2NhbGVNaW5Ub01heFwiO1xuXG4gICAgLyoqXG4gICAgICog5LuO5aSn5Y+Y5bCP56e75Ye6XG4gICAgICovXG4gICAgc3RhdGljIEFjdGlvblR5cGVfcmVtb3Zlc2NhbGVNYXhUb01pbjpzdHJpbmcgPSBcIkFjdGlvblR5cGVfcmVtb3Zlc2NhbGVNYXhUb01pblwiO1xuXG4gICAgLyoqXG4gICAgICog5rKh5pyJ5Yqo5pWIXG4gICAgICovXG4gICAgc3RhdGljIEFjdGlvblR5cGVfbm9uZTpzdHJpbmcgPSBcIkFjdGlvblR5cGVfbm9uZVwiO1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbiAgICBwcml2YXRlIHNjZW5lOkxheWEuU2NlbmUzRDtcbiAgICBwcml2YXRlIG1hdDE6TGF5YS5CbGlublBob25nTWF0ZXJpYWw7IFxuICAgIHByaXZhdGUgbWVzaDE6TGF5YS5NZXNoO1xuICAgIHByaXZhdGUgbWVzaDI6TGF5YS5NZXNoO1xuICAgIHB1YmxpYyBhZGRCb3goKTp2b2lkXG4gICAge1xuICAgICAgICBmb3IgKGxldCBpOm51bWJlciA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYWRkVmVydGljYWxCb3goLTAuNjUsIDAuMTY1ICsgaSAqIDAuMzMgKiAyLCAwKTtcbiAgICAgICAgICAgIHRoaXMuYWRkVmVydGljYWxCb3goMCwgMC4xNjUgKyBpICogMC4zMyAqIDIsIDApO1xuICAgICAgICAgICAgdGhpcy5hZGRWZXJ0aWNhbEJveCgwLjY1LCAwLjE2NSArIGkgKiAwLjMzICogMiwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFkZFZlcnRpY2FsQm94KHg6bnVtYmVyLCB5Om51bWJlciwgejpudW1iZXIpOnZvaWRcbiAgICB7XG4gICAgICAgIHZhciBib3g6TGF5YS5NZXNoU3ByaXRlM0QgPSB0aGlzLnNjZW5lLmFkZENoaWxkKG5ldyBMYXlhLk1lc2hTcHJpdGUzRCh0aGlzLm1lc2gxKSkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XG4gICAgICAgIGJveC5tZXNoUmVuZGVyZXIubWF0ZXJpYWwgPSB0aGlzLm1hdDE7XG4gICAgICAgIGJveC5tZXNoUmVuZGVyZXIuY2FzdFNoYWRvdyA9IHRydWU7XG4gICAgICAgIGJveC5tZXNoUmVuZGVyZXIucmVjZWl2ZVNoYWRvdyA9IHRydWU7XG4gICAgICAgIGJveC50cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKHgsIHksIHopO1xuICAgICAgICBcbiAgICAgICAgdmFyIHJpZ2lkQm9keTpMYXlhLlJpZ2lkYm9keTNEID0gYm94LmFkZENvbXBvbmVudChMYXlhLlJpZ2lkYm9keTNEKSBhcyBMYXlhLlJpZ2lkYm9keTNEO1xuICAgICAgICByaWdpZEJvZHkubWFzcyA9IDEwO1xuICAgICAgICByaWdpZEJvZHkuZnJpY3Rpb24gPSAwLjQ7XG4gICAgICAgIHJpZ2lkQm9keS5yZXN0aXR1dGlvbiA9IDAuMjtcbiAgICAgICAgdmFyIGJveFNoYXBlOkxheWEuQm94Q29sbGlkZXJTaGFwZSA9IG5ldyBMYXlhLkJveENvbGxpZGVyU2hhcGUoMC41LCAwLjMzLCAyKTtcbiAgICAgICAgcmlnaWRCb2R5LmNvbGxpZGVyU2hhcGUgPSBib3hTaGFwZTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG5cbiAgICAvKipcbiAgICAgKiDku47lj7Povrnnp7vliqjliLDkuK3lpK5cbiAgICAgKi9cbiAgICBzdGF0aWMgQWN0aW9uVHlwZV9hZGRtb3ZlVG9NaWRkbGU6c3RyaW5nPVwiQWN0aW9uVHlwZV9hZGRtb3ZlVG9NaWRkbGVcIjtcbiAgICAvKipcbiAgICAgKiDku47mnIDlj7Povrnnp7vlh7pcbiAgICAgKi9cbiAgICBzdGF0aWMgQWN0aW9uVHlwZV9yZW1vdmVtb3ZlVG9SaWdodDpzdHJpbmcgPSBcIkFjdGlvblR5cGVfcmVtb3ZlbW92ZVRvUmlnaHRcIjtcblxuICAgIC8qKlxuICAgICAqIOS7juW6lemDqOWQkeS4iuenu+WKqFxuICAgICAqL1xuICAgIHN0YXRpYyBBY3Rpb25UeXBlX2FkZG1vdmVGcm9tQm90dG9tOnN0cmluZz1cIkFjdGlvblR5cGVfYWRkbW92ZUZyb21Cb3R0b21cIjtcbiAgICAvKipcbiAgICAgKiDku47kuIrlkJHlupXpg6jnp7vliqhcbiAgICAgKi9cbiAgICBzdGF0aWMgQWN0aW9uVHlwZV9hZGRtb3ZlRnJvbXVwOnN0cmluZz1cIkFjdGlvblR5cGVfYWRkbW92ZUZyb211cFwiO1xuXG4gICAgXG5cbiAgICBcbn0iXX0=