fight.js 698 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/common/fight.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
  12. cc._RF.push(module, 'f5f42tcbclIcpDHlnWP5kBv', 'fight');
  13. // script/common/fight.ts
  14. // import * as Xys from "./Xys";
  15. // import Gamecfg from "./gameCfg";
  16. // import { SeedRand, gameMethod } from "./gameMethod";
  17. // //辅助函数 - 添加属性值
  18. // interface skbuff_add_cs {
  19. // fiid: string; //添加对象
  20. // key: string; //属性key
  21. // minZhen: number; //开始帧
  22. // maxZhen: number; //结束帧
  23. // overlayType: number; // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  24. // ceng: number; //增加层数
  25. // eps: { [key: string]: number }; //属性
  26. // }
  27. // interface Gzhit {
  28. // pghit: number; //普攻伤害
  29. // skhit: number; //技能伤害
  30. // bjhit: number; //暴击伤害
  31. // gdhit: number; //格挡伤害
  32. // fjhit: number; //反击伤害
  33. // ljhit: number; //连击伤害
  34. // jshit: number; //溅射伤害(没有折损比例系数)
  35. // xxhit: number; //吸血值
  36. // xxRate: number; //吸血概率
  37. // jsRate: number; //溅射概率
  38. // fjsRate: number; //反击溅射概率
  39. // }
  40. // interface timer_add_cs {
  41. // iid: string; //触发者
  42. // fiids: string[]; //触发对象
  43. // key: string; //定时器标识
  44. // type: number[]; //执行触发点
  45. // func: "sk_effect" | "sk_action"; //执行的函数名
  46. // lzhen: number; //轮询执行时间
  47. // ezhen: number; //结束时间
  48. // skid: string; //技能ID
  49. // aeid: string; //效果ID|行为ID
  50. // cs: { [key: string]: number }; //参数
  51. // overlayType: number; // 1:叠加 2:不叠加替换
  52. // }
  53. // export class Fight {
  54. // teams: { [iid: string]: Xys.FightTeam } = {}; //战斗成员列表
  55. // seedRand: SeedRand; //随机种子函数
  56. // from: string; //战斗类型
  57. // timerId: number = 1; //定时计数器
  58. // uuids: {
  59. // [iid: string]: {
  60. // drain_sk: number; // 是否带有灵力术法
  61. // last: number; //最后一次出手帧
  62. // last2: number; //真正出手的帧
  63. // cons: number[]; //攻击次数 (普通+技能,被动不算) [攻击次数,连击次数,反击次数]
  64. // fcons: number[]; //被攻击次数 (普通+技能,被动不算) [攻击次数,连击次数,反击次数]
  65. // dzhen: number; //死亡的帧数
  66. // fpk: string; //最后一次伤害我的对象
  67. // ipk: string; //我打的最后一个
  68. // ipks: { [zhen: number]: string[] }; //我打的最后一个
  69. // podun: string[]; //盾没有了需要清除buff
  70. // skbuff: {
  71. // [key: string]: {
  72. // szhen: number; //开始帧
  73. // ezhen: number; //结束帧
  74. // eps: { [key: string]: number }; //属性值
  75. // }[];
  76. // };
  77. // skbase: {
  78. // //技能触发
  79. // [base_id: string]: {
  80. // last: number; //技能最后一次出手帧
  81. // count: number;
  82. // action: {
  83. // [action_id: string]: {};
  84. // };
  85. // effect: {
  86. // [effect_id: string]: {
  87. // effectZhen: number; //触发效果的帧(有时候同时一个攻击 好几个人触发效果分开计算的 会导致第一个人有触发 后面的没有触发)
  88. // effectEndZhen: number; //效果结束帧率(持续x秒,冷却x秒用的)
  89. // nextcd: number; //下一次冷却完成时间
  90. // count: number; //执行次数
  91. // f: number; //执行次数
  92. // };
  93. // };
  94. // };
  95. // };
  96. // //定时执行 [执行触发点,执行的函数名,轮询执行时间,技能ID, 效果ID|行为ID]
  97. // timer: {
  98. // [key: string]: {
  99. // [timerId: string]: {
  100. // fiids: string[]; //触发对象
  101. // type: number[]; //执行触发点
  102. // func: "sk_effect" | "sk_action"; //执行的函数名
  103. // szhen: number; //触发的帧
  104. // lzhen: number; //轮询执行时间
  105. // ezhen: number; //结束时间帧
  106. // skid: string; //技能ID
  107. // aeid: string; //效果ID|行为ID
  108. // cs: { [key: string]: number }; //
  109. // };
  110. // };
  111. // };
  112. // //执行触发点=>
  113. // //1:每帧开始执行 2:扣血执行 3:攻击后触发 4攻击前触发 5护体罡气破碎时触发
  114. // //6 :己方单位施加击退时 7 :普通攻击触发 8自身受到超过当前气血10%以上伤害时
  115. // //9:暴击触发
  116. // };
  117. // } = {}; //存放身份
  118. // objects: {
  119. // [len: string]: {
  120. // [type: string]: {
  121. // // 作用对象 1主角 2弟子 3兽灵
  122. // [skid: string]: {
  123. // //技能触发
  124. // cd: number; // 技能触发cd
  125. // sklv: number; // 技能等级
  126. // iids: {
  127. // [iid: string]: {
  128. // next: number; //技能最后一次出手帧
  129. // };
  130. // };
  131. // };
  132. // };
  133. // };
  134. // } = {}; //存放uid类型触发技能
  135. // zhen: number = 0; //初始帧
  136. // //单次出手临时记录
  137. // oneAtk: {
  138. // [iid: string]: {
  139. // [fiid: string]: {
  140. // aType: Xys.ActionType; //战斗动作类型
  141. // aSkid: ""; //使用的技能ID
  142. // effect: [string, number][]; //触发效果 [ [属性key,层数]]
  143. // buff: [string, number][]; //触发效果 [ [属性key,数值]]
  144. // };
  145. // };
  146. // } = {};
  147. // oneAtkiids: string[] = []; //日志顺序
  148. // //单帧出手对象
  149. // oneFiids: { [iid: string]: { [key: string]: string[] } } = {};
  150. // oneHit: {
  151. // [iid: string]: {
  152. // [fiid: string]: Gzhit;
  153. // };
  154. // } = {};
  155. // oneBuff: { [iid: string]: number } = {}; //存储当前帧 有改变buff的角色ID
  156. // mpfiids: { [iid: string]: [number, number] } = {}; // 单帧MP指回复一次
  157. // jsFiids: { [iid: string]: { [fiid: string]: number } } = {}; //溅射
  158. // //存储所有战场日志
  159. // outf: Xys.OverBack = {
  160. // win: 0, //0失败 1胜利
  161. // start: {
  162. // //初始阵容
  163. // from: "", //战斗类型
  164. // seed: 0, //随机种子
  165. // teams: {},
  166. // power: 0,
  167. // fPower: 0,
  168. // },
  169. // log: {}, //战斗日志列表
  170. // hurt: 0,
  171. // hp: 0, //战斗结束 对手剩余血量
  172. // tongji: {},
  173. // xhid:""
  174. // };
  175. // //血量变化相关字段
  176. // xueku: string[] = ["hp", "baoji", "lianji", "fanji", "canbeatback"];
  177. // // 减益buff
  178. // bateBuff: string[] = ["effect_i_1", "effect_i_3", "effect_i_4", "effect_i_5", "effect_i_6", "effect_i_7"];
  179. // teamFiids: string[] = [];
  180. // skBuff: {
  181. // [iid: string]: {
  182. // key: any;
  183. // value: any;
  184. // buff: {
  185. // [key: string]: {
  186. // key: any;
  187. // value: any;
  188. // };
  189. // };
  190. // };
  191. // } = {};
  192. // skTimer: {
  193. // [iid: string]: {
  194. // key: any;
  195. // value: any;
  196. // timer: {
  197. // [key: string]: {
  198. // key: any;
  199. // value: any;
  200. // };
  201. // };
  202. // };
  203. // } = {};
  204. // damage: {
  205. // [iid: string]: {
  206. // [fiid: string]: number;
  207. // };
  208. // } = {};
  209. // constructor(fightStart: Xys.ActFightStart) {
  210. // this.powerDisparity("1000", "100", fightStart.power, fightStart.fPower);
  211. // this.outf.start = gameMethod.objCopy(fightStart);
  212. // this.teams = gameMethod.objCopy(fightStart.teams); //战斗成员列表
  213. // this.seedRand = new SeedRand(fightStart.seed); //随机种子
  214. // this.from = fightStart.from; //战斗类型
  215. // this.teamFiids = Object.keys(this.teams);
  216. // this.war_init();
  217. // this.war_loop();
  218. // }
  219. // /*
  220. // * 技能buff
  221. // * this.uuids[cs.fiid].skbuff[cs.key]
  222. // * */
  223. // private changeSkBuff(sType: number, iid?: string | null, key?: string | null, type: number = 1, data?: any) {
  224. // switch (sType) {
  225. // case 1: // 查询 type:1.keys 2.values
  226. // if (iid) {
  227. // return this.getSkBuff(type, iid, key);
  228. // }
  229. // break;
  230. // case 2: // 更新/新增 type:1.替换 2.叠加
  231. // if (data) {
  232. // this.setSkBuff(data, iid, key, type);
  233. // }
  234. // break;
  235. // case 3: // 删除
  236. // if (iid) {
  237. // this.delSkBuff(iid, key);
  238. // }
  239. // break;
  240. // }
  241. // }
  242. // private setSkBuff(data: any, iid?: string | null, key?: string | null, type: number = 1) {
  243. // if (iid && key) {
  244. // if (type == 1) {
  245. // this.uuids[iid].skbuff[key] = data;
  246. // } else {
  247. // if (this.uuids[iid].skbuff[key] == null) {
  248. // this.uuids[iid].skbuff[key] = [];
  249. // }
  250. // this.uuids[iid].skbuff[key].push(...data);
  251. // }
  252. // if (this.skBuff[iid] == null) {
  253. // this.skBuff[iid] = { key: [], value: [], buff: {} };
  254. // }
  255. // if (this.skBuff[iid].buff[key] == null) {
  256. // this.skBuff[iid].buff[key] = { key: [], value: [] };
  257. // }
  258. // let keys2 = Object.keys(this.uuids[iid].skbuff);
  259. // let values2 = Object.values(this.uuids[iid].skbuff);
  260. // this.skBuff[iid].key = keys2;
  261. // this.skBuff[iid].value = values2;
  262. // this.skBuff[iid].buff[key].key = Object.keys(this.uuids[iid].skbuff[key]);
  263. // this.skBuff[iid].buff[key].value = Object.values(this.uuids[iid].skbuff[key]);
  264. // } else if (iid && !key) {
  265. // if (type == 1) {
  266. // this.uuids[iid].skbuff = data;
  267. // this.skBuff[iid] = { key: [], value: [], buff: {} };
  268. // } else {
  269. // this.uuids[iid].skbuff = Object.assign(this.uuids[iid].skbuff, data);
  270. // }
  271. // if (this.skBuff[iid] == null) {
  272. // this.skBuff[iid] = { key: [], value: [], buff: {} };
  273. // }
  274. // let keys2 = Object.keys(this.uuids[iid].skbuff);
  275. // let values2 = Object.values(this.uuids[iid].skbuff);
  276. // this.skBuff[iid].key = keys2;
  277. // this.skBuff[iid].value = values2;
  278. // for (let k = 0; k < keys2.length; k++) {
  279. // if (this.skBuff[iid].buff[keys2[k]] == null) {
  280. // this.skBuff[iid].buff[keys2[k]] = { key: [], value: [] };
  281. // }
  282. // this.skBuff[iid].buff[keys2[k]].key = Object.keys(this.uuids[iid].skbuff[keys2[k]]);
  283. // this.skBuff[iid].buff[keys2[k]].value = Object.values(this.uuids[iid].skbuff[keys2[k]]);
  284. // }
  285. // } else if (!iid && !key && data) {
  286. // let keys = this.teamFiids;
  287. // for (let i = 0; i < keys.length; i++) {
  288. // let keys2 = Object.keys(this.uuids[keys[i]].skbuff);
  289. // let values2 = Object.values(this.uuids[keys[i]].skbuff);
  290. // if (this.skBuff[keys[i]] == null) {
  291. // this.skBuff[keys[i]] = { key: [], value: [], buff: {} };
  292. // }
  293. // this.skBuff[keys[i]].key = keys2;
  294. // this.skBuff[keys[i]].value = values2;
  295. // for (let k = 0; k < keys2.length; k++) {
  296. // if (this.skBuff[keys[i]].buff[keys2[k]] == null) {
  297. // this.skBuff[keys[i]].buff[keys2[k]] = { key: [], value: [] };
  298. // }
  299. // this.skBuff[keys[i]].buff[keys2[k]].key = Object.keys(this.uuids[keys[i]].skbuff[keys2[k]]);
  300. // this.skBuff[keys[i]].buff[keys2[k]].value = Object.values(this.uuids[keys[i]].skbuff[keys2[k]]);
  301. // }
  302. // }
  303. // }
  304. // }
  305. // private delSkBuff(iid: string, key?: string | null) {
  306. // if (iid && key) {
  307. // delete this.uuids[iid].skbuff[key];
  308. // if (this.skBuff[iid] == null) {
  309. // this.skBuff[iid] = { key: [], value: [], buff: {} };
  310. // }
  311. // delete this.skBuff[iid].buff[key];
  312. // this.skBuff[iid].key = Object.keys(this.uuids[iid].skbuff);
  313. // this.skBuff[iid].value = Object.values(this.uuids[iid].skbuff);
  314. // } else if (iid && !key) {
  315. // if (this.skBuff[iid] == null) {
  316. // this.skBuff[iid] = { key: [], value: [], buff: {} };
  317. // }
  318. // this.uuids[iid].skbuff = {};
  319. // this.skBuff[iid].buff = {};
  320. // this.skBuff[iid].key = [];
  321. // this.skBuff[iid].value = [];
  322. // }
  323. // }
  324. // private getSkBuff(type: number, iid: string, key?: string | null) {
  325. // if (type == 1) {
  326. // if (iid && key) {
  327. // if (this.skBuff[iid] && this.skBuff[iid].buff[key]) {
  328. // return this.skBuff[iid].buff[key].key;
  329. // } else {
  330. // return [];
  331. // }
  332. // } else if (iid) {
  333. // if (this.skBuff[iid]) {
  334. // return this.skBuff[iid].key;
  335. // } else {
  336. // return [];
  337. // }
  338. // }
  339. // } else {
  340. // if (iid && key) {
  341. // if (this.skBuff[iid] && this.skBuff[iid].buff[key]) {
  342. // return this.skBuff[iid].buff[key].value;
  343. // } else {
  344. // return [];
  345. // }
  346. // } else if (iid) {
  347. // if (this.skBuff[iid]) {
  348. // return this.skBuff[iid].value;
  349. // } else {
  350. // return [];
  351. // }
  352. // }
  353. // }
  354. // }
  355. // /*
  356. // * 定时器timer
  357. // * this.uuids[iid].timer[key]
  358. // * */
  359. // private changeTimer(sType: number, iid?: string | null, key?: string | null, type: number = 1, data?: any) {
  360. // switch (sType) {
  361. // case 1: // 查询 type:1.keys 2.values
  362. // if (iid) {
  363. // return this.getTimer(type, iid, key);
  364. // }
  365. // break;
  366. // case 2: // 更新/新增 type:1.替换 2.叠加
  367. // if (data) {
  368. // this.setTimer(data, iid, key, type);
  369. // }
  370. // break;
  371. // case 3: // 删除
  372. // if (iid) {
  373. // this.delTimer(iid, key);
  374. // }
  375. // break;
  376. // }
  377. // }
  378. // private setTimer(data: any, iid?: string | null, key?: string | null, type: number = 1) {
  379. // if (iid && key) {
  380. // if (type == 1) {
  381. // this.uuids[iid].timer[key] = data;
  382. // } else {
  383. // if (this.uuids[iid].timer[key] == null) {
  384. // this.uuids[iid].timer[key] = {};
  385. // }
  386. // this.uuids[iid].timer[key] = Object.assign(this.uuids[iid].timer[key], data);
  387. // }
  388. // if (this.skTimer[iid] == null) {
  389. // this.skTimer[iid] = { key: [], value: [], timer: {} };
  390. // }
  391. // if (this.skTimer[iid].timer[key] == null) {
  392. // this.skTimer[iid].timer[key] = { key: [], value: [] };
  393. // }
  394. // let keys2 = Object.keys(this.uuids[iid].timer);
  395. // let values2 = Object.values(this.uuids[iid].timer);
  396. // this.skTimer[iid].key = keys2;
  397. // this.skTimer[iid].value = values2;
  398. // this.skTimer[iid].timer[key].key = Object.keys(this.uuids[iid].timer[key]);
  399. // this.skTimer[iid].timer[key].value = Object.values(this.uuids[iid].timer[key]);
  400. // } else if (iid && !key) {
  401. // if (type == 1) {
  402. // this.uuids[iid].timer = data;
  403. // this.skTimer[iid] = { key: [], value: [], timer: {} };
  404. // } else {
  405. // this.uuids[iid].timer = Object.assign(this.uuids[iid].timer, data);
  406. // }
  407. // if (this.skTimer[iid] == null) {
  408. // this.skTimer[iid] = { key: [], value: [], timer: {} };
  409. // }
  410. // let keys2 = Object.keys(this.uuids[iid].timer);
  411. // let values2 = Object.values(this.uuids[iid].timer);
  412. // this.skTimer[iid].key = keys2;
  413. // this.skTimer[iid].value = values2;
  414. // for (let k = 0; k < keys2.length; k++) {
  415. // if (this.skTimer[iid].timer[keys2[k]] == null) {
  416. // this.skTimer[iid].timer[keys2[k]] = { key: [], value: [] };
  417. // }
  418. // this.skTimer[iid].timer[keys2[k]].key = Object.keys(this.uuids[iid].timer[keys2[k]]);
  419. // this.skTimer[iid].timer[keys2[k]].value = Object.values(this.uuids[iid].timer[keys2[k]]);
  420. // }
  421. // } else if (!iid && !key && data) {
  422. // let keys = this.teamFiids;
  423. // for (let i = 0; i < keys.length; i++) {
  424. // let keys2 = Object.keys(this.uuids[keys[i]].timer);
  425. // let values2 = Object.values(this.uuids[keys[i]].timer);
  426. // if (this.skTimer[keys[i]] == null) {
  427. // this.skTimer[keys[i]] = { key: [], value: [], timer: {} };
  428. // }
  429. // this.skTimer[keys[i]].key = keys2;
  430. // this.skTimer[keys[i]].value = values2;
  431. // for (let k = 0; k < keys2.length; k++) {
  432. // if (this.skTimer[keys[i]].timer[keys2[k]] == null) {
  433. // this.skTimer[keys[i]].timer[keys2[k]] = { key: [], value: [] };
  434. // }
  435. // this.skTimer[keys[i]].timer[keys2[k]].key = Object.keys(this.uuids[keys[i]].timer[keys2[k]]);
  436. // this.skTimer[keys[i]].timer[keys2[k]].value = Object.values(this.uuids[keys[i]].timer[keys2[k]]);
  437. // }
  438. // }
  439. // }
  440. // }
  441. // private delTimer(iid: string, key?: string | null) {
  442. // if (iid && key) {
  443. // delete this.uuids[iid].timer[key];
  444. // if (this.skTimer[iid] == null) {
  445. // this.skTimer[iid] = { key: [], value: [], timer: {} };
  446. // }
  447. // if (this.skTimer[iid] && this.skTimer[iid].timer[key]) {
  448. // delete this.skTimer[iid].timer[key];
  449. // }
  450. // this.skTimer[iid].key = Object.keys(this.uuids[iid].timer);
  451. // this.skTimer[iid].value = Object.values(this.uuids[iid].timer);
  452. // } else if (iid && !key) {
  453. // if (this.skTimer[iid] == null) {
  454. // this.skTimer[iid] = { key: [], value: [], timer: {} };
  455. // }
  456. // this.uuids[iid].timer = {};
  457. // this.skTimer[iid].timer = {};
  458. // this.skTimer[iid].key = [];
  459. // this.skTimer[iid].value = [];
  460. // }
  461. // }
  462. // private getTimer(type: number, iid: string, key?: string | null) {
  463. // if (type == 1) {
  464. // if (iid && key) {
  465. // if (this.skTimer[iid] && this.skTimer[iid].timer[key]) {
  466. // return this.skTimer[iid].timer[key].key;
  467. // } else {
  468. // return [];
  469. // }
  470. // } else if (iid) {
  471. // if (this.skTimer[iid]) {
  472. // return this.skTimer[iid].key;
  473. // } else {
  474. // return [];
  475. // }
  476. // }
  477. // } else {
  478. // if (iid && key) {
  479. // if (this.skTimer[iid] && this.skTimer[iid].timer[key]) {
  480. // return this.skTimer[iid].timer[key].value;
  481. // } else {
  482. // return [];
  483. // }
  484. // } else if (iid) {
  485. // if (this.skTimer[iid]) {
  486. // return this.skTimer[iid].value;
  487. // } else {
  488. // return [];
  489. // }
  490. // }
  491. // }
  492. // }
  493. // /**
  494. // * 初始化战斗
  495. // */
  496. // private war_init() {
  497. // this.zhen = 1;
  498. // let minLast: number = 99999;
  499. // for (let index = 0; index < this.teamFiids.length; index++) {
  500. // let fiid = this.teamFiids[index];
  501. // //初始化 这里in没关系
  502. // let last = Math.ceil(30 / (this.teams[fiid].eps.speed / 10000));
  503. // minLast = Math.min(minLast, last);
  504. // }
  505. // minLast = -1 * (minLast - 5); // 最快的那个人从第五帧开始打
  506. // //初始化存储
  507. // let drain_sk: number = 0;
  508. // for (let index = 0; index < this.teamFiids.length; index++) {
  509. // let fiid = this.teamFiids[index];
  510. // if (drain_sk == 0 && ["100", "1000"].includes(fiid)) {
  511. // drain_sk = 1; // 直接都可以加
  512. // /*let skids: string[] = Object.keys(this.teams[fiid].sk);
  513. // for (let index = 0; index < skids.length; index++) {
  514. // let sk_base = Gamecfg.skillBase.getItem(skids[index], "1");
  515. // if (sk_base && sk_base.drain > 0) {
  516. // drain_sk = 1;
  517. // break;
  518. // }
  519. // }*/
  520. // }
  521. // //初始化 这里in没关系
  522. // this.uuids[fiid] = {
  523. // drain_sk: drain_sk,
  524. // last: minLast,
  525. // last2: 0,
  526. // cons: [0, 0, 0],
  527. // fcons: [0, 0, 0],
  528. // podun: [],
  529. // skbuff: {},
  530. // skbase: {},
  531. // fpk: "",
  532. // ipk: "", //我打的最后一个
  533. // ipks: {}, //我打的最后一个
  534. // dzhen: 0,
  535. // timer: {},
  536. // };
  537. // }
  538. // }
  539. // /**
  540. // * 开始战斗
  541. // */
  542. // private war_loop() {
  543. // this.outf.win = 0;
  544. // while (this.zhen < 1350) {
  545. // this.outf.log[this.zhen] = [];
  546. // this.oneAtkiids = [];
  547. // this.oneAtk = {};
  548. // this.mpfiids = {};
  549. // this.oneFiids = {}; //上一帧的对手清空
  550. // this.oneHit = {}; //上一帧的伤害清空
  551. // this.oneBuff = {}; //清除上一帧的变动buff的fiid
  552. // this.jsFiids = {};
  553. // if (this.zhen == 1) {
  554. // //触发进入战斗技能
  555. // for (let i = 0; i < this.teamFiids.length; i++) {
  556. // this.sk_baseObjRun4(this.teamFiids[i]); //技能转换
  557. // }
  558. // for (let i = 0; i < this.teamFiids.length; i++) {
  559. // this.sk_base(this.teamFiids[i], 4); //技能触发
  560. // }
  561. // //灵力满怒时释放
  562. // if (this.teams["100"] != null && this.teams["100"].eps.mp >= 10000) {
  563. // let result = this.sk_base("100", 3); //技能触发
  564. // if (result){ // 技能释放成功才扣怒气
  565. // this.add_mp("100", -10000, 2);
  566. // }
  567. // }
  568. // if (this.teams["1000"] != null && this.teams["1000"].eps.mp >= 10000) {
  569. // let result = this.sk_base("1000", 3); //技能触发
  570. // if (result){ // 技能释放成功才扣怒气
  571. // this.add_mp("1000", -10000, 2);
  572. // }
  573. // }
  574. // }
  575. // if (this.zhen == 2){
  576. // for (let i = 0; i < this.teamFiids.length; i++) {
  577. // if(this.teams[this.teamFiids[i]].type == 4 || this.teams[this.teamFiids[i]].type == 5){
  578. // this.sk_base(this.teamFiids[i], 1); //boss和秘境怪优先出手一次
  579. // }
  580. // }
  581. // }
  582. // this.pk_zhen_buff(); //一帧前
  583. // // if(this.zhen == 150 && this.teams["1002"] != null){
  584. // // this.jiesuo_hide("1002")
  585. // // this.teams["1002"].isHide = 0
  586. // // }
  587. // this.pk_zhen_atk(); //一帧中
  588. // this.pk_zhen_over(); //一帧后
  589. // this.jueSuanOneAtk();
  590. // //输出buff
  591. // this.skbuff_outf();
  592. // this.jueSuanOneAtk();
  593. // //删除空白日志
  594. // if (this.outf.log[this.zhen].length == 0) {
  595. // delete this.outf.log[this.zhen];
  596. // }
  597. // //判断胜负
  598. // let mfcount: number = 0; //我方活着的人数
  599. // let fcount: number = 0; //我方活着的人数
  600. // for (let index = 0; index < this.teamFiids.length; index++) {
  601. // let fiid = this.teamFiids[index];
  602. // //这里用in 没关系
  603. // if (this.teams[fiid].type == 3) {
  604. // continue; //兽灵不计入胜负计算
  605. // }
  606. // if (this.teams[fiid].type == 4 && Number(fiid) % 100 == 0 && this.teams[fiid].eps.hp <= 0) {
  607. // fcount = 0; // 如果是打boss的 boss死了战斗结束 胜利
  608. // break;
  609. // }
  610. // if (Math.floor(Number(fiid) / 100) >= 10 && (this.teams[fiid].eps.hp > 0 || this.skbuff_get(fiid,"effect_i_63",2) > 0)) {// 还可以复活
  611. // mfcount += 1;
  612. // }
  613. // if (Math.floor(Number(fiid) / 100) < 10 && (this.teams[fiid].eps.hp > 0 || this.skbuff_get(fiid,"effect_i_63",2) > 0)) { // 还可以复活
  614. // fcount += 1;
  615. // }
  616. // }
  617. // if (mfcount < 1) {
  618. // return; //输了
  619. // }
  620. // if (fcount < 1) {
  621. // this.outf.win = 1; //赢了
  622. // return;
  623. // }
  624. // this.zhen++;
  625. // }
  626. // }
  627. // /**
  628. // * 出手(前)
  629. // */
  630. // private pk_zhen_buff() {
  631. // //定时执行
  632. // for (let i = 0; i < this.teamFiids.length; i++) {
  633. // if (gameMethod.isEmpty(this.teams[this.teamFiids[i]].isHide) == false) {
  634. // continue; //隐藏
  635. // }
  636. // this.timer_do(601, { do_iid: Number(this.teamFiids[i]) }); //每帧检测
  637. // this.timer_do(602, { do_iid: Number(this.teamFiids[i]) }); //每帧检测
  638. // }
  639. // for (let i = 0; i < this.teamFiids.length; i++) {
  640. // if (gameMethod.isEmpty(this.teams[this.teamFiids[i]].isHide) == false) {
  641. // continue; //隐藏
  642. // }
  643. // if (this.teams[this.teamFiids[i]].eps.hp <= 0) {
  644. // continue; //还没活
  645. // }
  646. // this.oneFiids[this.teamFiids[i]] = {}; //初始化各个iid
  647. // }
  648. // }
  649. // /**
  650. // * 出手(中)
  651. // */
  652. // private pk_zhen_atk() {
  653. // let iid: string;
  654. // for (let i = 0; i < this.teamFiids.length; i++) {
  655. // iid = this.teamFiids[i];
  656. // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
  657. // continue; //隐藏
  658. // }
  659. // this.pk_zhen_atk_one(iid);
  660. // this.skbuff_sub_all(iid, "effect_i_75");
  661. // // 快剑印记去除
  662. // let eff_i_19 = this.skbuff_get(iid, "effect_i_19", 2);
  663. // if (eff_i_19 > 0 && this.uuids[iid].last2 + 7 * 30 <= this.zhen) {
  664. // // 拥有印记 并且已经7秒没有出手
  665. // this.skbuff_sub_all(iid, "effect_i_19");
  666. // this.skbuff_sub_all(iid, "effect_i_23");
  667. // }
  668. // // 复活buff
  669. // let eff_i_36 = this.skbuff_get(iid, "effect_i_36", 2);
  670. // if (eff_i_36 > 0 && this.skbuff_get(iid, "i_36_nZhen") <= this.zhen) {
  671. // // 复活
  672. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  673. // this.addOneAtk(iid, iid, "effect", ["hp", this.skbuff_get(iid, "i_36")]);
  674. // this.skbuff_sub_all(iid, "effect_i_36");
  675. // }
  676. // this.jueSuanOneAtk();
  677. // }
  678. // }
  679. // /**
  680. // * 出手(中) - 一个人出手
  681. // * @param iid 出手人
  682. // */
  683. // private pk_zhen_atk_one(iid: string) {
  684. // if (this.skbuff_get(iid, "hp") <= 0) {
  685. // return; //还没活
  686. // }
  687. // if (!this.checkHit(iid)) {
  688. // return; // 乙方都死了 兽灵不能攻击
  689. // }
  690. // let i_speed: number = this.skbuff_get(iid, "speed");
  691. // i_speed = i_speed > 50000 ? 50000 : i_speed;
  692. // let last = Math.ceil(30 / (i_speed / 10000));
  693. // if (this.uuids[iid].last + last > this.zhen) {
  694. // return; //不是当前帧
  695. // }
  696. // // this.uuids[iid].last += last; todo 这里不要打开 攻击频率会有问题
  697. // this.sk_base(iid, 1); //技能触发
  698. // //灵力满怒时释放
  699. // if (this.teams["100"] != null && this.teams["100"].eps.mp >= 10000) {
  700. // let result = this.sk_base("100", 3); //技能触发
  701. // if (result){ // 技能释放成功才扣怒气
  702. // this.jueSuanOneAtk()
  703. // this.add_mp("100", -10000, 2);
  704. // }
  705. // }
  706. // if (this.teams["1000"] != null && this.teams["1000"].eps.mp >= 10000) {
  707. // let result = this.sk_base("1000", 3); //技能触发
  708. // if (result){ // 技能释放成功才扣怒气
  709. // this.jueSuanOneAtk()
  710. // this.add_mp("1000", -10000, 2);
  711. // }
  712. // }
  713. // }
  714. // /*
  715. // * 主角弟子都死了 兽灵不能攻击
  716. // * */
  717. // private checkHit(iid: string) {
  718. // if (parseInt(iid) % 100 != 10) {
  719. // return true;
  720. // }
  721. // let count = 0;
  722. // for (let i = 0; i < this.teamFiids.length; i++) {
  723. // if (this.teamFiids[i] != iid && this.teamFiids[i].length == iid.length && !this.uuids[this.teamFiids[i]].dzhen) {
  724. // count++;
  725. // break;
  726. // }
  727. // }
  728. // if (!count) {
  729. // return false;
  730. // } else {
  731. // return true;
  732. // }
  733. // }
  734. // /**
  735. // * 触发一次伤害
  736. // * @param iid 攻击者
  737. // * @param fiid 被打者
  738. // */
  739. // private sk_action_type_1(iid: string, fiid: string, skid: string, acId: string): { [key: string]: number } {
  740. // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
  741. // return {}; //隐藏
  742. // }
  743. // let cfgAc = Gamecfg.skillAction.getItem(acId);
  744. // if (cfgAc == null) {
  745. // return {};
  746. // }
  747. // if (this.oneHit[iid] == null || this.oneHit[iid][fiid] == null) {
  748. // return {};
  749. // }
  750. // let cfgSk = Gamecfg.skillBase.getItem(skid, "1");
  751. // if (cfgSk == null) {
  752. // return {}; //没有这个技能 或者 这个技能的触发时机不对
  753. // }
  754. // let jituiarr: (string | number)[] = []; //击退
  755. // if (cfgAc.args["s"] != null && this.seedRand.rand(1, 10000) <= cfgAc.args["p"] * 10000) {
  756. // jituiarr = ["jitui", cfgAc.args["s"]];
  757. // }
  758. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.atk);
  759. // this.addOneAtk(iid, iid, "aSkid", skid);
  760. // this.uuids[fiid].fpk = iid; //记录最后一次打伤我的人
  761. // this.uuids[iid].ipk = fiid;
  762. // if (this.uuids[iid].ipks[this.zhen] == null) {
  763. // this.uuids[iid].ipks[this.zhen] = [];
  764. // }
  765. // this.uuids[iid].ipks[this.zhen].push(fiid);
  766. // this.uuids[iid].last2 = this.zhen;
  767. // let main_iid = iid.length > 3 ? "1000" : "100";
  768. // if (Number(iid) % 100 < 10 && this.uuids[main_iid] && this.uuids[main_iid].drain_sk > 0) {
  769. // let cfgMath = Gamecfg.mathInfo.getItem("battle_lingli");
  770. // if (cfgMath != null && cfgMath.pram.items != null) {
  771. // let llmin = cfgMath.pram.items[1][0];
  772. // let llMax = cfgMath.pram.items[1][1];
  773. // this.add_mp(main_iid, this.seedRand.rand(llmin, llMax), 2);
  774. // }
  775. // }
  776. // this.timer_do(106, { do_iid: Number(fiid) }); //被打前触发
  777. // this.timer_do(209, { do_iid: Number(iid) }); //攻击结算前触发
  778. // //各种伤害计算
  779. // let gzhit = this.oneHit[iid][fiid];
  780. // let hit: number = gzhit.pghit; //总伤害
  781. // if (cfgSk.skillType == 3) {
  782. // hit = gzhit.skhit;
  783. // }
  784. // if (cfgSk.drain > 0) {
  785. // // 术法伤害增加
  786. // let i_73 = this.skbuff_get(iid, "i_73");
  787. // let i_qhmifa = this.skbuff_get(iid, "qhmifa");
  788. // let f_rhmifa = this.skbuff_get(fiid, "rhmifa");
  789. // hit += Math.floor(hit * ((i_73 + i_qhmifa - f_rhmifa) / 10000));
  790. // }
  791. // let result = { do_iid: Number(fiid), hit: 0 };
  792. // // 攻击 =》
  793. // // 》 判定连击(需要判定有没有触发暴击) | 判定溅射(需要判定有没有触发暴击)
  794. // // 》没用连击 没用溅射 =》 判定暴击
  795. // // 》 如果没有暴击 才是 普通攻击
  796. // // | 吸血
  797. // // 》被打 格挡 | 反击(溅射(需要判定有没有触发暴击) 如果没有溅射才判定暴击 ) 没有暴击 就是普通攻击 + 吸血
  798. // // 反击被打的也要判定 格挡
  799. // // 结束了
  800. // // 是否连击
  801. // let islj: number = this.isLianji(iid, fiid);
  802. // let isNext: number = 0; //0默认 1停止 2已经触发暴击
  803. // if (islj) {
  804. // isNext = 1;
  805. // this.uuids[iid].cons[1] += 1; //记录攻击次数
  806. // this.uuids[fiid].fcons[1] += 1; //记录攻击次数
  807. // // 是否暴击
  808. // let isBj: number = this.isBaoji(iid, fiid);
  809. // if (isBj) {
  810. // isNext = 2;
  811. // } else {
  812. // let isGd = this.isGedang(iid, fiid); // 连击格挡
  813. // hit = gzhit.ljhit;
  814. // if (isGd) {
  815. // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
  816. // hit -= gzhit.gdhit;
  817. // }
  818. // hit = this.hit_last(iid, fiid, hit);
  819. // this.addOneAtk(iid, fiid, "effect", ["lianji", -1 * hit].concat(jituiarr), skid);
  820. // result.hit += hit;
  821. // }
  822. // }
  823. // //是否溅射
  824. // let isJs = this.seedRand.rand(1, 10000) <= gzhit.jsRate;
  825. // if (isJs) {
  826. // isNext = 1;
  827. // let isBj: number = this.isBaoji(iid, fiid);
  828. // if (isBj) {
  829. // isNext = 2;
  830. // } else {
  831. // // 溅射伤害增加
  832. // let i_81 = this.skbuff_get(iid, "i_81");
  833. // if (i_81 != 0) {
  834. // hit = Math.floor(hit * (i_81 / 10000 + 1));
  835. // }
  836. // let isGd = this.isGedang(iid, fiid); // 连击格挡
  837. // if (isGd) {
  838. // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
  839. // hit -= gzhit.gdhit;
  840. // }
  841. // hit = this.hit_last(iid, fiid, hit);
  842. // this.addOneAtk(iid, fiid, "effect", ["hp", -1 * hit], skid);
  843. // let jsxishu: number[] = [1, 0.75, 0.7, 0.58, 0.5];
  844. // let jsfiids = this.find_jianse_fiid(fiid, cfgAc.distance);
  845. // let allHit: number = 0;
  846. // let maxLen = Math.min(jsfiids.length, jsxishu.length);
  847. // for (let index = 0; index < maxLen; index++) {
  848. // if (jsfiids[index] == null) {
  849. // break;
  850. // }
  851. // if (i_81 != 0) {
  852. // hit = Math.floor(hit * (i_81 / 10000 + 1));
  853. // }
  854. // hit = Math.floor(gzhit.jshit * jsxishu[maxLen - 1]);
  855. // let isGd = this.isGedang(iid, jsfiids[index]); // 连击格挡
  856. // if (isGd) {
  857. // this.addOneAtk(iid, jsfiids[index], "effect", ["block", 1]);
  858. // hit -= gzhit.gdhit;
  859. // }
  860. // hit = this.hit_last(iid, jsfiids[index], hit);
  861. // this.addOneAtk(iid, jsfiids[index], "effect", ["jianshe", -1 * hit].concat(jituiarr));
  862. // this.sk_base(jsfiids[index], 2, { hit: hit }); //被攻击
  863. // allHit += hit;
  864. // }
  865. // this.timer_do(205, { do_iid: Number(iid), hit: allHit }); //溅射触发
  866. // }
  867. // }
  868. // //判定是否暴击
  869. // if (isNext == 0) {
  870. // let isBj: number = this.isBaoji(iid, fiid);
  871. // if (isBj) {
  872. // isNext = 2;
  873. // }
  874. // }
  875. // //暴击
  876. // if (isNext == 2) {
  877. // this.uuids[iid].cons[0] += 1; //记录攻击次数
  878. // this.uuids[fiid].fcons[0] += 1; //记录攻击次数
  879. // let isGd = this.isGedang(iid, fiid); // 连击格挡
  880. // if (isGd) {
  881. // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
  882. // hit -= gzhit.gdhit;
  883. // }
  884. // hit = this.hit_last(iid, fiid, gzhit.bjhit);
  885. // this.addOneAtk(iid, fiid, "effect", ["baoji", -1 * hit].concat(jituiarr), skid);
  886. // this.timer_do(203, { do_iid: Number(iid), hit: hit, isBj: hit }); //暴击触发
  887. // result.hit += hit;
  888. // }
  889. // //普通攻击
  890. // if (isNext == 0) {
  891. // this.uuids[iid].cons[0] += 1; //记录攻击次数
  892. // this.uuids[fiid].fcons[0] += 1; //记录攻击次数
  893. // let isGd = this.isGedang(iid, fiid); // 连击格挡
  894. // if (isGd) {
  895. // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
  896. // hit -= gzhit.gdhit;
  897. // }
  898. // hit = this.hit_last(iid, fiid, gzhit.pghit);
  899. // this.addOneAtk(iid, fiid, "effect", ["hp", -1 * hit].concat(jituiarr), skid);
  900. // //this.timer_do(203, { do_iid: Number(iid), hit: hit, isBj: hit }); //暴击触发
  901. // result.hit += hit;
  902. // }
  903. // //是否吸血
  904. // if (gzhit.xxhit > 0) {
  905. // this.addOneAtk(iid, iid, "effect", ["hp", gzhit.xxhit]);
  906. // }
  907. // if (cfgSk.skillType == 3) {
  908. // this.timer_do(207, { do_iid: Number(iid), hit: result.hit }); //技能触发
  909. // this.timer_do(102, { do_iid: Number(fiid), hit: result.hit }); //被打触发(技能)
  910. // } else {
  911. // this.timer_do(201, { do_iid: Number(iid), hit: result.hit }); //普通攻击触发
  912. // this.timer_do(103, { do_iid: Number(fiid), hit: result.hit }); //被打触发(普通)
  913. // }
  914. // if (cfgSk.drain > 0) {
  915. // this.timer_do(208, { do_iid: Number(iid), hit: result.hit }); //术法触发
  916. // }
  917. // // 触发连击buff
  918. // if (islj) {
  919. // this.timer_do(202, { do_iid: Number(iid), hit: result.hit }); //连击触发
  920. // this.timer_do(101, { do_iid: Number(fiid), hit: result.hit }); //连击触发 被打
  921. // this.sk_base(iid, 9, { hit: result.hit });
  922. // }
  923. // // 触发暴击buff
  924. // if (isNext == 2) {
  925. // this.sk_base(iid, 10, { hit: result.hit });
  926. // }
  927. // this.sk_base(fiid, 2, { hit: result.hit }); //被攻击
  928. // //反击
  929. // this.sk_action_type_1_fanji(fiid, iid, gzhit);
  930. // return result;
  931. // }
  932. // /**
  933. // * 触发一次反击
  934. // * @param iid 攻击者
  935. // * @param fiid 被打者
  936. // * @param hit
  937. // * @param cs
  938. // */
  939. // private sk_action_type_1_fanji(iid: string, fiid: string, gzhit: Gzhit) {
  940. // if (this.teams[iid].type == 3 || this.teams[fiid].type == 3) {
  941. // return;
  942. // }
  943. // if (this.jueFiidHp(fiid)<=0){ // 死了不能反击
  944. // return;
  945. // }
  946. // // 被打的是否被冰冻
  947. // let eff_i_3 = this.skbuff_get(iid, "effect_i_3", 2);
  948. // if (eff_i_3 > 0) {
  949. // return; //晕眩
  950. // }
  951. // let eff_i_5 = this.skbuff_get(iid, "effect_i_5", 2);
  952. // if (eff_i_5 > 0) {
  953. // return; //冰冻
  954. // }
  955. // let isNext: number = 0; //0停止 1继续 2暴击
  956. // //技能反击
  957. // let cbback = this.skbuff_get(iid, "canbeatback", 2);
  958. // if (cbback > 0) {
  959. // isNext = 1;
  960. // this.skbuff_sub(iid, "canbeatback");
  961. // }
  962. // let isEpfj: number = 0;
  963. // if (isNext == 0) {
  964. // //触发反击
  965. // let isfj: number = this.isFanji(iid, fiid);
  966. // if (isfj) {
  967. // isNext = 1;
  968. // isEpfj = 1;
  969. // }
  970. // }
  971. // if (isNext == 0) {
  972. // return;
  973. // }
  974. // //找出反击者的普通攻击
  975. // let pskid: string = "";
  976. // let ackid: number = 0;
  977. // let skids: string[] = Object.keys(this.teams[iid].sk);
  978. // for (let index = 0; index < skids.length; index++) {
  979. // let cfgSk = Gamecfg.skillBase.getItem(skids[index], "1");
  980. // if (cfgSk != null && cfgSk.skillType == 1) {
  981. // pskid = skids[index];
  982. // ackid = cfgSk.actions[0];
  983. // break;
  984. // }
  985. // }
  986. // if (pskid == "") {
  987. // return;
  988. // }
  989. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.fanji);
  990. // this.addOneAtk(iid, iid, "aSkid", pskid);
  991. // this.uuids[iid].cons[2] += 1;
  992. // this.uuids[fiid].fcons[2] += 1;
  993. // //伤害
  994. // let hit = gzhit.fjhit;
  995. // let i_rhblock: number = this.skbuff_get(iid, "rhblock");
  996. // //是否溅射
  997. // let isJs = this.seedRand.rand(1, 10000) <= gzhit.fjsRate;
  998. // if (isJs) {
  999. // let isBj: number = this.isBaoji(iid, fiid);
  1000. // if (isBj) {
  1001. // isNext = 2;
  1002. // } else {
  1003. // // 溅射伤害增加
  1004. // let i_81 = this.skbuff_get(iid, "i_81");
  1005. // if (i_81 != 0) {
  1006. // hit = Math.floor(hit * (i_81 / 10000 + 1));
  1007. // }
  1008. // let isGd = this.isGedang(iid, fiid); // 连击格挡
  1009. // if (isGd) {
  1010. // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
  1011. // //格挡伤害= MIN(技能伤害*(MAX(敌方格挡增强-我方格挡减弱,0.12)),技能伤害*0.9)
  1012. // let f_qhblock: number = this.skbuff_get(fiid, "qhblock");
  1013. // let fgd_hit: number = Math.min(gzhit.fjhit * Math.max(0.12, (f_qhblock - i_rhblock) / 10000), gzhit.fjhit * 0.9);
  1014. // hit -= Math.floor(fgd_hit);
  1015. // }
  1016. // hit = this.hit_last(iid, fiid, hit);
  1017. // this.addOneAtk(iid, fiid, "effect", ["fanji", -1 * hit], pskid);
  1018. // let jsxishu: number[] = [1, 0.75, 0.7, 0.58, 0.5];
  1019. // let distance = 0;
  1020. // if (ackid != 0) {
  1021. // let cfgAc = Gamecfg.skillAction.getItem(ackid.toString());
  1022. // if (cfgAc != null) {
  1023. // distance = cfgAc.distance;
  1024. // }
  1025. // }
  1026. // let jsfiids = this.find_jianse_fiid(fiid, distance);
  1027. // let allHit: number = 0;
  1028. // let maxLen = Math.min(jsfiids.length, jsxishu.length);
  1029. // for (let index = 0; index < maxLen; index++) {
  1030. // if (jsfiids[index] == null) {
  1031. // break;
  1032. // }
  1033. // if (i_81 != 0) {
  1034. // hit = Math.floor(hit * (i_81 / 10000 + 1));
  1035. // }
  1036. // hit = Math.floor(gzhit.jshit * jsxishu[maxLen - 1]);
  1037. // let isGd = this.isGedang(iid, jsfiids[index]); // 连击格挡
  1038. // if (isGd) {
  1039. // this.addOneAtk(iid, jsfiids[index], "effect", ["block", 1]);
  1040. // let f_qhblock: number = this.skbuff_get(fiid, "qhblock");
  1041. // let fgd_hit: number = Math.min(gzhit.fjhit * Math.max(0.12, (f_qhblock - i_rhblock) / 10000), gzhit.fjhit * 0.9);
  1042. // hit -= Math.floor(fgd_hit);
  1043. // }
  1044. // hit = this.hit_last(iid, jsfiids[index], hit);
  1045. // this.addOneAtk(iid, jsfiids[index], "effect", ["fanji", -1 * hit]);
  1046. // this.sk_base(jsfiids[index], 2, { hit: hit }); //被攻击
  1047. // allHit += hit;
  1048. // }
  1049. // this.timer_do(205, { do_iid: Number(iid), hit: allHit }); //溅射触发
  1050. // }
  1051. // }
  1052. // //判定是否暴击
  1053. // if (isNext == 1) {
  1054. // let isBj: number = this.isBaoji(iid, fiid);
  1055. // if (isBj) {
  1056. // isNext = 2;
  1057. // }
  1058. // }
  1059. // //暴击
  1060. // if (isNext == 2) {
  1061. // this.uuids[iid].cons[0] += 1; //记录攻击次数
  1062. // this.uuids[fiid].fcons[0] += 1; //记录攻击次数
  1063. // let isGd = this.isGedang(iid, fiid); // 连击格挡
  1064. // if (isGd) {
  1065. // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
  1066. // let f_qhblock: number = this.skbuff_get(fiid, "qhblock");
  1067. // let fgd_hit: number = Math.min(gzhit.fjhit * Math.max(0.12, (f_qhblock - i_rhblock) / 10000), gzhit.fjhit * 0.9);
  1068. // hit -= fgd_hit;
  1069. // }
  1070. // hit = this.hit_last(iid, fiid, gzhit.bjhit);
  1071. // this.addOneAtk(iid, fiid, "effect", ["baoji", -1 * hit]);
  1072. // this.timer_do(203, { do_iid: Number(iid), hit: hit, isBj: hit }); //暴击触发
  1073. // }
  1074. // //普通攻击
  1075. // if (isNext == 1) {
  1076. // let isGd = this.isGedang(iid, fiid); // 格挡
  1077. // if (isGd) {
  1078. // this.addOneAtk(iid, fiid, "effect", ["block", 1]);
  1079. // let f_qhblock: number = this.skbuff_get(fiid, "qhblock");
  1080. // let fgd_hit: number = Math.min(gzhit.fjhit * Math.max(0.12, (f_qhblock - i_rhblock) / 10000), gzhit.fjhit * 0.9);
  1081. // hit -= fgd_hit;
  1082. // }
  1083. // hit = this.hit_last(iid, fiid, hit);
  1084. // this.addOneAtk(iid, fiid, "effect", ["fanji", -1 * hit]);
  1085. // this.timer_do(203, { do_iid: Number(iid), hit: hit, isBj: hit }); //暴击触发
  1086. // }
  1087. // //吸血率=max((我方吸血-敌方抗吸血),吸血保底参数)
  1088. // //吸血值= 最终伤害值*max(我方吸血增强-敌方吸血减弱,1)*吸血率
  1089. // let i_xixue: number = this.skbuff_get(iid, "xixue");
  1090. // let f_hsxixue: number = this.skbuff_get(fiid, "hsxixue");
  1091. // let bdxixue: number = 0; //保底吸血
  1092. // let cfg = Gamecfg.userEp.getItem("xixue");
  1093. // if (cfg != null) {
  1094. // bdxixue = cfg.initEp;
  1095. // }
  1096. // let xxRate: number = Math.max(i_xixue - f_hsxixue, bdxixue);
  1097. // let i_qhxixue: number = this.skbuff_get(iid, "qhxixue");
  1098. // let f_rhxixue: number = this.skbuff_get(fiid, "rhxixue");
  1099. // let xx_hit: number = Math.floor((gzhit.fjhit * Math.max((i_qhxixue - f_rhxixue) / 10000 + 1, 1) * xxRate) / 10000);
  1100. // //是否吸血
  1101. // if (xx_hit>0) {
  1102. // this.addOneAtk(iid, iid, "effect", ["hp", xx_hit]);
  1103. // }
  1104. // this.timer_do(204, { do_iid: Number(iid), hit: hit }); //反击触发
  1105. // if (isEpfj) {
  1106. // // 反击获得buff
  1107. // let skids: string[] = Object.keys(this.teams[iid].sk);
  1108. // for (let index = 0; index < skids.length; index++) {
  1109. // let cfgSk = Gamecfg.skillBase.getItem(skids[index], "1");
  1110. // if (cfgSk && cfgSk.runStatus === 7) {
  1111. // for (let index = 0; index < cfgSk.effect.length; index++) {
  1112. // let effectId = cfgSk.effect[index];
  1113. // this.sk_effect(fiid, skids[index], effectId.toString(), "", { hit: hit });
  1114. // }
  1115. // }
  1116. // }
  1117. // }
  1118. // }
  1119. // /**
  1120. // * 出手(后)
  1121. // */
  1122. // private pk_zhen_over() {
  1123. // //死亡触发
  1124. // for (let index = 0; index < this.teamFiids.length; index++) {
  1125. // let fiid = this.teamFiids[index];
  1126. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1127. // continue; //隐藏
  1128. // }
  1129. // if (this.teams[fiid].eps.hp > 0) {
  1130. // continue; //还活着
  1131. // }
  1132. // if (this.uuids[fiid].dzhen > 0) {
  1133. // continue; //之前已经死了
  1134. // }
  1135. // this.uuids[fiid].dzhen = this.zhen; //那一帧死了
  1136. // this.teams[fiid].eps.hp = 0;
  1137. // this.timer_do(402, { do_iid: Number(fiid) }); //死亡触发
  1138. // this.jiesuo_hide(fiid);
  1139. // }
  1140. // //清除过期buff
  1141. // this.skbuff_clear();
  1142. // }
  1143. // /**
  1144. // * 单次出手临时存储信息 - 记录
  1145. // */
  1146. // addOneAtk(iid: string, fiid: string, key: string, val: any, skid: string = "") {
  1147. // if (!this.oneAtkiids.includes(iid)) {
  1148. // this.oneAtkiids.push(iid);
  1149. // }
  1150. // //初始化
  1151. // if (this.oneAtk[iid] == null) {
  1152. // this.oneAtk[iid] = {};
  1153. // }
  1154. // if (this.uuids[iid].dzhen > 0 && this.uuids[iid].dzhen < this.zhen) {
  1155. // return; //已经死了 ,不要在折腾了
  1156. // }
  1157. // if (this.uuids[fiid].dzhen > 0 && this.uuids[fiid].dzhen < this.zhen) {
  1158. // return; //已经死了 ,不要在折腾了
  1159. // }
  1160. // if (this.oneAtk[iid][fiid] == null) {
  1161. // this.oneAtk[iid][fiid] = {
  1162. // aType: Xys.ActionType.default, //动作类型
  1163. // aSkid: "", //使用的技能ID
  1164. // effect: [],
  1165. // buff: [],
  1166. // };
  1167. // }
  1168. // //目标治疗效果降低/增加
  1169. // if (val[0] == "hp" && val[1] > 0 && this.skbuff_get(fiid, "effect_i_62", 2) > 0) {
  1170. // let f_i_62 = this.skbuff_get(fiid, "i_62");
  1171. // val[1] += Math.floor((val[1] * f_i_62) / 10000);
  1172. // val[1] = Math.max(0, val[1]);
  1173. // }
  1174. // //单次伤害不超过自身最大生命值的x%
  1175. // if (this.xueku.includes(val[0]) && val[1] < 0) {
  1176. // let f_i_71 = this.skbuff_get(fiid, "max_i_71");
  1177. // if (f_i_71 > 0 && Math.abs(val[1]) > f_i_71 && this.skbuff_get(fiid, "max_i_71_nZhen") <= this.zhen) {
  1178. // let max_i_71_cd = this.skbuff_get(fiid, "max_i_71_cd");
  1179. // if (max_i_71_cd > 0) {
  1180. // this.skbuff_update(fiid, { max_i_71_nZhen: this.zhen + max_i_71_cd * 30 });
  1181. // }
  1182. // val[1] = -f_i_71;
  1183. // }
  1184. // }
  1185. // //统计
  1186. // if (this.outf.tongji[fiid] == null) {
  1187. // this.outf.tongji[fiid] = {
  1188. // shuchu: 0, //输出
  1189. // zhiliao: 0, //治疗
  1190. // chengshang: 0, //承伤
  1191. // };
  1192. // }
  1193. // if (this.outf.tongji[iid] == null) {
  1194. // this.outf.tongji[iid] = {
  1195. // shuchu: 0, //输出
  1196. // zhiliao: 0, //治疗
  1197. // chengshang: 0, //承伤
  1198. // };
  1199. // }
  1200. // switch (key) {
  1201. // case "aType": //动作类型
  1202. // //已经是攻击类型, 就不要再改了
  1203. // if (this.oneAtk[iid][fiid].aType != Xys.ActionType.atk) {
  1204. // this.oneAtk[iid][fiid].aType = val;
  1205. // }
  1206. // break;
  1207. // case "aSkid": //使用的技能ID
  1208. // this.oneAtk[iid][fiid].aSkid = val;
  1209. // break;
  1210. // case "effect": //特效
  1211. // this.oneAtk[iid][fiid].effect.push(val);
  1212. // if (this.xueku.includes(val[0]) && val[1] < 0) {
  1213. // //统计
  1214. // this.outf.tongji[iid].shuchu += Math.abs(val[1]);
  1215. // this.outf.tongji[fiid].chengshang += Math.abs(val[1]);
  1216. // let main_iid = fiid.length > 3 ? "1000" : "100";
  1217. // if (Number(fiid) % 100 < 10 && this.uuids[main_iid] && this.uuids[main_iid].drain_sk > 0) {
  1218. // let cfgMath = Gamecfg.mathInfo.getItem("battle_lingli");
  1219. // if (cfgMath != null && cfgMath.pram.items != null) {
  1220. // let llmin = cfgMath.pram.items[0][0];
  1221. // let llMax = cfgMath.pram.items[0][1];
  1222. // this.add_mp(main_iid, this.seedRand.rand(llmin, llMax), 2);
  1223. // }
  1224. // }
  1225. // }
  1226. // if (this.xueku.includes(val[0]) && val[1] > 0) {
  1227. // //统计
  1228. // this.outf.tongji[fiid].zhiliao += Math.abs(val[1]);
  1229. // //回血触发(治疗触发/吸血触发--这3个是一个意思)
  1230. // this.timer_do(403, { do_iid: Number(fiid) });
  1231. // }
  1232. // break;
  1233. // case "buff": //buff
  1234. // this.oneAtk[iid][fiid].buff.push(val);
  1235. // break;
  1236. // }
  1237. // }
  1238. // /**
  1239. // * 当前剩余血量
  1240. // */
  1241. // jueFiidHp(fiid: string) {
  1242. // let lsf_hp: number = this.teams[fiid].eps.hp;
  1243. // let iids = Object.keys(this.oneAtk);
  1244. // for (let i = 0; i < iids.length; i++) {
  1245. // if (this.oneAtk[iids[i]][fiid] == null) {
  1246. // continue;
  1247. // }
  1248. // for (let k = 0; k < this.oneAtk[iids[i]][fiid].effect.length; k++) {
  1249. // if (this.xueku.includes(this.oneAtk[iids[i]][fiid].effect[k][0])) {
  1250. // lsf_hp += this.oneAtk[iids[i]][fiid].effect[k][1];
  1251. // }
  1252. // }
  1253. // }
  1254. // lsf_hp = Math.min(lsf_hp, this.skbuff_get(fiid, "hp_max"));
  1255. // return lsf_hp;
  1256. // }
  1257. // /**
  1258. // * 单次出手临时存储信息 - 结算
  1259. // */
  1260. // jueSuanOneAtk() {
  1261. // if (gameMethod.isEmpty(this.oneAtk) == true) {
  1262. // return;
  1263. // }
  1264. // // 结算前判定主角是否死亡 并且是否拥有复活buff 复活buff触发帧是否生效
  1265. // let iids = ["100","1000"];
  1266. // for (let i=0;i<iids.length;i++){
  1267. // let iid = iids[i];
  1268. // let hp = this.skbuff_get(iid, "hp");
  1269. // if (hp <= 0 && this.skbuff_get(iid, "effect_i_63", 2) > 0) {
  1270. // let i_63_cd = this.skbuff_get(iid, "i_63_cd")
  1271. // if (i_63_cd > 0){ // 死亡后延迟x帧复活
  1272. // //this.skbuff_update(iid, { "i_63_cd":-i_63_cd,"i_63_nZhen": this.zhen + i_63_cd });
  1273. // }else if (this.skbuff_get(iid, "i_63_nZhen") <= this.zhen){
  1274. // let addHp = this.skbuff_get(iid, "i_63_hp");
  1275. // if (addHp > 0) {
  1276. // this.skbuff_sub_all(iid,"effect_i_63")
  1277. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  1278. // this.addOneAtk(iid, iid, "effect", ["hp", addHp - hp]);
  1279. // }
  1280. // }
  1281. // }
  1282. // }
  1283. // //攻打方
  1284. // for (let i = 0; i < this.oneAtkiids.length; i++) {
  1285. // let i_buff: [string, number][] = [];
  1286. // let i_effect: [string, number][] = [];
  1287. // let target: Xys.LogOneData[] = [];
  1288. // let fiids = Object.keys(this.oneAtk[this.oneAtkiids[i]]);
  1289. // for (let k = 0; k < fiids.length; k++) {
  1290. // let chahp: number = 0;
  1291. // //计算血量和伤害
  1292. // for (let j = 0; j < this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect.length; j++) {
  1293. // let effect = this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect[j];
  1294. // if (this.xueku.includes(effect[0])) {
  1295. // if (Number(fiids[k]) < 1000 && effect[1] < 0) {
  1296. // this.outf.hurt += Math.abs(effect[1]); //计算伤害
  1297. // }
  1298. // if (effect[1] < 0) {
  1299. // //扣血执行
  1300. // this.timer_do(401, { do_iid: Number(fiids[k]), hit: Math.abs(effect[1]) });
  1301. // this.timer_do(404, { do_iid: Number(fiids[k]), hit: Math.abs(effect[1]) });
  1302. // this.timer_do(405, { do_iid: Number(this.oneAtkiids[i]), hit: Math.abs(effect[1]) }); //敌方扣血 我方加buff
  1303. // }
  1304. // if (this.teams[fiids[k]].eps.hp + chahp + effect[1] < 0) {
  1305. // // 最后一下 如果对方被打死了 伤害不能超过对方血量
  1306. // effect[1] = -(this.teams[fiids[k]].eps.hp + chahp);
  1307. // }
  1308. // if (effect[1] == 0 && this.teams[fiids[k]].eps.hp + chahp == 0) {
  1309. // // 如果已经被打死了 删掉这个影响
  1310. // this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect.splice(j, 1);
  1311. // j--;
  1312. // }
  1313. // chahp += effect[1];
  1314. // }
  1315. // }
  1316. // this.teams[fiids[k]].eps.hp += chahp;
  1317. // this.teams[fiids[k]].eps.hp = Math.min(this.skbuff_get(fiids[k], "hp_max"), this.teams[fiids[k]].eps.hp);
  1318. // if (this.oneAtkiids[i] == fiids[k]) {
  1319. // i_buff = this.oneAtk[this.oneAtkiids[i]][fiids[k]].buff;
  1320. // i_effect = this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect;
  1321. // } else {
  1322. // target.push({
  1323. // fid: this.teams[fiids[k]].fid, //出手方Id
  1324. // iid: fiids[k], //阵容下标
  1325. // hp: this.teams[fiids[k]].eps.hp, //剩余血量
  1326. // mp: this.teams[fiids[k]].eps.mp, //剩余怒气
  1327. // buff: this.oneAtk[this.oneAtkiids[i]][fiids[k]].buff, //[ [生效帧开始,生效帧结束,buffKEY,触发的人]]
  1328. // effect: this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect, //触发效果 [ [属性key,数值]]
  1329. // tongji:Math.abs(this.outf.tongji[fiids[k]]?.shuchu | 0),
  1330. // zonji:0
  1331. // });
  1332. // }
  1333. // this.oneAtk[this.oneAtkiids[i]][fiids[k]].effect = [];
  1334. // }
  1335. // this.teams[this.oneAtkiids[i]].eps.hp = Math.min(this.teams[this.oneAtkiids[i]].eps.hp, this.skbuff_get(this.oneAtkiids[i], "hp_max"));
  1336. // // 把回血合并
  1337. // let i_effect2:[string, number][] = []
  1338. // let jisuan:{[key:string]:number} = {}
  1339. // for (let item of i_effect){
  1340. // if (this.xueku.includes(item[0]) && item[1] > 0){ //属于回血字段并且值大于0
  1341. // if (jisuan[item[0]] == null){
  1342. // jisuan[item[0]] = item[1]
  1343. // }else {
  1344. // jisuan[item[0]] += item[1]
  1345. // }
  1346. // }else{
  1347. // i_effect2.push(item)
  1348. // }
  1349. // }
  1350. // for (let key in jisuan){
  1351. // i_effect2.push([key,jisuan[key]])
  1352. // }
  1353. // //初始化
  1354. // let atker: Xys.LogOneData = {
  1355. // fid: this.teams[this.oneAtkiids[i]].fid, //出手方Id
  1356. // iid: this.oneAtkiids[i], //阵容下标
  1357. // hp: this.teams[this.oneAtkiids[i]].eps.hp, //剩余血量
  1358. // mp: this.teams[this.oneAtkiids[i]].eps.mp, //剩余怒气
  1359. // buff: i_buff, //[ [生效帧开始,生效帧结束,buffKEY,触发的人]]
  1360. // effect: i_effect2, //触发效果 [ [属性key,数值]]
  1361. // tongji:Math.abs(this.outf.tongji[this.oneAtkiids[i]]?.shuchu | 0),
  1362. // zonji:0
  1363. // };
  1364. // if (
  1365. // this.oneAtk[this.oneAtkiids[i]][this.oneAtkiids[i]] != null &&
  1366. // this.oneAtk[this.oneAtkiids[i]][this.oneAtkiids[i]].aType != Xys.ActionType.default
  1367. // ) {
  1368. // //添加日志
  1369. // this.addOneLog({
  1370. // aType: this.oneAtk[this.oneAtkiids[i]][this.oneAtkiids[i]].aType, //战斗动作类型
  1371. // aSkid: this.oneAtk[this.oneAtkiids[i]][this.oneAtkiids[i]].aSkid, //使用的技能ID
  1372. // fhp: 0,
  1373. // atker: atker, //出手方
  1374. // target: target, //目标
  1375. // });
  1376. // }
  1377. // }
  1378. // this.oneAtk = {};
  1379. // this.oneAtkiids = [];
  1380. // }
  1381. // /**
  1382. // * 战斗日志
  1383. // */
  1384. // addOneLog(log: Xys.fightLogOne) {
  1385. // log.fhp = 0;
  1386. // for (let index = 0; index < this.teamFiids.length; index++) {
  1387. // let fiid = this.teamFiids[index];
  1388. // //统计对方剩余总血量 in没关系
  1389. // if (Number(fiid) >= 1000) {
  1390. // continue; //自己人
  1391. // }
  1392. // if (this.teams[fiid].isHide != 0) {
  1393. // continue; //隐藏不管
  1394. // }
  1395. // if (this.teams[fiid].type == 3) {
  1396. // continue; //兽灵不管
  1397. // }
  1398. // if (this.teams[fiid].eps.hp < 1) {
  1399. // continue; //死了不管
  1400. // }
  1401. // log.fhp += this.teams[fiid].eps.hp;
  1402. // }
  1403. // this.outf.log[this.zhen].push(log);
  1404. // }
  1405. // /**
  1406. // * 战斗日志
  1407. // */
  1408. // over_back(): Xys.OverBack {
  1409. // this.outf.hp = 0;
  1410. // for (let index = 0; index < this.teamFiids.length; index++) {
  1411. // let fiid = this.teamFiids[index];
  1412. // if (fiid.length <= 3 && this.teams[fiid].eps.hp > 0 && this.teams[fiid].isHide == 0) {
  1413. // this.outf.hp += this.teams[fiid].eps.hp;
  1414. // }
  1415. // }
  1416. // this.outf.start.teams = this.teams;
  1417. // return this.outf;
  1418. // }
  1419. // //***********************************************
  1420. // /**
  1421. // * 辅助函数 - 获取对手
  1422. // * @param key 标识key
  1423. // * @param iid 出手方
  1424. // * @param ttype (1敌方全体,2前排敌方,3中排敌方,4后排敌方,5敌方随机,6自己,7已方全体,8已方随机)
  1425. // * @param targetType 目标数量
  1426. // */
  1427. // private find_fiids(key: string, iid: string, ttype: number[], targetType: number, distance: number = 0) {
  1428. // if (ttype.length <= 0) {
  1429. // return; //沿用上一次的 可能没有上一次
  1430. // }
  1431. // if (this.oneFiids[iid] == null) {
  1432. // this.oneFiids[iid] = {};
  1433. // }
  1434. // let fiids: string[] = [];
  1435. // this.oneFiids[iid][key] = []; //重置 重新获取
  1436. // //目标打击顺序
  1437. // const mblist: { [mubiao: string]: { [yu: string]: number[] } } = {
  1438. // "1": {
  1439. // //1敌方全体 5敌方随机 7已方全体 8已方随机
  1440. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
  1441. // },
  1442. // "2": {
  1443. // //2前排敌方
  1444. // "0": [2, 1, 3, 13, 14],
  1445. // "2": [2, 1, 3, 13, 14],
  1446. // "5": [2, 1, 3, 13, 14],
  1447. // "8": [2, 1, 3, 13, 14],
  1448. // "1": [3, 2, 14, 1, 13],
  1449. // "4": [3, 2, 14, 1, 13],
  1450. // "7": [3, 2, 14, 1, 13],
  1451. // "3": [1, 13, 2, 3, 14],
  1452. // "6": [1, 13, 2, 3, 14],
  1453. // "9": [1, 13, 2, 3, 14],
  1454. // "10": [3, 2, 14, 1, 13],
  1455. // "11": [2, 1, 3, 13, 14],
  1456. // "12": [1, 13, 2, 3, 14],
  1457. // "13": [14, 3, 2, 1, 13],
  1458. // "15": [14, 3, 2, 1, 13],
  1459. // "17": [14, 3, 2, 1, 13],
  1460. // "14": [13, 1, 2, 3, 14],
  1461. // "16": [13, 1, 2, 3, 14],
  1462. // "18": [13, 1, 2, 3, 14],
  1463. // },
  1464. // "3": {
  1465. // //3中排敌方
  1466. // "0": [5, 4, 6, 15, 16],
  1467. // "2": [5, 4, 6, 15, 16],
  1468. // "5": [5, 4, 6, 15, 16],
  1469. // "8": [5, 4, 6, 15, 16],
  1470. // "1": [6, 5, 16, 4, 15],
  1471. // "4": [6, 5, 16, 4, 15],
  1472. // "7": [6, 5, 16, 4, 15],
  1473. // "3": [4, 15, 5, 6, 16],
  1474. // "6": [4, 15, 5, 6, 16],
  1475. // "9": [4, 15, 5, 6, 16],
  1476. // "10": [6, 5, 16, 4, 15],
  1477. // "11": [5, 4, 6, 15, 16],
  1478. // "12": [4, 15, 5, 6, 16],
  1479. // "13": [16, 6, 5, 4, 15],
  1480. // "15": [16, 6, 5, 4, 15],
  1481. // "17": [16, 6, 5, 4, 15],
  1482. // "14": [15, 4, 5, 6, 16],
  1483. // "16": [15, 4, 5, 6, 16],
  1484. // "18": [15, 4, 5, 6, 16],
  1485. // },
  1486. // "4": {
  1487. // //4后排敌方
  1488. // "0": [8, 7, 9, 17, 18],
  1489. // "2": [8, 7, 9, 17, 18],
  1490. // "5": [8, 7, 9, 17, 18],
  1491. // "8": [8, 7, 9, 17, 18],
  1492. // "1": [9, 8, 18, 7, 17],
  1493. // "4": [9, 8, 18, 7, 17],
  1494. // "7": [9, 8, 18, 7, 17],
  1495. // "3": [7, 8, 17, 9, 18],
  1496. // "6": [7, 8, 17, 9, 18],
  1497. // "9": [7, 8, 17, 9, 18],
  1498. // "10": [9, 8, 18, 7, 17],
  1499. // "11": [8, 7, 9, 17, 18],
  1500. // "12": [7, 8, 17, 9, 18],
  1501. // "13": [18, 9, 8, 7, 17],
  1502. // "15": [18, 9, 8, 7, 17],
  1503. // "17": [18, 9, 8, 7, 17],
  1504. // "14": [17, 7, 8, 9, 18],
  1505. // "16": [17, 7, 8, 9, 18],
  1506. // "18": [17, 7, 8, 9, 18],
  1507. // },
  1508. // "5": {
  1509. // //1敌方全体 5敌方随机 7已方全体 8已方随机
  1510. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
  1511. // },
  1512. // "7": {
  1513. // //1敌方全体 5敌方随机 7已方全体 8已方随机
  1514. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
  1515. // },
  1516. // "8": {
  1517. // //1敌方全体 5敌方随机 7已方全体 8已方随机
  1518. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
  1519. // },
  1520. // "10": {
  1521. // //1敌方全体 5敌方随机 7已方全体 8已方随机
  1522. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
  1523. // },
  1524. // "11": {
  1525. // //1敌方全体 5敌方随机 7已方全体 8已方随机
  1526. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
  1527. // },
  1528. // "12": {
  1529. // //1敌方全体 5敌方随机 7已方全体 8已方随机
  1530. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
  1531. // },
  1532. // "13": {
  1533. // //1敌方全体 5敌方随机 7已方全体 8已方随机
  1534. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
  1535. // },
  1536. // "16": {
  1537. // //1敌方全体 5敌方随机 7已方全体 8已方随机
  1538. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
  1539. // },
  1540. // "17": {
  1541. // //主角自己
  1542. // "0": [0],
  1543. // },
  1544. // "18": {
  1545. // //我方弟子
  1546. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18],
  1547. // },
  1548. // "20": {
  1549. // //我方弟子
  1550. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18],
  1551. // },
  1552. // "22": {
  1553. // //敌方全体异常
  1554. // "0": [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 0],
  1555. // },
  1556. // "23": {
  1557. // "0": [2, 5, 1, 3, 8, 13, 14, 4, 6, 15, 16, 7, 9, 17, 18, 0],
  1558. // "2": [2, 5, 1, 3, 8, 13, 14, 4, 6, 15, 16, 7, 9, 17, 18, 0],
  1559. // "5": [2, 5, 1, 3, 8, 13, 14, 4, 6, 15, 16, 7, 9, 17, 18, 0],
  1560. // "8": [2, 5, 1, 3, 8, 13, 14, 4, 6, 15, 16, 7, 9, 17, 18, 0],
  1561. // "11": [2, 5, 1, 3, 8, 13, 14, 4, 6, 15, 16, 7, 9, 17, 18, 0],
  1562. // "1": [3, 6, 2, 14, 9, 1, 5, 16, 14, 4, 8, 18, 15, 7, 17, 0],
  1563. // "4": [3, 6, 2, 14, 9, 1, 5, 16, 14, 4, 8, 18, 15, 7, 17, 0],
  1564. // "7": [3, 6, 2, 14, 9, 1, 5, 16, 14, 4, 8, 18, 15, 7, 17, 0],
  1565. // "10": [3, 6, 2, 14, 9, 1, 5, 16, 14, 4, 8, 18, 15, 7, 17, 0],
  1566. // "3": [1, 4, 13, 2, 7, 3, 15, 5, 14, 6, 17, 8, 16, 9, 18, 0],
  1567. // "6": [1, 4, 13, 2, 7, 3, 15, 5, 14, 6, 17, 8, 16, 9, 18, 0],
  1568. // "9": [1, 4, 13, 2, 7, 3, 15, 5, 14, 6, 17, 8, 16, 9, 18, 0],
  1569. // "12": [1, 4, 13, 2, 7, 3, 15, 5, 14, 6, 17, 8, 16, 9, 18, 0],
  1570. // "13": [14, 16, 3, 18, 2, 6, 1, 5, 9, 13, 4, 8, 15, 7, 17, 0],
  1571. // "15": [14, 16, 3, 18, 2, 6, 1, 5, 9, 13, 4, 8, 15, 7, 17, 0],
  1572. // "17": [14, 16, 3, 18, 2, 6, 1, 5, 9, 13, 4, 8, 15, 7, 17, 0],
  1573. // "14": [13, 15, 1, 17, 2, 4, 3, 5, 7, 14, 6, 8, 16, 9, 18, 0],
  1574. // "16": [13, 15, 1, 17, 2, 4, 3, 5, 7, 14, 6, 8, 16, 9, 18, 0],
  1575. // "18": [13, 15, 1, 17, 2, 4, 3, 5, 7, 14, 6, 8, 16, 9, 18, 0],
  1576. // },
  1577. // };
  1578. // let yu = Math.floor(Number(iid) % 100).toString();
  1579. // let iqz: number = 100; //我方前缀
  1580. // let fqz: number = 1000; //对方前缀
  1581. // if (Number(iid) >= 1000) {
  1582. // fqz = 100;
  1583. // iqz = 1000;
  1584. // }
  1585. // for (let i = 0; i < ttype.length; i++) {
  1586. // if (fiids.length >= targetType) {
  1587. // break; //已经找到了
  1588. // }
  1589. // let mubiao = ttype[i];
  1590. // switch (mubiao) {
  1591. // case 1: //1敌方全体
  1592. // if (distance > 0) {
  1593. // let fiid = (fqz + 5).toString();
  1594. // fiids = this.find_jianse_fiid(fiid, distance);
  1595. // if (this.teams[fiid] != null && this.uuids[fiid].dzhen == 0 && gameMethod.isEmpty(this.teams[fiid].isHide)) {
  1596. // fiids.push((fqz + 5).toString());
  1597. // }
  1598. // } else {
  1599. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1600. // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
  1601. // let fHp = this.skbuff_get(fiid, "hp");
  1602. // if (this.teams[fiid] == null || fHp <= 0) {
  1603. // continue;
  1604. // }
  1605. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1606. // continue; //隐藏
  1607. // }
  1608. // fiids.push(fiid);
  1609. // }
  1610. // }
  1611. // break;
  1612. // case 2: //2前排敌方
  1613. // case 3: //3中排敌方
  1614. // case 4: //4后排敌方
  1615. // let count = 0;
  1616. // for (let k = 0; k < mblist[mubiao.toString()][yu].length; k++) {
  1617. // let fiid = (fqz + mblist[mubiao.toString()][yu][k]).toString();
  1618. // let fHp = this.skbuff_get(fiid, "hp");
  1619. // if (this.teams[fiid] == null || fHp <= 0) {
  1620. // continue;
  1621. // }
  1622. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1623. // continue; //隐藏
  1624. // }
  1625. // count += 1;
  1626. // if (count > targetType) {
  1627. // continue;
  1628. // }
  1629. // fiids.push(fiid);
  1630. // }
  1631. // break;
  1632. // case 5: // 5敌方随机(不能随机同一个目标)
  1633. // let cqlist5: string[] = [];
  1634. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1635. // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
  1636. // let fHp = this.skbuff_get(fiid, "hp");
  1637. // if (this.teams[fiid] == null || fHp <= 0) {
  1638. // continue;
  1639. // }
  1640. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1641. // continue; //隐藏
  1642. // }
  1643. // cqlist5.push(fiid);
  1644. // }
  1645. // fiids = this.seedRand.getRandArr(cqlist5, Math.min(cqlist5.length, targetType));
  1646. // break;
  1647. // case 6: //自己
  1648. // fiids = [iid];
  1649. // break;
  1650. // case 7: //7已方全体
  1651. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1652. // let fiid = (iqz + mblist[mubiao.toString()]["0"][k]).toString();
  1653. // let fHp = this.skbuff_get(fiid, "hp");
  1654. // if (this.teams[fiid] == null || fHp <= 0) {
  1655. // continue;
  1656. // }
  1657. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1658. // continue; //隐藏
  1659. // }
  1660. // fiids.push(fiid);
  1661. // }
  1662. // break;
  1663. // case 8: // 8已方随机(除自己外)(不可以随机同一个目标)
  1664. // let cqlist8: string[] = [];
  1665. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1666. // let fiid = (iqz + mblist[mubiao.toString()]["0"][k]).toString();
  1667. // let fHp = this.skbuff_get(fiid, "hp");
  1668. // if (this.teams[fiid] == null || fHp <= 0) {
  1669. // continue;
  1670. // }
  1671. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1672. // continue; //隐藏
  1673. // }
  1674. // if (fiid == iid) {
  1675. // //(除自己外)
  1676. // continue;
  1677. // }
  1678. // cqlist8.push(fiid);
  1679. // }
  1680. // fiids = this.seedRand.getRandArr(cqlist8, Math.min(cqlist8.length, targetType));
  1681. // break;
  1682. // case 9: // 9上次攻击我的对象
  1683. // if (!this.uuids[iid]) {
  1684. // continue;
  1685. // }
  1686. // if (this.uuids[iid].fpk != "") {
  1687. // fiids.push(this.uuids[iid].fpk);
  1688. // }
  1689. // break;
  1690. // case 10: // 10敌方攻击力最高单位
  1691. // let fMaxatk10: number = 0;
  1692. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1693. // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
  1694. // let fHp = this.skbuff_get(fiid, "hp");
  1695. // if (this.teams[fiid] == null || fHp <= 0) {
  1696. // continue;
  1697. // }
  1698. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1699. // continue; //隐藏
  1700. // }
  1701. // let fAtk = this.skbuff_get(fiid, "atk");
  1702. // if (fAtk <= fMaxatk10) {
  1703. // continue;
  1704. // }
  1705. // fMaxatk10 = fAtk;
  1706. // fiids = [fiid];
  1707. // }
  1708. // break;
  1709. // case 11: // 11敌方攻击力最低单位,
  1710. // let fMinatk11: number = 999999999;
  1711. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1712. // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
  1713. // let fHp = this.skbuff_get(fiid, "hp");
  1714. // if (this.teams[fiid] == null || fHp <= 0) {
  1715. // continue;
  1716. // }
  1717. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1718. // continue; //隐藏
  1719. // }
  1720. // let fAtk = this.skbuff_get(fiid, "atk");
  1721. // if (fAtk >= fMinatk11) {
  1722. // continue;
  1723. // }
  1724. // fMinatk11 = fAtk;
  1725. // fiids = [fiid];
  1726. // }
  1727. // break;
  1728. // case 12: // 12敌方当前血量最低单位
  1729. // let fMinhp12: number = 999999999;
  1730. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1731. // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
  1732. // let fHp = this.skbuff_get(fiid, "hp");
  1733. // if (this.teams[fiid] == null || fHp <= 0) {
  1734. // continue;
  1735. // }
  1736. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1737. // continue; //隐藏
  1738. // }
  1739. // let fAtk = this.skbuff_get(fiid, "hp");
  1740. // if (fAtk >= fMinhp12) {
  1741. // continue;
  1742. // }
  1743. // fMinhp12 = fAtk;
  1744. // fiids = [fiid];
  1745. // }
  1746. // break;
  1747. // case 13: // 13敌方当前血量最高单位,
  1748. // let fMaxhp13: number = 0;
  1749. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1750. // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
  1751. // let fHp = this.skbuff_get(fiid, "hp");
  1752. // if (this.teams[fiid] == null || fHp <= 0) {
  1753. // continue;
  1754. // }
  1755. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1756. // continue; //隐藏
  1757. // }
  1758. // let fAtk = this.skbuff_get(fiid, "hp");
  1759. // if (fAtk <= fMaxhp13) {
  1760. // continue;
  1761. // }
  1762. // fMaxhp13 = fAtk;
  1763. // fiids = [fiid];
  1764. // }
  1765. // break;
  1766. // case 15: // 15 我打的最后一个
  1767. // if (this.uuids[iid].ipk != "") {
  1768. // fiids = [this.uuids[iid].ipk];
  1769. // }
  1770. // break;
  1771. // case 16: //16生命值最低的已方单位)
  1772. // let minHp: number = 0;
  1773. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1774. // let fiid = (iqz + mblist[mubiao.toString()]["0"][k]).toString();
  1775. // let fHp = this.skbuff_get(fiid, "hp");
  1776. // if (this.teams[fiid] == null || fHp <= 0) {
  1777. // continue;
  1778. // }
  1779. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1780. // continue; //隐藏
  1781. // }
  1782. // if (minHp == 0) {
  1783. // fiids = [fiid];
  1784. // minHp = fHp;
  1785. // } else {
  1786. // if (minHp > fHp) {
  1787. // minHp = fHp;
  1788. // fiids = [fiid];
  1789. // }
  1790. // }
  1791. // }
  1792. // break;
  1793. // case 17: //17 我方主角
  1794. // if (iqz.toString().length > 3) {
  1795. // fiids = ["1000"];
  1796. // } else {
  1797. // fiids = ["100"];
  1798. // }
  1799. // break;
  1800. // case 18: //18己方全体弟子
  1801. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1802. // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
  1803. // let fHp = this.skbuff_get(fiid, "hp");
  1804. // if (this.teams[fiid] == null || fHp <= 0) {
  1805. // continue;
  1806. // }
  1807. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1808. // continue; //隐藏
  1809. // }
  1810. // fiids.push(fiid);
  1811. // }
  1812. // break;
  1813. // case 19: // 19 上次我攻击的对象
  1814. // if (this.uuids[iid].ipks[this.zhen] != null) {
  1815. // fiids = this.uuids[iid].ipks[this.zhen];
  1816. // } else {
  1817. // fiids = [];
  1818. // }
  1819. // break;
  1820. // case 20: // 20 随机己方x个弟子
  1821. // let cqlist20: string[] = [];
  1822. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1823. // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
  1824. // let fHp = this.skbuff_get(fiid, "hp");
  1825. // if (this.teams[fiid] == null || fHp <= 0) {
  1826. // continue;
  1827. // }
  1828. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1829. // continue; //隐藏
  1830. // }
  1831. // cqlist20.push(fiid);
  1832. // }
  1833. // fiids = this.seedRand.getRandArr(cqlist20, Math.min(cqlist20.length, targetType));
  1834. // break;
  1835. // case 21: // 21 敌方主角
  1836. // if (iqz.toString().length > 3) {
  1837. // fiids = ["100"];
  1838. // } else {
  1839. // fiids = ["1000"];
  1840. // }
  1841. // break;
  1842. // case 22: // 22 敌方异常状态敌人
  1843. // let cqlist22: string[] = [];
  1844. // for (let k = 0; k < mblist[mubiao.toString()]["0"].length; k++) {
  1845. // let fiid = (fqz + mblist[mubiao.toString()]["0"][k]).toString();
  1846. // let fHp = this.skbuff_get(fiid, "hp");
  1847. // if (this.teams[fiid] == null || fHp <= 0) {
  1848. // continue;
  1849. // }
  1850. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1851. // continue; //隐藏
  1852. // }
  1853. // let buffs = ["effect_i_1", "effect_i_3", "effect_i_4", "effect_i_5", "effect_i_7"];
  1854. // for (let index = 0; index < buffs.length; index++) {
  1855. // let buff = buffs[index];
  1856. // if (this.skbuff_get(fiid, buff, 2) > 0) {
  1857. // cqlist22.push(fiid);
  1858. // break;
  1859. // }
  1860. // }
  1861. // }
  1862. // fiids = this.seedRand.getRandArr(cqlist22, Math.min(cqlist22.length, targetType));
  1863. // break;
  1864. // case 23: // 23 攻击最近目标
  1865. // let cqlist23: string[] = [];
  1866. // for (let k = 0; k < mblist[mubiao.toString()][yu].length; k++) {
  1867. // let fiid = (fqz + mblist[mubiao.toString()][yu][k]).toString();
  1868. // let fHp = this.skbuff_get(fiid, "hp");
  1869. // if (this.teams[fiid] == null || fHp <= 0) {
  1870. // continue;
  1871. // }
  1872. // if (gameMethod.isEmpty(this.teams[fiid].isHide) == false) {
  1873. // continue; //隐藏
  1874. // }
  1875. // cqlist23.push(fiid);
  1876. // if (cqlist23.length == targetType) {
  1877. // break;
  1878. // }
  1879. // }
  1880. // fiids = cqlist23;
  1881. // break;
  1882. // }
  1883. // for (let i = 0; i < fiids.length; i++) {
  1884. // if (this.oneFiids[iid][key].length >= targetType) {
  1885. // continue;
  1886. // }
  1887. // if (this.oneFiids[iid][key].includes(fiids[i])) {
  1888. // continue;
  1889. // }
  1890. // this.oneFiids[iid][key].push(fiids[i]);
  1891. // }
  1892. // }
  1893. // }
  1894. // /**
  1895. // * 辅助函数 - 获取对手
  1896. // * @param key 标识key
  1897. // * @param iid 出手方
  1898. // * @param distance 范围大小(半径)
  1899. // */
  1900. // private find_jianse_fiid(fiid: string, distance: number): string[] {
  1901. // if (gameMethod.isEmpty(distance) == true) {
  1902. // return [];
  1903. // }
  1904. // let fiids: string[] = [];
  1905. // //是不是范围触发
  1906. // let fwlist: { [wxid: string]: { [fw: string]: number[] } } = {
  1907. // 1: { 1: [2, 4, 5, 13, 15], 2: [3, 6, 7, 8, 9, 17], 3: [14, 16, 18, 0] },
  1908. // 2: { 1: [1, 3, 4, 5, 6], 2: [7, 8, 9, 14, 16, 18, 13, 15, 17], 3: [0] },
  1909. // 3: { 1: [2, 5, 6, 14, 16], 2: [1, 4, 7, 8, 9, 18], 3: [13, 15, 17, 0] },
  1910. // 4: { 1: [1, 2, 5, 7, 8, 13, 15, 17], 2: [3, 6, 9, 0], 3: [14, 16, 18] },
  1911. // 5: { 1: [1, 2, 3, 4, 6, 7, 8, 9], 2: [13, 15, 17, 14, 16, 18, 0] },
  1912. // 6: { 1: [2, 3, 5, 8, 9, 14, 16, 18], 2: [1, 4, 7, 0], 3: [13, 15, 17] },
  1913. // 7: { 1: [4, 5, 8, 0, 15, 17], 2: [1, 2, 3, 6, 9, 13], 3: [14, 16, 18] },
  1914. // 8: { 1: [0, 4, 5, 6, 7, 9], 2: [1, 2, 3, 14, 16, 18, 13, 15, 17] },
  1915. // 9: { 1: [0, 5, 6, 8, 16, 18], 2: [1, 2, 3, 4, 7, 14], 3: [13, 15, 17] },
  1916. // 0: { 1: [7, 8, 9], 2: [4, 5, 6, 15, 16, 17, 18], 3: [1, 2, 3, 13, 14] },
  1917. // };
  1918. // let wxid = Number(fiid) % 100;
  1919. // let qz: string = "10"; //前缀
  1920. // if (fiid.length == 4) {
  1921. // qz = "100";
  1922. // }
  1923. // for (let index = 1; index <= Math.floor(distance / 100); index++) {
  1924. // if (fwlist[wxid] == null || fwlist[wxid][index] == null) {
  1925. // continue;
  1926. // }
  1927. // for (let k = 0; k < fwlist[wxid][index].length; k++) {
  1928. // if (this.teams[qz + fwlist[wxid][index][k]] == null) {
  1929. // continue;
  1930. // }
  1931. // if (this.teams[qz + fwlist[wxid][index][k]].eps.hp <= 0) {
  1932. // continue;
  1933. // }
  1934. // if (fiids.includes(qz + fwlist[wxid][index][k])) {
  1935. // continue;
  1936. // }
  1937. // if (!gameMethod.isEmpty(this.teams[qz + fwlist[wxid][index][k]].isHide)) {
  1938. // continue; // 隐藏
  1939. // }
  1940. // fiids.push(qz + fwlist[wxid][index][k]);
  1941. // }
  1942. // }
  1943. // return fiids;
  1944. // }
  1945. // /**
  1946. // * 结算各种伤害
  1947. // * @param iid 攻击方
  1948. // * @param fiid 被攻击方
  1949. // * @param a 伤害系数
  1950. // * @param skid 触发技能
  1951. // */
  1952. // private js_hits(iid: string, fiid: string, a: number, skid: string) {
  1953. // //兽灵攻击
  1954. // if (this.teams[iid].type == 3 || Number(iid) % 100 == 10) {
  1955. // let mzid: number = 100;
  1956. // let fzid: number = 1000;
  1957. // if (iid.length > 3) {
  1958. // mzid = 1000;
  1959. // fzid = 100;
  1960. // }
  1961. // let i_z_atk = this.skbuff_get(mzid.toString(), "atk");
  1962. // let i_z_qhshouling = this.skbuff_get(mzid.toString(), "qhshouling");
  1963. // let f_z_rhshouling = this.skbuff_get(fzid.toString(), "rhshouling");
  1964. // let slhit = ((i_z_atk * a) / 10000) * Math.max(1, 1 + (i_z_qhshouling - f_z_rhshouling) / 10000);
  1965. // //输出伤害fjsRate
  1966. // if (this.oneHit[iid] == null) {
  1967. // this.oneHit[iid] = {};
  1968. // }
  1969. // this.oneHit[iid][fiid] = {
  1970. // pghit: Math.floor(slhit), //普攻伤害
  1971. // skhit: Math.floor(slhit), //技能伤害
  1972. // bjhit: 0, //暴击伤害
  1973. // gdhit: 0, //格挡伤害
  1974. // fjhit: 0, //反击伤害
  1975. // ljhit: 0, //连击伤害
  1976. // jshit: 0, //溅射伤害(没有折损比例系数)
  1977. // xxhit: 0, //吸血值
  1978. // xxRate: 0, //吸血值
  1979. // jsRate: 0, //吸血值
  1980. // fjsRate: 0, //吸血值
  1981. // };
  1982. // return;
  1983. // }
  1984. // //伤害公式:我方攻击>敌方防御 如果这个条件成立,普攻伤害走下面公式
  1985. // //普通伤害=max((我方攻击-敌方防御)*(1+我方伤害增强-敌方伤害减弱),我方攻击*0.15)*RANDBETWEEN(0.97,1.03)
  1986. // //否则
  1987. // //普通伤害=max(0,0.85*pow(我方攻击,0.8))
  1988. // let i_atk: number = this.skbuff_get(iid, "atk");
  1989. // let f_def: number = this.skbuff_get(fiid, "def");
  1990. // let base_hit: number = 0; //普通伤害
  1991. // if (i_atk > f_def) {
  1992. // let i_zengshang: number = this.skbuff_get(iid, "zengshang");
  1993. // let f_jianshang: number = this.skbuff_get(fiid, "jianshang");
  1994. // base_hit = (Math.max(((i_atk - f_def) * (10000 + i_zengshang - f_jianshang)) / 10000, i_atk * 0.15) * this.seedRand.rand(97, 103)) / 100;
  1995. // } else {
  1996. // base_hit = Math.max(0, 0.85 * Math.pow(i_atk, 0.8));
  1997. // }
  1998. // let i_a = this.skbuff_get(iid, "a"); //效果加成
  1999. // let i_75 = this.skbuff_get(iid, "i_75"); //效果加成
  2000. // if (i_75 != 0) {
  2001. // // 一次加成的效果 用完清空
  2002. // this.skbuff_sub_all(iid, "effect_i_75");
  2003. // }
  2004. // // let f_a = this.skbuff_get(fiid,"i_30") //伤害加深
  2005. // //对最终伤害有概率造成N倍伤害
  2006. // let i_a_per = this.skbuff_get(iid, "a_per"); //效果加成
  2007. // if (i_a_per != 0) {
  2008. // // 一次加成的效果 用完清空
  2009. // this.skbuff_sub_all(iid, "effect_i_67");
  2010. // }
  2011. // i_a_per = i_a_per ? i_a_per : 1;
  2012. // let i_sk_a = this.skbuff_get(iid, "sk_a"); //技能伤害加成
  2013. // //普功伤害
  2014. // let pg_hit = (base_hit * (a + i_a + i_75) * i_a_per) / 10000;
  2015. // //技能伤害=普通伤害 *(0+技能系数)
  2016. // let sk_hit: number = (base_hit * (a + i_a + i_75 + i_sk_a) * i_a_per) / 10000;
  2017. // //普通攻击 + 额外伤害
  2018. // let cfgSk = Gamecfg.skillBase.getItem(skid, "1");
  2019. // let zzhit = pg_hit; //最终伤害
  2020. // if (cfgSk != null && cfgSk.skillType == 3) {
  2021. // zzhit = sk_hit;
  2022. // }
  2023. // //暴击伤害= 技能伤害*max(我方强化暴伤-敌方忽视暴伤,1)
  2024. // let i_baonue: number = this.skbuff_get(iid, "baonue");
  2025. // let f_renai: number = this.skbuff_get(fiid, "renai");
  2026. // let bj_hit: number = zzhit * Math.max(1, (i_baonue - f_renai) / 10000);
  2027. // //格挡伤害= MIN(技能伤害*(MAX(敌方格挡增强-我方格挡减弱,0.12)),技能伤害*0.9)
  2028. // let f_qhblock: number = this.skbuff_get(fiid, "qhblock");
  2029. // let i_rhblock: number = this.skbuff_get(iid, "rhblock");
  2030. // let gd_hit: number = Math.min(zzhit * Math.max(0.12, (f_qhblock - i_rhblock) / 10000), zzhit * 0.9);
  2031. // //反击伤害= MIN(技能伤害*MAX(敌方反击增强-我方反击减弱,1),我方生命*0.85)
  2032. // let f_qhfanji: number = this.skbuff_get(fiid, "qhfanji");
  2033. // let i_rhfanji: number = this.skbuff_get(iid, "rhfanji");
  2034. // let i_hp: number = this.skbuff_get(iid, "hp");
  2035. // let fj_hit: number = Math.min(zzhit * Math.max(1, (f_qhfanji - i_rhfanji) / 10000), i_hp * 0.9);
  2036. // //连击伤害 = 技能伤害*MAX(我方连击增强-敌方连击减弱,1)
  2037. // let i_qhlianji: number = this.skbuff_get(iid, "qhlianji");
  2038. // let f_rhlianji: number = this.skbuff_get(fiid, "rhlianji");
  2039. // let lj_hit: number = zzhit * Math.max((i_qhlianji - f_rhlianji) / 10000 + 1, 1);
  2040. // //溅射伤害= 最终伤害*折损比例系数*MAX(我方溅射增强-敌方溅射减弱,0.12)
  2041. // //折损比例系数 这个这边不计算
  2042. // let i_jianshe: number = this.skbuff_get(iid, "jianshe");
  2043. // let f_hsjianshe: number = this.skbuff_get(fiid, "hsjianshe");
  2044. // let bdjianshe: number = 0; //保底吸血
  2045. // let cfgjs = Gamecfg.userEp.getItem("jianshe");
  2046. // if (cfgjs != null) {
  2047. // bdjianshe = cfgjs.initEp;
  2048. // }
  2049. // let jsRate: number = Math.max(i_jianshe - f_hsjianshe, bdjianshe);
  2050. // let fjsRate: number = Math.max(f_hsjianshe - i_jianshe, bdjianshe);
  2051. // let i_qhjianshe: number = this.skbuff_get(iid, "qhjianshe");
  2052. // let f_rhjianshe: number = this.skbuff_get(fiid, "rhjianshe");
  2053. // let js_hit: number = zzhit * Math.max((i_qhjianshe - f_rhjianshe) / 10000, 0.12);
  2054. // //吸血率=max((我方吸血-敌方抗吸血),吸血保底参数)
  2055. // //吸血值= 最终伤害值*max(我方吸血增强-敌方吸血减弱,1)*吸血率
  2056. // let i_xixue: number = this.skbuff_get(iid, "xixue");
  2057. // let f_hsxixue: number = this.skbuff_get(fiid, "hsxixue");
  2058. // let bdxixue: number = 0; //保底吸血
  2059. // let cfg = Gamecfg.userEp.getItem("xixue");
  2060. // if (cfg != null) {
  2061. // bdxixue = cfg.initEp;
  2062. // }
  2063. // let xxRate: number = Math.max(i_xixue - f_hsxixue, bdxixue);
  2064. // let i_qhxixue: number = this.skbuff_get(iid, "qhxixue");
  2065. // let f_rhxixue: number = this.skbuff_get(fiid, "rhxixue");
  2066. // let xx_hit: number = (zzhit * Math.max((i_qhxixue - f_rhxixue) / 10000 + 1, 1) * xxRate) / 10000;
  2067. // if (this.oneHit[iid] == null) {
  2068. // this.oneHit[iid] = {};
  2069. // }
  2070. // if (cfgSk != null && cfgSk.skillType == 1) {
  2071. // //指计算普攻
  2072. // let pg_hit_per: number = 0;
  2073. // //普攻施加buff
  2074. // let i_19_a = this.skbuff_get(iid, "i_19_a");
  2075. // let i_19_i = this.skbuff_get(iid, "i_19_i");
  2076. // if (i_19_a > 0 && i_19_i > 0) {
  2077. // let ef_i_19_i = this.skbuff_get(iid, "effect_i_" + i_19_i, 2);
  2078. // pg_hit_per += i_19_a * ef_i_19_i;
  2079. // }
  2080. // let i_39_a = this.skbuff_get(iid, "i_39_a");
  2081. // pg_hit_per += i_39_a;
  2082. // pg_hit += (pg_hit_per / 10000) * pg_hit;
  2083. // }
  2084. // //输出伤害
  2085. // this.oneHit[iid][fiid] = {
  2086. // pghit: Math.floor(pg_hit), //普攻伤害
  2087. // skhit: Math.floor(sk_hit), //技能伤害
  2088. // bjhit: Math.floor(bj_hit), //暴击伤害
  2089. // gdhit: Math.floor(gd_hit), //格挡伤害
  2090. // fjhit: Math.floor(fj_hit), //反击伤害
  2091. // ljhit: Math.floor(lj_hit), //连击伤害
  2092. // jshit: Math.floor(js_hit), //溅射伤害(没有折损比例系数)
  2093. // xxhit: Math.floor(xx_hit), //吸血值
  2094. // xxRate: xxRate, //吸血概率
  2095. // jsRate: jsRate, //溅射概率
  2096. // fjsRate: fjsRate, //反击溅射概率
  2097. // };
  2098. // //伤害加深
  2099. // if (this.skbuff_get(iid, "effect_i_53", 2) > 0) {
  2100. // let hit53 = this.skbuff_get(iid, "i_53");
  2101. // this.oneHit[iid][fiid] = {
  2102. // pghit: hit53, //普攻伤害
  2103. // skhit: hit53, //技能伤害
  2104. // bjhit: hit53, //暴击伤害
  2105. // gdhit: Math.floor(gd_hit), //格挡伤害
  2106. // fjhit: Math.floor(fj_hit), //反击伤害
  2107. // ljhit: hit53, //连击伤害
  2108. // jshit: hit53, //溅射伤害(没有折损比例系数)
  2109. // xxhit: Math.floor(xx_hit), //吸血值
  2110. // xxRate: xxRate, //吸血概率
  2111. // jsRate: jsRate, //溅射概率
  2112. // fjsRate: fjsRate, //反击溅射概率
  2113. // };
  2114. // }
  2115. // if (Number(iid) % 100 < 10 && Number(iid) % 100 > 0 && this.skbuff_get(iid, "effect_i_64", 2) > 0) {
  2116. // // 是弟子 首次增伤
  2117. // let i_64_a = this.skbuff_get(iid, "i_64_a");
  2118. // let i_64_nZhen = this.skbuff_get(iid, "i_64_nZhen");
  2119. // if (i_64_a > 0 && i_64_nZhen <= this.zhen) {
  2120. // // 只加一次
  2121. // this.skbuff_sub_all(iid, "effect_i_64");
  2122. // this.oneHit[iid][fiid].skhit = Math.floor(this.oneHit[iid][fiid].skhit * (i_64_a / 10000 + 1));
  2123. // this.oneHit[iid][fiid].pghit = Math.floor(this.oneHit[iid][fiid].pghit * (i_64_a / 10000 + 1));
  2124. // }
  2125. // }
  2126. // }
  2127. // private sk_base2(iid: string, runStatus: number, cs: { [key: string]: number } = {}) {
  2128. // let type = Number(iid) % 100 == 0 ? 1 : Number(iid) % 100 > 0 && Number(iid) % 100 < 10 ? 2 : 3;
  2129. // if (this.objects[iid.length] == null || this.objects[iid.length][type] == null) {
  2130. // return;
  2131. // }
  2132. // let cf_sk: { [skillType: string]: [string, { [key: string]: number }, number][] } = {}; //当前要触发的技能库
  2133. // let skids: string[] = Object.keys(this.objects[iid.length][type]);
  2134. // for (let index = skids.length - 1; index >= 0; index--) {
  2135. // let skid = skids[index];
  2136. // let sklv = this.objects[iid.length][type][skid].sklv;
  2137. // let sklvCd = 100;
  2138. // let cfgSk = Gamecfg.skillBase.getItem(skid, sklv.toString());
  2139. // if (cfgSk == null) {
  2140. // continue; //没有这个技能 或者 这个技能的触发时机不对
  2141. // }
  2142. // if (cfgSk.runStatus != runStatus) {
  2143. // continue; //没有这个技能 或者 这个技能的触发时机不对
  2144. // }
  2145. // if (cfgSk.runStatus === 4 && !cfgSk.cd && this.zhen != 1) {
  2146. // // 没有cd的 runStatus=4的只在战斗开始时加一次
  2147. // continue;
  2148. // }
  2149. // //受到攻击后触发
  2150. // if (cfgSk.runStatus == 2) {
  2151. // //被打次数
  2152. // let bdcons = this.uuids[iid].fcons[0] + this.uuids[iid].fcons[1] + this.uuids[iid].fcons[2];
  2153. // if (bdcons == 0) {
  2154. // continue; //还没被打
  2155. // }
  2156. // if (gameMethod.isEmpty(cfgSk.hitNumber) == false && bdcons % cfgSk.hitNumber > 0) {
  2157. // continue; //未累计到次数
  2158. // }
  2159. // }
  2160. // let eff_i_3 = this.skbuff_get(iid, "effect_i_3", 2);
  2161. // if (eff_i_3 > 0) {
  2162. // continue; //晕眩
  2163. // }
  2164. // let eff_i_5 = this.skbuff_get(iid, "effect_i_5", 2);
  2165. // if (eff_i_5 > 0) {
  2166. // continue; //晕眩
  2167. // }
  2168. // let eff_i_6 = this.skbuff_get(iid, "effect_i_6", 2);
  2169. // if (eff_i_6 > 0) {
  2170. // continue; //击退
  2171. // }
  2172. // let eff_i_16 = this.skbuff_get(iid, "effect_i_16", 2);
  2173. // if (eff_i_16 > 0) {
  2174. // continue; //入定状态
  2175. // }
  2176. // //(1普攻,2 被动,3技能)
  2177. // if (cfgSk.skillType != 1) {
  2178. // let eff_i_1 = this.skbuff_get(iid, "effect_i_1", 2);
  2179. // if (eff_i_1 > 0) {
  2180. // //沉默
  2181. // continue;
  2182. // }
  2183. // }
  2184. // //初始化技能
  2185. // if (this.uuids[iid].skbase[skid] == null) {
  2186. // this.uuids[iid].skbase[skid] = {
  2187. // last: 0, //最后一次出手帧
  2188. // count: 0,
  2189. // action: {},
  2190. // effect: {},
  2191. // };
  2192. // }
  2193. // //技能cd
  2194. // let cs2:{[key:string]:number} = gameMethod.objCopy(cs)
  2195. // cs2["cd"] = gameMethod.isEmpty(cfgSk.cd) ? 0 : cfgSk.cd * 30;
  2196. // cs2["cd2"] = gameMethod.isEmpty(cfgSk.cd2) ? 0 : (parseInt(iid) % 100 == 10 ? (cfgSk.cd2 * 30 * sklvCd) / 100 : cfgSk.cd2 * 30);
  2197. // if (this.uuids[iid].skbase[skid].last + cs["cd"] > this.zhen) {
  2198. // continue; //冷却时间还没到
  2199. // }
  2200. // //次数判定
  2201. // if (gameMethod.isEmpty(cfgSk.count) == false && this.uuids[iid].skbase[skid].count >= cfgSk.count) {
  2202. // continue; //没有次数了
  2203. // }
  2204. // if (gameMethod.isEmpty(cfgSk.chance) == false && this.seedRand.rand(1, 10000) > cfgSk.chance * 10000) {
  2205. // continue; //没有触发这个技能
  2206. // }
  2207. // if (cfgSk.skillType == 2) {
  2208. // //被动
  2209. // } else if (cfgSk.skillType == 3) {
  2210. // //特殊技能
  2211. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.atk);
  2212. // this.addOneAtk(iid, iid, "aSkid", skid);
  2213. // }
  2214. // //先找出触发的技能ID
  2215. // if (cf_sk[cfgSk.skillType] == null) {
  2216. // cf_sk[cfgSk.skillType] = [];
  2217. // }
  2218. // cf_sk[cfgSk.skillType].push([skid, cs2, sklv]);
  2219. // }
  2220. // return cf_sk;
  2221. // }
  2222. // private sk_baseObjRun4(iid: string) {
  2223. // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
  2224. // return; //隐藏
  2225. // }
  2226. // let skids: string[] = Object.keys(this.teams[iid].sk);
  2227. // let type = Number(iid) % 100 == 0 ? 1 : Number(iid) % 100 > 0 && Number(iid) % 100 < 10 ? 2 : 3;
  2228. // for (let index = skids.length - 1; index >= 0; index--) {
  2229. // let skid = skids[index];
  2230. // let sklv = this.teams[iid].sk[skid][0];
  2231. // let cfgSk = Gamecfg.skillBase.getItem(skid, sklv.toString());
  2232. // if (cfgSk && cfgSk.object && type != cfgSk.object) {
  2233. // // 非给自己加的技能 在战斗前初始化
  2234. // if (this.objects[iid.length] == null) {
  2235. // this.objects[iid.length] = {};
  2236. // }
  2237. // if (this.objects[iid.length][cfgSk.object] == null) {
  2238. // this.objects[iid.length][cfgSk.object] = {};
  2239. // }
  2240. // if (this.objects[iid.length][cfgSk.object][cfgSk.id] == null) {
  2241. // this.objects[iid.length][cfgSk.object][cfgSk.id] = {
  2242. // cd: cfgSk.cd ? cfgSk.cd : 0,
  2243. // sklv: sklv,
  2244. // iids: {},
  2245. // };
  2246. // }
  2247. // }
  2248. // }
  2249. // }
  2250. // /**
  2251. // * 辅助函数 - 技能触发
  2252. // * @param iid 触发者
  2253. // * @param runStatus 技能触发时机
  2254. // * 1:攻击时造成伤害
  2255. // * 2:受到攻击时
  2256. // * 3:灵力满怒时释放
  2257. // * 4:进入战斗后,还没攻击前
  2258. // * 5:进入战斗后,x秒内
  2259. // * 6:攻击时造成伤害,并且目标成功格挡(注意和1类型是不同的)
  2260. // * 7.反击时
  2261. // * 8.自身格挡时。和6类型不同,6类型是敌方格挡
  2262. // *
  2263. // */
  2264. // private sk_base(iid: string, runStatus: number, cs: { [key: string]: number } = {}) {
  2265. // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
  2266. // return false; //隐藏
  2267. // }
  2268. // let skids: string[] = Object.keys(this.teams[iid].sk);
  2269. // let type = Number(iid) % 100 == 0 ? 1 : Number(iid) % 100 > 0 && Number(iid) % 100 < 10 ? 2 : 3;
  2270. // let cf_sk: { [skillType: string]: [string, { [key: string]: number }, number][] } = {}; //当前要触发的技能库
  2271. // for (let index = skids.length - 1; index >= 0; index--) {
  2272. // let skid = skids[index];
  2273. // let sklv = this.teams[iid].sk[skid][0];
  2274. // let sklvCd = this.teams[iid].sk[skid][1];
  2275. // let cfgSk = Gamecfg.skillBase.getItem(skid, sklv.toString());
  2276. // if (cfgSk == null) {
  2277. // continue; //没有这个技能 或者 这个技能的触发时机不对
  2278. // }
  2279. // if (cfgSk.object && type != cfgSk.object) {
  2280. // // 不是加给自己的技能
  2281. // continue;
  2282. // } else if (cfgSk.runStatus != runStatus) {
  2283. // continue; //没有这个技能 或者 这个技能的触发时机不对
  2284. // }
  2285. // //受到攻击后触发
  2286. // if (cfgSk.runStatus == 2) {
  2287. // //被打次数
  2288. // let bdcons = this.uuids[iid].fcons[0] + this.uuids[iid].fcons[1] + this.uuids[iid].fcons[2];
  2289. // if (bdcons == 0) {
  2290. // continue; //还没被打
  2291. // }
  2292. // if (gameMethod.isEmpty(cfgSk.hitNumber) == false && bdcons % cfgSk.hitNumber > 0) {
  2293. // continue; //未累计到次数
  2294. // }
  2295. // }
  2296. // let eff_i_3 = this.skbuff_get(iid, "effect_i_3", 2);
  2297. // if (eff_i_3 > 0) {
  2298. // continue; //晕眩
  2299. // }
  2300. // let eff_i_5 = this.skbuff_get(iid, "effect_i_5", 2);
  2301. // if (eff_i_5 > 0) {
  2302. // continue; //晕眩
  2303. // }
  2304. // let eff_i_6 = this.skbuff_get(iid, "effect_i_6", 2);
  2305. // if (eff_i_6 > 0) {
  2306. // continue; //击退
  2307. // }
  2308. // let eff_i_16 = this.skbuff_get(iid, "effect_i_16", 2);
  2309. // if (eff_i_16 > 0) {
  2310. // continue; //入定状态
  2311. // }
  2312. // //(1普攻,2 被动,3技能)
  2313. // if (cfgSk.skillType != 1) {
  2314. // let eff_i_1 = this.skbuff_get(iid, "effect_i_1", 2);
  2315. // if (eff_i_1 > 0) {
  2316. // //沉默
  2317. // continue;
  2318. // }
  2319. // }
  2320. // //初始化技能
  2321. // if (this.uuids[iid].skbase[skid] == null) {
  2322. // this.uuids[iid].skbase[skid] = {
  2323. // last: 0, //最后一次出手帧
  2324. // count: 0,
  2325. // action: {},
  2326. // effect: {},
  2327. // };
  2328. // }
  2329. // //技能cd
  2330. // let cs2:{[key:string]:number} = gameMethod.objCopy(cs)
  2331. // cs2["cd"] = gameMethod.isEmpty(cfgSk.cd) ? 0 : (parseInt(iid) % 100 == 10 ? (cfgSk.cd * 30 * sklvCd) / 100 : cfgSk.cd * 30);
  2332. // cs2["cd2"] = gameMethod.isEmpty(cfgSk.cd2) ? 0 : (parseInt(iid) % 100 == 10 ? (cfgSk.cd2 * 30 * sklvCd) / 100 : cfgSk.cd2 * 30);
  2333. // if (this.uuids[iid].skbase[skid].last + cs2["cd"] > this.zhen) {
  2334. // continue; //冷却时间还没到
  2335. // }
  2336. // //次数判定
  2337. // if (gameMethod.isEmpty(cfgSk.count) == false && this.uuids[iid].skbase[skid].count >= cfgSk.count) {
  2338. // continue; //没有次数了
  2339. // }
  2340. // if (gameMethod.isEmpty(cfgSk.chance) == false && this.seedRand.rand(1, 10000) > cfgSk.chance * 10000) {
  2341. // continue; //没有触发这个技能
  2342. // }
  2343. // if (cfgSk.skillType == 2) {
  2344. // //被动
  2345. // } else if (cfgSk.skillType == 3) {
  2346. // //特殊技能
  2347. // this.sk_base(iid, 5, cs2);
  2348. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.atk);
  2349. // this.addOneAtk(iid, iid, "aSkid", skid);
  2350. // }
  2351. // //先找出触发的技能ID
  2352. // if (cf_sk[cfgSk.skillType] == null) {
  2353. // cf_sk[cfgSk.skillType] = [];
  2354. // }
  2355. // cf_sk[cfgSk.skillType].push([skid, cs2, sklv]);
  2356. // }
  2357. // // 获取共享技能
  2358. // let cf_sk2 = this.sk_base2(iid, runStatus, cs);
  2359. // if (cf_sk2 != null) {
  2360. // let keys = Object.keys(cf_sk2);
  2361. // for (let i = 0; i < keys.length; i++) {
  2362. // let keys2 = Object.keys(cf_sk2[keys[i]]);
  2363. // for (let k = 0; k < keys2.length; k++) {
  2364. // if (cf_sk[keys[i]] == null) {
  2365. // cf_sk[keys[i]] = [];
  2366. // }
  2367. // cf_sk[keys[i]].push(cf_sk2[keys[i]][k]);
  2368. // }
  2369. // }
  2370. // }
  2371. // //触发的技能列表
  2372. // let cfids: [string, { [key: string]: number }, number][] = [];
  2373. // if (cf_sk[3] != null) {
  2374. // //只要触发高级技能 就不触发普通攻击技能
  2375. // cfids = gameMethod.addArr(cfids, cf_sk[3]);
  2376. // } else if (cf_sk[1] != null) {
  2377. // cfids = gameMethod.addArr(cfids, cf_sk[1]);
  2378. // }
  2379. // if (cf_sk[2] != null) {
  2380. // //被动技能
  2381. // cfids = gameMethod.addArr(cfids, cf_sk[2]);
  2382. // }
  2383. // if (cfids.length <= 0) {
  2384. // return false;
  2385. // }
  2386. // // 这里才是真正出手了的地方
  2387. // if (runStatus != 4 && runStatus != 2 && runStatus != 7 && runStatus != 8) {
  2388. // // 战斗前触发的特性/被动 不算
  2389. // this.uuids[iid].last = this.zhen;
  2390. // }
  2391. // let values = Object.values(cfids);
  2392. // for (let i = 0; i < values.length; i++) {
  2393. // if (values[i][1]["do_iid"] == null) {
  2394. // values[i][1]["do_iid"] = Number(iid);
  2395. // }
  2396. // let cs2 = values[i][1]
  2397. // if (cs2["hit"] != null) {
  2398. // values[i][1]["hit"] = cs2["hit"];
  2399. // }
  2400. // let skid = values[i][0];
  2401. // let sklv = values[i][2];
  2402. // let cfgSk = Gamecfg.skillBase.getItem(values[i][0], sklv.toString());
  2403. // if (cfgSk == null) {
  2404. // continue; //没有这个技能 或者 这个技能的触发时机不对
  2405. // }
  2406. // if (cfgSk.type == "3"){
  2407. // // 术法触发
  2408. // this.addOneAtk(iid, iid, "effect", ["shufa",skid]);
  2409. // }
  2410. // this.uuids[iid].skbase[skid].last = this.zhen + (cs2["cd2"]>0&&cs2["cd"]==0?cs2["cd2"]:0);
  2411. // this.uuids[iid].skbase[skid].count += 1;
  2412. // if (cfgSk.sequence == 2) {
  2413. // //效果列表
  2414. // if (gameMethod.isEmpty(cfgSk.effect) == false) {
  2415. // let lastId = "";
  2416. // for (let k = 0; k < cfgSk.effect.length; k++) {
  2417. // this.sk_effect(iid, values[i][0], cfgSk.effect[k].toString(), lastId, values[i][1]);
  2418. // lastId = "effect_id_" + cfgSk.effect[k];
  2419. // }
  2420. // }
  2421. // //行为列表
  2422. // if (gameMethod.isEmpty(cfgSk.actions) == false) {
  2423. // let lastId = "";
  2424. // for (let index = 0; index < cfgSk.actions.length; index++) {
  2425. // let acId = cfgSk.actions[index];
  2426. // this.sk_action(iid, values[i][0], acId.toString(), lastId);
  2427. // lastId = "action_id_" + acId;
  2428. // }
  2429. // }
  2430. // } else {
  2431. // //行为列表
  2432. // if (gameMethod.isEmpty(cfgSk.actions) == false) {
  2433. // let lastId = "";
  2434. // for (let index = 0; index < cfgSk.actions.length; index++) {
  2435. // let acId = cfgSk.actions[index];
  2436. // this.sk_action(iid, values[i][0], acId.toString(), lastId);
  2437. // lastId = "action_id_" + acId;
  2438. // }
  2439. // }
  2440. // //效果列表
  2441. // if (gameMethod.isEmpty(cfgSk.effect) == false) {
  2442. // let lastId = "";
  2443. // for (let k = 0; k < cfgSk.effect.length; k++) {
  2444. // this.sk_effect(iid, values[i][0], cfgSk.effect[k].toString(), lastId, values[i][1]);
  2445. // lastId = "effect_id_" + cfgSk.effect[k];
  2446. // }
  2447. // }
  2448. // }
  2449. // }
  2450. // return true;
  2451. // }
  2452. // /**
  2453. // * 辅助函数 - 技能行为
  2454. // * @param iid 触发者
  2455. // * @param runStatus 技能触发时机
  2456. // * 1:攻击时造成伤害
  2457. // * 2:受到攻击时
  2458. // * 3:灵力满怒时释放
  2459. // * 4:进入战斗后,还没攻击前
  2460. // */
  2461. // private sk_action(iid: string, skid: string, acId: string, extend: string = "") {
  2462. // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
  2463. // return; //隐藏
  2464. // }
  2465. // let cfgAc = Gamecfg.skillAction.getItem(acId);
  2466. // if (cfgAc == null) {
  2467. // return;
  2468. // }
  2469. // if (this.oneFiids[iid] == null) {
  2470. // this.oneFiids[iid] = {};
  2471. // }
  2472. // let ac_ttype = "action_id_" + acId; //对手标识
  2473. // //继承上一次的目标
  2474. // if (extend != "") {
  2475. // //这里可以先继承
  2476. // this.oneFiids[iid][ac_ttype] = this.oneFiids[iid][extend];
  2477. // }
  2478. // let targetType: number = 0; //目标数量
  2479. // //目标数量
  2480. // if (gameMethod.isEmpty(cfgAc.targetType) == true) {
  2481. // targetType = 10;
  2482. // } else if (gameMethod.isEmpty(cfgAc.targetType[1]) == true) {
  2483. // targetType = cfgAc.targetType[0];
  2484. // } else {
  2485. // targetType = this.seedRand.rand(cfgAc.targetType[0], cfgAc.targetType[1]);
  2486. // }
  2487. // this.find_fiids(ac_ttype, iid, cfgAc.ttype, targetType, cfgAc.distance); //选择对手
  2488. // let cs: { [key: string]: number } = { do_iid: Number(iid) };
  2489. // //造成伤害
  2490. // if (cfgAc.args["a"] != null) {
  2491. // this.timer_do(301, { do_iid: Number(iid) }); //攻击前触发
  2492. // for (let i = 0; i < this.oneFiids[iid][ac_ttype].length; i++) {
  2493. // this.js_hits(iid, this.oneFiids[iid][ac_ttype][i], cfgAc.args["a"] * 10000, skid); //计算伤害
  2494. // let cs2 = this.sk_action_type_1(iid, this.oneFiids[iid][ac_ttype][i], skid, acId);
  2495. // cs = Object.assign(cs, cs2);
  2496. // cs[this.oneFiids[iid][ac_ttype][i]] = cs2["hit"];
  2497. // }
  2498. // }
  2499. // //造成伤害 - 术法
  2500. // if (cfgAc.args["atk"] != null) {
  2501. // this.timer_do(301, { do_iid: Number(iid) }); //攻击前触发
  2502. // for (let i = 0; i < this.oneFiids[iid][ac_ttype].length; i++) {
  2503. // this.js_hits(iid, this.oneFiids[iid][ac_ttype][i], cfgAc.args["atk"], skid); //计算伤害
  2504. // let cs2 = this.sk_action_type_1(iid, this.oneFiids[iid][ac_ttype][i], skid, acId);
  2505. // cs = Object.assign(cs, cs2);
  2506. // cs[this.oneFiids[iid][ac_ttype][i]] = cs2["hit"];
  2507. // }
  2508. // }
  2509. // //触发effect
  2510. // if (cfgAc.args["id"] != null) {
  2511. // let p = 0; //buff触发概率
  2512. // if (cfgAc.args["p"] != null) {
  2513. // p = cfgAc.args["p"] * 10000; //buff触发概率
  2514. // }
  2515. // if (this.seedRand.rand(1, 10000) <= p) {
  2516. // for (let i = 0; i < cfgAc.args.id.length; i++) {
  2517. // cs["nextid"] = 1;
  2518. // this.sk_effect(iid, skid, cfgAc.args.id[i].toString(), ac_ttype, cs);
  2519. // }
  2520. // }
  2521. // }
  2522. // //有概率给我方弟子挂一个反击buff
  2523. // if (gameMethod.isEmpty(cfgAc.canbeatback) == false) {
  2524. // let p = 0; //buff触发概率
  2525. // if (cfgAc.args["p"] != null) {
  2526. // p = cfgAc.args["p"] * 10000; //buff触发概率
  2527. // }
  2528. // for (let index = 0; index < this.teamFiids.length; index++) {
  2529. // let fiid = this.teamFiids[index];
  2530. // if (this.teams[fiid].type != 2) {
  2531. // continue; //不是弟子
  2532. // }
  2533. // if (this.teams[fiid].eps.hp <= 0) {
  2534. // continue; //
  2535. // }
  2536. // if (iid.length != fiid.length) {
  2537. // continue; //不是同阵营的
  2538. // }
  2539. // if (this.seedRand.rand(1, 10000) <= p) {
  2540. // this.skbuff_add({
  2541. // fiid: fiid, //添加对象
  2542. // key: "canbeatback", //属性key
  2543. // minZhen: this.zhen, //开始帧
  2544. // maxZhen: this.zhen + 30 * 45, //结束帧
  2545. // overlayType: 1, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  2546. // ceng: 1, //增加层数
  2547. // eps: {}, //属性
  2548. // });
  2549. // }
  2550. // }
  2551. // }
  2552. // }
  2553. // /**
  2554. // * 辅助函数 - 技能效果
  2555. // * @param iid 触发者
  2556. // * @param skid 技能ID
  2557. // * @param effectId 效果ID
  2558. // * @param extend 继承目标key
  2559. // */
  2560. // private sk_effect(iid: string, skid: string, effectId: string, extend: string = "", cs: { [key: string]: number } = {}) {
  2561. // if (gameMethod.isEmpty(this.teams[iid].isHide) == false) {
  2562. // return; //隐藏
  2563. // }
  2564. // let cfgBase = Gamecfg.skillBase.getItem(skid, "1");
  2565. // let cfgEf = Gamecfg.skillEffect.getItem(effectId);
  2566. // if (cfgEf == null || cfgBase == null) {
  2567. // return;
  2568. // }
  2569. // //次数判定
  2570. // if (
  2571. // gameMethod.isEmpty(cfgEf.count) == false &&
  2572. // this.uuids[iid].skbase[skid] &&
  2573. // this.uuids[iid].skbase[skid].effect[effectId] &&
  2574. // this.uuids[iid].skbase[skid].effect[effectId].count >= cfgEf.count
  2575. // ) {
  2576. // return; //没有次数了
  2577. // }
  2578. // if (this.oneFiids[iid] == null) {
  2579. // this.oneFiids[iid] = {};
  2580. // }
  2581. // let ef_ttype = "effect_id_" + effectId;
  2582. // //继承上一次的目标
  2583. // if (extend != "") {
  2584. // //这里可以先继承
  2585. // this.oneFiids[iid][ef_ttype] = this.oneFiids[iid][extend];
  2586. // }
  2587. // //持续多少针
  2588. // let maxzhen: number = gameMethod.isEmpty(cfgEf.args["t"]) == false ? cfgEf.args["t"] * 30 : 45 * 30;
  2589. // //m增加层数
  2590. // let e_m: number = gameMethod.isEmpty(cfgEf.args["m"]) == false ? cfgEf.args["m"] : 1;
  2591. // //n表示层数上限
  2592. // let e_n: number = gameMethod.isEmpty(cfgEf.args["n"]) == false ? cfgEf.args["n"] : 9999;
  2593. // //1.叠加 2.不叠加替换,默认不填值就是不叠加
  2594. // let overlayType: number = gameMethod.isEmpty(cfgEf.overlayType) ? 2 : cfgEf.overlayType;
  2595. // //效果标识
  2596. // let e_i: number = gameMethod.isEmpty(cfgEf.args["i"]) == false ? cfgEf.args["i"] : 0;
  2597. // //效果标识
  2598. // let interval: number = gameMethod.isEmpty(cfgEf.interval) == false ? cfgEf.interval * 30 : 0; //效果标识
  2599. // if (this.uuids[iid].skbase[skid] == null) {
  2600. // this.uuids[iid].skbase[skid] = {
  2601. // last: 0, //最后一次出手帧
  2602. // count: 0,
  2603. // action: {},
  2604. // effect: {},
  2605. // };
  2606. // }
  2607. // if (this.uuids[iid].skbase[skid].effect[effectId] == null) {
  2608. // this.uuids[iid].skbase[skid].effect[effectId] = {
  2609. // effectZhen: 0, //触发帧
  2610. // effectEndZhen: 0, //触发结束帧
  2611. // nextcd: 0, //下一次出手时间
  2612. // count: 0,
  2613. // f: 0,
  2614. // };
  2615. // }
  2616. // //效果cd
  2617. // if (
  2618. // this.uuids[iid].skbase[skid].effect[effectId].nextcd > this.zhen &&
  2619. // (this.zhen != this.uuids[iid].skbase[skid].effect[effectId].effectZhen || (cfgEf.targetType.length == 1 && cfgEf.targetType[0] == 1)) &&
  2620. // !(this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen >= this.zhen && cs["isTimer"] == 1)
  2621. // ) {
  2622. // return;
  2623. // }
  2624. // //cs["isTimer"] = 0; // 定时器来的 不参与cd效果判定
  2625. // let ef_buff = "effect_i_" + e_i; //效果i标识
  2626. // if (gameMethod.isEmpty(cfgEf.ttype) == false && cs["isTimer"] != 1) {
  2627. // let targetType: number = 0; //目标数量
  2628. // //目标数量
  2629. // if (gameMethod.isEmpty(cfgEf.targetType) == true) {
  2630. // targetType = 10;
  2631. // } else if (gameMethod.isEmpty(cfgEf.targetType[1]) == true) {
  2632. // targetType = cfgEf.targetType[0];
  2633. // } else {
  2634. // targetType = this.seedRand.rand(cfgEf.targetType[1], cfgEf.targetType[0]);
  2635. // }
  2636. // this.find_fiids(ef_ttype, iid, cfgEf.ttype, targetType);
  2637. // }
  2638. // //buff效果
  2639. // if (this.oneFiids[iid] && this.oneFiids[iid][ef_ttype]) {
  2640. // for (let i = 0; i < this.oneFiids[iid][ef_ttype].length; i++) {
  2641. // let eff_i_m = this.skbuff_get(this.oneFiids[iid][ef_ttype][i], ef_buff, 2);
  2642. // if (eff_i_m >= e_n) {
  2643. // continue; //超过层数
  2644. // }
  2645. // e_m = Math.min(e_m, e_n - eff_i_m);
  2646. // }
  2647. // }
  2648. // //添加定时执行 - 之后在触发效果
  2649. // if (gameMethod.isEmpty(cfgEf.triggerTime) == false && this.uuids[iid].timer[ef_ttype] == null) {
  2650. // this.timer_add({
  2651. // iid: iid, //触发者
  2652. // fiids: this.oneFiids[iid][ef_ttype], //触发者
  2653. // key: ef_ttype, //定时器标识
  2654. // type: cfgEf.triggerTime ? cfgEf.triggerTime : [601], //执行触发点
  2655. // func: "sk_effect", //执行的函数名
  2656. // lzhen: interval, //轮询执行时间
  2657. // ezhen: 45 * 30,
  2658. // skid: skid, //技能ID
  2659. // aeid: effectId, //效果ID|行为ID
  2660. // cs: cs, //参数
  2661. // overlayType: overlayType,
  2662. // });
  2663. // if (cfgEf.triggerTime[0] == 301) {
  2664. // for (let i = 0; i < this.oneFiids[iid][ef_ttype].length; i++) {
  2665. // this.timer_do(301, { do_iid: Number(this.oneFiids[iid][ef_ttype][i]) });
  2666. // }
  2667. // if (gameMethod.isEmpty(cfgEf.count) == false && this.zhen != 1) {
  2668. // this.uuids[iid].skbase[skid].effect[effectId].count += 1;
  2669. // if (this.uuids[iid].skbase[skid].effect[effectId].count >= cfgEf.count) {
  2670. // if (gameMethod.isEmpty(cfgEf.cd) == false) {
  2671. // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen;
  2672. // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
  2673. // this.uuids[iid].skbase[skid].effect[effectId].count = 0;
  2674. // this.uuids[iid].timer[ef_ttype][cs["timerId"].toString()].szhen = this.zhen + cfgEf.cd * 30;
  2675. // } else {
  2676. // }
  2677. // }
  2678. // }
  2679. // if (gameMethod.isEmpty(cfgEf.cd) == false && this.zhen != 1) {
  2680. // if (this.uuids[iid].skbase[skid].effect[effectId].count == 0) {
  2681. // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen;
  2682. // if (cfgEf.args["t"]) {
  2683. // if (this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen < this.zhen) {
  2684. // this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen = this.zhen + cfgEf.args["t"] * 30; // buff持续增加效果结束帧
  2685. // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
  2686. // }
  2687. // } else {
  2688. // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
  2689. // }
  2690. // }
  2691. // }
  2692. // }
  2693. // return; //cd后再触发
  2694. // }
  2695. // //1.附加属性(万分比)
  2696. // if (cfgEf.type == 1) {
  2697. // for (let i = 0; i < this.oneFiids[iid][ef_ttype].length; i++) {
  2698. // let fiid = this.oneFiids[iid][ef_ttype][i];
  2699. // let cf508: number = 0;
  2700. // let eff_1_ep: { [key: string]: number } = {};
  2701. // let keys = Object.keys(cfgEf.args);
  2702. // for (let k = 0; k < keys.length; k++) {
  2703. // // 加属性 这边in没关系
  2704. // if (this.teams[fiid].eps[keys[k]] == null) {
  2705. // continue;
  2706. // }
  2707. // if (this.teams[fiid].eps[keys[k]] != null) {
  2708. // eff_1_ep[keys[k]] = cfgEf.args[keys[k]];
  2709. // if (cfgEf.args[keys[k]] < 0) {
  2710. // cf508 = 1;
  2711. // break;
  2712. // }
  2713. // }
  2714. // if (cf508 != 0) {
  2715. // break;
  2716. // }
  2717. // }
  2718. // if (overlayType === 2 || this.skbuff_get(fiid, ef_buff + "_" + effectId, 2) + e_m <= e_n) {
  2719. // this.skbuff_add({
  2720. // fiid: fiid, //添加对象
  2721. // key: ef_buff + "_" + effectId, //属性key
  2722. // minZhen: this.zhen, //开始帧
  2723. // maxZhen: this.zhen + maxzhen, //结束帧
  2724. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  2725. // ceng: e_m, //增加层数
  2726. // eps: eff_1_ep, //属性
  2727. // });
  2728. // }
  2729. // this.teams[fiid].eps.hp = this.skbuff_get(fiid, "hp");
  2730. // // this.teams[fiid].eps.hp_max = this.skbuff_get(fiid, "hp_max");
  2731. // if (cf508 == 1) {
  2732. // this.timer_do(508, { do_iid: Number(fiid) });
  2733. // }
  2734. // }
  2735. // //cd
  2736. // if (this.oneFiids[iid][ef_ttype].length > 0) {
  2737. // if (gameMethod.isEmpty(cfgEf.count) == false && this.zhen != 1) {
  2738. // this.uuids[iid].skbase[skid].effect[effectId].count += 1;
  2739. // if (this.uuids[iid].skbase[skid].effect[effectId].count >= cfgEf.count) {
  2740. // if (gameMethod.isEmpty(cfgEf.cd) == false) {
  2741. // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen;
  2742. // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
  2743. // this.uuids[iid].skbase[skid].effect[effectId].count = 0;
  2744. // this.uuids[iid].timer[ef_ttype][cs["timerId"].toString()].szhen = this.zhen + cfgEf.cd * 30;
  2745. // } else {
  2746. // }
  2747. // }
  2748. // }
  2749. // if (gameMethod.isEmpty(cfgEf.cd) == false && this.zhen != 1) {
  2750. // if (this.uuids[iid].skbase[skid].effect[effectId].count == 0) {
  2751. // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen;
  2752. // if (cfgEf.args["t"]) {
  2753. // if (this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen < this.zhen) {
  2754. // this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen = this.zhen + cfgEf.args["t"] * 30; // buff持续增加效果结束帧
  2755. // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
  2756. // }
  2757. // } else {
  2758. // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
  2759. // }
  2760. // }
  2761. // }
  2762. // }
  2763. // }
  2764. // //2.附加状态
  2765. // if (cfgEf.type == 2) {
  2766. // this.sk_effect_type_2(skid, effectId, iid, this.oneFiids[iid][ef_ttype], cs);
  2767. // }
  2768. // }
  2769. // /**
  2770. // * 触发效果
  2771. // * @param effectId 效果ID
  2772. // * @param iid 触发者
  2773. // * @param fiids 触发对象
  2774. // * @returns
  2775. // */
  2776. // private sk_effect_type_2(skid: string, effectId: string, iid: string, fiids: string[], cs: { [key: string]: number } = {}) {
  2777. // let cfgBase = Gamecfg.skillBase.getItem(skid, "1");
  2778. // let cfgEf = Gamecfg.skillEffect.getItem(effectId);
  2779. // if (cfgEf == null || cfgEf.args["i"] == null || cfgBase == null) {
  2780. // return;
  2781. // }
  2782. // //持续多少针
  2783. // let maxzhen: number = cfgEf.args["t"] != null ? cfgEf.args["t"] * 30 : 45 * 30;
  2784. // //a填小数:每秒持续收到最终伤害的百分比
  2785. // let e_a: number = gameMethod.isEmpty(cfgEf.args["a"]) == false ? cfgEf.args["a"] * 10000 : 0;
  2786. // //m增加层数
  2787. // let e_m: number = gameMethod.isEmpty(cfgEf.args["m"]) == false ? cfgEf.args["m"] : 1;
  2788. // //n表示层数上限
  2789. // let e_n: number = gameMethod.isEmpty(cfgEf.args["n"]) == false ? cfgEf.args["n"] : 9999;
  2790. // //id引发下一个effect_ID
  2791. // let e_id: string = gameMethod.isEmpty(cfgEf.args["id"]) == false ? cfgEf.args["id"].toString() : "";
  2792. // //1.叠加 2.不叠加替换,默认不填值就是不叠加
  2793. // let overlayType: number = gameMethod.isEmpty(cfgEf.overlayType) ? 2 : cfgEf.overlayType;
  2794. // //效果标识
  2795. // let e_i: number = gameMethod.isEmpty(cfgEf.args["i"]) == false ? cfgEf.args["i"] : 0;
  2796. // let ef_ttype = "effect_id_" + effectId; //效果ID标识
  2797. // let ef_buff = "effect_i_" + e_i; //效果i标识
  2798. // let lsOne: number = 0; //临时自己只操作一次的
  2799. // let pass: boolean = true;
  2800. // for (let i = 0; i < fiids.length; i++) {
  2801. // let fiid = fiids[i];
  2802. // let eff_i_m = this.skbuff_get(fiid, ef_buff, 2);
  2803. // if (eff_i_m >= e_n) {
  2804. // continue; //超过层数
  2805. // }
  2806. // e_m = Math.min(e_m, e_n - eff_i_m);
  2807. // switch (cfgEf.args["i"]) {
  2808. // case 1: //沉默 无法释放技能(可以放普攻),不可叠加,持续4秒
  2809. // this.skbuff_add({
  2810. // fiid: fiid, //添加对象
  2811. // key: ef_buff, //属性key
  2812. // minZhen: this.zhen, //开始帧
  2813. // maxZhen: this.zhen + maxzhen, //结束帧
  2814. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  2815. // ceng: e_m, //增加层数
  2816. // eps: {}, //属性
  2817. // });
  2818. // this.timer_do(508, { do_iid: Number(fiid) });
  2819. // break;
  2820. // case 2: //2 回血 按最终伤害值百分比进行回血
  2821. // if (cs["do_iid"] != Number(iid)) {
  2822. // continue;
  2823. // }
  2824. // if (cs["hit"] == null) {
  2825. // if (cfgEf.args["a"] != null) {
  2826. // if (!this.oneHit[iid]) {
  2827. // let hit_fiid = this.uuids[iid].ipk;
  2828. // this.js_hits(iid, hit_fiid, cfgEf.args["a"] * 10000, skid); //计算伤害
  2829. // let gzhit = this.oneHit[iid][hit_fiid];
  2830. // cs["hit"] = gzhit.skhit;
  2831. // } else {
  2832. // let keys = Object.keys(this.oneHit[iid]);
  2833. // for (let k = 0; k < keys.length; k++) {
  2834. // cs["hit"] = this.oneHit[iid][keys[k]].ljhit;
  2835. // }
  2836. // }
  2837. // }
  2838. // if (cs["hit"] == null) {
  2839. // continue;
  2840. // }
  2841. // }
  2842. // if (cs["next_cx"] != null && cs["next_cx"] < this.zhen && cs["isTimer"] == 1) {
  2843. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  2844. // this.addOneAtk(iid, fiid, "effect", ["hp", Math.floor((cs["hit"] * e_a) / 10000)]);
  2845. // } else {
  2846. // if (cfgEf.args["if"] == 1) {
  2847. // // 有if=1的直接回血一次
  2848. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  2849. // this.addOneAtk(iid, fiid, "effect", ["hp", Math.floor((cs["hit"] * e_a) / 10000)]);
  2850. // } else {
  2851. // // pass = false; // 加定时器回血 不加cd
  2852. // cs["next_cx"] = this.zhen;
  2853. // cs["do_iid"] = Number(fiid);
  2854. // this.timer_add({
  2855. // iid: iid, //触发者
  2856. // fiids: [fiid], //触发对象
  2857. // key: ef_ttype + "_" + e_i, //定时器标识
  2858. // type: [601], //执行触发点
  2859. // func: "sk_effect", //执行的函数名
  2860. // lzhen: 30, //轮询执行时间
  2861. // ezhen: this.zhen + maxzhen,
  2862. // skid: skid, //技能ID
  2863. // aeid: effectId, //效果ID|行为ID
  2864. // cs: cs, //参数
  2865. // overlayType: overlayType,
  2866. // });
  2867. // this.skbuff_add({
  2868. // fiid: fiid, //添加对象
  2869. // key: ef_buff, //属性key
  2870. // minZhen: this.zhen, //开始帧
  2871. // maxZhen: this.zhen + maxzhen, //结束帧
  2872. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  2873. // ceng: 1, //增加层数
  2874. // eps: { e_a: e_a }, //属性
  2875. // });
  2876. // }
  2877. // //delete cs["next_cx"]
  2878. // }
  2879. // break;
  2880. // case 3: //晕眩 无法移动、攻击和释放技能,不可叠加,持续3秒
  2881. // this.skbuff_add({
  2882. // fiid: fiid, //添加对象
  2883. // key: ef_buff, //属性key
  2884. // minZhen: this.zhen, //开始帧
  2885. // maxZhen: this.zhen + maxzhen, //结束帧
  2886. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  2887. // ceng: e_m, //增加层数
  2888. // eps: {}, //属性
  2889. // });
  2890. // this.timer_do(508, { do_iid: Number(fiid) });
  2891. // break;
  2892. // case 4: //火焰 每秒受到30%持续伤害,最高叠加10层,持续5秒
  2893. // if (cfgEf.args["p"] && this.seedRand.rand(1, 10000) > cfgEf.args["p"] * 10000) {
  2894. // continue;
  2895. // }
  2896. // if (cs["nextid"] == null || cs["i_59"] == null) {
  2897. // let hit = cs[fiid] ? cs[fiid] : cs["hit"];
  2898. // let csCpoy = gameMethod.objCopy(cs);
  2899. // csCpoy["nextid"] = 1;
  2900. // csCpoy["i_59"] = 0;
  2901. // for (let index = 0; index < e_m; index++) {
  2902. // this.timer_add({
  2903. // iid: iid, //触发者
  2904. // fiids: [fiid], //触发对象
  2905. // key: ef_ttype, //定时器标识
  2906. // type: [601], //执行触发点
  2907. // func: "sk_effect", //执行的函数名
  2908. // lzhen: 30, //轮询执行时间
  2909. // ezhen: this.zhen + maxzhen,
  2910. // skid: skid, //技能ID
  2911. // aeid: effectId, //效果ID|行为ID
  2912. // cs: csCpoy, //参数
  2913. // overlayType: overlayType,
  2914. // });
  2915. // this.skbuff_add({
  2916. // //添加buff 用于展示
  2917. // fiid: fiid, //添加对象
  2918. // key: ef_buff, //属性key
  2919. // minZhen: this.zhen, //开始帧
  2920. // maxZhen: this.zhen + maxzhen, //结束帧
  2921. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  2922. // ceng: 1, //增加层数
  2923. // eps: {
  2924. // i_59_hit: hit,
  2925. // }, //属性
  2926. // });
  2927. // this.timer_do(505, { do_iid: Number(fiid) });
  2928. // this.timer_do(508, { do_iid: Number(fiid) });
  2929. // }
  2930. // } else {
  2931. // if (cs["do_iid"].toString() != iid) {
  2932. // continue;
  2933. // }
  2934. // cs["i_59"] = this.skbuff_get(fiid, "i_59");
  2935. // cs["hit"] = this.skbuff_get(fiid, "i_59_hit");
  2936. // if (!cs["hit"]) {
  2937. // if (cfgEf.args["a"] != null) {
  2938. // this.js_hits(iid, fiid, 10000, skid); //计算伤害
  2939. // let gzhit = this.oneHit[iid][fiid];
  2940. // cs["hit"] = gzhit.skhit;
  2941. // }
  2942. // if (cs["hit"] == null) {
  2943. // continue;
  2944. // }
  2945. // }
  2946. // let hit = Math.floor(cs["hit"] * (e_a / 10000 + cs["i_59"]));
  2947. // this.addOneAtk(fiid, fiid, "aType", Xys.ActionType.effect);
  2948. // this.addOneAtk(fiid, fiid, "effect", ["hp", -1 * hit]);
  2949. // }
  2950. // break;
  2951. // case 5: //冰冻 无法移动、不能普攻攻击和释放技能,无法叠加,持续4秒。作用期间无法被施加寒意
  2952. // this.skbuff_add({
  2953. // fiid: fiid, //添加对象
  2954. // key: ef_buff, //属性key
  2955. // minZhen: this.zhen, //开始帧
  2956. // maxZhen: this.zhen + maxzhen, //结束帧
  2957. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  2958. // ceng: e_m, //增加层数
  2959. // eps: {}, //属性
  2960. // });
  2961. // this.timer_do(507, { do_iid: Number(fiid) });
  2962. // this.timer_do(508, { do_iid: Number(fiid) });
  2963. // break;
  2964. // case 6: //击退 无法移动、不能普攻攻击、不能被攻击和释放技能,持续0.5秒
  2965. // this.skbuff_add({
  2966. // fiid: fiid, //添加对象
  2967. // key: ef_buff, //属性key
  2968. // minZhen: this.zhen, //开始帧
  2969. // maxZhen: this.zhen + maxzhen, //结束帧
  2970. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  2971. // ceng: e_m, //增加层数
  2972. // eps: {}, //属性
  2973. // });
  2974. // this.timer_do(508, { do_iid: Number(fiid) });
  2975. // if (lsOne == 0) {
  2976. // lsOne = 1;
  2977. // this.timer_do(206, { do_iid: Number(iid) });
  2978. // }
  2979. // break;
  2980. // case 7: //寒意 攻击降低5%,持续10秒,叠加至5层时转化为冰冻
  2981. // let eff_i_5 = this.skbuff_get(fiid, "effect_i_5", 2);
  2982. // if (eff_i_5 == 0) {
  2983. // let eff_i_ep: { [key: string]: number } = Object.assign(cfgEf.args);
  2984. // this.skbuff_add({
  2985. // fiid: fiid, //添加对象
  2986. // key: ef_buff, //属性key
  2987. // minZhen: this.zhen, //开始帧
  2988. // maxZhen: this.zhen + maxzhen, //结束帧
  2989. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  2990. // ceng: e_m, //增加层数
  2991. // eps: eff_i_ep, //属性
  2992. // });
  2993. // this.timer_do(506, { do_iid: Number(iid) });
  2994. // }
  2995. // let eff_i_7 = this.skbuff_get(fiid, ef_buff, 2);
  2996. // if (eff_i_7 >= 5) {
  2997. // this.skbuff_sub_all(fiid, ef_buff);
  2998. // cs["nextid"] = 1;
  2999. // this.sk_effect(iid, skid, e_id, ef_ttype, cs);
  3000. // }
  3001. // break;
  3002. // case 8: //真意 技能伤害增加3%,最高叠加10层,持续10秒
  3003. // this.skbuff_add({
  3004. // fiid: fiid, //添加对象
  3005. // key: ef_buff, //属性key
  3006. // minZhen: this.zhen, //开始帧
  3007. // maxZhen: this.zhen + maxzhen, //结束帧
  3008. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3009. // ceng: e_m, //增加层数
  3010. // eps: { sk_a: e_a }, //属性
  3011. // });
  3012. // this.timer_do(504, { do_iid: Number(iid) });
  3013. // break;
  3014. // case 9: //护体罡气 受到伤害时,优先抵消护体罡气(表现上需要加护盾特效)
  3015. // let value9 = Math.floor((this.teams[fiid].eps["hp_max"] * cfgEf.args["hp_max"]) / 10000);
  3016. // this.skbuff_add({
  3017. // fiid: fiid, //添加对象
  3018. // key: ef_buff, //属性key
  3019. // minZhen: this.zhen, //开始帧
  3020. // maxZhen: this.zhen + maxzhen, //结束帧
  3021. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3022. // ceng: e_m, //增加层数
  3023. // eps: {
  3024. // i_9: value9,
  3025. // i_9_id: cfgEf.args["id"] ? cfgEf.args["id"] : 0,
  3026. // i_9_skin: Number(skid),
  3027. // }, //属性
  3028. // });
  3029. // this.timer_do(501, { do_iid: Number(iid) });
  3030. // break;
  3031. // case 10: //异常状态 包括:属性降低、流血、冰冻、击飞、沉默,眩晕
  3032. // this.skbuff_add({
  3033. // fiid: fiid, //添加对象
  3034. // key: ef_buff, //属性key
  3035. // minZhen: this.zhen, //开始帧
  3036. // maxZhen: this.zhen + maxzhen, //结束帧
  3037. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3038. // ceng: e_m, //增加层数
  3039. // eps: {}, //属性
  3040. // });
  3041. // this.timer_do(508, { do_iid: Number(fiid) });
  3042. // break;
  3043. // case 12: //异常免疫 免疫属性降低、流血、冰冻、击飞、沉默,眩晕
  3044. // if (maxzhen > 0) {
  3045. // this.skbuff_add({
  3046. // fiid: fiid, //添加对象
  3047. // key: ef_buff, //属性key
  3048. // minZhen: this.zhen, //开始帧
  3049. // maxZhen: this.zhen + maxzhen, //结束帧
  3050. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3051. // ceng: e_m, //增加层数
  3052. // eps: {}, //属性
  3053. // });
  3054. // }
  3055. // if (this.uuids[fiid] == null) {
  3056. // continue;
  3057. // }
  3058. // if (gameMethod.isEmpty(this.uuids[fiid].skbuff) == true) {
  3059. // continue;
  3060. // }
  3061. // // let keys2 = Object.keys(this.uuids[fiid].skbuff)
  3062. // let keys2 = this.changeSkBuff(1, fiid, null, 1);
  3063. // for (let k = 0; k < keys2.length; k++) {
  3064. // let key = keys2[k];
  3065. // if (gameMethod.isEmpty(this.uuids[fiid].skbuff[key])) {
  3066. // continue;
  3067. // }
  3068. // if (["effect_i_10", "effect_i_1", "effect_i_3", "effect_i_4", "effect_i_5", "effect_i_6"].includes(key)) {
  3069. // delete this.uuids[fiid].skbuff[key];
  3070. // this.oneBuff[fiid] = 1;
  3071. // continue;
  3072. // }
  3073. // //let copy10 = gameMethod.objCopy(this.uuids[fiid].skbuff[key]);
  3074. // this.uuids[fiid].skbuff[key] = [];
  3075. // let values = this.changeSkBuff(1, fiid, key, 2);
  3076. // for (let j = 0; j < values.length; j++) {
  3077. // let pass = false;
  3078. // let keys3 = Object.keys(values[j].eps);
  3079. // for (let l = 0; l < keys3.length; l++) {
  3080. // if (this.teams[iid].eps[keys3[l]] == null) {
  3081. // continue;
  3082. // }
  3083. // if (values[j].eps[keys3[l]] < 0) {
  3084. // pass = true;
  3085. // this.oneBuff[fiid] = 1;
  3086. // break;
  3087. // }
  3088. // }
  3089. // if (pass == false) {
  3090. // this.uuids[fiid].skbuff[key].push(values[j]);
  3091. // }
  3092. // }
  3093. // }
  3094. // // 更新缓存
  3095. // this.changeSkBuff(2, fiid, null, 1, this.uuids[fiid].skbuff);
  3096. // break;
  3097. // case 13: //最终伤害降低xx%
  3098. // this.skbuff_add({
  3099. // fiid: fiid, //添加对象
  3100. // key: ef_buff, //属性key
  3101. // minZhen: this.zhen, //开始帧
  3102. // maxZhen: this.zhen + maxzhen, //结束帧
  3103. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3104. // ceng: e_m, //增加层数
  3105. // eps: {
  3106. // i_13: e_a,
  3107. // i_13_cd: 0, // 持续性的 不加cd
  3108. // i_13_nZhen: this.zhen,
  3109. // }, //属性
  3110. // });
  3111. // break;
  3112. // case 14: //当前生命首次低于x%, xx属性增加x%
  3113. // let f_hp14 = this.skbuff_get(fiid, "hp");
  3114. // let f_hp_max14 = this.skbuff_get(fiid, "hp_max");
  3115. // if ((f_hp14 * 10000) / f_hp_max14 < Math.abs(cfgEf.args["hp"])) {
  3116. // let eff_i_ep: { [key: string]: number } = {};
  3117. // let keys = Object.keys(cfgEf.args);
  3118. // for (let k = 0; k < keys.length; k++) {
  3119. // if (keys[k] == "hp") {
  3120. // continue;
  3121. // }
  3122. // if (this.teams[fiid].eps[keys[k]] == null) {
  3123. // continue;
  3124. // }
  3125. // eff_i_ep[keys[k]] = cfgEf.args[keys[k]];
  3126. // }
  3127. // this.skbuff_add({
  3128. // fiid: fiid, //添加对象
  3129. // key: ef_buff, //属性key
  3130. // minZhen: this.zhen, //开始帧
  3131. // maxZhen: this.zhen + maxzhen, //结束帧
  3132. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3133. // ceng: e_m, //增加层数
  3134. // eps: eff_i_ep, //属性
  3135. // });
  3136. // this.timer_sub(iid, ef_ttype);
  3137. // }
  3138. // break;
  3139. // case 15: //触发暴击后,给自身加效果
  3140. // cs["nextid"] = 1;
  3141. // let id1 = cfgEf.args["id1"];
  3142. // if (id1 > 0) {
  3143. // this.sk_effect(iid, skid, id1, ef_ttype, cs);
  3144. // }
  3145. // this.sk_effect(iid, skid, e_id, ef_ttype, cs);
  3146. // break;
  3147. // case 16: //自身首次生命低于15%时进入入定状态,之后每秒恢复自身攻击200%的气血,期间自身无法行动。自身气血恢复至60%时解除入定状态,并对周围敌人造成200%技能伤害
  3148. // if (cs["do_iid"].toString() != iid) {
  3149. // continue;
  3150. // }
  3151. // let f_hp16 = this.skbuff_get(fiid, "hp");
  3152. // let f_hp_max16 = this.skbuff_get(fiid, "hp_max");
  3153. // if ((f_hp16 * 10000) / f_hp_max16 < Math.abs(cfgEf.args["hp"])) {
  3154. // if (cs["nextid"] != 1) {
  3155. // this.skbuff_add({
  3156. // fiid: fiid, //添加对象
  3157. // key: ef_buff, //属性key
  3158. // minZhen: this.zhen, //开始帧
  3159. // maxZhen: this.zhen + maxzhen, //结束帧
  3160. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3161. // ceng: e_m, //增加层数
  3162. // eps: {}, //属性
  3163. // });
  3164. // cs["nextid"] = 1;
  3165. // this.timer_add({
  3166. // iid: iid, //触发者
  3167. // fiids: fiids, //触发对象
  3168. // key: ef_ttype, //定时器标识
  3169. // type: [601], //执行触发点
  3170. // func: "sk_effect", //执行的函数名
  3171. // lzhen: 30, //轮询执行时间
  3172. // ezhen: this.zhen + maxzhen,
  3173. // skid: skid, //技能ID
  3174. // aeid: effectId, //效果ID|行为ID
  3175. // cs: cs, //参数
  3176. // overlayType: overlayType,
  3177. // });
  3178. // }
  3179. // }
  3180. // if (cs["nextid"] == 1) {
  3181. // let f_atk: number = this.skbuff_get(iid, "atk");
  3182. // let addHp16: number = Math.floor((f_atk * cfgEf.args["atk_per"]) / 10000);
  3183. // let addHpMax16: number = Math.floor((f_hp_max16 * Math.abs(cfgEf.args["hp2"])) / 10000);
  3184. // addHp16 = Math.min(addHp16, addHpMax16 - f_hp16);
  3185. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3186. // this.addOneAtk(iid, iid, "effect", ["hp", addHp16]);
  3187. // f_hp16 = this.skbuff_get(fiid, "hp");
  3188. // if ((f_hp16 * 10000) / f_hp_max16 >= Math.abs(cfgEf.args["hp2"])) {
  3189. // this.skbuff_sub(fiid, ef_buff);
  3190. // this.timer_sub(iid, ef_ttype);
  3191. // cs["nextid"] = 1;
  3192. // this.sk_effect(fiid, skid, cfgEf.args["id"], ef_ttype, cs);
  3193. // }
  3194. // }
  3195. // break;
  3196. // case 17: //记录自身处于某种状态buff,被攻击有概率给自身加效果
  3197. // let eff_i_buff: number = 0;
  3198. // if (cfgEf.args["buff"] != 10) {
  3199. // // 10需要判断各种异常状态
  3200. // eff_i_buff = this.skbuff_get(iid, "effect_i_" + cfgEf.args["buff"], 2);
  3201. // } else {
  3202. // let list: string[] = ["effect_i_1", "effect_i_3", "effect_i_6", "effect_i_4", "effect_i_5"];
  3203. // for (let k = 0; k < list.length; k++) {
  3204. // eff_i_buff += this.skbuff_get(fiid, list[k], 2);
  3205. // }
  3206. // }
  3207. // if (eff_i_buff > 0) {
  3208. // if (this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
  3209. // cs["nextid"] = 1;
  3210. // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
  3211. // }
  3212. // } else {
  3213. // pass = false; // 没触发 不要进入冷却时间
  3214. // continue;
  3215. // }
  3216. // break;
  3217. // case 18: //每3次攻击消耗一层真意,之后额外造成目标当前气血3%的伤害(最多造成自身攻击500%的伤害)
  3218. // //备注:这里的攻击包括普攻和技能和连击,不包括反击,被动技能是不计算次数的
  3219. // if (cs["do_iid"].toString() != iid) {
  3220. // continue;
  3221. // }
  3222. // let bdcons18 = this.uuids[fiid].cons[0] + this.uuids[fiid].cons[1];
  3223. // if (bdcons18 >= cfgEf.args["count"] && bdcons18 % cfgEf.args["count"] == 0) {
  3224. // this.skbuff_sub(iid, "effect_i_" + cfgEf.args["buff"]);
  3225. // cs["nextid"] = 1;
  3226. // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
  3227. // }
  3228. // break;
  3229. // case 19: //普攻施加快剑印记,持续7秒,最多叠加10层。目标每层快剑印记,使自身攻击附加30%额外伤害。若7秒内目标未受到自身伤害,则快剑印记全部消失
  3230. // let cfgEf19 = Gamecfg.skillEffect.getItem(cfgEf.args["id"]);
  3231. // if (cfgEf19 != null) {
  3232. // this.skbuff_add({
  3233. // fiid: fiid, //添加对象
  3234. // key: ef_buff, //属性key
  3235. // minZhen: this.zhen, //开始帧
  3236. // maxZhen: this.zhen + maxzhen, //结束帧
  3237. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3238. // ceng: 1, //增加层数
  3239. // eps: {
  3240. // //属性
  3241. // i_19_a: cfgEf.args["a"] * 10000,
  3242. // i_19_i: cfgEf19.args["i"],
  3243. // },
  3244. // });
  3245. // let ceng19 = this.skbuff_get(fiid, "effect_i_" + cfgEf19.args["i"], 2);
  3246. // let cfgEf19_m = Math.min(cfgEf19.args["m"], cfgEf19.args["n"] - ceng19);
  3247. // if (cfgEf19_m > 0) {
  3248. // cs["nextid"] = 1;
  3249. // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
  3250. // }
  3251. // //let keys = Object.keys(this.uuids[fiid].skbuff["effect_i_" + cfgEf19.args["i"]]);
  3252. // let keys = this.changeSkBuff(1, fiid, "effect_i_" + cfgEf19.args["i"], 1);
  3253. // for (let k = 0; k < keys.length; k++) {
  3254. // this.uuids[fiid].skbuff["effect_i_" + cfgEf19.args["i"]][Number(keys[k])].szhen = this.zhen;
  3255. // this.uuids[fiid].skbuff["effect_i_" + cfgEf19.args["i"]][Number(keys[k])].ezhen = this.zhen + maxzhen;
  3256. // }
  3257. // this.changeSkBuff(2, fiid, "effect_i_" + cfgEf19.args["i"], 1, this.uuids[fiid].skbuff["effect_i_" + cfgEf19.args["i"]]);
  3258. // }
  3259. // break;
  3260. // case 20: //每x秒清除自身异常状态
  3261. // if (cs["do_iid"].toString() != iid) {
  3262. // continue;
  3263. // }
  3264. // this.skbuff_sub(fiid, "effect_i_" + cfgEf.args["buff"]);
  3265. // if (cfgEf.args["buff"] == 10) {
  3266. // // let keys = Object.keys(this.uuids[fiid].skbuff)
  3267. // let keys = this.changeSkBuff(1, fiid, null, 1);
  3268. // for (let k = 0; k < keys.length; k++) {
  3269. // let key = keys[k];
  3270. // if (gameMethod.isEmpty(this.uuids[fiid].skbuff[key]) == true) {
  3271. // continue;
  3272. // }
  3273. // if (["effect_i_1", "effect_i_3", "effect_i_4", "effect_i_5", "effect_i_6"].includes(key)) {
  3274. // delete this.uuids[fiid].skbuff[key];
  3275. // this.oneBuff[fiid] = 1;
  3276. // continue;
  3277. // }
  3278. // if (!key.includes("effect_i_0")) {
  3279. // continue;
  3280. // }
  3281. // //let copy10 = gameMethod.objCopy(this.uuids[fiid].skbuff[key]);
  3282. // this.uuids[fiid].skbuff[key] = [];
  3283. // //let values = Object.values(copy10);
  3284. // let values = this.changeSkBuff(1, fiid, key, 2);
  3285. // for (let j = 0; j < values.length; j++) {
  3286. // let pass = false;
  3287. // let keys3 = Object.keys(values[j].eps);
  3288. // for (let l = 0; l < keys3.length; l++) {
  3289. // if (this.teams[iid].eps[keys3[l]] == null) {
  3290. // continue;
  3291. // }
  3292. // if (values[j].eps[keys3[l]] < 0) {
  3293. // pass = true;
  3294. // this.oneBuff[fiid] = 1;
  3295. // break;
  3296. // }
  3297. // }
  3298. // if (pass == false) {
  3299. // this.uuids[fiid].skbuff[key].push(values[j]);
  3300. // }
  3301. // }
  3302. // }
  3303. // this.changeSkBuff(2, fiid, null, 1, this.uuids[fiid].skbuff);
  3304. // }
  3305. // break;
  3306. // case 21: //自身持有护体罡气时,执向一个effectID的效果
  3307. // //这边只管触发 外层有脚本在跑
  3308. // cs["nextid"] = 1;
  3309. // this.sk_effect(iid, skid, e_id, ef_ttype, cs);
  3310. // let cfgEf21 = Gamecfg.skillEffect.getItem(e_id);
  3311. // if (cfgEf21 != null) {
  3312. // if (cfgEf21.type == 1) {
  3313. // this.uuids[iid].podun.push("effect_i_0_" + e_id);
  3314. // } else {
  3315. // this.uuids[iid].podun.push("effect_i_" + cfgEf21.args["i"]);
  3316. // }
  3317. // }
  3318. // break;
  3319. // case 22: //血量低于X%时给自身添加buff
  3320. // if (iid.length != fiid.length && this.oneHit[iid]) {
  3321. // // 获取攻击对象
  3322. // let hitiid: string = "";
  3323. // let keys = Object.keys(this.oneHit[iid]);
  3324. // for (let k = 0; k < keys.length; k++) {
  3325. // hitiid = keys[k];
  3326. // let hp_max22 = this.skbuff_get(hitiid, "hp_max");
  3327. // let newHp22 = this.skbuff_get(hitiid, "hp");
  3328. // if (this.uuids[iid].skbase[skid].effect[effectId].f == 0 && (newHp22 * 10000) / hp_max22 <= Math.abs(cfgEf.args["hp"])) {
  3329. // let keys = Object.keys(cfgEf.args);
  3330. // for (let i = 0; i < keys.length; i++) {
  3331. // let key = keys[i];
  3332. // if (!key.includes("id")) {
  3333. // continue;
  3334. // }
  3335. // cs["nextid"] = 1;
  3336. // this.sk_effect(iid, skid, cfgEf.args[key], ef_ttype, cs);
  3337. // }
  3338. // if (cfgEf.args["if"] == 1) {
  3339. // this.uuids[iid].skbase[skid].effect[effectId].f = 1;
  3340. // this.timer_sub(fiid, ef_ttype);
  3341. // }
  3342. // return;
  3343. // }
  3344. // }
  3345. // } else {
  3346. // let hp_max22 = this.skbuff_get(fiid, "hp_max");
  3347. // let newHp22 = this.skbuff_get(fiid, "hp");
  3348. // if (this.uuids[iid].skbase[skid].effect[effectId].f == 0 && (newHp22 * 10000) / hp_max22 <= Math.abs(cfgEf.args["hp"])) {
  3349. // let keys = Object.keys(cfgEf.args);
  3350. // for (let k = 0; k < keys.length; k++) {
  3351. // if (!keys[k].includes("id")) {
  3352. // continue;
  3353. // }
  3354. // cs["nextid"] = 1;
  3355. // this.sk_effect(fiid, skid, cfgEf.args[keys[k]], ef_ttype, cs);
  3356. // }
  3357. // if (cfgEf.args["if"] == 1) {
  3358. // this.uuids[iid].skbase[skid].effect[effectId].f = 1;
  3359. // this.timer_sub(fiid, ef_ttype);
  3360. // }
  3361. // return;
  3362. // } else {
  3363. // pass = false;
  3364. // }
  3365. // }
  3366. // break;
  3367. // case 23: //记录快剑印记状态
  3368. // this.skbuff_add({
  3369. // fiid: fiid, //添加对象
  3370. // key: ef_buff, //属性key
  3371. // minZhen: this.zhen, //开始帧
  3372. // maxZhen: this.zhen + maxzhen, //结束帧
  3373. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3374. // ceng: e_m, //增加层数
  3375. // eps: {}, //属性
  3376. // });
  3377. // break;
  3378. // case 24: //必定暴击
  3379. // this.skbuff_add({
  3380. // fiid: fiid, //添加对象
  3381. // key: ef_buff, //属性key
  3382. // minZhen: this.zhen, //开始帧
  3383. // maxZhen: this.zhen + maxzhen, //结束帧
  3384. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3385. // ceng: e_m, //增加层数
  3386. // eps: {}, //属性
  3387. // });
  3388. // break;
  3389. // case 25: //灵力值获取
  3390. // if (gameMethod.isEmpty(cfgEf.args["lingli"]) == false) {
  3391. // this.add_mp(fiid, cfgEf.args["lingli"], 2);
  3392. // }
  3393. // if (gameMethod.isEmpty(cfgEf.args["lingli2"]) == false) {
  3394. // this.add_mp(fiid, 10000 * cfgEf.args["lingli2"], 2);
  3395. // }
  3396. // break;
  3397. // case 26: //每x次攻击,会使下一次攻击的目标增加buff(备注:攻击包括连击,不包括反击)
  3398. // if (cs["do_iid"].toString() != iid) {
  3399. // continue;
  3400. // }
  3401. // let bdcons26 = this.uuids[fiid].cons[0] + this.uuids[fiid].cons[1];
  3402. // cs["limit"] = cs["limit"] == null ? cfgEf.args["count"] : cs["limit"];
  3403. // let yu26 = 1;
  3404. // if (cfgEf.args["if"] == 1) {
  3405. // yu26 = 0;
  3406. // }
  3407. // if (bdcons26 >= cs["limit"] && bdcons26 % cfgEf.args["count"] == yu26) {
  3408. // cs["limit"] += 1; //下一次才能在触发
  3409. // let keys = Object.keys(cfgEf.args);
  3410. // for (let k = 0; k < keys.length; k++) {
  3411. // if (!keys[k].includes("id")) {
  3412. // continue;
  3413. // }
  3414. // cs["nextid"] = 1;
  3415. // this.sk_effect(fiid, skid, cfgEf.args[keys[k]], ef_ttype, cs);
  3416. // this.uuids[iid].timer[ef_ttype][cs["timerId"].toString()].cs = cs;
  3417. // }
  3418. // } else {
  3419. // continue;
  3420. // }
  3421. // break;
  3422. // case 27: //记录目标某种状态,然后施加一个buff效果
  3423. // if (!this.oneFiids[iid][ef_ttype]) {
  3424. // continue;
  3425. // }
  3426. // if (this.oneFiids[iid][ef_ttype][0] === fiid) {
  3427. // let eff_i_buff27 = 0;
  3428. // if (cfgEf.args["if"] == 1) {
  3429. // if (!this.oneHit[iid]) {
  3430. // continue;
  3431. // }
  3432. // // 有配置的效果是加自身的 iid和fiid是一样的 要找攻击的目标
  3433. // let keys = Object.keys(this.oneHit[iid]);
  3434. // for (let k = 0; k < keys.length; k++) {
  3435. // if (cfgEf.args["buff"] != 10) {
  3436. // // 10需要判断各种异常状态
  3437. // eff_i_buff27 = this.skbuff_get(keys[k], "effect_i_" + cfgEf.args["buff"], 2);
  3438. // } else {
  3439. // let list: string[] = ["effect_i_1", "effect_i_3", "effect_i_6", "effect_i_4", "effect_i_5"];
  3440. // for (let j = 0; j < list.length; j++) {
  3441. // eff_i_buff27 += this.skbuff_get(keys[k], list[j], 2);
  3442. // }
  3443. // }
  3444. // }
  3445. // } else {
  3446. // if (cfgEf.args["buff"] != 10) {
  3447. // // 10需要判断各种异常状态
  3448. // eff_i_buff27 = this.skbuff_get(fiid, "effect_i_" + cfgEf.args["buff"], 2);
  3449. // } else {
  3450. // let list: string[] = ["effect_i_1", "effect_i_3", "effect_i_6", "effect_i_4", "effect_i_5"];
  3451. // for (let j = 0; j < list.length; j++) {
  3452. // eff_i_buff27 += this.skbuff_get(fiid, list[j], 2);
  3453. // }
  3454. // }
  3455. // }
  3456. // if (eff_i_buff27 > 0) {
  3457. // cs["nextid"] = 1;
  3458. // cs["i_59"] = 0; // todo 增伤用火焰增伤 可能有问题
  3459. // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
  3460. // if (cfgEf.args["id1"]) {
  3461. // this.sk_effect(iid, skid, cfgEf.args["id1"], ef_ttype, cs);
  3462. // }
  3463. // } else {
  3464. // pass = false; // 没有触发 不要加cd
  3465. // }
  3466. // } else {
  3467. // pass = false; // 没有触发 不要加cd
  3468. // }
  3469. // break;
  3470. // case 28: //对某种属性低于自己的敌人造成额外xx%伤害
  3471. // let i_ep = this.skbuff_get(iid, cfgEf.args["ep"]);
  3472. // let f_ep = this.skbuff_get(fiid, cfgEf.args["ep"]);
  3473. // if (i_ep > f_ep) {
  3474. // cs["nextid"] = 1;
  3475. // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
  3476. // }
  3477. // break;
  3478. // case 29: //自身或者敌方死亡后,获的某种状态
  3479. // let f_ep29 = this.skbuff_get(fiid, "hp");
  3480. // if (f_ep29 <= 0) {
  3481. // cs["nextid"] = 1;
  3482. // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
  3483. // }
  3484. // break;
  3485. // case 30: //伤害加深
  3486. // this.skbuff_add({
  3487. // fiid: fiid, //添加对象
  3488. // key: ef_buff, //属性key
  3489. // minZhen: this.zhen, //开始帧
  3490. // maxZhen: this.zhen + maxzhen, //结束帧
  3491. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3492. // ceng: e_m, //增加层数
  3493. // eps: { a: cfgEf.args["a"] * 10000 }, //属性
  3494. // });
  3495. // break;
  3496. // case 31: //按自身xx%攻击力进行治疗
  3497. // // 是否有增强治疗效果 addOneAtk里面有处理了
  3498. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3499. // let i_atk: number = this.skbuff_get(fiid, "atk");
  3500. // let addHp31: number = Math.floor((i_atk * cfgEf.args["atk_per"]) / 10000);
  3501. // this.addOneAtk(iid, fiid, "effect", ["hp", addHp31]);
  3502. // break;
  3503. // case 32: //技能每命中X个单位,给自身获取某种BUFF
  3504. // if (cs["do_iid"].toString() != iid) {
  3505. // continue;
  3506. // }
  3507. // let len = this.oneFiids[iid][ef_ttype].length;
  3508. // if (this.oneFiids[iid][ef_ttype][len - 1] == fiid) {
  3509. // // 最后一个攻击对象结算命中
  3510. // let bdcons32 = this.oneFiids[iid][ef_ttype].length;
  3511. // if (bdcons32 >= cfgEf.args["count"] && bdcons32 % cfgEf.args["count"] == 0) {
  3512. // for (let i = 0; i < Math.floor(bdcons32 / cfgEf.args["count"]); i++) {
  3513. // cs["nextid"] = 1;
  3514. // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
  3515. // }
  3516. // }
  3517. // } else {
  3518. // continue;
  3519. // }
  3520. // break;
  3521. // case 33: //触发暴击后,附加额外x%伤害
  3522. // // 由于isBj是按skid来的 上一个技能的暴击 这里获取不到 所以需要遍历一下
  3523. // if (cs["isBj"] == null && this.oneAtk[iid][fiid]) {
  3524. // for (let k = 0; k < this.oneAtk[iid][fiid].effect.length; k++) {
  3525. // if (this.oneAtk[iid][fiid].effect[k][0] === "baoji") {
  3526. // cs["isBj"] = this.oneAtk[iid][fiid].effect[k][1];
  3527. // break;
  3528. // }
  3529. // }
  3530. // }
  3531. // this.skbuff_add({
  3532. // fiid: fiid, //添加对象
  3533. // key: ef_buff, //属性key
  3534. // minZhen: this.zhen, //开始帧
  3535. // maxZhen: this.zhen + maxzhen, //结束帧
  3536. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3537. // ceng: e_m, //增加层数
  3538. // eps: { i_33_a: cfgEf.args["a"] * 10000 }, //属性
  3539. // });
  3540. // if (cs["isBj"] != null) {
  3541. // // 暴击并且拥有易伤状态
  3542. // let a = this.skbuff_get(fiid, "i_33_a");
  3543. // let subHp33: number = Math.floor(Math.abs(cs["isBj"] * (a / 10000)));
  3544. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3545. // this.addOneAtk(iid, fiid, "effect", ["hp", -subHp33]);
  3546. // this.skbuff_sub_all(fiid, ef_buff);
  3547. // }
  3548. // break;
  3549. // case 34: //敌方生命低于x%,给自身指定某种状态(首次低于) 血量变化检测
  3550. // if (cs["do_iid"].toString() != fiid) {
  3551. // pass = false;
  3552. // continue; //自己降低的不触发
  3553. // }
  3554. // let chaHp34: number = Math.abs(cfgEf.args["hp"]);
  3555. // let f_hp34 = this.skbuff_get(fiid, "hp");
  3556. // let f_hp_max34 = this.skbuff_get(fiid, "hp_max");
  3557. // if ((f_hp34 * 10000) / f_hp_max34 < chaHp34) {
  3558. // cs[fiid] = this.zhen;
  3559. // let ef_ttype_1 = "effect_id_" + cfgEf.args["id"].toString();
  3560. // if (this.oneFiids[iid] == null) {
  3561. // this.oneFiids[iid] = {};
  3562. // }
  3563. // this.oneFiids[iid][ef_ttype_1] = [fiid];
  3564. // cs["nextid"] = 1;
  3565. // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), "", cs);
  3566. // } else {
  3567. // pass = false;
  3568. // continue;
  3569. // }
  3570. // break;
  3571. // case 35: //攻击时,对血量低于30%的敌人施加一层寒意
  3572. // if (cs["do_iid"].toString() != iid) {
  3573. // continue;
  3574. // }
  3575. // let chaHp35: number = Math.abs(cfgEf.args["hp"]);
  3576. // let f_hp35 = this.skbuff_get(fiid, "hp");
  3577. // let f_hp_max35 = this.skbuff_get(fiid, "hp_max");
  3578. // if ((f_hp35 * 10000) / f_hp_max35 < chaHp35) {
  3579. // // 再下去 找不到加伤害的fiid了
  3580. // if (cfgEf.args["id"]) {
  3581. // let cfgEf2 = Gamecfg.skillEffect.getItem(cfgEf.args["id"]);
  3582. // if (cfgEf2 && cfgEf2.args && cfgEf2.args["i"] == 53) {
  3583. // let i_53_atk = this.skbuff_get(iid, "atk");
  3584. // for (let k = 0; k < this.oneAtk[iid][fiid].effect.length; k++) {
  3585. // if (this.oneAtk[iid][fiid].effect[k][0] === "hp" && this.oneAtk[iid][fiid].effect[k][1] < 0) {
  3586. // this.oneAtk[iid][fiid].effect[k][1] = -Math.floor((i_53_atk * cfgEf2.args["atk"]) / 10000);
  3587. // break;
  3588. // }
  3589. // }
  3590. // } else {
  3591. // cs["nextid"] = 1;
  3592. // cs["fiid"] = Number(fiid); // 做个标识
  3593. // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
  3594. // }
  3595. // }
  3596. // }
  3597. // break;
  3598. // case 36: //自身第一次重伤(死亡)时,恢复一半气血
  3599. // if (cs["do_iid"].toString() != iid) {
  3600. // continue; //不是自己
  3601. // }
  3602. // let chaHp36: number = Math.abs(cfgEf.args["hp"]);
  3603. // let f_hp_max36 = this.skbuff_get(fiid, "hp_max");
  3604. // let subHp36: number = Math.floor(chaHp36 * f_hp_max36);
  3605. // this.uuids[fiid].dzhen = 0;
  3606. // this.uuids[fiid].skbuff = {};
  3607. // this.timer_sub_by_fiid(fiid);
  3608. // this.oneBuff[fiid] = 1;
  3609. // this.skbuff_add({
  3610. // fiid: fiid, //添加对象
  3611. // key: ef_buff, //属性key
  3612. // minZhen: this.zhen, //开始帧
  3613. // maxZhen: 1350, //结束帧
  3614. // overlayType: 2, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3615. // ceng: 1, //增加层数
  3616. // eps: {
  3617. // i_36: subHp36,
  3618. // i_36_nZhen: this.zhen + 30,
  3619. // }, //属性
  3620. // });
  3621. // //this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3622. // //this.addOneAtk(iid, fiid, "effect", ["hp", subHp36]);
  3623. // break;
  3624. // case 37: //己方任何一个单位护体罡气破碎时,然后指定一个BUFF效果,比如击退敌人
  3625. // if (cs["do_iid"].toString().length != fiid.length) {
  3626. // continue;
  3627. // }
  3628. // cs["nextid"] = 1;
  3629. // this.sk_effect(fiid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
  3630. // break;
  3631. // case 38: //触发连击时,给自身增加效果
  3632. // if (cs["do_iid"].toString() != iid) {
  3633. // continue;
  3634. // }
  3635. // cs["nextid"] = 1;
  3636. // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
  3637. // break;
  3638. // case 39: //己方单位施加击退时,使其获得50%气血值护体罡气,并提高其5%普攻伤害,持续至战斗结束,最多叠加20层,冷却12秒
  3639. // if (cs["do_iid"].toString() != fiid) {
  3640. // continue;
  3641. // }
  3642. // this.skbuff_add({
  3643. // fiid: fiid, //添加对象
  3644. // key: ef_buff, //属性key
  3645. // minZhen: this.zhen, //开始帧
  3646. // maxZhen: this.zhen + maxzhen, //结束帧
  3647. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3648. // ceng: 1, //增加层数
  3649. // eps: { i_39_a: cfgEf.args["a"] * 10000 }, //属性
  3650. // });
  3651. // //加护体罡气
  3652. // let value39 = Math.floor((this.teams[fiid].eps["hp"] * cfgEf.args["hp"]) / 10000);
  3653. // this.skbuff_add({
  3654. // fiid: fiid, //添加对象
  3655. // key: "effect_i_9", //属性key
  3656. // minZhen: this.zhen, //开始帧
  3657. // maxZhen: this.zhen + maxzhen, //结束帧
  3658. // overlayType: 1, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3659. // ceng: 1, //增加层数
  3660. // eps: { i_9: value39 }, //属性
  3661. // });
  3662. // break;
  3663. // case 40: //自身气血高于xx%时,有概率给自身增加效果
  3664. // let f_hp40 = this.skbuff_get(fiid, "hp");
  3665. // let f_hp_max40 = this.skbuff_get(fiid, "hp_max");
  3666. // if ((f_hp40 * 10000) / f_hp_max40 > Math.abs(cfgEf.args["hp"])) {
  3667. // if (this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
  3668. // cs["nextid"] = 1;
  3669. // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
  3670. // }
  3671. // } else {
  3672. // continue;
  3673. // }
  3674. // break;
  3675. // case 41: //回血,取自身生命值上限x%进行回血,
  3676. // if (cs["next_cx"] != null && cs["next_cx"] < this.zhen) {
  3677. // let f_hp_max41 = this.skbuff_get(fiid, "hp_max");
  3678. // let chaHp41: number = Math.abs(cfgEf.args["hp"]);
  3679. // let addHp: number = Math.floor(f_hp_max41 * chaHp41);
  3680. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3681. // this.addOneAtk(iid, fiid, "effect", ["hp", addHp]);
  3682. // } else {
  3683. // cs["next_cx"] = this.zhen;
  3684. // this.timer_add({
  3685. // iid: iid, //触发者
  3686. // fiids: [fiid], //触发对象
  3687. // key: ef_ttype + "_" + e_i, //定时器标识
  3688. // type: [601], //执行触发点
  3689. // func: "sk_effect", //执行的函数名
  3690. // lzhen: 30, //轮询执行时间
  3691. // ezhen: this.zhen + maxzhen,
  3692. // skid: skid, //技能ID
  3693. // aeid: effectId, //效果ID|行为ID
  3694. // cs: cs, //参数
  3695. // overlayType: overlayType,
  3696. // });
  3697. // this.skbuff_add({
  3698. // fiid: fiid, //添加对象
  3699. // key: ef_buff, //属性key
  3700. // minZhen: this.zhen, //开始帧
  3701. // maxZhen: this.zhen + maxzhen, //结束帧
  3702. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3703. // ceng: 1, //增加层数
  3704. // eps: {}, //属性
  3705. // });
  3706. // delete cs["next_cx"];
  3707. // }
  3708. // break;
  3709. // case 42: //自身气血每降低xxxx%,造成伤害提升5%
  3710. // let f_hp42: number = this.skbuff_get(fiid, "hp");
  3711. // f_hp42 = Math.max(0, f_hp42);
  3712. // let f_hp_max42 = this.skbuff_get(fiid, "hp_max");
  3713. // let hpRate: number = Math.abs(cfgEf.args["hp"] * 100);
  3714. // let newRate: number = Math.ceil((f_hp42 * 100) / f_hp_max42);
  3715. // for (let index = 100 - hpRate; index >= newRate; index -= hpRate) {
  3716. // if (cs[index.toString()] != null) {
  3717. // continue;
  3718. // }
  3719. // cs[index.toString()] = 1;
  3720. // this.timer_add({
  3721. // iid: iid, //触发者
  3722. // fiids: [fiid], //触发对象
  3723. // key: ef_ttype, //定时器标识
  3724. // type: [401], //执行触发点
  3725. // func: "sk_effect", //执行的函数名
  3726. // lzhen: 30, //轮询执行时间
  3727. // ezhen: this.zhen + maxzhen,
  3728. // skid: skid, //技能ID
  3729. // aeid: effectId, //效果ID|行为ID
  3730. // cs: cs, //参数
  3731. // overlayType: overlayType,
  3732. // });
  3733. // cs["nextid"] = 1;
  3734. // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
  3735. // }
  3736. // break;
  3737. // case 43: //自身气血高于60%时,普通攻击有40%概率沉默目标
  3738. // let chaHp43: number = Math.abs(cfgEf.args["hp"]);
  3739. // let f_hp43 = this.skbuff_get(fiid, "hp");
  3740. // let f_hp_max43 = this.skbuff_get(fiid, "hp_max");
  3741. // if ((f_hp43 * 10000) / f_hp_max43 > chaHp43) {
  3742. // if (this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
  3743. // cs["nextid"] = 1;
  3744. // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
  3745. // }
  3746. // } else {
  3747. // continue;
  3748. // }
  3749. // break;
  3750. // case 44: //护盾消失时,直接造成自身周围全体目标120%技能伤害
  3751. // cs["nextid"] = 1;
  3752. // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
  3753. // break;
  3754. // case 45: //自身受到超过当前气血10%以上伤害时,获的某种效果
  3755. // let f_hp46 = this.skbuff_get(fiid, "hp");
  3756. // let f_hp46_old = this.teams[fiid].eps.hp;
  3757. // let f_hp_max46 = this.skbuff_get(fiid, "hp_max");
  3758. // if ((f_hp46 - f_hp46_old) / f_hp_max46 > cfgEf.args["hp"]) {
  3759. // cs["nextid"] = 1;
  3760. // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
  3761. // } else {
  3762. // continue;
  3763. // }
  3764. // break;
  3765. // case 46: //牺牲自己xxx%当前气血,对目标造成xxx%伤害
  3766. // let i_hp = this.skbuff_get(iid, "hp");
  3767. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3768. // this.addOneAtk(iid, iid, "effect", ["hp", -1 * Math.floor(i_hp * cfgEf.args["hp"])]);
  3769. // for (let k = 0; k < this.oneFiids[iid][ef_ttype].length; k++) {
  3770. // this.js_hits(iid, this.oneFiids[iid][ef_ttype][k], cfgEf.args["a"] * 10000, skid); //计算伤害
  3771. // let gzhit = this.oneHit[iid][this.oneFiids[iid][ef_ttype][k]];
  3772. // this.addOneAtk(iid, this.oneFiids[iid][ef_ttype][k], "effect", ["hp", -1 * Math.floor(gzhit.skhit)]);
  3773. // }
  3774. // break;
  3775. // case 47: //给BOSS挂了某种BUFF,BOSS就免疫这个效果。
  3776. // this.skbuff_add({
  3777. // fiid: fiid, //添加对象
  3778. // key: ef_buff, //属性key
  3779. // minZhen: this.zhen, //开始帧
  3780. // maxZhen: this.zhen + maxzhen, //结束帧
  3781. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3782. // ceng: e_m, //增加层数
  3783. // eps: cfgEf.args, //属性
  3784. // });
  3785. // break;
  3786. // case 48: //BOSS抵抗真意/火焰的时间减少
  3787. // this.skbuff_add({
  3788. // fiid: fiid, //添加对象
  3789. // key: ef_buff, //属性key
  3790. // minZhen: this.zhen, //开始帧
  3791. // maxZhen: this.zhen + 45 * 30, //结束帧
  3792. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3793. // ceng: e_m, //增加层数
  3794. // eps: cfgEf.args, //属性
  3795. // });
  3796. // break;
  3797. // case 51: //回血
  3798. // if (cfgEf.args["if"] == 1) {
  3799. // if (cs["nextid"] == null) {
  3800. // cs["nextid"] = 1;
  3801. // this.timer_add({
  3802. // iid: iid, //触发者
  3803. // fiids: fiids, //触发对象
  3804. // key: ef_ttype, //定时器标识
  3805. // type: cfgEf.triggerTime ? cfgEf.triggerTime : [601], //执行触发点
  3806. // func: "sk_effect", //执行的函数名
  3807. // lzhen: 30, //轮询执行时间
  3808. // ezhen: this.zhen + maxzhen,
  3809. // skid: skid, //技能ID
  3810. // aeid: effectId, //效果ID|行为ID
  3811. // cs: cs, //参数
  3812. // overlayType: overlayType,
  3813. // });
  3814. // return;
  3815. // } else {
  3816. // this.timer_sub(iid, ef_ttype);
  3817. // }
  3818. // } else if (cfgEf.args["if"] == 2) {
  3819. // if (cs["nextid"] == null) {
  3820. // cs["nextid"] = 1;
  3821. // this.timer_add({
  3822. // iid: iid, //触发者
  3823. // fiids: fiids, //触发对象
  3824. // key: ef_ttype, //定时器标识
  3825. // type: cfgEf.triggerTime ? cfgEf.triggerTime : [601], //执行触发点
  3826. // func: "sk_effect", //执行的函数名
  3827. // lzhen: cfgEf.interval * 30, //轮询执行时间
  3828. // ezhen: this.zhen + maxzhen,
  3829. // skid: skid, //技能ID
  3830. // aeid: effectId, //效果ID|行为ID
  3831. // cs: cs, //参数
  3832. // overlayType: overlayType,
  3833. // });
  3834. // } else {
  3835. // // 定时后加血
  3836. // let i_51_atk = this.skbuff_get(iid, "atk");
  3837. // let i_51_hp = Math.floor((cfgEf.args["atk_per"] * i_51_atk) / 10000);
  3838. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3839. // this.addOneAtk(iid, fiid, "effect", ["hp", i_51_hp]);
  3840. // }
  3841. // return;
  3842. // }
  3843. // // cs["nextid"] = 1
  3844. // if (cfgEf.args["id"] != null) {
  3845. // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
  3846. // }
  3847. // let i_51_atk = this.skbuff_get(iid, "atk");
  3848. // let i_51_hp = Math.floor((cfgEf.args["atk_per"] * i_51_atk) / 10000);
  3849. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3850. // this.addOneAtk(iid, fiid, "effect", ["hp", i_51_hp]);
  3851. // // 有附加id
  3852. // break;
  3853. // case 52: //强制对有寒意状态目标转化为冰冻,每层寒意冰冻x秒(转化完成后,需要清空目标寒意状态)
  3854. // let hitiids = Object.keys(this.oneHit[iid]);
  3855. // for (let k = 0; k < hitiids.length; k++) {
  3856. // let hitiid = hitiids[k];
  3857. // let f_eff_i_7 = this.skbuff_get(hitiid, "effect_i_7", 2);
  3858. // if (f_eff_i_7 == 0) {
  3859. // continue;
  3860. // }
  3861. // let maxZhen = Math.floor(this.zhen + f_eff_i_7 * cfgEf.args["t"] * 30);
  3862. // this.skbuff_add({
  3863. // fiid: hitiid, //添加对象
  3864. // key: "effect_i_5", //属性key
  3865. // minZhen: this.zhen, //开始帧
  3866. // maxZhen: maxZhen, //结束帧
  3867. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3868. // ceng: e_m, //增加层数
  3869. // eps: {}, //属性
  3870. // });
  3871. // this.skbuff_sub_all(hitiid, "effect_i_7");
  3872. // }
  3873. // break;
  3874. // case 53: //伤害加深(计算攻击力倍数) 这里的伤害相当于是直接用攻击力的倍数作为伤害值
  3875. // // 本次攻击加成的 下一帧不能再加伤害要本次加!!!
  3876. // if (!this.oneAtk[fiid]) {
  3877. // return;
  3878. // }
  3879. // let i_53_atk = this.skbuff_get(iid, "atk");
  3880. // let hitiids2 = Object.keys(this.oneHit[iid]);
  3881. // for (let k = 0; k < hitiids2.length; k++) {
  3882. // for (let j = 0; j < this.oneAtk[fiid][hitiids2[k]].effect.length; j++) {
  3883. // if (this.oneAtk[fiid][hitiids2[k]].effect[j][0] === "hp" && this.oneAtk[fiid][hitiids2[k]].effect[j][1] < 0) {
  3884. // this.oneAtk[fiid][hitiids2[k]].effect[j][1] = -Math.floor((i_53_atk * cfgEf.args["atk"]) / 10000);
  3885. // break;
  3886. // }
  3887. // }
  3888. // }
  3889. // this.skbuff_add({
  3890. // fiid: fiid, //添加对象
  3891. // key: ef_buff, //属性key
  3892. // minZhen: this.zhen, //开始帧
  3893. // maxZhen: this.zhen + 1, //结束帧
  3894. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3895. // ceng: e_m, //增加层数
  3896. // eps: {
  3897. // i_53: Math.floor((i_53_atk * cfgEf.args["atk"]) / 10000),
  3898. // },
  3899. // });
  3900. // break;
  3901. // case 54: //直接对有真意状态的目标进行引爆,每层真意额外造成xx%伤害
  3902. // let hits = Object.keys(this.oneHit[iid]);
  3903. // let i_atk54 = this.skbuff_get(iid, "atk");
  3904. // for (let k = 0; k < hits.length; k++) {
  3905. // let eff_i_8_54 = this.skbuff_get(hits[k], "effect_i_8", 2);
  3906. // let hit54 = Math.floor(i_atk54 * cfgEf.args["a"] * eff_i_8_54);
  3907. // if (hit54 > 0) {
  3908. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3909. // this.addOneAtk(iid, hits[k], "effect", ["hp", -1 * hit54]);
  3910. // this.skbuff_sub_all(hits[k], "effect_i_8");
  3911. // }
  3912. // }
  3913. // break;
  3914. // case 56: //引爆我方所有真意,每层真意额外造成20%的伤害
  3915. // let eff_i_4_56 = 0;
  3916. // // 清除我方所有真意
  3917. // for (let index = 0; index < this.teamFiids.length; index++) {
  3918. // let uid = this.teamFiids[index];
  3919. // if (iid.length != uid.length) {
  3920. // continue;
  3921. // }
  3922. // let count = this.skbuff_get(uid, "effect_i_8", 2);
  3923. // if (count > 0) {
  3924. // eff_i_4_56 += count;
  3925. // this.skbuff_sub_all(uid, "effect_i_8");
  3926. // }
  3927. // }
  3928. // if (eff_i_4_56 > 0) {
  3929. // let hits = Object.keys(this.oneHit[iid]);
  3930. // let i_atk56 = this.skbuff_get(iid, "atk");
  3931. // for (let k = 0; k < hits.length; k++) {
  3932. // let hit56 = Math.floor(i_atk56 * cfgEf.args["a"] * eff_i_4_56);
  3933. // if (hit56 > 0) {
  3934. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3935. // this.addOneAtk(iid, hits[k], "effect", ["hp", -1 * hit56]);
  3936. // }
  3937. // }
  3938. // } else {
  3939. // continue;
  3940. // }
  3941. // break;
  3942. // case 57: //清除我方所有火焰状态,每层火焰额外造成x%的伤害
  3943. // let eff_i_4_57 = 0;
  3944. // // 清除我方火焰
  3945. // for (let index = 0; index < this.teamFiids.length; index++) {
  3946. // let uid = this.teamFiids[index];
  3947. // if (iid.length != uid.length) {
  3948. // continue;
  3949. // }
  3950. // let count = this.skbuff_get(uid, "effect_i_4", 2);
  3951. // if (count > 0) {
  3952. // eff_i_4_57 += count;
  3953. // this.skbuff_sub_all(uid, "effect_i_4");
  3954. // }
  3955. // }
  3956. // if (eff_i_4_57 > 0) {
  3957. // let hits = Object.keys(this.oneHit[iid]);
  3958. // let i_atk57 = this.skbuff_get(iid, "atk");
  3959. // for (let k = 0; k < hits.length; k++) {
  3960. // let hit57 = Math.floor(i_atk57 * cfgEf.args["a"] * eff_i_4_57);
  3961. // if (hit57 > 0) {
  3962. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3963. // this.addOneAtk(iid, hits[k], "effect", ["hp", -1 * hit57]);
  3964. // }
  3965. // }
  3966. // } else {
  3967. // continue;
  3968. // }
  3969. // break;
  3970. // case 58: //回血(按已损失生命的%去计算回血值)
  3971. // if (cfgEf.args["if"] == 1) {
  3972. // this.skbuff_add({
  3973. // fiid: fiid, //添加对象
  3974. // key: ef_buff, //属性key
  3975. // minZhen: this.zhen, //开始帧
  3976. // maxZhen: this.zhen + maxzhen, //结束帧
  3977. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  3978. // ceng: e_m, //增加层数
  3979. // eps: {
  3980. // i_58: cfgEf.args["hp"],
  3981. // i_58_cd: cfgEf.cd,
  3982. // i_58_nZhen: this.zhen,
  3983. // },
  3984. // });
  3985. // } else {
  3986. // let fpk = this.uuids[iid]?.fpk;
  3987. // let f_hp58 = this.skbuff_get(fiid, "hp");
  3988. // let f_hp_max58 = this.skbuff_get(fiid, "hp_max");
  3989. // let addHp58: number = Math.floor(((f_hp_max58 - f_hp58) * cfgEf.args["hp"]) / 10000);
  3990. // if (fpk && cfgEf.triggerTime == null) {
  3991. // this.addOneAtk(fpk, fpk, "aType", Xys.ActionType.effect);
  3992. // this.addOneAtk(fpk, fiid, "effect", ["hp", addHp58]);
  3993. // } else {
  3994. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  3995. // this.addOneAtk(iid, fiid, "effect", ["hp", addHp58]);
  3996. // }
  3997. // }
  3998. // break;
  3999. // case 59: //有概率将火焰每秒持续伤害增加xx%
  4000. // if (this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
  4001. // let effect_i_4 = this.skbuff_get(fiid, "effect_i_4", 2);
  4002. // if (effect_i_4 > 0) {
  4003. // let i_59 = this.skbuff_get(fiid, "i_59");
  4004. // //this.skbuff_update(fiid, { i_59: i_59 + cfgEf.args["a"] });
  4005. // this.skbuff_add({
  4006. // fiid: fiid, //添加对象
  4007. // key: ef_buff, //属性key
  4008. // minZhen: this.zhen, //开始帧
  4009. // maxZhen: this.zhen + maxzhen, //结束帧
  4010. // overlayType: 1, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4011. // ceng: e_m, //增加层数
  4012. // eps: {
  4013. // i_59: cfgEf.args["a"],
  4014. // },
  4015. // });
  4016. // } else {
  4017. // pass = false;
  4018. // }
  4019. // } else {
  4020. // pass = false;
  4021. // }
  4022. // break;
  4023. // case 60: //移除对手等量的属性值
  4024. // let eff_i_ep: { [key: string]: number } = {};
  4025. // let keys60 = Object.keys(cfgEf.args);
  4026. // for (let k = 0; k < keys60.length; k++) {
  4027. // if (this.teams[fiid].eps[keys60[k]] == null) {
  4028. // continue;
  4029. // }
  4030. // eff_i_ep[keys60[k]] = -1 * Math.abs(cfgEf.args[keys60[k]]);
  4031. // }
  4032. // this.skbuff_add({
  4033. // fiid: fiid, //添加对象
  4034. // key: ef_buff, //属性key
  4035. // minZhen: this.zhen, //开始帧
  4036. // maxZhen: this.zhen + maxzhen, //结束帧
  4037. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4038. // ceng: e_m, //增加层数
  4039. // eps: eff_i_ep,
  4040. // });
  4041. // break;
  4042. // case 61: //护体罡气的承伤减少/增加xxx%
  4043. // this.skbuff_add({
  4044. // fiid: fiid, //添加对象
  4045. // key: ef_buff, //属性key
  4046. // minZhen: this.zhen, //开始帧
  4047. // maxZhen: this.zhen + maxzhen, //结束帧
  4048. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4049. // ceng: e_m, //增加层数
  4050. // eps: {
  4051. // i_61: cfgEf.args["hp_max"],
  4052. // },
  4053. // });
  4054. // break;
  4055. // case 62: //目标治疗效果降低/增加,持续X秒
  4056. // this.skbuff_add({
  4057. // fiid: fiid, //添加对象
  4058. // key: ef_buff, //属性key
  4059. // minZhen: this.zhen, //开始帧
  4060. // maxZhen: this.zhen + maxzhen, //结束帧
  4061. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4062. // ceng: e_m, //增加层数
  4063. // eps: {
  4064. // i_62: cfgEf.args["hp"],
  4065. // },
  4066. // });
  4067. // break;
  4068. // case 63: //主角阵亡后,弟子会复活主角并恢复19.56%生命,每场战斗生效1次(秘法和法器的复活只能生效1个)
  4069. // if (cs["do_iid"] % 100 != 0) {
  4070. // continue;
  4071. // }
  4072. // let f_hp_max63 = this.skbuff_get(fiid, "hp_max");
  4073. // let addHp62: number = Math.floor((f_hp_max63 * cfgEf.args["hp"]) / 10000);
  4074. // this.skbuff_add({
  4075. // fiid: cs["do_iid"].toString(), //添加对象
  4076. // key: ef_buff, //属性key
  4077. // minZhen: this.zhen, //开始帧
  4078. // maxZhen: this.zhen + maxzhen, //结束帧
  4079. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4080. // ceng: e_m, //增加层数
  4081. // eps: {
  4082. // i_63_hp: addHp62,
  4083. // i_63_nZhen: this.zhen,
  4084. // i_63_cd: 0,
  4085. // },
  4086. // });
  4087. // break;
  4088. // case 64: //弟子首次攻击伤害额外提升x%
  4089. // this.skbuff_add({
  4090. // fiid: fiid, //添加对象
  4091. // key: ef_buff, //属性key
  4092. // minZhen: this.zhen, //开始帧
  4093. // maxZhen: this.zhen + maxzhen, //结束帧
  4094. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4095. // ceng: e_m, //增加层数
  4096. // eps: {
  4097. // i_64_a: cfgEf.args["a"] * 10000,
  4098. // i_64_cd: cfgEf.cd ? cfgEf.cd : 0,
  4099. // i_64_nZhen: this.zhen,
  4100. // },
  4101. // });
  4102. // break;
  4103. // case 65: //附加被攻击目标的当前生命值X%伤害,最高伤害不超过攻击力x%
  4104. // let f_atk: number = this.skbuff_get(iid, "atk");
  4105. // let keys65 = Object.keys(this.oneAtk[iid]);
  4106. // for (let k = 0; k < keys65.length; k++) {
  4107. // if (iid.length != keys65[k].length) {
  4108. // let add_65: number = 0;
  4109. // let f_hp = this.skbuff_get(keys65[k], "hp_max");
  4110. // add_65 = (cfgEf.args["hp"] * f_hp) / 10000;
  4111. // add_65 = Math.min(add_65, (cfgEf.args["max_atk"] * f_atk) / 10000);
  4112. // add_65 = Math.max(0, Math.floor(add_65));
  4113. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  4114. // this.addOneAtk(iid, keys65[k], "effect", ["hp", -1 * add_65]);
  4115. // }
  4116. // }
  4117. // break;
  4118. // case 66: //随机一个弟子 偷取目标主角x%的攻击力,每层最高不超过x%自身攻击力 与 79配合使用
  4119. // if (cfgEf.args["id"] != null) {
  4120. // this.sk_effect(fiid, skid, cfgEf.args["id"].toString(), "", cs);
  4121. // }
  4122. // break;
  4123. // case 79: //偷取目标x%的攻击力,每层最高不超过x%自身攻击力
  4124. // let keys: { [key: string]: string } = { atk_per: "atk", def_per: "def", hp_max_per: "hp_max", hp_per: "hp" };
  4125. // let eps_66: { [key: string]: number } = {};
  4126. // let feps_66: { [key: string]: number } = {};
  4127. // let keys79 = Object.keys(cfgEf.args);
  4128. // for (let k = 0; k < keys79.length; k++) {
  4129. // if (this.teams[iid].eps[keys79[k]] == null) {
  4130. // continue;
  4131. // }
  4132. // let i_key = this.skbuff_get(iid, keys[keys79[k]] ? keys[keys79[k]] : keys79[k]);
  4133. // let f_key = this.skbuff_get(fiid, keys[keys79[k]] ? keys[keys79[k]] : keys79[k]);
  4134. // let f_val = Math.floor((f_key * cfgEf.args[keys79[k]]) / 10000);
  4135. // let max_val = Math.floor((i_key * cfgEf.args["max_atk"]) / 10000);
  4136. // let i_f_val = keys79[k] == "atk_per" ? Math.min(f_val, max_val) : f_val; // 这个值是攻击力
  4137. // if (keys79[k] == "atk_per") {
  4138. // // atk_per 算的是攻击力 直接加在atk上面
  4139. // eps_66[keys[keys79[k]]] = i_f_val;
  4140. // feps_66[keys[keys79[k]]] = -1 * f_val;
  4141. // } else {
  4142. // eps_66[keys79[k]] = i_f_val;
  4143. // feps_66[keys79[k]] = -1 * f_val;
  4144. // }
  4145. // }
  4146. // this.skbuff_add({
  4147. // fiid: iid, //添加对象
  4148. // key: ef_buff, //属性key
  4149. // minZhen: this.zhen, //开始帧
  4150. // maxZhen: this.zhen + maxzhen, //结束帧
  4151. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4152. // ceng: e_m, //增加层数
  4153. // eps: eps_66,
  4154. // });
  4155. // this.skbuff_add({
  4156. // fiid: fiid, //添加对象
  4157. // key: ef_buff, //属性key
  4158. // minZhen: this.zhen, //开始帧
  4159. // maxZhen: this.zhen + maxzhen, //结束帧
  4160. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4161. // ceng: e_m, //增加层数
  4162. // eps: feps_66,
  4163. // });
  4164. // break;
  4165. // case 67: //对最终伤害有概率造成N倍伤害
  4166. // let a_per: number = 0;
  4167. // if (this.seedRand.rand(1, 10000) <= cfgEf.args["p1"] * 10000) {
  4168. // a_per = cfgEf.args["a1"];
  4169. // } else if (this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
  4170. // a_per = cfgEf.args["a"];
  4171. // }
  4172. // if (a_per > 0) {
  4173. // this.skbuff_add({
  4174. // fiid: iid, //添加对象
  4175. // key: ef_buff, //属性key
  4176. // minZhen: this.zhen, //开始帧
  4177. // maxZhen: this.zhen + maxzhen, //结束帧
  4178. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4179. // ceng: e_m, //增加层数
  4180. // eps: { a_per: a_per },
  4181. // });
  4182. // }
  4183. // break;
  4184. // case 68: //攻击时,消耗自身x%当前生命值,扣除敌方等额生命值,最高不超过自身x%攻击
  4185. // let i_hp68 = this.skbuff_get(iid, "hp");
  4186. // let i_atk68 = this.skbuff_get(iid, "atk");
  4187. // let max = Math.floor((i_atk68 * cfgEf.args["atk_per"]) / 10000);
  4188. // let subHp68 = Math.floor((i_hp68 * Math.abs(cfgEf.args["hp"])) / 10000);
  4189. // subHp68 = Math.min(subHp68, max);
  4190. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  4191. // if (lsOne == 0) {
  4192. // //只扣除一次
  4193. // lsOne += 1;
  4194. // this.addOneAtk(iid, iid, "effect", ["hp", -1 * subHp68]);
  4195. // }
  4196. // this.addOneAtk(iid, fiid, "effect", ["hp", -1 * subHp68]);
  4197. // break;
  4198. // case 69: //每次进行反击,获得51%强化兽灵,最大不超过自身攻击力30%,持续2秒,冷却10秒
  4199. // let f_atk69 = this.skbuff_get(fiid, "atk");
  4200. // let m_qhshouling = Math.floor((f_atk69 * cfgEf.args["atk_per"]) / 10000);
  4201. // let qhshouling = Math.min(cfgEf.args["qhshouling"], m_qhshouling);
  4202. // this.skbuff_add({
  4203. // fiid: fiid, //添加对象
  4204. // key: ef_buff, //属性key
  4205. // minZhen: this.zhen, //开始帧
  4206. // maxZhen: this.zhen + maxzhen, //结束帧
  4207. // overlayType: 1, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4208. // ceng: e_m, //增加层数
  4209. // eps: {
  4210. // qhshouling: qhshouling,
  4211. // //max_add_hit: Math.floor((f_atk69 * cfgEf.args["atk"]) / 10000),
  4212. // },
  4213. // });
  4214. // break;
  4215. // case 70: //反弹xx%的伤害给敌方,最大不超过自身攻击力2倍
  4216. // // 获取上次攻击自己的人
  4217. // let hit_fiid = this.uuids[iid]?.fpk;
  4218. // let hit70: number = cs["hit"] * cfgEf.args["a"];
  4219. // let max70 = (this.skbuff_get(iid, "atk") * cfgEf.args["atk_per"]) / 10000;
  4220. // hit70 = Math.floor(Math.min(hit70, max70));
  4221. // //this.addOneAtk(hit_fiid,hit_fiid,"aType",Xys.ActionType.effect)
  4222. // if (hit_fiid) {
  4223. // this.addOneAtk(hit_fiid, hit_fiid, "effect", ["hp", -1 * hit70]);
  4224. // }
  4225. // break;
  4226. // case 71: //单次伤害不超过自身最大生命值的x%
  4227. // if (cs["do_iid"] != Number(fiid)) {
  4228. // pass = false;
  4229. // continue;
  4230. // }
  4231. // let f_hp_max71 = this.skbuff_get(iid, "hp_max");
  4232. // let max_hit_71 = Math.floor((f_hp_max71 * cfgEf.args["hp_max"]) / 10000);
  4233. // this.skbuff_add({
  4234. // fiid: fiid, //添加对象
  4235. // key: ef_buff, //属性key
  4236. // minZhen: this.zhen, //开始帧
  4237. // maxZhen: this.zhen + maxzhen, //结束帧
  4238. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4239. // ceng: 1, //增加层数
  4240. // eps: {
  4241. // max_i_71: max_hit_71,
  4242. // max_i_71_cd: cfgEf.cd ? cfgEf.cd : 0,
  4243. // max_i_71_nZhen: this.zhen,
  4244. // },
  4245. // });
  4246. // break;
  4247. // case 72: //目标处于某种状态,然后延长此状态的时间
  4248. // let f_i_buff = this.skbuff_get(fiid, "effect_i_" + cfgEf.args["buff"], 2);
  4249. // if (f_i_buff > 0) {
  4250. // //let keys72 = Object.keys(this.uuids[fiid].skbuff["effect_i_" + cfgEf.args["buff"]])
  4251. // let keys72 = this.changeSkBuff(1, fiid, "effect_i_" + cfgEf.args["buff"], 1);
  4252. // for (let k = 0; k < keys72.length; k++) {
  4253. // this.uuids[fiid].skbuff["effect_i_" + cfgEf.args["buff"]][Number(keys72[k])].ezhen += 30 * cfgEf.args["t"];
  4254. // }
  4255. // this.changeSkBuff(2, fiid, "effect_i_" + cfgEf.args["buff"], 1, this.uuids[fiid].skbuff["effect_i_" + cfgEf.args["buff"]]);
  4256. // } else {
  4257. // continue;
  4258. // }
  4259. // break;
  4260. // case 73: //每次释放术法,术法伤害增加7.5%,最高叠加到15%
  4261. // let qhmifa73 = this.skbuff_get(fiid, "i_73");
  4262. // qhmifa73 += cfgEf.args["qhmifa"];
  4263. // qhmifa73 = Math.min(qhmifa73, cfgEf.args["max_qhmifa"]);
  4264. // this.skbuff_add({
  4265. // fiid: fiid, //添加对象
  4266. // key: ef_buff, //属性key
  4267. // minZhen: this.zhen, //开始帧
  4268. // maxZhen: this.zhen + maxzhen, //结束帧
  4269. // overlayType: 2, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4270. // ceng: 1, //增加层数
  4271. // eps: { i_73: qhmifa73 },
  4272. // });
  4273. // break;
  4274. // case 74: //给被溅射的目标增加一个BUFF效果
  4275. // cs["nextid"] = 1;
  4276. // this.sk_effect(iid, skid, cfgEf.args["id"].toString(), ef_ttype, cs);
  4277. // break;
  4278. // case 75: //技能系数增加,生效1次后清空
  4279. // if (cfgEf.args["a"] == null) {
  4280. // continue;
  4281. // }
  4282. // this.skbuff_add({
  4283. // fiid: fiid, //添加对象
  4284. // key: ef_buff, //属性key
  4285. // minZhen: this.zhen, //开始帧
  4286. // maxZhen: this.zhen + maxzhen, //结束帧
  4287. // overlayType: 2, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4288. // ceng: 1, //增加层数
  4289. // eps: { i_75: cfgEf.args["a"] * 10000 },
  4290. // });
  4291. // break;
  4292. // case 76: //存在buff时,造成技能伤害
  4293. // if (gameMethod.isEmpty(cfgEf.args["buff"]) == false) {
  4294. // if (this.skbuff_get(iid, "effect_i_" + cfgEf.args["buff"], 2) <= 0) {
  4295. // continue;
  4296. // }
  4297. // }
  4298. // this.js_hits(iid, fiid, e_a, skid); //计算伤害
  4299. // let gzhit = this.oneHit[iid][fiid];
  4300. // let hit = gzhit.skhit;
  4301. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  4302. // this.addOneAtk(iid, fiid, "effect", ["hp", -1 * hit]);
  4303. // if (cfgEf.args["p"] != null && this.seedRand.rand(1, 10000) <= cfgEf.args["p"] * 10000) {
  4304. // cs["nextid"] = 1;
  4305. // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
  4306. // }
  4307. // break;
  4308. // case 77: // 造成伤害(额外伤害)
  4309. // cs["hit"] = this.skbuff_get(iid, "atk");
  4310. // if (cs["hit"] == null) {
  4311. // continue;
  4312. // }
  4313. // let hit_77 = Math.floor((cs["hit"] * cfgEf.args["atk"]) / 10000);
  4314. // let effect = [];
  4315. // effect = ["hp", -1 * hit_77];
  4316. // if (cfgEf.args["s"] != null) {
  4317. // effect = ["hp", -1 * hit_77, "jitui", cfgEf.args["s"]];
  4318. // }
  4319. // this.addOneAtk(iid, fiid, "effect", effect);
  4320. // break;
  4321. // case 78: // 释放技能后 造成某种效果 id对应释放技能后效果
  4322. // if (cfgEf.args["id"] != null) {
  4323. // this.sk_effect(iid, skid, cfgEf.args["id"], ef_ttype, cs);
  4324. // }
  4325. // break;
  4326. // case 80: // 给自身加buff,攻击目标带有某个buff时,必定暴击
  4327. // this.skbuff_add({
  4328. // fiid: fiid, //添加对象
  4329. // key: ef_buff, //属性key
  4330. // minZhen: this.zhen, //开始帧
  4331. // maxZhen: this.zhen + maxzhen, //结束帧
  4332. // overlayType: 1, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4333. // ceng: 1, //增加层数
  4334. // eps: {
  4335. // i_80_buff: cfgEf.args["buff"],
  4336. // },
  4337. // });
  4338. // break;
  4339. // case 81: // 溅射伤害增加/减少
  4340. // this.skbuff_add({
  4341. // fiid: fiid, //添加对象
  4342. // key: ef_buff, //属性key
  4343. // minZhen: this.zhen, //开始帧
  4344. // maxZhen: this.zhen + maxzhen, //结束帧
  4345. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4346. // ceng: e_m, //增加层数
  4347. // eps: {
  4348. // i_81: e_a,
  4349. // i_81_cd: 0, // 持续性的 不加cd
  4350. // i_81_nZhen: this.zhen,
  4351. // }, //属性
  4352. // });
  4353. // break;
  4354. // case 82: //攻击带有护体罡气的承伤减少/增加xxx%
  4355. // this.skbuff_add({
  4356. // fiid: fiid, //添加对象
  4357. // key: ef_buff, //属性key
  4358. // minZhen: this.zhen, //开始帧
  4359. // maxZhen: this.zhen + maxzhen, //结束帧
  4360. // overlayType: overlayType, // 1.叠加 2.不叠加替换,默认不填值就是不叠加
  4361. // ceng: e_m, //增加层数
  4362. // eps: {
  4363. // i_82: cfgEf.args["hp_max"],
  4364. // },
  4365. // });
  4366. // break;
  4367. // }
  4368. // }
  4369. // if (!pass) {
  4370. // return;
  4371. // }
  4372. // //cd
  4373. // if (fiids.length > 0) {
  4374. // if (gameMethod.isEmpty(cfgEf.count) == false && this.zhen != 1) {
  4375. // this.uuids[iid].skbase[skid].effect[effectId].count += 1;
  4376. // if (this.uuids[iid].skbase[skid].effect[effectId].count >= cfgEf.count) {
  4377. // if (gameMethod.isEmpty(cfgEf.cd) == false) {
  4378. // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen;
  4379. // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
  4380. // this.uuids[iid].skbase[skid].effect[effectId].count = 0;
  4381. // this.uuids[iid].timer[ef_ttype][cs["timerId"].toString()].szhen = this.zhen + cfgEf.cd * 30;
  4382. // } else {
  4383. // }
  4384. // }
  4385. // }
  4386. // if (gameMethod.isEmpty(cfgEf.cd) == false && this.zhen != 1) {
  4387. // if (this.uuids[iid].skbase[skid].effect[effectId].count == 0) {
  4388. // this.uuids[iid].skbase[skid].effect[effectId].effectZhen = this.zhen; // 上次加状态的帧
  4389. // if (cfgEf.args["t"]) {
  4390. // if (this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen < this.zhen) {
  4391. // this.uuids[iid].skbase[skid].effect[effectId].effectEndZhen = this.zhen + cfgEf.args["t"] * 30; // buff持续增加效果结束帧
  4392. // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
  4393. // }
  4394. // } else {
  4395. // this.uuids[iid].skbase[skid].effect[effectId].nextcd = this.zhen + cfgEf.cd * 30;
  4396. // }
  4397. // }
  4398. // }
  4399. // }
  4400. // // 判定是否是弟子技能 触发弟子释放技能主角加血
  4401. // if (cfgBase.type === "1" && cfgBase.skillType === 3) {
  4402. // for (let index = 0; index < this.teamFiids.length; index++) {
  4403. // let uid = this.teamFiids[index];
  4404. // if (uid.length === iid.length) {
  4405. // let i_58 = this.skbuff_get(uid, "effect_i_58", 2);
  4406. // if (i_58 > 0) {
  4407. // if (this.zhen >= this.skbuff_get(uid, "i_58_nZhen")) {
  4408. // // 有cd的 加完一次要更新cd
  4409. // let cd = this.skbuff_get(uid, "i_58_cd");
  4410. // this.skbuff_update(uid, { i_58_nZhen: cd * 30 + this.zhen });
  4411. // let addPer = this.skbuff_get(uid, "i_58"); // 恢复已损失生命的x%
  4412. // let hp = this.skbuff_get(uid, "hp");
  4413. // let hpMax = this.skbuff_get(uid, "hp_max");
  4414. // let hit = Math.floor(((hpMax - hp) * addPer) / 10000);
  4415. // this.addOneAtk(iid, iid, "aType", Xys.ActionType.effect);
  4416. // this.addOneAtk(iid, uid, "effect", ["hp", hit]);
  4417. // }
  4418. // }
  4419. // }
  4420. // }
  4421. // }
  4422. // }
  4423. // /**
  4424. // * 辅助函数 - 获取值总和
  4425. // * gType = 2 叠加的层数
  4426. // */
  4427. // private skbuff_get(iid: string, key: string, gType: number = 0): number {
  4428. // let epVal: number = 0;
  4429. // if (this.teams[iid] == null) {
  4430. // return 0;
  4431. // }
  4432. // //层数
  4433. // if (gType == 2) {
  4434. // let ceng: number = 0;
  4435. // if (key == "effect_i_10") {
  4436. // if (this.uuids[iid].skbuff["effect_i_1"] != null) {
  4437. // ceng += this.uuids[iid].skbuff["effect_i_1"].length;
  4438. // }
  4439. // if (this.uuids[iid].skbuff["effect_i_3"] != null) {
  4440. // ceng += this.uuids[iid].skbuff["effect_i_3"].length;
  4441. // }
  4442. // if (this.uuids[iid].skbuff["effect_i_4"] != null) {
  4443. // ceng += this.uuids[iid].skbuff["effect_i_4"].length;
  4444. // }
  4445. // if (this.uuids[iid].skbuff["effect_i_5"] != null) {
  4446. // ceng += this.uuids[iid].skbuff["effect_i_5"].length;
  4447. // }
  4448. // if (this.uuids[iid].skbuff["effect_i_6"] != null) {
  4449. // ceng += this.uuids[iid].skbuff["effect_i_6"].length;
  4450. // }
  4451. // //let keys = Object.keys(this.uuids[iid].skbuff)
  4452. // let keys = this.changeSkBuff(1, iid, null, 1);
  4453. // for (let k = 0; k < keys.length; k++) {
  4454. // if (keys[k].includes("effect_i_0")) {
  4455. // // let values = Object.values(this.uuids[iid].skbuff[keys[k]])
  4456. // let values = this.changeSkBuff(1, iid, keys[k], 2);
  4457. // for (let j = 0; j < values.length; j++) {
  4458. // //计算属性 这里in没关系
  4459. // let keys2 = Object.keys(values[j].eps);
  4460. // for (let l = 0; l < keys2.length; l++) {
  4461. // if (this.teams[iid].eps[keys2[l]] == null) {
  4462. // continue;
  4463. // }
  4464. // if (values[j].eps[keys2[l]] < 0) {
  4465. // ceng += 1;
  4466. // break;
  4467. // }
  4468. // }
  4469. // }
  4470. // }
  4471. // }
  4472. // return ceng;
  4473. // }
  4474. // if (this.uuids[iid].skbuff[key] == null) {
  4475. // return 0;
  4476. // }
  4477. // return this.uuids[iid].skbuff[key].length;
  4478. // }
  4479. // //属性
  4480. // if (this.teams[iid].eps[key] != null) {
  4481. // epVal = this.teams[iid].eps[key];
  4482. // if (key == "hp") {
  4483. // //剩余血量
  4484. // epVal = this.jueFiidHp(iid);
  4485. // }
  4486. // }
  4487. // // let values = Object.values(this.uuids[iid].skbuff);
  4488. // let values = this.changeSkBuff(1, iid, null, 2);
  4489. // for (let k = 0; k < values.length; k++) {
  4490. // for (let j = 0; j < values[k].length; j++) {
  4491. // //计算属性 这里in没关系
  4492. // if (values[k][j].eps[key] == null) {
  4493. // continue;
  4494. // }
  4495. // epVal += values[k][j].eps[key];
  4496. // }
  4497. // }
  4498. // //攻击
  4499. // if (key == "atk") {
  4500. // let atk_per = this.skbuff_get(iid, "atk_per");
  4501. // epVal += Math.floor((epVal * atk_per) / 10000);
  4502. // }
  4503. // //防御
  4504. // if (key == "def") {
  4505. // let def_per = this.skbuff_get(iid, "def_per");
  4506. // epVal += Math.floor((epVal * def_per) / 10000);
  4507. // }
  4508. // //生命百分比
  4509. // if (key == "hp_max") {
  4510. // let hp_max_per = this.skbuff_get(iid, "hp_max_per");
  4511. // epVal += Math.floor((epVal * hp_max_per) / 10000);
  4512. // }
  4513. // //生命百分比
  4514. // if (key == "hp") {
  4515. // let hp_per = this.skbuff_get(iid, "hp_per");
  4516. // epVal += Math.floor((epVal * hp_per) / 10000);
  4517. // }
  4518. // return Math.floor(epVal);
  4519. // }
  4520. // /**
  4521. // * 辅助函数 - 清除buff
  4522. // */
  4523. // private skbuff_clear() {
  4524. // for (let index = 0; index < this.teamFiids.length; index++) {
  4525. // let fiid = this.teamFiids[index];
  4526. // if (this.teams[fiid].eps.hp <= 0) {
  4527. // this.uuids[fiid].skbuff = {};
  4528. // }
  4529. // //let skbuffCopy = gameMethod.objCopy(this.uuids[fiid].skbuff);
  4530. // this.uuids[fiid].skbuff = {};
  4531. // // let keys = Object.keys(skbuffCopy)
  4532. // let keys = this.changeSkBuff(1, fiid, null, 1);
  4533. // for (let k = 0; k < keys.length; k++) {
  4534. // //计算属性 这里in没关系
  4535. // // let values = Object.values(skbuffCopy[keys[k]])
  4536. // let values = this.changeSkBuff(1, fiid, keys[k], 2);
  4537. // for (let j = 0; j < values.length; j++) {
  4538. // if (this.zhen >= values[j].ezhen) {
  4539. // this.oneBuff[fiid] = 1;
  4540. // if (gameMethod.isEmpty(values[j].eps["i_9_id"]) == false) {
  4541. // this.sk_effect(fiid, values[j].eps["i_9_skin"].toString(), values[j].eps["i_9_id"].toString(), "", {
  4542. // do_iid: Number(fiid),
  4543. // nextid: 1,
  4544. // });
  4545. // }
  4546. // continue;
  4547. // }
  4548. // if (this.uuids[fiid].skbuff[keys[k]] == null) {
  4549. // this.uuids[fiid].skbuff[keys[k]] = [];
  4550. // }
  4551. // this.uuids[fiid].skbuff[keys[k]].push(values[j]);
  4552. // }
  4553. // }
  4554. // this.changeSkBuff(2, fiid, null, 1, this.uuids[fiid].skbuff);
  4555. // if (this.skbuff_get(fiid, "effect_i_9", 2) <= 0) {
  4556. // let values = Object.values(this.uuids[fiid].podun);
  4557. // for (let k = 0; k < values.length; k++) {
  4558. // this.skbuff_sub_all(fiid, values[k]);
  4559. // }
  4560. // }
  4561. // if (this.skbuff_get(fiid, "effect_i_4", 2) <= 0) {
  4562. // this.skbuff_sub_all(fiid, "effect_i_59");
  4563. // }
  4564. // }
  4565. // }
  4566. // /**
  4567. // * 辅助函数 - 输出BUFF
  4568. // */
  4569. // private skbuff_outf() {
  4570. // let keys = Object.keys(this.oneBuff);
  4571. // for (let k = 0; k < keys.length; k++) {
  4572. // this.addOneAtk(keys[k], keys[k], "aType", Xys.ActionType.buff);
  4573. // // let keys2 = Object.keys(this.uuids[keys[k]].skbuff)
  4574. // let keys2 = this.changeSkBuff(1, keys[k], null, 1);
  4575. // for (let j = 0; j < keys2.length; j++) {
  4576. // this.addOneAtk(keys[k], keys[k], "buff", [keys2[j], this.uuids[keys[k]].skbuff[keys2[j]].length]);
  4577. // }
  4578. // }
  4579. // }
  4580. // /**
  4581. // * 辅助函数 - 添加属性值
  4582. // */
  4583. // private skbuff_add(cs: skbuff_add_cs) {
  4584. // let eff_i_12 = this.skbuff_get(cs.fiid, "effect_i_12", 2);
  4585. // if (eff_i_12 > 0) {
  4586. // if (["effect_i_1", "effect_i_3", "effect_i_4", "effect_i_5", "effect_i_6"].includes(cs.key)) {
  4587. // return;
  4588. // }
  4589. // if (cs.key.includes("effect_i_0")) {
  4590. // let keys = Object.keys(cs.eps);
  4591. // for (let k = 0; k < keys.length; k++) {
  4592. // if (this.teams[cs.fiid].eps[keys[k]] == null) {
  4593. // continue;
  4594. // }
  4595. // if (cs.eps[keys[k]] < 0) {
  4596. // return;
  4597. // }
  4598. // }
  4599. // }
  4600. // }
  4601. // if (cs.overlayType == 1) {
  4602. // //1.叠加 2.不叠加替换,默认不填值就是不叠加
  4603. // if (this.uuids[cs.fiid].skbuff[cs.key] == null) {
  4604. // this.uuids[cs.fiid].skbuff[cs.key] = [];
  4605. // }
  4606. // for (let index = 0; index < cs.ceng; index++) {
  4607. // this.uuids[cs.fiid].skbuff[cs.key].push({
  4608. // szhen: cs.minZhen, //开始帧
  4609. // ezhen: cs.maxZhen, //结束帧
  4610. // eps: cs.eps, //属性值
  4611. // });
  4612. // }
  4613. // } else {
  4614. // this.uuids[cs.fiid].skbuff[cs.key] = [];
  4615. // for (let index = 0; index < cs.ceng; index++) {
  4616. // this.uuids[cs.fiid].skbuff[cs.key].push({
  4617. // szhen: cs.minZhen, //开始帧
  4618. // ezhen: cs.maxZhen, //结束帧
  4619. // eps: cs.eps, //属性值
  4620. // });
  4621. // }
  4622. // }
  4623. // this.changeSkBuff(2, cs.fiid, cs.key, 1, this.uuids[cs.fiid].skbuff[cs.key]);
  4624. // this.oneBuff[cs.fiid] = 1;
  4625. // }
  4626. // /**
  4627. // * 辅助函数 - 修改属性值
  4628. // */
  4629. // private skbuff_update(iid: string, eps: { [p: string]: number }, type: number = 0) {
  4630. // if (this.teams[iid] == null) {
  4631. // return;
  4632. // }
  4633. // if (type === 1) {
  4634. // this.teams[iid].eps = eps;
  4635. // } else {
  4636. // let keys = Object.keys(eps);
  4637. // for (let k = 0; k < keys.length; k++) {
  4638. // this.teams[iid].eps[keys[k]] = eps[keys[k]];
  4639. // }
  4640. // }
  4641. // }
  4642. // /**
  4643. // * 辅助函数 - 删除属性值 (1个)
  4644. // */
  4645. // private skbuff_sub(fiid: string, key: string) {
  4646. // if (this.uuids[fiid] == null) {
  4647. // return;
  4648. // }
  4649. // if (gameMethod.isEmpty(this.uuids[fiid].skbuff[key]) == true) {
  4650. // return;
  4651. // }
  4652. // this.uuids[fiid].skbuff[key].splice(0, 1);
  4653. // this.changeSkBuff(2, fiid, key, 1, this.uuids[fiid].skbuff[key]);
  4654. // this.oneBuff[fiid] = 1;
  4655. // }
  4656. // /**
  4657. // * 辅助函数 - 删除属性值 (所有)
  4658. // */
  4659. // private skbuff_sub_all(fiid: string, key: string) {
  4660. // if (this.uuids[fiid] == null) {
  4661. // return;
  4662. // }
  4663. // if (gameMethod.isEmpty(this.uuids[fiid].skbuff[key]) == true) {
  4664. // return;
  4665. // }
  4666. // //delete this.uuids[fiid].skbuff[key];
  4667. // this.changeSkBuff(3, fiid, key);
  4668. // if (key == "effect_i_4" && this.uuids[fiid].skbuff["effect_i_59"]) {
  4669. // // 火焰清除时 对应的火焰增伤也清除
  4670. // //delete this.uuids[fiid].skbuff["effect_i_59"]
  4671. // this.changeSkBuff(3, fiid, "effect_i_59");
  4672. // }
  4673. // this.oneBuff[fiid] = 1;
  4674. // }
  4675. // /**
  4676. // * 辅助函数 - 最终伤害增减
  4677. // * @param iid 打人
  4678. // * @param fiid 被打人
  4679. // * @param hit 造成的伤害
  4680. // */
  4681. // private hit_last(iid: string, fiid: string, hit: number, isfj: number = 0): number {
  4682. // if (hit <= 0) {
  4683. // return 0;
  4684. // }
  4685. // let add_per: number = 0;
  4686. // //最终伤害降低xx%
  4687. // let i_13_nZhen = this.skbuff_get(fiid, "i_13_nZhen");
  4688. // if (this.skbuff_get(fiid, "effect_i_13", 2) > 0 && this.zhen >= i_13_nZhen) {
  4689. // add_per += this.skbuff_get(fiid, "i_13");
  4690. // let cd = this.skbuff_get(fiid, "i_13_cd");
  4691. // if (cd > 0) {
  4692. // this.skbuff_update(fiid, { i_13_nZhen: cd * 30 + this.zhen });
  4693. // }
  4694. // }
  4695. // hit += Math.floor((hit * add_per) / 10000);
  4696. // // 计算个人战力差 系数
  4697. // hit = Math.floor(this.powerDisparity(iid, fiid) * hit);
  4698. // hit = Math.max(0, hit);
  4699. // let f_i_9 = this.skbuff_get(fiid, "i_9");
  4700. // if (f_i_9 > 0) {
  4701. // //有护盾
  4702. // let f_i_61 = this.skbuff_get(fiid, "i_61") / 10000;
  4703. // let i_i_82 = this.skbuff_get(iid, "i_82") / 10000;
  4704. // //let copy = gameMethod.objCopy(this.uuids[fiid].skbuff["effect_i_9"]);
  4705. // this.uuids[fiid].skbuff["effect_i_9"] = [];
  4706. // // let values = Object.values(copy)
  4707. // let values = this.changeSkBuff(1, fiid, "effect_i_9", 2);
  4708. // for (let k = 0; k < values.length; k++) {
  4709. // let skbuff = values[k];
  4710. // //计算属性 这里in没关系
  4711. // let i_9_add = Math.floor(skbuff.eps["i_9"] * (f_i_61 - i_i_82));
  4712. // if (hit >= skbuff.eps["i_9"] + i_9_add) {
  4713. // hit -= skbuff.eps["i_9"] + i_9_add;
  4714. // skbuff.eps["i_9"] = 0;
  4715. // if (gameMethod.isEmpty(skbuff.eps["i_9_id"]) == false) {
  4716. // this.sk_effect(fiid, skbuff.eps["i_9_skin"].toString(), skbuff.eps["i_9_id"].toString(), "", {
  4717. // do_iid: Number(fiid),
  4718. // nextid: 1,
  4719. // });
  4720. // }
  4721. // this.timer_do(105, { do_iid: Number(fiid) }); //护体罡气破碎时触发
  4722. // this.oneBuff[fiid] = 1;
  4723. // } else {
  4724. // skbuff.eps["i_9"] -= hit - i_9_add;
  4725. // hit = 0;
  4726. // this.uuids[fiid].skbuff["effect_i_9"].push(skbuff);
  4727. // }
  4728. // if (isfj === 1) {
  4729. // this.addOneAtk(fiid, fiid, "effect", ["i_9", skbuff.eps["i_9"]]);
  4730. // } else {
  4731. // this.addOneAtk(iid, fiid, "effect", ["i_9", skbuff.eps["i_9"]]);
  4732. // }
  4733. // }
  4734. // this.changeSkBuff(2, fiid, "effect_i_9", 1, this.uuids[fiid].skbuff["effect_i_9"]);
  4735. // }
  4736. // return Math.floor(hit);
  4737. // }
  4738. // // 个人战力差
  4739. // private powerDisparity(iid: string, fiid: string, power?: number, fPower?: number): number {
  4740. // let pct1 = 1;
  4741. // let pct2 = 1;
  4742. // let ilen = iid.length;
  4743. // let flen = fiid.length;
  4744. // if (this.damage[ilen] && this.damage[ilen][flen]) {
  4745. // return this.damage[ilen][flen];
  4746. // }
  4747. // if (this.damage[ilen] == null) {
  4748. // this.damage[ilen] = {};
  4749. // }
  4750. // if (this.damage[flen] == null) {
  4751. // this.damage[flen] = {};
  4752. // }
  4753. // this.damage[ilen][flen] = pct1;
  4754. // this.damage[flen][ilen] = pct2;
  4755. // if (power != null && fPower != null) {
  4756. // if (power == 0 || fPower == 0) {
  4757. // return pct1;
  4758. // }
  4759. // // 战力差
  4760. // let powerC = Math.abs(power - fPower);
  4761. // // 战力比
  4762. // let powerB = Math.min(power, fPower) / Math.max(power, fPower);
  4763. // let index = 1;
  4764. // while (index > 0) {
  4765. // let damage = Gamecfg.userDamage.getItem(index.toString());
  4766. // if (damage != null) {
  4767. // if (
  4768. // damage.zhanlirange[0] <= powerC &&
  4769. // ((damage.zhanlirange.length == 2 && powerC <= damage.zhanlirange[1]) || damage.zhanlirange.length == 1) &&
  4770. // damage.ratio[0] <= powerB &&
  4771. // powerB <= damage.ratio[1]
  4772. // ) {
  4773. // if (power > fPower) {
  4774. // pct1 += damage.xishua;
  4775. // pct2 -= damage.xishub;
  4776. // } else {
  4777. // pct1 -= damage.xishub;
  4778. // pct2 += damage.xishua;
  4779. // }
  4780. // index = -1;
  4781. // } else {
  4782. // index++;
  4783. // }
  4784. // } else {
  4785. // index = -1;
  4786. // }
  4787. // }
  4788. // this.damage[ilen][flen] = pct1;
  4789. // this.damage[flen][ilen] = pct2;
  4790. // }
  4791. // return pct1;
  4792. // }
  4793. // /**
  4794. // * 是否暴击
  4795. // * @param iid
  4796. // * @param fiid
  4797. // * 暴击率=max((我方暴击-敌方抗暴击),暴击保底参数)
  4798. // */
  4799. // private isBaoji(iid: string, fiid: string): number {
  4800. // if (this.teams[iid].type == 3) {
  4801. // return 0;
  4802. // }
  4803. // let isBj: number = 0;
  4804. // let ef_i_24 = this.skbuff_get(iid, "effect_i_24", 2);
  4805. // if (ef_i_24 > 0) {
  4806. // //必定暴击
  4807. // this.skbuff_sub_all(iid, "effect_i_24");
  4808. // isBj = 1;
  4809. // return isBj;
  4810. // }
  4811. // let ef_i_80 = this.skbuff_get(iid, "effect_i_80", 2);
  4812. // let ef_i_80_buff = this.skbuff_get(iid, "i_80_buff");
  4813. // if (ef_i_80 > 0 && this.skbuff_get(fiid, "effect_i_" + ef_i_80_buff, 2) > 0) {
  4814. // //必定暴击
  4815. // this.skbuff_sub_all(iid, "effect_i_80");
  4816. // isBj = 1;
  4817. // return isBj;
  4818. // }
  4819. // let i_baoji: number = this.skbuff_get(iid, "baoji");
  4820. // let f_hsbaoji: number = this.skbuff_get(fiid, "hsbaoji");
  4821. // let bdbaoji: number = 0; //保底暴击
  4822. // let cfg = Gamecfg.userEp.getItem("baoji");
  4823. // if (cfg != null) {
  4824. // bdbaoji = cfg.initEp;
  4825. // }
  4826. // if (this.seedRand.rand(1, 10000) <= Math.max(i_baoji - f_hsbaoji, bdbaoji)) {
  4827. // isBj = 1;
  4828. // }
  4829. // return isBj;
  4830. // }
  4831. // /**
  4832. // * 是否连击 只打一次
  4833. // * @param iid
  4834. // * @param fiid
  4835. // */
  4836. // private isLianji(iid: string, fiid: string): number {
  4837. // if (this.jueFiidHp(iid) <= 0 || this.jueFiidHp(fiid) <= 0) {
  4838. // return 0; //其中一个死了
  4839. // }
  4840. // if (this.teams[iid].type == 3) {
  4841. // return 0;
  4842. // }
  4843. // let isLj: number = 0;
  4844. // let i_lianji: number = this.skbuff_get(iid, "lianji");
  4845. // let f_hslianji: number = this.skbuff_get(fiid, "hslianji");
  4846. // let bdlianji: number = 0; //保底暴击
  4847. // let cfg = Gamecfg.userEp.getItem("lianji");
  4848. // if (cfg != null) {
  4849. // bdlianji = cfg.initEp;
  4850. // }
  4851. // if (this.seedRand.rand(1, 10000) <= i_lianji - f_hslianji) {
  4852. // isLj = 1;
  4853. // }
  4854. // return isLj;
  4855. // }
  4856. // /**
  4857. // * 是否格挡
  4858. // * 敌方格挡率=max((敌方格挡-我方抗格挡),格挡保底参数)
  4859. // * @param iid
  4860. // * @param fiid
  4861. // * 1.敌人如果处于晕眩、冰冻中,则直接不触发格挡,跳过格挡率计算过程
  4862. // * 2.如果敌人处于非晕眩、冰冻中,则按格挡率判断
  4863. // */
  4864. // private isGedang(iid: string, fiid: string): number {
  4865. // if (this.teams[iid].type == 3) {
  4866. // return 0;
  4867. // }
  4868. // let isGd: number = 0;
  4869. // let f_i_3: number = this.skbuff_get(fiid, "effect_i_3", 2);
  4870. // if (f_i_3 > 0) {
  4871. // return isGd;
  4872. // }
  4873. // let f_i_5: number = this.skbuff_get(fiid, "effect_i_5", 2);
  4874. // if (f_i_5 > 0) {
  4875. // return isGd;
  4876. // }
  4877. // let f_block: number = this.skbuff_get(fiid, "block");
  4878. // let i_hsblock: number = this.skbuff_get(iid, "hsblock");
  4879. // let bdGedang: number = 0; //保底格挡
  4880. // let cfg = Gamecfg.userEp.getItem("block");
  4881. // if (cfg != null) {
  4882. // bdGedang = cfg.initEp;
  4883. // }
  4884. // if (this.seedRand.rand(1, 10000) <= Math.max(f_block - i_hsblock, bdGedang)) {
  4885. // isGd = 1;
  4886. // }
  4887. // return isGd;
  4888. // }
  4889. // /**
  4890. // * 是否反击
  4891. // * @param iid
  4892. // * @param fiid
  4893. // * 敌方反击率=max((敌方反击-我方抗反击),反击保底参数)
  4894. // * 1.触犯反击时攻击不能被敌人格挡,必须百分百命中,(也就是说不会被敌人格挡)
  4895. // * 2.触犯反击时攻击不会继续判断是否触发暴击(也就是不会触发暴击)
  4896. // * 3.触发反击时不会触发眩晕、连击、溅射
  4897. // * 4.反击后不能再触发反击
  4898. // */
  4899. // private isFanji(iid: string, fiid: string): number {
  4900. // if (this.jueFiidHp(iid) <= 0 || this.jueFiidHp(fiid) <= 0) {
  4901. // return 0; //其中一个死了
  4902. // }
  4903. // if (this.teams[iid].type == 3 || this.teams[fiid].type == 3) {
  4904. // return 0;
  4905. // }
  4906. // let isfj: number = 0;
  4907. // let i_fanji: number = this.skbuff_get(iid, "fanji");
  4908. // let f_hsfanji: number = this.skbuff_get(fiid, "hsfanji");
  4909. // let bdfanji: number = 0; //保底反击
  4910. // let cfg = Gamecfg.userEp.getItem("fanji");
  4911. // if (cfg != null) {
  4912. // bdfanji = cfg.initEp;
  4913. // }
  4914. // if (this.seedRand.rand(1, 10000) <= Math.max(i_fanji - f_hsfanji, bdfanji)) {
  4915. // isfj = 1;
  4916. // }
  4917. // return isfj;
  4918. // }
  4919. // /**
  4920. // * 增减蓝条
  4921. // * @param fiid
  4922. // * @param num
  4923. // * @returns
  4924. // */
  4925. // private add_mp(fiid: string, num: number, wz: 0 | 1 | 2) {
  4926. // if (this.teams[fiid] == null) {
  4927. // return;
  4928. // }
  4929. // if (Number(fiid) % 100 != 0) {
  4930. // return;
  4931. // }
  4932. // if (this.mpfiids[fiid] == null) {
  4933. // this.mpfiids[fiid] = [0, 0];
  4934. // }
  4935. // if (wz == 0 || wz == 1) {
  4936. // if (this.mpfiids[fiid][wz] == 1) {
  4937. // return;
  4938. // }
  4939. // this.mpfiids[fiid][wz] = 1;
  4940. // }
  4941. // this.teams[fiid].eps["mp"] = Math.max(this.teams[fiid].eps["mp"], 0);
  4942. // this.teams[fiid].eps["mp"] += Math.floor(num);
  4943. // this.teams[fiid].eps["mp"] = Math.min(this.teams[fiid].eps["mp"], 10000);
  4944. // this.addOneAtk(fiid, fiid, "aType", Xys.ActionType.effect);
  4945. // this.addOneAtk(fiid, fiid, "effect", ["mp", num]);
  4946. // }
  4947. // /**
  4948. // * 添加轮询执行脚本
  4949. // */
  4950. // private timer_add(addTimer: timer_add_cs) {
  4951. // if (this.uuids[addTimer.iid] == null) {
  4952. // return; //兼容不存在的人
  4953. // }
  4954. // let cs = gameMethod.objCopy(addTimer.cs);
  4955. // if (cs["timerId"] == null) {
  4956. // cs["timerId"] = this.timerId;
  4957. // }
  4958. // if (addTimer.type[0] == 602) {
  4959. // if (this.uuids[addTimer.iid].timer[addTimer.key] == null) {
  4960. // this.uuids[addTimer.iid].timer[addTimer.key] = {};
  4961. // }
  4962. // if (addTimer.overlayType == 2) {
  4963. // this.uuids[addTimer.iid].timer[addTimer.key] = {}; //换掉原来的
  4964. // }
  4965. // addTimer.key = addTimer.key + "_" + 602;
  4966. // if (this.uuids[addTimer.iid].timer[addTimer.key] == null) {
  4967. // this.uuids[addTimer.iid].timer[addTimer.key] = {};
  4968. // }
  4969. // if (addTimer.overlayType == 2) {
  4970. // this.uuids[addTimer.iid].timer[addTimer.key] = {}; //换掉原来的
  4971. // }
  4972. // this.uuids[addTimer.iid].timer[addTimer.key][cs["timerId"].toString()] = {
  4973. // fiids: addTimer.fiids, //执行触发点
  4974. // type: addTimer.type, //执行触发点
  4975. // func: addTimer.func, //执行的函数名
  4976. // szhen: this.zhen, //触发的帧
  4977. // lzhen: addTimer.lzhen, //轮询执行时间
  4978. // ezhen: addTimer.ezhen, //结束时间
  4979. // skid: addTimer.skid, //技能ID
  4980. // aeid: addTimer.aeid, //效果ID|行为ID
  4981. // cs: cs,
  4982. // };
  4983. // } else {
  4984. // if (this.uuids[addTimer.iid].timer[addTimer.key] == null) {
  4985. // this.uuids[addTimer.iid].timer[addTimer.key] = {};
  4986. // }
  4987. // if (addTimer.overlayType == 2) {
  4988. // this.uuids[addTimer.iid].timer[addTimer.key] = {}; //换掉原来的
  4989. // }
  4990. // this.uuids[addTimer.iid].timer[addTimer.key][cs["timerId"].toString()] = {
  4991. // fiids: addTimer.fiids, //执行触发点
  4992. // type: addTimer.type, //执行触发点
  4993. // func: addTimer.func, //执行的函数名
  4994. // szhen: this.zhen, //触发的帧
  4995. // lzhen: addTimer.lzhen, //轮询执行时间
  4996. // ezhen: addTimer.ezhen, //结束时间
  4997. // skid: addTimer.skid, //技能ID
  4998. // aeid: addTimer.aeid, //效果ID|行为ID
  4999. // cs: cs,
  5000. // };
  5001. // }
  5002. // this.changeTimer(2, addTimer.iid, addTimer.key, 1, this.uuids[addTimer.iid].timer[addTimer.key]);
  5003. // this.timerId += 1;
  5004. // }
  5005. // /**
  5006. // * 删除轮询执行脚本
  5007. // */
  5008. // private timer_sub(fiid: string, key: string) {
  5009. // if (this.uuids[fiid] == null) {
  5010. // return;
  5011. // }
  5012. // this.changeTimer(3, fiid, key);
  5013. // //delete this.uuids[fiid].timer[key];
  5014. // }
  5015. // /**
  5016. // * 删除轮询执行脚本 - 删除某个人的(关于他的定时器)
  5017. // */
  5018. // private timer_sub_by_fiid(fiid: string) {
  5019. // if (this.uuids[fiid] == null) {
  5020. // return;
  5021. // }
  5022. // for (let index = 0; index < this.teamFiids.length; index++) {
  5023. // let iid = this.teamFiids[index];
  5024. // // let keys = Object.keys(this.uuids[iid].timer);
  5025. // let keys = this.changeTimer(1, iid, null, 1);
  5026. // for (let k = 0; k < keys.length; k++) {
  5027. // // let keys2 = Object.keys(this.uuids[iid].timer[keys[k]])
  5028. // let keys2 = this.changeTimer(1, iid, keys[k], 1);
  5029. // for (let j = 0; j < keys2.length; j++) {
  5030. // if (this.uuids[iid].timer[keys[k]][keys2[j]] && this.uuids[iid].timer[keys[k]][keys2[j]].fiids) {
  5031. // let copyFiids: string[] = gameMethod.objCopy(this.uuids[iid].timer[keys[k]][keys2[j]].fiids);
  5032. // this.uuids[iid].timer[keys[k]][keys2[j]].fiids = [];
  5033. // let values = copyFiids;
  5034. // for (let l = 0; l < values.length; l++) {
  5035. // if (values[l] != fiid) {
  5036. // this.uuids[iid].timer[keys[k]][keys2[j]].fiids.push(values[l]);
  5037. // }
  5038. // }
  5039. // if (this.uuids[iid].timer[keys[k]][keys2[j]].fiids.length == 0) {
  5040. // delete this.uuids[iid].timer[keys[k]][keys2[j]];
  5041. // }
  5042. // }
  5043. // }
  5044. // }
  5045. // }
  5046. // this.changeTimer(2, null, null, 1);
  5047. // }
  5048. // /**
  5049. // * 执行轮询执行脚本
  5050. // * @param fiid 执行人
  5051. // * @param type 执行点
  5052. // */
  5053. // private timer_do(_type: number, cs: { [key: string]: number } = {}) {
  5054. // for (let i = 0; i < this.teamFiids.length; i++) {
  5055. // if (this.uuids[this.teamFiids[i]].dzhen > 0 && this.uuids[this.teamFiids[i]].dzhen < this.zhen) {
  5056. // continue; //死了 不应该在触发了
  5057. // }
  5058. // // let keys: string[] = Object.keys(this.uuids[this.teamFiids[i]].timer);
  5059. // let keys: string[] = this.changeTimer(1, this.teamFiids[i], null, 1);
  5060. // for (let k = 0; k < keys.length; k++) {
  5061. // // let timers = Object.values(this.uuids[this.teamFiids[i]].timer[keys[k]]);
  5062. // let timers = this.changeTimer(1, this.teamFiids[i], keys[k], 2);
  5063. // for (let j = 0; j < timers.length; j++) {
  5064. // if (_type != 0 && !timers[j].type.includes(_type)) {
  5065. // continue; //不是这个执行类型的
  5066. // }
  5067. // if (this.zhen < timers[j].szhen || this.zhen > timers[j].ezhen) {
  5068. // continue; //未开始或者过期了
  5069. // }
  5070. // if (this.zhen < timers[j].lzhen || (this.zhen - timers[j].szhen) % timers[j].lzhen > 0) {
  5071. // continue; //没有到当前帧触发
  5072. // }
  5073. // if (timers[j].func == "sk_effect") {
  5074. // if (cs["do_iid"] != Number(this.teamFiids[i])) {
  5075. // let pass: boolean = false;
  5076. // if (pass == false && _type == 404 && cs["do_iid"].toString().length != this.teamFiids[i].length) {
  5077. // pass = true;
  5078. // }
  5079. // if (pass == false && _type == 106 && timers[j].fiids.includes(cs["do_iid"].toString())) {
  5080. // pass = true;
  5081. // }
  5082. // if (pass == false && _type == 206 && cs["do_iid"].toString().length == this.teamFiids[i].length) {
  5083. // pass = true;
  5084. // }
  5085. // if (pass == false) {
  5086. // continue;
  5087. // }
  5088. // }
  5089. // if (this.oneFiids[this.teamFiids[i]] == null) {
  5090. // this.oneFiids[this.teamFiids[i]] = {};
  5091. // }
  5092. // let timer_fiids: string[] = [];
  5093. // let fiids = timers[j].fiids;
  5094. // for (let l = 0; l < fiids.length; l++) {
  5095. // if (this.uuids[fiids[l]]==null ){
  5096. // console.log("fiids===:",fiids)
  5097. // continue;
  5098. // }
  5099. // if (this.uuids[fiids[l]].dzhen > 0 && this.uuids[fiids[l]].dzhen < this.zhen) {
  5100. // continue; //死了 不应该在触发了
  5101. // }
  5102. // timer_fiids.push(fiids[l]);
  5103. // }
  5104. // if (timer_fiids.length <= 0 && timers[j].fiids.length != 0) {
  5105. // // 本身没有目标的定时器 不要跳过
  5106. // continue;
  5107. // }
  5108. // if (_type == 602) {
  5109. // keys[k] = keys[k].slice(0, keys[k].length - 4);
  5110. // }
  5111. // this.oneFiids[this.teamFiids[i]][keys[k]] = timer_fiids;
  5112. // let csCopy = gameMethod.objCopy(timers[j].cs);
  5113. // csCopy = Object.assign(csCopy, cs);
  5114. // if (_type === 601 || _type === 602) {
  5115. // csCopy["isTimer"] = 1;
  5116. // }
  5117. // this.sk_effect(this.teamFiids[i], timers[j].skid, timers[j].aeid, keys[k], csCopy);
  5118. // }
  5119. // }
  5120. // }
  5121. // }
  5122. // }
  5123. // /**
  5124. // * 解锁隐藏
  5125. // */
  5126. // private jiesuo_hide(iid: string) {
  5127. // let minLv: number = 999;
  5128. // let minfiid: string = "";
  5129. // let iidList: string[] = []
  5130. // for (let index = 0; index < this.teamFiids.length; index++) {
  5131. // let fiid = this.teamFiids[index];
  5132. // if (fiid.length != iid.length) {
  5133. // iidList.push(fiid);
  5134. // continue;
  5135. // }
  5136. // if (this.teams[fiid].isHide == 0) {
  5137. // continue;
  5138. // }
  5139. // if (this.teams[fiid].isHide < minLv) {
  5140. // if (minfiid != "") {
  5141. // this.teams[fiid].isHide = minLv;
  5142. // }
  5143. // minLv = this.teams[fiid].isHide;
  5144. // minfiid = fiid;
  5145. // }
  5146. // }
  5147. // if (minfiid != "") {
  5148. // // 清空上一只boss的异常状态
  5149. // for (let i=0;i<iidList.length;i++){
  5150. // for (let k=0;k<this.bateBuff.length;k++){
  5151. // this.skbuff_sub_all(iidList[i],this.bateBuff[k])
  5152. // }
  5153. // }
  5154. // this.teams[minfiid].isHide = 0;
  5155. // this.addOneAtk(minfiid, minfiid, "aType", Xys.ActionType.hide);
  5156. // this.addOneAtk(minfiid, minfiid, "effect", ["isHide", 0]);
  5157. // }
  5158. // }
  5159. // }
  5160. cc._RF.pop();
  5161. }
  5162. if (nodeEnv) {
  5163. __define(__module.exports, __require, __module);
  5164. }
  5165. else {
  5166. __quick_compile_project__.registerModuleFunc(__filename, function () {
  5167. __define(__module.exports, __require, __module);
  5168. });
  5169. }
  5170. })();
  5171. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvY29tbW9uL2ZpZ2h0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdDQUFnQztBQUNoQyxtQ0FBbUM7QUFDbkMsdURBQXVEO0FBRXZELGlCQUFpQjtBQUNqQiw0QkFBNEI7QUFDNUIsMkJBQTJCO0FBQzNCLDJCQUEyQjtBQUMzQiw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLHVEQUF1RDtBQUN2RCwyQkFBMkI7QUFDM0IsMkNBQTJDO0FBQzNDLElBQUk7QUFFSixvQkFBb0I7QUFDcEIsNEJBQTRCO0FBQzVCLDRCQUE0QjtBQUM1Qiw0QkFBNEI7QUFDNUIsNEJBQTRCO0FBQzVCLDRCQUE0QjtBQUM1Qiw0QkFBNEI7QUFDNUIsc0NBQXNDO0FBQ3RDLDJCQUEyQjtBQUMzQiw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLGdDQUFnQztBQUNoQyxJQUFJO0FBRUosMkJBQTJCO0FBQzNCLHlCQUF5QjtBQUN6Qiw4QkFBOEI7QUFDOUIsMkJBQTJCO0FBQzNCLDhCQUE4QjtBQUM5QixnREFBZ0Q7QUFDaEQsOEJBQThCO0FBQzlCLDRCQUE0QjtBQUM1QiwyQkFBMkI7QUFDM0IsZ0NBQWdDO0FBQ2hDLDBDQUEwQztBQUMxQywyQ0FBMkM7QUFDM0MsSUFBSTtBQUVKLHVCQUF1QjtBQUN2Qiw2REFBNkQ7QUFDN0QsbUNBQW1DO0FBQ25DLDJCQUEyQjtBQUMzQixtQ0FBbUM7QUFDbkMsZUFBZTtBQUNmLDJCQUEyQjtBQUMzQiw0Q0FBNEM7QUFDNUMsc0NBQXNDO0FBQ3RDLHNDQUFzQztBQUN0QyxtRUFBbUU7QUFDbkUscUVBQXFFO0FBQ3JFLHFDQUFxQztBQUNyQyx3Q0FBd0M7QUFDeEMscUNBQXFDO0FBQ3JDLDREQUE0RDtBQUM1RCw4Q0FBOEM7QUFFOUMsd0JBQXdCO0FBQ3hCLG1DQUFtQztBQUNuQywyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLDREQUE0RDtBQUM1RCx1QkFBdUI7QUFDdkIsaUJBQWlC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aEIsWUFBWTtBQUNaLCtCQUErQjtBQUMvQixnQ0FBZ0M7QUFDaEMsa0RBQWtEO0FBQ2xELDREQUE0RDtBQUM1RCx1RUFBdUU7QUFDdkUsb0JBQW9CO0FBQ3BCLGdCQUFnQjtBQUNoQiw4Q0FBOEM7QUFDOUMsOEVBQThFO0FBQzlFLHlFQUF5RTtBQUN6RSxZQUFZO0FBQ1osUUFBUTtBQUNSLElBQUkiLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgKiBhcyBYeXMgZnJvbSBcIi4vWHlzXCI7XG4vLyBpbXBvcnQgR2FtZWNmZyBmcm9tIFwiLi9nYW1lQ2ZnXCI7XG4vLyBpbXBvcnQgeyBTZWVkUmFuZCwgZ2FtZU1ldGhvZCB9IGZyb20gXCIuL2dhbWVNZXRob2RcIjtcblxuLy8gLy/ovoXliqnlh73mlbAgLSDmt7vliqDlsZ7mgKflgLxcbi8vIGludGVyZmFjZSBza2J1ZmZfYWRkX2NzIHtcbi8vICAgICBmaWlkOiBzdHJpbmc7IC8v5re75Yqg5a+56LGhXG4vLyAgICAga2V5OiBzdHJpbmc7IC8v5bGe5oCna2V5XG4vLyAgICAgbWluWmhlbjogbnVtYmVyOyAvL+W8gOWni+W4p1xuLy8gICAgIG1heFpoZW46IG51bWJlcjsgLy/nu5PmnZ/luKdcbi8vICAgICBvdmVybGF5VHlwZTogbnVtYmVyOyAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICBjZW5nOiBudW1iZXI7IC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9OyAvL+WxnuaAp1xuLy8gfVxuXG4vLyBpbnRlcmZhY2UgR3poaXQge1xuLy8gICAgIHBnaGl0OiBudW1iZXI7IC8v5pmu5pS75Lyk5a6zXG4vLyAgICAgc2toaXQ6IG51bWJlcjsgLy/mioDog73kvKTlrrNcbi8vICAgICBiamhpdDogbnVtYmVyOyAvL+aatOWHu+S8pOWus1xuLy8gICAgIGdkaGl0OiBudW1iZXI7IC8v5qC85oyh5Lyk5a6zXG4vLyAgICAgZmpoaXQ6IG51bWJlcjsgLy/lj43lh7vkvKTlrrNcbi8vICAgICBsamhpdDogbnVtYmVyOyAvL+i/nuWHu+S8pOWus1xuLy8gICAgIGpzaGl0OiBudW1iZXI7IC8v5rqF5bCE5Lyk5a6zKOayoeacieaKmOaNn+avlOS+i+ezu+aVsClcbi8vICAgICB4eGhpdDogbnVtYmVyOyAvL+WQuOihgOWAvFxuLy8gICAgIHh4UmF0ZTogbnVtYmVyOyAvL+WQuOihgOamgueOh1xuLy8gICAgIGpzUmF0ZTogbnVtYmVyOyAvL+a6heWwhOamgueOh1xuLy8gICAgIGZqc1JhdGU6IG51bWJlcjsgLy/lj43lh7vmuoXlsITmpoLnjodcbi8vIH1cblxuLy8gaW50ZXJmYWNlIHRpbWVyX2FkZF9jcyB7XG4vLyAgICAgaWlkOiBzdHJpbmc7IC8v6Kem5Y+R6ICFXG4vLyAgICAgZmlpZHM6IHN0cmluZ1tdOyAvL+inpuWPkeWvueixoVxuLy8gICAgIGtleTogc3RyaW5nOyAvL+WumuaXtuWZqOagh+ivhlxuLy8gICAgIHR5cGU6IG51bWJlcltdOyAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgIGZ1bmM6IFwic2tfZWZmZWN0XCIgfCBcInNrX2FjdGlvblwiOyAvL+aJp+ihjOeahOWHveaVsOWQjVxuLy8gICAgIGx6aGVuOiBudW1iZXI7IC8v6L2u6K+i5omn6KGM5pe26Ze0XG4vLyAgICAgZXpoZW46IG51bWJlcjsgLy/nu5PmnZ/ml7bpl7Rcbi8vICAgICBza2lkOiBzdHJpbmc7IC8v5oqA6IO9SURcbi8vICAgICBhZWlkOiBzdHJpbmc7IC8v5pWI5p6cSUR86KGM5Li6SURcbi8vICAgICBjczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfTsgLy/lj4LmlbBcbi8vICAgICBvdmVybGF5VHlwZTogbnVtYmVyOyAvLyAx77ya5Y+g5YqgIDLvvJrkuI3lj6DliqDmm7/mjaJcbi8vIH1cblxuLy8gZXhwb3J0IGNsYXNzIEZpZ2h0IHtcbi8vICAgICB0ZWFtczogeyBbaWlkOiBzdHJpbmddOiBYeXMuRmlnaHRUZWFtIH0gPSB7fTsgLy/miJjmlpfmiJDlkZjliJfooahcbi8vICAgICBzZWVkUmFuZDogU2VlZFJhbmQ7IC8v6ZqP5py656eN5a2Q5Ye95pWwXG4vLyAgICAgZnJvbTogc3RyaW5nOyAvL+aImOaWl+exu+Wei1xuLy8gICAgIHRpbWVySWQ6IG51bWJlciA9IDE7IC8v5a6a5pe26K6h5pWw5ZmoXG4vLyAgICAgdXVpZHM6IHtcbi8vICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgZHJhaW5fc2s6IG51bWJlcjsgLy8g5piv5ZCm5bim5pyJ54G15Yqb5pyv5rOVXG4vLyAgICAgICAgICAgICBsYXN0OiBudW1iZXI7IC8v5pyA5ZCO5LiA5qyh5Ye65omL5binXG4vLyAgICAgICAgICAgICBsYXN0MjogbnVtYmVyOyAvL+ecn+ato+WHuuaJi+eahOW4p1xuLy8gICAgICAgICAgICAgY29uczogbnVtYmVyW107IC8v5pS75Ye75qyh5pWwIO+8iOaZrumAmivmioDog73vvIzooqvliqjkuI3nrpfvvIkgW+aUu+WHu+asoeaVsO+8jOi/nuWHu+asoeaVsO+8jOWPjeWHu+asoeaVsF1cbi8vICAgICAgICAgICAgIGZjb25zOiBudW1iZXJbXTsgLy/ooqvmlLvlh7vmrKHmlbAg77yI5pmu6YCaK+aKgOiDve+8jOiiq+WKqOS4jeeul++8iSBb5pS75Ye75qyh5pWw77yM6L+e5Ye75qyh5pWw77yM5Y+N5Ye75qyh5pWwXVxuLy8gICAgICAgICAgICAgZHpoZW46IG51bWJlcjsgLy/mrbvkuqHnmoTluKfmlbBcbi8vICAgICAgICAgICAgIGZwazogc3RyaW5nOyAvL+acgOWQjuS4gOasoeS8pOWus+aIkeeahOWvueixoVxuLy8gICAgICAgICAgICAgaXBrOiBzdHJpbmc7IC8v5oiR5omT55qE5pyA5ZCO5LiA5LiqXG4vLyAgICAgICAgICAgICBpcGtzOiB7IFt6aGVuOiBudW1iZXJdOiBzdHJpbmdbXSB9OyAvL+aIkeaJk+eahOacgOWQjuS4gOS4qlxuLy8gICAgICAgICAgICAgcG9kdW46IHN0cmluZ1tdOyAvL+ebvuayoeacieS6humcgOimgea4hemZpGJ1ZmZcblxuLy8gICAgICAgICAgICAgc2tidWZmOiB7XG4vLyAgICAgICAgICAgICAgICAgW2tleTogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgICAgICAgICBzemhlbjogbnVtYmVyOyAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICBlemhlbjogbnVtYmVyOyAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07IC8v5bGe5oCn5YC8XG4vLyAgICAgICAgICAgICAgICAgfVtdO1xuLy8gICAgICAgICAgICAgfTtcblxuLy8gICAgICAgICAgICAgc2tiYXNlOiB7XG4vLyAgICAgICAgICAgICAgICAgLy/mioDog73op6blj5Fcbi8vICAgICAgICAgICAgICAgICBbYmFzZV9pZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgICAgICAgICBsYXN0OiBudW1iZXI7IC8v5oqA6IO95pyA5ZCO5LiA5qyh5Ye65omL5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBudW1iZXI7XG4vLyAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbl9pZDogc3RyaW5nXToge307XG4vLyAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgICAgIGVmZmVjdDoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgW2VmZmVjdF9pZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdFpoZW46IG51bWJlcjsgLy/op6blj5HmlYjmnpznmoTluKfvvIjmnInml7blgJnlkIzml7bkuIDkuKrmlLvlh7sg5aW95Yeg5Liq5Lq66Kem5Y+R5pWI5p6c5YiG5byA6K6h566X55qEIOS8muWvvOiHtOesrOS4gOS4quS6uuacieinpuWPkSDlkI7pnaLnmoTmsqHmnInop6blj5HvvIlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RFbmRaaGVuOiBudW1iZXI7IC8v5pWI5p6c57uT5p2f5bin546H77yI5oyB57uteOenku+8jOWGt+WNtHjnp5LnlKjnmoTvvIlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Y2Q6IG51bWJlcjsgLy/kuIvkuIDmrKHlhrfljbTlrozmiJDml7bpl7Rcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogbnVtYmVyOyAvL+aJp+ihjOasoeaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGY6IG51bWJlcjsgLy/miafooYzmrKHmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICAgIH07XG5cbi8vICAgICAgICAgICAgIC8v5a6a5pe25omn6KGMIFvmiafooYzop6blj5Hngrks5omn6KGM55qE5Ye95pWw5ZCNLOi9ruivouaJp+ihjOaXtumXtCzmioDog71JRCwg5pWI5p6cSUR86KGM5Li6SURdXG4vLyAgICAgICAgICAgICB0aW1lcjoge1xuLy8gICAgICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHtcbi8vICAgICAgICAgICAgICAgICAgICAgW3RpbWVySWQ6IHN0cmluZ106IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzOiBzdHJpbmdbXTsgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bWJlcltdOyAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogXCJza19lZmZlY3RcIiB8IFwic2tfYWN0aW9uXCI7IC8v5omn6KGM55qE5Ye95pWw5ZCNXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBzemhlbjogbnVtYmVyOyAvL+inpuWPkeeahOW4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbHpoZW46IG51bWJlcjsgLy/ova7or6LmiafooYzml7bpl7Rcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGV6aGVuOiBudW1iZXI7IC8v57uT5p2f5pe26Ze05binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBza2lkOiBzdHJpbmc7IC8v5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGFlaWQ6IHN0cmluZzsgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3M6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07IC8vXG4vLyAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAvL+aJp+ihjOinpuWPkeeCuT0+XG4vLyAgICAgICAgICAgICAvLzE65q+P5bin5byA5aeL5omn6KGMIDLvvJrmiaPooYDmiafooYwgMzrmlLvlh7vlkI7op6blj5EgNOaUu+WHu+WJjeinpuWPkSA15oqk5L2T572h5rCU56C056KO5pe26Kem5Y+RXG4vLyAgICAgICAgICAgICAvLzYgOuW3seaWueWNleS9jeaWveWKoOWHu+mAgOaXtiA3IDrmma7pgJrmlLvlh7vop6blj5EgOOiHqui6q+WPl+WIsOi2hei/h+W9k+WJjeawlOihgDEwJeS7peS4iuS8pOWus+aXtlxuLy8gICAgICAgICAgICAgLy85OuaatOWHu+inpuWPkVxuLy8gICAgICAgICB9O1xuLy8gICAgIH0gPSB7fTsgLy/lrZjmlL7ouqvku71cbi8vICAgICBvYmplY3RzOiB7XG4vLyAgICAgICAgIFtsZW46IHN0cmluZ106IHtcbi8vICAgICAgICAgICAgIFt0eXBlOiBzdHJpbmddOiB7XG4vLyAgICAgICAgICAgICAgICAgLy8g5L2c55So5a+56LGhIDHkuLvop5IgMuW8n+WtkCAz5YW954G1XG4vLyAgICAgICAgICAgICAgICAgW3NraWQ6IHN0cmluZ106IHtcbi8vICAgICAgICAgICAgICAgICAgICAgLy/mioDog73op6blj5Fcbi8vICAgICAgICAgICAgICAgICAgICAgY2Q6IG51bWJlcjsgLy8g5oqA6IO96Kem5Y+RY2Rcbi8vICAgICAgICAgICAgICAgICAgICAgc2tsdjogbnVtYmVyOyAvLyDmioDog73nrYnnuqdcbi8vICAgICAgICAgICAgICAgICAgICAgaWlkczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IG51bWJlcjsgLy/mioDog73mnIDlkI7kuIDmrKHlh7rmiYvluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgIH07XG4vLyAgICAgfSA9IHt9OyAvL+WtmOaUvnVpZOexu+Wei+inpuWPkeaKgOiDvVxuLy8gICAgIHpoZW46IG51bWJlciA9IDA7IC8v5Yid5aeL5binXG5cbi8vICAgICAvL+WNleasoeWHuuaJi+S4tOaXtuiusOW9lVxuLy8gICAgIG9uZUF0azoge1xuLy8gICAgICAgICBbaWlkOiBzdHJpbmddOiB7XG4vLyAgICAgICAgICAgICBbZmlpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgICAgIGFUeXBlOiBYeXMuQWN0aW9uVHlwZTsgLy/miJjmlpfliqjkvZznsbvlnotcbi8vICAgICAgICAgICAgICAgICBhU2tpZDogXCJcIjsgLy/kvb/nlKjnmoTmioDog71JRFxuLy8gICAgICAgICAgICAgICAgIGVmZmVjdDogW3N0cmluZywgbnVtYmVyXVtdOyAvL+inpuWPkeaViOaenCBbIFvlsZ7mgKdrZXks5bGC5pWwXV1cbi8vICAgICAgICAgICAgICAgICBidWZmOiBbc3RyaW5nLCBudW1iZXJdW107IC8v6Kem5Y+R5pWI5p6cIFsgW+WxnuaAp2tleSzmlbDlgLxdXVxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgfTtcbi8vICAgICB9ID0ge307XG4vLyAgICAgb25lQXRraWlkczogc3RyaW5nW10gPSBbXTsgLy/ml6Xlv5fpobrluo9cblxuLy8gICAgIC8v5Y2V5bin5Ye65omL5a+56LGhXG4vLyAgICAgb25lRmlpZHM6IHsgW2lpZDogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9IH0gPSB7fTtcbi8vICAgICBvbmVIaXQ6IHtcbi8vICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgW2ZpaWQ6IHN0cmluZ106IEd6aGl0O1xuLy8gICAgICAgICB9O1xuLy8gICAgIH0gPSB7fTtcbi8vICAgICBvbmVCdWZmOiB7IFtpaWQ6IHN0cmluZ106IG51bWJlciB9ID0ge307IC8v5a2Y5YKo5b2T5YmN5binIOacieaUueWPmGJ1ZmbnmoTop5LoibJJRFxuLy8gICAgIG1wZmlpZHM6IHsgW2lpZDogc3RyaW5nXTogW251bWJlciwgbnVtYmVyXSB9ID0ge307IC8vIOWNleW4p01Q5oyH5Zue5aSN5LiA5qyhXG4vLyAgICAganNGaWlkczogeyBbaWlkOiBzdHJpbmddOiB7IFtmaWlkOiBzdHJpbmddOiBudW1iZXIgfSB9ID0ge307IC8v5rqF5bCEXG5cbi8vICAgICAvL+WtmOWCqOaJgOacieaImOWcuuaXpeW/l1xuLy8gICAgIG91dGY6IFh5cy5PdmVyQmFjayA9IHtcbi8vICAgICAgICAgd2luOiAwLCAvLzDlpLHotKUgMeiDnOWIqVxuLy8gICAgICAgICBzdGFydDoge1xuLy8gICAgICAgICAgICAgLy/liJ3lp4vpmLXlrrlcbi8vICAgICAgICAgICAgIGZyb206IFwiXCIsIC8v5oiY5paX57G75Z6LXG4vLyAgICAgICAgICAgICBzZWVkOiAwLCAvL+maj+acuuenjeWtkFxuLy8gICAgICAgICAgICAgdGVhbXM6IHt9LFxuLy8gICAgICAgICAgICAgcG93ZXI6IDAsXG4vLyAgICAgICAgICAgICBmUG93ZXI6IDAsXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIGxvZzoge30sIC8v5oiY5paX5pel5b+X5YiX6KGoXG4vLyAgICAgICAgIGh1cnQ6IDAsXG4vLyAgICAgICAgIGhwOiAwLCAvL+aImOaWl+e7k+adnyDlr7nmiYvliankvZnooYDph49cbi8vICAgICAgICAgdG9uZ2ppOiB7fSxcbi8vICAgICAgICAgeGhpZDpcIlwiXG4vLyAgICAgfTtcblxuLy8gICAgIC8v6KGA6YeP5Y+Y5YyW55u45YWz5a2X5q61XG4vLyAgICAgeHVla3U6IHN0cmluZ1tdID0gW1wiaHBcIiwgXCJiYW9qaVwiLCBcImxpYW5qaVwiLCBcImZhbmppXCIsIFwiY2FuYmVhdGJhY2tcIl07XG4vLyAgICAgLy8g5YeP55uKYnVmZlxuLy8gICAgIGJhdGVCdWZmOiBzdHJpbmdbXSA9IFtcImVmZmVjdF9pXzFcIiwgXCJlZmZlY3RfaV8zXCIsIFwiZWZmZWN0X2lfNFwiLCBcImVmZmVjdF9pXzVcIiwgXCJlZmZlY3RfaV82XCIsIFwiZWZmZWN0X2lfN1wiXTtcbi8vICAgICB0ZWFtRmlpZHM6IHN0cmluZ1tdID0gW107XG5cbi8vICAgICBza0J1ZmY6IHtcbi8vICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAga2V5OiBhbnk7XG4vLyAgICAgICAgICAgICB2YWx1ZTogYW55O1xuLy8gICAgICAgICAgICAgYnVmZjoge1xuLy8gICAgICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHtcbi8vICAgICAgICAgICAgICAgICAgICAga2V5OiBhbnk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBhbnk7XG4vLyAgICAgICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgIH07XG4vLyAgICAgfSA9IHt9O1xuLy8gICAgIHNrVGltZXI6IHtcbi8vICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAga2V5OiBhbnk7XG4vLyAgICAgICAgICAgICB2YWx1ZTogYW55O1xuLy8gICAgICAgICAgICAgdGltZXI6IHtcbi8vICAgICAgICAgICAgICAgICBba2V5OiBzdHJpbmddOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGtleTogYW55O1xuLy8gICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYW55O1xuLy8gICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICB9O1xuLy8gICAgICAgICB9O1xuLy8gICAgIH0gPSB7fTtcbi8vICAgICBkYW1hZ2U6IHtcbi8vICAgICAgICAgW2lpZDogc3RyaW5nXToge1xuLy8gICAgICAgICAgICAgW2ZpaWQ6IHN0cmluZ106IG51bWJlcjtcbi8vICAgICAgICAgfTtcbi8vICAgICB9ID0ge307XG5cbi8vICAgICBjb25zdHJ1Y3RvcihmaWdodFN0YXJ0OiBYeXMuQWN0RmlnaHRTdGFydCkge1xuLy8gICAgICAgICB0aGlzLnBvd2VyRGlzcGFyaXR5KFwiMTAwMFwiLCBcIjEwMFwiLCBmaWdodFN0YXJ0LnBvd2VyLCBmaWdodFN0YXJ0LmZQb3dlcik7XG4vLyAgICAgICAgIHRoaXMub3V0Zi5zdGFydCA9IGdhbWVNZXRob2Qub2JqQ29weShmaWdodFN0YXJ0KTtcbi8vICAgICAgICAgdGhpcy50ZWFtcyA9IGdhbWVNZXRob2Qub2JqQ29weShmaWdodFN0YXJ0LnRlYW1zKTsgLy/miJjmlpfmiJDlkZjliJfooahcbi8vICAgICAgICAgdGhpcy5zZWVkUmFuZCA9IG5ldyBTZWVkUmFuZChmaWdodFN0YXJ0LnNlZWQpOyAvL+maj+acuuenjeWtkFxuLy8gICAgICAgICB0aGlzLmZyb20gPSBmaWdodFN0YXJ0LmZyb207IC8v5oiY5paX57G75Z6LXG4vLyAgICAgICAgIHRoaXMudGVhbUZpaWRzID0gT2JqZWN0LmtleXModGhpcy50ZWFtcyk7XG4vLyAgICAgICAgIHRoaXMud2FyX2luaXQoKTtcbi8vICAgICAgICAgdGhpcy53YXJfbG9vcCgpO1xuLy8gICAgIH1cbi8vICAgICAvKlxuLy8gICAgICAqIOaKgOiDvWJ1ZmZcbi8vICAgICAgKiB0aGlzLnV1aWRzW2NzLmZpaWRdLnNrYnVmZltjcy5rZXldXG4vLyAgICAgICogKi9cbi8vICAgICBwcml2YXRlIGNoYW5nZVNrQnVmZihzVHlwZTogbnVtYmVyLCBpaWQ/OiBzdHJpbmcgfCBudWxsLCBrZXk/OiBzdHJpbmcgfCBudWxsLCB0eXBlOiBudW1iZXIgPSAxLCBkYXRhPzogYW55KSB7XG4vLyAgICAgICAgIHN3aXRjaCAoc1R5cGUpIHtcbi8vICAgICAgICAgICAgIGNhc2UgMTogLy8g5p+l6K+iIHR5cGXvvJoxLmtleXMgMi52YWx1ZXNcbi8vICAgICAgICAgICAgICAgICBpZiAoaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNrQnVmZih0eXBlLCBpaWQsIGtleSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgY2FzZSAyOiAvLyDmm7TmlrAv5paw5aKeIHR5cGXvvJoxLuabv+aNoiAyLuWPoOWKoFxuLy8gICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2tCdWZmKGRhdGEsIGlpZCwga2V5LCB0eXBlKTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICBjYXNlIDM6IC8vIOWIoOmZpFxuLy8gICAgICAgICAgICAgICAgIGlmIChpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxTa0J1ZmYoaWlkLCBrZXkpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgfVxuLy8gICAgIH1cbi8vICAgICBwcml2YXRlIHNldFNrQnVmZihkYXRhOiBhbnksIGlpZD86IHN0cmluZyB8IG51bGwsIGtleT86IHN0cmluZyB8IG51bGwsIHR5cGU6IG51bWJlciA9IDEpIHtcbi8vICAgICAgICAgaWYgKGlpZCAmJiBrZXkpIHtcbi8vICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tidWZmW2tleV0gPSBkYXRhO1xuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYnVmZltrZXldID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYnVmZltrZXldID0gW107XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2J1ZmZba2V5XS5wdXNoKC4uLmRhdGEpO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgYnVmZjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmICh0aGlzLnNrQnVmZltpaWRdLmJ1ZmZba2V5XSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS5idWZmW2tleV0gPSB7IGtleTogW10sIHZhbHVlOiBbXSB9O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGtleXMyID0gT2JqZWN0LmtleXModGhpcy51dWlkc1tpaWRdLnNrYnVmZik7XG4vLyAgICAgICAgICAgICBsZXQgdmFsdWVzMiA9IE9iamVjdC52YWx1ZXModGhpcy51dWlkc1tpaWRdLnNrYnVmZik7XG4vLyAgICAgICAgICAgICB0aGlzLnNrQnVmZltpaWRdLmtleSA9IGtleXMyO1xuLy8gICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS52YWx1ZSA9IHZhbHVlczI7XG4vLyAgICAgICAgICAgICB0aGlzLnNrQnVmZltpaWRdLmJ1ZmZba2V5XS5rZXkgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0uc2tidWZmW2tleV0pO1xuLy8gICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS5idWZmW2tleV0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbaWlkXS5za2J1ZmZba2V5XSk7XG4vLyAgICAgICAgIH0gZWxzZSBpZiAoaWlkICYmICFrZXkpIHtcbi8vICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tidWZmID0gZGF0YTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrQnVmZltpaWRdID0geyBrZXk6IFtdLCB2YWx1ZTogW10sIGJ1ZmY6IHt9IH07XG4vLyAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2J1ZmYgPSBPYmplY3QuYXNzaWduKHRoaXMudXVpZHNbaWlkXS5za2J1ZmYsIGRhdGEpO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgYnVmZjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBrZXlzMiA9IE9iamVjdC5rZXlzKHRoaXMudXVpZHNbaWlkXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgbGV0IHZhbHVlczIgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbaWlkXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS5rZXkgPSBrZXlzMjtcbi8vICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0udmFsdWUgPSB2YWx1ZXMyO1xuLy8gICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzMi5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrQnVmZltpaWRdLmJ1ZmZba2V5czJba11dID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS5idWZmW2tleXMyW2tdXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdIH07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0uYnVmZltrZXlzMltrXV0ua2V5ID0gT2JqZWN0LmtleXModGhpcy51dWlkc1tpaWRdLnNrYnVmZltrZXlzMltrXV0pO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0uYnVmZltrZXlzMltrXV0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbaWlkXS5za2J1ZmZba2V5czJba11dKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfSBlbHNlIGlmICghaWlkICYmICFrZXkgJiYgZGF0YSkge1xuLy8gICAgICAgICAgICAgbGV0IGtleXMgPSB0aGlzLnRlYW1GaWlkcztcbi8vICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIGxldCBrZXlzMiA9IE9iamVjdC5rZXlzKHRoaXMudXVpZHNba2V5c1tpXV0uc2tidWZmKTtcbi8vICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzMiA9IE9iamVjdC52YWx1ZXModGhpcy51dWlkc1trZXlzW2ldXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrQnVmZltrZXlzW2ldXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2tleXNbaV1dID0geyBrZXk6IFtdLCB2YWx1ZTogW10sIGJ1ZmY6IHt9IH07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2tleXNbaV1dLmtleSA9IGtleXMyO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2tleXNbaV1dLnZhbHVlID0gdmFsdWVzMjtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMyLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrQnVmZltrZXlzW2ldXS5idWZmW2tleXMyW2tdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrQnVmZltrZXlzW2ldXS5idWZmW2tleXMyW2tdXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdIH07XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za0J1ZmZba2V5c1tpXV0uYnVmZltrZXlzMltrXV0ua2V5ID0gT2JqZWN0LmtleXModGhpcy51dWlkc1trZXlzW2ldXS5za2J1ZmZba2V5czJba11dKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za0J1ZmZba2V5c1tpXV0uYnVmZltrZXlzMltrXV0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNba2V5c1tpXV0uc2tidWZmW2tleXMyW2tdXSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuLy8gICAgIHByaXZhdGUgZGVsU2tCdWZmKGlpZDogc3RyaW5nLCBrZXk/OiBzdHJpbmcgfCBudWxsKSB7XG4vLyAgICAgICAgIGlmIChpaWQgJiYga2V5KSB7XG4vLyAgICAgICAgICAgICBkZWxldGUgdGhpcy51dWlkc1tpaWRdLnNrYnVmZltrZXldO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgYnVmZjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNrQnVmZltpaWRdLmJ1ZmZba2V5XTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0ua2V5ID0gT2JqZWN0LmtleXModGhpcy51dWlkc1tpaWRdLnNrYnVmZik7XG4vLyAgICAgICAgICAgICB0aGlzLnNrQnVmZltpaWRdLnZhbHVlID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW2lpZF0uc2tidWZmKTtcbi8vICAgICAgICAgfSBlbHNlIGlmIChpaWQgJiYgIWtleSkge1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgYnVmZjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2J1ZmYgPSB7fTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0uYnVmZiA9IHt9O1xuLy8gICAgICAgICAgICAgdGhpcy5za0J1ZmZbaWlkXS5rZXkgPSBbXTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tCdWZmW2lpZF0udmFsdWUgPSBbXTtcbi8vICAgICAgICAgfVxuLy8gICAgIH1cbi8vICAgICBwcml2YXRlIGdldFNrQnVmZih0eXBlOiBudW1iZXIsIGlpZDogc3RyaW5nLCBrZXk/OiBzdHJpbmcgfCBudWxsKSB7XG4vLyAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgIGlmIChpaWQgJiYga2V5KSB7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gJiYgdGhpcy5za0J1ZmZbaWlkXS5idWZmW2tleV0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tCdWZmW2lpZF0uYnVmZltrZXldLmtleTtcbi8vICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfSBlbHNlIGlmIChpaWQpIHtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy5za0J1ZmZbaWlkXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5za0J1ZmZbaWlkXS5rZXk7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgIGlmIChpaWQgJiYga2V5KSB7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tCdWZmW2lpZF0gJiYgdGhpcy5za0J1ZmZbaWlkXS5idWZmW2tleV0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tCdWZmW2lpZF0uYnVmZltrZXldLnZhbHVlO1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9IGVsc2UgaWYgKGlpZCkge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrQnVmZltpaWRdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNrQnVmZltpaWRdLnZhbHVlO1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgLypcbi8vICAgICAgKiDlrprml7blmah0aW1lclxuLy8gICAgICAqIHRoaXMudXVpZHNbaWlkXS50aW1lcltrZXldXG4vLyAgICAgICogKi9cbi8vICAgICBwcml2YXRlIGNoYW5nZVRpbWVyKHNUeXBlOiBudW1iZXIsIGlpZD86IHN0cmluZyB8IG51bGwsIGtleT86IHN0cmluZyB8IG51bGwsIHR5cGU6IG51bWJlciA9IDEsIGRhdGE/OiBhbnkpIHtcbi8vICAgICAgICAgc3dpdGNoIChzVHlwZSkge1xuLy8gICAgICAgICAgICAgY2FzZSAxOiAvLyDmn6Xor6IgdHlwZe+8mjEua2V5cyAyLnZhbHVlc1xuLy8gICAgICAgICAgICAgICAgIGlmIChpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGltZXIodHlwZSwgaWlkLCBrZXkpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgIGNhc2UgMjogLy8g5pu05pawL+aWsOWiniB0eXBl77yaMS7mm7/mjaIgMi7lj6DliqBcbi8vICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRpbWVyKGRhdGEsIGlpZCwga2V5LCB0eXBlKTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICBjYXNlIDM6IC8vIOWIoOmZpFxuLy8gICAgICAgICAgICAgICAgIGlmIChpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxUaW1lcihpaWQsIGtleSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICB9XG4vLyAgICAgfVxuLy8gICAgIHByaXZhdGUgc2V0VGltZXIoZGF0YTogYW55LCBpaWQ/OiBzdHJpbmcgfCBudWxsLCBrZXk/OiBzdHJpbmcgfCBudWxsLCB0eXBlOiBudW1iZXIgPSAxKSB7XG4vLyAgICAgICAgIGlmIChpaWQgJiYga2V5KSB7XG4vLyAgICAgICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleV0gPSBkYXRhO1xuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5XSA9IHt9O1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5XSA9IE9iamVjdC5hc3NpZ24odGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleV0sIGRhdGEpO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tUaW1lcltpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdLCB0aW1lcjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldID0geyBrZXk6IFtdLCB2YWx1ZTogW10gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBrZXlzMiA9IE9iamVjdC5rZXlzKHRoaXMudXVpZHNbaWlkXS50aW1lcik7XG4vLyAgICAgICAgICAgICBsZXQgdmFsdWVzMiA9IE9iamVjdC52YWx1ZXModGhpcy51dWlkc1tpaWRdLnRpbWVyKTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdLmtleSA9IGtleXMyO1xuLy8gICAgICAgICAgICAgdGhpcy5za1RpbWVyW2lpZF0udmFsdWUgPSB2YWx1ZXMyO1xuLy8gICAgICAgICAgICAgdGhpcy5za1RpbWVyW2lpZF0udGltZXJba2V5XS5rZXkgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5XSk7XG4vLyAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldLnZhbHVlID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5XSk7XG4vLyAgICAgICAgIH0gZWxzZSBpZiAoaWlkICYmICFrZXkpIHtcbi8vICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXIgPSBkYXRhO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdID0geyBrZXk6IFtdLCB2YWx1ZTogW10sIHRpbWVyOiB7fSB9O1xuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXIgPSBPYmplY3QuYXNzaWduKHRoaXMudXVpZHNbaWlkXS50aW1lciwgZGF0YSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy5za1RpbWVyW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdID0geyBrZXk6IFtdLCB2YWx1ZTogW10sIHRpbWVyOiB7fSB9O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGtleXMyID0gT2JqZWN0LmtleXModGhpcy51dWlkc1tpaWRdLnRpbWVyKTtcbi8vICAgICAgICAgICAgIGxldCB2YWx1ZXMyID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW2lpZF0udGltZXIpO1xuLy8gICAgICAgICAgICAgdGhpcy5za1RpbWVyW2lpZF0ua2V5ID0ga2V5czI7XG4vLyAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS52YWx1ZSA9IHZhbHVlczI7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMyLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleXMyW2tdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleXMyW2tdXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdIH07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleXMyW2tdXS5rZXkgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5czJba11dKTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXlzMltrXV0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbaWlkXS50aW1lcltrZXlzMltrXV0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9IGVsc2UgaWYgKCFpaWQgJiYgIWtleSAmJiBkYXRhKSB7XG4vLyAgICAgICAgICAgICBsZXQga2V5cyA9IHRoaXMudGVhbUZpaWRzO1xuLy8gICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGtleXMyID0gT2JqZWN0LmtleXModGhpcy51dWlkc1trZXlzW2ldXS50aW1lcik7XG4vLyAgICAgICAgICAgICAgICAgbGV0IHZhbHVlczIgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNba2V5c1tpXV0udGltZXIpO1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJba2V5c1tpXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJba2V5c1tpXV0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgdGltZXI6IHt9IH07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltrZXlzW2ldXS5rZXkgPSBrZXlzMjtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJba2V5c1tpXV0udmFsdWUgPSB2YWx1ZXMyO1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5czIubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tUaW1lcltrZXlzW2ldXS50aW1lcltrZXlzMltrXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za1RpbWVyW2tleXNbaV1dLnRpbWVyW2tleXMyW2tdXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdIH07XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za1RpbWVyW2tleXNbaV1dLnRpbWVyW2tleXMyW2tdXS5rZXkgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2tleXNbaV1dLnRpbWVyW2tleXMyW2tdXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltrZXlzW2ldXS50aW1lcltrZXlzMltrXV0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNba2V5c1tpXV0udGltZXJba2V5czJba11dKTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgcHJpdmF0ZSBkZWxUaW1lcihpaWQ6IHN0cmluZywga2V5Pzogc3RyaW5nIHwgbnVsbCkge1xuLy8gICAgICAgICBpZiAoaWlkICYmIGtleSkge1xuLy8gICAgICAgICAgICAgZGVsZXRlIHRoaXMudXVpZHNbaWlkXS50aW1lcltrZXldO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tUaW1lcltpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXSA9IHsga2V5OiBbXSwgdmFsdWU6IFtdLCB0aW1lcjoge30gfTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXSAmJiB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldKSB7XG4vLyAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleV07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS5rZXkgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0udGltZXIpO1xuLy8gICAgICAgICAgICAgdGhpcy5za1RpbWVyW2lpZF0udmFsdWUgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbaWlkXS50aW1lcik7XG4vLyAgICAgICAgIH0gZWxzZSBpZiAoaWlkICYmICFrZXkpIHtcbi8vICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5za1RpbWVyW2lpZF0gPSB7IGtleTogW10sIHZhbHVlOiBbXSwgdGltZXI6IHt9IH07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXIgPSB7fTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyID0ge307XG4vLyAgICAgICAgICAgICB0aGlzLnNrVGltZXJbaWlkXS5rZXkgPSBbXTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tUaW1lcltpaWRdLnZhbHVlID0gW107XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgcHJpdmF0ZSBnZXRUaW1lcih0eXBlOiBudW1iZXIsIGlpZDogc3RyaW5nLCBrZXk/OiBzdHJpbmcgfCBudWxsKSB7XG4vLyAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgIGlmIChpaWQgJiYga2V5KSB7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tUaW1lcltpaWRdICYmIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleV0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tUaW1lcltpaWRdLnRpbWVyW2tleV0ua2V5O1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9IGVsc2UgaWYgKGlpZCkge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5za1RpbWVyW2lpZF0ua2V5O1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICBpZiAoaWlkICYmIGtleSkge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXSAmJiB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNrVGltZXJbaWlkXS50aW1lcltrZXldLnZhbHVlO1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9IGVsc2UgaWYgKGlpZCkge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNrVGltZXJbaWlkXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5za1RpbWVyW2lpZF0udmFsdWU7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWIneWni+WMluaImOaWl1xuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgd2FyX2luaXQoKSB7XG4vLyAgICAgICAgIHRoaXMuemhlbiA9IDE7XG4vLyAgICAgICAgIGxldCBtaW5MYXN0OiBudW1iZXIgPSA5OTk5OTtcblxuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICBsZXQgZmlpZCA9IHRoaXMudGVhbUZpaWRzW2luZGV4XTtcbi8vICAgICAgICAgICAgIC8v5Yid5aeL5YyWIOi/memHjGlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICBsZXQgbGFzdCA9IE1hdGguY2VpbCgzMCAvICh0aGlzLnRlYW1zW2ZpaWRdLmVwcy5zcGVlZCAvIDEwMDAwKSk7XG4vLyAgICAgICAgICAgICBtaW5MYXN0ID0gTWF0aC5taW4obWluTGFzdCwgbGFzdCk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBtaW5MYXN0ID0gLTEgKiAobWluTGFzdCAtIDUpOyAvLyDmnIDlv6vnmoTpgqPkuKrkurrku47nrKzkupTluKflvIDlp4vmiZNcbi8vICAgICAgICAgLy/liJ3lp4vljJblrZjlgqhcbi8vICAgICAgICAgbGV0IGRyYWluX3NrOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICBsZXQgZmlpZCA9IHRoaXMudGVhbUZpaWRzW2luZGV4XTtcbi8vICAgICAgICAgICAgIGlmIChkcmFpbl9zayA9PSAwICYmIFtcIjEwMFwiLCBcIjEwMDBcIl0uaW5jbHVkZXMoZmlpZCkpIHtcbi8vICAgICAgICAgICAgICAgICBkcmFpbl9zayA9IDE7ICAgLy8g55u05o6l6YO95Y+v5Lul5YqgXG4vLyAgICAgICAgICAgICAgICAgLypsZXQgc2tpZHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy50ZWFtc1tmaWlkXS5zayk7XG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNraWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgc2tfYmFzZSA9IEdhbWVjZmcuc2tpbGxCYXNlLmdldEl0ZW0oc2tpZHNbaW5kZXhdLCBcIjFcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChza19iYXNlICYmIHNrX2Jhc2UuZHJhaW4gPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBkcmFpbl9zayA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH0qL1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgLy/liJ3lp4vljJYg6L+Z6YeMaW7msqHlhbPns7tcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgZHJhaW5fc2s6IGRyYWluX3NrLFxuLy8gICAgICAgICAgICAgICAgIGxhc3Q6IG1pbkxhc3QsXG4vLyAgICAgICAgICAgICAgICAgbGFzdDI6IDAsXG4vLyAgICAgICAgICAgICAgICAgY29uczogWzAsIDAsIDBdLFxuLy8gICAgICAgICAgICAgICAgIGZjb25zOiBbMCwgMCwgMF0sXG4vLyAgICAgICAgICAgICAgICAgcG9kdW46IFtdLFxuLy8gICAgICAgICAgICAgICAgIHNrYnVmZjoge30sXG4vLyAgICAgICAgICAgICAgICAgc2tiYXNlOiB7fSxcbi8vICAgICAgICAgICAgICAgICBmcGs6IFwiXCIsXG4vLyAgICAgICAgICAgICAgICAgaXBrOiBcIlwiLCAvL+aIkeaJk+eahOacgOWQjuS4gOS4qlxuLy8gICAgICAgICAgICAgICAgIGlwa3M6IHt9LCAvL+aIkeaJk+eahOacgOWQjuS4gOS4qlxuLy8gICAgICAgICAgICAgICAgIGR6aGVuOiAwLFxuLy8gICAgICAgICAgICAgICAgIHRpbWVyOiB7fSxcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDlvIDlp4vmiJjmlpdcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHdhcl9sb29wKCkge1xuLy8gICAgICAgICB0aGlzLm91dGYud2luID0gMDtcbi8vICAgICAgICAgd2hpbGUgKHRoaXMuemhlbiA8IDEzNTApIHtcbi8vICAgICAgICAgICAgIHRoaXMub3V0Zi5sb2dbdGhpcy56aGVuXSA9IFtdO1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVBdGtpaWRzID0gW107XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUF0ayA9IHt9O1xuLy8gICAgICAgICAgICAgdGhpcy5tcGZpaWRzID0ge307XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUZpaWRzID0ge307IC8v5LiK5LiA5bin55qE5a+55omL5riF56m6XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUhpdCA9IHt9OyAvL+S4iuS4gOW4p+eahOS8pOWus+a4heepulxuLy8gICAgICAgICAgICAgdGhpcy5vbmVCdWZmID0ge307IC8v5riF6Zmk5LiK5LiA5bin55qE5Y+Y5YqoYnVmZueahGZpaWRcbi8vICAgICAgICAgICAgIHRoaXMuanNGaWlkcyA9IHt9O1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMuemhlbiA9PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/op6blj5Hov5vlhaXmiJjmlpfmioDog71cbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfYmFzZU9ialJ1bjQodGhpcy50ZWFtRmlpZHNbaV0pOyAvL+aKgOiDvei9rOaNolxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfYmFzZSh0aGlzLnRlYW1GaWlkc1tpXSwgNCk7IC8v5oqA6IO96Kem5Y+RXG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIC8v54G15Yqb5ruh5oCS5pe26YeK5pS+XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbXCIxMDBcIl0gIT0gbnVsbCAmJiB0aGlzLnRlYW1zW1wiMTAwXCJdLmVwcy5tcCA+PSAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5za19iYXNlKFwiMTAwXCIsIDMpOyAvL+aKgOiDveinpuWPkVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KXsgICAgLy8g5oqA6IO96YeK5pS+5oiQ5Yqf5omN5omj5oCS5rCUXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZF9tcChcIjEwMFwiLCAtMTAwMDAsIDIpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW1wiMTAwMFwiXSAhPSBudWxsICYmIHRoaXMudGVhbXNbXCIxMDAwXCJdLmVwcy5tcCA+PSAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5za19iYXNlKFwiMTAwMFwiLCAzKTsgLy/mioDog73op6blj5Fcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCl7ICAgIC8vIOaKgOiDvemHiuaUvuaIkOWKn+aJjeaJo+aAkuawlFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRfbXAoXCIxMDAwXCIsIC0xMDAwMCwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy56aGVuID09IDIpe1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy50ZWFtc1t0aGlzLnRlYW1GaWlkc1tpXV0udHlwZSA9PSA0IHx8IHRoaXMudGVhbXNbdGhpcy50ZWFtRmlpZHNbaV1dLnR5cGUgPT0gNSl7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2Jhc2UodGhpcy50ZWFtRmlpZHNbaV0sIDEpOyAvL2Jvc3Plkoznp5jlooPmgKrkvJjlhYjlh7rmiYvkuIDmrKFcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMucGtfemhlbl9idWZmKCk7IC8v5LiA5bin5YmNXG5cbi8vICAgICAgICAgICAgIC8vIGlmKHRoaXMuemhlbiA9PSAxNTAgJiYgdGhpcy50ZWFtc1tcIjEwMDJcIl0gIT0gbnVsbCl7XG4vLyAgICAgICAgICAgICAvLyAgICAgdGhpcy5qaWVzdW9faGlkZShcIjEwMDJcIilcbi8vICAgICAgICAgICAgIC8vICAgICB0aGlzLnRlYW1zW1wiMTAwMlwiXS5pc0hpZGUgPSAwXG4vLyAgICAgICAgICAgICAvLyB9XG4vLyAgICAgICAgICAgICB0aGlzLnBrX3poZW5fYXRrKCk7IC8v5LiA5bin5LitXG5cbi8vICAgICAgICAgICAgIHRoaXMucGtfemhlbl9vdmVyKCk7IC8v5LiA5bin5ZCOXG4vLyAgICAgICAgICAgICB0aGlzLmp1ZVN1YW5PbmVBdGsoKTtcblxuLy8gICAgICAgICAgICAgLy/ovpPlh7pidWZmXG4vLyAgICAgICAgICAgICB0aGlzLnNrYnVmZl9vdXRmKCk7XG4vLyAgICAgICAgICAgICB0aGlzLmp1ZVN1YW5PbmVBdGsoKTtcblxuLy8gICAgICAgICAgICAgLy/liKDpmaTnqbrnmb3ml6Xlv5dcbi8vICAgICAgICAgICAgIGlmICh0aGlzLm91dGYubG9nW3RoaXMuemhlbl0ubGVuZ3RoID09IDApIHtcbi8vICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vdXRmLmxvZ1t0aGlzLnpoZW5dO1xuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvL+WIpOaWreiDnOi0n1xuLy8gICAgICAgICAgICAgbGV0IG1mY291bnQ6IG51bWJlciA9IDA7IC8v5oiR5pa55rS7552A55qE5Lq65pWwXG4vLyAgICAgICAgICAgICBsZXQgZmNvdW50OiBudW1iZXIgPSAwOyAvL+aIkeaWuea0u+edgOeahOS6uuaVsFxuLy8gICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgICAgIGxldCBmaWlkID0gdGhpcy50ZWFtRmlpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgICAgIC8v6L+Z6YeM55SoaW4g5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0udHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+WFveeBteS4jeiuoeWFpeiDnOi0n+iuoeeul1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS50eXBlID09IDQgJiYgTnVtYmVyKGZpaWQpICUgMTAwID09IDAgJiYgdGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPD0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBmY291bnQgPSAwOyAvLyDlpoLmnpzmmK/miZNib3Nz55qEIGJvc3PmrbvkuobmiJjmlpfnu5PmnZ8g6IOc5YipXG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoTWF0aC5mbG9vcihOdW1iZXIoZmlpZCkgLyAxMDApID49IDEwICYmICh0aGlzLnRlYW1zW2ZpaWRdLmVwcy5ocCA+IDAgfHwgdGhpcy5za2J1ZmZfZ2V0KGZpaWQsXCJlZmZlY3RfaV82M1wiLDIpID4gMCkpIHsvLyDov5jlj6/ku6XlpI3mtLtcbi8vICAgICAgICAgICAgICAgICAgICAgbWZjb3VudCArPSAxO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoTWF0aC5mbG9vcihOdW1iZXIoZmlpZCkgLyAxMDApIDwgMTAgJiYgKHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwID4gMCB8fCB0aGlzLnNrYnVmZl9nZXQoZmlpZCxcImVmZmVjdF9pXzYzXCIsMikgPiAwKSkgeyAgLy8g6L+Y5Y+v5Lul5aSN5rS7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZjb3VudCArPSAxO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmIChtZmNvdW50IDwgMSkge1xuLy8gICAgICAgICAgICAgICAgIHJldHVybjsgLy/ovpPkuoZcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmIChmY291bnQgPCAxKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5vdXRmLndpbiA9IDE7IC8v6LWi5LqGXG4vLyAgICAgICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICB0aGlzLnpoZW4rKztcbi8vICAgICAgICAgfVxuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWHuuaJiyjliY0pXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBwa196aGVuX2J1ZmYoKSB7XG4vLyAgICAgICAgIC8v5a6a5pe25omn6KGMXG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1t0aGlzLnRlYW1GaWlkc1tpXV0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg2MDEsIHsgZG9faWlkOiBOdW1iZXIodGhpcy50ZWFtRmlpZHNbaV0pIH0pOyAvL+avj+W4p+ajgOa1i1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg2MDIsIHsgZG9faWlkOiBOdW1iZXIodGhpcy50ZWFtRmlpZHNbaV0pIH0pOyAvL+avj+W4p+ajgOa1i1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1t0aGlzLnRlYW1GaWlkc1tpXV0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbdGhpcy50ZWFtRmlpZHNbaV1dLmVwcy5ocCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6L+Y5rKh5rS7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUZpaWRzW3RoaXMudGVhbUZpaWRzW2ldXSA9IHt9OyAvL+WIneWni+WMluWQhOS4qmlpZFxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog5Ye65omLKOS4rSlcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHBrX3poZW5fYXRrKCkge1xuLy8gICAgICAgICBsZXQgaWlkOiBzdHJpbmc7XG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgIGlpZCA9IHRoaXMudGVhbUZpaWRzW2ldO1xuLy8gICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLnRlYW1zW2lpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy5wa196aGVuX2F0a19vbmUoaWlkKTtcbi8vICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1Yl9hbGwoaWlkLCBcImVmZmVjdF9pXzc1XCIpO1xuLy8gICAgICAgICAgICAgLy8g5b+r5YmR5Y2w6K6w5Y676ZmkXG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfMTkgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzE5XCIsIDIpO1xuLy8gICAgICAgICAgICAgaWYgKGVmZl9pXzE5ID4gMCAmJiB0aGlzLnV1aWRzW2lpZF0ubGFzdDIgKyA3ICogMzAgPD0gdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgLy8g5oul5pyJ5Y2w6K6wIOW5tuS4lOW3sue7jzfnp5LmsqHmnInlh7rmiYtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZCwgXCJlZmZlY3RfaV8xOVwiKTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZCwgXCJlZmZlY3RfaV8yM1wiKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIC8vIOWkjea0u2J1ZmZcbi8vICAgICAgICAgICAgIGxldCBlZmZfaV8zNiA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfMzZcIiwgMik7XG4vLyAgICAgICAgICAgICBpZiAoZWZmX2lfMzYgPiAwICYmIHRoaXMuc2tidWZmX2dldChpaWQsIFwiaV8zNl9uWmhlblwiKSA8PSB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICAvLyDlpI3mtLtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImlfMzZcIildKTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZCwgXCJlZmZlY3RfaV8zNlwiKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMuanVlU3Vhbk9uZUF0aygpO1xuLy8gICAgICAgICB9XG4vLyAgICAgfVxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWHuuaJiyjkuK0pIC0g5LiA5Liq5Lq65Ye65omLXG4vLyAgICAgICogQHBhcmFtIGlpZCDlh7rmiYvkurpcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHBrX3poZW5fYXRrX29uZShpaWQ6IHN0cmluZykge1xuLy8gICAgICAgICBpZiAodGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJocFwiKSA8PSAwKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47IC8v6L+Y5rKh5rS7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSGl0KGlpZCkpIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy8g5LmZ5pa56YO95q275LqGIOWFveeBteS4jeiDveaUu+WHu1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBpX3NwZWVkOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInNwZWVkXCIpO1xuLy8gICAgICAgICBpX3NwZWVkID0gaV9zcGVlZCA+IDUwMDAwID8gNTAwMDAgOiBpX3NwZWVkO1xuLy8gICAgICAgICBsZXQgbGFzdCA9IE1hdGguY2VpbCgzMCAvIChpX3NwZWVkIC8gMTAwMDApKTtcbi8vICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5sYXN0ICsgbGFzdCA+IHRoaXMuemhlbikge1xuLy8gICAgICAgICAgICAgcmV0dXJuOyAvL+S4jeaYr+W9k+WJjeW4p1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIC8vIHRoaXMudXVpZHNbaWlkXS5sYXN0ICs9IGxhc3Q7IHRvZG8g6L+Z6YeM5LiN6KaB5omT5byAIOaUu+WHu+mikeeOh+S8muaciemXrumimFxuLy8gICAgICAgICB0aGlzLnNrX2Jhc2UoaWlkLCAxKTsgLy/mioDog73op6blj5FcblxuLy8gICAgICAgICAvL+eBteWKm+a7oeaAkuaXtumHiuaUvlxuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tcIjEwMFwiXSAhPSBudWxsICYmIHRoaXMudGVhbXNbXCIxMDBcIl0uZXBzLm1wID49IDEwMDAwKSB7XG4vLyAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5za19iYXNlKFwiMTAwXCIsIDMpOyAvL+aKgOiDveinpuWPkVxuLy8gICAgICAgICAgICAgaWYgKHJlc3VsdCl7ICAgIC8vIOaKgOiDvemHiuaUvuaIkOWKn+aJjeaJo+aAkuawlFxuLy8gICAgICAgICAgICAgICAgIHRoaXMuanVlU3Vhbk9uZUF0aygpXG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRfbXAoXCIxMDBcIiwgLTEwMDAwLCAyKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tcIjEwMDBcIl0gIT0gbnVsbCAmJiB0aGlzLnRlYW1zW1wiMTAwMFwiXS5lcHMubXAgPj0gMTAwMDApIHtcbi8vICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnNrX2Jhc2UoXCIxMDAwXCIsIDMpOyAvL+aKgOiDveinpuWPkVxuLy8gICAgICAgICAgICAgaWYgKHJlc3VsdCl7ICAgIC8vIOaKgOiDvemHiuaUvuaIkOWKn+aJjeaJo+aAkuawlFxuLy8gICAgICAgICAgICAgICAgIHRoaXMuanVlU3Vhbk9uZUF0aygpXG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRfbXAoXCIxMDAwXCIsIC0xMDAwMCwgMik7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICAvKlxuLy8gICAgICAqIOS4u+inkuW8n+WtkOmDveatu+S6hiDlhb3ngbXkuI3og73mlLvlh7tcbi8vICAgICAgKiAqL1xuLy8gICAgIHByaXZhdGUgY2hlY2tIaXQoaWlkOiBzdHJpbmcpIHtcbi8vICAgICAgICAgaWYgKHBhcnNlSW50KGlpZCkgJSAxMDAgIT0gMTApIHtcbi8vICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBjb3VudCA9IDA7XG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1GaWlkc1tpXSAhPSBpaWQgJiYgdGhpcy50ZWFtRmlpZHNbaV0ubGVuZ3RoID09IGlpZC5sZW5ndGggJiYgIXRoaXMudXVpZHNbdGhpcy50ZWFtRmlpZHNbaV1dLmR6aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgY291bnQrKztcbi8vICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAoIWNvdW50KSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgICAgICAgfVxuLy8gICAgIH1cbi8vICAgICAvKipcbi8vICAgICAgKiDop6blj5HkuIDmrKHkvKTlrrNcbi8vICAgICAgKiBAcGFyYW0gaWlkIOaUu+WHu+iAhVxuLy8gICAgICAqIEBwYXJhbSBmaWlkIOiiq+aJk+iAhVxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgc2tfYWN0aW9uX3R5cGVfMShpaWQ6IHN0cmluZywgZmlpZDogc3RyaW5nLCBza2lkOiBzdHJpbmcsIGFjSWQ6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4ge307IC8v6ZqQ6JePXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGNmZ0FjID0gR2FtZWNmZy5za2lsbEFjdGlvbi5nZXRJdGVtKGFjSWQpO1xuLy8gICAgICAgICBpZiAoY2ZnQWMgPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIHt9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLm9uZUhpdFtpaWRdID09IG51bGwgfHwgdGhpcy5vbmVIaXRbaWlkXVtmaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4ge307XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGNmZ1NrID0gR2FtZWNmZy5za2lsbEJhc2UuZ2V0SXRlbShza2lkLCBcIjFcIik7XG4vLyAgICAgICAgIGlmIChjZmdTayA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4ge307IC8v5rKh5pyJ6L+Z5Liq5oqA6IO9ICDmiJbogIUg6L+Z5Liq5oqA6IO955qE6Kem5Y+R5pe25py65LiN5a+5XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBsZXQgaml0dWlhcnI6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTsgLy/lh7vpgIBcbi8vICAgICAgICAgaWYgKGNmZ0FjLmFyZ3NbXCJzXCJdICE9IG51bGwgJiYgdGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBjZmdBYy5hcmdzW1wicFwiXSAqIDEwMDAwKSB7XG4vLyAgICAgICAgICAgICBqaXR1aWFyciA9IFtcImppdHVpXCIsIGNmZ0FjLmFyZ3NbXCJzXCJdXTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmF0ayk7XG4vLyAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFTa2lkXCIsIHNraWQpO1xuXG4vLyAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uZnBrID0gaWlkOyAvL+iusOW9leacgOWQjuS4gOasoeaJk+S8pOaIkeeahOS6ulxuLy8gICAgICAgICB0aGlzLnV1aWRzW2lpZF0uaXBrID0gZmlpZDtcbi8vICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5pcGtzW3RoaXMuemhlbl0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLmlwa3NbdGhpcy56aGVuXSA9IFtdO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5pcGtzW3RoaXMuemhlbl0ucHVzaChmaWlkKTtcbi8vICAgICAgICAgdGhpcy51dWlkc1tpaWRdLmxhc3QyID0gdGhpcy56aGVuO1xuXG4vLyAgICAgICAgIGxldCBtYWluX2lpZCA9IGlpZC5sZW5ndGggPiAzID8gXCIxMDAwXCIgOiBcIjEwMFwiO1xuLy8gICAgICAgICBpZiAoTnVtYmVyKGlpZCkgJSAxMDAgPCAxMCAmJiB0aGlzLnV1aWRzW21haW5faWlkXSAmJiB0aGlzLnV1aWRzW21haW5faWlkXS5kcmFpbl9zayA+IDApIHtcbi8vICAgICAgICAgICAgIGxldCBjZmdNYXRoID0gR2FtZWNmZy5tYXRoSW5mby5nZXRJdGVtKFwiYmF0dGxlX2xpbmdsaVwiKTtcbi8vICAgICAgICAgICAgIGlmIChjZmdNYXRoICE9IG51bGwgJiYgY2ZnTWF0aC5wcmFtLml0ZW1zICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgbGxtaW4gPSBjZmdNYXRoLnByYW0uaXRlbXNbMV1bMF07XG4vLyAgICAgICAgICAgICAgICAgbGV0IGxsTWF4ID0gY2ZnTWF0aC5wcmFtLml0ZW1zWzFdWzFdO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuYWRkX21wKG1haW5faWlkLCB0aGlzLnNlZWRSYW5kLnJhbmQobGxtaW4sIGxsTWF4KSwgMik7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICB0aGlzLnRpbWVyX2RvKDEwNiwgeyBkb19paWQ6IE51bWJlcihmaWlkKSB9KTsgLy/ooqvmiZPliY3op6blj5Fcbi8vICAgICAgICAgdGhpcy50aW1lcl9kbygyMDksIHsgZG9faWlkOiBOdW1iZXIoaWlkKSB9KTsgLy/mlLvlh7vnu5PnrpfliY3op6blj5Fcbi8vICAgICAgICAgLy/lkITnp43kvKTlrrPorqHnrpdcbi8vICAgICAgICAgbGV0IGd6aGl0ID0gdGhpcy5vbmVIaXRbaWlkXVtmaWlkXTtcblxuLy8gICAgICAgICBsZXQgaGl0OiBudW1iZXIgPSBnemhpdC5wZ2hpdDsgLy/mgLvkvKTlrrNcbi8vICAgICAgICAgaWYgKGNmZ1NrLnNraWxsVHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICBoaXQgPSBnemhpdC5za2hpdDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAoY2ZnU2suZHJhaW4gPiAwKSB7XG4vLyAgICAgICAgICAgICAvLyDmnK/ms5XkvKTlrrPlop7liqBcbi8vICAgICAgICAgICAgIGxldCBpXzczID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzczXCIpO1xuLy8gICAgICAgICAgICAgbGV0IGlfcWhtaWZhID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJxaG1pZmFcIik7XG4vLyAgICAgICAgICAgICBsZXQgZl9yaG1pZmEgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJyaG1pZmFcIik7XG4vLyAgICAgICAgICAgICBoaXQgKz0gTWF0aC5mbG9vcihoaXQgKiAoKGlfNzMgKyBpX3FobWlmYSAtIGZfcmhtaWZhKSAvIDEwMDAwKSk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBsZXQgcmVzdWx0ID0geyBkb19paWQ6IE51bWJlcihmaWlkKSwgaGl0OiAwIH07XG4vLyAgICAgICAgIC8vIOaUu+WHuyAgPeOAi1xuLy8gICAgICAgICAvLyDjgIsg5Yik5a6a6L+e5Ye777yI6ZyA6KaB5Yik5a6a5pyJ5rKh5pyJ6Kem5Y+R5pq05Ye777yJICB8ICAg5Yik5a6a5rqF5bCE77yI6ZyA6KaB5Yik5a6a5pyJ5rKh5pyJ6Kem5Y+R5pq05Ye777yJXG4vLyAgICAgICAgIC8vIOOAi+ayoeeUqOi/nuWHuyDmsqHnlKjmuoXlsIQgICAgPeOAiyDliKTlrprmmrTlh7tcbi8vICAgICAgICAgLy8g44CLIOWmguaenOayoeacieaatOWHuyAg5omN5pivIOaZrumAmuaUu+WHu1xuLy8gICAgICAgICAvLyB8IOWQuOihgFxuXG4vLyAgICAgICAgIC8vIOOAi+iiq+aJkyAgICDmoLzmjKEgIHwgIOWPjeWHu++8iOa6heWwhO+8iOmcgOimgeWIpOWumuacieayoeacieinpuWPkeaatOWHu++8iSAgIOWmguaenOayoeaciea6heWwhOaJjeWIpOWumuaatOWHuyAg77yJICDmsqHmnInmmrTlh7sg5bCx5piv5pmu6YCa5pS75Ye7ICArIOWQuOihgFxuXG4vLyAgICAgICAgIC8vIOWPjeWHu+iiq+aJk+eahOS5n+imgeWIpOWumiDmoLzmjKFcbi8vICAgICAgICAgLy8g57uT5p2f5LqGXG5cbi8vICAgICAgICAgLy8g5piv5ZCm6L+e5Ye7XG4vLyAgICAgICAgIGxldCBpc2xqOiBudW1iZXIgPSB0aGlzLmlzTGlhbmppKGlpZCwgZmlpZCk7XG4vLyAgICAgICAgIGxldCBpc05leHQ6IG51bWJlciA9IDA7IC8vMOm7mOiupCAx5YGc5q2iICAy5bey57uP6Kem5Y+R5pq05Ye7XG4vLyAgICAgICAgIGlmIChpc2xqKSB7XG4vLyAgICAgICAgICAgICBpc05leHQgPSAxO1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLmNvbnNbMV0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uZmNvbnNbMV0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcbi8vICAgICAgICAgICAgIC8vIOaYr+WQpuaatOWHu1xuLy8gICAgICAgICAgICAgbGV0IGlzQmo6IG51bWJlciA9IHRoaXMuaXNCYW9qaShpaWQsIGZpaWQpO1xuLy8gICAgICAgICAgICAgaWYgKGlzQmopIHtcbi8vICAgICAgICAgICAgICAgICBpc05leHQgPSAyO1xuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgaXNHZCA9IHRoaXMuaXNHZWRhbmcoaWlkLCBmaWlkKTsgLy8g6L+e5Ye75qC85oyhXG4vLyAgICAgICAgICAgICAgICAgaGl0ID0gZ3poaXQubGpoaXQ7XG4vLyAgICAgICAgICAgICAgICAgaWYgKGlzR2QpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJibG9ja1wiLCAxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGhpdCAtPSBnemhpdC5nZGhpdDtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaGl0ID0gdGhpcy5oaXRfbGFzdChpaWQsIGZpaWQsIGhpdCk7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJsaWFuamlcIiwgLTEgKiBoaXRdLmNvbmNhdChqaXR1aWFyciksIHNraWQpO1xuLy8gICAgICAgICAgICAgICAgIHJlc3VsdC5oaXQgKz0gaGl0O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/mmK/lkKbmuoXlsIRcbi8vICAgICAgICAgbGV0IGlzSnMgPSB0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApIDw9IGd6aGl0LmpzUmF0ZTtcbi8vICAgICAgICAgaWYgKGlzSnMpIHtcbi8vICAgICAgICAgICAgIGlzTmV4dCA9IDE7XG4vLyAgICAgICAgICAgICBsZXQgaXNCajogbnVtYmVyID0gdGhpcy5pc0Jhb2ppKGlpZCwgZmlpZCk7XG4vLyAgICAgICAgICAgICBpZiAoaXNCaikge1xuLy8gICAgICAgICAgICAgICAgIGlzTmV4dCA9IDI7XG4vLyAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgIC8vIOa6heWwhOS8pOWus+WinuWKoFxuLy8gICAgICAgICAgICAgICAgIGxldCBpXzgxID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzgxXCIpO1xuLy8gICAgICAgICAgICAgICAgIGlmIChpXzgxICE9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaGl0ID0gTWF0aC5mbG9vcihoaXQgKiAoaV84MSAvIDEwMDAwICsgMSkpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBsZXQgaXNHZCA9IHRoaXMuaXNHZWRhbmcoaWlkLCBmaWlkKTsgLy8g6L+e5Ye75qC85oyhXG4vLyAgICAgICAgICAgICAgICAgaWYgKGlzR2QpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJibG9ja1wiLCAxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGhpdCAtPSBnemhpdC5nZGhpdDtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaGl0ID0gdGhpcy5oaXRfbGFzdChpaWQsIGZpaWQsIGhpdCk7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCAtMSAqIGhpdF0sIHNraWQpO1xuXG4vLyAgICAgICAgICAgICAgICAgbGV0IGpzeGlzaHU6IG51bWJlcltdID0gWzEsIDAuNzUsIDAuNywgMC41OCwgMC41XTtcbi8vICAgICAgICAgICAgICAgICBsZXQganNmaWlkcyA9IHRoaXMuZmluZF9qaWFuc2VfZmlpZChmaWlkLCBjZmdBYy5kaXN0YW5jZSk7XG5cbi8vICAgICAgICAgICAgICAgICBsZXQgYWxsSGl0OiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgICAgIGxldCBtYXhMZW4gPSBNYXRoLm1pbihqc2ZpaWRzLmxlbmd0aCwganN4aXNodS5sZW5ndGgpO1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtYXhMZW47IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGpzZmlpZHNbaW5kZXhdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChpXzgxICE9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGhpdCA9IE1hdGguZmxvb3IoaGl0ICogKGlfODEgLyAxMDAwMCArIDEpKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBoaXQgPSBNYXRoLmZsb29yKGd6aGl0LmpzaGl0ICoganN4aXNodVttYXhMZW4gLSAxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBpc0dkID0gdGhpcy5pc0dlZGFuZyhpaWQsIGpzZmlpZHNbaW5kZXhdKTsgLy8g6L+e5Ye75qC85oyhXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGpzZmlpZHNbaW5kZXhdLCBcImVmZmVjdFwiLCBbXCJibG9ja1wiLCAxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBoaXQgLT0gZ3poaXQuZ2RoaXQ7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaGl0ID0gdGhpcy5oaXRfbGFzdChpaWQsIGpzZmlpZHNbaW5kZXhdLCBoaXQpO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGpzZmlpZHNbaW5kZXhdLCBcImVmZmVjdFwiLCBbXCJqaWFuc2hlXCIsIC0xICogaGl0XS5jb25jYXQoaml0dWlhcnIpKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19iYXNlKGpzZmlpZHNbaW5kZXhdLCAyLCB7IGhpdDogaGl0IH0pOyAvL+iiq+aUu+WHu1xuLy8gICAgICAgICAgICAgICAgICAgICBhbGxIaXQgKz0gaGl0O1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDIwNSwgeyBkb19paWQ6IE51bWJlcihpaWQpLCBoaXQ6IGFsbEhpdCB9KTsgLy/muoXlsITop6blj5Fcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5Yik5a6a5piv5ZCm5pq05Ye7XG4vLyAgICAgICAgIGlmIChpc05leHQgPT0gMCkge1xuLy8gICAgICAgICAgICAgbGV0IGlzQmo6IG51bWJlciA9IHRoaXMuaXNCYW9qaShpaWQsIGZpaWQpO1xuLy8gICAgICAgICAgICAgaWYgKGlzQmopIHtcbi8vICAgICAgICAgICAgICAgICBpc05leHQgPSAyO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/mmrTlh7tcbi8vICAgICAgICAgaWYgKGlzTmV4dCA9PSAyKSB7XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uY29uc1swXSArPSAxOyAvL+iusOW9leaUu+WHu+asoeaVsFxuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5mY29uc1swXSArPSAxOyAvL+iusOW9leaUu+WHu+asoeaVsFxuXG4vLyAgICAgICAgICAgICBsZXQgaXNHZCA9IHRoaXMuaXNHZWRhbmcoaWlkLCBmaWlkKTsgLy8g6L+e5Ye75qC85oyhXG4vLyAgICAgICAgICAgICBpZiAoaXNHZCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiYmxvY2tcIiwgMV0pO1xuLy8gICAgICAgICAgICAgICAgIGhpdCAtPSBnemhpdC5nZGhpdDtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGhpdCA9IHRoaXMuaGl0X2xhc3QoaWlkLCBmaWlkLCBnemhpdC5iamhpdCk7XG4vLyAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImJhb2ppXCIsIC0xICogaGl0XS5jb25jYXQoaml0dWlhcnIpLCBza2lkKTtcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMjAzLCB7IGRvX2lpZDogTnVtYmVyKGlpZCksIGhpdDogaGl0LCBpc0JqOiBoaXQgfSk7IC8v5pq05Ye76Kem5Y+RXG4vLyAgICAgICAgICAgICByZXN1bHQuaGl0ICs9IGhpdDtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5pmu6YCa5pS75Ye7XG4vLyAgICAgICAgIGlmIChpc05leHQgPT0gMCkge1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLmNvbnNbMF0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uZmNvbnNbMF0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcbi8vICAgICAgICAgICAgIGxldCBpc0dkID0gdGhpcy5pc0dlZGFuZyhpaWQsIGZpaWQpOyAvLyDov57lh7vmoLzmjKFcbi8vICAgICAgICAgICAgIGlmIChpc0dkKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJibG9ja1wiLCAxXSk7XG4vLyAgICAgICAgICAgICAgICAgaGl0IC09IGd6aGl0LmdkaGl0O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaGl0ID0gdGhpcy5oaXRfbGFzdChpaWQsIGZpaWQsIGd6aGl0LnBnaGl0KTtcbi8vICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgLTEgKiBoaXRdLmNvbmNhdChqaXR1aWFyciksIHNraWQpO1xuLy8gICAgICAgICAgICAgLy90aGlzLnRpbWVyX2RvKDIwMywgeyBkb19paWQ6IE51bWJlcihpaWQpLCBoaXQ6IGhpdCwgaXNCajogaGl0IH0pOyAvL+aatOWHu+inpuWPkVxuLy8gICAgICAgICAgICAgcmVzdWx0LmhpdCArPSBoaXQ7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+aYr+WQpuWQuOihgFxuLy8gICAgICAgICBpZiAoZ3poaXQueHhoaXQgPiAwKSB7XG4vLyAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgZ3poaXQueHhoaXRdKTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGlmIChjZmdTay5za2lsbFR5cGUgPT0gMykge1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygyMDcsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSwgaGl0OiByZXN1bHQuaGl0IH0pOyAvL+aKgOiDveinpuWPkVxuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygxMDIsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCksIGhpdDogcmVzdWx0LmhpdCB9KTsgLy/ooqvmiZPop6blj5Eo5oqA6IO9KVxuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygyMDEsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSwgaGl0OiByZXN1bHQuaGl0IH0pOyAvL+aZrumAmuaUu+WHu+inpuWPkVxuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygxMDMsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCksIGhpdDogcmVzdWx0LmhpdCB9KTsgLy/ooqvmiZPop6blj5Eo5pmu6YCaKVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmIChjZmdTay5kcmFpbiA+IDApIHtcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMjA4LCB7IGRvX2lpZDogTnVtYmVyKGlpZCksIGhpdDogcmVzdWx0LmhpdCB9KTsgLy/mnK/ms5Xop6blj5Fcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8vIOinpuWPkei/nuWHu2J1ZmZcbi8vICAgICAgICAgaWYgKGlzbGopIHtcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMjAyLCB7IGRvX2lpZDogTnVtYmVyKGlpZCksIGhpdDogcmVzdWx0LmhpdCB9KTsgLy/ov57lh7vop6blj5Fcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMTAxLCB7IGRvX2lpZDogTnVtYmVyKGZpaWQpLCBoaXQ6IHJlc3VsdC5oaXQgfSk7IC8v6L+e5Ye76Kem5Y+RIOiiq+aJk1xuLy8gICAgICAgICAgICAgdGhpcy5za19iYXNlKGlpZCwgOSwgeyBoaXQ6IHJlc3VsdC5oaXQgfSk7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy8g6Kem5Y+R5pq05Ye7YnVmZlxuLy8gICAgICAgICBpZiAoaXNOZXh0ID09IDIpIHtcbi8vICAgICAgICAgICAgIHRoaXMuc2tfYmFzZShpaWQsIDEwLCB7IGhpdDogcmVzdWx0LmhpdCB9KTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICB0aGlzLnNrX2Jhc2UoZmlpZCwgMiwgeyBoaXQ6IHJlc3VsdC5oaXQgfSk7IC8v6KKr5pS75Ye7XG5cbi8vICAgICAgICAgLy/lj43lh7tcbi8vICAgICAgICAgdGhpcy5za19hY3Rpb25fdHlwZV8xX2ZhbmppKGZpaWQsIGlpZCwgZ3poaXQpO1xuXG4vLyAgICAgICAgIHJldHVybiByZXN1bHQ7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6Kem5Y+R5LiA5qyh5Y+N5Ye7XG4vLyAgICAgICogQHBhcmFtIGlpZCDmlLvlh7vogIVcbi8vICAgICAgKiBAcGFyYW0gZmlpZCDooqvmiZPogIVcbi8vICAgICAgKiBAcGFyYW0gaGl0XG4vLyAgICAgICogQHBhcmFtIGNzXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza19hY3Rpb25fdHlwZV8xX2ZhbmppKGlpZDogc3RyaW5nLCBmaWlkOiBzdHJpbmcsIGd6aGl0OiBHemhpdCkge1xuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tpaWRdLnR5cGUgPT0gMyB8fCB0aGlzLnRlYW1zW2ZpaWRdLnR5cGUgPT0gMykge1xuLy8gICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLmp1ZUZpaWRIcChmaWlkKTw9MCl7ICAgLy8g5q275LqG5LiN6IO95Y+N5Ye7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy8g6KKr5omT55qE5piv5ZCm6KKr5Yaw5Ya7XG4vLyAgICAgICAgIGxldCBlZmZfaV8zID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV8zXCIsIDIpO1xuLy8gICAgICAgICBpZiAoZWZmX2lfMyA+IDApIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy/mmZXnnKlcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgZWZmX2lfNSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfNVwiLCAyKTtcbi8vICAgICAgICAgaWYgKGVmZl9pXzUgPiAwKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47IC8v5Yaw5Ya7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGlzTmV4dDogbnVtYmVyID0gMDsgLy8w5YGc5q2iICAx57un57utIDLmmrTlh7tcbi8vICAgICAgICAgLy/mioDog73lj43lh7tcbi8vICAgICAgICAgbGV0IGNiYmFjayA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiY2FuYmVhdGJhY2tcIiwgMik7XG4vLyAgICAgICAgIGlmIChjYmJhY2sgPiAwKSB7XG4vLyAgICAgICAgICAgICBpc05leHQgPSAxO1xuLy8gICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViKGlpZCwgXCJjYW5iZWF0YmFja1wiKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgaXNFcGZqOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBpZiAoaXNOZXh0ID09IDApIHtcbi8vICAgICAgICAgICAgIC8v6Kem5Y+R5Y+N5Ye7XG4vLyAgICAgICAgICAgICBsZXQgaXNmajogbnVtYmVyID0gdGhpcy5pc0ZhbmppKGlpZCwgZmlpZCk7XG4vLyAgICAgICAgICAgICBpZiAoaXNmaikge1xuLy8gICAgICAgICAgICAgICAgIGlzTmV4dCA9IDE7XG4vLyAgICAgICAgICAgICAgICAgaXNFcGZqID0gMTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAoaXNOZXh0ID09IDApIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5om+5Ye65Y+N5Ye76ICF55qE5pmu6YCa5pS75Ye7XG4vLyAgICAgICAgIGxldCBwc2tpZDogc3RyaW5nID0gXCJcIjtcbi8vICAgICAgICAgbGV0IGFja2lkOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBsZXQgc2tpZHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy50ZWFtc1tpaWRdLnNrKTtcbi8vICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNraWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgbGV0IGNmZ1NrID0gR2FtZWNmZy5za2lsbEJhc2UuZ2V0SXRlbShza2lkc1tpbmRleF0sIFwiMVwiKTtcbi8vICAgICAgICAgICAgIGlmIChjZmdTayAhPSBudWxsICYmIGNmZ1NrLnNraWxsVHlwZSA9PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgcHNraWQgPSBza2lkc1tpbmRleF07XG4vLyAgICAgICAgICAgICAgICAgYWNraWQgPSBjZmdTay5hY3Rpb25zWzBdO1xuLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmIChwc2tpZCA9PSBcIlwiKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5mYW5qaSk7XG4vLyAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFTa2lkXCIsIHBza2lkKTtcblxuLy8gICAgICAgICB0aGlzLnV1aWRzW2lpZF0uY29uc1syXSArPSAxO1xuLy8gICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLmZjb25zWzJdICs9IDE7XG5cbi8vICAgICAgICAgLy/kvKTlrrNcbi8vICAgICAgICAgbGV0IGhpdCA9IGd6aGl0LmZqaGl0O1xuLy8gICAgICAgICBsZXQgaV9yaGJsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInJoYmxvY2tcIik7XG5cbi8vICAgICAgICAgLy/mmK/lkKbmuoXlsIRcbi8vICAgICAgICAgbGV0IGlzSnMgPSB0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApIDw9IGd6aGl0LmZqc1JhdGU7XG4vLyAgICAgICAgIGlmIChpc0pzKSB7XG4vLyAgICAgICAgICAgICBsZXQgaXNCajogbnVtYmVyID0gdGhpcy5pc0Jhb2ppKGlpZCwgZmlpZCk7XG4vLyAgICAgICAgICAgICBpZiAoaXNCaikge1xuLy8gICAgICAgICAgICAgICAgIGlzTmV4dCA9IDI7XG4vLyAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgIC8vIOa6heWwhOS8pOWus+WinuWKoFxuLy8gICAgICAgICAgICAgICAgIGxldCBpXzgxID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzgxXCIpO1xuLy8gICAgICAgICAgICAgICAgIGlmIChpXzgxICE9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaGl0ID0gTWF0aC5mbG9vcihoaXQgKiAoaV84MSAvIDEwMDAwICsgMSkpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBsZXQgaXNHZCA9IHRoaXMuaXNHZWRhbmcoaWlkLCBmaWlkKTsgLy8g6L+e5Ye75qC85oyhXG4vLyAgICAgICAgICAgICAgICAgaWYgKGlzR2QpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJibG9ja1wiLCAxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIC8v5qC85oyh5Lyk5a6zPVx0TUlOKOaKgOiDveS8pOWusyooTUFYKOaVjOaWueagvOaMoeWinuW8ui3miJHmlrnmoLzmjKHlh4/lvLEsMC4xMikpLOaKgOiDveS8pOWusyowLjkpXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX3FoYmxvY2s6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcInFoYmxvY2tcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmZ2RfaGl0OiBudW1iZXIgPSBNYXRoLm1pbihnemhpdC5mamhpdCAqIE1hdGgubWF4KDAuMTIsIChmX3FoYmxvY2sgLSBpX3JoYmxvY2spIC8gMTAwMDApLCBnemhpdC5mamhpdCAqIDAuOSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGhpdCAtPSBNYXRoLmZsb29yKGZnZF9oaXQpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBoaXQgPSB0aGlzLmhpdF9sYXN0KGlpZCwgZmlpZCwgaGl0KTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImZhbmppXCIsIC0xICogaGl0XSwgcHNraWQpO1xuXG4vLyAgICAgICAgICAgICAgICAgbGV0IGpzeGlzaHU6IG51bWJlcltdID0gWzEsIDAuNzUsIDAuNywgMC41OCwgMC41XTtcblxuLy8gICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgaWYgKGFja2lkICE9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ0FjID0gR2FtZWNmZy5za2lsbEFjdGlvbi5nZXRJdGVtKGFja2lkLnRvU3RyaW5nKCkpO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnQWMgIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBjZmdBYy5kaXN0YW5jZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBsZXQganNmaWlkcyA9IHRoaXMuZmluZF9qaWFuc2VfZmlpZChmaWlkLCBkaXN0YW5jZSk7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGFsbEhpdDogbnVtYmVyID0gMDtcbi8vICAgICAgICAgICAgICAgICBsZXQgbWF4TGVuID0gTWF0aC5taW4oanNmaWlkcy5sZW5ndGgsIGpzeGlzaHUubGVuZ3RoKTtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWF4TGVuOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChqc2ZpaWRzW2luZGV4XSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoaV84MSAhPSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBoaXQgPSBNYXRoLmZsb29yKGhpdCAqIChpXzgxIC8gMTAwMDAgKyAxKSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaGl0ID0gTWF0aC5mbG9vcihnemhpdC5qc2hpdCAqIGpzeGlzaHVbbWF4TGVuIC0gMV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaXNHZCA9IHRoaXMuaXNHZWRhbmcoaWlkLCBqc2ZpaWRzW2luZGV4XSk7IC8vIOi/nuWHu+agvOaMoVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBqc2ZpaWRzW2luZGV4XSwgXCJlZmZlY3RcIiwgW1wiYmxvY2tcIiwgMV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZfcWhibG9jazogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwicWhibG9ja1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmZ2RfaGl0OiBudW1iZXIgPSBNYXRoLm1pbihnemhpdC5mamhpdCAqIE1hdGgubWF4KDAuMTIsIChmX3FoYmxvY2sgLSBpX3JoYmxvY2spIC8gMTAwMDApLCBnemhpdC5mamhpdCAqIDAuOSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBoaXQgLT0gTWF0aC5mbG9vcihmZ2RfaGl0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBoaXQgPSB0aGlzLmhpdF9sYXN0KGlpZCwganNmaWlkc1tpbmRleF0sIGhpdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwganNmaWlkc1tpbmRleF0sIFwiZWZmZWN0XCIsIFtcImZhbmppXCIsIC0xICogaGl0XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfYmFzZShqc2ZpaWRzW2luZGV4XSwgMiwgeyBoaXQ6IGhpdCB9KTsgLy/ooqvmlLvlh7tcbi8vICAgICAgICAgICAgICAgICAgICAgYWxsSGl0ICs9IGhpdDtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbygyMDUsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSwgaGl0OiBhbGxIaXQgfSk7IC8v5rqF5bCE6Kem5Y+RXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+WIpOWumuaYr+WQpuaatOWHu1xuLy8gICAgICAgICBpZiAoaXNOZXh0ID09IDEpIHtcbi8vICAgICAgICAgICAgIGxldCBpc0JqOiBudW1iZXIgPSB0aGlzLmlzQmFvamkoaWlkLCBmaWlkKTtcbi8vICAgICAgICAgICAgIGlmIChpc0JqKSB7XG4vLyAgICAgICAgICAgICAgICAgaXNOZXh0ID0gMjtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5pq05Ye7XG4vLyAgICAgICAgIGlmIChpc05leHQgPT0gMikge1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLmNvbnNbMF0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uZmNvbnNbMF0gKz0gMTsgLy/orrDlvZXmlLvlh7vmrKHmlbBcblxuLy8gICAgICAgICAgICAgbGV0IGlzR2QgPSB0aGlzLmlzR2VkYW5nKGlpZCwgZmlpZCk7IC8vIOi/nuWHu+agvOaMoVxuLy8gICAgICAgICAgICAgaWYgKGlzR2QpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImJsb2NrXCIsIDFdKTtcbi8vICAgICAgICAgICAgICAgICBsZXQgZl9xaGJsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJxaGJsb2NrXCIpO1xuLy8gICAgICAgICAgICAgICAgIGxldCBmZ2RfaGl0OiBudW1iZXIgPSBNYXRoLm1pbihnemhpdC5mamhpdCAqIE1hdGgubWF4KDAuMTIsIChmX3FoYmxvY2sgLSBpX3JoYmxvY2spIC8gMTAwMDApLCBnemhpdC5mamhpdCAqIDAuOSk7XG4vLyAgICAgICAgICAgICAgICAgaGl0IC09IGZnZF9oaXQ7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBoaXQgPSB0aGlzLmhpdF9sYXN0KGlpZCwgZmlpZCwgZ3poaXQuYmpoaXQpO1xuLy8gICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJiYW9qaVwiLCAtMSAqIGhpdF0pO1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygyMDMsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSwgaGl0OiBoaXQsIGlzQmo6IGhpdCB9KTsgLy/mmrTlh7vop6blj5Fcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5pmu6YCa5pS75Ye7XG4vLyAgICAgICAgIGlmIChpc05leHQgPT0gMSkge1xuLy8gICAgICAgICAgICAgbGV0IGlzR2QgPSB0aGlzLmlzR2VkYW5nKGlpZCwgZmlpZCk7IC8vIOagvOaMoVxuLy8gICAgICAgICAgICAgaWYgKGlzR2QpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImJsb2NrXCIsIDFdKTtcbi8vICAgICAgICAgICAgICAgICBsZXQgZl9xaGJsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJxaGJsb2NrXCIpO1xuLy8gICAgICAgICAgICAgICAgIGxldCBmZ2RfaGl0OiBudW1iZXIgPSBNYXRoLm1pbihnemhpdC5mamhpdCAqIE1hdGgubWF4KDAuMTIsIChmX3FoYmxvY2sgLSBpX3JoYmxvY2spIC8gMTAwMDApLCBnemhpdC5mamhpdCAqIDAuOSk7XG4vLyAgICAgICAgICAgICAgICAgaGl0IC09IGZnZF9oaXQ7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBoaXQgPSB0aGlzLmhpdF9sYXN0KGlpZCwgZmlpZCwgaGl0KTtcbi8vICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiZmFuamlcIiwgLTEgKiBoaXRdKTtcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMjAzLCB7IGRvX2lpZDogTnVtYmVyKGlpZCksIGhpdDogaGl0LCBpc0JqOiBoaXQgfSk7IC8v5pq05Ye76Kem5Y+RXG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+WQuOihgOeOhz1tYXjvvIgo5oiR5pa55ZC46KGALeaVjOaWueaKl+WQuOihgO+8ie+8jOWQuOihgOS/neW6leWPguaVsClcbi8vICAgICAgICAgLy/lkLjooYDlgLw9XHTmnIDnu4jkvKTlrrPlgLwqbWF4KOaIkeaWueWQuOihgOWinuW8ui3mlYzmlrnlkLjooYDlh4/lvLEsMSkq5ZC46KGA546HXG4vLyAgICAgICAgIGxldCBpX3hpeHVlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInhpeHVlXCIpO1xuLy8gICAgICAgICBsZXQgZl9oc3hpeHVlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJoc3hpeHVlXCIpO1xuLy8gICAgICAgICBsZXQgYmR4aXh1ZTogbnVtYmVyID0gMDsgLy/kv53lupXlkLjooYBcbi8vICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcudXNlckVwLmdldEl0ZW0oXCJ4aXh1ZVwiKTtcbi8vICAgICAgICAgaWYgKGNmZyAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICBiZHhpeHVlID0gY2ZnLmluaXRFcDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgeHhSYXRlOiBudW1iZXIgPSBNYXRoLm1heChpX3hpeHVlIC0gZl9oc3hpeHVlLCBiZHhpeHVlKTtcbi8vICAgICAgICAgbGV0IGlfcWh4aXh1ZTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJxaHhpeHVlXCIpO1xuLy8gICAgICAgICBsZXQgZl9yaHhpeHVlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJyaHhpeHVlXCIpO1xuLy8gICAgICAgICBsZXQgeHhfaGl0OiBudW1iZXIgPSBNYXRoLmZsb29yKChnemhpdC5mamhpdCAqIE1hdGgubWF4KChpX3FoeGl4dWUgLSBmX3JoeGl4dWUpIC8gMTAwMDAgKyAxLCAxKSAqIHh4UmF0ZSkgLyAxMDAwMCk7XG5cbi8vICAgICAgICAgLy/mmK/lkKblkLjooYBcbi8vICAgICAgICAgaWYgKHh4X2hpdD4wKSB7XG4vLyAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgeHhfaGl0XSk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICB0aGlzLnRpbWVyX2RvKDIwNCwgeyBkb19paWQ6IE51bWJlcihpaWQpLCBoaXQ6IGhpdCB9KTsgLy/lj43lh7vop6blj5FcblxuLy8gICAgICAgICBpZiAoaXNFcGZqKSB7XG4vLyAgICAgICAgICAgICAvLyDlj43lh7vojrflvpdidWZmXG4vLyAgICAgICAgICAgICBsZXQgc2tpZHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy50ZWFtc1tpaWRdLnNrKTtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBza2lkcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgY2ZnU2sgPSBHYW1lY2ZnLnNraWxsQmFzZS5nZXRJdGVtKHNraWRzW2luZGV4XSwgXCIxXCIpO1xuLy8gICAgICAgICAgICAgICAgIGlmIChjZmdTayAmJiBjZmdTay5ydW5TdGF0dXMgPT09IDcpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNmZ1NrLmVmZmVjdC5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZlY3RJZCA9IGNmZ1NrLmVmZmVjdFtpbmRleF07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChmaWlkLCBza2lkc1tpbmRleF0sIGVmZmVjdElkLnRvU3RyaW5nKCksIFwiXCIsIHsgaGl0OiBoaXQgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgLyoqXG4vLyAgICAgICog5Ye65omLKOWQjilcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHBrX3poZW5fb3ZlcigpIHtcbi8vICAgICAgICAgLy/mrbvkuqHop6blj5Fcbi8vICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgbGV0IGZpaWQgPSB0aGlzLnRlYW1GaWlkc1tpbmRleF07XG4vLyAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+i/mOa0u+edgFxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbZmlpZF0uZHpoZW4gPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5LmL5YmN5bey57uP5q275LqGXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLmR6aGVuID0gdGhpcy56aGVuOyAvL+mCo+S4gOW4p+atu+S6hlxuLy8gICAgICAgICAgICAgdGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPSAwO1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg0MDIsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7IC8v5q275Lqh6Kem5Y+RXG5cbi8vICAgICAgICAgICAgIHRoaXMuamllc3VvX2hpZGUoZmlpZCk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+a4hemZpOi/h+acn2J1ZmZcbi8vICAgICAgICAgdGhpcy5za2J1ZmZfY2xlYXIoKTtcbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDljZXmrKHlh7rmiYvkuLTml7blrZjlgqjkv6Hmga8gLSDorrDlvZVcbi8vICAgICAgKi9cbi8vICAgICBhZGRPbmVBdGsoaWlkOiBzdHJpbmcsIGZpaWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbDogYW55LCBza2lkOiBzdHJpbmcgPSBcIlwiKSB7XG4vLyAgICAgICAgIGlmICghdGhpcy5vbmVBdGtpaWRzLmluY2x1ZGVzKGlpZCkpIHtcbi8vICAgICAgICAgICAgIHRoaXMub25lQXRraWlkcy5wdXNoKGlpZCk7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy/liJ3lp4vljJZcbi8vICAgICAgICAgaWYgKHRoaXMub25lQXRrW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVBdGtbaWlkXSA9IHt9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uZHpoZW4gPiAwICYmIHRoaXMudXVpZHNbaWlkXS5kemhlbiA8IHRoaXMuemhlbikge1xuLy8gICAgICAgICAgICAgcmV0dXJuOyAvL+W3sue7j+atu+S6hiAs5LiN6KaB5Zyo5oqY6IW+5LqGXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMudXVpZHNbZmlpZF0uZHpoZW4gPiAwICYmIHRoaXMudXVpZHNbZmlpZF0uZHpoZW4gPCB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy/lt7Lnu4/mrbvkuoYgLOS4jeimgeWcqOaKmOiFvuS6hlxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLm9uZUF0a1tpaWRdW2ZpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHRoaXMub25lQXRrW2lpZF1bZmlpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgYVR5cGU6IFh5cy5BY3Rpb25UeXBlLmRlZmF1bHQsIC8v5Yqo5L2c57G75Z6LXG4vLyAgICAgICAgICAgICAgICAgYVNraWQ6IFwiXCIsIC8v5L2/55So55qE5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICBlZmZlY3Q6IFtdLFxuLy8gICAgICAgICAgICAgICAgIGJ1ZmY6IFtdLFxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v55uu5qCH5rK755aX5pWI5p6c6ZmN5L2OL+WinuWKoFxuLy8gICAgICAgICBpZiAodmFsWzBdID09IFwiaHBcIiAmJiB2YWxbMV0gPiAwICYmIHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pXzYyXCIsIDIpID4gMCkge1xuLy8gICAgICAgICAgICAgbGV0IGZfaV82MiA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImlfNjJcIik7XG4vLyAgICAgICAgICAgICB2YWxbMV0gKz0gTWF0aC5mbG9vcigodmFsWzFdICogZl9pXzYyKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgIHZhbFsxXSA9IE1hdGgubWF4KDAsIHZhbFsxXSk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+WNleasoeS8pOWus+S4jei2hei/h+iHqui6q+acgOWkp+eUn+WRveWAvOeahHglXG4vLyAgICAgICAgIGlmICh0aGlzLnh1ZWt1LmluY2x1ZGVzKHZhbFswXSkgJiYgdmFsWzFdIDwgMCkge1xuLy8gICAgICAgICAgICAgbGV0IGZfaV83MSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcIm1heF9pXzcxXCIpO1xuLy8gICAgICAgICAgICAgaWYgKGZfaV83MSA+IDAgJiYgTWF0aC5hYnModmFsWzFdKSA+IGZfaV83MSAmJiB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJtYXhfaV83MV9uWmhlblwiKSA8PSB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgbWF4X2lfNzFfY2QgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJtYXhfaV83MV9jZFwiKTtcbi8vICAgICAgICAgICAgICAgICBpZiAobWF4X2lfNzFfY2QgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX3VwZGF0ZShmaWlkLCB7IG1heF9pXzcxX25aaGVuOiB0aGlzLnpoZW4gKyBtYXhfaV83MV9jZCAqIDMwIH0pO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB2YWxbMV0gPSAtZl9pXzcxO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/nu5/orqFcbi8vICAgICAgICAgaWYgKHRoaXMub3V0Zi50b25namlbZmlpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy5vdXRmLnRvbmdqaVtmaWlkXSA9IHtcbi8vICAgICAgICAgICAgICAgICBzaHVjaHU6IDAsIC8v6L6T5Ye6XG4vLyAgICAgICAgICAgICAgICAgemhpbGlhbzogMCwgLy/msrvnlpdcbi8vICAgICAgICAgICAgICAgICBjaGVuZ3NoYW5nOiAwLCAvL+aJv+S8pFxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAodGhpcy5vdXRmLnRvbmdqaVtpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHRoaXMub3V0Zi50b25namlbaWlkXSA9IHtcbi8vICAgICAgICAgICAgICAgICBzaHVjaHU6IDAsIC8v6L6T5Ye6XG4vLyAgICAgICAgICAgICAgICAgemhpbGlhbzogMCwgLy/msrvnlpdcbi8vICAgICAgICAgICAgICAgICBjaGVuZ3NoYW5nOiAwLCAvL+aJv+S8pFxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBzd2l0Y2ggKGtleSkge1xuLy8gICAgICAgICAgICAgY2FzZSBcImFUeXBlXCI6IC8v5Yqo5L2c57G75Z6LXG4vLyAgICAgICAgICAgICAgICAgLy/lt7Lnu4/mmK/mlLvlh7vnsbvlnovvvIwg5bCx5LiN6KaB5YaN5pS55LqGXG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25lQXRrW2lpZF1bZmlpZF0uYVR5cGUgIT0gWHlzLkFjdGlvblR5cGUuYXRrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQXRrW2lpZF1bZmlpZF0uYVR5cGUgPSB2YWw7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgY2FzZSBcImFTa2lkXCI6IC8v5L2/55So55qE5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICB0aGlzLm9uZUF0a1tpaWRdW2ZpaWRdLmFTa2lkID0gdmFsO1xuLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgY2FzZSBcImVmZmVjdFwiOiAvL+eJueaViFxuLy8gICAgICAgICAgICAgICAgIHRoaXMub25lQXRrW2lpZF1bZmlpZF0uZWZmZWN0LnB1c2godmFsKTtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy54dWVrdS5pbmNsdWRlcyh2YWxbMF0pICYmIHZhbFsxXSA8IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgLy/nu5/orqFcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRmLnRvbmdqaVtpaWRdLnNodWNodSArPSBNYXRoLmFicyh2YWxbMV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGYudG9uZ2ppW2ZpaWRdLmNoZW5nc2hhbmcgKz0gTWF0aC5hYnModmFsWzFdKTtcblxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbWFpbl9paWQgPSBmaWlkLmxlbmd0aCA+IDMgPyBcIjEwMDBcIiA6IFwiMTAwXCI7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIoZmlpZCkgJSAxMDAgPCAxMCAmJiB0aGlzLnV1aWRzW21haW5faWlkXSAmJiB0aGlzLnV1aWRzW21haW5faWlkXS5kcmFpbl9zayA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZmdNYXRoID0gR2FtZWNmZy5tYXRoSW5mby5nZXRJdGVtKFwiYmF0dGxlX2xpbmdsaVwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdNYXRoICE9IG51bGwgJiYgY2ZnTWF0aC5wcmFtLml0ZW1zICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGxtaW4gPSBjZmdNYXRoLnByYW0uaXRlbXNbMF1bMF07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxsTWF4ID0gY2ZnTWF0aC5wcmFtLml0ZW1zWzBdWzFdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkX21wKG1haW5faWlkLCB0aGlzLnNlZWRSYW5kLnJhbmQobGxtaW4sIGxsTWF4KSwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMueHVla3UuaW5jbHVkZXModmFsWzBdKSAmJiB2YWxbMV0gPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIC8v57uf6K6hXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMub3V0Zi50b25namlbZmlpZF0uemhpbGlhbyArPSBNYXRoLmFicyh2YWxbMV0pO1xuXG4vLyAgICAgICAgICAgICAgICAgICAgIC8v5Zue6KGA6Kem5Y+R77yI5rK755aX6Kem5Y+RL+WQuOihgOinpuWPkS0t6L+ZM+S4quaYr+S4gOS4quaEj+aAne+8iVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDQwMywgeyBkb19paWQ6IE51bWJlcihmaWlkKSB9KTtcbi8vICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgIGNhc2UgXCJidWZmXCI6IC8vYnVmZlxuLy8gICAgICAgICAgICAgICAgIHRoaXMub25lQXRrW2lpZF1bZmlpZF0uYnVmZi5wdXNoKHZhbCk7XG4vLyAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDlvZPliY3liankvZnooYDph49cbi8vICAgICAgKi9cbi8vICAgICBqdWVGaWlkSHAoZmlpZDogc3RyaW5nKSB7XG4vLyAgICAgICAgIGxldCBsc2ZfaHA6IG51bWJlciA9IHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwO1xuLy8gICAgICAgICBsZXQgaWlkcyA9IE9iamVjdC5rZXlzKHRoaXMub25lQXRrKTtcbi8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpaWRzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICBpZiAodGhpcy5vbmVBdGtbaWlkc1tpXV1bZmlpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB0aGlzLm9uZUF0a1tpaWRzW2ldXVtmaWlkXS5lZmZlY3QubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy54dWVrdS5pbmNsdWRlcyh0aGlzLm9uZUF0a1tpaWRzW2ldXVtmaWlkXS5lZmZlY3Rba11bMF0pKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxzZl9ocCArPSB0aGlzLm9uZUF0a1tpaWRzW2ldXVtmaWlkXS5lZmZlY3Rba11bMV07XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxzZl9ocCA9IE1hdGgubWluKGxzZl9ocCwgdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpKTtcbi8vICAgICAgICAgcmV0dXJuIGxzZl9ocDtcbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDljZXmrKHlh7rmiYvkuLTml7blrZjlgqjkv6Hmga8gLSDnu5Pnrpdcbi8vICAgICAgKi9cbi8vICAgICBqdWVTdWFuT25lQXRrKCkge1xuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMub25lQXRrKSA9PSB0cnVlKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy8g57uT566X5YmN5Yik5a6a5Li76KeS5piv5ZCm5q275LqhIOW5tuS4lOaYr+WQpuaLpeacieWkjea0u2J1ZmYg5aSN5rS7YnVmZuinpuWPkeW4p+aYr+WQpueUn+aViFxuLy8gICAgICAgICBsZXQgaWlkcyA9IFtcIjEwMFwiLFwiMTAwMFwiXTtcbi8vICAgICAgICAgZm9yIChsZXQgaT0wO2k8aWlkcy5sZW5ndGg7aSsrKXtcbi8vICAgICAgICAgICAgIGxldCBpaWQgPSBpaWRzW2ldO1xuLy8gICAgICAgICAgICAgbGV0IGhwID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgIGlmIChocCA8PSAwICYmIHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfNjNcIiwgMikgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGlfNjNfY2QgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImlfNjNfY2RcIilcbi8vICAgICAgICAgICAgICAgICBpZiAoaV82M19jZCA+IDApeyAgIC8vIOatu+S6oeWQjuW7tui/n3jluKflpI3mtLtcbi8vICAgICAgICAgICAgICAgICAgICAgLy90aGlzLnNrYnVmZl91cGRhdGUoaWlkLCB7IFwiaV82M19jZFwiOi1pXzYzX2NkLFwiaV82M19uWmhlblwiOiB0aGlzLnpoZW4gKyBpXzYzX2NkIH0pO1xuLy8gICAgICAgICAgICAgICAgIH1lbHNlIGlmICh0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImlfNjNfblpoZW5cIikgPD0gdGhpcy56aGVuKXtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZEhwID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzYzX2hwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoYWRkSHAgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZCxcImVmZmVjdF9pXzYzXCIpXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIGFkZEhwIC0gaHBdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvL+aUu+aJk+aWuVxuLy8gICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub25lQXRraWlkcy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgbGV0IGlfYnVmZjogW3N0cmluZywgbnVtYmVyXVtdID0gW107XG4vLyAgICAgICAgICAgICBsZXQgaV9lZmZlY3Q6IFtzdHJpbmcsIG51bWJlcl1bXSA9IFtdO1xuLy8gICAgICAgICAgICAgbGV0IHRhcmdldDogWHlzLkxvZ09uZURhdGFbXSA9IFtdO1xuLy8gICAgICAgICAgICAgbGV0IGZpaWRzID0gT2JqZWN0LmtleXModGhpcy5vbmVBdGtbdGhpcy5vbmVBdGtpaWRzW2ldXSk7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGZpaWRzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGNoYWhwOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgICAgIC8v6K6h566X6KGA6YeP5ZKM5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW2ZpaWRzW2tdXS5lZmZlY3QubGVuZ3RoOyBqKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGVmZmVjdCA9IHRoaXMub25lQXRrW3RoaXMub25lQXRraWlkc1tpXV1bZmlpZHNba11dLmVmZmVjdFtqXTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMueHVla3UuaW5jbHVkZXMoZWZmZWN0WzBdKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE51bWJlcihmaWlkc1trXSkgPCAxMDAwICYmIGVmZmVjdFsxXSA8IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGYuaHVydCArPSBNYXRoLmFicyhlZmZlY3RbMV0pOyAvL+iuoeeul+S8pOWus1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVmZmVjdFsxXSA8IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aJo+ihgOaJp+ihjFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNDAxLCB7IGRvX2lpZDogTnVtYmVyKGZpaWRzW2tdKSwgaGl0OiBNYXRoLmFicyhlZmZlY3RbMV0pIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNDA0LCB7IGRvX2lpZDogTnVtYmVyKGZpaWRzW2tdKSwgaGl0OiBNYXRoLmFicyhlZmZlY3RbMV0pIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNDA1LCB7IGRvX2lpZDogTnVtYmVyKHRoaXMub25lQXRraWlkc1tpXSksIGhpdDogTWF0aC5hYnMoZWZmZWN0WzFdKSB9KTsgLy/mlYzmlrnmiaPooYAg5oiR5pa55YqgYnVmZlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZHNba11dLmVwcy5ocCArIGNoYWhwICsgZWZmZWN0WzFdIDwgMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOacgOWQjuS4gOS4iyDlpoLmnpzlr7nmlrnooqvmiZPmrbvkuoYg5Lyk5a6z5LiN6IO96LaF6L+H5a+55pa56KGA6YePXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0WzFdID0gLSh0aGlzLnRlYW1zW2ZpaWRzW2tdXS5lcHMuaHAgKyBjaGFocCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWZmZWN0WzFdID09IDAgJiYgdGhpcy50ZWFtc1tmaWlkc1trXV0uZXBzLmhwICsgY2hhaHAgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOW3sue7j+iiq+aJk+atu+S6hiDliKDmjonov5nkuKrlvbHlk41cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW2ZpaWRzW2tdXS5lZmZlY3Quc3BsaWNlKGosIDEpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGotLTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWhwICs9IGVmZmVjdFsxXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB0aGlzLnRlYW1zW2ZpaWRzW2tdXS5lcHMuaHAgKz0gY2hhaHA7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy50ZWFtc1tmaWlkc1trXV0uZXBzLmhwID0gTWF0aC5taW4odGhpcy5za2J1ZmZfZ2V0KGZpaWRzW2tdLCBcImhwX21heFwiKSwgdGhpcy50ZWFtc1tmaWlkc1trXV0uZXBzLmhwKTtcblxuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUF0a2lpZHNbaV0gPT0gZmlpZHNba10pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaV9idWZmID0gdGhpcy5vbmVBdGtbdGhpcy5vbmVBdGtpaWRzW2ldXVtmaWlkc1trXV0uYnVmZjtcbi8vICAgICAgICAgICAgICAgICAgICAgaV9lZmZlY3QgPSB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW2ZpaWRzW2tdXS5lZmZlY3Q7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlkOiB0aGlzLnRlYW1zW2ZpaWRzW2tdXS5maWQsIC8v5Ye65omL5pa5SWRcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlpZDogZmlpZHNba10sIC8v6Zi15a655LiL5qCHXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBocDogdGhpcy50ZWFtc1tmaWlkc1trXV0uZXBzLmhwLCAvL+WJqeS9meihgOmHj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbXA6IHRoaXMudGVhbXNbZmlpZHNba11dLmVwcy5tcCwgLy/liankvZnmgJLmsJRcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmY6IHRoaXMub25lQXRrW3RoaXMub25lQXRraWlkc1tpXV1bZmlpZHNba11dLmJ1ZmYsIC8vWyBb55Sf5pWI5bin5byA5aeL77yM55Sf5pWI5bin57uT5p2fLGJ1ZmZLRVks6Kem5Y+R55qE5Lq6XV1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdDogdGhpcy5vbmVBdGtbdGhpcy5vbmVBdGtpaWRzW2ldXVtmaWlkc1trXV0uZWZmZWN0LCAvL+inpuWPkeaViOaenCBbIFvlsZ7mgKdrZXks5pWw5YC8XV1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRvbmdqaTpNYXRoLmFicyh0aGlzLm91dGYudG9uZ2ppW2ZpaWRzW2tdXT8uc2h1Y2h1IHwgMCksXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB6b25qaTowXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW2ZpaWRzW2tdXS5lZmZlY3QgPSBbXTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMudGVhbXNbdGhpcy5vbmVBdGtpaWRzW2ldXS5lcHMuaHAgPSBNYXRoLm1pbih0aGlzLnRlYW1zW3RoaXMub25lQXRraWlkc1tpXV0uZXBzLmhwLCB0aGlzLnNrYnVmZl9nZXQodGhpcy5vbmVBdGtpaWRzW2ldLCBcImhwX21heFwiKSk7XG4vLyAgICAgICAgICAgICAvLyDmiorlm57ooYDlkIjlubZcbi8vICAgICAgICAgICAgIGxldCBpX2VmZmVjdDI6W3N0cmluZywgbnVtYmVyXVtdID0gW11cbi8vICAgICAgICAgICAgIGxldCBqaXN1YW46e1trZXk6c3RyaW5nXTpudW1iZXJ9ID0ge31cbi8vICAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgaV9lZmZlY3Qpe1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnh1ZWt1LmluY2x1ZGVzKGl0ZW1bMF0pICYmIGl0ZW1bMV0gPiAwKXsgICAvL+WxnuS6juWbnuihgOWtl+auteW5tuS4lOWAvOWkp+S6jjBcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGppc3VhbltpdGVtWzBdXSA9PSBudWxsKXtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGppc3VhbltpdGVtWzBdXSA9IGl0ZW1bMV1cbi8vICAgICAgICAgICAgICAgICAgICAgfWVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgamlzdWFuW2l0ZW1bMF1dICs9IGl0ZW1bMV1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1lbHNle1xuLy8gICAgICAgICAgICAgICAgICAgICBpX2VmZmVjdDIucHVzaChpdGVtKVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBqaXN1YW4pe1xuLy8gICAgICAgICAgICAgICAgIGlfZWZmZWN0Mi5wdXNoKFtrZXksamlzdWFuW2tleV1dKVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgLy/liJ3lp4vljJZcbi8vICAgICAgICAgICAgIGxldCBhdGtlcjogWHlzLkxvZ09uZURhdGEgPSB7XG4vLyAgICAgICAgICAgICAgICAgZmlkOiB0aGlzLnRlYW1zW3RoaXMub25lQXRraWlkc1tpXV0uZmlkLCAvL+WHuuaJi+aWuUlkXG4vLyAgICAgICAgICAgICAgICAgaWlkOiB0aGlzLm9uZUF0a2lpZHNbaV0sIC8v6Zi15a655LiL5qCHXG4vLyAgICAgICAgICAgICAgICAgaHA6IHRoaXMudGVhbXNbdGhpcy5vbmVBdGtpaWRzW2ldXS5lcHMuaHAsIC8v5Ymp5L2Z6KGA6YePXG4vLyAgICAgICAgICAgICAgICAgbXA6IHRoaXMudGVhbXNbdGhpcy5vbmVBdGtpaWRzW2ldXS5lcHMubXAsIC8v5Ymp5L2Z5oCS5rCUXG4vLyAgICAgICAgICAgICAgICAgYnVmZjogaV9idWZmLCAvL1sgW+eUn+aViOW4p+W8gOWni++8jOeUn+aViOW4p+e7k+adnyxidWZmS0VZLOinpuWPkeeahOS6ul1dXG4vLyAgICAgICAgICAgICAgICAgZWZmZWN0OiBpX2VmZmVjdDIsIC8v6Kem5Y+R5pWI5p6cIFsgW+WxnuaAp2tleSzmlbDlgLxdXVxuLy8gICAgICAgICAgICAgICAgIHRvbmdqaTpNYXRoLmFicyh0aGlzLm91dGYudG9uZ2ppW3RoaXMub25lQXRraWlkc1tpXV0/LnNodWNodSB8IDApLFxuLy8gICAgICAgICAgICAgICAgIHpvbmppOjBcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICBpZiAoXG4vLyAgICAgICAgICAgICAgICAgdGhpcy5vbmVBdGtbdGhpcy5vbmVBdGtpaWRzW2ldXVt0aGlzLm9uZUF0a2lpZHNbaV1dICE9IG51bGwgJiZcbi8vICAgICAgICAgICAgICAgICB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW3RoaXMub25lQXRraWlkc1tpXV0uYVR5cGUgIT0gWHlzLkFjdGlvblR5cGUuZGVmYXVsdFxuLy8gICAgICAgICAgICAgKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/mt7vliqDml6Xlv5dcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUxvZyh7XG4vLyAgICAgICAgICAgICAgICAgICAgIGFUeXBlOiB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW3RoaXMub25lQXRraWlkc1tpXV0uYVR5cGUsIC8v5oiY5paX5Yqo5L2c57G75Z6LXG4vLyAgICAgICAgICAgICAgICAgICAgIGFTa2lkOiB0aGlzLm9uZUF0a1t0aGlzLm9uZUF0a2lpZHNbaV1dW3RoaXMub25lQXRraWlkc1tpXV0uYVNraWQsIC8v5L2/55So55qE5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICAgICAgZmhwOiAwLFxuLy8gICAgICAgICAgICAgICAgICAgICBhdGtlcjogYXRrZXIsIC8v5Ye65omL5pa5XG4vLyAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LCAvL+ebruagh1xuLy8gICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMub25lQXRrID0ge307XG4vLyAgICAgICAgIHRoaXMub25lQXRraWlkcyA9IFtdO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOaImOaWl+aXpeW/l1xuLy8gICAgICAqL1xuLy8gICAgIGFkZE9uZUxvZyhsb2c6IFh5cy5maWdodExvZ09uZSkge1xuLy8gICAgICAgICBsb2cuZmhwID0gMDtcbi8vICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgbGV0IGZpaWQgPSB0aGlzLnRlYW1GaWlkc1tpbmRleF07XG4vLyAgICAgICAgICAgICAvL+e7n+iuoeWvueaWueWJqeS9meaAu+ihgOmHjyBpbuayoeWFs+ezu1xuLy8gICAgICAgICAgICAgaWYgKE51bWJlcihmaWlkKSA+PSAxMDAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6Ieq5bex5Lq6XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUgIT0gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj+S4jeeuoVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0udHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5YW954G15LiN566hXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPCAxKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5q275LqG5LiN566hXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBsb2cuZmhwICs9IHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMub3V0Zi5sb2dbdGhpcy56aGVuXS5wdXNoKGxvZyk7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog5oiY5paX5pel5b+XXG4vLyAgICAgICovXG4vLyAgICAgb3Zlcl9iYWNrKCk6IFh5cy5PdmVyQmFjayB7XG4vLyAgICAgICAgIHRoaXMub3V0Zi5ocCA9IDA7XG4vLyAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRlYW1GaWlkcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgIGxldCBmaWlkID0gdGhpcy50ZWFtRmlpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgaWYgKGZpaWQubGVuZ3RoIDw9IDMgJiYgdGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPiAwICYmIHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlID09IDApIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLm91dGYuaHAgKz0gdGhpcy50ZWFtc1tmaWlkXS5lcHMuaHA7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgdGhpcy5vdXRmLnN0YXJ0LnRlYW1zID0gdGhpcy50ZWFtcztcbi8vICAgICAgICAgcmV0dXJuIHRoaXMub3V0Zjtcbi8vICAgICB9XG5cbi8vICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbi8vICAgICAvKipcbi8vICAgICAgKiDovoXliqnlh73mlbAgLSDojrflj5blr7nmiYtcbi8vICAgICAgKiBAcGFyYW0ga2V5IOagh+ivhmtleVxuLy8gICAgICAqIEBwYXJhbSBpaWQg5Ye65omL5pa5XG4vLyAgICAgICogQHBhcmFtIHR0eXBlICDvvIgx5pWM5pa55YWo5L2T77yMMuWJjeaOkuaVjOaWue+8jDPkuK3mjpLmlYzmlrnvvIw05ZCO5o6S5pWM5pa577yMNeaVjOaWuemaj+acuu+8jDboh6rlt7HvvIw35bey5pa55YWo5L2T77yMOOW3suaWuemaj+acuu+8iVxuLy8gICAgICAqIEBwYXJhbSB0YXJnZXRUeXBlIOebruagh+aVsOmHj1xuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgZmluZF9maWlkcyhrZXk6IHN0cmluZywgaWlkOiBzdHJpbmcsIHR0eXBlOiBudW1iZXJbXSwgdGFyZ2V0VHlwZTogbnVtYmVyLCBkaXN0YW5jZTogbnVtYmVyID0gMCkge1xuLy8gICAgICAgICBpZiAodHR5cGUubGVuZ3RoIDw9IDApIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy/msr/nlKjkuIrkuIDmrKHnmoQg5Y+v6IO95rKh5pyJ5LiK5LiA5qyhXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMub25lRmlpZHNbaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUZpaWRzW2lpZF0gPSB7fTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgZmlpZHM6IHN0cmluZ1tdID0gW107XG4vLyAgICAgICAgIHRoaXMub25lRmlpZHNbaWlkXVtrZXldID0gW107IC8v6YeN572uIOmHjeaWsOiOt+WPllxuXG4vLyAgICAgICAgIC8v55uu5qCH5omT5Ye76aG65bqPXG4vLyAgICAgICAgIGNvbnN0IG1ibGlzdDogeyBbbXViaWFvOiBzdHJpbmddOiB7IFt5dTogc3RyaW5nXTogbnVtYmVyW10gfSB9ID0ge1xuLy8gICAgICAgICAgICAgXCIxXCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzHmlYzmlrnlhajkvZMgICA15pWM5pa56ZqP5py6IDflt7LmlrnlhajkvZMgOOW3suaWuemaj+aculxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIyXCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzLliY3mjpLmlYzmlrlcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzIsIDEsIDMsIDEzLCAxNF0sXG4vLyAgICAgICAgICAgICAgICAgXCIyXCI6IFsyLCAxLCAzLCAxMywgMTRdLFxuLy8gICAgICAgICAgICAgICAgIFwiNVwiOiBbMiwgMSwgMywgMTMsIDE0XSxcbi8vICAgICAgICAgICAgICAgICBcIjhcIjogWzIsIDEsIDMsIDEzLCAxNF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxXCI6IFszLCAyLCAxNCwgMSwgMTNdLFxuLy8gICAgICAgICAgICAgICAgIFwiNFwiOiBbMywgMiwgMTQsIDEsIDEzXSxcbi8vICAgICAgICAgICAgICAgICBcIjdcIjogWzMsIDIsIDE0LCAxLCAxM10sXG4vLyAgICAgICAgICAgICAgICAgXCIzXCI6IFsxLCAxMywgMiwgMywgMTRdLFxuLy8gICAgICAgICAgICAgICAgIFwiNlwiOiBbMSwgMTMsIDIsIDMsIDE0XSxcbi8vICAgICAgICAgICAgICAgICBcIjlcIjogWzEsIDEzLCAyLCAzLCAxNF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxMFwiOiBbMywgMiwgMTQsIDEsIDEzXSxcbi8vICAgICAgICAgICAgICAgICBcIjExXCI6IFsyLCAxLCAzLCAxMywgMTRdLFxuLy8gICAgICAgICAgICAgICAgIFwiMTJcIjogWzEsIDEzLCAyLCAzLCAxNF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxM1wiOiBbMTQsIDMsIDIsIDEsIDEzXSxcbi8vICAgICAgICAgICAgICAgICBcIjE1XCI6IFsxNCwgMywgMiwgMSwgMTNdLFxuLy8gICAgICAgICAgICAgICAgIFwiMTdcIjogWzE0LCAzLCAyLCAxLCAxM10sXG4vLyAgICAgICAgICAgICAgICAgXCIxNFwiOiBbMTMsIDEsIDIsIDMsIDE0XSxcbi8vICAgICAgICAgICAgICAgICBcIjE2XCI6IFsxMywgMSwgMiwgMywgMTRdLFxuLy8gICAgICAgICAgICAgICAgIFwiMThcIjogWzEzLCAxLCAyLCAzLCAxNF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIzXCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzPkuK3mjpLmlYzmlrlcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzUsIDQsIDYsIDE1LCAxNl0sXG4vLyAgICAgICAgICAgICAgICAgXCIyXCI6IFs1LCA0LCA2LCAxNSwgMTZdLFxuLy8gICAgICAgICAgICAgICAgIFwiNVwiOiBbNSwgNCwgNiwgMTUsIDE2XSxcbi8vICAgICAgICAgICAgICAgICBcIjhcIjogWzUsIDQsIDYsIDE1LCAxNl0sXG4vLyAgICAgICAgICAgICAgICAgXCIxXCI6IFs2LCA1LCAxNiwgNCwgMTVdLFxuLy8gICAgICAgICAgICAgICAgIFwiNFwiOiBbNiwgNSwgMTYsIDQsIDE1XSxcbi8vICAgICAgICAgICAgICAgICBcIjdcIjogWzYsIDUsIDE2LCA0LCAxNV0sXG4vLyAgICAgICAgICAgICAgICAgXCIzXCI6IFs0LCAxNSwgNSwgNiwgMTZdLFxuLy8gICAgICAgICAgICAgICAgIFwiNlwiOiBbNCwgMTUsIDUsIDYsIDE2XSxcbi8vICAgICAgICAgICAgICAgICBcIjlcIjogWzQsIDE1LCA1LCA2LCAxNl0sXG4vLyAgICAgICAgICAgICAgICAgXCIxMFwiOiBbNiwgNSwgMTYsIDQsIDE1XSxcbi8vICAgICAgICAgICAgICAgICBcIjExXCI6IFs1LCA0LCA2LCAxNSwgMTZdLFxuLy8gICAgICAgICAgICAgICAgIFwiMTJcIjogWzQsIDE1LCA1LCA2LCAxNl0sXG4vLyAgICAgICAgICAgICAgICAgXCIxM1wiOiBbMTYsIDYsIDUsIDQsIDE1XSxcbi8vICAgICAgICAgICAgICAgICBcIjE1XCI6IFsxNiwgNiwgNSwgNCwgMTVdLFxuLy8gICAgICAgICAgICAgICAgIFwiMTdcIjogWzE2LCA2LCA1LCA0LCAxNV0sXG4vLyAgICAgICAgICAgICAgICAgXCIxNFwiOiBbMTUsIDQsIDUsIDYsIDE2XSxcbi8vICAgICAgICAgICAgICAgICBcIjE2XCI6IFsxNSwgNCwgNSwgNiwgMTZdLFxuLy8gICAgICAgICAgICAgICAgIFwiMThcIjogWzE1LCA0LCA1LCA2LCAxNl0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCI0XCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzTlkI7mjpLmlYzmlrlcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzgsIDcsIDksIDE3LCAxOF0sXG4vLyAgICAgICAgICAgICAgICAgXCIyXCI6IFs4LCA3LCA5LCAxNywgMThdLFxuLy8gICAgICAgICAgICAgICAgIFwiNVwiOiBbOCwgNywgOSwgMTcsIDE4XSxcbi8vICAgICAgICAgICAgICAgICBcIjhcIjogWzgsIDcsIDksIDE3LCAxOF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxXCI6IFs5LCA4LCAxOCwgNywgMTddLFxuLy8gICAgICAgICAgICAgICAgIFwiNFwiOiBbOSwgOCwgMTgsIDcsIDE3XSxcbi8vICAgICAgICAgICAgICAgICBcIjdcIjogWzksIDgsIDE4LCA3LCAxN10sXG4vLyAgICAgICAgICAgICAgICAgXCIzXCI6IFs3LCA4LCAxNywgOSwgMThdLFxuLy8gICAgICAgICAgICAgICAgIFwiNlwiOiBbNywgOCwgMTcsIDksIDE4XSxcbi8vICAgICAgICAgICAgICAgICBcIjlcIjogWzcsIDgsIDE3LCA5LCAxOF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxMFwiOiBbOSwgOCwgMTgsIDcsIDE3XSxcbi8vICAgICAgICAgICAgICAgICBcIjExXCI6IFs4LCA3LCA5LCAxNywgMThdLFxuLy8gICAgICAgICAgICAgICAgIFwiMTJcIjogWzcsIDgsIDE3LCA5LCAxOF0sXG4vLyAgICAgICAgICAgICAgICAgXCIxM1wiOiBbMTgsIDksIDgsIDcsIDE3XSxcbi8vICAgICAgICAgICAgICAgICBcIjE1XCI6IFsxOCwgOSwgOCwgNywgMTddLFxuLy8gICAgICAgICAgICAgICAgIFwiMTdcIjogWzE4LCA5LCA4LCA3LCAxN10sXG4vLyAgICAgICAgICAgICAgICAgXCIxNFwiOiBbMTcsIDcsIDgsIDksIDE4XSxcbi8vICAgICAgICAgICAgICAgICBcIjE2XCI6IFsxNywgNywgOCwgOSwgMThdLFxuLy8gICAgICAgICAgICAgICAgIFwiMThcIjogWzE3LCA3LCA4LCA5LCAxOF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCI1XCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzHmlYzmlrnlhajkvZMgICA15pWM5pa56ZqP5py6IDflt7LmlrnlhajkvZMgOOW3suaWuemaj+aculxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCI3XCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzHmlYzmlrnlhajkvZMgICA15pWM5pa56ZqP5py6IDflt7LmlrnlhajkvZMgOOW3suaWuemaj+aculxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCI4XCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzHmlYzmlrnlhajkvZMgICA15pWM5pa56ZqP5py6IDflt7LmlrnlhajkvZMgOOW3suaWuemaj+aculxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIxMFwiOiB7XG4vLyAgICAgICAgICAgICAgICAgLy8x5pWM5pa55YWo5L2TICAgNeaVjOaWuemaj+acuiA35bey5pa55YWo5L2TIDjlt7Lmlrnpmo/mnLpcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDBdLFxuLy8gICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgIFwiMTFcIjoge1xuLy8gICAgICAgICAgICAgICAgIC8vMeaVjOaWueWFqOS9kyAgIDXmlYzmlrnpmo/mnLogN+W3suaWueWFqOS9kyA45bey5pa56ZqP5py6XG4vLyAgICAgICAgICAgICAgICAgXCIwXCI6IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAwXSxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICBcIjEyXCI6IHtcbi8vICAgICAgICAgICAgICAgICAvLzHmlYzmlrnlhajkvZMgICA15pWM5pa56ZqP5py6IDflt7LmlrnlhajkvZMgOOW3suaWuemaj+aculxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIxM1wiOiB7XG4vLyAgICAgICAgICAgICAgICAgLy8x5pWM5pa55YWo5L2TICAgNeaVjOaWuemaj+acuiA35bey5pa55YWo5L2TIDjlt7Lmlrnpmo/mnLpcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDBdLFxuLy8gICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgIFwiMTZcIjoge1xuLy8gICAgICAgICAgICAgICAgIC8vMeaVjOaWueWFqOS9kyAgIDXmlYzmlrnpmo/mnLogN+W3suaWueWFqOS9kyA45bey5pa56ZqP5py6XG4vLyAgICAgICAgICAgICAgICAgXCIwXCI6IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAwXSxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICBcIjE3XCI6IHtcbi8vICAgICAgICAgICAgICAgICAvL+S4u+inkuiHquW3sVxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIxOFwiOiB7XG4vLyAgICAgICAgICAgICAgICAgLy/miJHmlrnlvJ/lrZBcbi8vICAgICAgICAgICAgICAgICBcIjBcIjogWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEzLCAxNCwgMTUsIDE2LCAxNywgMThdLFxuLy8gICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgIFwiMjBcIjoge1xuLy8gICAgICAgICAgICAgICAgIC8v5oiR5pa55byf5a2QXG4vLyAgICAgICAgICAgICAgICAgXCIwXCI6IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4XSxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICBcIjIyXCI6IHtcbi8vICAgICAgICAgICAgICAgICAvL+aVjOaWueWFqOS9k+W8guW4uFxuLy8gICAgICAgICAgICAgICAgIFwiMFwiOiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgXCIyM1wiOiB7XG4vLyAgICAgICAgICAgICAgICAgXCIwXCI6IFsyLCA1LCAxLCAzLCA4LCAxMywgMTQsIDQsIDYsIDE1LCAxNiwgNywgOSwgMTcsIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjJcIjogWzIsIDUsIDEsIDMsIDgsIDEzLCAxNCwgNCwgNiwgMTUsIDE2LCA3LCA5LCAxNywgMTgsIDBdLFxuLy8gICAgICAgICAgICAgICAgIFwiNVwiOiBbMiwgNSwgMSwgMywgOCwgMTMsIDE0LCA0LCA2LCAxNSwgMTYsIDcsIDksIDE3LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICAgICAgXCI4XCI6IFsyLCA1LCAxLCAzLCA4LCAxMywgMTQsIDQsIDYsIDE1LCAxNiwgNywgOSwgMTcsIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjExXCI6IFsyLCA1LCAxLCAzLCA4LCAxMywgMTQsIDQsIDYsIDE1LCAxNiwgNywgOSwgMTcsIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjFcIjogWzMsIDYsIDIsIDE0LCA5LCAxLCA1LCAxNiwgMTQsIDQsIDgsIDE4LCAxNSwgNywgMTcsIDBdLFxuLy8gICAgICAgICAgICAgICAgIFwiNFwiOiBbMywgNiwgMiwgMTQsIDksIDEsIDUsIDE2LCAxNCwgNCwgOCwgMTgsIDE1LCA3LCAxNywgMF0sXG4vLyAgICAgICAgICAgICAgICAgXCI3XCI6IFszLCA2LCAyLCAxNCwgOSwgMSwgNSwgMTYsIDE0LCA0LCA4LCAxOCwgMTUsIDcsIDE3LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjEwXCI6IFszLCA2LCAyLCAxNCwgOSwgMSwgNSwgMTYsIDE0LCA0LCA4LCAxOCwgMTUsIDcsIDE3LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjNcIjogWzEsIDQsIDEzLCAyLCA3LCAzLCAxNSwgNSwgMTQsIDYsIDE3LCA4LCAxNiwgOSwgMTgsIDBdLFxuLy8gICAgICAgICAgICAgICAgIFwiNlwiOiBbMSwgNCwgMTMsIDIsIDcsIDMsIDE1LCA1LCAxNCwgNiwgMTcsIDgsIDE2LCA5LCAxOCwgMF0sXG4vLyAgICAgICAgICAgICAgICAgXCI5XCI6IFsxLCA0LCAxMywgMiwgNywgMywgMTUsIDUsIDE0LCA2LCAxNywgOCwgMTYsIDksIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjEyXCI6IFsxLCA0LCAxMywgMiwgNywgMywgMTUsIDUsIDE0LCA2LCAxNywgOCwgMTYsIDksIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjEzXCI6IFsxNCwgMTYsIDMsIDE4LCAyLCA2LCAxLCA1LCA5LCAxMywgNCwgOCwgMTUsIDcsIDE3LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjE1XCI6IFsxNCwgMTYsIDMsIDE4LCAyLCA2LCAxLCA1LCA5LCAxMywgNCwgOCwgMTUsIDcsIDE3LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjE3XCI6IFsxNCwgMTYsIDMsIDE4LCAyLCA2LCAxLCA1LCA5LCAxMywgNCwgOCwgMTUsIDcsIDE3LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjE0XCI6IFsxMywgMTUsIDEsIDE3LCAyLCA0LCAzLCA1LCA3LCAxNCwgNiwgOCwgMTYsIDksIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjE2XCI6IFsxMywgMTUsIDEsIDE3LCAyLCA0LCAzLCA1LCA3LCAxNCwgNiwgOCwgMTYsIDksIDE4LCAwXSxcbi8vICAgICAgICAgICAgICAgICBcIjE4XCI6IFsxMywgMTUsIDEsIDE3LCAyLCA0LCAzLCA1LCA3LCAxNCwgNiwgOCwgMTYsIDksIDE4LCAwXSxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgIH07XG4vLyAgICAgICAgIGxldCB5dSA9IE1hdGguZmxvb3IoTnVtYmVyKGlpZCkgJSAxMDApLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgIGxldCBpcXo6IG51bWJlciA9IDEwMDsgLy/miJHmlrnliY3nvIBcbi8vICAgICAgICAgbGV0IGZxejogbnVtYmVyID0gMTAwMDsgLy/lr7nmlrnliY3nvIBcbi8vICAgICAgICAgaWYgKE51bWJlcihpaWQpID49IDEwMDApIHtcbi8vICAgICAgICAgICAgIGZxeiA9IDEwMDtcbi8vICAgICAgICAgICAgIGlxeiA9IDEwMDA7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0dHlwZS5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgaWYgKGZpaWRzLmxlbmd0aCA+PSB0YXJnZXRUeXBlKSB7XG4vLyAgICAgICAgICAgICAgICAgYnJlYWs7IC8v5bey57uP5om+5Yiw5LqGXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBsZXQgbXViaWFvID0gdHR5cGVbaV07XG4vLyAgICAgICAgICAgICBzd2l0Y2ggKG11Ymlhbykge1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMTogLy8x5pWM5pa55YWo5L2TXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWlkID0gKGZxeiArIDUpLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IHRoaXMuZmluZF9qaWFuc2VfZmlpZChmaWlkLCBkaXN0YW5jZSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSAhPSBudWxsICYmIHRoaXMudXVpZHNbZmlpZF0uZHpoZW4gPT0gMCAmJiBnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMucHVzaCgoZnF6ICsgNSkudG9TdHJpbmcoKSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1bXCIwXCJdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZIcCA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdID09IG51bGwgfHwgZkhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcy5wdXNoKGZpaWQpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMjogLy8y5YmN5o6S5pWM5pa5XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAzOiAvLzPkuK3mjpLmlYzmlrlcbi8vICAgICAgICAgICAgICAgICBjYXNlIDQ6IC8vNOWQjuaOkuaVjOaWuVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1beXVdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlpZCA9IChmcXogKyBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW3l1XVtrXSkudG9TdHJpbmcoKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmSHAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdID09IG51bGwgfHwgZkhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6ZqQ6JePXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gdGFyZ2V0VHlwZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMucHVzaChmaWlkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDU6IC8vIDXmlYzmlrnpmo/mnLoo5LiN6IO96ZqP5py65ZCM5LiA5Liq55uu5qCHKVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY3FsaXN0NTogc3RyaW5nW10gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3FsaXN0NS5wdXNoKGZpaWQpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGZpaWRzID0gdGhpcy5zZWVkUmFuZC5nZXRSYW5kQXJyKGNxbGlzdDUsIE1hdGgubWluKGNxbGlzdDUubGVuZ3RoLCB0YXJnZXRUeXBlKSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjogLy/oh6rlt7Fcbi8vICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSBbaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3OiAvLzflt7LmlrnlhajkvZNcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoaXF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMucHVzaChmaWlkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDg6IC8vIDjlt7Lmlrnpmo/mnLoo6Zmk6Ieq5bex5aSWKSjkuI3lj6/ku6Xpmo/mnLrlkIzkuIDkuKrnm67moIcpXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBjcWxpc3Q4OiBzdHJpbmdbXSA9IFtdO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1bXCIwXCJdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlpZCA9IChpcXogKyBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXVtrXSkudG9TdHJpbmcoKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmSHAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdID09IG51bGwgfHwgZkhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6ZqQ6JePXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlpZCA9PSBpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyjpmaToh6rlt7HlpJYpXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNxbGlzdDgucHVzaChmaWlkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IHRoaXMuc2VlZFJhbmQuZ2V0UmFuZEFycihjcWxpc3Q4LCBNYXRoLm1pbihjcWxpc3Q4Lmxlbmd0aCwgdGFyZ2V0VHlwZSkpO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDk6IC8vIDnkuIrmrKHmlLvlh7vmiJHnmoTlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnV1aWRzW2lpZF0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uZnBrICE9IFwiXCIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzLnB1c2godGhpcy51dWlkc1tpaWRdLmZwayk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDEwOiAvLyAxMOaVjOaWueaUu+WHu+WKm+acgOmrmOWNleS9jVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZk1heGF0azEwOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1bXCIwXCJdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlpZCA9IChmcXogKyBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXVtrXSkudG9TdHJpbmcoKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmSHAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdID09IG51bGwgfHwgZkhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6ZqQ6JePXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkF0ayA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmQXRrIDw9IGZNYXhhdGsxMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZk1heGF0azEwID0gZkF0aztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzID0gW2ZpaWRdO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMTE6IC8vIDEx5pWM5pa55pS75Ye75Yqb5pyA5L2O5Y2V5L2N77yMXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmTWluYXRrMTE6IG51bWJlciA9IDk5OTk5OTk5OTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZBdGsgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJhdGtcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkF0ayA+PSBmTWluYXRrMTEpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZNaW5hdGsxMSA9IGZBdGs7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IFtmaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDEyOiAvLyAxMuaVjOaWueW9k+WJjeihgOmHj+acgOS9juWNleS9jVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZk1pbmhwMTI6IG51bWJlciA9IDk5OTk5OTk5OTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZBdGsgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmQXRrID49IGZNaW5ocDEyKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmTWluaHAxMiA9IGZBdGs7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IFtmaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDEzOiAvLyAxM+aVjOaWueW9k+WJjeihgOmHj+acgOmrmOWNleS9je+8jFxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZk1heGhwMTM6IG51bWJlciA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl0ubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWlkID0gKGZxeiArIG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1bXCIwXCJdW2tdKS50b1N0cmluZygpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZIcCA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0gPT0gbnVsbCB8fCBmSHAgPD0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLnRlYW1zW2ZpaWRdLmlzSGlkZSkgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/pmpDol49cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmQXRrID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkF0ayA8PSBmTWF4aHAxMykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZk1heGhwMTMgPSBmQXRrO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSBbZmlpZF07XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAxNTogLy8gMTUg5oiR5omT55qE5pyA5ZCO5LiA5LiqXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uaXBrICE9IFwiXCIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzID0gW3RoaXMudXVpZHNbaWlkXS5pcGtdO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMTY6IC8vMTbnlJ/lkb3lgLzmnIDkvY7nmoTlt7LmlrnljZXkvY0pXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBtaW5IcDogbnVtYmVyID0gMDtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoaXF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbkhwID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IFtmaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5IcCA9IGZIcDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbkhwID4gZkhwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhwID0gZkhwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IFtmaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAxNzogLy8xNyDmiJHmlrnkuLvop5Jcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGlxei50b1N0cmluZygpLmxlbmd0aCA+IDMpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzID0gW1wiMTAwMFwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzID0gW1wiMTAwXCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMTg6IC8vMTjlt7HmlrnlhajkvZPlvJ/lrZBcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMucHVzaChmaWlkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDE5OiAvLyAxOSDkuIrmrKHmiJHmlLvlh7vnmoTlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5pcGtzW3RoaXMuemhlbl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSB0aGlzLnV1aWRzW2lpZF0uaXBrc1t0aGlzLnpoZW5dO1xuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDIwOiAvLyAyMCDpmo/mnLrlt7Hmlrl45Liq5byf5a2QXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBjcWxpc3QyMDogc3RyaW5nW10gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3FsaXN0MjAucHVzaChmaWlkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IHRoaXMuc2VlZFJhbmQuZ2V0UmFuZEFycihjcWxpc3QyMCwgTWF0aC5taW4oY3FsaXN0MjAubGVuZ3RoLCB0YXJnZXRUeXBlKSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMjE6IC8vIDIxIOaVjOaWueS4u+inklxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoaXF6LnRvU3RyaW5nKCkubGVuZ3RoID4gMykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSBbXCIxMDBcIl07XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IFtcIjEwMDBcIl07XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAyMjogLy8gMjIg5pWM5pa55byC5bi454q25oCB5pWM5Lq6XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBjcWxpc3QyMjogc3RyaW5nW10gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW1wiMFwiXS5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSAoZnF6ICsgbWJsaXN0W211Ymlhby50b1N0cmluZygpXVtcIjBcIl1ba10pLnRvU3RyaW5nKCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkhwID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsIHx8IGZIcCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+makOiXj1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnVmZnMgPSBbXCJlZmZlY3RfaV8xXCIsIFwiZWZmZWN0X2lfM1wiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCIsIFwiZWZmZWN0X2lfN1wiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBidWZmcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnVmZiA9IGJ1ZmZzW2luZGV4XTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5za2J1ZmZfZ2V0KGZpaWQsIGJ1ZmYsIDIpID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcWxpc3QyMi5wdXNoKGZpaWQpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgZmlpZHMgPSB0aGlzLnNlZWRSYW5kLmdldFJhbmRBcnIoY3FsaXN0MjIsIE1hdGgubWluKGNxbGlzdDIyLmxlbmd0aCwgdGFyZ2V0VHlwZSkpO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDIzOiAvLyAyMyDmlLvlh7vmnIDov5Hnm67moIdcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGNxbGlzdDIzOiBzdHJpbmdbXSA9IFtdO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1ibGlzdFttdWJpYW8udG9TdHJpbmcoKV1beXVdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlpZCA9IChmcXogKyBtYmxpc3RbbXViaWFvLnRvU3RyaW5nKCldW3l1XVtrXSkudG9TdHJpbmcoKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmSHAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdID09IG51bGwgfHwgZkhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v6ZqQ6JePXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNxbGlzdDIzLnB1c2goZmlpZCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3FsaXN0MjMubGVuZ3RoID09IHRhcmdldFR5cGUpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBmaWlkcyA9IGNxbGlzdDIzO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWlkcy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUZpaWRzW2lpZF1ba2V5XS5sZW5ndGggPj0gdGFyZ2V0VHlwZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25lRmlpZHNbaWlkXVtrZXldLmluY2x1ZGVzKGZpaWRzW2ldKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1tpaWRdW2tleV0ucHVzaChmaWlkc1tpXSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDovoXliqnlh73mlbAgLSDojrflj5blr7nmiYtcbi8vICAgICAgKiBAcGFyYW0ga2V5IOagh+ivhmtleVxuLy8gICAgICAqIEBwYXJhbSBpaWQg5Ye65omL5pa5XG4vLyAgICAgICogQHBhcmFtIGRpc3RhbmNlIOiMg+WbtOWkp+WwjyjljYrlvoQpXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBmaW5kX2ppYW5zZV9maWlkKGZpaWQ6IHN0cmluZywgZGlzdGFuY2U6IG51bWJlcik6IHN0cmluZ1tdIHtcbi8vICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShkaXN0YW5jZSkgPT0gdHJ1ZSkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIFtdO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBmaWlkczogc3RyaW5nW10gPSBbXTtcblxuLy8gICAgICAgICAvL+aYr+S4jeaYr+iMg+WbtOinpuWPkVxuLy8gICAgICAgICBsZXQgZndsaXN0OiB7IFt3eGlkOiBzdHJpbmddOiB7IFtmdzogc3RyaW5nXTogbnVtYmVyW10gfSB9ID0ge1xuLy8gICAgICAgICAgICAgMTogeyAxOiBbMiwgNCwgNSwgMTMsIDE1XSwgMjogWzMsIDYsIDcsIDgsIDksIDE3XSwgMzogWzE0LCAxNiwgMTgsIDBdIH0sXG4vLyAgICAgICAgICAgICAyOiB7IDE6IFsxLCAzLCA0LCA1LCA2XSwgMjogWzcsIDgsIDksIDE0LCAxNiwgMTgsIDEzLCAxNSwgMTddLCAzOiBbMF0gfSxcbi8vICAgICAgICAgICAgIDM6IHsgMTogWzIsIDUsIDYsIDE0LCAxNl0sIDI6IFsxLCA0LCA3LCA4LCA5LCAxOF0sIDM6IFsxMywgMTUsIDE3LCAwXSB9LFxuLy8gICAgICAgICAgICAgNDogeyAxOiBbMSwgMiwgNSwgNywgOCwgMTMsIDE1LCAxN10sIDI6IFszLCA2LCA5LCAwXSwgMzogWzE0LCAxNiwgMThdIH0sXG4vLyAgICAgICAgICAgICA1OiB7IDE6IFsxLCAyLCAzLCA0LCA2LCA3LCA4LCA5XSwgMjogWzEzLCAxNSwgMTcsIDE0LCAxNiwgMTgsIDBdIH0sXG4vLyAgICAgICAgICAgICA2OiB7IDE6IFsyLCAzLCA1LCA4LCA5LCAxNCwgMTYsIDE4XSwgMjogWzEsIDQsIDcsIDBdLCAzOiBbMTMsIDE1LCAxN10gfSxcbi8vICAgICAgICAgICAgIDc6IHsgMTogWzQsIDUsIDgsIDAsIDE1LCAxN10sIDI6IFsxLCAyLCAzLCA2LCA5LCAxM10sIDM6IFsxNCwgMTYsIDE4XSB9LFxuLy8gICAgICAgICAgICAgODogeyAxOiBbMCwgNCwgNSwgNiwgNywgOV0sIDI6IFsxLCAyLCAzLCAxNCwgMTYsIDE4LCAxMywgMTUsIDE3XSB9LFxuLy8gICAgICAgICAgICAgOTogeyAxOiBbMCwgNSwgNiwgOCwgMTYsIDE4XSwgMjogWzEsIDIsIDMsIDQsIDcsIDE0XSwgMzogWzEzLCAxNSwgMTddIH0sXG4vLyAgICAgICAgICAgICAwOiB7IDE6IFs3LCA4LCA5XSwgMjogWzQsIDUsIDYsIDE1LCAxNiwgMTcsIDE4XSwgMzogWzEsIDIsIDMsIDEzLCAxNF0gfSxcbi8vICAgICAgICAgfTtcblxuLy8gICAgICAgICBsZXQgd3hpZCA9IE51bWJlcihmaWlkKSAlIDEwMDtcbi8vICAgICAgICAgbGV0IHF6OiBzdHJpbmcgPSBcIjEwXCI7IC8v5YmN57yAXG4vLyAgICAgICAgIGlmIChmaWlkLmxlbmd0aCA9PSA0KSB7XG4vLyAgICAgICAgICAgICBxeiA9IFwiMTAwXCI7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8PSBNYXRoLmZsb29yKGRpc3RhbmNlIC8gMTAwKTsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgaWYgKGZ3bGlzdFt3eGlkXSA9PSBudWxsIHx8IGZ3bGlzdFt3eGlkXVtpbmRleF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBmd2xpc3Rbd3hpZF1baW5kZXhdLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbcXogKyBmd2xpc3Rbd3hpZF1baW5kZXhdW2tdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1txeiArIGZ3bGlzdFt3eGlkXVtpbmRleF1ba11dLmVwcy5ocCA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoZmlpZHMuaW5jbHVkZXMocXogKyBmd2xpc3Rbd3hpZF1baW5kZXhdW2tdKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKCFnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1txeiArIGZ3bGlzdFt3eGlkXVtpbmRleF1ba11dLmlzSGlkZSkpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIOmakOiXj1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBmaWlkcy5wdXNoKHF6ICsgZndsaXN0W3d4aWRdW2luZGV4XVtrXSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIGZpaWRzO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOe7k+eul+WQhOenjeS8pOWus1xuLy8gICAgICAqIEBwYXJhbSBpaWQg5pS75Ye75pa5XG4vLyAgICAgICogQHBhcmFtIGZpaWQg6KKr5pS75Ye75pa5XG4vLyAgICAgICogQHBhcmFtIGEg5Lyk5a6z57O75pWwXG4vLyAgICAgICogQHBhcmFtIHNraWQg6Kem5Y+R5oqA6IO9XG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBqc19oaXRzKGlpZDogc3RyaW5nLCBmaWlkOiBzdHJpbmcsIGE6IG51bWJlciwgc2tpZDogc3RyaW5nKSB7XG4vLyAgICAgICAgIC8v5YW954G15pS75Ye7XG4vLyAgICAgICAgIGlmICh0aGlzLnRlYW1zW2lpZF0udHlwZSA9PSAzIHx8IE51bWJlcihpaWQpICUgMTAwID09IDEwKSB7XG4vLyAgICAgICAgICAgICBsZXQgbXppZDogbnVtYmVyID0gMTAwO1xuLy8gICAgICAgICAgICAgbGV0IGZ6aWQ6IG51bWJlciA9IDEwMDA7XG4vLyAgICAgICAgICAgICBpZiAoaWlkLmxlbmd0aCA+IDMpIHtcbi8vICAgICAgICAgICAgICAgICBtemlkID0gMTAwMDtcbi8vICAgICAgICAgICAgICAgICBmemlkID0gMTAwO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGlfel9hdGsgPSB0aGlzLnNrYnVmZl9nZXQobXppZC50b1N0cmluZygpLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgIGxldCBpX3pfcWhzaG91bGluZyA9IHRoaXMuc2tidWZmX2dldChtemlkLnRvU3RyaW5nKCksIFwicWhzaG91bGluZ1wiKTtcbi8vICAgICAgICAgICAgIGxldCBmX3pfcmhzaG91bGluZyA9IHRoaXMuc2tidWZmX2dldChmemlkLnRvU3RyaW5nKCksIFwicmhzaG91bGluZ1wiKTtcbi8vICAgICAgICAgICAgIGxldCBzbGhpdCA9ICgoaV96X2F0ayAqIGEpIC8gMTAwMDApICogTWF0aC5tYXgoMSwgMSArIChpX3pfcWhzaG91bGluZyAtIGZfel9yaHNob3VsaW5nKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgIC8v6L6T5Ye65Lyk5a6zZmpzUmF0ZVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMub25lSGl0W2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMub25lSGl0W2lpZF0gPSB7fTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMub25lSGl0W2lpZF1bZmlpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgcGdoaXQ6IE1hdGguZmxvb3Ioc2xoaXQpLCAvL+aZruaUu+S8pOWus1xuLy8gICAgICAgICAgICAgICAgIHNraGl0OiBNYXRoLmZsb29yKHNsaGl0KSwgLy/mioDog73kvKTlrrNcbi8vICAgICAgICAgICAgICAgICBiamhpdDogMCwgLy/mmrTlh7vkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBnZGhpdDogMCwgLy/moLzmjKHkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBmamhpdDogMCwgLy/lj43lh7vkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBsamhpdDogMCwgLy/ov57lh7vkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBqc2hpdDogMCwgLy/muoXlsITkvKTlrrMo5rKh5pyJ5oqY5o2f5q+U5L6L57O75pWwKVxuLy8gICAgICAgICAgICAgICAgIHh4aGl0OiAwLCAvL+WQuOihgOWAvFxuLy8gICAgICAgICAgICAgICAgIHh4UmF0ZTogMCwgLy/lkLjooYDlgLxcbi8vICAgICAgICAgICAgICAgICBqc1JhdGU6IDAsIC8v5ZC46KGA5YC8XG4vLyAgICAgICAgICAgICAgICAgZmpzUmF0ZTogMCwgLy/lkLjooYDlgLxcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+S8pOWus+WFrOW8j++8muaIkeaWueaUu+WHuz7mlYzmlrnpmLLlvqEg5aaC5p6c6L+Z5Liq5p2h5Lu25oiQ56uL77yM5pmu5pS75Lyk5a6z6LWw5LiL6Z2i5YWs5byPXG4vLyAgICAgICAgIC8v5pmu6YCa5Lyk5a6zPW1heCgo5oiR5pa55pS75Ye7LeaVjOaWuemYsuW+oSkqKDEr5oiR5pa55Lyk5a6z5aKe5by6LeaVjOaWueS8pOWus+WHj+W8sSks5oiR5pa55pS75Ye7KjAuMTUpKlJBTkRCRVRXRUVOKDAuOTcsMS4wMylcbi8vICAgICAgICAgLy/lkKbliJlcbi8vICAgICAgICAgLy/mma7pgJrkvKTlrrM9bWF4KDAsMC44NSpwb3co5oiR5pa55pS75Ye777yMMC44KSlcbi8vICAgICAgICAgbGV0IGlfYXRrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgbGV0IGZfZGVmOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJkZWZcIik7XG4vLyAgICAgICAgIGxldCBiYXNlX2hpdDogbnVtYmVyID0gMDsgLy/mma7pgJrkvKTlrrNcbi8vICAgICAgICAgaWYgKGlfYXRrID4gZl9kZWYpIHtcbi8vICAgICAgICAgICAgIGxldCBpX3plbmdzaGFuZzogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJ6ZW5nc2hhbmdcIik7XG4vLyAgICAgICAgICAgICBsZXQgZl9qaWFuc2hhbmc6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImppYW5zaGFuZ1wiKTtcbi8vICAgICAgICAgICAgIGJhc2VfaGl0ID0gKE1hdGgubWF4KCgoaV9hdGsgLSBmX2RlZikgKiAoMTAwMDAgKyBpX3plbmdzaGFuZyAtIGZfamlhbnNoYW5nKSkgLyAxMDAwMCwgaV9hdGsgKiAwLjE1KSAqIHRoaXMuc2VlZFJhbmQucmFuZCg5NywgMTAzKSkgLyAxMDA7XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICBiYXNlX2hpdCA9IE1hdGgubWF4KDAsIDAuODUgKiBNYXRoLnBvdyhpX2F0aywgMC44KSk7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBsZXQgaV9hID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhXCIpOyAvL+aViOaenOWKoOaIkFxuLy8gICAgICAgICBsZXQgaV83NSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaV83NVwiKTsgLy/mlYjmnpzliqDmiJBcbi8vICAgICAgICAgaWYgKGlfNzUgIT0gMCkge1xuLy8gICAgICAgICAgICAgLy8g5LiA5qyh5Yqg5oiQ55qE5pWI5p6cIOeUqOWujOa4heepulxuLy8gICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViX2FsbChpaWQsIFwiZWZmZWN0X2lfNzVcIik7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy8gbGV0IGZfYSA9IHRoaXMuc2tidWZmX2dldChmaWlkLFwiaV8zMFwiKSAgLy/kvKTlrrPliqDmt7Fcbi8vICAgICAgICAgLy/lr7nmnIDnu4jkvKTlrrPmnInmpoLnjofpgKDmiJBO5YCN5Lyk5a6zXG4vLyAgICAgICAgIGxldCBpX2FfcGVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhX3BlclwiKTsgLy/mlYjmnpzliqDmiJBcbi8vICAgICAgICAgaWYgKGlfYV9wZXIgIT0gMCkge1xuLy8gICAgICAgICAgICAgLy8g5LiA5qyh5Yqg5oiQ55qE5pWI5p6cIOeUqOWujOa4heepulxuLy8gICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViX2FsbChpaWQsIFwiZWZmZWN0X2lfNjdcIik7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaV9hX3BlciA9IGlfYV9wZXIgPyBpX2FfcGVyIDogMTtcbi8vICAgICAgICAgbGV0IGlfc2tfYSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwic2tfYVwiKTsgLy/mioDog73kvKTlrrPliqDmiJBcbi8vICAgICAgICAgLy/mma7lip/kvKTlrrNcbi8vICAgICAgICAgbGV0IHBnX2hpdCA9IChiYXNlX2hpdCAqIChhICsgaV9hICsgaV83NSkgKiBpX2FfcGVyKSAvIDEwMDAwO1xuLy8gICAgICAgICAvL+aKgOiDveS8pOWusz3mma7pgJrkvKTlrrMgKu+8iDAr5oqA6IO957O75pWw77yJXG4vLyAgICAgICAgIGxldCBza19oaXQ6IG51bWJlciA9IChiYXNlX2hpdCAqIChhICsgaV9hICsgaV83NSArIGlfc2tfYSkgKiBpX2FfcGVyKSAvIDEwMDAwO1xuXG4vLyAgICAgICAgIC8v5pmu6YCa5pS75Ye7ICsg6aKd5aSW5Lyk5a6zXG4vLyAgICAgICAgIGxldCBjZmdTayA9IEdhbWVjZmcuc2tpbGxCYXNlLmdldEl0ZW0oc2tpZCwgXCIxXCIpO1xuLy8gICAgICAgICBsZXQgenpoaXQgPSBwZ19oaXQ7IC8v5pyA57uI5Lyk5a6zXG4vLyAgICAgICAgIGlmIChjZmdTayAhPSBudWxsICYmIGNmZ1NrLnNraWxsVHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICB6emhpdCA9IHNrX2hpdDtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5pq05Ye75Lyk5a6zPVx05oqA6IO95Lyk5a6zKm1heCjmiJHmlrnlvLrljJbmmrTkvKQt5pWM5pa55b+96KeG5pq05LykLDEpXG4vLyAgICAgICAgIGxldCBpX2Jhb251ZTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJiYW9udWVcIik7XG4vLyAgICAgICAgIGxldCBmX3JlbmFpOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJyZW5haVwiKTtcbi8vICAgICAgICAgbGV0IGJqX2hpdDogbnVtYmVyID0genpoaXQgKiBNYXRoLm1heCgxLCAoaV9iYW9udWUgLSBmX3JlbmFpKSAvIDEwMDAwKTtcblxuLy8gICAgICAgICAvL+agvOaMoeS8pOWusz1cdE1JTijmioDog73kvKTlrrMqKE1BWCjmlYzmlrnmoLzmjKHlop7lvLot5oiR5pa55qC85oyh5YeP5byxLDAuMTIpKSzmioDog73kvKTlrrMqMC45KVxuLy8gICAgICAgICBsZXQgZl9xaGJsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJxaGJsb2NrXCIpO1xuLy8gICAgICAgICBsZXQgaV9yaGJsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInJoYmxvY2tcIik7XG4vLyAgICAgICAgIGxldCBnZF9oaXQ6IG51bWJlciA9IE1hdGgubWluKHp6aGl0ICogTWF0aC5tYXgoMC4xMiwgKGZfcWhibG9jayAtIGlfcmhibG9jaykgLyAxMDAwMCksIHp6aGl0ICogMC45KTtcblxuLy8gICAgICAgICAvL+WPjeWHu+S8pOWusz1cdE1JTijmioDog73kvKTlrrMqTUFYKOaVjOaWueWPjeWHu+WinuW8ui3miJHmlrnlj43lh7vlh4/lvLEsMSks5oiR5pa555Sf5ZG9KjAuODUpXG4vLyAgICAgICAgIGxldCBmX3FoZmFuamk6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcInFoZmFuamlcIik7XG4vLyAgICAgICAgIGxldCBpX3JoZmFuamk6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwicmhmYW5qaVwiKTtcbi8vICAgICAgICAgbGV0IGlfaHA6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgIGxldCBmal9oaXQ6IG51bWJlciA9IE1hdGgubWluKHp6aGl0ICogTWF0aC5tYXgoMSwgKGZfcWhmYW5qaSAtIGlfcmhmYW5qaSkgLyAxMDAwMCksIGlfaHAgKiAwLjkpO1xuXG4vLyAgICAgICAgIC8v6L+e5Ye75Lyk5a6zID0g5oqA6IO95Lyk5a6zKk1BWCjmiJHmlrnov57lh7vlop7lvLot5pWM5pa56L+e5Ye75YeP5byxLDEpXG4vLyAgICAgICAgIGxldCBpX3FobGlhbmppOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInFobGlhbmppXCIpO1xuLy8gICAgICAgICBsZXQgZl9yaGxpYW5qaTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwicmhsaWFuamlcIik7XG4vLyAgICAgICAgIGxldCBsal9oaXQ6IG51bWJlciA9IHp6aGl0ICogTWF0aC5tYXgoKGlfcWhsaWFuamkgLSBmX3JobGlhbmppKSAvIDEwMDAwICsgMSwgMSk7XG5cbi8vICAgICAgICAgLy/muoXlsITkvKTlrrM9XHTmnIDnu4jkvKTlrrMq5oqY5o2f5q+U5L6L57O75pWwKk1BWCjmiJHmlrnmuoXlsITlop7lvLot5pWM5pa55rqF5bCE5YeP5byxLDAuMTIpXG4vLyAgICAgICAgIC8v5oqY5o2f5q+U5L6L57O75pWwICDov5nkuKrov5novrnkuI3orqHnrpdcbi8vICAgICAgICAgbGV0IGlfamlhbnNoZTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJqaWFuc2hlXCIpO1xuLy8gICAgICAgICBsZXQgZl9oc2ppYW5zaGU6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhzamlhbnNoZVwiKTtcbi8vICAgICAgICAgbGV0IGJkamlhbnNoZTogbnVtYmVyID0gMDsgLy/kv53lupXlkLjooYBcbi8vICAgICAgICAgbGV0IGNmZ2pzID0gR2FtZWNmZy51c2VyRXAuZ2V0SXRlbShcImppYW5zaGVcIik7XG4vLyAgICAgICAgIGlmIChjZmdqcyAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICBiZGppYW5zaGUgPSBjZmdqcy5pbml0RXA7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGpzUmF0ZTogbnVtYmVyID0gTWF0aC5tYXgoaV9qaWFuc2hlIC0gZl9oc2ppYW5zaGUsIGJkamlhbnNoZSk7XG4vLyAgICAgICAgIGxldCBmanNSYXRlOiBudW1iZXIgPSBNYXRoLm1heChmX2hzamlhbnNoZSAtIGlfamlhbnNoZSwgYmRqaWFuc2hlKTtcbi8vICAgICAgICAgbGV0IGlfcWhqaWFuc2hlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInFoamlhbnNoZVwiKTtcbi8vICAgICAgICAgbGV0IGZfcmhqaWFuc2hlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJyaGppYW5zaGVcIik7XG4vLyAgICAgICAgIGxldCBqc19oaXQ6IG51bWJlciA9IHp6aGl0ICogTWF0aC5tYXgoKGlfcWhqaWFuc2hlIC0gZl9yaGppYW5zaGUpIC8gMTAwMDAsIDAuMTIpO1xuXG4vLyAgICAgICAgIC8v5ZC46KGA546HPW1heO+8iCjmiJHmlrnlkLjooYAt5pWM5pa55oqX5ZC46KGA77yJ77yM5ZC46KGA5L+d5bqV5Y+C5pWwKVxuLy8gICAgICAgICAvL+WQuOihgOWAvD1cdOacgOe7iOS8pOWus+WAvCptYXgo5oiR5pa55ZC46KGA5aKe5by6LeaVjOaWueWQuOihgOWHj+W8sSwxKSrlkLjooYDnjodcbi8vICAgICAgICAgbGV0IGlfeGl4dWU6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwieGl4dWVcIik7XG4vLyAgICAgICAgIGxldCBmX2hzeGl4dWU6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhzeGl4dWVcIik7XG4vLyAgICAgICAgIGxldCBiZHhpeHVlOiBudW1iZXIgPSAwOyAvL+S/neW6leWQuOihgFxuLy8gICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy51c2VyRXAuZ2V0SXRlbShcInhpeHVlXCIpO1xuLy8gICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgIGJkeGl4dWUgPSBjZmcuaW5pdEVwO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCB4eFJhdGU6IG51bWJlciA9IE1hdGgubWF4KGlfeGl4dWUgLSBmX2hzeGl4dWUsIGJkeGl4dWUpO1xuLy8gICAgICAgICBsZXQgaV9xaHhpeHVlOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcInFoeGl4dWVcIik7XG4vLyAgICAgICAgIGxldCBmX3JoeGl4dWU6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcInJoeGl4dWVcIik7XG4vLyAgICAgICAgIGxldCB4eF9oaXQ6IG51bWJlciA9ICh6emhpdCAqIE1hdGgubWF4KChpX3FoeGl4dWUgLSBmX3JoeGl4dWUpIC8gMTAwMDAgKyAxLCAxKSAqIHh4UmF0ZSkgLyAxMDAwMDtcblxuLy8gICAgICAgICBpZiAodGhpcy5vbmVIaXRbaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICB0aGlzLm9uZUhpdFtpaWRdID0ge307XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBpZiAoY2ZnU2sgIT0gbnVsbCAmJiBjZmdTay5za2lsbFR5cGUgPT0gMSkge1xuLy8gICAgICAgICAgICAgLy/mjIforqHnrpfmma7mlLtcbi8vICAgICAgICAgICAgIGxldCBwZ19oaXRfcGVyOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgLy/mma7mlLvmlr3liqBidWZmXG4vLyAgICAgICAgICAgICBsZXQgaV8xOV9hID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzE5X2FcIik7XG4vLyAgICAgICAgICAgICBsZXQgaV8xOV9pID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzE5X2lcIik7XG4vLyAgICAgICAgICAgICBpZiAoaV8xOV9hID4gMCAmJiBpXzE5X2kgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGVmX2lfMTlfaSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfXCIgKyBpXzE5X2ksIDIpO1xuLy8gICAgICAgICAgICAgICAgIHBnX2hpdF9wZXIgKz0gaV8xOV9hICogZWZfaV8xOV9pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGlfMzlfYSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaV8zOV9hXCIpO1xuLy8gICAgICAgICAgICAgcGdfaGl0X3BlciArPSBpXzM5X2E7XG4vLyAgICAgICAgICAgICBwZ19oaXQgKz0gKHBnX2hpdF9wZXIgLyAxMDAwMCkgKiBwZ19oaXQ7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+i+k+WHuuS8pOWus1xuLy8gICAgICAgICB0aGlzLm9uZUhpdFtpaWRdW2ZpaWRdID0ge1xuLy8gICAgICAgICAgICAgcGdoaXQ6IE1hdGguZmxvb3IocGdfaGl0KSwgLy/mma7mlLvkvKTlrrNcbi8vICAgICAgICAgICAgIHNraGl0OiBNYXRoLmZsb29yKHNrX2hpdCksIC8v5oqA6IO95Lyk5a6zXG4vLyAgICAgICAgICAgICBiamhpdDogTWF0aC5mbG9vcihial9oaXQpLCAvL+aatOWHu+S8pOWus1xuLy8gICAgICAgICAgICAgZ2RoaXQ6IE1hdGguZmxvb3IoZ2RfaGl0KSwgLy/moLzmjKHkvKTlrrNcbi8vICAgICAgICAgICAgIGZqaGl0OiBNYXRoLmZsb29yKGZqX2hpdCksIC8v5Y+N5Ye75Lyk5a6zXG4vLyAgICAgICAgICAgICBsamhpdDogTWF0aC5mbG9vcihsal9oaXQpLCAvL+i/nuWHu+S8pOWus1xuLy8gICAgICAgICAgICAganNoaXQ6IE1hdGguZmxvb3IoanNfaGl0KSwgLy/muoXlsITkvKTlrrMo5rKh5pyJ5oqY5o2f5q+U5L6L57O75pWwKVxuLy8gICAgICAgICAgICAgeHhoaXQ6IE1hdGguZmxvb3IoeHhfaGl0KSwgLy/lkLjooYDlgLxcbi8vICAgICAgICAgICAgIHh4UmF0ZTogeHhSYXRlLCAvL+WQuOihgOamgueOh1xuLy8gICAgICAgICAgICAganNSYXRlOiBqc1JhdGUsIC8v5rqF5bCE5qaC546HXG4vLyAgICAgICAgICAgICBmanNSYXRlOiBmanNSYXRlLCAvL+WPjeWHu+a6heWwhOamgueOh1xuLy8gICAgICAgICB9O1xuXG4vLyAgICAgICAgIC8v5Lyk5a6z5Yqg5rexXG4vLyAgICAgICAgIGlmICh0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzUzXCIsIDIpID4gMCkge1xuLy8gICAgICAgICAgICAgbGV0IGhpdDUzID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzUzXCIpO1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVIaXRbaWlkXVtmaWlkXSA9IHtcbi8vICAgICAgICAgICAgICAgICBwZ2hpdDogaGl0NTMsIC8v5pmu5pS75Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgc2toaXQ6IGhpdDUzLCAvL+aKgOiDveS8pOWus1xuLy8gICAgICAgICAgICAgICAgIGJqaGl0OiBoaXQ1MywgLy/mmrTlh7vkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBnZGhpdDogTWF0aC5mbG9vcihnZF9oaXQpLCAvL+agvOaMoeS8pOWus1xuLy8gICAgICAgICAgICAgICAgIGZqaGl0OiBNYXRoLmZsb29yKGZqX2hpdCksIC8v5Y+N5Ye75Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgbGpoaXQ6IGhpdDUzLCAvL+i/nuWHu+S8pOWus1xuLy8gICAgICAgICAgICAgICAgIGpzaGl0OiBoaXQ1MywgLy/muoXlsITkvKTlrrMo5rKh5pyJ5oqY5o2f5q+U5L6L57O75pWwKVxuLy8gICAgICAgICAgICAgICAgIHh4aGl0OiBNYXRoLmZsb29yKHh4X2hpdCksIC8v5ZC46KGA5YC8XG4vLyAgICAgICAgICAgICAgICAgeHhSYXRlOiB4eFJhdGUsIC8v5ZC46KGA5qaC546HXG4vLyAgICAgICAgICAgICAgICAganNSYXRlOiBqc1JhdGUsIC8v5rqF5bCE5qaC546HXG4vLyAgICAgICAgICAgICAgICAgZmpzUmF0ZTogZmpzUmF0ZSwgLy/lj43lh7vmuoXlsITmpoLnjodcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBpZiAoTnVtYmVyKGlpZCkgJSAxMDAgPCAxMCAmJiBOdW1iZXIoaWlkKSAlIDEwMCA+IDAgJiYgdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV82NFwiLCAyKSA+IDApIHtcbi8vICAgICAgICAgICAgIC8vIOaYr+W8n+WtkCDpppbmrKHlop7kvKRcbi8vICAgICAgICAgICAgIGxldCBpXzY0X2EgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImlfNjRfYVwiKTtcbi8vICAgICAgICAgICAgIGxldCBpXzY0X25aaGVuID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzY0X25aaGVuXCIpO1xuLy8gICAgICAgICAgICAgaWYgKGlfNjRfYSA+IDAgJiYgaV82NF9uWmhlbiA8PSB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICAvLyDlj6rliqDkuIDmrKFcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZCwgXCJlZmZlY3RfaV82NFwiKTtcbi8vICAgICAgICAgICAgICAgICB0aGlzLm9uZUhpdFtpaWRdW2ZpaWRdLnNraGl0ID0gTWF0aC5mbG9vcih0aGlzLm9uZUhpdFtpaWRdW2ZpaWRdLnNraGl0ICogKGlfNjRfYSAvIDEwMDAwICsgMSkpO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMub25lSGl0W2lpZF1bZmlpZF0ucGdoaXQgPSBNYXRoLmZsb29yKHRoaXMub25lSGl0W2lpZF1bZmlpZF0ucGdoaXQgKiAoaV82NF9hIC8gMTAwMDAgKyAxKSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICBwcml2YXRlIHNrX2Jhc2UyKGlpZDogc3RyaW5nLCBydW5TdGF0dXM6IG51bWJlciwgY3M6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fSkge1xuLy8gICAgICAgICBsZXQgdHlwZSA9IE51bWJlcihpaWQpICUgMTAwID09IDAgPyAxIDogTnVtYmVyKGlpZCkgJSAxMDAgPiAwICYmIE51bWJlcihpaWQpICUgMTAwIDwgMTAgPyAyIDogMztcbi8vICAgICAgICAgaWYgKHRoaXMub2JqZWN0c1tpaWQubGVuZ3RoXSA9PSBudWxsIHx8IHRoaXMub2JqZWN0c1tpaWQubGVuZ3RoXVt0eXBlXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGNmX3NrOiB7IFtza2lsbFR5cGU6IHN0cmluZ106IFtzdHJpbmcsIHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0sIG51bWJlcl1bXSB9ID0ge307IC8v5b2T5YmN6KaB6Kem5Y+R55qE5oqA6IO95bqTXG4vLyAgICAgICAgIGxldCBza2lkczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLm9iamVjdHNbaWlkLmxlbmd0aF1bdHlwZV0pO1xuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IHNraWRzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbi8vICAgICAgICAgICAgIGxldCBza2lkID0gc2tpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgbGV0IHNrbHYgPSB0aGlzLm9iamVjdHNbaWlkLmxlbmd0aF1bdHlwZV1bc2tpZF0uc2tsdjtcbi8vICAgICAgICAgICAgIGxldCBza2x2Q2QgPSAxMDA7XG4vLyAgICAgICAgICAgICBsZXQgY2ZnU2sgPSBHYW1lY2ZnLnNraWxsQmFzZS5nZXRJdGVtKHNraWQsIHNrbHYudG9TdHJpbmcoKSk7XG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2sgPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+ayoeaciei/meS4quaKgOiDvSAg5oiW6ICFIOi/meS4quaKgOiDveeahOinpuWPkeaXtuacuuS4jeWvuVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrLnJ1blN0YXR1cyAhPSBydW5TdGF0dXMpIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/msqHmnInov5nkuKrmioDog70gIOaIluiAhSDov5nkuKrmioDog73nmoTop6blj5Hml7bmnLrkuI3lr7lcbi8vICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrLnJ1blN0YXR1cyA9PT0gNCAmJiAhY2ZnU2suY2QgJiYgdGhpcy56aGVuICE9IDEpIHtcbi8vICAgICAgICAgICAgICAgICAvLyDmsqHmnIljZOeahCBydW5TdGF0dXM9NOeahOWPquWcqOaImOaWl+W8gOWni+aXtuWKoOS4gOasoVxuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvL+WPl+WIsOaUu+WHu+WQjuinpuWPkVxuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrLnJ1blN0YXR1cyA9PSAyKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/ooqvmiZPmrKHmlbBcbi8vICAgICAgICAgICAgICAgICBsZXQgYmRjb25zID0gdGhpcy51dWlkc1tpaWRdLmZjb25zWzBdICsgdGhpcy51dWlkc1tpaWRdLmZjb25zWzFdICsgdGhpcy51dWlkc1tpaWRdLmZjb25zWzJdO1xuLy8gICAgICAgICAgICAgICAgIGlmIChiZGNvbnMgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/ov5jmsqHooqvmiZNcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShjZmdTay5oaXROdW1iZXIpID09IGZhbHNlICYmIGJkY29ucyAlIGNmZ1NrLmhpdE51bWJlciA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5pyq57Sv6K6h5Yiw5qyh5pWwXG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfMyA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfM1wiLCAyKTtcbi8vICAgICAgICAgICAgIGlmIChlZmZfaV8zID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+aZleecqVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGVmZl9pXzUgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzVcIiwgMik7XG4vLyAgICAgICAgICAgICBpZiAoZWZmX2lfNSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/mmZXnnKlcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBlZmZfaV82ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV82XCIsIDIpO1xuLy8gICAgICAgICAgICAgaWYgKGVmZl9pXzYgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5Ye76YCAXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfMTYgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzE2XCIsIDIpO1xuLy8gICAgICAgICAgICAgaWYgKGVmZl9pXzE2ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+WFpeWumueKtuaAgVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvLygx5pmu5pS777yMMiDooqvliqjvvIwz5oqA6IO977yJXG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2suc2tpbGxUeXBlICE9IDEpIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgZWZmX2lfMSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfMVwiLCAyKTtcbi8vICAgICAgICAgICAgICAgICBpZiAoZWZmX2lfMSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgLy/msonpu5hcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvL+WIneWni+WMluaKgOiDvVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxhc3Q6IDAsIC8v5pyA5ZCO5LiA5qyh5Ye65omL5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuLy8gICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHt9LFxuLy8gICAgICAgICAgICAgICAgICAgICBlZmZlY3Q6IHt9LFxuLy8gICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAvL+aKgOiDvWNkXG4vLyAgICAgICAgICAgICBsZXQgY3MyOntba2V5OnN0cmluZ106bnVtYmVyfSA9IGdhbWVNZXRob2Qub2JqQ29weShjcylcbi8vICAgICAgICAgICAgIGNzMltcImNkXCJdID0gZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNkKSA/IDAgOiBjZmdTay5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgY3MyW1wiY2QyXCJdID0gZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNkMikgPyAwIDogKHBhcnNlSW50KGlpZCkgJSAxMDAgPT0gMTAgPyAoY2ZnU2suY2QyICogMzAgKiBza2x2Q2QpIC8gMTAwIDogY2ZnU2suY2QyICogMzApO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0ubGFzdCArIGNzW1wiY2RcIl0gPiB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/lhrfljbTml7bpl7Tov5jmsqHliLBcbi8vICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgLy/mrKHmlbDliKTlrppcbi8vICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnU2suY291bnQpID09IGZhbHNlICYmIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uY291bnQgPj0gY2ZnU2suY291bnQpIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/msqHmnInmrKHmlbDkuoZcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnU2suY2hhbmNlKSA9PSBmYWxzZSAmJiB0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApID4gY2ZnU2suY2hhbmNlICogMTAwMDApIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/msqHmnInop6blj5Hov5nkuKrmioDog71cbi8vICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrLnNraWxsVHlwZSA9PSAyKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/ooqvliqhcbi8vICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnU2suc2tpbGxUeXBlID09IDMpIHtcbi8vICAgICAgICAgICAgICAgICAvL+eJueauiuaKgOiDvVxuLy8gICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmF0ayk7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVNraWRcIiwgc2tpZCk7XG4vLyAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgIC8v5YWI5om+5Ye66Kem5Y+R55qE5oqA6IO9SURcbi8vICAgICAgICAgICAgIGlmIChjZl9za1tjZmdTay5za2lsbFR5cGVdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBjZl9za1tjZmdTay5za2lsbFR5cGVdID0gW107XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBjZl9za1tjZmdTay5za2lsbFR5cGVdLnB1c2goW3NraWQsIGNzMiwgc2tsdl0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiBjZl9zaztcbi8vICAgICB9XG4vLyAgICAgcHJpdmF0ZSBza19iYXNlT2JqUnVuNChpaWQ6IHN0cmluZykge1xuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudGVhbXNbaWlkXS5pc0hpZGUpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47IC8v6ZqQ6JePXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IHNraWRzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHRoaXMudGVhbXNbaWlkXS5zayk7XG4vLyAgICAgICAgIGxldCB0eXBlID0gTnVtYmVyKGlpZCkgJSAxMDAgPT0gMCA/IDEgOiBOdW1iZXIoaWlkKSAlIDEwMCA+IDAgJiYgTnVtYmVyKGlpZCkgJSAxMDAgPCAxMCA/IDIgOiAzO1xuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IHNraWRzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbi8vICAgICAgICAgICAgIGxldCBza2lkID0gc2tpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgbGV0IHNrbHYgPSB0aGlzLnRlYW1zW2lpZF0uc2tbc2tpZF1bMF07XG4vLyAgICAgICAgICAgICBsZXQgY2ZnU2sgPSBHYW1lY2ZnLnNraWxsQmFzZS5nZXRJdGVtKHNraWQsIHNrbHYudG9TdHJpbmcoKSk7XG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2sgJiYgY2ZnU2sub2JqZWN0ICYmIHR5cGUgIT0gY2ZnU2sub2JqZWN0KSB7XG4vLyAgICAgICAgICAgICAgICAgLy8g6Z2e57uZ6Ieq5bex5Yqg55qE5oqA6IO9IOWcqOaImOaWl+WJjeWIneWni+WMllxuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLm9iamVjdHNbaWlkLmxlbmd0aF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLm9iamVjdHNbaWlkLmxlbmd0aF0gPSB7fTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMub2JqZWN0c1tpaWQubGVuZ3RoXVtjZmdTay5vYmplY3RdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmplY3RzW2lpZC5sZW5ndGhdW2NmZ1NrLm9iamVjdF0gPSB7fTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMub2JqZWN0c1tpaWQubGVuZ3RoXVtjZmdTay5vYmplY3RdW2NmZ1NrLmlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JqZWN0c1tpaWQubGVuZ3RoXVtjZmdTay5vYmplY3RdW2NmZ1NrLmlkXSA9IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNkOiBjZmdTay5jZCA/IGNmZ1NrLmNkIDogMCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHNrbHY6IHNrbHYsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpaWRzOiB7fSxcbi8vICAgICAgICAgICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g5oqA6IO96Kem5Y+RXG4vLyAgICAgICogQHBhcmFtIGlpZCDop6blj5HogIVcbi8vICAgICAgKiBAcGFyYW0gcnVuU3RhdHVzICDmioDog73op6blj5Hml7bmnLpcbi8vICAgICAgKiAx77ya5pS75Ye75pe26YCg5oiQ5Lyk5a6zXG4vLyAgICAgICogMu+8muWPl+WIsOaUu+WHu+aXtlxuLy8gICAgICAqIDPvvJrngbXlipvmu6HmgJLml7bph4rmlL5cbi8vICAgICAgKiA077ya6L+b5YWl5oiY5paX5ZCO77yM6L+Y5rKh5pS75Ye75YmNXG4vLyAgICAgICogNe+8mui/m+WFpeaImOaWl+WQjix456eS5YaFXG4vLyAgICAgICogNjrmlLvlh7vml7bpgKDmiJDkvKTlrrPvvIzlubbkuJTnm67moIfmiJDlip/moLzmjKHvvIjms6jmhI/lkowx57G75Z6L5piv5LiN5ZCM55qE77yJXG4vLyAgICAgICogNy7lj43lh7vml7Zcbi8vICAgICAgKiA4LuiHqui6q+agvOaMoeaXtuOAguWSjDbnsbvlnovkuI3lkIzvvIw257G75Z6L5piv5pWM5pa55qC85oyhXG4vLyAgICAgICpcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHNrX2Jhc2UoaWlkOiBzdHJpbmcsIHJ1blN0YXR1czogbnVtYmVyLCBjczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9KSB7XG4vLyAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tpaWRdLmlzSGlkZSkgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy/pmpDol49cbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgc2tpZHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy50ZWFtc1tpaWRdLnNrKTtcbi8vICAgICAgICAgbGV0IHR5cGUgPSBOdW1iZXIoaWlkKSAlIDEwMCA9PSAwID8gMSA6IE51bWJlcihpaWQpICUgMTAwID4gMCAmJiBOdW1iZXIoaWlkKSAlIDEwMCA8IDEwID8gMiA6IDM7XG4vLyAgICAgICAgIGxldCBjZl9zazogeyBbc2tpbGxUeXBlOiBzdHJpbmddOiBbc3RyaW5nLCB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9LCBudW1iZXJdW10gfSA9IHt9OyAvL+W9k+WJjeimgeinpuWPkeeahOaKgOiDveW6k1xuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IHNraWRzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbi8vICAgICAgICAgICAgIGxldCBza2lkID0gc2tpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgbGV0IHNrbHYgPSB0aGlzLnRlYW1zW2lpZF0uc2tbc2tpZF1bMF07XG4vLyAgICAgICAgICAgICBsZXQgc2tsdkNkID0gdGhpcy50ZWFtc1tpaWRdLnNrW3NraWRdWzFdO1xuLy8gICAgICAgICAgICAgbGV0IGNmZ1NrID0gR2FtZWNmZy5za2lsbEJhc2UuZ2V0SXRlbShza2lkLCBza2x2LnRvU3RyaW5nKCkpO1xuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/msqHmnInov5nkuKrmioDog70gIOaIluiAhSDov5nkuKrmioDog73nmoTop6blj5Hml7bmnLrkuI3lr7lcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGlmIChjZmdTay5vYmplY3QgJiYgdHlwZSAhPSBjZmdTay5vYmplY3QpIHtcbi8vICAgICAgICAgICAgICAgICAvLyDkuI3mmK/liqDnu5noh6rlt7HnmoTmioDog71cbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnU2sucnVuU3RhdHVzICE9IHJ1blN0YXR1cykge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+ayoeaciei/meS4quaKgOiDvSAg5oiW6ICFIOi/meS4quaKgOiDveeahOinpuWPkeaXtuacuuS4jeWvuVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvL+WPl+WIsOaUu+WHu+WQjuinpuWPkVxuLy8gICAgICAgICAgICAgaWYgKGNmZ1NrLnJ1blN0YXR1cyA9PSAyKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/ooqvmiZPmrKHmlbBcbi8vICAgICAgICAgICAgICAgICBsZXQgYmRjb25zID0gdGhpcy51dWlkc1tpaWRdLmZjb25zWzBdICsgdGhpcy51dWlkc1tpaWRdLmZjb25zWzFdICsgdGhpcy51dWlkc1tpaWRdLmZjb25zWzJdO1xuLy8gICAgICAgICAgICAgICAgIGlmIChiZGNvbnMgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/ov5jmsqHooqvmiZNcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShjZmdTay5oaXROdW1iZXIpID09IGZhbHNlICYmIGJkY29ucyAlIGNmZ1NrLmhpdE51bWJlciA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5pyq57Sv6K6h5Yiw5qyh5pWwXG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfMyA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfM1wiLCAyKTtcbi8vICAgICAgICAgICAgIGlmIChlZmZfaV8zID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+aZleecqVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgbGV0IGVmZl9pXzUgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzVcIiwgMik7XG4vLyAgICAgICAgICAgICBpZiAoZWZmX2lfNSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/mmZXnnKlcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBlZmZfaV82ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV82XCIsIDIpO1xuLy8gICAgICAgICAgICAgaWYgKGVmZl9pXzYgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5Ye76YCAXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfMTYgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImVmZmVjdF9pXzE2XCIsIDIpO1xuLy8gICAgICAgICAgICAgaWYgKGVmZl9pXzE2ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+WFpeWumueKtuaAgVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvLygx5pmu5pS777yMMiDooqvliqjvvIwz5oqA6IO977yJXG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2suc2tpbGxUeXBlICE9IDEpIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgZWZmX2lfMSA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiZWZmZWN0X2lfMVwiLCAyKTtcbi8vICAgICAgICAgICAgICAgICBpZiAoZWZmX2lfMSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgLy/msonpu5hcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAvL+WIneWni+WMluaKgOiDvVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxhc3Q6IDAsIC8v5pyA5ZCO5LiA5qyh5Ye65omL5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuLy8gICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHt9LFxuLy8gICAgICAgICAgICAgICAgICAgICBlZmZlY3Q6IHt9LFxuLy8gICAgICAgICAgICAgICAgIH07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAvL+aKgOiDvWNkXG4vLyAgICAgICAgICAgICBsZXQgY3MyOntba2V5OnN0cmluZ106bnVtYmVyfSA9IGdhbWVNZXRob2Qub2JqQ29weShjcylcbi8vICAgICAgICAgICAgIGNzMltcImNkXCJdID0gZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNkKSA/IDAgOiAocGFyc2VJbnQoaWlkKSAlIDEwMCA9PSAxMCA/IChjZmdTay5jZCAqIDMwICogc2tsdkNkKSAvIDEwMCA6IGNmZ1NrLmNkICogMzApO1xuLy8gICAgICAgICAgICAgY3MyW1wiY2QyXCJdID0gZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNkMikgPyAwIDogKHBhcnNlSW50KGlpZCkgJSAxMDAgPT0gMTAgPyAoY2ZnU2suY2QyICogMzAgKiBza2x2Q2QpIC8gMTAwIDogY2ZnU2suY2QyICogMzApO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0ubGFzdCArIGNzMltcImNkXCJdID4gdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5Ya35Y205pe26Ze06L+Y5rKh5YiwXG4vLyAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgIC8v5qyh5pWw5Yik5a6aXG4vLyAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNvdW50KSA9PSBmYWxzZSAmJiB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmNvdW50ID49IGNmZ1NrLmNvdW50KSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5rKh5pyJ5qyh5pWw5LqGXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ1NrLmNoYW5jZSkgPT0gZmFsc2UgJiYgdGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA+IGNmZ1NrLmNoYW5jZSAqIDEwMDAwKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5rKh5pyJ6Kem5Y+R6L+Z5Liq5oqA6IO9XG4vLyAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgIGlmIChjZmdTay5za2lsbFR5cGUgPT0gMikge1xuLy8gICAgICAgICAgICAgICAgIC8v6KKr5YqoXG4vLyAgICAgICAgICAgICB9IGVsc2UgaWYgKGNmZ1NrLnNraWxsVHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICAgICAgLy/nibnmrormioDog71cbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrX2Jhc2UoaWlkLCA1LCBjczIpO1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmF0ayk7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVNraWRcIiwgc2tpZCk7XG4vLyAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgIC8v5YWI5om+5Ye66Kem5Y+R55qE5oqA6IO9SURcbi8vICAgICAgICAgICAgIGlmIChjZl9za1tjZmdTay5za2lsbFR5cGVdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBjZl9za1tjZmdTay5za2lsbFR5cGVdID0gW107XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBjZl9za1tjZmdTay5za2lsbFR5cGVdLnB1c2goW3NraWQsIGNzMiwgc2tsdl0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIC8vIOiOt+WPluWFseS6q+aKgOiDvVxuLy8gICAgICAgICBsZXQgY2Zfc2syID0gdGhpcy5za19iYXNlMihpaWQsIHJ1blN0YXR1cywgY3MpO1xuLy8gICAgICAgICBpZiAoY2Zfc2syICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoY2Zfc2syKTtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIGxldCBrZXlzMiA9IE9iamVjdC5rZXlzKGNmX3NrMltrZXlzW2ldXSk7XG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzMi5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2Zfc2tba2V5c1tpXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2Zfc2tba2V5c1tpXV0gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBjZl9za1trZXlzW2ldXS5wdXNoKGNmX3NrMltrZXlzW2ldXVtrXSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIC8v6Kem5Y+R55qE5oqA6IO95YiX6KGoXG4vLyAgICAgICAgIGxldCBjZmlkczogW3N0cmluZywgeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSwgbnVtYmVyXVtdID0gW107XG4vLyAgICAgICAgIGlmIChjZl9za1szXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAvL+WPquimgeinpuWPkemrmOe6p+aKgOiDvSAg5bCx5LiN6Kem5Y+R5pmu6YCa5pS75Ye75oqA6IO9XG4vLyAgICAgICAgICAgICBjZmlkcyA9IGdhbWVNZXRob2QuYWRkQXJyKGNmaWRzLCBjZl9za1szXSk7XG4vLyAgICAgICAgIH0gZWxzZSBpZiAoY2Zfc2tbMV0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgY2ZpZHMgPSBnYW1lTWV0aG9kLmFkZEFycihjZmlkcywgY2Zfc2tbMV0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmIChjZl9za1syXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAvL+iiq+WKqOaKgOiDvVxuLy8gICAgICAgICAgICAgY2ZpZHMgPSBnYW1lTWV0aG9kLmFkZEFycihjZmlkcywgY2Zfc2tbMl0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmIChjZmlkcy5sZW5ndGggPD0gMCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIC8vIOi/memHjOaJjeaYr+ecn+ato+WHuuaJi+S6hueahOWcsOaWuVxuLy8gICAgICAgICBpZiAocnVuU3RhdHVzICE9IDQgJiYgcnVuU3RhdHVzICE9IDIgJiYgcnVuU3RhdHVzICE9IDcgJiYgcnVuU3RhdHVzICE9IDgpIHtcbi8vICAgICAgICAgICAgIC8vIOaImOaWl+WJjeinpuWPkeeahOeJueaApy/ooqvliqgg5LiN566XXG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0ubGFzdCA9IHRoaXMuemhlbjtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhjZmlkcyk7XG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICBpZiAodmFsdWVzW2ldWzFdW1wiZG9faWlkXCJdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB2YWx1ZXNbaV1bMV1bXCJkb19paWRcIl0gPSBOdW1iZXIoaWlkKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBjczIgPSB2YWx1ZXNbaV1bMV1cbi8vICAgICAgICAgICAgIGlmIChjczJbXCJoaXRcIl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHZhbHVlc1tpXVsxXVtcImhpdFwiXSA9IGNzMltcImhpdFwiXTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGxldCBza2lkID0gdmFsdWVzW2ldWzBdO1xuLy8gICAgICAgICAgICAgbGV0IHNrbHYgPSB2YWx1ZXNbaV1bMl07XG4vLyAgICAgICAgICAgICBsZXQgY2ZnU2sgPSBHYW1lY2ZnLnNraWxsQmFzZS5nZXRJdGVtKHZhbHVlc1tpXVswXSwgc2tsdi50b1N0cmluZygpKTtcbi8vICAgICAgICAgICAgIGlmIChjZmdTayA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5rKh5pyJ6L+Z5Liq5oqA6IO9ICDmiJbogIUg6L+Z5Liq5oqA6IO955qE6Kem5Y+R5pe25py65LiN5a+5XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2sudHlwZSA9PSBcIjNcIil7XG4vLyAgICAgICAgICAgICAgICAgLy8g5pyv5rOV6Kem5Y+RXG4vLyAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiZWZmZWN0XCIsIFtcInNodWZhXCIsc2tpZF0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5sYXN0ID0gdGhpcy56aGVuICsgKGNzMltcImNkMlwiXT4wJiZjczJbXCJjZFwiXT09MD9jczJbXCJjZDJcIl06MCk7XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmNvdW50ICs9IDE7XG4vLyAgICAgICAgICAgICBpZiAoY2ZnU2suc2VxdWVuY2UgPT0gMikge1xuLy8gICAgICAgICAgICAgICAgIC8v5pWI5p6c5YiX6KGoXG4vLyAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShjZmdTay5lZmZlY3QpID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0SWQgPSBcIlwiO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNmZ1NrLmVmZmVjdC5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCB2YWx1ZXNbaV1bMF0sIGNmZ1NrLmVmZmVjdFtrXS50b1N0cmluZygpLCBsYXN0SWQsIHZhbHVlc1tpXVsxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SWQgPSBcImVmZmVjdF9pZF9cIiArIGNmZ1NrLmVmZmVjdFtrXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAvL+ihjOS4uuWIl+ihqFxuLy8gICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnU2suYWN0aW9ucykgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RJZCA9IFwiXCI7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjZmdTay5hY3Rpb25zLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFjSWQgPSBjZmdTay5hY3Rpb25zW2luZGV4XTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfYWN0aW9uKGlpZCwgdmFsdWVzW2ldWzBdLCBhY0lkLnRvU3RyaW5nKCksIGxhc3RJZCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SWQgPSBcImFjdGlvbl9pZF9cIiArIGFjSWQ7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgIC8v6KGM5Li65YiX6KGoXG4vLyAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShjZmdTay5hY3Rpb25zKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdElkID0gXCJcIjtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNmZ1NrLmFjdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWNJZCA9IGNmZ1NrLmFjdGlvbnNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19hY3Rpb24oaWlkLCB2YWx1ZXNbaV1bMF0sIGFjSWQudG9TdHJpbmcoKSwgbGFzdElkKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJZCA9IFwiYWN0aW9uX2lkX1wiICsgYWNJZDtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAvL+aViOaenOWIl+ihqFxuLy8gICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnU2suZWZmZWN0KSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdElkID0gXCJcIjtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjZmdTay5lZmZlY3QubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgdmFsdWVzW2ldWzBdLCBjZmdTay5lZmZlY3Rba10udG9TdHJpbmcoKSwgbGFzdElkLCB2YWx1ZXNbaV1bMV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGFzdElkID0gXCJlZmZlY3RfaWRfXCIgKyBjZmdTay5lZmZlY3Rba107XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g5oqA6IO96KGM5Li6XG4vLyAgICAgICogQHBhcmFtIGlpZCDop6blj5HogIVcbi8vICAgICAgKiBAcGFyYW0gcnVuU3RhdHVzICDmioDog73op6blj5Hml7bmnLpcbi8vICAgICAgKiAx77ya5pS75Ye75pe26YCg5oiQ5Lyk5a6zXG4vLyAgICAgICogMu+8muWPl+WIsOaUu+WHu+aXtlxuLy8gICAgICAqIDPvvJrngbXlipvmu6HmgJLml7bph4rmlL5cbi8vICAgICAgKiA077ya6L+b5YWl5oiY5paX5ZCO77yM6L+Y5rKh5pS75Ye75YmNXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza19hY3Rpb24oaWlkOiBzdHJpbmcsIHNraWQ6IHN0cmluZywgYWNJZDogc3RyaW5nLCBleHRlbmQ6IHN0cmluZyA9IFwiXCIpIHtcbi8vICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLnRlYW1zW2lpZF0uaXNIaWRlKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgcmV0dXJuOyAvL+makOiXj1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBjZmdBYyA9IEdhbWVjZmcuc2tpbGxBY3Rpb24uZ2V0SXRlbShhY0lkKTtcbi8vICAgICAgICAgaWYgKGNmZ0FjID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAodGhpcy5vbmVGaWlkc1tpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHRoaXMub25lRmlpZHNbaWlkXSA9IHt9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBhY190dHlwZSA9IFwiYWN0aW9uX2lkX1wiICsgYWNJZDsgLy/lr7nmiYvmoIfor4Zcbi8vICAgICAgICAgLy/nu6fmib/kuIrkuIDmrKHnmoTnm67moIdcbi8vICAgICAgICAgaWYgKGV4dGVuZCAhPSBcIlwiKSB7XG4vLyAgICAgICAgICAgICAvL+i/memHjOWPr+S7peWFiOe7p+aJv1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1tpaWRdW2FjX3R0eXBlXSA9IHRoaXMub25lRmlpZHNbaWlkXVtleHRlbmRdO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCB0YXJnZXRUeXBlOiBudW1iZXIgPSAwOyAvL+ebruagh+aVsOmHj1xuLy8gICAgICAgICAvL+ebruagh+aVsOmHj1xuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0FjLnRhcmdldFR5cGUpID09IHRydWUpIHtcbi8vICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAxMDtcbi8vICAgICAgICAgfSBlbHNlIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnQWMudGFyZ2V0VHlwZVsxXSkgPT0gdHJ1ZSkge1xuLy8gICAgICAgICAgICAgdGFyZ2V0VHlwZSA9IGNmZ0FjLnRhcmdldFR5cGVbMF07XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICB0YXJnZXRUeXBlID0gdGhpcy5zZWVkUmFuZC5yYW5kKGNmZ0FjLnRhcmdldFR5cGVbMF0sIGNmZ0FjLnRhcmdldFR5cGVbMV0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMuZmluZF9maWlkcyhhY190dHlwZSwgaWlkLCBjZmdBYy50dHlwZSwgdGFyZ2V0VHlwZSwgY2ZnQWMuZGlzdGFuY2UpOyAvL+mAieaLqeWvueaJi1xuXG4vLyAgICAgICAgIGxldCBjczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHsgZG9faWlkOiBOdW1iZXIoaWlkKSB9O1xuLy8gICAgICAgICAvL+mAoOaIkOS8pOWus1xuLy8gICAgICAgICBpZiAoY2ZnQWMuYXJnc1tcImFcIl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9kbygzMDEsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSB9KTsgLy/mlLvlh7vliY3op6blj5Fcbi8vICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vbmVGaWlkc1tpaWRdW2FjX3R0eXBlXS5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMuanNfaGl0cyhpaWQsIHRoaXMub25lRmlpZHNbaWlkXVthY190dHlwZV1baV0sIGNmZ0FjLmFyZ3NbXCJhXCJdICogMTAwMDAsIHNraWQpOyAvL+iuoeeul+S8pOWus1xuLy8gICAgICAgICAgICAgICAgIGxldCBjczIgPSB0aGlzLnNrX2FjdGlvbl90eXBlXzEoaWlkLCB0aGlzLm9uZUZpaWRzW2lpZF1bYWNfdHR5cGVdW2ldLCBza2lkLCBhY0lkKTtcbi8vICAgICAgICAgICAgICAgICBjcyA9IE9iamVjdC5hc3NpZ24oY3MsIGNzMik7XG4vLyAgICAgICAgICAgICAgICAgY3NbdGhpcy5vbmVGaWlkc1tpaWRdW2FjX3R0eXBlXVtpXV0gPSBjczJbXCJoaXRcIl07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy/pgKDmiJDkvKTlrrMgIC0g5pyv5rOVXG4vLyAgICAgICAgIGlmIChjZmdBYy5hcmdzW1wiYXRrXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oMzAxLCB7IGRvX2lpZDogTnVtYmVyKGlpZCkgfSk7IC8v5pS75Ye75YmN6Kem5Y+RXG4vLyAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub25lRmlpZHNbaWlkXVthY190dHlwZV0ubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmpzX2hpdHMoaWlkLCB0aGlzLm9uZUZpaWRzW2lpZF1bYWNfdHR5cGVdW2ldLCBjZmdBYy5hcmdzW1wiYXRrXCJdLCBza2lkKTsgLy/orqHnrpfkvKTlrrNcbi8vICAgICAgICAgICAgICAgICBsZXQgY3MyID0gdGhpcy5za19hY3Rpb25fdHlwZV8xKGlpZCwgdGhpcy5vbmVGaWlkc1tpaWRdW2FjX3R0eXBlXVtpXSwgc2tpZCwgYWNJZCk7XG4vLyAgICAgICAgICAgICAgICAgY3MgPSBPYmplY3QuYXNzaWduKGNzLCBjczIpO1xuLy8gICAgICAgICAgICAgICAgIGNzW3RoaXMub25lRmlpZHNbaWlkXVthY190dHlwZV1baV1dID0gY3MyW1wiaGl0XCJdO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/op6blj5FlZmZlY3Rcbi8vICAgICAgICAgaWYgKGNmZ0FjLmFyZ3NbXCJpZFwiXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICBsZXQgcCA9IDA7IC8vYnVmZuinpuWPkeamgueOh1xuLy8gICAgICAgICAgICAgaWYgKGNmZ0FjLmFyZ3NbXCJwXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBwID0gY2ZnQWMuYXJnc1tcInBcIl0gKiAxMDAwMDsgLy9idWZm6Kem5Y+R5qaC546HXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBwKSB7XG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZmdBYy5hcmdzLmlkLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNzW1wibmV4dGlkXCJdID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdBYy5hcmdzLmlkW2ldLnRvU3RyaW5nKCksIGFjX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/mnInmpoLnjofnu5nmiJHmlrnlvJ/lrZDmjILkuIDkuKrlj43lh7tidWZmXG4vLyAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnQWMuY2FuYmVhdGJhY2spID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICBsZXQgcCA9IDA7IC8vYnVmZuinpuWPkeamgueOh1xuLy8gICAgICAgICAgICAgaWYgKGNmZ0FjLmFyZ3NbXCJwXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICBwID0gY2ZnQWMuYXJnc1tcInBcIl0gKiAxMDAwMDsgLy9idWZm6Kem5Y+R5qaC546HXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGZpaWQgPSB0aGlzLnRlYW1GaWlkc1tpbmRleF07XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0udHlwZSAhPSAyKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+S4jeaYr+W8n+WtkFxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPD0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy9cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKGlpZC5sZW5ndGggIT0gZmlpZC5sZW5ndGgpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5LiN5piv5ZCM6Zi16JCl55qEXG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApIDw9IHApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiY2FuYmVhdGJhY2tcIiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIDMwICogNDUsIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogMSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiAxLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7fSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g5oqA6IO95pWI5p6cXG4vLyAgICAgICogQHBhcmFtIGlpZCDop6blj5HogIVcbi8vICAgICAgKiBAcGFyYW0gc2tpZCDmioDog71JRFxuLy8gICAgICAqIEBwYXJhbSBlZmZlY3RJZCDmlYjmnpxJRFxuLy8gICAgICAqIEBwYXJhbSBleHRlbmQg57un5om/55uu5qCHa2V5XG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza19lZmZlY3QoaWlkOiBzdHJpbmcsIHNraWQ6IHN0cmluZywgZWZmZWN0SWQ6IHN0cmluZywgZXh0ZW5kOiBzdHJpbmcgPSBcIlwiLCBjczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9KSB7XG4vLyAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy50ZWFtc1tpaWRdLmlzSGlkZSkgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy/pmpDol49cbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGxldCBjZmdCYXNlID0gR2FtZWNmZy5za2lsbEJhc2UuZ2V0SXRlbShza2lkLCBcIjFcIik7XG4vLyAgICAgICAgIGxldCBjZmdFZiA9IEdhbWVjZmcuc2tpbGxFZmZlY3QuZ2V0SXRlbShlZmZlY3RJZCk7XG4vLyAgICAgICAgIGlmIChjZmdFZiA9PSBudWxsIHx8IGNmZ0Jhc2UgPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIC8v5qyh5pWw5Yik5a6aXG4vLyAgICAgICAgIGlmIChcbi8vICAgICAgICAgICAgIGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5jb3VudCkgPT0gZmFsc2UgJiZcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gJiZcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXSAmJlxuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ID49IGNmZ0VmLmNvdW50XG4vLyAgICAgICAgICkge1xuLy8gICAgICAgICAgICAgcmV0dXJuOyAvL+ayoeacieasoeaVsOS6hlxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLm9uZUZpaWRzW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1tpaWRdID0ge307XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGVmX3R0eXBlID0gXCJlZmZlY3RfaWRfXCIgKyBlZmZlY3RJZDtcbi8vICAgICAgICAgLy/nu6fmib/kuIrkuIDmrKHnmoTnm67moIdcbi8vICAgICAgICAgaWYgKGV4dGVuZCAhPSBcIlwiKSB7XG4vLyAgICAgICAgICAgICAvL+i/memHjOWPr+S7peWFiOe7p+aJv1xuLy8gICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXSA9IHRoaXMub25lRmlpZHNbaWlkXVtleHRlbmRdO1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/mjIHnu63lpJrlsJHpkohcbi8vICAgICAgICAgbGV0IG1heHpoZW46IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5hcmdzW1widFwiXSkgPT0gZmFsc2UgPyBjZmdFZi5hcmdzW1widFwiXSAqIDMwIDogNDUgKiAzMDtcbi8vICAgICAgICAgLy9t5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgIGxldCBlX206IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5hcmdzW1wibVwiXSkgPT0gZmFsc2UgPyBjZmdFZi5hcmdzW1wibVwiXSA6IDE7XG4vLyAgICAgICAgIC8vbuihqOekuuWxguaVsOS4iumZkFxuLy8gICAgICAgICBsZXQgZV9uOiBudW1iZXIgPSBnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcIm5cIl0pID09IGZhbHNlID8gY2ZnRWYuYXJnc1tcIm5cIl0gOiA5OTk5O1xuLy8gICAgICAgICAvLzEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICBsZXQgb3ZlcmxheVR5cGU6IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5vdmVybGF5VHlwZSkgPyAyIDogY2ZnRWYub3ZlcmxheVR5cGU7XG4vLyAgICAgICAgIC8v5pWI5p6c5qCH6K+GXG4vLyAgICAgICAgIGxldCBlX2k6IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5hcmdzW1wiaVwiXSkgPT0gZmFsc2UgPyBjZmdFZi5hcmdzW1wiaVwiXSA6IDA7XG4vLyAgICAgICAgIC8v5pWI5p6c5qCH6K+GXG4vLyAgICAgICAgIGxldCBpbnRlcnZhbDogbnVtYmVyID0gZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmludGVydmFsKSA9PSBmYWxzZSA/IGNmZ0VmLmludGVydmFsICogMzAgOiAwOyAvL+aViOaenOagh+ivhlxuXG4vLyAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0gPSB7XG4vLyAgICAgICAgICAgICAgICAgbGFzdDogMCwgLy/mnIDlkI7kuIDmrKHlh7rmiYvluKdcbi8vICAgICAgICAgICAgICAgICBjb3VudDogMCxcbi8vICAgICAgICAgICAgICAgICBhY3Rpb246IHt9LFxuLy8gICAgICAgICAgICAgICAgIGVmZmVjdDoge30sXG4vLyAgICAgICAgICAgICB9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdID0ge1xuLy8gICAgICAgICAgICAgICAgIGVmZmVjdFpoZW46IDAsIC8v6Kem5Y+R5binXG4vLyAgICAgICAgICAgICAgICAgZWZmZWN0RW5kWmhlbjogMCwgLy/op6blj5Hnu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICBuZXh0Y2Q6IDAsIC8v5LiL5LiA5qyh5Ye65omL5pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgY291bnQ6IDAsXG4vLyAgICAgICAgICAgICAgICAgZjogMCxcbi8vICAgICAgICAgICAgIH07XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy/mlYjmnpxjZFxuLy8gICAgICAgICBpZiAoXG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0ubmV4dGNkID4gdGhpcy56aGVuICYmXG4vLyAgICAgICAgICAgICAodGhpcy56aGVuICE9IHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RaaGVuIHx8IChjZmdFZi50YXJnZXRUeXBlLmxlbmd0aCA9PSAxICYmIGNmZ0VmLnRhcmdldFR5cGVbMF0gPT0gMSkpICYmXG4vLyAgICAgICAgICAgICAhKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuID49IHRoaXMuemhlbiAmJiBjc1tcImlzVGltZXJcIl0gPT0gMSlcbi8vICAgICAgICAgKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL2NzW1wiaXNUaW1lclwiXSA9IDA7ICAvLyDlrprml7blmajmnaXnmoQg5LiN5Y+C5LiOY2TmlYjmnpzliKTlrppcblxuLy8gICAgICAgICBsZXQgZWZfYnVmZiA9IFwiZWZmZWN0X2lfXCIgKyBlX2k7IC8v5pWI5p6caeagh+ivhlxuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLnR0eXBlKSA9PSBmYWxzZSAmJiBjc1tcImlzVGltZXJcIl0gIT0gMSkge1xuLy8gICAgICAgICAgICAgbGV0IHRhcmdldFR5cGU6IG51bWJlciA9IDA7IC8v55uu5qCH5pWw6YePXG4vLyAgICAgICAgICAgICAvL+ebruagh+aVsOmHj1xuLy8gICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi50YXJnZXRUeXBlKSA9PSB0cnVlKSB7XG4vLyAgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9IDEwO1xuLy8gICAgICAgICAgICAgfSBlbHNlIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYudGFyZ2V0VHlwZVsxXSkgPT0gdHJ1ZSkge1xuLy8gICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSBjZmdFZi50YXJnZXRUeXBlWzBdO1xuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gdGhpcy5zZWVkUmFuZC5yYW5kKGNmZ0VmLnRhcmdldFR5cGVbMV0sIGNmZ0VmLnRhcmdldFR5cGVbMF0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy5maW5kX2ZpaWRzKGVmX3R0eXBlLCBpaWQsIGNmZ0VmLnR0eXBlLCB0YXJnZXRUeXBlKTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8vYnVmZuaViOaenFxuLy8gICAgICAgICBpZiAodGhpcy5vbmVGaWlkc1tpaWRdICYmIHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV0pIHtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXS5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIGxldCBlZmZfaV9tID0gdGhpcy5za2J1ZmZfZ2V0KHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV1baV0sIGVmX2J1ZmYsIDIpO1xuLy8gICAgICAgICAgICAgICAgIGlmIChlZmZfaV9tID49IGVfbikge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/otoXov4flsYLmlbBcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgZV9tID0gTWF0aC5taW4oZV9tLCBlX24gLSBlZmZfaV9tKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8v5re75Yqg5a6a5pe25omn6KGMIC0g5LmL5ZCO5Zyo6Kem5Y+R5pWI5p6cXG4vLyAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYudHJpZ2dlclRpbWUpID09IGZhbHNlICYmIHRoaXMudXVpZHNbaWlkXS50aW1lcltlZl90dHlwZV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgdGhpcy50aW1lcl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgIGlpZDogaWlkLCAvL+inpuWPkeiAhVxuLy8gICAgICAgICAgICAgICAgIGZpaWRzOiB0aGlzLm9uZUZpaWRzW2lpZF1bZWZfdHR5cGVdLCAvL+inpuWPkeiAhVxuLy8gICAgICAgICAgICAgICAgIGtleTogZWZfdHR5cGUsIC8v5a6a5pe25Zmo5qCH6K+GXG4vLyAgICAgICAgICAgICAgICAgdHlwZTogY2ZnRWYudHJpZ2dlclRpbWUgPyBjZmdFZi50cmlnZ2VyVGltZSA6IFs2MDFdLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgIGZ1bmM6IFwic2tfZWZmZWN0XCIsIC8v5omn6KGM55qE5Ye95pWw5ZCNXG4vLyAgICAgICAgICAgICAgICAgbHpoZW46IGludGVydmFsLCAvL+i9ruivouaJp+ihjOaXtumXtFxuLy8gICAgICAgICAgICAgICAgIGV6aGVuOiA0NSAqIDMwLFxuLy8gICAgICAgICAgICAgICAgIHNraWQ6IHNraWQsIC8v5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICBhZWlkOiBlZmZlY3RJZCwgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgIGNzOiBjcywgLy/lj4LmlbBcbi8vICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsXG4vLyAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgIGlmIChjZmdFZi50cmlnZ2VyVGltZVswXSA9PSAzMDEpIHtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV0ubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbygzMDEsIHsgZG9faWlkOiBOdW1iZXIodGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXVtpXSkgfSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuY291bnQpID09IGZhbHNlICYmIHRoaXMuemhlbiAhPSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCArPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ID49IGNmZ0VmLmNvdW50KSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RaaGVuID0gdGhpcy56aGVuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5uZXh0Y2QgPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2VmX3R0eXBlXVtjc1tcInRpbWVySWRcIl0udG9TdHJpbmcoKV0uc3poZW4gPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSAmJiB0aGlzLnpoZW4gIT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RaaGVuID0gdGhpcy56aGVuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJ0XCJdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuIDwgdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuID0gdGhpcy56aGVuICsgY2ZnRWYuYXJnc1tcInRcIl0gKiAzMDsgLy8gYnVmZuaMgee7reWinuWKoOaViOaenOe7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0ubmV4dGNkID0gdGhpcy56aGVuICsgY2ZnRWYuY2QgKiAzMDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5uZXh0Y2QgPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgcmV0dXJuOyAvL2Nk5ZCO5YaN6Kem5Y+RXG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvLzEu6ZmE5Yqg5bGe5oCn77yI5LiH5YiG5q+U77yJXG4vLyAgICAgICAgIGlmIChjZmdFZi50eXBlID09IDEpIHtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXS5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgIGxldCBmaWlkID0gdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXVtpXTtcbi8vICAgICAgICAgICAgICAgICBsZXQgY2Y1MDg6IG51bWJlciA9IDA7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGVmZl8xX2VwOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4vLyAgICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhjZmdFZi5hcmdzKTtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgLy8g5Yqg5bGe5oCnIOi/mei+uWlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2ZpaWRdLmVwc1trZXlzW2tdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS5lcHNba2V5c1trXV0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZWZmXzFfZXBba2V5c1trXV0gPSBjZmdFZi5hcmdzW2tleXNba11dO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3Nba2V5c1trXV0gPCAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Y1MDggPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZjUwOCAhPSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAob3ZlcmxheVR5cGUgPT09IDIgfHwgdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIGVmX2J1ZmYgKyBcIl9cIiArIGVmZmVjdElkLCAyKSArIGVfbSA8PSBlX24pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYgKyBcIl9cIiArIGVmZmVjdElkLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IGVmZl8xX2VwLCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgdGhpcy50ZWFtc1tmaWlkXS5lcHMuaHAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAvLyB0aGlzLnRlYW1zW2ZpaWRdLmVwcy5ocF9tYXggPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocF9tYXhcIik7XG4vLyAgICAgICAgICAgICAgICAgaWYgKGNmNTA4ID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg1MDgsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgLy9jZFxuLy8gICAgICAgICAgICAgaWYgKHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV0ubGVuZ3RoID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuY291bnQpID09IGZhbHNlICYmIHRoaXMuemhlbiAhPSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCArPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ID49IGNmZ0VmLmNvdW50KSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RaaGVuID0gdGhpcy56aGVuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5uZXh0Y2QgPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2VmX3R0eXBlXVtjc1tcInRpbWVySWRcIl0udG9TdHJpbmcoKV0uc3poZW4gPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSAmJiB0aGlzLnpoZW4gIT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RaaGVuID0gdGhpcy56aGVuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJ0XCJdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuIDwgdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuID0gdGhpcy56aGVuICsgY2ZnRWYuYXJnc1tcInRcIl0gKiAzMDsgLy8gYnVmZuaMgee7reWinuWKoOaViOaenOe7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0ubmV4dGNkID0gdGhpcy56aGVuICsgY2ZnRWYuY2QgKiAzMDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5uZXh0Y2QgPSB0aGlzLnpoZW4gKyBjZmdFZi5jZCAqIDMwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy8yLumZhOWKoOeKtuaAgVxuLy8gICAgICAgICBpZiAoY2ZnRWYudHlwZSA9PSAyKSB7XG4vLyAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdF90eXBlXzIoc2tpZCwgZWZmZWN0SWQsIGlpZCwgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXSwgY3MpO1xuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6Kem5Y+R5pWI5p6cXG4vLyAgICAgICogQHBhcmFtIGVmZmVjdElkIOaViOaenElEXG4vLyAgICAgICogQHBhcmFtIGlpZCDop6blj5HogIVcbi8vICAgICAgKiBAcGFyYW0gZmlpZHMg6Kem5Y+R5a+56LGhXG4vLyAgICAgICogQHJldHVybnNcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHNrX2VmZmVjdF90eXBlXzIoc2tpZDogc3RyaW5nLCBlZmZlY3RJZDogc3RyaW5nLCBpaWQ6IHN0cmluZywgZmlpZHM6IHN0cmluZ1tdLCBjczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9KSB7XG4vLyAgICAgICAgIGxldCBjZmdCYXNlID0gR2FtZWNmZy5za2lsbEJhc2UuZ2V0SXRlbShza2lkLCBcIjFcIik7XG4vLyAgICAgICAgIGxldCBjZmdFZiA9IEdhbWVjZmcuc2tpbGxFZmZlY3QuZ2V0SXRlbShlZmZlY3RJZCk7XG4vLyAgICAgICAgIGlmIChjZmdFZiA9PSBudWxsIHx8IGNmZ0VmLmFyZ3NbXCJpXCJdID09IG51bGwgfHwgY2ZnQmFzZSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy/mjIHnu63lpJrlsJHpkohcbi8vICAgICAgICAgbGV0IG1heHpoZW46IG51bWJlciA9IGNmZ0VmLmFyZ3NbXCJ0XCJdICE9IG51bGwgPyBjZmdFZi5hcmdzW1widFwiXSAqIDMwIDogNDUgKiAzMDtcbi8vICAgICAgICAgLy9h5aGr5bCP5pWw77ya5q+P56eS5oyB57ut5pS25Yiw5pyA57uI5Lyk5a6z55qE55m+5YiG5q+UXG4vLyAgICAgICAgIGxldCBlX2E6IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5hcmdzW1wiYVwiXSkgPT0gZmFsc2UgPyBjZmdFZi5hcmdzW1wiYVwiXSAqIDEwMDAwIDogMDtcbi8vICAgICAgICAgLy9t5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgIGxldCBlX206IG51bWJlciA9IGdhbWVNZXRob2QuaXNFbXB0eShjZmdFZi5hcmdzW1wibVwiXSkgPT0gZmFsc2UgPyBjZmdFZi5hcmdzW1wibVwiXSA6IDE7XG4vLyAgICAgICAgIC8vbuihqOekuuWxguaVsOS4iumZkFxuLy8gICAgICAgICBsZXQgZV9uOiBudW1iZXIgPSBnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcIm5cIl0pID09IGZhbHNlID8gY2ZnRWYuYXJnc1tcIm5cIl0gOiA5OTk5O1xuLy8gICAgICAgICAvL2lk5byV5Y+R5LiL5LiA5LiqZWZmZWN0X0lEXG4vLyAgICAgICAgIGxldCBlX2lkOiBzdHJpbmcgPSBnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcImlkXCJdKSA9PSBmYWxzZSA/IGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpIDogXCJcIjtcbi8vICAgICAgICAgLy8xLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgbGV0IG92ZXJsYXlUeXBlOiBudW1iZXIgPSBnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYub3ZlcmxheVR5cGUpID8gMiA6IGNmZ0VmLm92ZXJsYXlUeXBlO1xuLy8gICAgICAgICAvL+aViOaenOagh+ivhlxuLy8gICAgICAgICBsZXQgZV9pOiBudW1iZXIgPSBnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcImlcIl0pID09IGZhbHNlID8gY2ZnRWYuYXJnc1tcImlcIl0gOiAwO1xuXG4vLyAgICAgICAgIGxldCBlZl90dHlwZSA9IFwiZWZmZWN0X2lkX1wiICsgZWZmZWN0SWQ7IC8v5pWI5p6cSUTmoIfor4Zcbi8vICAgICAgICAgbGV0IGVmX2J1ZmYgPSBcImVmZmVjdF9pX1wiICsgZV9pOyAvL+aViOaenGnmoIfor4Zcbi8vICAgICAgICAgbGV0IGxzT25lOiBudW1iZXIgPSAwOyAvL+S4tOaXtuiHquW3seWPquaTjeS9nOS4gOasoeeahFxuLy8gICAgICAgICBsZXQgcGFzczogYm9vbGVhbiA9IHRydWU7XG4vLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlpZHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgIGxldCBmaWlkID0gZmlpZHNbaV07XG4vLyAgICAgICAgICAgICBsZXQgZWZmX2lfbSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBlZl9idWZmLCAyKTtcbi8vICAgICAgICAgICAgIGlmIChlZmZfaV9tID49IGVfbikge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+i2hei/h+WxguaVsFxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgZV9tID0gTWF0aC5taW4oZV9tLCBlX24gLSBlZmZfaV9tKTtcbi8vICAgICAgICAgICAgIHN3aXRjaCAoY2ZnRWYuYXJnc1tcImlcIl0pIHtcbi8vICAgICAgICAgICAgICAgICBjYXNlIDE6IC8v5rKJ6buYXHTml6Dms5Xph4rmlL7mioDog70o5Y+v5Lul5pS+5pmu5pS7Ke+8jOS4jeWPr+WPoOWKoO+8jOaMgee7rTTnp5Jcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge30sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDUwOCwgeyBkb19paWQ6IE51bWJlcihmaWlkKSB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAyOiAvLzJcdOWbnuihgCDmjInmnIDnu4jkvKTlrrPlgLznmb7liIbmr5Tov5vooYzlm57ooYBcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdICE9IE51bWJlcihpaWQpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3NbXCJoaXRcIl0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJhXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub25lSGl0W2lpZF0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdF9maWlkID0gdGhpcy51dWlkc1tpaWRdLmlwaztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qc19oaXRzKGlpZCwgaGl0X2ZpaWQsIGNmZ0VmLmFyZ3NbXCJhXCJdICogMTAwMDAsIHNraWQpOyAvL+iuoeeul+S8pOWus1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3poaXQgPSB0aGlzLm9uZUhpdFtpaWRdW2hpdF9maWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJoaXRcIl0gPSBnemhpdC5za2hpdDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMub25lSGl0W2lpZF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wiaGl0XCJdID0gdGhpcy5vbmVIaXRbaWlkXVtrZXlzW2tdXS5samhpdDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImhpdFwiXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3NbXCJuZXh0X2N4XCJdICE9IG51bGwgJiYgY3NbXCJuZXh0X2N4XCJdIDwgdGhpcy56aGVuICYmIGNzW1wiaXNUaW1lclwiXSA9PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCBNYXRoLmZsb29yKChjc1tcImhpdFwiXSAqIGVfYSkgLyAxMDAwMCldKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWZcIl0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaciWlmPTHnmoTnm7TmjqXlm57ooYDkuIDmrKFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgTWF0aC5mbG9vcigoY3NbXCJoaXRcIl0gKiBlX2EpIC8gMTAwMDApXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgPSBmYWxzZTsgICAvLyDliqDlrprml7blmajlm57ooYAg5LiN5YqgY2Rcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRfY3hcIl0gPSB0aGlzLnpoZW47XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJkb19paWRcIl0gPSBOdW1iZXIoZmlpZCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWQ6IGlpZCwgLy/op6blj5HogIVcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHM6IFtmaWlkXSwgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl90dHlwZSArIFwiX1wiICsgZV9pLCAvL+WumuaXtuWZqOagh+ivhlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBbNjAxXSwgLy/miafooYzop6blj5Hngrlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogXCJza19lZmZlY3RcIiwgLy/miafooYznmoTlh73mlbDlkI1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpoZW46IDMwLCAvL+i9ruivouaJp+ihjOaXtumXtFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlemhlbjogdGhpcy56aGVuICsgbWF4emhlbixcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpZDogc2tpZCwgLy/mioDog71JRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZWlkOiBlZmZlY3RJZCwgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjczogY3MsIC8v5Y+C5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogMSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7IGVfYTogZV9hIH0sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvL2RlbGV0ZSBjc1tcIm5leHRfY3hcIl1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDM6IC8v5pmV55ypXHTml6Dms5Xnp7vliqjjgIHmlLvlh7vlkozph4rmlL7mioDog73vvIzkuI3lj6/lj6DliqDvvIzmjIHnu60z56eSXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHt9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg1MDgsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNDogLy/ngavnhLBcdOavj+enkuWPl+WIsDMwJeaMgee7reS8pOWus++8jOacgOmrmOWPoOWKoDEw5bGC77yM5oyB57utNeenklxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcInBcIl0gJiYgdGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA+IGNmZ0VmLmFyZ3NbXCJwXCJdICogMTAwMDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wibmV4dGlkXCJdID09IG51bGwgfHwgY3NbXCJpXzU5XCJdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXQgPSBjc1tmaWlkXSA/IGNzW2ZpaWRdIDogY3NbXCJoaXRcIl07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3NDcG95ID0gZ2FtZU1ldGhvZC5vYmpDb3B5KGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNzQ3BveVtcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc0Nwb3lbXCJpXzU5XCJdID0gMDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlX207IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZDogaWlkLCAvL+inpuWPkeiAhVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkczogW2ZpaWRdLCAvL+inpuWPkeWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX3R0eXBlLCAvL+WumuaXtuWZqOagh+ivhlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBbNjAxXSwgLy/miafooYzop6blj5Hngrlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogXCJza19lZmZlY3RcIiwgLy/miafooYznmoTlh73mlbDlkI1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpoZW46IDMwLCAvL+i9ruivouaJp+ihjOaXtumXtFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlemhlbjogdGhpcy56aGVuICsgbWF4emhlbixcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpZDogc2tpZCwgLy/mioDog71JRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZWlkOiBlZmZlY3RJZCwgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjczogY3NDcG95LCAvL+WPguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mt7vliqBidWZmIOeUqOS6juWxleekulxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogMSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzU5X2hpdDogaGl0LFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNTA1LCB7IGRvX2lpZDogTnVtYmVyKGZpaWQpIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNTA4LCB7IGRvX2lpZDogTnVtYmVyKGZpaWQpIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcImlfNTlcIl0gPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJpXzU5XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJoaXRcIl0gPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJpXzU5X2hpdFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3NbXCJoaXRcIl0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImFcIl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpzX2hpdHMoaWlkLCBmaWlkLCAxMDAwMCwgc2tpZCk7IC8v6K6h566X5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnemhpdCA9IHRoaXMub25lSGl0W2lpZF1bZmlpZF07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wiaGl0XCJdID0gZ3poaXQuc2toaXQ7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImhpdFwiXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXQgPSBNYXRoLmZsb29yKGNzW1wiaGl0XCJdICogKGVfYSAvIDEwMDAwICsgY3NbXCJpXzU5XCJdKSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhmaWlkLCBmaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhmaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCAtMSAqIGhpdF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNTogLy/lhrDlhrtcdOaXoOazleenu+WKqOOAgeS4jeiDveaZruaUu+aUu+WHu+WSjOmHiuaUvuaKgOiDve+8jOaXoOazleWPoOWKoO+8jOaMgee7rTTnp5LjgILkvZznlKjmnJ/pl7Tml6Dms5Xooqvmlr3liqDlr5LmhI9cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge30sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDUwNywgeyBkb19paWQ6IE51bWJlcihmaWlkKSB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg1MDgsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjogLy/lh7vpgIBcdOaXoOazleenu+WKqOOAgeS4jeiDveaZruaUu+aUu+WHu+OAgeS4jeiDveiiq+aUu+WHu+WSjOmHiuaUvuaKgOiDve+8jOaMgee7rTAuNeenklxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7fSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNTA4LCB7IGRvX2lpZDogTnVtYmVyKGZpaWQpIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAobHNPbmUgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbHNPbmUgPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbygyMDYsIHsgZG9faWlkOiBOdW1iZXIoaWlkKSB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDc6IC8v5a+S5oSPXHTmlLvlh7vpmY3kvY41Je+8jOaMgee7rTEw56eS77yM5Y+g5Yqg6IezNeWxguaXtui9rOWMluS4uuWGsOWGu1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZWZmX2lfNSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pXzVcIiwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZfaV81ID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZfaV9lcDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IE9iamVjdC5hc3NpZ24oY2ZnRWYuYXJncyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwczogZWZmX2lfZXAsIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfZG8oNTA2LCB7IGRvX2lpZDogTnVtYmVyKGlpZCkgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGVmZl9pXzcgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgZWZfYnVmZiwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZfaV83ID49IDUpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1Yl9hbGwoZmlpZCwgZWZfYnVmZik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGVfaWQsIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA4OiAvL+ecn+aEj1x05oqA6IO95Lyk5a6z5aKe5YqgMyXvvIzmnIDpq5jlj6DliqAxMOWxgu+8jOaMgee7rTEw56eSXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHsgc2tfYTogZV9hIH0sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDUwNCwgeyBkb19paWQ6IE51bWJlcihpaWQpIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDk6IC8v5oqk5L2T572h5rCUXHTlj5fliLDkvKTlrrPml7bvvIzkvJjlhYjmirXmtojmiqTkvZPnvaHmsJTvvIjooajnjrDkuIrpnIDopoHliqDmiqTnm77nibnmlYjvvIlcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlOSA9IE1hdGguZmxvb3IoKHRoaXMudGVhbXNbZmlpZF0uZXBzW1wiaHBfbWF4XCJdICogY2ZnRWYuYXJnc1tcImhwX21heFwiXSkgLyAxMDAwMCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzk6IHZhbHVlOSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzlfaWQ6IGNmZ0VmLmFyZ3NbXCJpZFwiXSA/IGNmZ0VmLmFyZ3NbXCJpZFwiXSA6IDAsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV85X3NraW46IE51bWJlcihza2lkKSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2RvKDUwMSwgeyBkb19paWQ6IE51bWJlcihpaWQpIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDEwOiAvL+W8guW4uOeKtuaAgVx05YyF5ous77ya5bGe5oCn6ZmN5L2O44CB5rWB6KGA44CB5Yaw5Ya744CB5Ye76aOe44CB5rKJ6buY77yM55yp5pmVXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHt9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbyg1MDgsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMTI6IC8v5byC5bi45YWN55arXHTlhY3nlqvlsZ7mgKfpmY3kvY7jgIHmtYHooYDjgIHlhrDlhrvjgIHlh7vpo57jgIHmsonpu5jvvIznnKnmmZVcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKG1heHpoZW4gPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge30sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2ZpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy51dWlkc1tmaWlkXS5za2J1ZmYpID09IHRydWUpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBrZXlzMiA9IE9iamVjdC5rZXlzKHRoaXMudXVpZHNbZmlpZF0uc2tidWZmKVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQga2V5czIgPSB0aGlzLmNoYW5nZVNrQnVmZigxLCBmaWlkLCBudWxsLCAxKTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzMi5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGtleXMyW2tdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFtcImVmZmVjdF9pXzEwXCIsIFwiZWZmZWN0X2lfMVwiLCBcImVmZmVjdF9pXzNcIiwgXCJlZmZlY3RfaV80XCIsIFwiZWZmZWN0X2lfNVwiLCBcImVmZmVjdF9pXzZcIl0uaW5jbHVkZXMoa2V5KSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBjb3B5MTAgPSBnYW1lTWV0aG9kLm9iakNvcHkodGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldID0gW107XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwga2V5LCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhc3MgPSBmYWxzZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5czMgPSBPYmplY3Qua2V5cyh2YWx1ZXNbal0uZXBzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBsID0gMDsgbCA8IGtleXMzLmxlbmd0aDsgbCsrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2lpZF0uZXBzW2tleXMzW2xdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzW2pdLmVwc1trZXlzM1tsXV0gPCAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gdHJ1ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW2tleV0ucHVzaCh2YWx1ZXNbal0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAvLyDmm7TmlrDnvJPlrZhcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTa0J1ZmYoMiwgZmlpZCwgbnVsbCwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDEzOiAvL+acgOe7iOS8pOWus+mZjeS9jnh4JVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV8xMzogZV9hLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfMTNfY2Q6IDAsIC8vIOaMgee7reaAp+eahCDkuI3liqBjZFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfMTNfblpoZW46IHRoaXMuemhlbixcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDE0OiAvL+W9k+WJjeeUn+WRvemmluasoeS9juS6jnglLCB4eOWxnuaAp+WinuWKoHglXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwMTQgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHBfbWF4MTQgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocF9tYXhcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICgoZl9ocDE0ICogMTAwMDApIC8gZl9ocF9tYXgxNCA8IE1hdGguYWJzKGNmZ0VmLmFyZ3NbXCJocFwiXSkpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZfaV9lcDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhjZmdFZi5hcmdzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlzW2tdID09IFwiaHBcIikge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0uZXBzW2tleXNba11dID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZl9pX2VwW2tleXNba11dID0gY2ZnRWYuYXJnc1trZXlzW2tdXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiBlZmZfaV9lcCwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9zdWIoaWlkLCBlZl90dHlwZSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAxNTogLy/op6blj5HmmrTlh7vlkI7vvIznu5noh6rouqvliqDmlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaWQxID0gY2ZnRWYuYXJnc1tcImlkMVwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGlkMSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgaWQxLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgZV9pZCwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAxNjogLy/oh6rouqvpppbmrKHnlJ/lkb3kvY7kuo4xNSXml7bov5vlhaXlhaXlrprnirbmgIHvvIzkuYvlkI7mr4/np5LmgaLlpI3oh6rouqvmlLvlh7syMDAl55qE5rCU6KGA77yM5pyf6Ze06Ieq6Lqr5peg5rOV6KGM5Yqo44CC6Ieq6Lqr5rCU6KGA5oGi5aSN6IezNjAl5pe26Kej6Zmk5YWl5a6a54q25oCB77yM5bm25a+55ZGo5Zu05pWM5Lq66YCg5oiQMjAwJeaKgOiDveS8pOWus1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3NbXCJkb19paWRcIl0udG9TdHJpbmcoKSAhPSBpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwMTYgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHBfbWF4MTYgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocF9tYXhcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICgoZl9ocDE2ICogMTAwMDApIC8gZl9ocF9tYXgxNiA8IE1hdGguYWJzKGNmZ0VmLmFyZ3NbXCJocFwiXSkpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcIm5leHRpZFwiXSAhPSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7fSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWQ6IGlpZCwgLy/op6blj5HogIVcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHM6IGZpaWRzLCAvL+inpuWPkeWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX3R0eXBlLCAvL+WumuaXtuWZqOagh+ivhlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBbNjAxXSwgLy/miafooYzop6blj5Hngrlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogXCJza19lZmZlY3RcIiwgLy/miafooYznmoTlh73mlbDlkI1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpoZW46IDMwLCAvL+i9ruivouaJp+ihjOaXtumXtFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlemhlbjogdGhpcy56aGVuICsgbWF4emhlbixcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpZDogc2tpZCwgLy/mioDog71JRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZWlkOiBlZmZlY3RJZCwgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjczogY3MsIC8v5Y+C5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3NbXCJuZXh0aWRcIl0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZfYXRrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRIcDE2OiBudW1iZXIgPSBNYXRoLmZsb29yKChmX2F0ayAqIGNmZ0VmLmFyZ3NbXCJhdGtfcGVyXCJdKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRIcE1heDE2OiBudW1iZXIgPSBNYXRoLmZsb29yKChmX2hwX21heDE2ICogTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwMlwiXSkpIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgYWRkSHAxNiA9IE1hdGgubWluKGFkZEhwMTYsIGFkZEhwTWF4MTYgLSBmX2hwMTYpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCBhZGRIcDE2XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmX2hwMTYgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZl9ocDE2ICogMTAwMDApIC8gZl9ocF9tYXgxNiA+PSBNYXRoLmFicyhjZmdFZi5hcmdzW1wiaHAyXCJdKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1YihmaWlkLCBlZl9idWZmKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX3N1YihpaWQsIGVmX3R0eXBlKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoZmlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkXCJdLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAxNzogLy/orrDlvZXoh6rouqvlpITkuo7mn5Dnp43nirbmgIFidWZm77yM6KKr5pS75Ye75pyJ5qaC546H57uZ6Ieq6Lqr5Yqg5pWI5p6cXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZfaV9idWZmOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImJ1ZmZcIl0gIT0gMTApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEw6ZyA6KaB5Yik5pat5ZCE56eN5byC5bi454q25oCBXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlZmZfaV9idWZmID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0OiBzdHJpbmdbXSA9IFtcImVmZmVjdF9pXzFcIiwgXCJlZmZlY3RfaV8zXCIsIFwiZWZmZWN0X2lfNlwiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaXN0Lmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmX2lfYnVmZiArPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgbGlzdFtrXSwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGVmZl9pX2J1ZmYgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBjZmdFZi5hcmdzW1wicFwiXSAqIDEwMDAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkXCJdLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOyAvLyDmsqHop6blj5Eg5LiN6KaB6L+b5YWl5Ya35Y205pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDE4OiAvL+avjzPmrKHmlLvlh7vmtojogJfkuIDlsYLnnJ/mhI/vvIzkuYvlkI7pop3lpJbpgKDmiJDnm67moIflvZPliY3msJTooYAzJeeahOS8pOWus++8iOacgOWkmumAoOaIkOiHqui6q+aUu+WHuzUwMCXnmoTkvKTlrrPvvIlcbi8vICAgICAgICAgICAgICAgICAgICAgLy/lpIfms6jvvJrov5nph4znmoTmlLvlh7vljIXmi6zmma7mlLvlkozmioDog73lkozov57lh7vvvIzkuI3ljIXmi6zlj43lh7vvvIzooqvliqjmioDog73mmK/kuI3orqHnrpfmrKHmlbDnmoRcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgYmRjb25zMTggPSB0aGlzLnV1aWRzW2ZpaWRdLmNvbnNbMF0gKyB0aGlzLnV1aWRzW2ZpaWRdLmNvbnNbMV07XG5cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGJkY29uczE4ID49IGNmZ0VmLmFyZ3NbXCJjb3VudFwiXSAmJiBiZGNvbnMxOCAlIGNmZ0VmLmFyZ3NbXCJjb3VudFwiXSA9PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWIoaWlkLCBcImVmZmVjdF9pX1wiICsgY2ZnRWYuYXJnc1tcImJ1ZmZcIl0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDE5OiAvL+aZruaUu+aWveWKoOW/q+WJkeWNsOiusO+8jOaMgee7rTfnp5LvvIzmnIDlpJrlj6DliqAxMOWxguOAguebruagh+avj+WxguW/q+WJkeWNsOiusO+8jOS9v+iHqui6q+aUu+WHu+mZhOWKoDMwJemineWkluS8pOWus+OAguiLpTfnp5LlhoXnm67moIfmnKrlj5fliLDoh6rouqvkvKTlrrPvvIzliJnlv6vliZHljbDorrDlhajpg6jmtojlpLFcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ0VmMTkgPSBHYW1lY2ZnLnNraWxsRWZmZWN0LmdldEl0ZW0oY2ZnRWYuYXJnc1tcImlkXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmMTkgIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IDEsIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfMTlfYTogY2ZnRWYuYXJnc1tcImFcIl0gKiAxMDAwMCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV8xOV9pOiBjZmdFZjE5LmFyZ3NbXCJpXCJdLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZW5nMTkgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl0sIDIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ0VmMTlfbSA9IE1hdGgubWluKGNmZ0VmMTkuYXJnc1tcIm1cIl0sIGNmZ0VmMTkuYXJnc1tcIm5cIl0gLSBjZW5nMTkpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmMTlfbSA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0sIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBrZXlzID0gT2JqZWN0LmtleXModGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl1dKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl0sIDEpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl1dW051bWJlcihrZXlzW2tdKV0uc3poZW4gPSB0aGlzLnpoZW47XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl1dW051bWJlcihrZXlzW2tdKV0uZXpoZW4gPSB0aGlzLnpoZW4gKyBtYXh6aGVuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTa0J1ZmYoMiwgZmlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmMTkuYXJnc1tcImlcIl0sIDEsIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW1wiZWZmZWN0X2lfXCIgKyBjZmdFZjE5LmFyZ3NbXCJpXCJdXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAyMDogLy/mr49456eS5riF6Zmk6Ieq6Lqr5byC5bi454q25oCBXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXS50b1N0cmluZygpICE9IGlpZCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViKGZpaWQsIFwiZWZmZWN0X2lfXCIgKyBjZmdFZi5hcmdzW1wiYnVmZlwiXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiYnVmZlwiXSA9PSAxMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZilcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwgbnVsbCwgMSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0ga2V5c1trXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW2tleV0pID09IHRydWUpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChbXCJlZmZlY3RfaV8xXCIsIFwiZWZmZWN0X2lfM1wiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCIsIFwiZWZmZWN0X2lfNlwiXS5pbmNsdWRlcyhrZXkpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZUJ1ZmZbZmlpZF0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoXCJlZmZlY3RfaV8wXCIpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBjb3B5MTAgPSBnYW1lTWV0aG9kLm9iakNvcHkodGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5XSA9IFtdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMoY29weTEwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwga2V5LCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFzcyA9IGZhbHNlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5czMgPSBPYmplY3Qua2V5cyh2YWx1ZXNbal0uZXBzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBrZXlzMy5sZW5ndGg7IGwrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbaWlkXS5lcHNba2V5czNbbF1dID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbal0uZXBzW2tleXMzW2xdXSA8IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gdHJ1ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZUJ1ZmZbZmlpZF0gPSAxO1xuXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW2tleV0ucHVzaCh2YWx1ZXNbal0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTa0J1ZmYoMiwgZmlpZCwgbnVsbCwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMjE6IC8v6Ieq6Lqr5oyB5pyJ5oqk5L2T572h5rCU5pe277yM5omn5ZCR5LiA5LiqZWZmZWN0SUTnmoTmlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgLy/ov5novrnlj6rnrqHop6blj5EgIOWkluWxguacieiEmuacrOWcqOi3kVxuLy8gICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgZV9pZCwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ0VmMjEgPSBHYW1lY2ZnLnNraWxsRWZmZWN0LmdldEl0ZW0oZV9pZCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZjIxICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZjIxLnR5cGUgPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5wb2R1bi5wdXNoKFwiZWZmZWN0X2lfMF9cIiArIGVfaWQpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0ucG9kdW4ucHVzaChcImVmZmVjdF9pX1wiICsgY2ZnRWYyMS5hcmdzW1wiaVwiXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDIyOiAvL+ihgOmHj+S9juS6jlgl5pe257uZ6Ieq6Lqr5re75YqgYnVmZlxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoaWlkLmxlbmd0aCAhPSBmaWlkLmxlbmd0aCAmJiB0aGlzLm9uZUhpdFtpaWRdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bmlLvlh7vlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXRpaWQ6IHN0cmluZyA9IFwiXCI7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMub25lSGl0W2lpZF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0aWlkID0ga2V5c1trXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHBfbWF4MjIgPSB0aGlzLnNrYnVmZl9nZXQoaGl0aWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SHAyMiA9IHRoaXMuc2tidWZmX2dldChoaXRpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5mID09IDAgJiYgKG5ld0hwMjIgKiAxMDAwMCkgLyBocF9tYXgyMiA8PSBNYXRoLmFicyhjZmdFZi5hcmdzW1wiaHBcIl0pKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoY2ZnRWYuYXJncyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGtleXNbaV07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtleS5pbmNsdWRlcyhcImlkXCIpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3Nba2V5XSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImlmXCJdID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5mID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfc3ViKGZpaWQsIGVmX3R0eXBlKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhwX21heDIyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0hwMjIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0uZiA9PSAwICYmIChuZXdIcDIyICogMTAwMDApIC8gaHBfbWF4MjIgPD0gTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwXCJdKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoY2ZnRWYuYXJncyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha2V5c1trXS5pbmNsdWRlcyhcImlkXCIpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGZpaWQsIHNraWQsIGNmZ0VmLmFyZ3Nba2V5c1trXV0sIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWZcIl0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0uZiA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfc3ViKGZpaWQsIGVmX3R0eXBlKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAyMzogLy/orrDlvZXlv6vliZHljbDorrDnirbmgIFcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge30sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDI0OiAvL+W/heWumuaatOWHu1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7fSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMjU6IC8v54G15Yqb5YC86I635Y+WXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcImxpbmdsaVwiXSkgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkX21wKGZpaWQsIGNmZ0VmLmFyZ3NbXCJsaW5nbGlcIl0sIDIpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcImxpbmdsaTJcIl0pID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZF9tcChmaWlkLCAxMDAwMCAqIGNmZ0VmLmFyZ3NbXCJsaW5nbGkyXCJdLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDI2OiAvL+avj3jmrKHmlLvlh7vvvIzkvJrkvb/kuIvkuIDmrKHmlLvlh7vnmoTnm67moIflop7liqBidWZmKOWkh+azqO+8muaUu+WHu+WMheaLrOi/nuWHu++8jOS4jeWMheaLrOWPjeWHuylcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgYmRjb25zMjYgPSB0aGlzLnV1aWRzW2ZpaWRdLmNvbnNbMF0gKyB0aGlzLnV1aWRzW2ZpaWRdLmNvbnNbMV07XG4vLyAgICAgICAgICAgICAgICAgICAgIGNzW1wibGltaXRcIl0gPSBjc1tcImxpbWl0XCJdID09IG51bGwgPyBjZmdFZi5hcmdzW1wiY291bnRcIl0gOiBjc1tcImxpbWl0XCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgeXUyNiA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWZcIl0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgeXUyNiA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGJkY29uczI2ID49IGNzW1wibGltaXRcIl0gJiYgYmRjb25zMjYgJSBjZmdFZi5hcmdzW1wiY291bnRcIl0gPT0geXUyNikge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJsaW1pdFwiXSArPSAxOyAvL+S4i+S4gOasoeaJjeiDveWcqOinpuWPkVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhjZmdFZi5hcmdzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha2V5c1trXS5pbmNsdWRlcyhcImlkXCIpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoZmlpZCwgc2tpZCwgY2ZnRWYuYXJnc1trZXlzW2tdXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXJbZWZfdHR5cGVdW2NzW1widGltZXJJZFwiXS50b1N0cmluZygpXS5jcyA9IGNzO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAyNzogLy/orrDlvZXnm67moIfmn5Dnp43nirbmgIHvvIznhLblkI7mlr3liqDkuIDkuKpidWZm5pWI5p6cXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV1bMF0gPT09IGZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZfaV9idWZmMjcgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJpZlwiXSA9PSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9uZUhpdFtpaWRdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmnInphY3nva7nmoTmlYjmnpzmmK/liqDoh6rouqvnmoQgaWlk5ZKMZmlpZOaYr+S4gOagt+eahCDopoHmib7mlLvlh7vnmoTnm67moIdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMub25lSGl0W2lpZF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImJ1ZmZcIl0gIT0gMTApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEw6ZyA6KaB5Yik5pat5ZCE56eN5byC5bi454q25oCBXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZfaV9idWZmMjcgPSB0aGlzLnNrYnVmZl9nZXQoa2V5c1trXSwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0OiBzdHJpbmdbXSA9IFtcImVmZmVjdF9pXzFcIiwgXCJlZmZlY3RfaV8zXCIsIFwiZWZmZWN0X2lfNlwiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmX2lfYnVmZjI3ICs9IHRoaXMuc2tidWZmX2dldChrZXlzW2tdLCBsaXN0W2pdLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJidWZmXCJdICE9IDEwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEw6ZyA6KaB5Yik5pat5ZCE56eN5byC5bi454q25oCBXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZl9pX2J1ZmYyNyA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pX1wiICsgY2ZnRWYuYXJnc1tcImJ1ZmZcIl0sIDIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0OiBzdHJpbmdbXSA9IFtcImVmZmVjdF9pXzFcIiwgXCJlZmZlY3RfaV8zXCIsIFwiZWZmZWN0X2lfNlwiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpc3QubGVuZ3RoOyBqKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZl9pX2J1ZmYyNyArPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgbGlzdFtqXSwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZfaV9idWZmMjcgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wiaV81OVwiXSA9IDA7IC8vIHRvZG8g5aKe5Lyk55So54Gr54Sw5aKe5LykIOWPr+iDveaciemXrumimFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkXCJdLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWQxXCJdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkMVwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsgLy8g5rKh5pyJ6Kem5Y+RIOS4jeimgeWKoGNkXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7IC8vIOayoeacieinpuWPkSDkuI3opoHliqBjZFxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMjg6IC8v5a+55p+Q56eN5bGe5oCn5L2O5LqO6Ieq5bex55qE5pWM5Lq66YCg5oiQ6aKd5aSWeHgl5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBpX2VwID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgY2ZnRWYuYXJnc1tcImVwXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfZXAgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgY2ZnRWYuYXJnc1tcImVwXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGlfZXAgPiBmX2VwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDI5OiAvL+iHqui6q+aIluiAheaVjOaWueatu+S6oeWQju+8jOiOt+eahOafkOenjeeKtuaAgVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9lcDI5ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChmX2VwMjkgPD0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0sIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDMwOiAvL+S8pOWus+WKoOa3sVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7IGE6IGNmZ0VmLmFyZ3NbXCJhXCJdICogMTAwMDAgfSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMzE6IC8v5oyJ6Ieq6LqreHgl5pS75Ye75Yqb6L+b6KGM5rK755aXXG4vLyAgICAgICAgICAgICAgICAgICAgIC8vIOaYr+WQpuacieWinuW8uuayu+eWl+aViOaenCBhZGRPbmVBdGvph4zpnaLmnInlpITnkIbkuoZcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGlfYXRrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJhdGtcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRIcDMxOiBudW1iZXIgPSBNYXRoLmZsb29yKChpX2F0ayAqIGNmZ0VmLmFyZ3NbXCJhdGtfcGVyXCJdKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCBhZGRIcDMxXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMzI6IC8v5oqA6IO95q+P5ZG95LitWOS4quWNleS9je+8jOe7meiHqui6q+iOt+WPluafkOenjUJVRkZcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXS5sZW5ndGg7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUZpaWRzW2lpZF1bZWZfdHR5cGVdW2xlbiAtIDFdID09IGZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOacgOWQjuS4gOS4quaUu+WHu+Wvueixoee7k+eul+WRveS4rVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJkY29uczMyID0gdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXS5sZW5ndGg7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmRjb25zMzIgPj0gY2ZnRWYuYXJnc1tcImNvdW50XCJdICYmIGJkY29uczMyICUgY2ZnRWYuYXJnc1tcImNvdW50XCJdID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguZmxvb3IoYmRjb25zMzIgLyBjZmdFZi5hcmdzW1wiY291bnRcIl0pOyBpKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDMzOiAvL+inpuWPkeaatOWHu+WQju+8jOmZhOWKoOmineWklngl5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIC8vIOeUseS6jmlzQmrmmK/mjIlza2lk5p2l55qEIOS4iuS4gOS4quaKgOiDveeahOaatOWHuyDov5nph4zojrflj5bkuI3liLAg5omA5Lul6ZyA6KaB6YGN5Y6G5LiA5LiLXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImlzQmpcIl0gPT0gbnVsbCAmJiB0aGlzLm9uZUF0a1tpaWRdW2ZpaWRdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMub25lQXRrW2lpZF1bZmlpZF0uZWZmZWN0Lmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25lQXRrW2lpZF1bZmlpZF0uZWZmZWN0W2tdWzBdID09PSBcImJhb2ppXCIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJpc0JqXCJdID0gdGhpcy5vbmVBdGtbaWlkXVtmaWlkXS5lZmZlY3Rba11bMV07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7IGlfMzNfYTogY2ZnRWYuYXJnc1tcImFcIl0gKiAxMDAwMCB9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiaXNCalwiXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmmrTlh7vlubbkuJTmi6XmnInmmJPkvKTnirbmgIFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaV8zM19hXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YkhwMzM6IG51bWJlciA9IE1hdGguZmxvb3IoTWF0aC5hYnMoY3NbXCJpc0JqXCJdICogKGEgLyAxMDAwMCkpKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIC1zdWJIcDMzXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGZpaWQsIGVmX2J1ZmYpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMzQ6IC8v5pWM5pa555Sf5ZG95L2O5LqOeCXvvIznu5noh6rouqvmjIflrprmn5Dnp43nirbmgIHvvIjpppbmrKHkvY7kuo7vvIkg6KGA6YeP5Y+Y5YyW5qOA5rWLXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXS50b1N0cmluZygpICE9IGZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+iHquW3semZjeS9jueahOS4jeinpuWPkVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFIcDM0OiBudW1iZXIgPSBNYXRoLmFicyhjZmdFZi5hcmdzW1wiaHBcIl0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocDM0ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwX21heDM0ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoKGZfaHAzNCAqIDEwMDAwKSAvIGZfaHBfbWF4MzQgPCBjaGFIcDM0KSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tmaWlkXSA9IHRoaXMuemhlbjtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZl90dHlwZV8xID0gXCJlZmZlY3RfaWRfXCIgKyBjZmdFZi5hcmdzW1wiaWRcIl0udG9TdHJpbmcoKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUZpaWRzW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lRmlpZHNbaWlkXSA9IHt9O1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXzFdID0gW2ZpaWRdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0udG9TdHJpbmcoKSwgXCJcIiwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAzNTogLy/mlLvlh7vml7bvvIzlr7nooYDph4/kvY7kuo4zMCXnmoTmlYzkurrmlr3liqDkuIDlsYLlr5LmhI9cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY2hhSHAzNTogbnVtYmVyID0gTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHAzNSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocF9tYXgzNSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKChmX2hwMzUgKiAxMDAwMCkgLyBmX2hwX21heDM1IDwgY2hhSHAzNSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YaN5LiL5Y67IOaJvuS4jeWIsOWKoOS8pOWus+eahGZpaWTkuoZcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWRcIl0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2ZnRWYyID0gR2FtZWNmZy5za2lsbEVmZmVjdC5nZXRJdGVtKGNmZ0VmLmFyZ3NbXCJpZFwiXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmMiAmJiBjZmdFZjIuYXJncyAmJiBjZmdFZjIuYXJnc1tcImlcIl0gPT0gNTMpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlfNTNfYXRrID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhdGtcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGhpcy5vbmVBdGtbaWlkXVtmaWlkXS5lZmZlY3QubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUF0a1tpaWRdW2ZpaWRdLmVmZmVjdFtrXVswXSA9PT0gXCJocFwiICYmIHRoaXMub25lQXRrW2lpZF1bZmlpZF0uZWZmZWN0W2tdWzFdIDwgMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQXRrW2lpZF1bZmlpZF0uZWZmZWN0W2tdWzFdID0gLU1hdGguZmxvb3IoKGlfNTNfYXRrICogY2ZnRWYyLmFyZ3NbXCJhdGtcIl0pIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcImZpaWRcIl0gPSBOdW1iZXIoZmlpZCk7IC8vIOWBmuS4quagh+ivhlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDM2OiAvL+iHqui6q+esrOS4gOasoemHjeS8pCjmrbvkuqEp5pe277yM5oGi5aSN5LiA5Y2K5rCU6KGAXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXS50b1N0cmluZygpICE9IGlpZCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5LiN5piv6Ieq5bexXG4vLyAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY2hhSHAzNjogbnVtYmVyID0gTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHBfbWF4MzYgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocF9tYXhcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBzdWJIcDM2OiBudW1iZXIgPSBNYXRoLmZsb29yKGNoYUhwMzYgKiBmX2hwX21heDM2KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5kemhlbiA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmID0ge307XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfc3ViX2J5X2ZpaWQoZmlpZCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogMTM1MCwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiAyLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IDEsIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzM2OiBzdWJIcDM2LFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfMzZfblpoZW46IHRoaXMuemhlbiArIDMwLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIHN1YkhwMzZdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAzNzogLy/lt7Hmlrnku7vkvZXkuIDkuKrljZXkvY3miqTkvZPnvaHmsJTnoLTnoo7ml7bvvIznhLblkI7mjIflrprkuIDkuKpCVUZG5pWI5p6c77yM5q+U5aaC5Ye76YCA5pWM5Lq6XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXS50b1N0cmluZygpLmxlbmd0aCAhPSBmaWlkLmxlbmd0aCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChmaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0udG9TdHJpbmcoKSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSAzODogLy/op6blj5Hov57lh7vml7bvvIznu5noh6rouqvlop7liqDmlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkgIT0gaWlkKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRpZFwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkXCJdLnRvU3RyaW5nKCksIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgMzk6IC8v5bex5pa55Y2V5L2N5pa95Yqg5Ye76YCA5pe277yM5L2/5YW26I635b6XNTAl5rCU6KGA5YC85oqk5L2T572h5rCU77yM5bm25o+Q6auY5YW2NSXmma7mlLvkvKTlrrPvvIzmjIHnu63oh7PmiJjmlpfnu5PmnZ/vvIzmnIDlpJrlj6DliqAyMOWxgu+8jOWGt+WNtDEy56eSXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXS50b1N0cmluZygpICE9IGZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiAxLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7IGlfMzlfYTogY2ZnRWYuYXJnc1tcImFcIl0gKiAxMDAwMCB9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgLy/liqDmiqTkvZPnvaHmsJRcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlMzkgPSBNYXRoLmZsb29yKCh0aGlzLnRlYW1zW2ZpaWRdLmVwc1tcImhwXCJdICogY2ZnRWYuYXJnc1tcImhwXCJdKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZWZmZWN0X2lfOVwiLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiAxLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IDEsIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHsgaV85OiB2YWx1ZTM5IH0sIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDQwOiAvL+iHqui6q+awlOihgOmrmOS6jnh4JeaXtizmnInmpoLnjofnu5noh6rouqvlop7liqDmlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHA0MCA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocF9tYXg0MCA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKChmX2hwNDAgKiAxMDAwMCkgLyBmX2hwX21heDQwID4gTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwXCJdKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlZFJhbmQucmFuZCgxLCAxMDAwMCkgPD0gY2ZnRWYuYXJnc1tcInBcIl0gKiAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wibmV4dGlkXCJdID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA0MTogLy/lm57ooYDvvIzlj5boh6rouqvnlJ/lkb3lgLzkuIrpmZB4Jei/m+ihjOWbnuihgO+8jFxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3NbXCJuZXh0X2N4XCJdICE9IG51bGwgJiYgY3NbXCJuZXh0X2N4XCJdIDwgdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocF9tYXg0MSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFIcDQxOiBudW1iZXIgPSBNYXRoLmFicyhjZmdFZi5hcmdzW1wiaHBcIl0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZEhwOiBudW1iZXIgPSBNYXRoLmZsb29yKGZfaHBfbWF4NDEgKiBjaGFIcDQxKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIGFkZEhwXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tcIm5leHRfY3hcIl0gPSB0aGlzLnpoZW47XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkOiBpaWQsIC8v6Kem5Y+R6ICFXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHM6IFtmaWlkXSwgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX3R0eXBlICsgXCJfXCIgKyBlX2ksIC8v5a6a5pe25Zmo5qCH6K+GXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogWzYwMV0sIC8v5omn6KGM6Kem5Y+R54K5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogXCJza19lZmZlY3RcIiwgLy/miafooYznmoTlh73mlbDlkI1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsemhlbjogMzAsIC8v6L2u6K+i5omn6KGM5pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpZDogc2tpZCwgLy/mioDog71JRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlaWQ6IGVmZmVjdElkLCAvL+aViOaenElEfOihjOS4uklEXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3M6IGNzLCAvL+WPguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IDEsIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7fSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNzW1wibmV4dF9jeFwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDQyOiAvL+iHqui6q+awlOihgOavj+mZjeS9jnh4eHgl77yM6YCg5oiQ5Lyk5a6z5o+Q5Y2HNSVcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHA0MjogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZfaHA0MiA9IE1hdGgubWF4KDAsIGZfaHA0Mik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwX21heDQyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaHBSYXRlOiBudW1iZXIgPSBNYXRoLmFicyhjZmdFZi5hcmdzW1wiaHBcIl0gKiAxMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UmF0ZTogbnVtYmVyID0gTWF0aC5jZWlsKChmX2hwNDIgKiAxMDApIC8gZl9ocF9tYXg0Mik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMTAwIC0gaHBSYXRlOyBpbmRleCA+PSBuZXdSYXRlOyBpbmRleCAtPSBocFJhdGUpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tpbmRleC50b1N0cmluZygpXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjc1tpbmRleC50b1N0cmluZygpXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkOiBpaWQsIC8v6Kem5Y+R6ICFXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZHM6IFtmaWlkXSwgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX3R0eXBlLCAvL+WumuaXtuWZqOagh+ivhlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFs0MDFdLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmM6IFwic2tfZWZmZWN0XCIsIC8v5omn6KGM55qE5Ye95pWw5ZCNXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpoZW46IDMwLCAvL+i9ruivouaJp+ihjOaXtumXtFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV6aGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraWQ6IHNraWQsIC8v5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZWlkOiBlZmZlY3RJZCwgLy/mlYjmnpxJRHzooYzkuLpJRFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzOiBjcywgLy/lj4LmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0udG9TdHJpbmcoKSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNDM6IC8v6Ieq6Lqr5rCU6KGA6auY5LqONjAl5pe2LOaZrumAmuaUu+WHu+aciTQwJeamgueOh+ayiem7mOebruagh1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY2hhSHA0MzogbnVtYmVyID0gTWF0aC5hYnMoY2ZnRWYuYXJnc1tcImhwXCJdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHA0MyA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocF9tYXg0MyA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKChmX2hwNDMgKiAxMDAwMCkgLyBmX2hwX21heDQzID4gY2hhSHA0Mykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlZFJhbmQucmFuZCgxLCAxMDAwMCkgPD0gY2ZnRWYuYXJnc1tcInBcIl0gKiAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wibmV4dGlkXCJdID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA0NDogLy/miqTnm77mtojlpLHml7bvvIznm7TmjqXpgKDmiJDoh6rouqvlkajlm7TlhajkvZPnm67moIcxMjAl5oqA6IO95Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIGNzW1wibmV4dGlkXCJdID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0udG9TdHJpbmcoKSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA0NTogLy/oh6rouqvlj5fliLDotoXov4flvZPliY3msJTooYAxMCXku6XkuIrkvKTlrrPml7bvvIzojrfnmoTmn5Dnp43mlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHA0NiA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocDQ2X29sZCA9IHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocF9tYXg0NiA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKChmX2hwNDYgLSBmX2hwNDZfb2xkKSAvIGZfaHBfbWF4NDYgPiBjZmdFZi5hcmdzW1wiaHBcIl0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNzW1wibmV4dGlkXCJdID0gMTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGlpZCwgc2tpZCwgY2ZnRWYuYXJnc1tcImlkXCJdLnRvU3RyaW5nKCksIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDQ2OiAvL+eJuueJsuiHquW3sXh4eCXlvZPliY3msJTooYDvvIzlr7nnm67moIfpgKDmiJB4eHgl5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBpX2hwID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIC0xICogTWF0aC5mbG9vcihpX2hwICogY2ZnRWYuYXJnc1tcImhwXCJdKV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV0ubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanNfaGl0cyhpaWQsIHRoaXMub25lRmlpZHNbaWlkXVtlZl90dHlwZV1ba10sIGNmZ0VmLmFyZ3NbXCJhXCJdICogMTAwMDAsIHNraWQpOyAvL+iuoeeul+S8pOWus1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGd6aGl0ID0gdGhpcy5vbmVIaXRbaWlkXVt0aGlzLm9uZUZpaWRzW2lpZF1bZWZfdHR5cGVdW2tdXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgdGhpcy5vbmVGaWlkc1tpaWRdW2VmX3R0eXBlXVtrXSwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgLTEgKiBNYXRoLmZsb29yKGd6aGl0LnNraGl0KV0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNDc6IC8v57uZQk9TU+aMguS6huafkOenjUJVRkbvvIxCT1NT5bCx5YWN55ar6L+Z5Liq5pWI5p6c44CCXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IGNmZ0VmLmFyZ3MsIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDQ4OiAvL0JPU1PmirXmipfnnJ/mhI8v54Gr54Sw55qE5pe26Ze05YeP5bCRXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgNDUgKiAzMCwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IGNmZ0VmLmFyZ3MsIC8v5bGe5oCnXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDUxOiAvL+WbnuihgFxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImlmXCJdID09IDEpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcIm5leHRpZFwiXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkOiBpaWQsIC8v6Kem5Y+R6ICFXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzOiBmaWlkcywgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl90dHlwZSwgLy/lrprml7blmajmoIfor4Zcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY2ZnRWYudHJpZ2dlclRpbWUgPyBjZmdFZi50cmlnZ2VyVGltZSA6IFs2MDFdLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jOiBcInNrX2VmZmVjdFwiLCAvL+aJp+ihjOeahOWHveaVsOWQjVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsemhlbjogMzAsIC8v6L2u6K+i5omn6KGM5pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV6aGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lkOiBza2lkLCAvL+aKgOiDvUlEXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlaWQ6IGVmZmVjdElkLCAvL+aViOaenElEfOihjOS4uklEXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzOiBjcywgLy/lj4LmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9zdWIoaWlkLCBlZl90dHlwZSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnRWYuYXJnc1tcImlmXCJdID09IDIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcIm5leHRpZFwiXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXJfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkOiBpaWQsIC8v6Kem5Y+R6ICFXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWRzOiBmaWlkcywgLy/op6blj5Hlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl90dHlwZSwgLy/lrprml7blmajmoIfor4Zcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY2ZnRWYudHJpZ2dlclRpbWUgPyBjZmdFZi50cmlnZ2VyVGltZSA6IFs2MDFdLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jOiBcInNrX2VmZmVjdFwiLCAvL+aJp+ihjOeahOWHveaVsOWQjVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsemhlbjogY2ZnRWYuaW50ZXJ2YWwgKiAzMCwgLy/ova7or6LmiafooYzml7bpl7Rcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraWQ6IHNraWQsIC8v5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVpZDogZWZmZWN0SWQsIC8v5pWI5p6cSUR86KGM5Li6SURcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3M6IGNzLCAvL+WPguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWumuaXtuWQjuWKoOihgFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpXzUxX2F0ayA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiYXRrXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpXzUxX2hwID0gTWF0aC5mbG9vcigoY2ZnRWYuYXJnc1tcImF0a19wZXJcIl0gKiBpXzUxX2F0aykgLyAxMDAwMCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIGlfNTFfaHBdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAvLyBjc1tcIm5leHRpZFwiXSA9IDFcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJpZFwiXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaV81MV9hdGsgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGlfNTFfaHAgPSBNYXRoLmZsb29yKChjZmdFZi5hcmdzW1wiYXRrX3BlclwiXSAqIGlfNTFfYXRrKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJocFwiLCBpXzUxX2hwXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIC8vIOaciemZhOWKoGlkXG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNTI6IC8v5by65Yi25a+55pyJ5a+S5oSP54q25oCB55uu5qCH6L2s5YyW5Li65Yaw5Ya777yM5q+P5bGC5a+S5oSP5Yaw5Ya7eOenku+8iOi9rOWMluWujOaIkOWQju+8jOmcgOimgea4heepuuebruagh+WvkuaEj+eKtuaAge+8iVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaGl0aWlkcyA9IE9iamVjdC5rZXlzKHRoaXMub25lSGl0W2lpZF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGhpdGlpZHMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXRpaWQgPSBoaXRpaWRzW2tdO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZfZWZmX2lfNyA9IHRoaXMuc2tidWZmX2dldChoaXRpaWQsIFwiZWZmZWN0X2lfN1wiLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmX2VmZl9pXzcgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heFpoZW4gPSBNYXRoLmZsb29yKHRoaXMuemhlbiArIGZfZWZmX2lfNyAqIGNmZ0VmLmFyZ3NbXCJ0XCJdICogMzApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBoaXRpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImVmZmVjdF9pXzVcIiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogbWF4WmhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHt9LCAvL+WxnuaAp1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGhpdGlpZCwgXCJlZmZlY3RfaV83XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNTM6IC8v5Lyk5a6z5Yqg5rex77yI6K6h566X5pS75Ye75Yqb5YCN5pWw77yJIOi/memHjOeahOS8pOWus+ebuOW9k+S6juaYr+ebtOaOpeeUqOaUu+WHu+WKm+eahOWAjeaVsOS9nOS4uuS8pOWus+WAvFxuLy8gICAgICAgICAgICAgICAgICAgICAvLyDmnKzmrKHmlLvlh7vliqDmiJDnmoQg5LiL5LiA5bin5LiN6IO95YaN5Yqg5Lyk5a6z6KaB5pys5qyh5Yqg77yB77yB77yBXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vbmVBdGtbZmlpZF0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaV81M19hdGsgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdGlpZHMyID0gT2JqZWN0LmtleXModGhpcy5vbmVIaXRbaWlkXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGl0aWlkczIubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5vbmVBdGtbZmlpZF1baGl0aWlkczJba11dLmVmZmVjdC5sZW5ndGg7IGorKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uZUF0a1tmaWlkXVtoaXRpaWRzMltrXV0uZWZmZWN0W2pdWzBdID09PSBcImhwXCIgJiYgdGhpcy5vbmVBdGtbZmlpZF1baGl0aWlkczJba11dLmVmZmVjdFtqXVsxXSA8IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmVBdGtbZmlpZF1baGl0aWlkczJba11dLmVmZmVjdFtqXVsxXSA9IC1NYXRoLmZsb29yKChpXzUzX2F0ayAqIGNmZ0VmLmFyZ3NbXCJhdGtcIl0pIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyAxLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfNTM6IE1hdGguZmxvb3IoKGlfNTNfYXRrICogY2ZnRWYuYXJnc1tcImF0a1wiXSkgLyAxMDAwMCksXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA1NDogLy/nm7TmjqXlr7nmnInnnJ/mhI/nirbmgIHnmoTnm67moIfov5vooYzlvJXniIbvvIzmr4/lsYLnnJ/mhI/pop3lpJbpgKDmiJB4eCXkvKTlrrNcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdHMgPSBPYmplY3Qua2V5cyh0aGlzLm9uZUhpdFtpaWRdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGlfYXRrNTQgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoaXRzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWZmX2lfOF81NCA9IHRoaXMuc2tidWZmX2dldChoaXRzW2tdLCBcImVmZmVjdF9pXzhcIiwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGl0NTQgPSBNYXRoLmZsb29yKGlfYXRrNTQgKiBjZmdFZi5hcmdzW1wiYVwiXSAqIGVmZl9pXzhfNTQpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpdDU0ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBoaXRzW2tdLCBcImVmZmVjdFwiLCBbXCJocFwiLCAtMSAqIGhpdDU0XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViX2FsbChoaXRzW2tdLCBcImVmZmVjdF9pXzhcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA1NjogLy/lvJXniIbmiJHmlrnmiYDmnInnnJ/mhI/vvIzmr4/lsYLnnJ/mhI/pop3lpJbpgKDmiJAyMCXnmoTkvKTlrrNcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGVmZl9pXzRfNTYgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICAvLyDmuIXpmaTmiJHmlrnmiYDmnInnnJ/mhI9cbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaW5kZXgrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVpZCA9IHRoaXMudGVhbUZpaWRzW2luZGV4XTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpaWQubGVuZ3RoICE9IHVpZC5sZW5ndGgpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IHRoaXMuc2tidWZmX2dldCh1aWQsIFwiZWZmZWN0X2lfOFwiLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZfaV80XzU2ICs9IGNvdW50O1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1Yl9hbGwodWlkLCBcImVmZmVjdF9pXzhcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGVmZl9pXzRfNTYgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGl0cyA9IE9iamVjdC5rZXlzKHRoaXMub25lSGl0W2lpZF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlfYXRrNTYgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImF0a1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGl0cy5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXQ1NiA9IE1hdGguZmxvb3IoaV9hdGs1NiAqIGNmZ0VmLmFyZ3NbXCJhXCJdICogZWZmX2lfNF81Nik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpdDU2ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGhpdHNba10sIFwiZWZmZWN0XCIsIFtcImhwXCIsIC0xICogaGl0NTZdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDU3OiAvL+a4hemZpOaIkeaWueaJgOacieeBq+eEsOeKtuaAge+8jOavj+WxgueBq+eEsOmineWklumAoOaIkHgl55qE5Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZfaV80XzU3ID0gMDtcbi8vICAgICAgICAgICAgICAgICAgICAgLy8g5riF6Zmk5oiR5pa554Gr54SwXG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRlYW1GaWlkcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1aWQgPSB0aGlzLnRlYW1GaWlkc1tpbmRleF07XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWlkLmxlbmd0aCAhPSB1aWQubGVuZ3RoKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY291bnQgPSB0aGlzLnNrYnVmZl9nZXQodWlkLCBcImVmZmVjdF9pXzRcIiwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmX2lfNF81NyArPSBjb3VudDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKHVpZCwgXCJlZmZlY3RfaV80XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZfaV80XzU3ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdHMgPSBPYmplY3Qua2V5cyh0aGlzLm9uZUhpdFtpaWRdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpX2F0azU3ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhdGtcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGhpdHMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGl0NTcgPSBNYXRoLmZsb29yKGlfYXRrNTcgKiBjZmdFZi5hcmdzW1wiYVwiXSAqIGVmZl9pXzRfNTcpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaXQ1NyA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBoaXRzW2tdLCBcImVmZmVjdFwiLCBbXCJocFwiLCAtMSAqIGhpdDU3XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA1ODogLy/lm57ooYDvvIjmjInlt7LmjZ/lpLHnlJ/lkb3nmoQl5Y676K6h566X5Zue6KGA5YC877yJXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wiaWZcIl0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV81ODogY2ZnRWYuYXJnc1tcImhwXCJdLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzU4X2NkOiBjZmdFZi5jZCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV81OF9uWmhlbjogdGhpcy56aGVuLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcGsgPSB0aGlzLnV1aWRzW2lpZF0/LmZwaztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwNTggPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJocFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwX21heDU4ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZEhwNTg6IG51bWJlciA9IE1hdGguZmxvb3IoKChmX2hwX21heDU4IC0gZl9ocDU4KSAqIGNmZ0VmLmFyZ3NbXCJocFwiXSkgLyAxMDAwMCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnBrICYmIGNmZ0VmLnRyaWdnZXJUaW1lID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhmcGssIGZwaywgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGZwaywgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgYWRkSHA1OF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgYWRkSHA1OF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNTk6IC8v5pyJ5qaC546H5bCG54Gr54Sw5q+P56eS5oyB57ut5Lyk5a6z5aKe5YqgeHglXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApIDw9IGNmZ0VmLmFyZ3NbXCJwXCJdICogMTAwMDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlZmZlY3RfaV80ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiZWZmZWN0X2lfNFwiLCAyKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZlY3RfaV80ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpXzU5ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaV81OVwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuc2tidWZmX3VwZGF0ZShmaWlkLCB7IGlfNTk6IGlfNTkgKyBjZmdFZi5hcmdzW1wiYVwiXSB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IDEsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV81OTogY2ZnRWYuYXJnc1tcImFcIl0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDYwOiAvL+enu+mZpOWvueaJi+etiemHj+eahOWxnuaAp+WAvFxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZWZmX2lfZXA6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGtleXM2MCA9IE9iamVjdC5rZXlzKGNmZ0VmLmFyZ3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXM2MC5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0uZXBzW2tleXM2MFtrXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZWZmX2lfZXBba2V5czYwW2tdXSA9IC0xICogTWF0aC5hYnMoY2ZnRWYuYXJnc1trZXlzNjBba11dKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiBlZmZfaV9lcCxcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjE6IC8v5oqk5L2T572h5rCU55qE5om/5Lyk5YeP5bCRL+WinuWKoHh4eCVcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfNjE6IGNmZ0VmLmFyZ3NbXCJocF9tYXhcIl0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA2MjogLy/nm67moIfmsrvnlpfmlYjmnpzpmY3kvY4v5aKe5Yqg77yM5oyB57utWOenklxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV82MjogY2ZnRWYuYXJnc1tcImhwXCJdLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjM6IC8v5Li76KeS6Zi15Lqh5ZCO77yM5byf5a2Q5Lya5aSN5rS75Li76KeS5bm25oGi5aSNMTkuNTYl55Sf5ZG977yM5q+P5Zy65oiY5paX55Sf5pWIMeasoe+8iOenmOazleWSjOazleWZqOeahOWkjea0u+WPquiDveeUn+aViDHkuKrvvIlcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdICUgMTAwICE9IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2hwX21heDYzID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgYWRkSHA2MjogbnVtYmVyID0gTWF0aC5mbG9vcigoZl9ocF9tYXg2MyAqIGNmZ0VmLmFyZ3NbXCJocFwiXSkgLyAxMDAwMCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBjc1tcImRvX2lpZFwiXS50b1N0cmluZygpLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzYzX2hwOiBhZGRIcDYyLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfNjNfblpoZW46IHRoaXMuemhlbixcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzYzX2NkOiAwLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjQ6IC8v5byf5a2Q6aaW5qyh5pS75Ye75Lyk5a6z6aKd5aSW5o+Q5Y2HeCVcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfNjRfYTogY2ZnRWYuYXJnc1tcImFcIl0gKiAxMDAwMCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzY0X2NkOiBjZmdFZi5jZCA/IGNmZ0VmLmNkIDogMCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzY0X25aaGVuOiB0aGlzLnpoZW4sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA2NTogLy/pmYTliqDooqvmlLvlh7vnm67moIfnmoTlvZPliY3nlJ/lkb3lgLxYJeS8pOWusyzmnIDpq5jkvKTlrrPkuI3otoXov4fmlLvlh7vlipt4JVxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZl9hdGs6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiYXRrXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQga2V5czY1ID0gT2JqZWN0LmtleXModGhpcy5vbmVBdGtbaWlkXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5czY1Lmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWlkLmxlbmd0aCAhPSBrZXlzNjVba10ubGVuZ3RoKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZF82NTogbnVtYmVyID0gMDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZl9ocCA9IHRoaXMuc2tidWZmX2dldChrZXlzNjVba10sIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF82NSA9IChjZmdFZi5hcmdzW1wiaHBcIl0gKiBmX2hwKSAvIDEwMDAwO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF82NSA9IE1hdGgubWluKGFkZF82NSwgKGNmZ0VmLmFyZ3NbXCJtYXhfYXRrXCJdICogZl9hdGspIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF82NSA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoYWRkXzY1KSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGtleXM2NVtrXSwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgLTEgKiBhZGRfNjVdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDY2OiAvL+maj+acuuS4gOS4quW8n+WtkCDlgbflj5bnm67moIfkuLvop5J4JeeahOaUu+WHu+WKm++8jOavj+WxguacgOmrmOS4jei2hei/h3gl6Ieq6Lqr5pS75Ye75YqbIOS4jiA3OemFjeWQiOS9v+eUqFxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWYuYXJnc1tcImlkXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tfZWZmZWN0KGZpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpLCBcIlwiLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3OTogLy/lgbflj5bnm67moId4JeeahOaUu+WHu+WKm++8jOavj+WxguacgOmrmOS4jei2hei/h3gl6Ieq6Lqr5pS75Ye75YqbXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyBhdGtfcGVyOiBcImF0a1wiLCBkZWZfcGVyOiBcImRlZlwiLCBocF9tYXhfcGVyOiBcImhwX21heFwiLCBocF9wZXI6IFwiaHBcIiB9O1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZXBzXzY2OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmZXBzXzY2OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzNzkgPSBPYmplY3Qua2V5cyhjZmdFZi5hcmdzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzNzkubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2lpZF0uZXBzW2tleXM3OVtrXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlfa2V5ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwga2V5c1trZXlzNzlba11dID8ga2V5c1trZXlzNzlba11dIDoga2V5czc5W2tdKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmX2tleSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBrZXlzW2tleXM3OVtrXV0gPyBrZXlzW2tleXM3OVtrXV0gOiBrZXlzNzlba10pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZfdmFsID0gTWF0aC5mbG9vcigoZl9rZXkgKiBjZmdFZi5hcmdzW2tleXM3OVtrXV0pIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF92YWwgPSBNYXRoLmZsb29yKChpX2tleSAqIGNmZ0VmLmFyZ3NbXCJtYXhfYXRrXCJdKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpX2ZfdmFsID0ga2V5czc5W2tdID09IFwiYXRrX3BlclwiID8gTWF0aC5taW4oZl92YWwsIG1heF92YWwpIDogZl92YWw7IC8vIOi/meS4quWAvOaYr+aUu+WHu+WKm1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleXM3OVtrXSA9PSBcImF0a19wZXJcIikge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0a19wZXIg566X55qE5piv5pS75Ye75YqbIOebtOaOpeWKoOWcqGF0a+S4iumdolxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwc182NltrZXlzW2tleXM3OVtrXV1dID0gaV9mX3ZhbDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXBzXzY2W2tleXNba2V5czc5W2tdXV0gPSAtMSAqIGZfdmFsO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcHNfNjZba2V5czc5W2tdXSA9IGlfZl92YWw7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVwc182NltrZXlzNzlba11dID0gLTEgKiBmX3ZhbDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IGVwc182Nixcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IGZlcHNfNjYsXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDY3OiAvL+WvueacgOe7iOS8pOWus+acieamgueOh+mAoOaIkE7lgI3kvKTlrrNcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGFfcGVyOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBjZmdFZi5hcmdzW1wicDFcIl0gKiAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgYV9wZXIgPSBjZmdFZi5hcmdzW1wiYTFcIl07XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBjZmdFZi5hcmdzW1wicFwiXSAqIDEwMDAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBhX3BlciA9IGNmZ0VmLmFyZ3NbXCJhXCJdO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChhX3BlciA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogb3ZlcmxheVR5cGUsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHsgYV9wZXI6IGFfcGVyIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDY4OiAvL+aUu+WHu+aXtu+8jOa2iOiAl+iHqui6q3gl5b2T5YmN55Sf5ZG95YC877yM5omj6Zmk5pWM5pa5562J6aKd55Sf5ZG95YC877yM5pyA6auY5LiN6LaF6L+H6Ieq6LqreCXmlLvlh7tcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGlfaHA2OCA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaHBcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBpX2F0azY4ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhdGtcIik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBtYXggPSBNYXRoLmZsb29yKChpX2F0azY4ICogY2ZnRWYuYXJnc1tcImF0a19wZXJcIl0pIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgc3ViSHA2OCA9IE1hdGguZmxvb3IoKGlfaHA2OCAqIE1hdGguYWJzKGNmZ0VmLmFyZ3NbXCJocFwiXSkpIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICBzdWJIcDY4ID0gTWF0aC5taW4oc3ViSHA2OCwgbWF4KTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGxzT25lID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIC8v5Y+q5omj6Zmk5LiA5qyhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsc09uZSArPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCBpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIC0xICogc3ViSHA2OF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgLTEgKiBzdWJIcDY4XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNjk6IC8v5q+P5qyh6L+b6KGM5Y+N5Ye777yM6I635b6XNTEl5by65YyW5YW954G177yM5pyA5aSn5LiN6LaF6L+H6Ieq6Lqr5pS75Ye75YqbMzAl77yM5oyB57utMuenku+8jOWGt+WNtDEw56eSXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBmX2F0azY5ID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiYXRrXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgbV9xaHNob3VsaW5nID0gTWF0aC5mbG9vcigoZl9hdGs2OSAqIGNmZ0VmLmFyZ3NbXCJhdGtfcGVyXCJdKSAvIDEwMDAwKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IHFoc2hvdWxpbmcgPSBNYXRoLm1pbihjZmdFZi5hcmdzW1wicWhzaG91bGluZ1wiXSwgbV9xaHNob3VsaW5nKTtcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IDEsIC8vIDEu5Y+g5YqgICAyLuS4jeWPoOWKoOabv+aNou+8jOm7mOiupOS4jeWhq+WAvOWwseaYr+S4jeWPoOWKoFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2VuZzogZV9tLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWhzaG91bGluZzogcWhzaG91bGluZyxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21heF9hZGRfaGl0OiBNYXRoLmZsb29yKChmX2F0azY5ICogY2ZnRWYuYXJnc1tcImF0a1wiXSkgLyAxMDAwMCksXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3MDogLy/lj43lvLl4eCXnmoTkvKTlrrPnu5nmlYzmlrks5pyA5aSn5LiN6LaF6L+H6Ieq6Lqr5pS75Ye75YqbMuWAjVxuLy8gICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bkuIrmrKHmlLvlh7voh6rlt7HnmoTkurpcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdF9maWlkID0gdGhpcy51dWlkc1tpaWRdPy5mcGs7XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBoaXQ3MDogbnVtYmVyID0gY3NbXCJoaXRcIl0gKiBjZmdFZi5hcmdzW1wiYVwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IG1heDcwID0gKHRoaXMuc2tidWZmX2dldChpaWQsIFwiYXRrXCIpICogY2ZnRWYuYXJnc1tcImF0a19wZXJcIl0pIC8gMTAwMDA7XG4vLyAgICAgICAgICAgICAgICAgICAgIGhpdDcwID0gTWF0aC5mbG9vcihNYXRoLm1pbihoaXQ3MCwgbWF4NzApKTtcbi8vICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmFkZE9uZUF0ayhoaXRfZmlpZCxoaXRfZmlpZCxcImFUeXBlXCIsWHlzLkFjdGlvblR5cGUuZWZmZWN0KVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoaGl0X2ZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGhpdF9maWlkLCBoaXRfZmlpZCwgXCJlZmZlY3RcIiwgW1wiaHBcIiwgLTEgKiBoaXQ3MF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNzE6IC8v5Y2V5qyh5Lyk5a6z5LiN6LaF6L+H6Ieq6Lqr5pyA5aSn55Sf5ZG95YC855qEeCVcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiZG9faWlkXCJdICE9IE51bWJlcihmaWlkKSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaHBfbWF4NzEgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImhwX21heFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF9oaXRfNzEgPSBNYXRoLmZsb29yKChmX2hwX21heDcxICogY2ZnRWYuYXJnc1tcImhwX21heFwiXSkgLyAxMDAwMCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiAxLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2lfNzE6IG1heF9oaXRfNzEsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2lfNzFfY2Q6IGNmZ0VmLmNkID8gY2ZnRWYuY2QgOiAwLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pXzcxX25aaGVuOiB0aGlzLnpoZW4sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3MjogLy/nm67moIflpITkuo7mn5Dnp43nirbmgIHvvIznhLblkI7lu7bplb/mraTnirbmgIHnmoTml7bpl7Rcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGZfaV9idWZmID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiZWZmZWN0X2lfXCIgKyBjZmdFZi5hcmdzW1wiYnVmZlwiXSwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChmX2lfYnVmZiA+IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IGtleXM3MiA9IE9iamVjdC5rZXlzKHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW1wiZWZmZWN0X2lfXCIgKyBjZmdFZi5hcmdzW1wiYnVmZlwiXV0pXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5czcyID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdLCAxKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5czcyLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdXVtOdW1iZXIoa2V5czcyW2tdKV0uZXpoZW4gKz0gMzAgKiBjZmdFZi5hcmdzW1widFwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2tCdWZmKDIsIGZpaWQsIFwiZWZmZWN0X2lfXCIgKyBjZmdFZi5hcmdzW1wiYnVmZlwiXSwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDczOiAvL+avj+asoemHiuaUvuacr+azle+8jOacr+azleS8pOWus+WinuWKoDcuNSXvvIzmnIDpq5jlj6DliqDliLAxNSVcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IHFobWlmYTczID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaV83M1wiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgcWhtaWZhNzMgKz0gY2ZnRWYuYXJnc1tcInFobWlmYVwiXTtcbi8vICAgICAgICAgICAgICAgICAgICAgcWhtaWZhNzMgPSBNYXRoLm1pbihxaG1pZmE3MywgY2ZnRWYuYXJnc1tcIm1heF9xaG1pZmFcIl0pO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogMiwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiAxLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7IGlfNzM6IHFobWlmYTczIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDc0OiAvL+e7meiiq+a6heWwhOeahOebruagh+WinuWKoOS4gOS4qkJVRkbmlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXS50b1N0cmluZygpLCBlZl90dHlwZSwgY3MpO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDc1OiAvL+aKgOiDveezu+aVsOWinuWKoO+8jOeUn+aViDHmrKHlkI7muIXnqbpcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJhXCJdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiAyLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IDEsIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHsgaV83NTogY2ZnRWYuYXJnc1tcImFcIl0gKiAxMDAwMCB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3NjogLy/lrZjlnKhidWZm5pe277yM6YCg5oiQ5oqA6IO95Lyk5a6zXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuYXJnc1tcImJ1ZmZcIl0pID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV9cIiArIGNmZ0VmLmFyZ3NbXCJidWZmXCJdLCAyKSA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5qc19oaXRzKGlpZCwgZmlpZCwgZV9hLCBza2lkKTsgLy/orqHnrpfkvKTlrrNcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGd6aGl0ID0gdGhpcy5vbmVIaXRbaWlkXVtmaWlkXTtcbi8vICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdCA9IGd6aGl0LnNraGl0O1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGlpZCwgXCJhVHlwZVwiLCBYeXMuQWN0aW9uVHlwZS5lZmZlY3QpO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIC0xICogaGl0XSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1wicFwiXSAhPSBudWxsICYmIHRoaXMuc2VlZFJhbmQucmFuZCgxLCAxMDAwMCkgPD0gY2ZnRWYuYXJnc1tcInBcIl0gKiAxMDAwMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY3NbXCJuZXh0aWRcIl0gPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za19lZmZlY3QoaWlkLCBza2lkLCBjZmdFZi5hcmdzW1wiaWRcIl0sIGVmX3R0eXBlLCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgY2FzZSA3NzogLy8g6YCg5oiQ5Lyk5a6z77yI6aKd5aSW5Lyk5a6z77yJXG4vLyAgICAgICAgICAgICAgICAgICAgIGNzW1wiaGl0XCJdID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhdGtcIik7XG5cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNzW1wiaGl0XCJdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBoaXRfNzcgPSBNYXRoLmZsb29yKChjc1tcImhpdFwiXSAqIGNmZ0VmLmFyZ3NbXCJhdGtcIl0pIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgZWZmZWN0ID0gW107XG4vLyAgICAgICAgICAgICAgICAgICAgIGVmZmVjdCA9IFtcImhwXCIsIC0xICogaGl0Xzc3XTtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJzXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdCA9IFtcImhwXCIsIC0xICogaGl0Xzc3LCBcImppdHVpXCIsIGNmZ0VmLmFyZ3NbXCJzXCJdXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhpaWQsIGZpaWQsIFwiZWZmZWN0XCIsIGVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgNzg6IC8vIOmHiuaUvuaKgOiDveWQjiDpgKDmiJDmn5Dnp43mlYjmnpwgaWTlr7nlupTph4rmlL7mioDog73lkI7mlYjmnpxcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmLmFyZ3NbXCJpZFwiXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChpaWQsIHNraWQsIGNmZ0VmLmFyZ3NbXCJpZFwiXSwgZWZfdHR5cGUsIGNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDgwOiAvLyDnu5noh6rouqvliqBidWZm77yM5pS75Ye755uu5qCH5bim5pyJ5p+Q5LiqYnVmZuaXtu+8jOW/heWumuaatOWHu1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9hZGQoe1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZmlpZDogZmlpZCwgLy/mt7vliqDlr7nosaFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZWZfYnVmZiwgLy/lsZ7mgKdrZXlcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pblpoZW46IHRoaXMuemhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1heFpoZW46IHRoaXMuemhlbiArIG1heHpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5VHlwZTogMSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiAxLCAvL+WinuWKoOWxguaVsFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZXBzOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV84MF9idWZmOiBjZmdFZi5hcmdzW1wiYnVmZlwiXSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbi8vICAgICAgICAgICAgICAgICBjYXNlIDgxOiAvLyDmuoXlsITkvKTlrrPlop7liqAv5YeP5bCRXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX2FkZCh7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWlkOiBmaWlkLCAvL+a3u+WKoOWvueixoVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlZl9idWZmLCAvL+WxnuaAp2tleVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluWmhlbjogdGhpcy56aGVuLCAvL+W8gOWni+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4WmhlbjogdGhpcy56aGVuICsgbWF4emhlbiwgLy/nu5PmnZ/luKdcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlUeXBlOiBvdmVybGF5VHlwZSwgLy8gMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjZW5nOiBlX20sIC8v5aKe5Yqg5bGC5pWwXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlcHM6IHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXzgxOiBlX2EsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV84MV9jZDogMCwgLy8g5oyB57ut5oCn55qEIOS4jeWKoGNkXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV84MV9uWmhlbjogdGhpcy56aGVuLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSwgLy/lsZ7mgKdcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuLy8gICAgICAgICAgICAgICAgIGNhc2UgODI6IC8v5pS75Ye75bim5pyJ5oqk5L2T572h5rCU55qE5om/5Lyk5YeP5bCRL+WinuWKoHh4eCVcbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfYWRkKHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpaWQ6IGZpaWQsIC8v5re75Yqg5a+56LGhXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVmX2J1ZmYsIC8v5bGe5oCna2V5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5aaGVuOiB0aGlzLnpoZW4sIC8v5byA5aeL5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhaaGVuOiB0aGlzLnpoZW4gKyBtYXh6aGVuLCAvL+e7k+adn+W4p1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVR5cGU6IG92ZXJsYXlUeXBlLCAvLyAxLuWPoOWKoCAgMi7kuI3lj6DliqDmm7/mjaLvvIzpu5jorqTkuI3loavlgLzlsLHmmK/kuI3lj6DliqBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNlbmc6IGVfbSwgLy/lop7liqDlsYLmlbBcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGVwczoge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfODI6IGNmZ0VmLmFyZ3NbXCJocF9tYXhcIl0sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICBpZiAoIXBhc3MpIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIC8vY2Rcbi8vICAgICAgICAgaWYgKGZpaWRzLmxlbmd0aCA+IDApIHtcbi8vICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoY2ZnRWYuY291bnQpID09IGZhbHNlICYmIHRoaXMuemhlbiAhPSAxKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmNvdW50ICs9IDE7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCA+PSBjZmdFZi5jb3VudCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmVmZmVjdFpoZW4gPSB0aGlzLnpoZW47XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0ubmV4dGNkID0gdGhpcy56aGVuICsgY2ZnRWYuY2QgKiAzMDtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5jb3VudCA9IDA7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXJbZWZfdHR5cGVdW2NzW1widGltZXJJZFwiXS50b1N0cmluZygpXS5zemhlbiA9IHRoaXMuemhlbiArIGNmZ0VmLmNkICogMzA7XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VmLmNkKSA9PSBmYWxzZSAmJiB0aGlzLnpoZW4gIT0gMSkge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0uY291bnQgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0uZWZmZWN0WmhlbiA9IHRoaXMuemhlbjsgLy8g5LiK5qyh5Yqg54q25oCB55qE5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjZmdFZi5hcmdzW1widFwiXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2Jhc2Vbc2tpZF0uZWZmZWN0W2VmZmVjdElkXS5lZmZlY3RFbmRaaGVuIDwgdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLmVmZmVjdEVuZFpoZW4gPSB0aGlzLnpoZW4gKyBjZmdFZi5hcmdzW1widFwiXSAqIDMwOyAvLyBidWZm5oyB57ut5aKe5Yqg5pWI5p6c57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnNrYmFzZVtza2lkXS5lZmZlY3RbZWZmZWN0SWRdLm5leHRjZCA9IHRoaXMuemhlbiArIGNmZ0VmLmNkICogMzA7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0uc2tiYXNlW3NraWRdLmVmZmVjdFtlZmZlY3RJZF0ubmV4dGNkID0gdGhpcy56aGVuICsgY2ZnRWYuY2QgKiAzMDtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvLyDliKTlrprmmK/lkKbmmK/lvJ/lrZDmioDog70g6Kem5Y+R5byf5a2Q6YeK5pS+5oqA6IO95Li76KeS5Yqg6KGAXG4vLyAgICAgICAgIGlmIChjZmdCYXNlLnR5cGUgPT09IFwiMVwiICYmIGNmZ0Jhc2Uuc2tpbGxUeXBlID09PSAzKSB7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICAgICAgbGV0IHVpZCA9IHRoaXMudGVhbUZpaWRzW2luZGV4XTtcbi8vICAgICAgICAgICAgICAgICBpZiAodWlkLmxlbmd0aCA9PT0gaWlkLmxlbmd0aCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgaV81OCA9IHRoaXMuc2tidWZmX2dldCh1aWQsIFwiZWZmZWN0X2lfNThcIiwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChpXzU4ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuemhlbiA+PSB0aGlzLnNrYnVmZl9nZXQodWlkLCBcImlfNThfblpoZW5cIikpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmnIljZOeahCDliqDlrozkuIDmrKHopoHmm7TmlrBjZFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZCA9IHRoaXMuc2tidWZmX2dldCh1aWQsIFwiaV81OF9jZFwiKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl91cGRhdGUodWlkLCB7IGlfNThfblpoZW46IGNkICogMzAgKyB0aGlzLnpoZW4gfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZFBlciA9IHRoaXMuc2tidWZmX2dldCh1aWQsIFwiaV81OFwiKTsgLy8g5oGi5aSN5bey5o2f5aSx55Sf5ZG955qEeCVcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHAgPSB0aGlzLnNrYnVmZl9nZXQodWlkLCBcImhwXCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBocE1heCA9IHRoaXMuc2tidWZmX2dldCh1aWQsIFwiaHBfbWF4XCIpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXQgPSBNYXRoLmZsb29yKCgoaHBNYXggLSBocCkgKiBhZGRQZXIpIC8gMTAwMDApO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgaWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmVmZmVjdCk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsoaWlkLCB1aWQsIFwiZWZmZWN0XCIsIFtcImhwXCIsIGhpdF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g6I635Y+W5YC85oC75ZKMXG4vLyAgICAgICogZ1R5cGUgPSAyIOWPoOWKoOeahOWxguaVsFxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgc2tidWZmX2dldChpaWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIGdUeXBlOiBudW1iZXIgPSAwKTogbnVtYmVyIHtcbi8vICAgICAgICAgbGV0IGVwVmFsOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHJldHVybiAwO1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgLy/lsYLmlbBcbi8vICAgICAgICAgaWYgKGdUeXBlID09IDIpIHtcbi8vICAgICAgICAgICAgIGxldCBjZW5nOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICAgICAgaWYgKGtleSA9PSBcImVmZmVjdF9pXzEwXCIpIHtcbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYnVmZltcImVmZmVjdF9pXzFcIl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjZW5nICs9IHRoaXMudXVpZHNbaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV8xXCJdLmxlbmd0aDtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV8zXCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY2VuZyArPSB0aGlzLnV1aWRzW2lpZF0uc2tidWZmW1wiZWZmZWN0X2lfM1wiXS5sZW5ndGg7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tidWZmW1wiZWZmZWN0X2lfNFwiXSAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNlbmcgKz0gdGhpcy51dWlkc1tpaWRdLnNrYnVmZltcImVmZmVjdF9pXzRcIl0ubGVuZ3RoO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tpaWRdLnNrYnVmZltcImVmZmVjdF9pXzVcIl0gIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBjZW5nICs9IHRoaXMudXVpZHNbaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV81XCJdLmxlbmd0aDtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV82XCJdICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY2VuZyArPSB0aGlzLnV1aWRzW2lpZF0uc2tidWZmW1wiZWZmZWN0X2lfNlwiXS5sZW5ndGg7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIC8vbGV0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0uc2tidWZmKVxuLy8gICAgICAgICAgICAgICAgIGxldCBrZXlzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgaWlkLCBudWxsLCAxKTtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGtleXNba10uaW5jbHVkZXMoXCJlZmZlY3RfaV8wXCIpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW2lpZF0uc2tidWZmW2tleXNba11dKVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IHRoaXMuY2hhbmdlU2tCdWZmKDEsIGlpZCwga2V5c1trXSwgMik7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v6K6h566X5bGe5oCnIOi/memHjGlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleXMyID0gT2JqZWN0LmtleXModmFsdWVzW2pdLmVwcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBrZXlzMi5sZW5ndGg7IGwrKykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tpaWRdLmVwc1trZXlzMltsXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tqXS5lcHNba2V5czJbbF1dIDwgMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VuZyArPSAxO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbmc7XG4vLyAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2lpZF0uc2tidWZmW2tleV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHJldHVybiAwO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgcmV0dXJuIHRoaXMudXVpZHNbaWlkXS5za2J1ZmZba2V5XS5sZW5ndGg7XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+WxnuaAp1xuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tpaWRdLmVwc1trZXldICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgIGVwVmFsID0gdGhpcy50ZWFtc1tpaWRdLmVwc1trZXldO1xuLy8gICAgICAgICAgICAgaWYgKGtleSA9PSBcImhwXCIpIHtcbi8vICAgICAgICAgICAgICAgICAvL+WJqeS9meihgOmHj1xuLy8gICAgICAgICAgICAgICAgIGVwVmFsID0gdGhpcy5qdWVGaWlkSHAoaWlkKTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvLyBsZXQgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW2lpZF0uc2tidWZmKTtcbi8vICAgICAgICAgbGV0IHZhbHVlcyA9IHRoaXMuY2hhbmdlU2tCdWZmKDEsIGlpZCwgbnVsbCwgMik7XG4vLyAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdmFsdWVzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbHVlc1trXS5sZW5ndGg7IGorKykge1xuLy8gICAgICAgICAgICAgICAgIC8v6K6h566X5bGe5oCnIOi/memHjGlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc1trXVtqXS5lcHNba2V5XSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBlcFZhbCArPSB2YWx1ZXNba11bal0uZXBzW2tleV07XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cblxuLy8gICAgICAgICAvL+aUu+WHu1xuLy8gICAgICAgICBpZiAoa2V5ID09IFwiYXRrXCIpIHtcbi8vICAgICAgICAgICAgIGxldCBhdGtfcGVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJhdGtfcGVyXCIpO1xuLy8gICAgICAgICAgICAgZXBWYWwgKz0gTWF0aC5mbG9vcigoZXBWYWwgKiBhdGtfcGVyKSAvIDEwMDAwKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvL+mYsuW+oVxuLy8gICAgICAgICBpZiAoa2V5ID09IFwiZGVmXCIpIHtcbi8vICAgICAgICAgICAgIGxldCBkZWZfcGVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJkZWZfcGVyXCIpO1xuLy8gICAgICAgICAgICAgZXBWYWwgKz0gTWF0aC5mbG9vcigoZXBWYWwgKiBkZWZfcGVyKSAvIDEwMDAwKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvL+eUn+WRveeZvuWIhuavlFxuLy8gICAgICAgICBpZiAoa2V5ID09IFwiaHBfbWF4XCIpIHtcbi8vICAgICAgICAgICAgIGxldCBocF9tYXhfcGVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJocF9tYXhfcGVyXCIpO1xuLy8gICAgICAgICAgICAgZXBWYWwgKz0gTWF0aC5mbG9vcigoZXBWYWwgKiBocF9tYXhfcGVyKSAvIDEwMDAwKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvL+eUn+WRveeZvuWIhuavlFxuLy8gICAgICAgICBpZiAoa2V5ID09IFwiaHBcIikge1xuLy8gICAgICAgICAgICAgbGV0IGhwX3BlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaHBfcGVyXCIpO1xuLy8gICAgICAgICAgICAgZXBWYWwgKz0gTWF0aC5mbG9vcigoZXBWYWwgKiBocF9wZXIpIC8gMTAwMDApO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKGVwVmFsKTtcbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDovoXliqnlh73mlbAgLSDmuIXpmaRidWZmXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza2J1ZmZfY2xlYXIoKSB7XG4vLyAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRlYW1GaWlkcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgIGxldCBmaWlkID0gdGhpcy50ZWFtRmlpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0uZXBzLmhwIDw9IDApIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZiA9IHt9O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgLy9sZXQgc2tidWZmQ29weSA9IGdhbWVNZXRob2Qub2JqQ29weSh0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZik7XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZiA9IHt9O1xuLy8gICAgICAgICAgICAgLy8gbGV0IGtleXMgPSBPYmplY3Qua2V5cyhza2J1ZmZDb3B5KVxuLy8gICAgICAgICAgICAgbGV0IGtleXMgPSB0aGlzLmNoYW5nZVNrQnVmZigxLCBmaWlkLCBudWxsLCAxKTtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuLy8gICAgICAgICAgICAgICAgIC8v6K6h566X5bGe5oCnIOi/memHjGlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgLy8gbGV0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMoc2tidWZmQ29weVtrZXlzW2tdXSlcbi8vICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwga2V5c1trXSwgMik7XG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuemhlbiA+PSB2YWx1ZXNbal0uZXpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodmFsdWVzW2pdLmVwc1tcImlfOV9pZFwiXSkgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChmaWlkLCB2YWx1ZXNbal0uZXBzW1wiaV85X3NraW5cIl0udG9TdHJpbmcoKSwgdmFsdWVzW2pdLmVwc1tcImlfOV9pZFwiXS50b1N0cmluZygpLCBcIlwiLCB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2lpZDogTnVtYmVyKGZpaWQpLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0aWQ6IDEsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5c1trXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5c1trXV0gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXlzW2tdXS5wdXNoKHZhbHVlc1tqXSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy5jaGFuZ2VTa0J1ZmYoMiwgZmlpZCwgbnVsbCwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmYpO1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pXzlcIiwgMikgPD0gMCkge1xuLy8gICAgICAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMudXVpZHNbZmlpZF0ucG9kdW4pO1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdmFsdWVzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1Yl9hbGwoZmlpZCwgdmFsdWVzW2tdKTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiZWZmZWN0X2lfNFwiLCAyKSA8PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViX2FsbChmaWlkLCBcImVmZmVjdF9pXzU5XCIpO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g6L6T5Ye6QlVGRlxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgc2tidWZmX291dGYoKSB7XG4vLyAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5vbmVCdWZmKTtcbi8vICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhrZXlzW2tdLCBrZXlzW2tdLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmJ1ZmYpO1xuLy8gICAgICAgICAgICAgLy8gbGV0IGtleXMyID0gT2JqZWN0LmtleXModGhpcy51dWlkc1trZXlzW2tdXS5za2J1ZmYpXG4vLyAgICAgICAgICAgICBsZXQga2V5czIgPSB0aGlzLmNoYW5nZVNrQnVmZigxLCBrZXlzW2tdLCBudWxsLCAxKTtcbi8vICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwga2V5czIubGVuZ3RoOyBqKyspIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhrZXlzW2tdLCBrZXlzW2tdLCBcImJ1ZmZcIiwgW2tleXMyW2pdLCB0aGlzLnV1aWRzW2tleXNba11dLnNrYnVmZltrZXlzMltqXV0ubGVuZ3RoXSk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDovoXliqnlh73mlbAgLSDmt7vliqDlsZ7mgKflgLxcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHNrYnVmZl9hZGQoY3M6IHNrYnVmZl9hZGRfY3MpIHtcbi8vICAgICAgICAgbGV0IGVmZl9pXzEyID0gdGhpcy5za2J1ZmZfZ2V0KGNzLmZpaWQsIFwiZWZmZWN0X2lfMTJcIiwgMik7XG4vLyAgICAgICAgIGlmIChlZmZfaV8xMiA+IDApIHtcbi8vICAgICAgICAgICAgIGlmIChbXCJlZmZlY3RfaV8xXCIsIFwiZWZmZWN0X2lfM1wiLCBcImVmZmVjdF9pXzRcIiwgXCJlZmZlY3RfaV81XCIsIFwiZWZmZWN0X2lfNlwiXS5pbmNsdWRlcyhjcy5rZXkpKSB7XG4vLyAgICAgICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKGNzLmtleS5pbmNsdWRlcyhcImVmZmVjdF9pXzBcIikpIHtcbi8vICAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGNzLmVwcyk7XG4vLyAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlYW1zW2NzLmZpaWRdLmVwc1trZXlzW2tdXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoY3MuZXBzW2tleXNba11dIDwgMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgaWYgKGNzLm92ZXJsYXlUeXBlID09IDEpIHtcbi8vICAgICAgICAgICAgIC8vMS7lj6DliqAgIDIu5LiN5Y+g5Yqg5pu/5o2i77yM6buY6K6k5LiN5aGr5YC85bCx5piv5LiN5Y+g5YqgXG4vLyAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tjcy5maWlkXS5za2J1ZmZbY3Mua2V5XSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tjcy5maWlkXS5za2J1ZmZbY3Mua2V5XSA9IFtdO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNzLmNlbmc7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2NzLmZpaWRdLnNrYnVmZltjcy5rZXldLnB1c2goe1xuLy8gICAgICAgICAgICAgICAgICAgICBzemhlbjogY3MubWluWmhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgZXpoZW46IGNzLm1heFpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGVwczogY3MuZXBzLCAvL+WxnuaAp+WAvFxuLy8gICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1tjcy5maWlkXS5za2J1ZmZbY3Mua2V5XSA9IFtdO1xuLy8gICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNzLmNlbmc7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2NzLmZpaWRdLnNrYnVmZltjcy5rZXldLnB1c2goe1xuLy8gICAgICAgICAgICAgICAgICAgICBzemhlbjogY3MubWluWmhlbiwgLy/lvIDlp4vluKdcbi8vICAgICAgICAgICAgICAgICAgICAgZXpoZW46IGNzLm1heFpoZW4sIC8v57uT5p2f5binXG4vLyAgICAgICAgICAgICAgICAgICAgIGVwczogY3MuZXBzLCAvL+WxnuaAp+WAvFxuLy8gICAgICAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMuY2hhbmdlU2tCdWZmKDIsIGNzLmZpaWQsIGNzLmtleSwgMSwgdGhpcy51dWlkc1tjcy5maWlkXS5za2J1ZmZbY3Mua2V5XSk7XG4vLyAgICAgICAgIHRoaXMub25lQnVmZltjcy5maWlkXSA9IDE7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g5L+u5pS55bGe5oCn5YC8XG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza2J1ZmZfdXBkYXRlKGlpZDogc3RyaW5nLCBlcHM6IHsgW3A6IHN0cmluZ106IG51bWJlciB9LCB0eXBlOiBudW1iZXIgPSAwKSB7XG4vLyAgICAgICAgIGlmICh0aGlzLnRlYW1zW2lpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4vLyAgICAgICAgICAgICB0aGlzLnRlYW1zW2lpZF0uZXBzID0gZXBzO1xuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhlcHMpO1xuLy8gICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4vLyAgICAgICAgICAgICAgICAgdGhpcy50ZWFtc1tpaWRdLmVwc1trZXlzW2tdXSA9IGVwc1trZXlzW2tdXTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOi+heWKqeWHveaVsCAtIOWIoOmZpOWxnuaAp+WAvCAoMeS4qilcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIHNrYnVmZl9zdWIoZmlpZDogc3RyaW5nLCBrZXk6IHN0cmluZykge1xuLy8gICAgICAgICBpZiAodGhpcy51dWlkc1tmaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldKSA9PSB0cnVlKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5XS5zcGxpY2UoMCwgMSk7XG4vLyAgICAgICAgIHRoaXMuY2hhbmdlU2tCdWZmKDIsIGZpaWQsIGtleSwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZba2V5XSk7XG4vLyAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6L6F5Yqp5Ye95pWwIC0g5Yig6Zmk5bGe5oCn5YC8ICjmiYDmnIkpXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBza2J1ZmZfc3ViX2FsbChmaWlkOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4vLyAgICAgICAgIGlmICh0aGlzLnV1aWRzW2ZpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW2tleV0pID09IHRydWUpIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvL2RlbGV0ZSB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltrZXldO1xuLy8gICAgICAgICB0aGlzLmNoYW5nZVNrQnVmZigzLCBmaWlkLCBrZXkpO1xuLy8gICAgICAgICBpZiAoa2V5ID09IFwiZWZmZWN0X2lfNFwiICYmIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW1wiZWZmZWN0X2lfNTlcIl0pIHtcbi8vICAgICAgICAgICAgIC8vIOeBq+eEsOa4hemZpOaXtiDlr7nlupTnmoTngavnhLDlop7kvKTkuZ/muIXpmaRcbi8vICAgICAgICAgICAgIC8vZGVsZXRlIHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW1wiZWZmZWN0X2lfNTlcIl1cbi8vICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2tCdWZmKDMsIGZpaWQsIFwiZWZmZWN0X2lfNTlcIik7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgdGhpcy5vbmVCdWZmW2ZpaWRdID0gMTtcbi8vICAgICB9XG5cbi8vICAgICAvKipcbi8vICAgICAgKiDovoXliqnlh73mlbAgLSDmnIDnu4jkvKTlrrPlop7lh49cbi8vICAgICAgKiBAcGFyYW0gaWlkIOaJk+S6ulxuLy8gICAgICAqIEBwYXJhbSBmaWlkIOiiq+aJk+S6ulxuLy8gICAgICAqIEBwYXJhbSBoaXQg6YCg5oiQ55qE5Lyk5a6zXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBoaXRfbGFzdChpaWQ6IHN0cmluZywgZmlpZDogc3RyaW5nLCBoaXQ6IG51bWJlciwgaXNmajogbnVtYmVyID0gMCk6IG51bWJlciB7XG4vLyAgICAgICAgIGlmIChoaXQgPD0gMCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIDA7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGFkZF9wZXI6IG51bWJlciA9IDA7XG4vLyAgICAgICAgIC8v5pyA57uI5Lyk5a6z6ZmN5L2OeHglXG4vLyAgICAgICAgIGxldCBpXzEzX25aaGVuID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaV8xM19uWmhlblwiKTtcbi8vICAgICAgICAgaWYgKHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pXzEzXCIsIDIpID4gMCAmJiB0aGlzLnpoZW4gPj0gaV8xM19uWmhlbikge1xuLy8gICAgICAgICAgICAgYWRkX3BlciArPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJpXzEzXCIpO1xuLy8gICAgICAgICAgICAgbGV0IGNkID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaV8xM19jZFwiKTtcbi8vICAgICAgICAgICAgIGlmIChjZCA+IDApIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl91cGRhdGUoZmlpZCwgeyBpXzEzX25aaGVuOiBjZCAqIDMwICsgdGhpcy56aGVuIH0pO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGhpdCArPSBNYXRoLmZsb29yKChoaXQgKiBhZGRfcGVyKSAvIDEwMDAwKTtcbi8vICAgICAgICAgLy8g6K6h566X5Liq5Lq65oiY5Yqb5beuIOezu+aVsFxuLy8gICAgICAgICBoaXQgPSBNYXRoLmZsb29yKHRoaXMucG93ZXJEaXNwYXJpdHkoaWlkLCBmaWlkKSAqIGhpdCk7XG4vLyAgICAgICAgIGhpdCA9IE1hdGgubWF4KDAsIGhpdCk7XG4vLyAgICAgICAgIGxldCBmX2lfOSA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImlfOVwiKTtcbi8vICAgICAgICAgaWYgKGZfaV85ID4gMCkge1xuLy8gICAgICAgICAgICAgLy/mnInmiqTnm75cbi8vICAgICAgICAgICAgIGxldCBmX2lfNjEgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJpXzYxXCIpIC8gMTAwMDA7XG4vLyAgICAgICAgICAgICBsZXQgaV9pXzgyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJpXzgyXCIpIC8gMTAwMDA7XG4vLyAgICAgICAgICAgICAvL2xldCBjb3B5ID0gZ2FtZU1ldGhvZC5vYmpDb3B5KHRoaXMudXVpZHNbZmlpZF0uc2tidWZmW1wiZWZmZWN0X2lfOVwiXSk7XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltcImVmZmVjdF9pXzlcIl0gPSBbXTtcbi8vICAgICAgICAgICAgIC8vIGxldCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGNvcHkpXG4vLyAgICAgICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5jaGFuZ2VTa0J1ZmYoMSwgZmlpZCwgXCJlZmZlY3RfaV85XCIsIDIpO1xuLy8gICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB2YWx1ZXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICBsZXQgc2tidWZmID0gdmFsdWVzW2tdO1xuLy8gICAgICAgICAgICAgICAgIC8v6K6h566X5bGe5oCnIOi/memHjGlu5rKh5YWz57O7XG4vLyAgICAgICAgICAgICAgICAgbGV0IGlfOV9hZGQgPSBNYXRoLmZsb29yKHNrYnVmZi5lcHNbXCJpXzlcIl0gKiAoZl9pXzYxIC0gaV9pXzgyKSk7XG4vLyAgICAgICAgICAgICAgICAgaWYgKGhpdCA+PSBza2J1ZmYuZXBzW1wiaV85XCJdICsgaV85X2FkZCkge1xuLy8gICAgICAgICAgICAgICAgICAgICBoaXQgLT0gc2tidWZmLmVwc1tcImlfOVwiXSArIGlfOV9hZGQ7XG4vLyAgICAgICAgICAgICAgICAgICAgIHNrYnVmZi5lcHNbXCJpXzlcIl0gPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHNrYnVmZi5lcHNbXCJpXzlfaWRcIl0pID09IGZhbHNlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdChmaWlkLCBza2J1ZmYuZXBzW1wiaV85X3NraW5cIl0udG9TdHJpbmcoKSwgc2tidWZmLmVwc1tcImlfOV9pZFwiXS50b1N0cmluZygpLCBcIlwiLCB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faWlkOiBOdW1iZXIoZmlpZCksXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGlkOiAxLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcl9kbygxMDUsIHsgZG9faWlkOiBOdW1iZXIoZmlpZCkgfSk7IC8v5oqk5L2T572h5rCU56C056KO5pe26Kem5Y+RXG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lQnVmZltmaWlkXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgc2tidWZmLmVwc1tcImlfOVwiXSAtPSBoaXQgLSBpXzlfYWRkO1xuLy8gICAgICAgICAgICAgICAgICAgICBoaXQgPSAwO1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2ZpaWRdLnNrYnVmZltcImVmZmVjdF9pXzlcIl0ucHVzaChza2J1ZmYpO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICBpZiAoaXNmaiA9PT0gMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhmaWlkLCBmaWlkLCBcImVmZmVjdFwiLCBbXCJpXzlcIiwgc2tidWZmLmVwc1tcImlfOVwiXV0pO1xuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkT25lQXRrKGlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wiaV85XCIsIHNrYnVmZi5lcHNbXCJpXzlcIl1dKTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLmNoYW5nZVNrQnVmZigyLCBmaWlkLCBcImVmZmVjdF9pXzlcIiwgMSwgdGhpcy51dWlkc1tmaWlkXS5za2J1ZmZbXCJlZmZlY3RfaV85XCJdKTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKGhpdCk7XG4vLyAgICAgfVxuLy8gICAgIC8vIOS4quS6uuaImOWKm+W3rlxuLy8gICAgIHByaXZhdGUgcG93ZXJEaXNwYXJpdHkoaWlkOiBzdHJpbmcsIGZpaWQ6IHN0cmluZywgcG93ZXI/OiBudW1iZXIsIGZQb3dlcj86IG51bWJlcik6IG51bWJlciB7XG4vLyAgICAgICAgIGxldCBwY3QxID0gMTtcbi8vICAgICAgICAgbGV0IHBjdDIgPSAxO1xuLy8gICAgICAgICBsZXQgaWxlbiA9IGlpZC5sZW5ndGg7XG4vLyAgICAgICAgIGxldCBmbGVuID0gZmlpZC5sZW5ndGg7XG4vLyAgICAgICAgIGlmICh0aGlzLmRhbWFnZVtpbGVuXSAmJiB0aGlzLmRhbWFnZVtpbGVuXVtmbGVuXSkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGFtYWdlW2lsZW5dW2ZsZW5dO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLmRhbWFnZVtpbGVuXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICB0aGlzLmRhbWFnZVtpbGVuXSA9IHt9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLmRhbWFnZVtmbGVuXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICB0aGlzLmRhbWFnZVtmbGVuXSA9IHt9O1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMuZGFtYWdlW2lsZW5dW2ZsZW5dID0gcGN0MTtcbi8vICAgICAgICAgdGhpcy5kYW1hZ2VbZmxlbl1baWxlbl0gPSBwY3QyO1xuLy8gICAgICAgICBpZiAocG93ZXIgIT0gbnVsbCAmJiBmUG93ZXIgIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgaWYgKHBvd2VyID09IDAgfHwgZlBvd2VyID09IDApIHtcbi8vICAgICAgICAgICAgICAgICByZXR1cm4gcGN0MTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIC8vIOaImOWKm+W3rlxuLy8gICAgICAgICAgICAgbGV0IHBvd2VyQyA9IE1hdGguYWJzKHBvd2VyIC0gZlBvd2VyKTtcbi8vICAgICAgICAgICAgIC8vIOaImOWKm+avlFxuLy8gICAgICAgICAgICAgbGV0IHBvd2VyQiA9IE1hdGgubWluKHBvd2VyLCBmUG93ZXIpIC8gTWF0aC5tYXgocG93ZXIsIGZQb3dlcik7XG4vLyAgICAgICAgICAgICBsZXQgaW5kZXggPSAxO1xuLy8gICAgICAgICAgICAgd2hpbGUgKGluZGV4ID4gMCkge1xuLy8gICAgICAgICAgICAgICAgIGxldCBkYW1hZ2UgPSBHYW1lY2ZnLnVzZXJEYW1hZ2UuZ2V0SXRlbShpbmRleC50b1N0cmluZygpKTtcbi8vICAgICAgICAgICAgICAgICBpZiAoZGFtYWdlICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGFtYWdlLnpoYW5saXJhbmdlWzBdIDw9IHBvd2VyQyAmJlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgKChkYW1hZ2UuemhhbmxpcmFuZ2UubGVuZ3RoID09IDIgJiYgcG93ZXJDIDw9IGRhbWFnZS56aGFubGlyYW5nZVsxXSkgfHwgZGFtYWdlLnpoYW5saXJhbmdlLmxlbmd0aCA9PSAxKSAmJlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGFtYWdlLnJhdGlvWzBdIDw9IHBvd2VyQiAmJlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJCIDw9IGRhbWFnZS5yYXRpb1sxXVxuLy8gICAgICAgICAgICAgICAgICAgICApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3dlciA+IGZQb3dlcikge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdDEgKz0gZGFtYWdlLnhpc2h1YTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3QyIC09IGRhbWFnZS54aXNodWI7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdDEgLT0gZGFtYWdlLnhpc2h1Yjtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3QyICs9IGRhbWFnZS54aXNodWE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IC0xO1xuLy8gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gLTE7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy5kYW1hZ2VbaWxlbl1bZmxlbl0gPSBwY3QxO1xuLy8gICAgICAgICAgICAgdGhpcy5kYW1hZ2VbZmxlbl1baWxlbl0gPSBwY3QyO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiBwY3QxO1xuLy8gICAgIH1cbi8vICAgICAvKipcbi8vICAgICAgKiDmmK/lkKbmmrTlh7tcbi8vICAgICAgKiBAcGFyYW0gaWlkXG4vLyAgICAgICogQHBhcmFtIGZpaWRcbi8vICAgICAgKiDmmrTlh7vnjoc9bWF477yIKOaIkeaWueaatOWHuy3mlYzmlrnmipfmmrTlh7vvvInvvIzmmrTlh7vkv53lupXlj4LmlbApXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBpc0Jhb2ppKGlpZDogc3RyaW5nLCBmaWlkOiBzdHJpbmcpOiBudW1iZXIge1xuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tpaWRdLnR5cGUgPT0gMykge1xuLy8gICAgICAgICAgICAgcmV0dXJuIDA7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgbGV0IGlzQmo6IG51bWJlciA9IDA7XG4vLyAgICAgICAgIGxldCBlZl9pXzI0ID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV8yNFwiLCAyKTtcbi8vICAgICAgICAgaWYgKGVmX2lfMjQgPiAwKSB7XG4vLyAgICAgICAgICAgICAvL+W/heWumuaatOWHu1xuLy8gICAgICAgICAgICAgdGhpcy5za2J1ZmZfc3ViX2FsbChpaWQsIFwiZWZmZWN0X2lfMjRcIik7XG4vLyAgICAgICAgICAgICBpc0JqID0gMTtcbi8vICAgICAgICAgICAgIHJldHVybiBpc0JqO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBlZl9pXzgwID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJlZmZlY3RfaV84MFwiLCAyKTtcbi8vICAgICAgICAgbGV0IGVmX2lfODBfYnVmZiA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwiaV84MF9idWZmXCIpO1xuLy8gICAgICAgICBpZiAoZWZfaV84MCA+IDAgJiYgdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiZWZmZWN0X2lfXCIgKyBlZl9pXzgwX2J1ZmYsIDIpID4gMCkge1xuLy8gICAgICAgICAgICAgLy/lv4XlrprmmrTlh7tcbi8vICAgICAgICAgICAgIHRoaXMuc2tidWZmX3N1Yl9hbGwoaWlkLCBcImVmZmVjdF9pXzgwXCIpO1xuLy8gICAgICAgICAgICAgaXNCaiA9IDE7XG4vLyAgICAgICAgICAgICByZXR1cm4gaXNCajtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGxldCBpX2Jhb2ppOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImJhb2ppXCIpO1xuLy8gICAgICAgICBsZXQgZl9oc2Jhb2ppOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJoc2Jhb2ppXCIpO1xuLy8gICAgICAgICBsZXQgYmRiYW9qaTogbnVtYmVyID0gMDsgLy/kv53lupXmmrTlh7tcbi8vICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcudXNlckVwLmdldEl0ZW0oXCJiYW9qaVwiKTtcbi8vICAgICAgICAgaWYgKGNmZyAhPSBudWxsKSB7XG4vLyAgICAgICAgICAgICBiZGJhb2ppID0gY2ZnLmluaXRFcDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBNYXRoLm1heChpX2Jhb2ppIC0gZl9oc2Jhb2ppLCBiZGJhb2ppKSkge1xuLy8gICAgICAgICAgICAgaXNCaiA9IDE7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIGlzQmo7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog5piv5ZCm6L+e5Ye7IOWPquaJk+S4gOasoVxuLy8gICAgICAqIEBwYXJhbSBpaWRcbi8vICAgICAgKiBAcGFyYW0gZmlpZFxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgaXNMaWFuamkoaWlkOiBzdHJpbmcsIGZpaWQ6IHN0cmluZyk6IG51bWJlciB7XG4vLyAgICAgICAgIGlmICh0aGlzLmp1ZUZpaWRIcChpaWQpIDw9IDAgfHwgdGhpcy5qdWVGaWlkSHAoZmlpZCkgPD0gMCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIDA7IC8v5YW25Lit5LiA5Liq5q275LqGXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMudGVhbXNbaWlkXS50eXBlID09IDMpIHtcbi8vICAgICAgICAgICAgIHJldHVybiAwO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBpc0xqOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBsZXQgaV9saWFuamk6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChpaWQsIFwibGlhbmppXCIpO1xuLy8gICAgICAgICBsZXQgZl9oc2xpYW5qaTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHNsaWFuamlcIik7XG4vLyAgICAgICAgIGxldCBiZGxpYW5qaTogbnVtYmVyID0gMDsgLy/kv53lupXmmrTlh7tcbi8vICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcudXNlckVwLmdldEl0ZW0oXCJsaWFuamlcIik7XG4vLyAgICAgICAgIGlmIChjZmcgIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgYmRsaWFuamkgPSBjZmcuaW5pdEVwO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmICh0aGlzLnNlZWRSYW5kLnJhbmQoMSwgMTAwMDApIDw9IGlfbGlhbmppIC0gZl9oc2xpYW5qaSkge1xuLy8gICAgICAgICAgICAgaXNMaiA9IDE7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIGlzTGo7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog5piv5ZCm5qC85oyhXG4vLyAgICAgICog5pWM5pa55qC85oyh546HPW1heO+8iCjmlYzmlrnmoLzmjKEt5oiR5pa55oqX5qC85oyh77yJ77yM5qC85oyh5L+d5bqV5Y+C5pWwKVxuLy8gICAgICAqIEBwYXJhbSBpaWRcbi8vICAgICAgKiBAcGFyYW0gZmlpZFxuLy8gICAgICAqICAxLuaVjOS6uuWmguaenOWkhOS6juaZleecqeOAgeWGsOWGu+S4re+8jOWImeebtOaOpeS4jeinpuWPkeagvOaMoe+8jOi3s+i/h+agvOaMoeeOh+iuoeeul+i/h+eoi1xuLy8gICAgICAqICAyLuWmguaenOaVjOS6uuWkhOS6jumdnuaZleecqeOAgeWGsOWGu+S4re+8jOWImeaMieagvOaMoeeOh+WIpOaWrVxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgaXNHZWRhbmcoaWlkOiBzdHJpbmcsIGZpaWQ6IHN0cmluZyk6IG51bWJlciB7XG4vLyAgICAgICAgIGlmICh0aGlzLnRlYW1zW2lpZF0udHlwZSA9PSAzKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gMDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgaXNHZDogbnVtYmVyID0gMDtcbi8vICAgICAgICAgbGV0IGZfaV8zOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoZmlpZCwgXCJlZmZlY3RfaV8zXCIsIDIpO1xuLy8gICAgICAgICBpZiAoZl9pXzMgPiAwKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gaXNHZDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBsZXQgZl9pXzU6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImVmZmVjdF9pXzVcIiwgMik7XG4vLyAgICAgICAgIGlmIChmX2lfNSA+IDApIHtcbi8vICAgICAgICAgICAgIHJldHVybiBpc0dkO1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgbGV0IGZfYmxvY2s6IG51bWJlciA9IHRoaXMuc2tidWZmX2dldChmaWlkLCBcImJsb2NrXCIpO1xuLy8gICAgICAgICBsZXQgaV9oc2Jsb2NrOiBudW1iZXIgPSB0aGlzLnNrYnVmZl9nZXQoaWlkLCBcImhzYmxvY2tcIik7XG5cbi8vICAgICAgICAgbGV0IGJkR2VkYW5nOiBudW1iZXIgPSAwOyAvL+S/neW6leagvOaMoVxuLy8gICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy51c2VyRXAuZ2V0SXRlbShcImJsb2NrXCIpO1xuLy8gICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbi8vICAgICAgICAgICAgIGJkR2VkYW5nID0gY2ZnLmluaXRFcDtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBpZiAodGhpcy5zZWVkUmFuZC5yYW5kKDEsIDEwMDAwKSA8PSBNYXRoLm1heChmX2Jsb2NrIC0gaV9oc2Jsb2NrLCBiZEdlZGFuZykpIHtcbi8vICAgICAgICAgICAgIGlzR2QgPSAxO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiBpc0dkO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOaYr+WQpuWPjeWHu1xuLy8gICAgICAqIEBwYXJhbSBpaWRcbi8vICAgICAgKiBAcGFyYW0gZmlpZFxuLy8gICAgICAqIOaVjOaWueWPjeWHu+eOhz1tYXjvvIgo5pWM5pa55Y+N5Ye7LeaIkeaWueaKl+WPjeWHu++8ie+8jOWPjeWHu+S/neW6leWPguaVsClcbi8vICAgICAgKiAgMS7op6bniq/lj43lh7vml7bmlLvlh7vkuI3og73ooqvmlYzkurrmoLzmjKHvvIzlv4Xpobvnmb7liIbnmb7lkb3kuK3vvIzvvIjkuZ/lsLHmmK/or7TkuI3kvJrooqvmlYzkurrmoLzmjKHvvIlcbi8vICAgICAgKiAgMi7op6bniq/lj43lh7vml7bmlLvlh7vkuI3kvJrnu6fnu63liKTmlq3mmK/lkKbop6blj5HmmrTlh7vvvIjkuZ/lsLHmmK/kuI3kvJrop6blj5HmmrTlh7vvvIlcbi8vICAgICAgKiAgMy7op6blj5Hlj43lh7vml7bkuI3kvJrop6blj5HnnKnmmZXjgIHov57lh7vjgIHmuoXlsIRcbi8vICAgICAgKiAgNC7lj43lh7vlkI7kuI3og73lho3op6blj5Hlj43lh7tcbi8vICAgICAgKi9cbi8vICAgICBwcml2YXRlIGlzRmFuamkoaWlkOiBzdHJpbmcsIGZpaWQ6IHN0cmluZyk6IG51bWJlciB7XG4vLyAgICAgICAgIGlmICh0aGlzLmp1ZUZpaWRIcChpaWQpIDw9IDAgfHwgdGhpcy5qdWVGaWlkSHAoZmlpZCkgPD0gMCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIDA7IC8v5YW25Lit5LiA5Liq5q275LqGXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMudGVhbXNbaWlkXS50eXBlID09IDMgfHwgdGhpcy50ZWFtc1tmaWlkXS50eXBlID09IDMpIHtcbi8vICAgICAgICAgICAgIHJldHVybiAwO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGxldCBpc2ZqOiBudW1iZXIgPSAwO1xuLy8gICAgICAgICBsZXQgaV9mYW5qaTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGlpZCwgXCJmYW5qaVwiKTtcbi8vICAgICAgICAgbGV0IGZfaHNmYW5qaTogbnVtYmVyID0gdGhpcy5za2J1ZmZfZ2V0KGZpaWQsIFwiaHNmYW5qaVwiKTtcbi8vICAgICAgICAgbGV0IGJkZmFuamk6IG51bWJlciA9IDA7IC8v5L+d5bqV5Y+N5Ye7XG4vLyAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLnVzZXJFcC5nZXRJdGVtKFwiZmFuamlcIik7XG4vLyAgICAgICAgIGlmIChjZmcgIT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgYmRmYW5qaSA9IGNmZy5pbml0RXA7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMuc2VlZFJhbmQucmFuZCgxLCAxMDAwMCkgPD0gTWF0aC5tYXgoaV9mYW5qaSAtIGZfaHNmYW5qaSwgYmRmYW5qaSkpIHtcbi8vICAgICAgICAgICAgIGlzZmogPSAxO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiBpc2ZqO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWinuWHj+iTneadoVxuLy8gICAgICAqIEBwYXJhbSBmaWlkXG4vLyAgICAgICogQHBhcmFtIG51bVxuLy8gICAgICAqIEByZXR1cm5zXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBhZGRfbXAoZmlpZDogc3RyaW5nLCBudW06IG51bWJlciwgd3o6IDAgfCAxIHwgMikge1xuLy8gICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKE51bWJlcihmaWlkKSAlIDEwMCAhPSAwKSB7XG4vLyAgICAgICAgICAgICByZXR1cm47XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHRoaXMubXBmaWlkc1tmaWlkXSA9PSBudWxsKSB7XG4vLyAgICAgICAgICAgICB0aGlzLm1wZmlpZHNbZmlpZF0gPSBbMCwgMF07XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKHd6ID09IDAgfHwgd3ogPT0gMSkge1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMubXBmaWlkc1tmaWlkXVt3el0gPT0gMSkge1xuLy8gICAgICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHRoaXMubXBmaWlkc1tmaWlkXVt3el0gPSAxO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMudGVhbXNbZmlpZF0uZXBzW1wibXBcIl0gPSBNYXRoLm1heCh0aGlzLnRlYW1zW2ZpaWRdLmVwc1tcIm1wXCJdLCAwKTtcbi8vICAgICAgICAgdGhpcy50ZWFtc1tmaWlkXS5lcHNbXCJtcFwiXSArPSBNYXRoLmZsb29yKG51bSk7XG4vLyAgICAgICAgIHRoaXMudGVhbXNbZmlpZF0uZXBzW1wibXBcIl0gPSBNYXRoLm1pbih0aGlzLnRlYW1zW2ZpaWRdLmVwc1tcIm1wXCJdLCAxMDAwMCk7XG4vLyAgICAgICAgIHRoaXMuYWRkT25lQXRrKGZpaWQsIGZpaWQsIFwiYVR5cGVcIiwgWHlzLkFjdGlvblR5cGUuZWZmZWN0KTtcbi8vICAgICAgICAgdGhpcy5hZGRPbmVBdGsoZmlpZCwgZmlpZCwgXCJlZmZlY3RcIiwgW1wibXBcIiwgbnVtXSk7XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog5re75Yqg6L2u6K+i5omn6KGM6ISa5pysXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSB0aW1lcl9hZGQoYWRkVGltZXI6IHRpbWVyX2FkZF9jcykge1xuLy8gICAgICAgICBpZiAodGhpcy51dWlkc1thZGRUaW1lci5paWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHJldHVybjsgLy/lhbzlrrnkuI3lrZjlnKjnmoTkurpcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGxldCBjcyA9IGdhbWVNZXRob2Qub2JqQ29weShhZGRUaW1lci5jcyk7XG4vLyAgICAgICAgIGlmIChjc1tcInRpbWVySWRcIl0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgY3NbXCJ0aW1lcklkXCJdID0gdGhpcy50aW1lcklkO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGlmIChhZGRUaW1lci50eXBlWzBdID09IDYwMikge1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbYWRkVGltZXIuaWlkXS50aW1lclthZGRUaW1lci5rZXldID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XSA9IHt9O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKGFkZFRpbWVyLm92ZXJsYXlUeXBlID09IDIpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XSA9IHt9OyAvL+aNouaOieWOn+adpeeahFxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgYWRkVGltZXIua2V5ID0gYWRkVGltZXIua2V5ICsgXCJfXCIgKyA2MDI7XG4vLyAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1thZGRUaW1lci5paWRdLnRpbWVyW2FkZFRpbWVyLmtleV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbYWRkVGltZXIuaWlkXS50aW1lclthZGRUaW1lci5rZXldID0ge307XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAoYWRkVGltZXIub3ZlcmxheVR5cGUgPT0gMikge1xuLy8gICAgICAgICAgICAgICAgIHRoaXMudXVpZHNbYWRkVGltZXIuaWlkXS50aW1lclthZGRUaW1lci5rZXldID0ge307IC8v5o2i5o6J5Y6f5p2l55qEXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XVtjc1tcInRpbWVySWRcIl0udG9TdHJpbmcoKV0gPSB7XG4vLyAgICAgICAgICAgICAgICAgZmlpZHM6IGFkZFRpbWVyLmZpaWRzLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgIHR5cGU6IGFkZFRpbWVyLnR5cGUsIC8v5omn6KGM6Kem5Y+R54K5XG4vLyAgICAgICAgICAgICAgICAgZnVuYzogYWRkVGltZXIuZnVuYywgLy/miafooYznmoTlh73mlbDlkI1cbi8vICAgICAgICAgICAgICAgICBzemhlbjogdGhpcy56aGVuLCAvL+inpuWPkeeahOW4p1xuLy8gICAgICAgICAgICAgICAgIGx6aGVuOiBhZGRUaW1lci5semhlbiwgLy/ova7or6LmiafooYzml7bpl7Rcbi8vICAgICAgICAgICAgICAgICBlemhlbjogYWRkVGltZXIuZXpoZW4sIC8v57uT5p2f5pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgc2tpZDogYWRkVGltZXIuc2tpZCwgLy/mioDog71JRFxuLy8gICAgICAgICAgICAgICAgIGFlaWQ6IGFkZFRpbWVyLmFlaWQsIC8v5pWI5p6cSUR86KGM5Li6SURcbi8vICAgICAgICAgICAgICAgICBjczogY3MsXG4vLyAgICAgICAgICAgICB9O1xuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbYWRkVGltZXIuaWlkXS50aW1lclthZGRUaW1lci5rZXldID09IG51bGwpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XSA9IHt9O1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKGFkZFRpbWVyLm92ZXJsYXlUeXBlID09IDIpIHtcbi8vICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XSA9IHt9OyAvL+aNouaOieWOn+adpeeahFxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgdGhpcy51dWlkc1thZGRUaW1lci5paWRdLnRpbWVyW2FkZFRpbWVyLmtleV1bY3NbXCJ0aW1lcklkXCJdLnRvU3RyaW5nKCldID0ge1xuLy8gICAgICAgICAgICAgICAgIGZpaWRzOiBhZGRUaW1lci5maWlkcywgLy/miafooYzop6blj5Hngrlcbi8vICAgICAgICAgICAgICAgICB0eXBlOiBhZGRUaW1lci50eXBlLCAvL+aJp+ihjOinpuWPkeeCuVxuLy8gICAgICAgICAgICAgICAgIGZ1bmM6IGFkZFRpbWVyLmZ1bmMsIC8v5omn6KGM55qE5Ye95pWw5ZCNXG4vLyAgICAgICAgICAgICAgICAgc3poZW46IHRoaXMuemhlbiwgLy/op6blj5HnmoTluKdcbi8vICAgICAgICAgICAgICAgICBsemhlbjogYWRkVGltZXIubHpoZW4sIC8v6L2u6K+i5omn6KGM5pe26Ze0XG4vLyAgICAgICAgICAgICAgICAgZXpoZW46IGFkZFRpbWVyLmV6aGVuLCAvL+e7k+adn+aXtumXtFxuLy8gICAgICAgICAgICAgICAgIHNraWQ6IGFkZFRpbWVyLnNraWQsIC8v5oqA6IO9SURcbi8vICAgICAgICAgICAgICAgICBhZWlkOiBhZGRUaW1lci5hZWlkLCAvL+aViOaenElEfOihjOS4uklEXG4vLyAgICAgICAgICAgICAgICAgY3M6IGNzLFxuLy8gICAgICAgICAgICAgfTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICB0aGlzLmNoYW5nZVRpbWVyKDIsIGFkZFRpbWVyLmlpZCwgYWRkVGltZXIua2V5LCAxLCB0aGlzLnV1aWRzW2FkZFRpbWVyLmlpZF0udGltZXJbYWRkVGltZXIua2V5XSk7XG4vLyAgICAgICAgIHRoaXMudGltZXJJZCArPSAxO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWIoOmZpOi9ruivouaJp+ihjOiEmuacrFxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgdGltZXJfc3ViKGZpaWQ6IHN0cmluZywga2V5OiBzdHJpbmcpIHtcbi8vICAgICAgICAgaWYgKHRoaXMudXVpZHNbZmlpZF0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHRoaXMuY2hhbmdlVGltZXIoMywgZmlpZCwga2V5KTtcbi8vICAgICAgICAgLy9kZWxldGUgdGhpcy51dWlkc1tmaWlkXS50aW1lcltrZXldO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOWIoOmZpOi9ruivouaJp+ihjOiEmuacrCAtIOWIoOmZpOafkOS4quS6uueahO+8iOWFs+S6juS7lueahOWumuaXtuWZqO+8iVxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgdGltZXJfc3ViX2J5X2ZpaWQoZmlpZDogc3RyaW5nKSB7XG4vLyAgICAgICAgIGlmICh0aGlzLnV1aWRzW2ZpaWRdID09IG51bGwpIHtcbi8vICAgICAgICAgICAgIHJldHVybjtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50ZWFtRmlpZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4vLyAgICAgICAgICAgICBsZXQgaWlkID0gdGhpcy50ZWFtRmlpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgLy8gbGV0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0udGltZXIpO1xuLy8gICAgICAgICAgICAgbGV0IGtleXMgPSB0aGlzLmNoYW5nZVRpbWVyKDEsIGlpZCwgbnVsbCwgMSk7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAvLyBsZXQga2V5czIgPSBPYmplY3Qua2V5cyh0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5c1trXV0pXG4vLyAgICAgICAgICAgICAgICAgbGV0IGtleXMyID0gdGhpcy5jaGFuZ2VUaW1lcigxLCBpaWQsIGtleXNba10sIDEpO1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwga2V5czIubGVuZ3RoOyBqKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS50aW1lcltrZXlzW2tdXVtrZXlzMltqXV0gJiYgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleXNba11dW2tleXMyW2pdXS5maWlkcykge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcHlGaWlkczogc3RyaW5nW10gPSBnYW1lTWV0aG9kLm9iakNvcHkodGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleXNba11dW2tleXMyW2pdXS5maWlkcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1aWRzW2lpZF0udGltZXJba2V5c1trXV1ba2V5czJbal1dLmZpaWRzID0gW107XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gY29weUZpaWRzO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCB2YWx1ZXMubGVuZ3RoOyBsKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzW2xdICE9IGZpaWQpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleXNba11dW2tleXMyW2pdXS5maWlkcy5wdXNoKHZhbHVlc1tsXSk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXVpZHNbaWlkXS50aW1lcltrZXlzW2tdXVtrZXlzMltqXV0uZmlpZHMubGVuZ3RoID09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51dWlkc1tpaWRdLnRpbWVyW2tleXNba11dW2tleXMyW2pdXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICB0aGlzLmNoYW5nZVRpbWVyKDIsIG51bGwsIG51bGwsIDEpO1xuLy8gICAgIH1cblxuLy8gICAgIC8qKlxuLy8gICAgICAqIOaJp+ihjOi9ruivouaJp+ihjOiEmuacrFxuLy8gICAgICAqIEBwYXJhbSBmaWlkIOaJp+ihjOS6ulxuLy8gICAgICAqIEBwYXJhbSB0eXBlIOaJp+ihjOeCuVxuLy8gICAgICAqL1xuLy8gICAgIHByaXZhdGUgdGltZXJfZG8oX3R5cGU6IG51bWJlciwgY3M6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fSkge1xuLy8gICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGVhbUZpaWRzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1t0aGlzLnRlYW1GaWlkc1tpXV0uZHpoZW4gPiAwICYmIHRoaXMudXVpZHNbdGhpcy50ZWFtRmlpZHNbaV1dLmR6aGVuIDwgdGhpcy56aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5q275LqGIOS4jeW6lOivpeWcqOinpuWPkeS6hlxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgLy8gbGV0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy51dWlkc1t0aGlzLnRlYW1GaWlkc1tpXV0udGltZXIpO1xuLy8gICAgICAgICAgICAgbGV0IGtleXM6IHN0cmluZ1tdID0gdGhpcy5jaGFuZ2VUaW1lcigxLCB0aGlzLnRlYW1GaWlkc1tpXSwgbnVsbCwgMSk7XG4vLyAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgICAgICAgICAgICAgICAvLyBsZXQgdGltZXJzID0gT2JqZWN0LnZhbHVlcyh0aGlzLnV1aWRzW3RoaXMudGVhbUZpaWRzW2ldXS50aW1lcltrZXlzW2tdXSk7XG4vLyAgICAgICAgICAgICAgICAgbGV0IHRpbWVycyA9IHRoaXMuY2hhbmdlVGltZXIoMSwgdGhpcy50ZWFtRmlpZHNbaV0sIGtleXNba10sIDIpO1xuLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGltZXJzLmxlbmd0aDsgaisrKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChfdHlwZSAhPSAwICYmICF0aW1lcnNbal0udHlwZS5pbmNsdWRlcyhfdHlwZSkpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL+S4jeaYr+i/meS4quaJp+ihjOexu+Wei+eahFxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnpoZW4gPCB0aW1lcnNbal0uc3poZW4gfHwgdGhpcy56aGVuID4gdGltZXJzW2pdLmV6aGVuKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/mnKrlvIDlp4vmiJbogIXov4fmnJ/kuoZcbi8vICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy56aGVuIDwgdGltZXJzW2pdLmx6aGVuIHx8ICh0aGlzLnpoZW4gLSB0aW1lcnNbal0uc3poZW4pICUgdGltZXJzW2pdLmx6aGVuID4gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5rKh5pyJ5Yiw5b2T5YmN5bin6Kem5Y+RXG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVyc1tqXS5mdW5jID09IFwic2tfZWZmZWN0XCIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc1tcImRvX2lpZFwiXSAhPSBOdW1iZXIodGhpcy50ZWFtRmlpZHNbaV0pKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhc3M6IGJvb2xlYW4gPSBmYWxzZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBmYWxzZSAmJiBfdHlwZSA9PSA0MDQgJiYgY3NbXCJkb19paWRcIl0udG9TdHJpbmcoKS5sZW5ndGggIT0gdGhpcy50ZWFtRmlpZHNbaV0ubGVuZ3RoKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSB0cnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBmYWxzZSAmJiBfdHlwZSA9PSAxMDYgJiYgdGltZXJzW2pdLmZpaWRzLmluY2x1ZGVzKGNzW1wiZG9faWlkXCJdLnRvU3RyaW5nKCkpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSB0cnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBmYWxzZSAmJiBfdHlwZSA9PSAyMDYgJiYgY3NbXCJkb19paWRcIl0udG9TdHJpbmcoKS5sZW5ndGggPT0gdGhpcy50ZWFtRmlpZHNbaV0ubGVuZ3RoKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSB0cnVlO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBmYWxzZSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbmVGaWlkc1t0aGlzLnRlYW1GaWlkc1tpXV0gPT0gbnVsbCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25lRmlpZHNbdGhpcy50ZWFtRmlpZHNbaV1dID0ge307XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lcl9maWlkczogc3RyaW5nW10gPSBbXTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWlkcyA9IHRpbWVyc1tqXS5maWlkcztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgZmlpZHMubGVuZ3RoOyBsKyspIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51dWlkc1tmaWlkc1tsXV09PW51bGwgKXtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJmaWlkcz09PTpcIixmaWlkcylcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnV1aWRzW2ZpaWRzW2xdXS5kemhlbiA+IDAgJiYgdGhpcy51dWlkc1tmaWlkc1tsXV0uZHpoZW4gPCB0aGlzLnpoZW4pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8v5q275LqGIOS4jeW6lOivpeWcqOinpuWPkeS6hlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyX2ZpaWRzLnB1c2goZmlpZHNbbF0pO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVyX2ZpaWRzLmxlbmd0aCA8PSAwICYmIHRpbWVyc1tqXS5maWlkcy5sZW5ndGggIT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOacrOi6q+ayoeacieebruagh+eahOWumuaXtuWZqCDkuI3opoHot7Pov4dcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdHlwZSA9PSA2MDIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzW2tdID0ga2V5c1trXS5zbGljZSgwLCBrZXlzW2tdLmxlbmd0aCAtIDQpO1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmVGaWlkc1t0aGlzLnRlYW1GaWlkc1tpXV1ba2V5c1trXV0gPSB0aW1lcl9maWlkcztcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjc0NvcHkgPSBnYW1lTWV0aG9kLm9iakNvcHkodGltZXJzW2pdLmNzKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGNzQ29weSA9IE9iamVjdC5hc3NpZ24oY3NDb3B5LCBjcyk7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3R5cGUgPT09IDYwMSB8fCBfdHlwZSA9PT0gNjAyKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NDb3B5W1wiaXNUaW1lclwiXSA9IDE7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNrX2VmZmVjdCh0aGlzLnRlYW1GaWlkc1tpXSwgdGltZXJzW2pdLnNraWQsIHRpbWVyc1tqXS5hZWlkLCBrZXlzW2tdLCBjc0NvcHkpO1xuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLyoqXG4vLyAgICAgICog6Kej6ZSB6ZqQ6JePXG4vLyAgICAgICovXG4vLyAgICAgcHJpdmF0ZSBqaWVzdW9faGlkZShpaWQ6IHN0cmluZykge1xuLy8gICAgICAgICBsZXQgbWluTHY6IG51bWJlciA9IDk5OTtcbi8vICAgICAgICAgbGV0IG1pbmZpaWQ6IHN0cmluZyA9IFwiXCI7XG4vLyAgICAgICAgIGxldCBpaWRMaXN0OiBzdHJpbmdbXSA9IFtdXG4vLyAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRlYW1GaWlkcy5sZW5ndGg7IGluZGV4KyspIHtcbi8vICAgICAgICAgICAgIGxldCBmaWlkID0gdGhpcy50ZWFtRmlpZHNbaW5kZXhdO1xuLy8gICAgICAgICAgICAgaWYgKGZpaWQubGVuZ3RoICE9IGlpZC5sZW5ndGgpIHtcbi8vICAgICAgICAgICAgICAgICBpaWRMaXN0LnB1c2goZmlpZCk7XG4vLyAgICAgICAgICAgICAgICAgY29udGludWU7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICBpZiAodGhpcy50ZWFtc1tmaWlkXS5pc0hpZGUgPT0gMCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgaWYgKHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlIDwgbWluTHYpIHtcbi8vICAgICAgICAgICAgICAgICBpZiAobWluZmlpZCAhPSBcIlwiKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVhbXNbZmlpZF0uaXNIaWRlID0gbWluTHY7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgIG1pbkx2ID0gdGhpcy50ZWFtc1tmaWlkXS5pc0hpZGU7XG4vLyAgICAgICAgICAgICAgICAgbWluZmlpZCA9IGZpaWQ7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgaWYgKG1pbmZpaWQgIT0gXCJcIikge1xuLy8gICAgICAgICAgICAgLy8g5riF56m65LiK5LiA5Y+qYm9zc+eahOW8guW4uOeKtuaAgVxuLy8gICAgICAgICAgICAgZm9yIChsZXQgaT0wO2k8aWlkTGlzdC5sZW5ndGg7aSsrKXtcbi8vICAgICAgICAgICAgICAgICBmb3IgKGxldCBrPTA7azx0aGlzLmJhdGVCdWZmLmxlbmd0aDtrKyspe1xuLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNrYnVmZl9zdWJfYWxsKGlpZExpc3RbaV0sdGhpcy5iYXRlQnVmZltrXSlcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB0aGlzLnRlYW1zW21pbmZpaWRdLmlzSGlkZSA9IDA7XG4vLyAgICAgICAgICAgICB0aGlzLmFkZE9uZUF0ayhtaW5maWlkLCBtaW5maWlkLCBcImFUeXBlXCIsIFh5cy5BY3Rpb25UeXBlLmhpZGUpO1xuLy8gICAgICAgICAgICAgdGhpcy5hZGRPbmVBdGsobWluZmlpZCwgbWluZmlpZCwgXCJlZmZlY3RcIiwgW1wiaXNIaWRlXCIsIDBdKTtcbi8vICAgICAgICAgfVxuLy8gICAgIH1cbi8vIH1cbiJdfQ==