MainScene.js 136 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/Script/MainScene.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, '726051WgaxHep/G1I05lW4n', 'MainScene');
  13. // Script/MainScene.ts
  14. "use strict";
  15. var __extends = (this && this.__extends) || (function () {
  16. var extendStatics = function (d, b) {
  17. extendStatics = Object.setPrototypeOf ||
  18. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  19. function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
  20. return extendStatics(d, b);
  21. };
  22. return function (d, b) {
  23. extendStatics(d, b);
  24. function __() { this.constructor = d; }
  25. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  26. };
  27. })();
  28. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  29. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  30. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31. else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  32. return c > 3 && r && Object.defineProperty(target, key, r), r;
  33. };
  34. Object.defineProperty(exports, "__esModule", { value: true });
  35. var Global_1 = require("./Global");
  36. var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property;
  37. var MainScene = /** @class */ (function (_super) {
  38. __extends(MainScene, _super);
  39. function MainScene() {
  40. var _this = _super !== null && _super.apply(this, arguments) || this;
  41. _this.boli = null;
  42. _this.dici = null;
  43. _this.lvdai = null;
  44. _this.shandian = null;
  45. _this.tanhuang = null;
  46. _this.Opplvdai = null;
  47. _this.GD = null;
  48. _this.failure = null;
  49. _this.fuhuo = null;
  50. _this.Player = null;
  51. _this.FHolderNode = null;
  52. _this.Bg = null;
  53. _this.LifeDing = null;
  54. _this.LEFT = null;
  55. _this.RIGHT = null;
  56. _this.output = null;
  57. // LIFE-CYCLE CALLBACKS:
  58. /**
  59. * 上一个落脚点生成时间
  60. */
  61. _this.STime = 0;
  62. /**
  63. * 当前落脚点生成时间
  64. */
  65. _this.ETime = 0;
  66. /** Left*/
  67. _this.LkeyDown = false;
  68. /** Right*/
  69. _this.RkeyDown = false;
  70. /**the loght FootHolder F */
  71. _this.lightF = false;
  72. _this.moveFalg = "";
  73. _this.USERINFO = {
  74. userId: "",
  75. score: 0,
  76. };
  77. return _this;
  78. }
  79. MainScene.prototype.onLoad = function () {
  80. var time = cc.sys.localStorage.getItem("hfsj");
  81. if (time == null || time == undefined || time == "") {
  82. cc.sys.localStorage.setItem("hfsj", "99");
  83. }
  84. this.LifeDing.zIndex = 10;
  85. this.FHolderNode.zIndex = 9;
  86. Global_1.default.instance.setMN(this.node);
  87. this.STime = Date.now();
  88. var FHolder = cc.instantiate(this.GD);
  89. this.FHolderNode.addChild(FHolder, 10, "GD");
  90. FHolder.getComponent("GD").init(this, 1);
  91. FHolder.y = -150;
  92. var FHolder2 = cc.instantiate(this.lvdai);
  93. this.FHolderNode.addChild(FHolder2, 10, "lvdai");
  94. FHolder2.getComponent("lvdai").init(this);
  95. FHolder2.y = -300;
  96. // let FHolder2 = cc.instantiate(this.tanhuang);
  97. // this.FHolderNode.addChild(FHolder2,10,"tanhuang");
  98. // FHolder2.getComponent("tanhuang").init(this);
  99. // FHolder2.y = -300;
  100. var FHolder3 = cc.instantiate(this.GD);
  101. this.FHolderNode.addChild(FHolder3, 10, "GD");
  102. FHolder3.getComponent("GD").init(this, 1);
  103. FHolder3.y = -450;
  104. // this.Player.active = false;
  105. this.Player.x = FHolder.x;
  106. // this.Player.y = FHolder.y+60;
  107. this.Player.zIndex = 11;
  108. for (var i = 0; i < this.LifeDing.children.length; i++) {
  109. if (this.LifeDing.children[i].name == "lifeBG") {
  110. if (!this.LifeDing.children[i].active) {
  111. this.LifeDing.children[i].active = true;
  112. }
  113. Global_1.default.instance.reLife.push(this.LifeDing.children[i]);
  114. }
  115. }
  116. cc.director.getCollisionManager().enabled = true;
  117. // cc.director.getCollisionManager().enabledDebugDraw = true;
  118. cc.director.getCollisionManager().enabledDrawBoundingBox = false;
  119. };
  120. MainScene.prototype.playtansound = function () {
  121. if (Global_1.default.instance.OverFlag == false) {
  122. cc.loader.loadRes("tan", cc.AudioClip, function (err, clip) {
  123. var audioID = cc.audioEngine.play(clip, false, 0.5);
  124. });
  125. }
  126. };
  127. MainScene.prototype.playdeadsound = function () {
  128. cc.loader.loadRes("dead", cc.AudioClip, function (err, clip) {
  129. var audioID = cc.audioEngine.play(clip, false, 0.5);
  130. });
  131. };
  132. MainScene.prototype.start = function () {
  133. };
  134. MainScene.prototype.update = function (dt) {
  135. // console.log(Global.instance.CollisionFlag);
  136. this.MoveBg();
  137. Global_1.default.instance.moveSpeed = 1;
  138. var FHolder;
  139. if ((this.ETime - this.STime) > (1200 - (180 * (Global_1.default.instance.FHFallSpeed - 2)))) { //控制落脚点之间的间距,间距144px
  140. this.STime = Date.now();
  141. if (!Global_1.default.instance.OverFlag) {
  142. FHolder = this.FootHoldGenerator(null);
  143. // this.Score();
  144. }
  145. }
  146. this.FHolder();
  147. this.reduceLife();
  148. if (Global_1.default.instance.CollisionFlag) { //左右传送带减速
  149. switch (Global_1.default.instance.KIND_FootHold) {
  150. case 3: {
  151. this.Player.x += 2;
  152. break;
  153. }
  154. case 4: {
  155. this.Player.x -= 2;
  156. break;
  157. }
  158. case 7: {
  159. if (Global_1.default.instance.LorR == 1) {
  160. this.Player.x--;
  161. }
  162. else {
  163. this.Player.x++;
  164. }
  165. break;
  166. }
  167. default: {
  168. break;
  169. }
  170. }
  171. }
  172. if (this.Player.x < -180) {
  173. this.Player.x = -180;
  174. }
  175. if (this.Player.x > 180) {
  176. this.Player.x = 180;
  177. }
  178. if (this.Player.y < (-510)) {
  179. for (var i = 0; i < this.LifeDing.children.length; i++) {
  180. if (this.LifeDing.children[i].name == "lifeBG") {
  181. this.LifeDing.children[i].active = false;
  182. }
  183. }
  184. this.gameOver();
  185. }
  186. if (Global_1.default.instance.reLife.length == 0) {
  187. this.gameOver();
  188. }
  189. this.ETime = Date.now();
  190. var AllChildren = new Array();
  191. var GDChildren = new Array();
  192. AllChildren = this.node.getChildByName("BgNode").getChildByName("FHolder").children;
  193. for (var i = 0; i < AllChildren.length; i++) {
  194. if (AllChildren[i].name == "GD") {
  195. GDChildren.push(AllChildren[i]);
  196. }
  197. }
  198. // cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN,this.onKeyDown,this);
  199. //cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP,this.onKeyUp,this);
  200. this.Listener();
  201. };
  202. MainScene.prototype.Listener = function () {
  203. var _this = this;
  204. var btnClickArr = new Array(2);
  205. if (!this.LkeyDown) {
  206. this.RIGHT.node.on(cc.Node.EventType.TOUCH_START, this.BtnTurnRight, this);
  207. this.RIGHT.node.on(cc.Node.EventType.TOUCH_MOVE, this.BtnTurnRight, this);
  208. this.RIGHT.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onKeyUp, this);
  209. btnClickArr.push(this.RIGHT);
  210. this.RIGHT.node.on(cc.Node.EventType.TOUCH_END, function () {
  211. _this.onKeyUp;
  212. }, this);
  213. }
  214. else {
  215. this.RIGHT.node.off(cc.Node.EventType.TOUCH_START, this.BtnTurnRight, this);
  216. this.RIGHT.node.off(cc.Node.EventType.TOUCH_MOVE, this.BtnTurnRight, this);
  217. this.RIGHT.node.off(cc.Node.EventType.TOUCH_CANCEL, this.onKeyUp, this);
  218. this.RIGHT.node.off(cc.Node.EventType.TOUCH_END, function () {
  219. _this.onKeyUp;
  220. }, this);
  221. }
  222. if (!this.RkeyDown) {
  223. this.LEFT.node.on(cc.Node.EventType.TOUCH_START, this.BtnTurnLeft, this);
  224. this.LEFT.node.on(cc.Node.EventType.TOUCH_MOVE, this.BtnTurnLeft, this);
  225. this.LEFT.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onKeyUp, this);
  226. // btnClickArr.push(this.LEFT);
  227. this.LEFT.node.on(cc.Node.EventType.TOUCH_END, function () {
  228. _this.onKeyUp;
  229. }, this);
  230. }
  231. else {
  232. this.LEFT.node.off(cc.Node.EventType.TOUCH_START, this.BtnTurnLeft, this);
  233. this.LEFT.node.off(cc.Node.EventType.TOUCH_MOVE, this.BtnTurnLeft, this);
  234. this.LEFT.node.off(cc.Node.EventType.TOUCH_CANCEL, this.onKeyUp, this);
  235. this.LEFT.node.off(cc.Node.EventType.TOUCH_END, function () {
  236. _this.onKeyUp;
  237. }, this);
  238. }
  239. };
  240. MainScene.prototype.StopAni = function (self) {
  241. if (!Global_1.default.instance.AniFalg) {
  242. var FHolder = self.node.getChildByName("BgNode").getChildByName("FHolder").children;
  243. var Fname = void 0;
  244. for (var i = 0; FHolder.length; i++) {
  245. if (i == FHolder.length - 1) {
  246. Global_1.default.instance.AniFalg = true;
  247. return;
  248. }
  249. Fname = FHolder[i].name;
  250. FHolder[i].getComponent(Fname).enabled = false;
  251. }
  252. }
  253. };
  254. /**
  255. * player 移出落脚点
  256. */
  257. MainScene.prototype.FHolder = function () {
  258. var self = this;
  259. var FHArray = this.FHolderNode.children;
  260. var Ani; //the Animation of Player when player fall down
  261. var Anistate; //the state of Ani;
  262. for (var i = FHArray.length - 1; i >= 0; i--) {
  263. if (FHArray[i].isHold) {
  264. // let nameNode:string = FHArray[i].name;
  265. if (self.Player.x > (FHArray[i].x + 75)) {
  266. Global_1.default.instance.CollisionFlag = false;
  267. FHArray[i].isHold = false;
  268. // this.Score();
  269. }
  270. else if (self.Player.x < (FHArray[i].x - 75)) {
  271. Global_1.default.instance.CollisionFlag = false;
  272. FHArray[i].isHold = false;
  273. // this.Score();
  274. }
  275. else {
  276. Global_1.default.instance.CollisionFlag = true;
  277. FHArray[i].isHold = true;
  278. }
  279. }
  280. }
  281. };
  282. /**
  283. * 移动背景,初始移动速度200px/s
  284. */
  285. MainScene.prototype.MoveBg = function () {
  286. var Bg0 = this.Bg.getChildByName("Bg_0");
  287. var Bg1 = this.Bg.getChildByName("Bg_1");
  288. if (Global_1.default.instance.OverFlag) {
  289. }
  290. else {
  291. Bg0.y += Global_1.default.instance.FHFallSpeed + 1;
  292. Bg1.y += Global_1.default.instance.FHFallSpeed + 1;
  293. if (Bg0.y > 946) {
  294. Bg0.y = -946;
  295. }
  296. if (Bg1.y > 946) {
  297. Bg1.y = -946;
  298. }
  299. }
  300. };
  301. /**
  302. * 生成落脚点
  303. */
  304. MainScene.prototype.FootHoldGenerator = function (rtpe) {
  305. var self = this;
  306. var Magnification = 0;
  307. var f = parseInt(self.LifeDing.getChildByName("Floor").getComponent(cc.Label).string);
  308. if (f < 20) {
  309. Magnification = 2;
  310. }
  311. else if (f < 40) {
  312. Magnification = 4;
  313. }
  314. else if (f < 60) {
  315. Magnification = 6;
  316. }
  317. else if (f < 80) {
  318. Magnification = 8;
  319. }
  320. else {
  321. Magnification = 8;
  322. }
  323. var KindHolder = Math.ceil(Math.random() * Magnification);
  324. // KindHolder = 7;
  325. var FHolder;
  326. // KindHolder = Math.ceil(Math.random()*7);
  327. if (KindHolder == 3 || KindHolder == 4) {
  328. var va = Math.random() * 10;
  329. if (va >= 1 && va < 4) {
  330. KindHolder = 7;
  331. }
  332. else if (va >= 4 && va < 10) {
  333. KindHolder = 5;
  334. }
  335. //KindHolder = 5;
  336. console.log("KindHolder gb: " + KindHolder);
  337. }
  338. if (rtpe != null) {
  339. KindHolder = rtpe;
  340. console.log("KindHolder gb2: " + KindHolder);
  341. }
  342. this.ETime = Date.now();
  343. switch (KindHolder) {
  344. case 1: {
  345. FHolder = cc.instantiate(self.GD);
  346. self.FHolderNode.addChild(FHolder, 5, "GD");
  347. FHolder.getComponent("GD").init(self, 1);
  348. FHolder.isHold = false;
  349. // console.log("产生第一种落脚点");
  350. break;
  351. }
  352. case 2: {
  353. FHolder = cc.instantiate(self.GD);
  354. self.FHolderNode.addChild(FHolder, 5, "GD");
  355. FHolder.getComponent("GD").init(self, 7);
  356. FHolder.isHold = false;
  357. /*self.FootHoldGenerator();
  358. FHolder = cc.instantiate(self.tanhuang);
  359. self.FHolderNode.addChild(FHolder,5,"tanhuang");
  360. FHolder.getComponent("tanhuang").init(self);
  361. FHolder.isHold = false;
  362. // // console.log("产生第五种落脚点");
  363. // break;*/
  364. break;
  365. }
  366. case 3: {
  367. FHolder = cc.instantiate(self.lvdai);
  368. self.FHolderNode.addChild(FHolder, 5, "lvdai");
  369. FHolder.getComponent("lvdai").init(self);
  370. FHolder.isHold = false;
  371. // console.log("产生第二种落脚点");
  372. console.log(" 创建滚动 ");
  373. break;
  374. }
  375. case 4: {
  376. FHolder = cc.instantiate(self.lvdai);
  377. self.FHolderNode.addChild(FHolder, 5, "lvdai");
  378. FHolder.getComponent("lvdai").init(self);
  379. FHolder.isHold = false;
  380. // console.log("产生第五种落脚点");
  381. console.log(" 创建滚动1 ");
  382. break;
  383. }
  384. case 5: {
  385. FHolder = cc.instantiate(self.boli);
  386. self.FHolderNode.addChild(FHolder, 5, "boli");
  387. FHolder.getComponent("boli").init(self);
  388. FHolder.isHold = false;
  389. // console.log("产生第三种落脚点");
  390. break;
  391. }
  392. case 6: {
  393. FHolder = cc.instantiate(self.dici);
  394. self.FHolderNode.addChild(FHolder, 5, "dici");
  395. FHolder.getComponent("dici").init(self);
  396. FHolder.isHold = false;
  397. // console.log("产生第四种落脚点");
  398. break;
  399. }
  400. case 7: {
  401. FHolder = cc.instantiate(self.GD);
  402. self.FHolderNode.addChild(FHolder, 5, "GD");
  403. FHolder.getComponent("GD").init(self, 7);
  404. FHolder.isHold = false;
  405. break;
  406. }
  407. case 8: {
  408. if (self.lightF) {
  409. self.lightF = false;
  410. self.FootHoldGenerator(null);
  411. break;
  412. }
  413. FHolder = cc.instantiate(self.shandian);
  414. self.FHolderNode.addChild(FHolder, 5, "shandian");
  415. FHolder.getComponent("shandian").init(self);
  416. FHolder.isHold = false;
  417. self.lightF = true;
  418. break;
  419. }
  420. // default:{
  421. // FHolder = cc.instantiate(self.GD);
  422. // self.FHolderNode.addChild(FHolder,5,"GD");
  423. // FHolder.getComponent("GD").init(self);
  424. // FHolder.getComponent("GD").enabled = true;
  425. // FHolder.getComponent("MoveGD").init(self);
  426. // FHolder.getComponent("MoveGD").enabled = false;
  427. // FHolder.isHold = false;
  428. // // console.log("默认产生第一种落脚点");
  429. // }
  430. // break;
  431. }
  432. return FHolder;
  433. };
  434. /**
  435. * 按钮触发,向左,长按事件
  436. */
  437. MainScene.prototype.BtnTurnLeft = function (event) {
  438. var self = this;
  439. if (self.RkeyDown) {
  440. return;
  441. }
  442. else {
  443. self.LkeyDown = true;
  444. self.RkeyDown = false;
  445. this.BtnLorR(event);
  446. }
  447. };
  448. /**
  449. * 按钮触发,向右,长按事件,长按响应未解决
  450. */
  451. MainScene.prototype.BtnTurnRight = function (event) {
  452. var self = this;
  453. if (self.LkeyDown) {
  454. return;
  455. }
  456. else {
  457. self.LkeyDown = false;
  458. self.RkeyDown = true;
  459. this.BtnLorR(event);
  460. }
  461. };
  462. /**
  463. * btn触发事件
  464. * @param event 按钮触发事件
  465. */
  466. MainScene.prototype.BtnLorR = function (event) {
  467. var self = this;
  468. Global_1.default.instance.moveSpeed = 1;
  469. var schedule = cc.director.getScheduler();
  470. var stand = self.Player.getChildByName("stand");
  471. var runRight = self.Player.getChildByName("runRight");
  472. var run = self.Player.getChildByName("run");
  473. var Ani; //the animation of player
  474. var Anistate; //the Ani's state
  475. var Anistring; //the name of Ani
  476. var moveByTime = 1;
  477. var scheduleState = false; //the schedule's state
  478. var schedulePause = true;
  479. var target = null; //the target which is binged to schedule
  480. var moveByDes = Global_1.default.instance.moveSpeed * 120 + 40;
  481. if (self.LkeyDown) {
  482. target = self.LEFT;
  483. moveByTime = 1;
  484. moveByDes = -moveByDes;
  485. scheduleState = schedule.isScheduled(func, target);
  486. // self.output.getComponent(cc.Label).string = Anistring;
  487. schedulePause = schedule.isTargetPaused(target);
  488. Ani = run.getComponent(cc.Animation);
  489. Anistring = "run";
  490. stand.active = false;
  491. runRight.active = false;
  492. run.active = true;
  493. // self.output.getComponent(cc.Label).string = Anistring;
  494. if (!Global_1.default.instance.CollisionFlag) {
  495. moveByTime = 1;
  496. }
  497. else {
  498. switch (Global_1.default.instance.KIND_FootHold) {
  499. case 2: {
  500. moveByTime = 4.1;
  501. self.output.getComponent(cc.Label).string = Global_1.default.instance.KIND_FootHold + "2";
  502. break;
  503. }
  504. case 5: {
  505. moveByTime = 3.9;
  506. // self.output.getComponent(cc.Label).string = Global.instance.KIND_FootHold+"5";
  507. break;
  508. }
  509. }
  510. ;
  511. }
  512. }
  513. if (self.RkeyDown) {
  514. target = self.RIGHT;
  515. moveByTime = 1;
  516. moveByDes = moveByDes;
  517. scheduleState = schedule.isScheduled(func, target);
  518. // self.output.getComponent(cc.Label).string = Anistring;
  519. schedulePause = schedule.isTargetPaused(target);
  520. Ani = runRight.getComponent(cc.Animation);
  521. Anistring = "runR";
  522. stand.active = false;
  523. runRight.active = true;
  524. run.active = false;
  525. // self.output.getComponent(cc.Label).string = Anistring;
  526. if (!Global_1.default.instance.CollisionFlag) {
  527. moveByTime = 1;
  528. }
  529. else {
  530. switch (Global_1.default.instance.KIND_FootHold) {
  531. case 2: {
  532. moveByTime = 4.1;
  533. // self.output.getComponent(cc.Label).string = Global.instance.KIND_FootHold+"2";
  534. break;
  535. }
  536. case 5: {
  537. moveByTime = 3.9;
  538. // self.output.getComponent(cc.Label).string = Global.instance.KIND_FootHold+"5";
  539. break;
  540. }
  541. }
  542. ;
  543. }
  544. }
  545. var funcFlag = false;
  546. switch (event.type) {
  547. case "touchstart": {
  548. if (!(self.moveFalg.length == 0)) {
  549. break;
  550. }
  551. self.moveFalg = "touchstart";
  552. if (!scheduleState) {
  553. // self.output.getComponent(cc.Label).string = movefalg;
  554. schedule.schedule(func, target, 0);
  555. }
  556. ;
  557. if (schedulePause) {
  558. schedule.resumeTarget(target);
  559. }
  560. ;
  561. break;
  562. }
  563. case "touchmove": {
  564. if (!(self.moveFalg.length == 0)) {
  565. break;
  566. }
  567. self.moveFalg = "touchmove";
  568. // self.output.getComponent(cc.Label).string = movefalg;
  569. if (!scheduleState) {
  570. schedule.schedule(func, target, 0);
  571. }
  572. ;
  573. if (schedulePause) {
  574. schedule.resumeTarget(target);
  575. }
  576. ;
  577. break;
  578. }
  579. case "touchcancel": {
  580. break;
  581. }
  582. case "touchend": {
  583. // self.output.getComponent(cc.Label).string = "touchend";
  584. schedule.pauseTarget(target);
  585. self.Player.stopAllActions();
  586. Ani.stop(Anistring);
  587. moveByTime = 1;
  588. moveByDes = Global_1.default.instance.moveSpeed * 120 + 40;
  589. switch (Anistring) {
  590. case "run": {
  591. run.active = false;
  592. runRight.active = false;
  593. stand.active = true;
  594. self.LkeyDown = false;
  595. self.RkeyDown = false;
  596. moveByDes = Global_1.default.instance.moveSpeed / 2;
  597. break;
  598. }
  599. case "runR": {
  600. run.active = false;
  601. runRight.active = false;
  602. stand.active = true;
  603. self.LkeyDown = false;
  604. self.RkeyDown = false;
  605. moveByDes = Global_1.default.instance.moveSpeed / 2;
  606. break;
  607. }
  608. }
  609. funcFlag = false;
  610. self.moveFalg = "";
  611. break;
  612. }
  613. }
  614. function func() {
  615. if (funcFlag) {
  616. return;
  617. }
  618. if (Global_1.default.instance.CollisionFlag) {
  619. moveByTime = 1;
  620. }
  621. var spawn = cc.spawn(cc.callFunc(function () {
  622. self.Player.runAction(cc.moveBy(moveByTime, moveByDes, 0));
  623. }), cc.callFunc(function () {
  624. Anistate = Ani.play(Anistring);
  625. Anistate.speed = 1;
  626. Anistate.repeatCount = 100;
  627. Anistate = Ani.playAdditive(Anistring);
  628. }));
  629. self.Player.runAction(spawn);
  630. funcFlag = true;
  631. }
  632. };
  633. /**
  634. * 返回键监听
  635. * @param event 按下返回键退出游戏
  636. */
  637. MainScene.prototype.AniPlayer = function (Ani, Anistate, moveByTime, moveByDes, Key, AniName, self) {
  638. Ani = Key.getComponent(cc.Animation);
  639. var spawn = cc.spawn(cc.callFunc(function () {
  640. self.Player.runAction(cc.moveBy(moveByTime, moveByDes, 0));
  641. }), cc.callFunc(function () {
  642. Anistate = Ani.play(AniName);
  643. Anistate.speed = 2;
  644. Anistate.repeatCount = 100;
  645. }));
  646. self.Player.runAction(spawn);
  647. if (!Ani.state) {
  648. var spawn2 = cc.spawn(cc.callFunc(function () {
  649. self.Player.runAction(cc.moveBy(moveByTime, moveByDes, 0));
  650. }), cc.callFunc(function () {
  651. Anistate = Ani.play(AniName);
  652. Anistate.speed = 2;
  653. Anistate.repeatCount = 100;
  654. }));
  655. self.Player.runAction(spawn2);
  656. }
  657. };
  658. /**
  659. * 抬起动画停止
  660. * @param event 抬起左右键触发
  661. */
  662. MainScene.prototype.onKeyUp = function (event) {
  663. var self = this;
  664. self.LkeyDown = false;
  665. this.RkeyDown = false;
  666. self.Player.stopAllActions();
  667. var stand = this.Player.getChildByName("stand");
  668. var runRight = this.Player.getChildByName("runRight");
  669. var run = this.Player.getChildByName("run");
  670. stand.active = true;
  671. run.active = false;
  672. runRight.active = false;
  673. };
  674. /**
  675. * gameover
  676. */
  677. MainScene.prototype.gameOver = function () {
  678. var self = this;
  679. self.Player.stopAllActions();
  680. Global_1.default.instance.CollisionFlag = false;
  681. // self.Player.getComponent(cc.BoxCollider).enabled = false;
  682. self.Player.getComponent("Playcontroler").enabled = false;
  683. try {
  684. self.Player.getComponent(cc.Animation).stop();
  685. }
  686. catch (error) {
  687. self.node.getChildByName("output").getComponent(cc.Label).string = error;
  688. }
  689. self.Player.getChildByName("stand").active = true;
  690. self.Player.getChildByName("runRight").active = false;
  691. self.Player.getChildByName("run").active = false;
  692. self.Player.y -= Global_1.default.instance.InitSpeed;
  693. var AllFH = self.node.getChildByName("BgNode").getChildByName("FHolder").children;
  694. for (var i = 0; i < AllFH.length; i++) {
  695. var FHNA = AllFH[i].name;
  696. AllFH[i].getComponent(FHNA).enabled = false;
  697. AllFH[i].isHold = false;
  698. if (FHNA == "GD") {
  699. AllFH[i].getChildByName("gd").getComponent("CliGD").enabled = false;
  700. }
  701. }
  702. self.StopAni(self);
  703. var failure;
  704. var Ani;
  705. var Anistate;
  706. var BestScore;
  707. var thisScore;
  708. var lessScore;
  709. var Score;
  710. // let fuhuo;
  711. var FAni;
  712. var FAnistate;
  713. self.LEFT.node.active = false;
  714. self.RIGHT.node.active = false;
  715. failure = cc.instantiate(self.failure);
  716. // fuhuo = cc.instantiate(self.fuhuo);
  717. // let fhuoBtnRank = fuhuo.getChildByName("cd").getChildByName("RankScene").getComponent(cc.Button);
  718. var fhuoBtnreGame = failure.getChildByName("reset").getComponent(cc.Button);
  719. // let fhuoBtnreGame = fuhuo.getChildByName("zl").getChildByName("rePlay").getComponent(cc.Button);
  720. // let fhuoBtnFhuo = fuhuo.getChildByName("fh").getChildByName("rePlay").getComponent(cc.Button);
  721. var RankEventHandler = new cc.Component.EventHandler();
  722. var reGameEventHandler = new cc.Component.EventHandler();
  723. var FhuoEventHandler = new cc.Component.EventHandler();
  724. //open the ranking
  725. // RankEventHandler.target = self.node;
  726. // RankEventHandler.component = "MainScene";
  727. // RankEventHandler.handler = "FBtnCB_Rank";
  728. // RankEventHandler.customEventData = null;
  729. // fhuoBtnRank.clickEvents.push(RankEventHandler);
  730. //replay
  731. reGameEventHandler.target = self.node;
  732. reGameEventHandler.component = "MainScene";
  733. reGameEventHandler.handler = "restart";
  734. reGameEventHandler.customEventData = null;
  735. fhuoBtnreGame.clickEvents.push(reGameEventHandler);
  736. //fh立即复活会有其他功能暂时用重新开始代替
  737. // FhuoEventHandler.target = self.node;
  738. // FhuoEventHandler.component = "MainScene";
  739. // FhuoEventHandler.handler = "FBtnCB_rePlay";
  740. // FhuoEventHandler.customEventData = null;
  741. // fhuoBtnFhuo.clickEvents.push(FhuoEventHandler);
  742. if (!Global_1.default.instance.OverFlag) {
  743. Global_1.default.instance.OverFlag = true;
  744. self.StoregeScore();
  745. // self.UpdateScore();
  746. failure.y = -20;
  747. // fuhuo.y = 0;
  748. thisScore = parseInt(self.LifeDing.getChildByName("Floor").getComponent(cc.Label).string);
  749. // lessScore = failure.getChildByName("jl").getChildByName("LessScore");
  750. BestScore = Global_1.default.instance.getLocalScore().BestScore;
  751. Global_1.default.instance.GetUSer().score = BestScore;
  752. self.UpLoadScore();
  753. if (BestScore - thisScore <= 0) {
  754. failure.getChildByName("jl").active = false;
  755. }
  756. else {
  757. // lessScore.getComponent(cc.Label).string = (BestScore - thisScore).toString();
  758. }
  759. Score = failure.getChildByName("cj").getChildByName("Score");
  760. self.node.addChild(failure);
  761. // self.node.addChild(fuhuo);
  762. Score.getComponent(cc.Label).string = self.LifeDing.getChildByName("Floor").getComponent(cc.Label).string;
  763. // Ani = failure.getComponent(cc.Animation);//the animation of failure;
  764. // // FAni = fuhuo.getComponent(cc.Animation);
  765. // Anistate = Ani.play("shibai");//the state of Ani;
  766. // Anistate.speed = 1;
  767. // Anistate.repeatCount = 1;
  768. }
  769. else {
  770. return;
  771. }
  772. self.playdeadsound();
  773. console.log("游戏结束!!!");
  774. };
  775. /**
  776. * 复活按钮的回调函数:打开排行榜
  777. */
  778. MainScene.prototype.FBtnCB_Rank = function (self) {
  779. this.destroy();
  780. cc.director.loadScene("EndScene");
  781. };
  782. /**
  783. * 复活按钮的回调函数:立即复活
  784. */
  785. MainScene.prototype.FBtnCB_rePlay = function () {
  786. cc.sys.localStorage.setItem("hfsj", "99");
  787. var self = this;
  788. Global_1.default.instance.OverFlag = false;
  789. Global_1.default.instance.AniFalg = false;
  790. Global_1.default.instance.LorR = 0;
  791. Global_1.default.instance.InitSpeed = 8.5;
  792. Global_1.default.instance.moveSpeed = 1;
  793. // Global.instance.FHFallSpeed = 2;
  794. Global_1.default.instance.CollisionFlag = false;
  795. Global_1.default.instance.CollisionWithDing = false;
  796. Global_1.default.instance.TheHolder = null;
  797. Global_1.default.instance.KIND_FootHold = 0;
  798. // this.RIGHT.node.off(cc.Node.EventType.TOUCH_START,this.BtnTurnRight,this);
  799. // this.RIGHT.node.off(cc.Node.EventType.TOUCH_MOVE,this.BtnTurnRight,this);
  800. // this.RIGHT.node.off(cc.Node.EventType.TOUCH_CANCEL,this.onKeyUp,this);
  801. this.LEFT.node.active = true;
  802. this.RIGHT.node.active = true;
  803. this.LkeyDown = false;
  804. this.RkeyDown = false;
  805. this.moveFalg = "";
  806. this.Player.y = 300;
  807. this.Player.x = 0;
  808. this.Player.getComponent("Playcontroler").enabled = true;
  809. this.Player.getComponent(cc.BoxCollider).enabled = true;
  810. var AllFH = this.node.getChildByName("BgNode").getChildByName("FHolder").children;
  811. this.node.getChildByName("SB").destroy();
  812. this.node.getChildByName("fuhuo1").destroy();
  813. for (var i = 0; i < this.LifeDing.children.length; i++) {
  814. //for(let i=0;i<2;i++){
  815. if (this.LifeDing.children[i].name == "lifeBG") {
  816. if (!this.LifeDing.children[i].active) {
  817. this.LifeDing.children[i].active = true;
  818. }
  819. Global_1.default.instance.reLife.push(this.LifeDing.children[i]);
  820. }
  821. }
  822. this.Player.getComponent(cc.BoxCollider).enabled = false;
  823. for (var i = 0; i < AllFH.length; i++) {
  824. AllFH[i].destroy();
  825. }
  826. var F = this.FootHoldGenerator(1);
  827. F.y = -380;
  828. this.scheduleOnce(function () {
  829. self.Player.getComponent(cc.BoxCollider).enabled = true;
  830. }, 0.5);
  831. };
  832. /**
  833. * restart
  834. */
  835. MainScene.prototype.restart = function () {
  836. this.destroy();
  837. cc.director.loadScene("MainScene");
  838. cc.director.resume();
  839. Global_1.default.instance.OverFlag = false;
  840. Global_1.default.instance.AniFalg = false;
  841. Global_1.default.instance.LorR = 0;
  842. Global_1.default.instance.InitSpeed = 8.5;
  843. Global_1.default.instance.moveSpeed = 1;
  844. Global_1.default.instance.FHFallSpeed = 2;
  845. Global_1.default.instance.CollisionFlag = false;
  846. Global_1.default.instance.CollisionWithDing = false;
  847. Global_1.default.instance.TheHolder = null;
  848. Global_1.default.instance.KIND_FootHold = 0;
  849. // this.RIGHT.node.off(cc.Node.EventType.TOUCH_START,this.BtnTurnRight,this);
  850. // this.RIGHT.node.off(cc.Node.EventType.TOUCH_MOVE,this.BtnTurnRight,this);
  851. // this.RIGHT.node.off(cc.Node.EventType.TOUCH_CANCEL,this.onKeyUp,this);
  852. this.LEFT.node.active = true;
  853. this.RIGHT.node.active = true;
  854. this.LkeyDown = false;
  855. this.RkeyDown = false;
  856. // this.moveFalg = "";
  857. this.Player.y = 300;
  858. // this.Score();
  859. };
  860. /**
  861. * 受到伤害,命数减一
  862. */
  863. MainScene.prototype.reduceLife = function () {
  864. var self = this;
  865. var Ls = new Array();
  866. var reLCount = 0;
  867. var FHolder = self.node.getChildByName("BgNode").getChildByName("FHolder").children;
  868. for (var i = 0; i < FHolder.length; i++) {
  869. if (FHolder[i].isHold) {
  870. if (!Global_1.default.instance.CollisionFlag) {
  871. FHolder[i].isHold = false;
  872. var box = FHolder[i].getComponent(cc.BoxCollider);
  873. box.enabled = false;
  874. }
  875. }
  876. }
  877. //
  878. for (var i = self.LifeDing.children.length - 1; i >= 0; i--) {
  879. if (self.LifeDing.children[i].name == "lifeBG") {
  880. if (Global_1.default.instance.Injured || Global_1.default.instance.CollisionWithDing) {
  881. if (self.LifeDing.children[i].active) {
  882. self.LifeDing.children[i].active = false;
  883. Global_1.default.instance.Injured = false;
  884. Global_1.default.instance.CollisionFlag = false;
  885. Global_1.default.instance.CollisionWithDing = false;
  886. }
  887. }
  888. Ls.push(self.LifeDing.children[i]);
  889. }
  890. }
  891. Global_1.default.instance.reLife = [];
  892. for (var i = 0; i < Ls.length; i++) {
  893. if (Ls[i].active) {
  894. Global_1.default.instance.reLife.push(Ls[i]); //player剩余的命数
  895. }
  896. }
  897. //
  898. var time = cc.sys.localStorage.getItem("hfsj");
  899. //console.log( time + "当前血 : " + Global.instance.reLife.length);
  900. if (Global_1.default.instance.reLife.length < 3) {
  901. if (time == 99) {
  902. var time_1 = Math.floor(Date.now() / 1000);
  903. cc.sys.localStorage.setItem("hfsj", time_1);
  904. }
  905. else {
  906. var time_2 = Math.floor(Date.now() / 1000);
  907. var timlod = parseInt(cc.sys.localStorage.getItem("hfsj"));
  908. var sub = time_2 - timlod;
  909. if (sub >= 20) {
  910. var sizes = Global_1.default.instance.reLife.length + 2;
  911. Global_1.default.instance.reLife = [];
  912. for (var i = 0; i < sizes; i++) {
  913. if (this.LifeDing.children[i].name == "lifeBG") {
  914. if (!this.LifeDing.children[i].active) {
  915. this.LifeDing.children[i].active = true;
  916. }
  917. Global_1.default.instance.reLife.push(this.LifeDing.children[i]);
  918. // console.log("push --------------" + i);
  919. }
  920. }
  921. cc.sys.localStorage.setItem("hfsj", time_2);
  922. // console.log(sizes + "恢复血+1---------------------------------------" + Global.instance.reLife.length);
  923. }
  924. }
  925. }
  926. else {
  927. cc.sys.localStorage.setItem("hfsj", "99");
  928. }
  929. };
  930. /**
  931. * 每下落一层,分数加一。
  932. */
  933. MainScene.prototype.Score = function () {
  934. var self = this.node;
  935. var scLabel = this.LifeDing.getChildByName("Floor").getComponent(cc.Label);
  936. var sc = parseInt(scLabel.string);
  937. if (!Global_1.default.instance.OverFlag) {
  938. sc = sc + 1;
  939. }
  940. this.playtansound();
  941. console.log("打印一下");
  942. scLabel.string = sc.toString();
  943. var lv = Math.ceil(sc / 50);
  944. if (lv > Global_1.default.instance.LevelAddFlag) {
  945. Global_1.default.instance.LevelAddFlag = lv;
  946. Global_1.default.instance.InitSpeed += 0.25; //每下落50层,player下落速度加0.25
  947. Global_1.default.instance.FHFallSpeed += 1; //没下落50层,落脚点下落速度加快0.5.
  948. }
  949. };
  950. /**
  951. * 本地分数存储
  952. */
  953. MainScene.prototype.StoregeScore = function () {
  954. var self = this;
  955. var localS = Global_1.default.instance.getLocalScore(); //the temp of local score;
  956. var CurrentScore = parseInt(this.LifeDing.getChildByName("Floor").getComponent(cc.Label).string);
  957. Global_1.default.instance.getLocalScore().CurrentScore = CurrentScore;
  958. if (CurrentScore > localS.ThirdScore) {
  959. if (CurrentScore > localS.SecondScore) {
  960. if (CurrentScore > localS.BestScore) {
  961. localS.BestScore = CurrentScore;
  962. return;
  963. }
  964. localS.SecondScore = CurrentScore;
  965. }
  966. localS.ThirdScore = CurrentScore;
  967. }
  968. };
  969. /**
  970. * upload the best score
  971. */
  972. MainScene.prototype.UpLoadScore = function () {
  973. var self = this;
  974. var tmp = Global_1.default.instance.GetUSer();
  975. /* Http.sendRequest("/updateScore",tmp,function(msg){
  976. let x = msg;
  977. if(msg.code!=0){
  978. Global.instance.NetStatus = false;
  979. }
  980. let ux = {
  981. userId:'',
  982. }
  983. console.log(x);
  984. ux.userId = Global.instance.GetUSer().userId;
  985. Http.sendRequest("/rank",ux,function(mmsg){
  986. console.log("------------------3");
  987. let MM = JSON.parse(mmsg.msg);
  988. console.log(MM);
  989. if(Global.instance.GetR()==null||Global.instance.GetR().rank==undefined||Global.instance.GetR().rank<MM.my.rank){
  990. Global.instance.SetR(MM.my.rank);
  991. Global.instance.setRemoteScore(MM.other);
  992. }
  993. });
  994. });*/
  995. };
  996. __decorate([
  997. property(cc.Prefab)
  998. ], MainScene.prototype, "boli", void 0);
  999. __decorate([
  1000. property(cc.Prefab)
  1001. ], MainScene.prototype, "dici", void 0);
  1002. __decorate([
  1003. property(cc.Prefab)
  1004. ], MainScene.prototype, "lvdai", void 0);
  1005. __decorate([
  1006. property(cc.Prefab)
  1007. ], MainScene.prototype, "shandian", void 0);
  1008. __decorate([
  1009. property(cc.Prefab)
  1010. ], MainScene.prototype, "tanhuang", void 0);
  1011. __decorate([
  1012. property(cc.Prefab)
  1013. ], MainScene.prototype, "Opplvdai", void 0);
  1014. __decorate([
  1015. property(cc.Prefab)
  1016. ], MainScene.prototype, "GD", void 0);
  1017. __decorate([
  1018. property(cc.Prefab)
  1019. ], MainScene.prototype, "failure", void 0);
  1020. __decorate([
  1021. property(cc.Prefab)
  1022. ], MainScene.prototype, "fuhuo", void 0);
  1023. __decorate([
  1024. property(cc.Node)
  1025. ], MainScene.prototype, "Player", void 0);
  1026. __decorate([
  1027. property(cc.Node)
  1028. ], MainScene.prototype, "FHolderNode", void 0);
  1029. __decorate([
  1030. property(cc.Node)
  1031. ], MainScene.prototype, "Bg", void 0);
  1032. __decorate([
  1033. property(cc.Node)
  1034. ], MainScene.prototype, "LifeDing", void 0);
  1035. __decorate([
  1036. property(cc.Button)
  1037. ], MainScene.prototype, "LEFT", void 0);
  1038. __decorate([
  1039. property(cc.Button)
  1040. ], MainScene.prototype, "RIGHT", void 0);
  1041. __decorate([
  1042. property(cc.Label)
  1043. ], MainScene.prototype, "output", void 0);
  1044. MainScene = __decorate([
  1045. ccclass
  1046. ], MainScene);
  1047. return MainScene;
  1048. }(cc.Component));
  1049. exports.default = MainScene;
  1050. cc._RF.pop();
  1051. }
  1052. if (nodeEnv) {
  1053. __define(__module.exports, __require, __module);
  1054. }
  1055. else {
  1056. __quick_compile_project__.registerModuleFunc(__filename, function () {
  1057. __define(__module.exports, __require, __module);
  1058. });
  1059. }
  1060. })();
  1061. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxNYWluU2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQTZCO0FBRXZCLElBQUEsS0FBd0IsRUFBRSxDQUFDLFVBQVUsRUFBbkMsT0FBTyxhQUFBLEVBQUUsUUFBUSxjQUFrQixDQUFDO0FBRzVDO0lBQXVDLDZCQUFZO0lBQW5EO1FBQUEscUVBMi9CQztRQXgvQkcsVUFBSSxHQUFjLElBQUksQ0FBQztRQUV2QixVQUFJLEdBQWMsSUFBSSxDQUFDO1FBRXZCLFdBQUssR0FBYyxJQUFJLENBQUM7UUFFeEIsY0FBUSxHQUFjLElBQUksQ0FBQztRQUUzQixjQUFRLEdBQWMsSUFBSSxDQUFDO1FBRTNCLGNBQVEsR0FBYyxJQUFJLENBQUM7UUFFM0IsUUFBRSxHQUFjLElBQUksQ0FBQztRQUVyQixhQUFPLEdBQWMsSUFBSSxDQUFDO1FBRTFCLFdBQUssR0FBYyxJQUFJLENBQUM7UUFHeEIsWUFBTSxHQUFZLElBQUksQ0FBQztRQUV2QixpQkFBVyxHQUFZLElBQUksQ0FBQztRQUU1QixRQUFFLEdBQVksSUFBSSxDQUFDO1FBRW5CLGNBQVEsR0FBWSxJQUFJLENBQUM7UUFHekIsVUFBSSxHQUFjLElBQUksQ0FBQztRQUV2QixXQUFLLEdBQWMsSUFBSSxDQUFDO1FBR3hCLFlBQU0sR0FBYSxJQUFJLENBQUM7UUFHeEIsd0JBQXdCO1FBQ3hCOztXQUVHO1FBQ0ssV0FBSyxHQUFHLENBQUMsQ0FBQztRQUNsQjs7V0FFRztRQUNLLFdBQUssR0FBRyxDQUFDLENBQUM7UUFFbEIsVUFBVTtRQUNGLGNBQVEsR0FBRyxLQUFLLENBQUM7UUFDekIsV0FBVztRQUNILGNBQVEsR0FBRyxLQUFLLENBQUM7UUFDekIsNEJBQTRCO1FBQ3BCLFlBQU0sR0FBRyxLQUFLLENBQUM7UUFFdkIsY0FBUSxHQUFHLEVBQUUsQ0FBQztRQUVkLGNBQVEsR0FBRztZQUNQLE1BQU0s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Z0JBQUM7Q0EzL0JELEFBMi9CQyxDQTMvQnNDLEVBQUUsQ0FBQyxTQUFTLEdBMi9CbEQ7a0JBMy9Cb0IsU0FBUyIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHbG9iYWwgZnJvbSBcIi4vR2xvYmFsXCJcclxuaW1wb3J0IEh0dHAgZnJvbSBcIi4vSHR0cFwiO1xyXG5jb25zdCB7IGNjY2xhc3MsIHByb3BlcnR5IH0gPSBjYy5fZGVjb3JhdG9yO1xyXG5cclxuQGNjY2xhc3NcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFpblNjZW5lIGV4dGVuZHMgY2MuQ29tcG9uZW50IHtcclxuXHJcbiAgICBAcHJvcGVydHkoY2MuUHJlZmFiKVxyXG4gICAgYm9saTogY2MuUHJlZmFiID0gbnVsbDtcclxuICAgIEBwcm9wZXJ0eShjYy5QcmVmYWIpXHJcbiAgICBkaWNpOiBjYy5QcmVmYWIgPSBudWxsO1xyXG4gICAgQHByb3BlcnR5KGNjLlByZWZhYilcclxuICAgIGx2ZGFpOiBjYy5QcmVmYWIgPSBudWxsO1xyXG4gICAgQHByb3BlcnR5KGNjLlByZWZhYilcclxuICAgIHNoYW5kaWFuOiBjYy5QcmVmYWIgPSBudWxsO1xyXG4gICAgQHByb3BlcnR5KGNjLlByZWZhYilcclxuICAgIHRhbmh1YW5nOiBjYy5QcmVmYWIgPSBudWxsO1xyXG4gICAgQHByb3BlcnR5KGNjLlByZWZhYilcclxuICAgIE9wcGx2ZGFpOiBjYy5QcmVmYWIgPSBudWxsO1xyXG4gICAgQHByb3BlcnR5KGNjLlByZWZhYilcclxuICAgIEdEOiBjYy5QcmVmYWIgPSBudWxsO1xyXG4gICAgQHByb3BlcnR5KGNjLlByZWZhYilcclxuICAgIGZhaWx1cmU6IGNjLlByZWZhYiA9IG51bGw7XHJcbiAgICBAcHJvcGVydHkoY2MuUHJlZmFiKVxyXG4gICAgZnVodW86IGNjLlByZWZhYiA9IG51bGw7XHJcblxyXG4gICAgQHByb3BlcnR5KGNjLk5vZGUpXHJcbiAgICBQbGF5ZXI6IGNjLk5vZGUgPSBudWxsO1xyXG4gICAgQHByb3BlcnR5KGNjLk5vZGUpXHJcbiAgICBGSG9sZGVyTm9kZTogY2MuTm9kZSA9IG51bGw7XHJcbiAgICBAcHJvcGVydHkoY2MuTm9kZSlcclxuICAgIEJnOiBjYy5Ob2RlID0gbnVsbDtcclxuICAgIEBwcm9wZXJ0eShjYy5Ob2RlKVxyXG4gICAgTGlmZURpbmc6IGNjLk5vZGUgPSBudWxsO1xyXG5cclxuICAgIEBwcm9wZXJ0eShjYy5CdXR0b24pXHJcbiAgICBMRUZUOiBjYy5CdXR0b24gPSBudWxsO1xyXG4gICAgQHByb3BlcnR5KGNjLkJ1dHRvbilcclxuICAgIFJJR0hUOiBjYy5CdXR0b24gPSBudWxsO1xyXG5cclxuICAgIEBwcm9wZXJ0eShjYy5MYWJlbClcclxuICAgIG91dHB1dDogY2MuTGFiZWwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvLyBMSUZFLUNZQ0xFIENBTExCQUNLUzpcclxuICAgIC8qKlxyXG4gICAgICog5LiK5LiA5Liq6JC96ISa54K555Sf5oiQ5pe26Ze0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgU1RpbWUgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPliY3okL3ohJrngrnnlJ/miJDml7bpl7RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBFVGltZSA9IDA7XHJcblxyXG4gICAgLyoqIExlZnQqL1xyXG4gICAgcHJpdmF0ZSBMa2V5RG93biA9IGZhbHNlO1xyXG4gICAgLyoqIFJpZ2h0Ki9cclxuICAgIHByaXZhdGUgUmtleURvd24gPSBmYWxzZTtcclxuICAgIC8qKnRoZSBsb2dodCBGb290SG9sZGVyIEYgKi9cclxuICAgIHByaXZhdGUgbGlnaHRGID0gZmFsc2U7XHJcblxyXG4gICAgbW92ZUZhbGcgPSBcIlwiO1xyXG5cclxuICAgIFVTRVJJTkZPID0ge1xyXG4gICAgICAgIHVzZXJJZDogXCJcIixcclxuICAgICAgICBzY29yZTogMCxcclxuICAgIH1cclxuXHJcbiAgICBvbkxvYWQoKSB7XHJcblxyXG4gICAgICAgIHZhciB0aW1lID0gY2Muc3lzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGZzalwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRpbWUgPT0gbnVsbCB8fCB0aW1lID09IHVuZGVmaW5lZCB8fCB0aW1lID09IFwiXCIpIHtcclxuICAgICAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaGZzalwiLCBcIjk5XCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5MaWZlRGluZy56SW5kZXggPSAxMDtcclxuICAgICAgICB0aGlzLkZIb2xkZXJOb2RlLnpJbmRleCA9IDk7XHJcbiAgICAgICAgR2xvYmFsLmluc3RhbmNlLnNldE1OKHRoaXMubm9kZSk7XHJcbiAgICAgICAgdGhpcy5TVGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IEZIb2xkZXIgPSBjYy5pbnN0YW50aWF0ZSh0aGlzLkdEKTtcclxuICAgICAgICB0aGlzLkZIb2xkZXJOb2RlLmFkZENoaWxkKEZIb2xkZXIsIDEwLCBcIkdEXCIpO1xyXG4gICAgICAgIEZIb2xkZXIuZ2V0Q29tcG9uZW50KFwiR0RcIikuaW5pdCh0aGlzLCAxKTtcclxuICAgICAgICBGSG9sZGVyLnkgPSAtMTUwO1xyXG4gICAgICAgIGxldCBGSG9sZGVyMiA9IGNjLmluc3RhbnRpYXRlKHRoaXMubHZkYWkpO1xyXG4gICAgICAgIHRoaXMuRkhvbGRlck5vZGUuYWRkQ2hpbGQoRkhvbGRlcjIsIDEwLCBcImx2ZGFpXCIpO1xyXG4gICAgICAgIEZIb2xkZXIyLmdldENvbXBvbmVudChcImx2ZGFpXCIpLmluaXQodGhpcyk7XHJcbiAgICAgICAgRkhvbGRlcjIueSA9IC0zMDA7XHJcbiAgICAgICAgLy8gbGV0IEZIb2xkZXIyID0gY2MuaW5zdGFudGlhdGUodGhpcy50YW5odWFuZyk7XHJcbiAgICAgICAgLy8gdGhpcy5GSG9sZGVyTm9kZS5hZGRDaGlsZChGSG9sZGVyMiwxMCxcInRhbmh1YW5nXCIpO1xyXG4gICAgICAgIC8vIEZIb2xkZXIyLmdldENvbXBvbmVudChcInRhbmh1YW5nXCIpLmluaXQodGhpcyk7XHJcbiAgICAgICAgLy8gRkhvbGRlcjIueSA9IC0zMDA7XHJcbiAgICAgICAgbGV0IEZIb2xkZXIzID0gY2MuaW5zdGFudGlhdGUodGhpcy5HRCk7XHJcbiAgICAgICAgdGhpcy5GSG9sZGVyTm9kZS5hZGRDaGlsZChGSG9sZGVyMywgMTAsIFwiR0RcIik7XHJcbiAgICAgICAgRkhvbGRlcjMuZ2V0Q29tcG9uZW50KFwiR0RcIikuaW5pdCh0aGlzLCAxKTtcclxuICAgICAgICBGSG9sZGVyMy55ID0gLTQ1MDtcclxuICAgICAgICAvLyB0aGlzLlBsYXllci5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLlBsYXllci54ID0gRkhvbGRlci54O1xyXG4gICAgICAgIC8vIHRoaXMuUGxheWVyLnkgPSBGSG9sZGVyLnkrNjA7XHJcbiAgICAgICAgdGhpcy5QbGF5ZXIuekluZGV4ID0gMTE7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkxpZmVEaW5nLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkxpZmVEaW5nLmNoaWxkcmVuW2ldLm5hbWUgPT0gXCJsaWZlQkdcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLkxpZmVEaW5nLmNoaWxkcmVuW2ldLmFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTGlmZURpbmcuY2hpbGRyZW5baV0uYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEdsb2JhbC5pbnN0YW5jZS5yZUxpZmUucHVzaCh0aGlzLkxpZmVEaW5nLmNoaWxkcmVuW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYy5kaXJlY3Rvci5nZXRDb2xsaXNpb25NYW5hZ2VyKCkuZW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgLy8gY2MuZGlyZWN0b3IuZ2V0Q29sbGlzaW9uTWFuYWdlcigpLmVuYWJsZWREZWJ1Z0RyYXcgPSB0cnVlO1xyXG4gICAgICAgIGNjLmRpcmVjdG9yLmdldENvbGxpc2lvbk1hbmFnZXIoKS5lbmFibGVkRHJhd0JvdW5kaW5nQm94ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcGxheXRhbnNvdW5kKCkge1xyXG4gICAgICAgIGlmIChHbG9iYWwuaW5zdGFuY2UuT3ZlckZsYWcgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgY2MubG9hZGVyLmxvYWRSZXMoXCJ0YW5cIiwgY2MuQXVkaW9DbGlwLCBmdW5jdGlvbiAoZXJyLCBjbGlwKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXVkaW9JRCA9IGNjLmF1ZGlvRW5naW5lLnBsYXkoY2xpcCwgZmFsc2UsIDAuNSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwbGF5ZGVhZHNvdW5kKCkge1xyXG4gICAgICAgIGNjLmxvYWRlci5sb2FkUmVzKFwiZGVhZFwiLCBjYy5BdWRpb0NsaXAsIGZ1bmN0aW9uIChlcnIsIGNsaXApIHtcclxuICAgICAgICAgICAgdmFyIGF1ZGlvSUQgPSBjYy5hdWRpb0VuZ2luZS5wbGF5KGNsaXAsIGZhbHNlLCAwLjUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhcnQoKSB7XHJcbiAgICB9XHJcbiAgICB1cGRhdGUoZHQpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhHbG9iYWwuaW5zdGFuY2UuQ29sbGlzaW9uRmxhZyk7XHJcbiAgICAgICAgdGhpcy5Nb3ZlQmcoKTtcclxuICAgICAgICBHbG9iYWwuaW5zdGFuY2UubW92ZVNwZWVkID0gMTtcclxuICAgICAgICBsZXQgRkhvbGRlcjtcclxuXHJcbiAgICAgICAgaWYgKCh0aGlzLkVUaW1lIC0gdGhpcy5TVGltZSkgPiAoMTIwMCAtICgxODAgKiAoR2xvYmFsLmluc3RhbmNlLkZIRmFsbFNwZWVkIC0gMikpKSkgey8v5o6n5Yi26JC96ISa54K55LmL6Ze055qE6Ze06LedLOmXtOi3nTE0NHB4XHJcbiAgICAgICAgICAgIHRoaXMuU1RpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICBpZiAoIUdsb2JhbC5pbnN0YW5jZS5PdmVyRmxhZykge1xyXG4gICAgICAgICAgICAgICAgRkhvbGRlciA9IHRoaXMuRm9vdEhvbGRHZW5lcmF0b3IobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLlNjb3JlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5GSG9sZGVyKCk7XHJcbiAgICAgICAgdGhpcy5yZWR1Y2VMaWZlKCk7XHJcbiAgICAgICAgaWYgKEdsb2JhbC5pbnN0YW5jZS5Db2xsaXNpb25GbGFnKSB7Ly/lt6blj7PkvKDpgIHluKblh4/pgJ9cclxuICAgICAgICAgICAgc3dpdGNoIChHbG9iYWwuaW5zdGFuY2UuS0lORF9Gb290SG9sZCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5ZXIueCArPSAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5ZXIueCAtPSAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKEdsb2JhbC5pbnN0YW5jZS5Mb3JSID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5ZXIueC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5ZXIueCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5QbGF5ZXIueCA8IC0xODApIHtcclxuICAgICAgICAgICAgdGhpcy5QbGF5ZXIueCA9IC0xODA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLlBsYXllci54ID4gMTgwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuUGxheWVyLnggPSAxODA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLlBsYXllci55IDwgKC01MTApKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5MaWZlRGluZy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuTGlmZURpbmcuY2hpbGRyZW5baV0ubmFtZSA9PSBcImxpZmVCR1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5MaWZlRGluZy5jaGlsZHJlbltpXS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmdhbWVPdmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChHbG9iYWwuaW5zdGFuY2UucmVMaWZlLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2FtZU92ZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5FVGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IEFsbENoaWxkcmVuID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgbGV0IEdEQ2hpbGRyZW4gPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICBBbGxDaGlsZHJlbiA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkJnTm9kZVwiKS5nZXRDaGlsZEJ5TmFtZShcIkZIb2xkZXJcIikuY2hpbGRyZW47XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBBbGxDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoQWxsQ2hpbGRyZW5baV0ubmFtZSA9PSBcIkdEXCIpIHtcclxuICAgICAgICAgICAgICAgIEdEQ2hpbGRyZW4ucHVzaChBbGxDaGlsZHJlbltpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2Muc3lzdGVtRXZlbnQub24oY2MuU3lzdGVtRXZlbnQuRXZlbnRUeXBlLktFWV9ET1dOLHRoaXMub25LZXlEb3duLHRoaXMpO1xyXG4gICAgICAgIC8vY2Muc3lzdGVtRXZlbnQub24oY2MuU3lzdGVtRXZlbnQuRXZlbnRUeXBlLktFWV9VUCx0aGlzLm9uS2V5VXAsdGhpcyk7XHJcbiAgICAgICAgdGhpcy5MaXN0ZW5lcigpO1xyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgbGV0IGJ0bkNsaWNrQXJyID0gbmV3IEFycmF5KDIpO1xyXG4gICAgICAgIGlmICghdGhpcy5Ma2V5RG93bikge1xyXG4gICAgICAgICAgICB0aGlzLlJJR0hULm5vZGUub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfU1RBUlQsIHRoaXMuQnRuVHVyblJpZ2h0LCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5SSUdIVC5ub2RlLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX01PVkUsIHRoaXMuQnRuVHVyblJpZ2h0LCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5SSUdIVC5ub2RlLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgdGhpcy5vbktleVVwLCB0aGlzKTtcclxuICAgICAgICAgICAgYnRuQ2xpY2tBcnIucHVzaCh0aGlzLlJJR0hUKTtcclxuICAgICAgICAgICAgdGhpcy5SSUdIVC5ub2RlLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbktleVVwO1xyXG4gICAgICAgICAgICB9LCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuUklHSFQubm9kZS5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfU1RBUlQsIHRoaXMuQnRuVHVyblJpZ2h0LCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5SSUdIVC5ub2RlLm9mZihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9NT1ZFLCB0aGlzLkJ0blR1cm5SaWdodCwgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuUklHSFQubm9kZS5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfQ0FOQ0VMLCB0aGlzLm9uS2V5VXAsIHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLlJJR0hULm5vZGUub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbktleVVwO1xyXG4gICAgICAgICAgICB9LCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLlJrZXlEb3duKSB7XHJcbiAgICAgICAgICAgIHRoaXMuTEVGVC5ub2RlLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCB0aGlzLkJ0blR1cm5MZWZ0LCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5MRUZULm5vZGUub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfTU9WRSwgdGhpcy5CdG5UdXJuTGVmdCwgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuTEVGVC5ub2RlLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgdGhpcy5vbktleVVwLCB0aGlzKTtcclxuICAgICAgICAgICAgLy8gYnRuQ2xpY2tBcnIucHVzaCh0aGlzLkxFRlQpO1xyXG4gICAgICAgICAgICB0aGlzLkxFRlQubm9kZS5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25LZXlVcDtcclxuICAgICAgICAgICAgfSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkxFRlQubm9kZS5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfU1RBUlQsIHRoaXMuQnRuVHVybkxlZnQsIHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLkxFRlQubm9kZS5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfTU9WRSwgdGhpcy5CdG5UdXJuTGVmdCwgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuTEVGVC5ub2RlLm9mZihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9DQU5DRUwsIHRoaXMub25LZXlVcCwgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuTEVGVC5ub2RlLm9mZihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25LZXlVcDtcclxuICAgICAgICAgICAgfSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgU3RvcEFuaShzZWxmKSB7XHJcbiAgICAgICAgaWYgKCFHbG9iYWwuaW5zdGFuY2UuQW5pRmFsZykge1xyXG4gICAgICAgICAgICBsZXQgRkhvbGRlciA9IHNlbGYubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkJnTm9kZVwiKS5nZXRDaGlsZEJ5TmFtZShcIkZIb2xkZXJcIikuY2hpbGRyZW47XHJcbiAgICAgICAgICAgIGxldCBGbmFtZTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IEZIb2xkZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChpID09IEZIb2xkZXIubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIEdsb2JhbC5pbnN0YW5jZS5BbmlGYWxnID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBGbmFtZSA9IEZIb2xkZXJbaV0ubmFtZTtcclxuICAgICAgICAgICAgICAgIEZIb2xkZXJbaV0uZ2V0Q29tcG9uZW50KEZuYW1lKS5lbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHBsYXllciDnp7vlh7rokL3ohJrngrlcclxuICAgICAqL1xyXG4gICAgRkhvbGRlcigpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgICBsZXQgRkhBcnJheSA9IHRoaXMuRkhvbGRlck5vZGUuY2hpbGRyZW47XHJcbiAgICAgICAgbGV0IEFuaTsvL3RoZSBBbmltYXRpb24gb2YgUGxheWVyIHdoZW4gcGxheWVyIGZhbGwgZG93blxyXG4gICAgICAgIGxldCBBbmlzdGF0ZTsvL3RoZSBzdGF0ZSBvZiBBbmk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IEZIQXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgaWYgKEZIQXJyYXlbaV0uaXNIb2xkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgbmFtZU5vZGU6c3RyaW5nID0gRkhBcnJheVtpXS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuUGxheWVyLnggPiAoRkhBcnJheVtpXS54ICsgNzUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgR2xvYmFsLmluc3RhbmNlLkNvbGxpc2lvbkZsYWcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBGSEFycmF5W2ldLmlzSG9sZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuU2NvcmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuUGxheWVyLnggPCAoRkhBcnJheVtpXS54IC0gNzUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgR2xvYmFsLmluc3RhbmNlLkNvbGxpc2lvbkZsYWcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBGSEFycmF5W2ldLmlzSG9sZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuU2NvcmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIEdsb2JhbC5pbnN0YW5jZS5Db2xsaXNpb25GbGFnID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBGSEFycmF5W2ldLmlzSG9sZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vliqjog4zmma8s5Yid5aeL56e75Yqo6YCf5bqmMjAwcHgvc1xyXG4gICAgICovXHJcbiAgICBNb3ZlQmcoKSB7XHJcbiAgICAgICAgbGV0IEJnMCA9IHRoaXMuQmcuZ2V0Q2hpbGRCeU5hbWUoXCJCZ18wXCIpO1xyXG4gICAgICAgIGxldCBCZzEgPSB0aGlzLkJnLmdldENoaWxkQnlOYW1lKFwiQmdfMVwiKTtcclxuICAgICAgICBpZiAoR2xvYmFsLmluc3RhbmNlLk92ZXJGbGFnKSB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBCZzAueSArPSBHbG9iYWwuaW5zdGFuY2UuRkhGYWxsU3BlZWQgKyAxO1xyXG4gICAgICAgICAgICBCZzEueSArPSBHbG9iYWwuaW5zdGFuY2UuRkhGYWxsU3BlZWQgKyAxO1xyXG4gICAgICAgICAgICBpZiAoQmcwLnkgPiA5NDYpIHtcclxuICAgICAgICAgICAgICAgIEJnMC55ID0gLTk0NjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoQmcxLnkgPiA5NDYpIHtcclxuICAgICAgICAgICAgICAgIEJnMS55ID0gLTk0NjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOeUn+aIkOiQveiEmueCuVxyXG4gICAgICovXHJcbiAgICBGb290SG9sZEdlbmVyYXRvcihydHBlKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBNYWduaWZpY2F0aW9uID0gMDtcclxuICAgICAgICBsZXQgZiA9IHBhcnNlSW50KHNlbGYuTGlmZURpbmcuZ2V0Q2hpbGRCeU5hbWUoXCJGbG9vclwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyk7XHJcbiAgICAgICAgaWYgKGYgPCAyMCkge1xyXG4gICAgICAgICAgICBNYWduaWZpY2F0aW9uID0gMlxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChmIDwgNDApIHtcclxuICAgICAgICAgICAgTWFnbmlmaWNhdGlvbiA9IDQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGYgPCA2MCkge1xyXG4gICAgICAgICAgICBNYWduaWZpY2F0aW9uID0gNjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZiA8IDgwKSB7XHJcbiAgICAgICAgICAgIE1hZ25pZmljYXRpb24gPSA4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTWFnbmlmaWNhdGlvbiA9IDg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBLaW5kSG9sZGVyID0gTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkgKiBNYWduaWZpY2F0aW9uKTtcclxuICAgICAgICAvLyBLaW5kSG9sZGVyID0gNztcclxuICAgICAgICBsZXQgRkhvbGRlcjtcclxuICAgICAgICAvLyBLaW5kSG9sZGVyID0gTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkqNyk7XHJcblxyXG5cclxuICAgICAgICBpZiAoS2luZEhvbGRlciA9PSAzIHx8IEtpbmRIb2xkZXIgPT0gNCkge1xyXG4gICAgICAgICAgICBsZXQgdmEgPSBNYXRoLnJhbmRvbSgpICogMTA7XHJcblxyXG4gICAgICAgICAgICBpZiAodmEgPj0gMSAmJiB2YSA8IDQpIHtcclxuICAgICAgICAgICAgICAgIEtpbmRIb2xkZXIgPSA3O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhID49IDQgJiYgdmEgPCAxMCkge1xyXG4gICAgICAgICAgICAgICAgS2luZEhvbGRlciA9IDU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9LaW5kSG9sZGVyID0gNTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJLaW5kSG9sZGVyIGdiOiBcIiArIEtpbmRIb2xkZXIpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChydHBlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgS2luZEhvbGRlciA9IHJ0cGU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiS2luZEhvbGRlciBnYjI6IFwiICsgS2luZEhvbGRlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLkVUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBzd2l0Y2ggKEtpbmRIb2xkZXIpIHtcclxuICAgICAgICAgICAgY2FzZSAxOiB7XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyID0gY2MuaW5zdGFudGlhdGUoc2VsZi5HRCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkZIb2xkZXJOb2RlLmFkZENoaWxkKEZIb2xkZXIsIDUsIFwiR0RcIik7XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyLmdldENvbXBvbmVudChcIkdEXCIpLmluaXQoc2VsZiwgMSk7XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyLmlzSG9sZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLkuqfnlJ/nrKzkuIDnp43okL3ohJrngrlcIik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIDI6IHtcclxuICAgICAgICAgICAgICAgIEZIb2xkZXIgPSBjYy5pbnN0YW50aWF0ZShzZWxmLkdEKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuRkhvbGRlck5vZGUuYWRkQ2hpbGQoRkhvbGRlciwgNSwgXCJHRFwiKTtcclxuICAgICAgICAgICAgICAgIEZIb2xkZXIuZ2V0Q29tcG9uZW50KFwiR0RcIikuaW5pdChzZWxmLCA3KTtcclxuICAgICAgICAgICAgICAgIEZIb2xkZXIuaXNIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvKnNlbGYuRm9vdEhvbGRHZW5lcmF0b3IoKTtcclxuICAgICAgICAgICAgICAgIEZIb2xkZXIgPSBjYy5pbnN0YW50aWF0ZShzZWxmLnRhbmh1YW5nKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuRkhvbGRlck5vZGUuYWRkQ2hpbGQoRkhvbGRlciw1LFwidGFuaHVhbmdcIik7XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyLmdldENvbXBvbmVudChcInRhbmh1YW5nXCIpLmluaXQoc2VsZik7XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyLmlzSG9sZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAvLyAvLyBjb25zb2xlLmxvZyhcIuS6p+eUn+esrOS6lOenjeiQveiEmueCuVwiKTtcclxuICAgICAgICAgICAgICAgLy8gYnJlYWs7Ki9cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgMzoge1xyXG4gICAgICAgICAgICAgICAgRkhvbGRlciA9IGNjLmluc3RhbnRpYXRlKHNlbGYubHZkYWkpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5GSG9sZGVyTm9kZS5hZGRDaGlsZChGSG9sZGVyLCA1LCBcImx2ZGFpXCIpO1xyXG4gICAgICAgICAgICAgICAgRkhvbGRlci5nZXRDb21wb25lbnQoXCJsdmRhaVwiKS5pbml0KHNlbGYpO1xyXG4gICAgICAgICAgICAgICAgRkhvbGRlci5pc0hvbGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5Lqn55Sf56ys5LqM56eN6JC96ISa54K5XCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCIg5Yib5bu65rua5YqoIFwiKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgNDoge1xyXG4gICAgICAgICAgICAgICAgRkhvbGRlciA9IGNjLmluc3RhbnRpYXRlKHNlbGYubHZkYWkpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5GSG9sZGVyTm9kZS5hZGRDaGlsZChGSG9sZGVyLCA1LCBcImx2ZGFpXCIpO1xyXG4gICAgICAgICAgICAgICAgRkhvbGRlci5nZXRDb21wb25lbnQoXCJsdmRhaVwiKS5pbml0KHNlbGYpO1xyXG4gICAgICAgICAgICAgICAgRkhvbGRlci5pc0hvbGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5Lqn55Sf56ys5LqU56eN6JC96ISa54K5XCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCIg5Yib5bu65rua5YqoMSBcIik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIDU6IHtcclxuICAgICAgICAgICAgICAgIEZIb2xkZXIgPSBjYy5pbnN0YW50aWF0ZShzZWxmLmJvbGkpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5GSG9sZGVyTm9kZS5hZGRDaGlsZChGSG9sZGVyLCA1LCBcImJvbGlcIik7XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyLmdldENvbXBvbmVudChcImJvbGlcIikuaW5pdChzZWxmKTtcclxuICAgICAgICAgICAgICAgIEZIb2xkZXIuaXNIb2xkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuS6p+eUn+esrOS4ieenjeiQveiEmueCuVwiKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgNjoge1xyXG4gICAgICAgICAgICAgICAgRkhvbGRlciA9IGNjLmluc3RhbnRpYXRlKHNlbGYuZGljaSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkZIb2xkZXJOb2RlLmFkZENoaWxkKEZIb2xkZXIsIDUsIFwiZGljaVwiKTtcclxuICAgICAgICAgICAgICAgIEZIb2xkZXIuZ2V0Q29tcG9uZW50KFwiZGljaVwiKS5pbml0KHNlbGYpO1xyXG4gICAgICAgICAgICAgICAgRkhvbGRlci5pc0hvbGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5Lqn55Sf56ys5Zub56eN6JC96ISa54K5XCIpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSA3OiB7XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyID0gY2MuaW5zdGFudGlhdGUoc2VsZi5HRCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkZIb2xkZXJOb2RlLmFkZENoaWxkKEZIb2xkZXIsIDUsIFwiR0RcIik7XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyLmdldENvbXBvbmVudChcIkdEXCIpLmluaXQoc2VsZiwgNyk7XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyLmlzSG9sZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSA4OiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5saWdodEYpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmxpZ2h0RiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuRm9vdEhvbGRHZW5lcmF0b3IobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyID0gY2MuaW5zdGFudGlhdGUoc2VsZi5zaGFuZGlhbik7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkZIb2xkZXJOb2RlLmFkZENoaWxkKEZIb2xkZXIsIDUsIFwic2hhbmRpYW5cIik7XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyLmdldENvbXBvbmVudChcInNoYW5kaWFuXCIpLmluaXQoc2VsZik7XHJcbiAgICAgICAgICAgICAgICBGSG9sZGVyLmlzSG9sZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5saWdodEYgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gZGVmYXVsdDp7XHJcbiAgICAgICAgICAgIC8vICAgICBGSG9sZGVyID0gY2MuaW5zdGFudGlhdGUoc2VsZi5HRCk7XHJcbiAgICAgICAgICAgIC8vICAgICBzZWxmLkZIb2xkZXJOb2RlLmFkZENoaWxkKEZIb2xkZXIsNSxcIkdEXCIpO1xyXG4gICAgICAgICAgICAvLyAgICAgRkhvbGRlci5nZXRDb21wb25lbnQoXCJHRFwiKS5pbml0KHNlbGYpO1xyXG4gICAgICAgICAgICAvLyAgICAgRkhvbGRlci5nZXRDb21wb25lbnQoXCJHRFwiKS5lbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gICAgIEZIb2xkZXIuZ2V0Q29tcG9uZW50KFwiTW92ZUdEXCIpLmluaXQoc2VsZik7XHJcbiAgICAgICAgICAgIC8vICAgICBGSG9sZGVyLmdldENvbXBvbmVudChcIk1vdmVHRFwiKS5lbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vICAgICBGSG9sZGVyLmlzSG9sZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyAgICAgLy8gY29uc29sZS5sb2coXCLpu5jorqTkuqfnlJ/nrKzkuIDnp43okL3ohJrngrlcIik7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgLy8gYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBGSG9sZGVyO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDmjInpkq7op6blj5HvvIzlkJHlt6bvvIzplb/mjInkuovku7ZcclxuICAgICAqL1xyXG4gICAgQnRuVHVybkxlZnQoZXZlbnQpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHNlbGYuUmtleURvd24pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZi5Ma2V5RG93biA9IHRydWU7XHJcbiAgICAgICAgICAgIHNlbGYuUmtleURvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5CdG5Mb3JSKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjInpkq7op6blj5HvvIzlkJHlj7Ms6ZW/5oyJ5LqL5Lu2LOmVv+aMieWTjeW6lOacquino+WGs1xyXG4gICAgICovXHJcbiAgICBCdG5UdXJuUmlnaHQoZXZlbnQpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHNlbGYuTGtleURvd24pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZi5Ma2V5RG93biA9IGZhbHNlXHJcbiAgICAgICAgICAgIHNlbGYuUmtleURvd24gPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLkJ0bkxvclIoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGJ0buinpuWPkeS6i+S7tlxyXG4gICAgICogQHBhcmFtIGV2ZW50IOaMiemSruinpuWPkeS6i+S7tlxyXG4gICAgICovXHJcbiAgICBCdG5Mb3JSKGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIEdsb2JhbC5pbnN0YW5jZS5tb3ZlU3BlZWQgPSAxO1xyXG4gICAgICAgIGxldCBzY2hlZHVsZSA9IGNjLmRpcmVjdG9yLmdldFNjaGVkdWxlcigpO1xyXG4gICAgICAgIGxldCBzdGFuZCA9IHNlbGYuUGxheWVyLmdldENoaWxkQnlOYW1lKFwic3RhbmRcIik7XHJcbiAgICAgICAgbGV0IHJ1blJpZ2h0ID0gc2VsZi5QbGF5ZXIuZ2V0Q2hpbGRCeU5hbWUoXCJydW5SaWdodFwiKTtcclxuICAgICAgICBsZXQgcnVuID0gc2VsZi5QbGF5ZXIuZ2V0Q2hpbGRCeU5hbWUoXCJydW5cIik7XHJcbiAgICAgICAgbGV0IEFuaTsvL3RoZSBhbmltYXRpb24gb2YgcGxheWVyXHJcbiAgICAgICAgbGV0IEFuaXN0YXRlOy8vdGhlIEFuaSdzIHN0YXRlXHJcbiAgICAgICAgbGV0IEFuaXN0cmluZzsvL3RoZSBuYW1lIG9mIEFuaVxyXG4gICAgICAgIGxldCBtb3ZlQnlUaW1lID0gMTtcclxuICAgICAgICBsZXQgc2NoZWR1bGVTdGF0ZTogYm9vbGVhbiA9IGZhbHNlOy8vdGhlIHNjaGVkdWxlJ3Mgc3RhdGVcclxuICAgICAgICBsZXQgc2NoZWR1bGVQYXVzZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgbGV0IHRhcmdldDogY2MuQnV0dG9uID0gbnVsbDsvL3RoZSB0YXJnZXQgd2hpY2ggaXMgYmluZ2VkIHRvIHNjaGVkdWxlXHJcbiAgICAgICAgbGV0IG1vdmVCeURlcyA9IEdsb2JhbC5pbnN0YW5jZS5tb3ZlU3BlZWQgKiAxMjAgKyA0MDtcclxuICAgICAgICBpZiAoc2VsZi5Ma2V5RG93bikge1xyXG4gICAgICAgICAgICB0YXJnZXQgPSBzZWxmLkxFRlQ7XHJcbiAgICAgICAgICAgIG1vdmVCeVRpbWUgPSAxO1xyXG4gICAgICAgICAgICBtb3ZlQnlEZXMgPSAtbW92ZUJ5RGVzO1xyXG4gICAgICAgICAgICBzY2hlZHVsZVN0YXRlID0gc2NoZWR1bGUuaXNTY2hlZHVsZWQoZnVuYywgdGFyZ2V0KTtcclxuICAgICAgICAgICAgLy8gc2VsZi5vdXRwdXQuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSBBbmlzdHJpbmc7XHJcbiAgICAgICAgICAgIHNjaGVkdWxlUGF1c2UgPSBzY2hlZHVsZS5pc1RhcmdldFBhdXNlZCh0YXJnZXQpO1xyXG4gICAgICAgICAgICBBbmkgPSBydW4uZ2V0Q29tcG9uZW50KGNjLkFuaW1hdGlvbik7XHJcbiAgICAgICAgICAgIEFuaXN0cmluZyA9IFwicnVuXCI7XHJcbiAgICAgICAgICAgIHN0YW5kLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBydW5SaWdodC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgcnVuLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vIHNlbGYub3V0cHV0LmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gQW5pc3RyaW5nO1xyXG4gICAgICAgICAgICBpZiAoIUdsb2JhbC5pbnN0YW5jZS5Db2xsaXNpb25GbGFnKSB7XHJcbiAgICAgICAgICAgICAgICBtb3ZlQnlUaW1lID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoR2xvYmFsLmluc3RhbmNlLktJTkRfRm9vdEhvbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUJ5VGltZSA9IDQuMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdXRwdXQuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSBHbG9iYWwuaW5zdGFuY2UuS0lORF9Gb290SG9sZCArIFwiMlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVCeVRpbWUgPSAzLjk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGYub3V0cHV0LmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gR2xvYmFsLmluc3RhbmNlLktJTkRfRm9vdEhvbGQrXCI1XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlbGYuUmtleURvd24pIHtcclxuICAgICAgICAgICAgdGFyZ2V0ID0gc2VsZi5SSUdIVDtcclxuICAgICAgICAgICAgbW92ZUJ5VGltZSA9IDE7XHJcbiAgICAgICAgICAgIG1vdmVCeURlcyA9IG1vdmVCeURlcztcclxuICAgICAgICAgICAgc2NoZWR1bGVTdGF0ZSA9IHNjaGVkdWxlLmlzU2NoZWR1bGVkKGZ1bmMsIHRhcmdldCk7XHJcbiAgICAgICAgICAgIC8vIHNlbGYub3V0cHV0LmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gQW5pc3RyaW5nO1xyXG4gICAgICAgICAgICBzY2hlZHVsZVBhdXNlID0gc2NoZWR1bGUuaXNUYXJnZXRQYXVzZWQodGFyZ2V0KTtcclxuICAgICAgICAgICAgQW5pID0gcnVuUmlnaHQuZ2V0Q29tcG9uZW50KGNjLkFuaW1hdGlvbik7XHJcbiAgICAgICAgICAgIEFuaXN0cmluZyA9IFwicnVuUlwiO1xyXG4gICAgICAgICAgICBzdGFuZC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgcnVuUmlnaHQuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgcnVuLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBzZWxmLm91dHB1dC5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IEFuaXN0cmluZztcclxuICAgICAgICAgICAgaWYgKCFHbG9iYWwuaW5zdGFuY2UuQ29sbGlzaW9uRmxhZykge1xyXG4gICAgICAgICAgICAgICAgbW92ZUJ5VGltZSA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEdsb2JhbC5pbnN0YW5jZS5LSU5EX0Zvb3RIb2xkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVCeVRpbWUgPSA0LjE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGYub3V0cHV0LmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gR2xvYmFsLmluc3RhbmNlLktJTkRfRm9vdEhvbGQrXCIyXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUJ5VGltZSA9IDMuOTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZi5vdXRwdXQuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSBHbG9iYWwuaW5zdGFuY2UuS0lORF9Gb290SG9sZCtcIjVcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGZ1bmNGbGFnID0gZmFsc2U7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0b3VjaHN0YXJ0XCI6IHtcclxuICAgICAgICAgICAgICAgIGlmICghKHNlbGYubW92ZUZhbGcubGVuZ3RoID09IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZWxmLm1vdmVGYWxnID0gXCJ0b3VjaHN0YXJ0XCI7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVkdWxlU3RhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzZWxmLm91dHB1dC5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IG1vdmVmYWxnO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlLnNjaGVkdWxlKGZ1bmMsIHRhcmdldCwgMCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHNjaGVkdWxlUGF1c2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZS5yZXN1bWVUYXJnZXQodGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFwidG91Y2htb3ZlXCI6IHtcclxuICAgICAgICAgICAgICAgIGlmICghKHNlbGYubW92ZUZhbGcubGVuZ3RoID09IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZWxmLm1vdmVGYWxnID0gXCJ0b3VjaG1vdmVcIjtcclxuICAgICAgICAgICAgICAgIC8vIHNlbGYub3V0cHV0LmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gbW92ZWZhbGc7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVkdWxlU3RhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZS5zY2hlZHVsZShmdW5jLCB0YXJnZXQsIDApO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGlmIChzY2hlZHVsZVBhdXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUucmVzdW1lVGFyZ2V0KHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcInRvdWNoY2FuY2VsXCI6IHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0b3VjaGVuZFwiOiB7XHJcbiAgICAgICAgICAgICAgICAvLyBzZWxmLm91dHB1dC5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IFwidG91Y2hlbmRcIjtcclxuICAgICAgICAgICAgICAgIHNjaGVkdWxlLnBhdXNlVGFyZ2V0KHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLlBsYXllci5zdG9wQWxsQWN0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgQW5pLnN0b3AoQW5pc3RyaW5nKTtcclxuICAgICAgICAgICAgICAgIG1vdmVCeVRpbWUgPSAxO1xyXG4gICAgICAgICAgICAgICAgbW92ZUJ5RGVzID0gR2xvYmFsLmluc3RhbmNlLm1vdmVTcGVlZCAqIDEyMCArIDQwO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChBbmlzdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwicnVuXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5SaWdodC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmQuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5Ma2V5RG93biA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlJrZXlEb3duID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVCeURlcyA9IEdsb2JhbC5pbnN0YW5jZS5tb3ZlU3BlZWQgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJ1blJcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBydW4uYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJpZ2h0LmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFuZC5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkxrZXlEb3duID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuUmtleURvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUJ5RGVzID0gR2xvYmFsLmluc3RhbmNlLm1vdmVTcGVlZCAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZ1bmNGbGFnID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBzZWxmLm1vdmVGYWxnID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgIGlmIChmdW5jRmxhZykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChHbG9iYWwuaW5zdGFuY2UuQ29sbGlzaW9uRmxhZykge1xyXG4gICAgICAgICAgICAgICAgbW92ZUJ5VGltZSA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHNwYXduID0gY2Muc3Bhd24oY2MuY2FsbEZ1bmMoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5QbGF5ZXIucnVuQWN0aW9uKGNjLm1vdmVCeShtb3ZlQnlUaW1lLCBtb3ZlQnlEZXMsIDApKTtcclxuICAgICAgICAgICAgfSksIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIEFuaXN0YXRlID0gQW5pLnBsYXkoQW5pc3RyaW5nKTtcclxuICAgICAgICAgICAgICAgIEFuaXN0YXRlLnNwZWVkID0gMTtcclxuICAgICAgICAgICAgICAgIEFuaXN0YXRlLnJlcGVhdENvdW50ID0gMTAwO1xyXG4gICAgICAgICAgICAgICAgQW5pc3RhdGUgPSBBbmkucGxheUFkZGl0aXZlKEFuaXN0cmluZyk7XHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICBzZWxmLlBsYXllci5ydW5BY3Rpb24oc3Bhd24pO1xyXG4gICAgICAgICAgICBmdW5jRmxhZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOi/lOWbnumUruebkeWQrFxyXG4gICAgICogQHBhcmFtIGV2ZW50IOaMieS4i+i/lOWbnumUrumAgOWHuua4uOaIj1xyXG4gICAgICovXHJcblxyXG4gICAgQW5pUGxheWVyKEFuaSwgQW5pc3RhdGUsIG1vdmVCeVRpbWUsIG1vdmVCeURlcywgS2V5LCBBbmlOYW1lLCBzZWxmPykge1xyXG4gICAgICAgIEFuaSA9IEtleS5nZXRDb21wb25lbnQoY2MuQW5pbWF0aW9uKTtcclxuXHJcbiAgICAgICAgbGV0IHNwYXduID0gY2Muc3Bhd24oY2MuY2FsbEZ1bmMoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxmLlBsYXllci5ydW5BY3Rpb24oY2MubW92ZUJ5KG1vdmVCeVRpbWUsIG1vdmVCeURlcywgMCkpO1xyXG4gICAgICAgIH0pLCBjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIEFuaXN0YXRlID0gQW5pLnBsYXkoQW5pTmFtZSk7XHJcbiAgICAgICAgICAgIEFuaXN0YXRlLnNwZWVkID0gMjtcclxuICAgICAgICAgICAgQW5pc3RhdGUucmVwZWF0Q291bnQgPSAxMDA7XHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgc2VsZi5QbGF5ZXIucnVuQWN0aW9uKHNwYXduKTtcclxuICAgICAgICBpZiAoIUFuaS5zdGF0ZSkge1xyXG4gICAgICAgICAgICBsZXQgc3Bhd24yID0gY2Muc3Bhd24oY2MuY2FsbEZ1bmMoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5QbGF5ZXIucnVuQWN0aW9uKGNjLm1vdmVCeShtb3ZlQnlUaW1lLCBtb3ZlQnlEZXMsIDApKTtcclxuICAgICAgICAgICAgfSksIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIEFuaXN0YXRlID0gQW5pLnBsYXkoQW5pTmFtZSk7XHJcbiAgICAgICAgICAgICAgICBBbmlzdGF0ZS5zcGVlZCA9IDI7XHJcbiAgICAgICAgICAgICAgICBBbmlzdGF0ZS5yZXBlYXRDb3VudCA9IDEwMDtcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIHNlbGYuUGxheWVyLnJ1bkFjdGlvbihzcGF3bjIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog5oqs6LW35Yqo55S75YGc5q2iXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQg5oqs6LW35bem5Y+z6ZSu6Kem5Y+RXHJcbiAgICAgKi9cclxuICAgIG9uS2V5VXAoZXZlbnQpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5Ma2V5RG93biA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuUmtleURvd24gPSBmYWxzZTtcclxuICAgICAgICBzZWxmLlBsYXllci5zdG9wQWxsQWN0aW9ucygpO1xyXG4gICAgICAgIGxldCBzdGFuZCA9IHRoaXMuUGxheWVyLmdldENoaWxkQnlOYW1lKFwic3RhbmRcIik7XHJcbiAgICAgICAgbGV0IHJ1blJpZ2h0ID0gdGhpcy5QbGF5ZXIuZ2V0Q2hpbGRCeU5hbWUoXCJydW5SaWdodFwiKTtcclxuICAgICAgICBsZXQgcnVuID0gdGhpcy5QbGF5ZXIuZ2V0Q2hpbGRCeU5hbWUoXCJydW5cIik7XHJcbiAgICAgICAgc3RhbmQuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICBydW4uYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgcnVuUmlnaHQuYWN0aXZlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBnYW1lb3ZlclxyXG4gICAgICovXHJcbiAgICBnYW1lT3ZlcigpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5QbGF5ZXIuc3RvcEFsbEFjdGlvbnMoKTtcclxuICAgICAgICBHbG9iYWwuaW5zdGFuY2UuQ29sbGlzaW9uRmxhZyA9IGZhbHNlO1xyXG4gICAgICAgIC8vIHNlbGYuUGxheWVyLmdldENvbXBvbmVudChjYy5Cb3hDb2xsaWRlcikuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHNlbGYuUGxheWVyLmdldENvbXBvbmVudChcIlBsYXljb250cm9sZXJcIikuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHNlbGYuUGxheWVyLmdldENvbXBvbmVudChjYy5BbmltYXRpb24pLnN0b3AoKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBzZWxmLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJvdXRwdXRcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSBlcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZi5QbGF5ZXIuZ2V0Q2hpbGRCeU5hbWUoXCJzdGFuZFwiKS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIHNlbGYuUGxheWVyLmdldENoaWxkQnlOYW1lKFwicnVuUmlnaHRcIikuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgc2VsZi5QbGF5ZXIuZ2V0Q2hpbGRCeU5hbWUoXCJydW5cIikuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgc2VsZi5QbGF5ZXIueSAtPSBHbG9iYWwuaW5zdGFuY2UuSW5pdFNwZWVkO1xyXG4gICAgICAgIGxldCBBbGxGSCA9IHNlbGYubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkJnTm9kZVwiKS5nZXRDaGlsZEJ5TmFtZShcIkZIb2xkZXJcIikuY2hpbGRyZW47XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBBbGxGSC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgRkhOQSA9IEFsbEZIW2ldLm5hbWU7XHJcbiAgICAgICAgICAgIEFsbEZIW2ldLmdldENvbXBvbmVudChGSE5BKS5lbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIEFsbEZIW2ldLmlzSG9sZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoRkhOQSA9PSBcIkdEXCIpIHtcclxuICAgICAgICAgICAgICAgIEFsbEZIW2ldLmdldENoaWxkQnlOYW1lKFwiZ2RcIikuZ2V0Q29tcG9uZW50KFwiQ2xpR0RcIikuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuU3RvcEFuaShzZWxmKTtcclxuICAgICAgICBsZXQgZmFpbHVyZTtcclxuICAgICAgICBsZXQgQW5pO1xyXG4gICAgICAgIGxldCBBbmlzdGF0ZTtcclxuICAgICAgICBsZXQgQmVzdFNjb3JlXHJcbiAgICAgICAgbGV0IHRoaXNTY29yZTtcclxuICAgICAgICBsZXQgbGVzc1Njb3JlO1xyXG4gICAgICAgIGxldCBTY29yZTtcclxuICAgICAgICAvLyBsZXQgZnVodW87XHJcbiAgICAgICAgbGV0IEZBbmk7XHJcbiAgICAgICAgbGV0IEZBbmlzdGF0ZTtcclxuICAgICAgICBzZWxmLkxFRlQubm9kZS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICBzZWxmLlJJR0hULm5vZGUuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgZmFpbHVyZSA9IGNjLmluc3RhbnRpYXRlKHNlbGYuZmFpbHVyZSk7XHJcbiAgICAgICAgLy8gZnVodW8gPSBjYy5pbnN0YW50aWF0ZShzZWxmLmZ1aHVvKTtcclxuICAgICAgICAvLyBsZXQgZmh1b0J0blJhbmsgPSBmdWh1by5nZXRDaGlsZEJ5TmFtZShcImNkXCIpLmdldENoaWxkQnlOYW1lKFwiUmFua1NjZW5lXCIpLmdldENvbXBvbmVudChjYy5CdXR0b24pO1xyXG4gICAgICAgIGxldCBmaHVvQnRucmVHYW1lID0gZmFpbHVyZS5nZXRDaGlsZEJ5TmFtZShcInJlc2V0XCIpLmdldENvbXBvbmVudChjYy5CdXR0b24pO1xyXG4gICAgICAgIC8vIGxldCBmaHVvQnRucmVHYW1lID0gZnVodW8uZ2V0Q2hpbGRCeU5hbWUoXCJ6bFwiKS5nZXRDaGlsZEJ5TmFtZShcInJlUGxheVwiKS5nZXRDb21wb25lbnQoY2MuQnV0dG9uKTtcclxuICAgICAgICAvLyBsZXQgZmh1b0J0bkZodW8gPSBmdWh1by5nZXRDaGlsZEJ5TmFtZShcImZoXCIpLmdldENoaWxkQnlOYW1lKFwicmVQbGF5XCIpLmdldENvbXBvbmVudChjYy5CdXR0b24pO1xyXG4gICAgICAgIGxldCBSYW5rRXZlbnRIYW5kbGVyID0gbmV3IGNjLkNvbXBvbmVudC5FdmVudEhhbmRsZXIoKTtcclxuICAgICAgICBsZXQgcmVHYW1lRXZlbnRIYW5kbGVyID0gbmV3IGNjLkNvbXBvbmVudC5FdmVudEhhbmRsZXIoKTtcclxuICAgICAgICBsZXQgRmh1b0V2ZW50SGFuZGxlciA9IG5ldyBjYy5Db21wb25lbnQuRXZlbnRIYW5kbGVyKCk7XHJcbiAgICAgICAgLy9vcGVuIHRoZSByYW5raW5nXHJcbiAgICAgICAgLy8gUmFua0V2ZW50SGFuZGxlci50YXJnZXQgPSBzZWxmLm5vZGU7XHJcbiAgICAgICAgLy8gUmFua0V2ZW50SGFuZGxlci5jb21wb25lbnQgPSBcIk1haW5TY2VuZVwiO1xyXG4gICAgICAgIC8vIFJhbmtFdmVudEhhbmRsZXIuaGFuZGxlciA9IFwiRkJ0bkNCX1JhbmtcIjtcclxuICAgICAgICAvLyBSYW5rRXZlbnRIYW5kbGVyLmN1c3RvbUV2ZW50RGF0YSA9IG51bGw7XHJcbiAgICAgICAgLy8gZmh1b0J0blJhbmsuY2xpY2tFdmVudHMucHVzaChSYW5rRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAvL3JlcGxheVxyXG4gICAgICAgIHJlR2FtZUV2ZW50SGFuZGxlci50YXJnZXQgPSBzZWxmLm5vZGU7XHJcbiAgICAgICAgcmVHYW1lRXZlbnRIYW5kbGVyLmNvbXBvbmVudCA9IFwiTWFpblNjZW5lXCI7XHJcbiAgICAgICAgcmVHYW1lRXZlbnRIYW5kbGVyLmhhbmRsZXIgPSBcInJlc3RhcnRcIjtcclxuICAgICAgICByZUdhbWVFdmVudEhhbmRsZXIuY3VzdG9tRXZlbnREYXRhID0gbnVsbDtcclxuICAgICAgICBmaHVvQnRucmVHYW1lLmNsaWNrRXZlbnRzLnB1c2gocmVHYW1lRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAvL2Zo56uL5Y2z5aSN5rS75Lya5pyJ5YW25LuW5Yqf6IO95pqC5pe255So6YeN5paw5byA5aeL5Luj5pu/XHJcbiAgICAgICAgLy8gRmh1b0V2ZW50SGFuZGxlci50YXJnZXQgPSBzZWxmLm5vZGU7XHJcbiAgICAgICAgLy8gRmh1b0V2ZW50SGFuZGxlci5jb21wb25lbnQgPSBcIk1haW5TY2VuZVwiO1xyXG4gICAgICAgIC8vIEZodW9FdmVudEhhbmRsZXIuaGFuZGxlciA9IFwiRkJ0bkNCX3JlUGxheVwiO1xyXG4gICAgICAgIC8vIEZodW9FdmVudEhhbmRsZXIuY3VzdG9tRXZlbnREYXRhID0gbnVsbDtcclxuICAgICAgICAvLyBmaHVvQnRuRmh1by5jbGlja0V2ZW50cy5wdXNoKEZodW9FdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIGlmICghR2xvYmFsLmluc3RhbmNlLk92ZXJGbGFnKSB7XHJcbiAgICAgICAgICAgIEdsb2JhbC5pbnN0YW5jZS5PdmVyRmxhZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHNlbGYuU3RvcmVnZVNjb3JlKCk7XHJcbiAgICAgICAgICAgIC8vIHNlbGYuVXBkYXRlU2NvcmUoKTtcclxuICAgICAgICAgICAgZmFpbHVyZS55ID0gLTIwO1xyXG4gICAgICAgICAgICAvLyBmdWh1by55ID0gMDtcclxuICAgICAgICAgICAgdGhpc1Njb3JlID0gcGFyc2VJbnQoc2VsZi5MaWZlRGluZy5nZXRDaGlsZEJ5TmFtZShcIkZsb29yXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nKTtcclxuICAgICAgICAgICAgLy8gbGVzc1Njb3JlID0gZmFpbHVyZS5nZXRDaGlsZEJ5TmFtZShcImpsXCIpLmdldENoaWxkQnlOYW1lKFwiTGVzc1Njb3JlXCIpO1xyXG4gICAgICAgICAgICBCZXN0U2NvcmUgPSBHbG9iYWwuaW5zdGFuY2UuZ2V0TG9jYWxTY29yZSgpLkJlc3RTY29yZTtcclxuXHJcbiAgICAgICAgICAgIEdsb2JhbC5pbnN0YW5jZS5HZXRVU2VyKCkuc2NvcmUgPSBCZXN0U2NvcmU7XHJcbiAgICAgICAgICAgIHNlbGYuVXBMb2FkU2NvcmUoKTtcclxuICAgICAgICAgICAgaWYgKEJlc3RTY29yZSAtIHRoaXNTY29yZSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBmYWlsdXJlLmdldENoaWxkQnlOYW1lKFwiamxcIikuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBsZXNzU2NvcmUuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSAoQmVzdFNjb3JlIC0gdGhpc1Njb3JlKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFNjb3JlID0gZmFpbHVyZS5nZXRDaGlsZEJ5TmFtZShcImNqXCIpLmdldENoaWxkQnlOYW1lKFwiU2NvcmVcIik7XHJcbiAgICAgICAgICAgIHNlbGYubm9kZS5hZGRDaGlsZChmYWlsdXJlKTtcclxuICAgICAgICAgICAgLy8gc2VsZi5ub2RlLmFkZENoaWxkKGZ1aHVvKTtcclxuICAgICAgICAgICAgU2NvcmUuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSBzZWxmLkxpZmVEaW5nLmdldENoaWxkQnlOYW1lKFwiRmxvb3JcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmc7XHJcbiAgICAgICAgICAgIC8vIEFuaSA9IGZhaWx1cmUuZ2V0Q29tcG9uZW50KGNjLkFuaW1hdGlvbik7Ly90aGUgYW5pbWF0aW9uIG9mIGZhaWx1cmU7XHJcbiAgICAgICAgICAgIC8vIC8vIEZBbmkgPSBmdWh1by5nZXRDb21wb25lbnQoY2MuQW5pbWF0aW9uKTtcclxuICAgICAgICAgICAgLy8gQW5pc3RhdGUgPSBBbmkucGxheShcInNoaWJhaVwiKTsvL3RoZSBzdGF0ZSBvZiBBbmk7XHJcbiAgICAgICAgICAgIC8vIEFuaXN0YXRlLnNwZWVkID0gMTtcclxuICAgICAgICAgICAgLy8gQW5pc3RhdGUucmVwZWF0Q291bnQgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VsZi5wbGF5ZGVhZHNvdW5kKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLmuLjmiI/nu5PmnZ/vvIHvvIHvvIFcIik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5aSN5rS75oyJ6ZKu55qE5Zue6LCD5Ye95pWw77ya5omT5byA5o6S6KGM5qacXHJcbiAgICAgKi9cclxuICAgIEZCdG5DQl9SYW5rKHNlbGY/KSB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICAgICAgY2MuZGlyZWN0b3IubG9hZFNjZW5lKFwiRW5kU2NlbmVcIik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOWkjea0u+aMiemSrueahOWbnuiwg+WHveaVsO+8mueri+WNs+Wkjea0u1xyXG4gICAgICovXHJcbiAgICBGQnRuQ0JfcmVQbGF5KCkge1xyXG4gICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImhmc2pcIiwgXCI5OVwiKTtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgR2xvYmFsLmluc3RhbmNlLk92ZXJGbGFnID0gZmFsc2U7XHJcbiAgICAgICAgR2xvYmFsLmluc3RhbmNlLkFuaUZhbGcgPSBmYWxzZTtcclxuICAgICAgICBHbG9iYWwuaW5zdGFuY2UuTG9yUiA9IDA7XHJcbiAgICAgICAgR2xvYmFsLmluc3RhbmNlLkluaXRTcGVlZCA9IDguNTtcclxuICAgICAgICBHbG9iYWwuaW5zdGFuY2UubW92ZVNwZWVkID0gMTtcclxuICAgICAgICAvLyBHbG9iYWwuaW5zdGFuY2UuRkhGYWxsU3BlZWQgPSAyO1xyXG4gICAgICAgIEdsb2JhbC5pbnN0YW5jZS5Db2xsaXNpb25GbGFnID0gZmFsc2U7XHJcbiAgICAgICAgR2xvYmFsLmluc3RhbmNlLkNvbGxpc2lvbldpdGhEaW5nID0gZmFsc2U7XHJcbiAgICAgICAgR2xvYmFsLmluc3RhbmNlLlRoZUhvbGRlciA9IG51bGw7XHJcbiAgICAgICAgR2xvYmFsLmluc3RhbmNlLktJTkRfRm9vdEhvbGQgPSAwO1xyXG4gICAgICAgIC8vIHRoaXMuUklHSFQubm9kZS5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfU1RBUlQsdGhpcy5CdG5UdXJuUmlnaHQsdGhpcyk7XHJcbiAgICAgICAgLy8gdGhpcy5SSUdIVC5ub2RlLm9mZihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9NT1ZFLHRoaXMuQnRuVHVyblJpZ2h0LHRoaXMpO1xyXG4gICAgICAgIC8vIHRoaXMuUklHSFQubm9kZS5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfQ0FOQ0VMLHRoaXMub25LZXlVcCx0aGlzKTtcclxuICAgICAgICB0aGlzLkxFRlQubm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuUklHSFQubm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuTGtleURvd24gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLlJrZXlEb3duID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5tb3ZlRmFsZyA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5QbGF5ZXIueSA9IDMwMDtcclxuICAgICAgICB0aGlzLlBsYXllci54ID0gMDtcclxuICAgICAgICB0aGlzLlBsYXllci5nZXRDb21wb25lbnQoXCJQbGF5Y29udHJvbGVyXCIpLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuUGxheWVyLmdldENvbXBvbmVudChjYy5Cb3hDb2xsaWRlcikuZW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgbGV0IEFsbEZIID0gdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiQmdOb2RlXCIpLmdldENoaWxkQnlOYW1lKFwiRkhvbGRlclwiKS5jaGlsZHJlbjtcclxuICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJTQlwiKS5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiZnVodW8xXCIpLmRlc3Ryb3koKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuTGlmZURpbmcuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgLy9mb3IobGV0IGk9MDtpPDI7aSsrKXtcclxuICAgICAgICAgICAgaWYgKHRoaXMuTGlmZURpbmcuY2hpbGRyZW5baV0ubmFtZSA9PSBcImxpZmVCR1wiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuTGlmZURpbmcuY2hpbGRyZW5baV0uYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5MaWZlRGluZy5jaGlsZHJlbltpXS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgR2xvYmFsLmluc3RhbmNlLnJlTGlmZS5wdXNoKHRoaXMuTGlmZURpbmcuY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuUGxheWVyLmdldENvbXBvbmVudChjYy5Cb3hDb2xsaWRlcikuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQWxsRkgubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgQWxsRkhbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgRiA9IHRoaXMuRm9vdEhvbGRHZW5lcmF0b3IoMSk7XHJcbiAgICAgICAgRi55ID0gLTM4MDtcclxuICAgICAgICB0aGlzLnNjaGVkdWxlT25jZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlbGYuUGxheWVyLmdldENvbXBvbmVudChjYy5Cb3hDb2xsaWRlcikuZW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgfSwgMC41KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogcmVzdGFydFxyXG4gICAgICovXHJcbiAgICByZXN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICAgICAgIGNjLmRpcmVjdG9yLmxvYWRTY2VuZShcIk1haW5TY2VuZVwiKTtcclxuICAgICAgICBjYy5kaXJlY3Rvci5yZXN1bWUoKTtcclxuICAgICAgICBHbG9iYWwuaW5zdGFuY2UuT3ZlckZsYWcgPSBmYWxzZTtcclxuICAgICAgICBHbG9iYWwuaW5zdGFuY2UuQW5pRmFsZyA9IGZhbHNlO1xyXG4gICAgICAgIEdsb2JhbC5pbnN0YW5jZS5Mb3JSID0gMDtcclxuICAgICAgICBHbG9iYWwuaW5zdGFuY2UuSW5pdFNwZWVkID0gOC41O1xyXG4gICAgICAgIEdsb2JhbC5pbnN0YW5jZS5tb3ZlU3BlZWQgPSAxO1xyXG4gICAgICAgIEdsb2JhbC5pbnN0YW5jZS5GSEZhbGxTcGVlZCA9IDI7XHJcbiAgICAgICAgR2xvYmFsLmluc3RhbmNlLkNvbGxpc2lvbkZsYWcgPSBmYWxzZTtcclxuICAgICAgICBHbG9iYWwuaW5zdGFuY2UuQ29sbGlzaW9uV2l0aERpbmcgPSBmYWxzZTtcclxuICAgICAgICBHbG9iYWwuaW5zdGFuY2UuVGhlSG9sZGVyID0gbnVsbDtcclxuICAgICAgICBHbG9iYWwuaW5zdGFuY2UuS0lORF9Gb290SG9sZCA9IDA7XHJcbiAgICAgICAgLy8gdGhpcy5SSUdIVC5ub2RlLm9mZihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9TVEFSVCx0aGlzLkJ0blR1cm5SaWdodCx0aGlzKTtcclxuICAgICAgICAvLyB0aGlzLlJJR0hULm5vZGUub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX01PVkUsdGhpcy5CdG5UdXJuUmlnaHQsdGhpcyk7XHJcbiAgICAgICAgLy8gdGhpcy5SSUdIVC5ub2RlLm9mZihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9DQU5DRUwsdGhpcy5vbktleVVwLHRoaXMpO1xyXG4gICAgICAgIHRoaXMuTEVGVC5ub2RlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5SSUdIVC5ub2RlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5Ma2V5RG93biA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuUmtleURvd24gPSBmYWxzZTtcclxuICAgICAgICAvLyB0aGlzLm1vdmVGYWxnID0gXCJcIjtcclxuICAgICAgICB0aGlzLlBsYXllci55ID0gMzAwO1xyXG4gICAgICAgIC8vIHRoaXMuU2NvcmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiDlj5fliLDkvKTlrrPvvIzlkb3mlbDlh4/kuIBcclxuICAgICovXHJcbiAgICByZWR1Y2VMaWZlKCkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgTHMgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICBsZXQgcmVMQ291bnQgPSAwO1xyXG4gICAgICAgIGxldCBGSG9sZGVyID0gc2VsZi5ub2RlLmdldENoaWxkQnlOYW1lKFwiQmdOb2RlXCIpLmdldENoaWxkQnlOYW1lKFwiRkhvbGRlclwiKS5jaGlsZHJlbjtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEZIb2xkZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKEZIb2xkZXJbaV0uaXNIb2xkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIUdsb2JhbC5pbnN0YW5jZS5Db2xsaXNpb25GbGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgRkhvbGRlcltpXS5pc0hvbGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYm94ID0gRkhvbGRlcltpXS5nZXRDb21wb25lbnQoY2MuQm94Q29sbGlkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJveC5lbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vXHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSBzZWxmLkxpZmVEaW5nLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLkxpZmVEaW5nLmNoaWxkcmVuW2ldLm5hbWUgPT0gXCJsaWZlQkdcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKEdsb2JhbC5pbnN0YW5jZS5Jbmp1cmVkIHx8IEdsb2JhbC5pbnN0YW5jZS5Db2xsaXNpb25XaXRoRGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLkxpZmVEaW5nLmNoaWxkcmVuW2ldLmFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkxpZmVEaW5nLmNoaWxkcmVuW2ldLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwuaW5zdGFuY2UuSW5qdXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwuaW5zdGFuY2UuQ29sbGlzaW9uRmxhZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwuaW5zdGFuY2UuQ29sbGlzaW9uV2l0aERpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBMcy5wdXNoKHNlbGYuTGlmZURpbmcuY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBHbG9iYWwuaW5zdGFuY2UucmVMaWZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBMcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoTHNbaV0uYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBHbG9iYWwuaW5zdGFuY2UucmVMaWZlLnB1c2goTHNbaV0pOy8vcGxheWVy5Ymp5L2Z55qE5ZG95pWwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9cclxuXHJcbiAgICAgICAgdmFyIHRpbWUgPSBjYy5zeXMubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZnNqXCIpO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coIHRpbWUgKyBcIuW9k+WJjeihgCA6IFwiICsgR2xvYmFsLmluc3RhbmNlLnJlTGlmZS5sZW5ndGgpO1xyXG4gICAgICAgIGlmIChHbG9iYWwuaW5zdGFuY2UucmVMaWZlLmxlbmd0aCA8IDMpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aW1lID09IDk5KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgICAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaGZzalwiLCB0aW1lKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCB0aW1lID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGltbG9kID0gcGFyc2VJbnQoY2Muc3lzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGZzalwiKSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3ViID0gdGltZSAtIHRpbWxvZDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViID49IDIwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemVzID0gR2xvYmFsLmluc3RhbmNlLnJlTGlmZS5sZW5ndGggKyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIEdsb2JhbC5pbnN0YW5jZS5yZUxpZmUgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemVzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuTGlmZURpbmcuY2hpbGRyZW5baV0ubmFtZSA9PSBcImxpZmVCR1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuTGlmZURpbmcuY2hpbGRyZW5baV0uYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5MaWZlRGluZy5jaGlsZHJlbltpXS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsLmluc3RhbmNlLnJlTGlmZS5wdXNoKHRoaXMuTGlmZURpbmcuY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJwdXNoIC0tLS0tLS0tLS0tLS0tXCIgKyBpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJoZnNqXCIsIHRpbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHNpemVzICsgXCLmgaLlpI3ooYArMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiICsgIEdsb2JhbC5pbnN0YW5jZS5yZUxpZmUubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaGZzalwiLCBcIjk5XCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmr4/kuIvokL3kuIDlsYLvvIzliIbmlbDliqDkuIDjgIJcclxuICAgICAqL1xyXG4gICAgU2NvcmUoKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzLm5vZGU7XHJcbiAgICAgICAgbGV0IHNjTGFiZWwgPSB0aGlzLkxpZmVEaW5nLmdldENoaWxkQnlOYW1lKFwiRmxvb3JcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcclxuICAgICAgICBsZXQgc2MgPSBwYXJzZUludChzY0xhYmVsLnN0cmluZyk7XHJcbiAgICAgICAgaWYgKCFHbG9iYWwuaW5zdGFuY2UuT3ZlckZsYWcpIHtcclxuICAgICAgICAgICAgc2MgPSBzYyArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGxheXRhbnNvdW5kKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLmiZPljbDkuIDkuItcIik7XHJcbiAgICAgICAgc2NMYWJlbC5zdHJpbmcgPSBzYy50b1N0cmluZygpO1xyXG4gICAgICAgIGxldCBsdiA9IE1hdGguY2VpbChzYyAvIDUwKTtcclxuICAgICAgICBpZiAobHYgPiBHbG9iYWwuaW5zdGFuY2UuTGV2ZWxBZGRGbGFnKSB7XHJcbiAgICAgICAgICAgIEdsb2JhbC5pbnN0YW5jZS5MZXZlbEFkZEZsYWcgPSBsdjtcclxuICAgICAgICAgICAgR2xvYmFsLmluc3RhbmNlLkluaXRTcGVlZCArPSAwLjI1Oy8v5q+P5LiL6JC9NTDlsYLvvIxwbGF5ZXLkuIvokL3pgJ/luqbliqAwLjI1XHJcbiAgICAgICAgICAgIEdsb2JhbC5pbnN0YW5jZS5GSEZhbGxTcGVlZCArPSAxOy8v5rKh5LiL6JC9NTDlsYLvvIzokL3ohJrngrnkuIvokL3pgJ/luqbliqDlv6swLjUuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pys5Zyw5YiG5pWw5a2Y5YKoXHJcbiAgICAgKi9cclxuICAgIFN0b3JlZ2VTY29yZSgpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgbGV0IGxvY2FsUyA9IEdsb2JhbC5pbnN0YW5jZS5nZXRMb2NhbFNjb3JlKCk7Ly90aGUgdGVtcCBvZiBsb2NhbCBzY29yZTtcclxuICAgICAgICBsZXQgQ3VycmVudFNjb3JlID0gcGFyc2VJbnQoXHJcbiAgICAgICAgICAgIHRoaXMuTGlmZURpbmcuZ2V0Q2hpbGRCeU5hbWUoXCJGbG9vclwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyk7XHJcbiAgICAgICAgR2xvYmFsLmluc3RhbmNlLmdldExvY2FsU2NvcmUoKS5DdXJyZW50U2NvcmUgPSBDdXJyZW50U2NvcmU7XHJcbiAgICAgICAgaWYgKEN1cnJlbnRTY29yZSA+IGxvY2FsUy5UaGlyZFNjb3JlKSB7XHJcbiAgICAgICAgICAgIGlmIChDdXJyZW50U2NvcmUgPiBsb2NhbFMuU2Vjb25kU2NvcmUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChDdXJyZW50U2NvcmUgPiBsb2NhbFMuQmVzdFNjb3JlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTLkJlc3RTY29yZSA9IEN1cnJlbnRTY29yZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2NhbFMuU2Vjb25kU2NvcmUgPSBDdXJyZW50U2NvcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9jYWxTLlRoaXJkU2NvcmUgPSBDdXJyZW50U2NvcmU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogdXBsb2FkIHRoZSBiZXN0IHNjb3JlXHJcbiAgICAgKi9cclxuICAgIFVwTG9hZFNjb3JlKCkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgdG1wID0gR2xvYmFsLmluc3RhbmNlLkdldFVTZXIoKTtcclxuICAgICAgICAvKiBIdHRwLnNlbmRSZXF1ZXN0KFwiL3VwZGF0ZVNjb3JlXCIsdG1wLGZ1bmN0aW9uKG1zZyl7XHJcbiAgICAgICAgICAgICBsZXQgeCA9IG1zZztcclxuICAgICAgICAgICAgIGlmKG1zZy5jb2RlIT0wKXtcclxuICAgICAgICAgICAgICAgICBHbG9iYWwuaW5zdGFuY2UuTmV0U3RhdHVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICBsZXQgdXggPSB7XHJcbiAgICAgICAgICAgICAgICAgdXNlcklkOicnLFxyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgY29uc29sZS5sb2coeCk7XHJcbiAgICAgICAgICAgICB1eC51c2VySWQgPSBHbG9iYWwuaW5zdGFuY2UuR2V0VVNlcigpLnVzZXJJZDtcclxuICAgICAgICAgICAgIEh0dHAuc2VuZFJlcXVlc3QoXCIvcmFua1wiLHV4LGZ1bmN0aW9uKG1tc2cpe1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLTNcIik7XHJcbiAgICAgICAgICAgICAgICAgbGV0IE1NID0gSlNPTi5wYXJzZShtbXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coTU0pO1xyXG4gICAgICAgICAgICAgICAgIGlmKEdsb2JhbC5pbnN0YW5jZS5HZXRSKCk9PW51bGx8fEdsb2JhbC5pbnN0YW5jZS5HZXRSKCkucmFuaz09dW5kZWZpbmVkfHxHbG9iYWwuaW5zdGFuY2UuR2V0UigpLnJhbms8TU0ubXkucmFuayl7XHJcbiAgICAgICAgICAgICAgICAgICAgIEdsb2JhbC5pbnN0YW5jZS5TZXRSKE1NLm15LnJhbmspO1xyXG4gICAgICAgICAgICAgICAgICAgICBHbG9iYWwuaW5zdGFuY2Uuc2V0UmVtb3RlU2NvcmUoTU0ub3RoZXIpO1xyXG4gICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICB9KTsqL1xyXG4gICAgfVxyXG5cclxufSJdfQ==