var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i" + Sdk_1.WxApi.querychannel + " referrerInfoappId->" + Sdk_1.WxApi.referrerInfoappId); _this.LoginLocal(); } else { Sdk_1.WxApi.recordAldEvent("微信登录失败"); _this.LoginWX(); } }); }; AgencyLogin.prototype.LoginLocal = function (res) { if (res === void 0) { res = null; } Sdk_1.WxApi.recordAldEvent("开始本地登录"); if (res) { new PlayerAccount_1.PlayerAccount(res.code, "", "", 0, "", "", "", "", Sdk_1.WxApi.shareOpenId, Sdk_1.WxApi.shareOpenId, Global_1.Global.gameVersion); } NetworkManager_1.NetworkManager.Instance.login(null, Laya.Handler.create(this, this.LoginComplete), null); //this.LoadSbp(); }; AgencyLogin.prototype.LoginComplete = function () { Sdk_1.WxApi.recordAldEvent("本地服务器登录完成..."); // ShareUtil.Instance.onRegister(); // GuangGao.InitVideo(); Sdk_1.WxApi.aldSendOpenid(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid); this.Success(); }; AgencyLogin.prototype.loginprogress = function (value) { var loadingPanel = ViewManager_1.ViewManager.Instance.getView(LoadingPanel_1.LoadingPanel); if (loadingPanel) { loadingPanel.showWord(value); } }; AgencyLogin.prototype.Success = function () { this.ResolveData(); this.initData(); this.StartMain(); ttad_1.ttad.InitAD(); }; AgencyLogin.prototype.StartMain = function () { console.log("当前配置表总关卡:", LevelCFG_1.default.vec.length); this.getSingleTon(AgencyMain_1.AgencyMain).StartMain(); }; /** * 解析配置数据 */ AgencyLogin.prototype.ResolveData = function () { var byteData = PlayerAccount_1.PlayerAccount.CurrentAccount.nowConfig.gameConfig[0].config; if (byteData && byteData != "") { var arr = byteData.split("%file%"); var i; var nums = arr.length; for (i = 0; i < nums; i++) { var itemarr = arr[i].split("%cfg%"); var cla = AgencyLogin.configClass[itemarr[0]]; if (cla) { cla.initCfg(itemarr[1]); } else { } } return true; } return false; }; /** * 初始化游戏数据 */ AgencyLogin.prototype.initData = function () { this.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).init(); this.getSingleTon(AgencySkin_1.AgencySkin).init(); this.getSingleTon(AgencyLottery_1.AgencyLottery).init(); }; AgencyLogin.key = "AgencyLogin"; AgencyLogin.configClass = { RoleCFG: RoleCFG_1.default, LevelCFG: LevelCFG_1.default, BuildCFG: BuildCFG_1.default, NpcCFG: NpcCFG_1.default, GameCFG: GameCFG_1.default, LotteryCFG: LotteryCFG_1.default }; return AgencyLogin; }(AgencyBaseControl_1.AgencyBaseControl)); exports.AgencyLogin = AgencyLogin; },{"../CFG/BuildCFG":9,"../CFG/GameCFG":10,"../CFG/LevelCFG":11,"../CFG/LotteryCFG":12,"../CFG/NpcCFG":13,"../CFG/RoleCFG":14,"../Global":41,"../View/LoadingPanel":65,"../View/ViewManager":70,"../WXSDK/NetworkManager":73,"../WXSDK/PlayerAccount":75,"../WXSDK/Sdk":77,"../WXSDK/WECHATEVENT":80,"../WXSDK/ttad":83,"./AgencyBaseControl":1,"./AgencyLottery":4,"./AgencyMain":5,"./AgencySkin":6,"./AgencyUserMessage":8}],4:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AgencyBaseControl_1 = require("./AgencyBaseControl"); var ViewManager_1 = require("../View/ViewManager"); var LotteryPanel_1 = require("../View/LotteryPanel"); var LotteryCFG_1 = require("../CFG/LotteryCFG"); var GameUtils_1 = require("../utils/GameUtils"); var GlobalTip_1 = require("../utils/GlobalTip"); var RoleCFG_1 = require("../CFG/RoleCFG"); var AgencySkin_1 = require("./AgencySkin"); var AgencyLottery = /** @class */ (function (_super) { __extends(AgencyLottery, _super); function AgencyLottery() { var _this = _super.call(this) || this; _this.mStartX = 400; _this.mStartY = 500; _this.mActionIndex = 0; _this.mCurrIndex = 0; _this.mCurrSkinIndex = 0; return _this; } AgencyLottery.prototype.init = function () { }; AgencyLottery.prototype.openView = function () { ViewManager_1.ViewManager.Instance.add(LotteryPanel_1.LotteryPanel); }; /**************************** */ AgencyLottery.prototype.createAnimation = function () { var ani = new Laya.Animation(); // ani.loadAtlas(this.AniConfPath); // 加载图集动画 ani.interval = 30; // 设置播放间隔(单位:毫秒) ani.index = 1; // 当前播放索引 ani.play(); // 播放图集动画 // 获取动画的边界信息 var bounds = ani.getGraphicBounds(); ani.pivot(bounds.width / 2, bounds.height / 2); ani.pos(Laya.stage.width / 2, Laya.stage.height / 2); Laya.stage.addChild(ani); }; /************************* */ AgencyLottery.prototype.getreward = function (cfg) { if (cfg) { switch (cfg.type) { case 1: this.RoleData.Money += Number(cfg.value); GlobalTip_1.GlobalTip.Instance.showWordTips("恭喜获得" + cfg.value + "金币!"); break; case 2: var rolecfg = RoleCFG_1.default.dict[cfg.value]; this.getSingleTon(AgencySkin_1.AgencySkin).setRoleState(rolecfg, 1); GlobalTip_1.GlobalTip.Instance.showWordTips("恭喜获得角色" + rolecfg.rolename); break; } } }; AgencyLottery.prototype.GetReward = function () { var index = 0; var dicts = LotteryCFG_1.default.vec; var maxNum = 0; var cfg; var i = 0; for (i = 0; i < dicts.length; i++) { cfg = dicts[i]; maxNum += cfg.weight; } var sordvalue = GameUtils_1.GameUtils.randRangeint(1, maxNum); var totalnum = 0; for (i = 0; i < dicts.length; i++) { cfg = dicts[i]; totalnum += cfg.weight; if (totalnum >= sordvalue) { index = i; break; } } return index; }; /************************************************ */ AgencyLottery.prototype.startFun = function () { this.mAniPath = "res/spine/spineRes1/dragon.sk"; // this.mFactory = new Templet(); // this.mFactory.on(Event.COMPLETE, this, this.parseComplete); // this.mFactory.on(Event.ERROR, this, this.onError); // this.mFactory.loadAni(this.mAniPath); }; AgencyLottery.prototype.onError = function () { console.log("error"); }; AgencyLottery.prototype.parseComplete = function () { //创建模式为1,可以启用换装 this.mArmature = this.mFactory.buildArmature(1); this.mArmature.x = this.mStartX; this.mArmature.y = this.mStartY; this.mArmature.scale(0.5, 0.5); Laya.stage.addChild(this.mArmature); // this.mArmature.on(Event.STOPPED, this, this.completeHandler); this.play(); }; AgencyLottery.prototype.completeHandler = function () { this.play(); }; AgencyLottery.prototype.play = function () { this.mCurrIndex++; if (this.mCurrIndex >= this.mArmature.getAnimNum()) { this.mCurrIndex = 0; } this.mArmature.play(this.mCurrIndex, false); }; AgencyLottery.key = "AgencyLottery"; return AgencyLottery; }(AgencyBaseControl_1.AgencyBaseControl)); exports.AgencyLottery = AgencyLottery; },{"../CFG/LotteryCFG":12,"../CFG/RoleCFG":14,"../View/LotteryPanel":66,"../View/ViewManager":70,"../utils/GameUtils":87,"../utils/GlobalTip":88,"./AgencyBaseControl":1,"./AgencySkin":6}],5:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AgencyBaseControl_1 = require("./AgencyBaseControl"); var ResourceControl_1 = require("../Control/ResourceControl"); var LoadingPanel_1 = require("../View/LoadingPanel"); var ViewManager_1 = require("../View/ViewManager"); var ResDataControl_1 = require("../Control/ResDataControl"); var MainPanel_1 = require("../View/MainPanel"); var SceneControl_1 = require("../Control/SceneControl"); var AssetPath_1 = require("../Config/AssetPath"); var GameStateControl_1 = require("../Control/GameStateControl"); var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform"); var NpcCFG_1 = require("../CFG/NpcCFG"); var PlayerAccount_1 = require("../WXSDK/PlayerAccount"); var PropManager_1 = require("../PrefabControl/PropManager"); var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk"); var GiftView_1 = require("../View/GiftView"); var AssetManager_1 = require("../Control/AssetManager"); var AgencyMain = /** @class */ (function (_super) { __extends(AgencyMain, _super); function AgencyMain() { var _this = _super.call(this) || this; _this._loadjd = 0; _this._alljd = 0; return _this; } AgencyMain.prototype.initSelf = function () { }; AgencyMain.prototype.StartMain = function () { this._loadjd = 0; this._alljd = 20; WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage("subpackage", this, this.sub1complete, this.loadprogress, null); }; AgencyMain.prototype.sub1complete = function () { this._loadjd = 20; this._alljd = 30; WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage("subpackage1", this, this.SubpackageOver, this.loadprogress, null); }; AgencyMain.prototype.onComplete = function () { //添加父级猴子 var dude = this.scene.addChild(Laya.Loader.getRes("res/threeDimen/skinModel/dude/dude.lh")); //缩放 var scale = new Laya.Vector3(0.1, 0.1, 0.1); dude.transform.localScale = scale; dude.transform.rotate(new Laya.Vector3(0, 3.14, 0)); }; /*************************************** */ AgencyMain.prototype.SubpackageOver = function () { var _this = this; AssetManager_1.AssetManager.LoadAssetFun(function () { _this._loadjd = 50; _this._alljd = 40; var pathArr = []; var urlArr = []; urlArr.push(AssetPath_1.AssetPath.get3DModel("startpanel")); urlArr.push(AssetPath_1.AssetPath.get3DModel("endpanel")); urlArr.push(AssetPath_1.AssetPath.get3DModel("speedupeffect")); urlArr.push(AssetPath_1.AssetPath.get3DModel("color_white")); urlArr.push(AssetPath_1.AssetPath.get3DModel("color_yellow")); urlArr.push(AssetPath_1.AssetPath.get3DModel("winline")); urlArr.push(AssetPath_1.AssetPath.get3DModel("fireworks")); urlArr.push(AssetPath_1.AssetPath.get3DModel("DirectionalLight")); // urlArr.push( AssetPath.get3DModel( "distantview" ) ); urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(_this.RoleData.roleCfg.name)); urlArr.push(AssetPath_1.AssetPath.get3DRoleModel("Arrow")); var arr = _this.RoleData.levelmapArr; var i = 0; for (i = 0; i < arr.length; i++) { if (urlArr.indexOf(AssetPath_1.AssetPath.get3DModel(arr[i])) == -1) { urlArr.push(AssetPath_1.AssetPath.get3DModel(arr[i])); } } var npcArr = _this.RoleData.levelcfg.npc; for (i = 0; i < npcArr.length; i++) { if (urlArr.indexOf(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) { urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)); } } for (i = 0; i < urlArr.length; i++) { pathArr.push({ url: urlArr[i] }); } ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, _this, _this.load3Dcomplete, _this.loadprogress); }); }; AgencyMain.prototype.load3Dcomplete = function () { this._loadjd = 90; this._alljd = 10; ResourceControl_1.ResourceControl.Instance.loadGroup("main", this, this.loadcomplete, this.loadprogress, false); }; AgencyMain.prototype.loadprogress = function (value) { var loadingpanel = ViewManager_1.ViewManager.Instance.getView(LoadingPanel_1.LoadingPanel); if (loadingpanel) { value = this._loadjd + Math.ceil(value / 100 * this._alljd); loadingpanel.showWord(value); } }; AgencyMain.prototype.loadcomplete = function () { fairygui.UIConfig.buttonSound = "ui://lecxynh2iz9y26"; GameStateControl_1.GameStateControl.Instance.init(); ResDataControl_1.ResDataControl.Instance.AddViewPackByName("main"); ViewManager_1.ViewManager.Instance.close(LoadingPanel_1.LoadingPanel); // FYHD_Sdk.InitSdk(); ViewManager_1.ViewManager.Instance.add(MainPanel_1.MainPanel); console.log("新用户FYHD_Sdk.isnewuser---", FYHD_Sdk_1.FYHD_Sdk.isnewuser); var newuser = Laya.LocalStorage.getItem("is_newuser"); if (FYHD_Sdk_1.FYHD_Sdk.isnewuser) { Laya.timer.once(500, this, function () { if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) { ViewManager_1.ViewManager.Instance.add(GiftView_1.default); } }); } else { Laya.LocalStorage.setItem("is_newuser", "1"); } SceneControl_1.SceneControl.Instance.SetScene(); PropManager_1.PropManager.Instance.InitEffect(); }; AgencyMain.key = "AgencyMain"; return AgencyMain; }(AgencyBaseControl_1.AgencyBaseControl)); exports.AgencyMain = AgencyMain; },{"../CFG/NpcCFG":13,"../Config/AssetPath":15,"../Control/AssetManager":17,"../Control/GameStateControl":21,"../Control/ResDataControl":27,"../Control/ResourceControl":28,"../Control/SceneControl":29,"../PrefabControl/PropManager":49,"../View/GiftView":63,"../View/LoadingPanel":65,"../View/MainPanel":67,"../View/ViewManager":70,"../WXSDK/FYHD_Sdk":71,"../WXSDK/PlayerAccount":75,"../WXSDK/WXGamePlatform":81,"./AgencyBaseControl":1}],6:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AgencyBaseControl_1 = require("./AgencyBaseControl"); var LocalDataControl_1 = require("../Control/LocalDataControl"); var UserDataInfo_1 = require("../Data/UserDataInfo"); var SkinData_1 = require("../Data/SkinData"); var RoleCFG_1 = require("../CFG/RoleCFG"); var ViewManager_1 = require("../View/ViewManager"); var SkinPanel_1 = require("../View/SkinPanel"); var GlobalTip_1 = require("../utils/GlobalTip"); var GameState_1 = require("../utils/GameState"); var AgencySkin = /** @class */ (function (_super) { __extends(AgencySkin, _super); function AgencySkin() { var _this = _super.call(this) || this; AgencySkin.instance = _this; return _this; } AgencySkin.prototype.initSelf = function () { }; AgencySkin.prototype.init = function () { this.localdata = LocalDataControl_1.LocalDataControl.Instance.GetLocalCaCheData(UserDataInfo_1.UserDataInfo.skin); var pifuData; if (!this.localdata.hasOwnProperty("pifu")) { this.localdata["pifu"] = {}; } pifuData = this.localdata["pifu"]; this.pifuArr = []; this.pifuDict = {}; var i = 0; var nums = RoleCFG_1.default.vec.length; for (i = 0; i < nums; i++) { var pifuvo = new SkinData_1.SkinData; var cfg = RoleCFG_1.default.vec[i]; pifuvo.roleCFG = cfg; var d = pifuData[cfg.id]; if (d) { pifuvo.state = Number(d.state); pifuvo.hasnum = Number(d.hasnum); } else { pifuvo.state = 0; pifuvo.hasnum = 0; } if (cfg.getState == 0) { pifuvo.state = 1; } this.pifuArr.push(pifuvo); this.pifuDict[pifuvo.roleCFG.id] = pifuvo; } }; AgencySkin.prototype.openview = function () { ViewManager_1.ViewManager.Instance.add(SkinPanel_1.SkinPanel); }; AgencySkin.prototype.setRoleState = function (cfg, value) { var pifuvo = this.pifuDict[cfg.id]; if (pifuvo) { pifuvo.state = 1; this.AddLocalSkinData(pifuvo.roleCFG.id, pifuvo.state, pifuvo.hasnum); } }; AgencySkin.prototype.AddLocalSkinData = function (id, state, hasnum) { this.localdata["pifu"][id] = {}; this.localdata["pifu"][id]["state"] = state; this.localdata["pifu"][id]["hasnum"] = hasnum; LocalDataControl_1.LocalDataControl.Instance.AddData(UserDataInfo_1.UserDataInfo.skin, this.localdata); }; AgencySkin.prototype.createCantralRect = function () { this.rect = new Laya.Sprite(); this.rect.graphics.drawRect(-100, -100, 200, 200, "gray"); Laya.stage.addChild(this.rect); this.updateRectPos(); }; AgencySkin.prototype.updateRectPos = function () { this.rect.x = Laya.stage.width / 2; this.rect.y = Laya.stage.height / 2; }; /****************************************** */ AgencySkin.prototype.GainPifu = function (_skinitem) { if (_skinitem.state == 1) { this.RoleData.CharacterID = _skinitem.roleCFG.id; this.DisTrigger(GameState_1.GameState.updateSKinView); } else { switch (_skinitem.roleCFG.getState) { case 1: //视频获取 _skinitem.hasnum++; if (_skinitem.roleCFG.need <= _skinitem.hasnum) { _skinitem.state = 1; } this.AddLocalSkinData(_skinitem.roleCFG.id, _skinitem.state, _skinitem.hasnum); this.DisTrigger(GameState_1.GameState.updateSKinView); break; case 2: //金币购买 if (this.RoleData.Money >= _skinitem.roleCFG.need) { this.RoleData.Money -= _skinitem.roleCFG.need; _skinitem.state = 1; this.AddLocalSkinData(_skinitem.roleCFG.id, _skinitem.state, _skinitem.hasnum); this.DisTrigger(GameState_1.GameState.updateSKinView); GlobalTip_1.GlobalTip.Instance.showWordTips("购买成功"); } else { GlobalTip_1.GlobalTip.Instance.showWordTips("金币不足"); } break; case 3: //活动获取 break; } } }; AgencySkin.prototype.GainNoHaveSkin = function () { var arr = []; for (var s in this.pifuDict) { if (this.pifuDict[s].state == 0) { arr.push(this.pifuDict[s]); } } return arr; }; AgencySkin.key = "AgencySkin"; return AgencySkin; }(AgencyBaseControl_1.AgencyBaseControl)); exports.AgencySkin = AgencySkin; },{"../CFG/RoleCFG":14,"../Control/LocalDataControl":23,"../Data/SkinData":34,"../Data/UserDataInfo":35,"../View/SkinPanel":68,"../View/ViewManager":70,"../utils/GameState":86,"../utils/GlobalTip":88,"./AgencyBaseControl":1}],7:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AgencyBaseControl_1 = require("./AgencyBaseControl"); var ViewManager_1 = require("../View/ViewManager"); var TrialPanel_1 = require("../View/TrialPanel"); var GameStateControl_1 = require("../Control/GameStateControl"); var AssetPath_1 = require("../Config/AssetPath"); var ResourceControl_1 = require("../Control/ResourceControl"); var SceneControl_1 = require("../Control/SceneControl"); var AgencyInGame_1 = require("./AgencyInGame"); var EggPanel_1 = require("../View/EggPanel"); var PlayerAccount_1 = require("../WXSDK/PlayerAccount"); var AgencyTrial = /** @class */ (function (_super) { __extends(AgencyTrial, _super); function AgencyTrial() { var _this = _super.call(this) || this; _this.isshiyonging = false; return _this; } AgencyTrial.prototype.openview = function (arr) { ViewManager_1.ViewManager.Instance.add(TrialPanel_1.TrialPanel, arr); }; /**退出界面 */ AgencyTrial.prototype.ExitPanel = function (_data) { this.isshiyonging = _data ? true : false; this._selectvo = _data; if (_data) { var urlArr = []; urlArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(_data.roleCFG.name) }); ResourceControl_1.ResourceControl.Instance.loader3DArr(urlArr, this, this.SceneCreateComplete, null, true); } else { // if(AgencyInGame.gamenum>1){ var random = Math.random(); if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser && random <= PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.HitEgg) { ViewManager_1.ViewManager.Instance.add(EggPanel_1.default); } else { GameStateControl_1.GameStateControl.Instance.entergame(); } // } // else{ // GameStateControl.Instance.entergame(); // } } ViewManager_1.ViewManager.Instance.close(TrialPanel_1.TrialPanel); }; /************************************************ */ AgencyTrial.prototype.createSprite = function () { this.sprit = new Laya.Sprite(); this.sprit.graphics.drawRect(0, 0, 200, 200, "#D2691E"); this.sprit.pivot(100, 100); this.sprit.x = Laya.stage.width / 2; this.sprit.y = Laya.stage.height / 2; this.sprit.size(200, 200); Laya.stage.addChild(this.sprit); // this.sp.on(Interaction_CustomEvent.ROTATE, this, this.onRotate); // 侦听自定义的事件 // this.sprit.on(Event.CLICK, this, this.onSpriteClick); }; AgencyTrial.prototype.onSpriteClick = function (e) { var randomAngle = Math.random() * 180; //发送自定义事件 // this.sprit.event(Interaction_CustomEvent.ROTATE, [randomAngle]); }; // 触发自定义的rotate事件 AgencyTrial.prototype.onRotate = function (newAngle) { // Tween.to(this.sp, { "rotation": newAngle }, 1000, Ease.elasticOut); }; /******************************* */ AgencyTrial.prototype.SceneCreateComplete = function () { SceneControl_1.SceneControl.Instance.CreatePlayer(this._selectvo.roleCFG); if (AgencyInGame_1.AgencyInGame.gamenum > 1) { if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) { ViewManager_1.ViewManager.Instance.add(EggPanel_1.default); } else { GameStateControl_1.GameStateControl.Instance.entergame(); } } else { GameStateControl_1.GameStateControl.Instance.entergame(); } }; /******************************* */ AgencyTrial.prototype.createText = function () { var txt = new Laya.Text(); //给文本的text属性赋值 txt.text = "Layabox是性能最强的HTML5引擎技术提供商与优秀的游戏发行商,面向Flash开发者提供HTML5开发技术方案!"; //设置宽度,高度自动匹配 txt.width = 400; //自动换行 txt.wordWrap = true; txt.align = "center"; txt.fontSize = 40; txt.font = "Microsoft YaHei"; txt.color = "#ff0000"; txt.bold = true; txt.leading = 5; //设置描边属性 txt.stroke = 2; txt.strokeColor = "#ffffff"; txt.borderColor = "#00ff00"; txt.x = (Laya.stage.width - txt.textWidth) / 2; txt.y = (Laya.stage.height - txt.textHeight) / 2; Laya.stage.addChild(txt); }; /************************** */ AgencyTrial.prototype.createInput = function () { var inputText = new Laya.Input(); // 移动端输入提示符 inputText.prompt = "Type some word..."; //多行输入 inputText.multiline = true; inputText.wordWrap = true; inputText.size(350, 100); inputText.x = Laya.stage.width - inputText.width >> 1; inputText.y = Laya.stage.height - inputText.height >> 1; inputText.padding = [2, 2, 2, 2]; inputText.bgColor = "#666666"; inputText.color = "#ffffff"; inputText.fontSize = 20; Laya.stage.addChild(inputText); }; AgencyTrial.key = "AgencyTrial"; return AgencyTrial; }(AgencyBaseControl_1.AgencyBaseControl)); exports.AgencyTrial = AgencyTrial; },{"../Config/AssetPath":15,"../Control/GameStateControl":21,"../Control/ResourceControl":28,"../Control/SceneControl":29,"../View/EggPanel":62,"../View/TrialPanel":69,"../View/ViewManager":70,"../WXSDK/PlayerAccount":75,"./AgencyBaseControl":1,"./AgencyInGame":2}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AgencyBaseControl_1 = require("./AgencyBaseControl"); var AgencyUserMessage = /** @class */ (function (_super) { __extends(AgencyUserMessage, _super); function AgencyUserMessage() { var _this = _super.call(this) || this; _this.roleisinit = false; return _this; } AgencyUserMessage.prototype.initSelf = function () { }; /**加金币 */ AgencyUserMessage.prototype.GoldUp = function (_num) { this.RoleData.Money += _num; }; /**************************** */ AgencyUserMessage.prototype.createInput = function () { var inputText = new Laya.Input(); inputText.size(350, 100); inputText.x = Laya.stage.width - inputText.width >> 1; inputText.y = Laya.stage.height - inputText.height >> 1; inputText.text = "这段文本不可编辑,但可复制"; inputText.editable = false; // 设置字体样式 inputText.bold = true; inputText.bgColor = "#666666"; inputText.color = "#ffffff"; inputText.fontSize = 20; Laya.stage.addChild(inputText); }; /******************************** */ AgencyUserMessage.prototype.init = function () { this.RoleData.init(); this.roleisinit = true; }; /************************ */ AgencyUserMessage.prototype.createText = function () { var txt = new Laya.Text(); txt.text = "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!\n" + "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!\n" + "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!"; txt.borderColor = "#FFFF00"; txt.size(300, 50); txt.fontSize = 20; txt.color = "#ffffff"; Laya.stage.addChild(txt); return txt; }; /**************************** */ /**升级 */ AgencyUserMessage.prototype.LevelUp = function () { this.RoleData.LevelUp(); }; AgencyUserMessage.key = "AgencyUserMessage"; return AgencyUserMessage; }(AgencyBaseControl_1.AgencyBaseControl)); exports.AgencyUserMessage = AgencyUserMessage; },{"./AgencyBaseControl":1}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ //工具生成,请勿修改。 //配置文件名称:build.xlsx。 //------------------------------------------------------------------------------ var BuildCFG = /** @class */ (function () { function BuildCFG() { } BuildCFG.initCfg = function (str) { var i = 0; var arr = str.split("\n"); var i = 0; for (i = 0; i < arr.length; i++) { var singleStr = arr[i]; var singleArr = singleStr.split("&"); if (BuildCFG.dict[singleArr[0]]) continue; var item = new BuildCFG(); item.name = singleArr[0]; item.buffx = Number(singleArr[1]); item.buffy = Number(singleArr[2]); item.buffz = Number(singleArr[3]); item.time = Number(singleArr[4]); BuildCFG.dict[item.name] = item; BuildCFG.vec.push(item); } }; BuildCFG.dict = {}; BuildCFG.vec = []; return BuildCFG; }()); exports.default = BuildCFG; },{}],10:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ //工具生成,请勿修改。 //配置文件名称:game.xlsx。 //------------------------------------------------------------------------------ var GameCFG = /** @class */ (function () { function GameCFG() { } GameCFG.initCfg = function (str) { var i = 0; var arr = str.split("\n"); var i = 0; for (i = 0; i < arr.length; i++) { var singleStr = arr[i]; var singleArr = singleStr.split("&"); if (GameCFG.dict[singleArr[0]]) continue; var item = new GameCFG(); item.id = Number(singleArr[0]); item.value = singleArr[1]; GameCFG.dict[item.id] = item; GameCFG.vec.push(item); } }; GameCFG.dict = {}; GameCFG.vec = []; return GameCFG; }()); exports.default = GameCFG; },{}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ //工具生成,请勿修改。 //配置文件名称:level.xlsx。 //------------------------------------------------------------------------------ var LevelCFG = /** @class */ (function () { function LevelCFG() { } LevelCFG.initCfg = function (str) { var i = 0; var arr = str.split("\n"); var i = 0; for (i = 0; i < arr.length; i++) { var singleStr = arr[i]; var singleArr = singleStr.split("&"); if (LevelCFG.dict[singleArr[0]]) continue; var item = new LevelCFG(); item.id = Number(singleArr[0]); item.road = singleArr[1]; item.roleinitpos = JSON.parse(singleArr[2]); item.npc = JSON.parse(singleArr[3]); item.firstScenepos = singleArr[4]; item.winGold = Number(singleArr[5]); item.failGod = singleArr[6]; LevelCFG.dict[item.id] = item; LevelCFG.vec.push(item); } }; LevelCFG.dict = {}; LevelCFG.vec = []; return LevelCFG; }()); exports.default = LevelCFG; },{}],12:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ //工具生成,请勿修改。 //配置文件名称:lottery.xlsx。 //------------------------------------------------------------------------------ var LotteryCFG = /** @class */ (function () { function LotteryCFG() { } LotteryCFG.initCfg = function (str) { var i = 0; var arr = str.split("\n"); var i = 0; for (i = 0; i < arr.length; i++) { var singleStr = arr[i]; var singleArr = singleStr.split("&"); if (LotteryCFG.dict[singleArr[0]]) continue; var item = new LotteryCFG(); item.id = Number(singleArr[0]); item.type = Number(singleArr[1]); item.value = singleArr[2]; item.weight = Number(singleArr[3]); LotteryCFG.dict[item.id] = item; LotteryCFG.vec.push(item); } }; LotteryCFG.dict = {}; LotteryCFG.vec = []; return LotteryCFG; }()); exports.default = LotteryCFG; },{}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ //工具生成,请勿修改。 //配置文件名称:npc.xlsx。 //------------------------------------------------------------------------------ var NpcCFG = /** @class */ (function () { function NpcCFG() { } NpcCFG.initCfg = function (str) { var i = 0; var arr = str.split("\n"); var i = 0; for (i = 0; i < arr.length; i++) { var singleStr = arr[i]; var singleArr = singleStr.split("&"); if (NpcCFG.dict[singleArr[0]]) continue; var item = new NpcCFG(); item.id = Number(singleArr[0]); item.name = singleArr[1]; item.speed = Number(singleArr[2]); item.frontjump = JSON.parse(singleArr[3]); item.leftjump = JSON.parse(singleArr[4]); item.rightjump = JSON.parse(singleArr[5]); item.upclimb = Number(singleArr[6]); item.slideclimb = JSON.parse(singleArr[7]); item.jump_left = Number(singleArr[8]); item.jump_right = Number(singleArr[9]); item.start_ahead = Number(singleArr[10]); item.distance = Number(singleArr[11]); item.gravity = Number(singleArr[12]); NpcCFG.dict[item.id] = item; NpcCFG.vec.push(item); } }; NpcCFG.dict = {}; NpcCFG.vec = []; return NpcCFG; }()); exports.default = NpcCFG; },{}],14:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ //工具生成,请勿修改。 //配置文件名称:role.xlsx。 //------------------------------------------------------------------------------ var RoleCFG = /** @class */ (function () { function RoleCFG() { } RoleCFG.initCfg = function (str) { var i = 0; var arr = str.split("\n"); var i = 0; for (i = 0; i < arr.length; i++) { var singleStr = arr[i]; var singleArr = singleStr.split("&"); if (RoleCFG.dict[singleArr[0]]) continue; var item = new RoleCFG(); item.id = Number(singleArr[0]); item.name = singleArr[1]; item.speed = Number(singleArr[2]); item.frontjump = JSON.parse(singleArr[3]); item.leftjump = JSON.parse(singleArr[4]); item.rightjump = JSON.parse(singleArr[5]); item.upclimb = Number(singleArr[6]); item.slideclimb = JSON.parse(singleArr[7]); item.getState = Number(singleArr[8]); item.need = Number(singleArr[9]); item.icon = singleArr[10]; item.gravity = Number(singleArr[11]); item.rolename = singleArr[12]; RoleCFG.dict[item.id] = item; RoleCFG.vec.push(item); } }; RoleCFG.dict = {}; RoleCFG.vec = []; return RoleCFG; }()); exports.default = RoleCFG; },{}],15:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Global_1 = require("../Global"); /* * name; */ var AssetPath = /** @class */ (function () { function AssetPath() { } AssetPath.init = function () { AssetPath.versionrandom = "?v=" + Math.random(); }; AssetPath.getsound = function (id) { return Global_1.Global.getUrl(AssetPath.resources + AssetPath.music + id + ".mp3"); }; AssetPath.getResConfig = function () { return Global_1.Global.getUrl(AssetPath.resources + "resConfig.json"); }; AssetPath.getConfig = function (configname) { return Global_1.Global.getUrl(AssetPath.resources + configname + ".bin"); }; AssetPath.get3Dscene = function (name) { return Global_1.Global.getUrl(AssetPath.res + AssetPath.prop + "Conventional/" + name + ".ls"); }; AssetPath.get3DModel = function (name) { return Global_1.Global.getUrl(AssetPath.res + AssetPath.prop + "Conventional/" + name + ".lh"); }; AssetPath.get3DRoleModel = function (name) { return Global_1.Global.getUrl(AssetPath.res + "character/Conventional/" + name + ".lh"); }; AssetPath.getroleicon = function (id) { return Global_1.Global.getUrl(AssetPath.res + "skinicon/" + id + ".png"); }; AssetPath.getVerisonurl = function () { if (Global_1.Global.isdebug) { return Global_1.Global.getUrl(AssetPath.res + "version.json") + AssetPath.versionrandom; } return Global_1.Global.getUrl(AssetPath.res + "version" + Global_1.Global.resconfigVersion + ".json"); }; AssetPath.getGameVersion = function () { return Global_1.Global.getUrl("gameversion.json"); }; /**获取匹配人物头像icon */ AssetPath.pipeiicon = function (id) { return Global_1.Global.getUrl(AssetPath.res + "icon/" + id + ".png"); }; AssetPath.res = "res/"; AssetPath.resources = "resources/"; // export var configs:string = "configs/"; AssetPath.ui = "ui/"; AssetPath.subpacksgeui = "character/ui/"; AssetPath.music = "music/"; AssetPath.versionrandom = ""; AssetPath.prop = "prop/"; AssetPath.skinicon = "skinicon/"; return AssetPath; }()); exports.AssetPath = AssetPath; },{"../Global":41}],16:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AssetPath_1 = require("./AssetPath"); var Global_1 = require("../Global"); /* * name; */ var RecConfigs = /** @class */ (function (_super) { __extends(RecConfigs, _super); function RecConfigs() { var _this = _super.call(this) || this; RecConfigs.ins = _this; return _this; } Object.defineProperty(RecConfigs, "Instance", { get: function () { if (RecConfigs.ins == null) { return new RecConfigs(); } return RecConfigs.ins; }, enumerable: true, configurable: true }); RecConfigs.prototype.init = function () { this.ResDic = {}; }; /****************************************************************** */ RecConfigs.prototype.loadUI = function () { Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(this, function () { var changeActionButton = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", "正常模式")); changeActionButton.size(160, 40); changeActionButton.labelBold = true; changeActionButton.labelSize = 30; changeActionButton.sizeGrid = "4,4,4,4"; changeActionButton.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio); changeActionButton.pos(Laya.stage.width / 2 - changeActionButton.width * Laya.Browser.pixelRatio / 2, Laya.stage.height - 100 * Laya.Browser.pixelRatio); changeActionButton.on(Laya.Event.CLICK, this, function () { if (++this.curStateIndex % 2 == 1) { this.sprite3D.active = false; this.lineSprite3D.active = true; changeActionButton.label = "网格模式"; } else { this.sprite3D.active = true; this.lineSprite3D.active = false; changeActionButton.label = "正常模式"; } }); })); }; /****************************************************************** */ RecConfigs.prototype.initRec = function (_res) { if (_res != null && !RecConfigs.inited) { RecConfigs.inited = true; var groupsArr = _res.groups; var resourcesArr = _res.resources; var resourcesDict = {}; for (var item in resourcesArr) { var child = resourcesArr[item]; switch (child.type) { case "bin": child.type = Laya.Loader.BUFFER; break; case "ls": child.type = Laya.Scene; break; case "lh": child.type = Laya.Sprite3D; break; case "lm": child.type = Laya.MeshSprite3D; break; } resourcesDict[child.name] = child; } for (var grouptype in groupsArr) { var groupchild = groupsArr[grouptype]; var arr = groupchild.keys.split(","); var childArr = []; var chidstr; for (chidstr in arr) { var strChild = arr[chidstr]; if (strChild != "") { var urls = resourcesDict[strChild].url; urls = urls.replace("res/", AssetPath_1.AssetPath.res); childArr.push({ url: Global_1.Global.getUrl(urls), type: resourcesDict[strChild].type }); } } this.ResDic[groupchild.name] = childArr; } Laya.loader.clearRes(AssetPath_1.AssetPath.getResConfig()); } }; /** * 是否已经初始化 */ RecConfigs.inited = false; return RecConfigs; }(Laya.EventDispatcher)); exports.RecConfigs = RecConfigs; },{"../Global":41,"./AssetPath":15}],17:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AssetPath = /** @class */ (function () { function AssetPath() { } /*粒子特效地址*/ AssetPath.FxPrefabsPath = "res/character/FX/Conventional/FX.lh"; return AssetPath; }()); exports.AssetPath = AssetPath; var AssetManager = /** @class */ (function () { function AssetManager() { } /**加载资源*/ AssetManager.LoadAssetFun = function (fun) { var _this = this; var respaths = []; respaths = respaths.concat(AssetPath.FxPrefabsPath); Laya.loader.create(respaths, Laya.Handler.create(this, function () { var PlayerPrefabs = Laya.loader.getRes(AssetPath.FxPrefabsPath); if (PlayerPrefabs) { for (var i = 0; i < PlayerPrefabs.numChildren; i++) { var asset = PlayerPrefabs.getChildAt(i); asset.active = false; _this.AllMapDic.push(asset); } Laya.loader.clearRes(AssetPath.FxPrefabsPath); } else { console.log("PolicePrefabs为空"); } if (fun) { fun(); } else { console.log("fun为空"); } })); }; /**所有地图*/ AssetManager.AllMapDic = new Array(); return AssetManager; }()); exports.AssetManager = AssetManager; },{}],18:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AssetPath_1 = require("../Config/AssetPath"); /* * name; */ var AudioControl = /** @class */ (function (_super) { __extends(AudioControl, _super); function AudioControl() { var _this = _super.call(this) || this; _this._isbgOpen = true; _this.open = true; _this._isAllOpen = true; _this._nowBgName = ""; _this._isPlaybging = false; /** * 声音开关引用索引 */ _this._soundIndex = 0; AudioControl.ins = _this; return _this; } Object.defineProperty(AudioControl, "Instance", { get: function () { if (AudioControl.ins == null) { return new AudioControl(); } return AudioControl.ins; }, enumerable: true, configurable: true }); AudioControl.prototype.init = function () { Laya.SoundManager.autoReleaseSound = false; Laya.SoundManager.autoStopMusic = true; }; Object.defineProperty(AudioControl.prototype, "gamesoundOpen", { set: function (value) { this.open = value; Laya.SoundManager.soundMuted = !value; if (value == true) { fairygui.UIConfig.buttonSoundVolumeScale = 1; } else { fairygui.UIConfig.buttonSoundVolumeScale = 0; } }, enumerable: true, configurable: true }); Object.defineProperty(AudioControl.prototype, "GetSoundSwitch", { /** * 音效是否开启 */ get: function () { return this.open; }, enumerable: true, configurable: true }); Object.defineProperty(AudioControl.prototype, "isbgOpen", { /** * 背景音乐是否开启 */ get: function () { return this._isbgOpen; }, set: function (value) { this._isbgOpen = value; Laya.SoundManager.musicMuted = !value; }, enumerable: true, configurable: true }); Object.defineProperty(AudioControl.prototype, "isAllOpen", { /** * 所有音乐是否开启 */ get: function () { return this._isAllOpen; }, set: function (value) { if (value) { this._soundIndex--; if (this._soundIndex < 0) { this._soundIndex = 0; } if (!this._isPlaybging && this._soundIndex == 0) { this._isAllOpen = true; this.setGameVolume(1); this.playbgSound(this._nowBgName); fairygui.UIConfig.buttonSoundVolumeScale = 1; } else { this._isAllOpen = false; } } else { this._isAllOpen = false; if (this._soundIndex < 0) { this._soundIndex = 0; } this._soundIndex++; if (this._isPlaybging) { this.stopbgSound(); } this.setGameVolume(0); fairygui.UIConfig.buttonSoundVolumeScale = 0; } }, enumerable: true, configurable: true }); /** * 停止播放音效 */ AudioControl.prototype.stopGameSound = function () { Laya.SoundManager.stopAllSound(); }; /** * 停止所有声音 */ AudioControl.prototype.ClearAllSOUND = function () { this.stopGameSound(); this.stopbgSound(); }; /** * 播放背景音乐 * @param soundName 声音名 */ AudioControl.prototype.playbgSound = function (soundName) { this._nowBgName = soundName; if (this._isAllOpen && this._nowBgName != "" && this._soundIndex <= 0 && !this._isPlaybging) { this._isPlaybging = true; Laya.SoundManager.playMusic(AssetPath_1.AssetPath.getsound(this._nowBgName)); this.bgSoundVolume = 0.4; } }; /** * 停止背景音乐 */ AudioControl.prototype.stopbgSound = function () { this._isPlaybging = false; Laya.SoundManager.stopMusic(); }; Object.defineProperty(AudioControl.prototype, "bgSoundVolume", { get: function () { return Laya.SoundManager.musicVolume; }, /** * 设置背景音乐音量 * @param value 音量范围从 0(静音)至 1(最大音量)。 */ set: function (value) { Laya.SoundManager.setMusicVolume(value); }, enumerable: true, configurable: true }); Object.defineProperty(AudioControl.prototype, "soundVolume", { get: function () { return Laya.SoundManager.soundVolume; }, /** * 设置背景音乐音量 * @param value 音量范围从 0(静音)至 1(最大音量)。 */ set: function (value) { Laya.SoundManager.setSoundVolume(value); }, enumerable: true, configurable: true }); /** * 设置所有声音音量 * @param value 音量范围从 0(静音)至 1(最大音量)。 */ AudioControl.prototype.setGameVolume = function (value) { this.bgSoundVolume = value; this.soundVolume = value; }; /** * 播放音效 * @param soundName 音效名 * @param loop 播放次数 */ AudioControl.prototype.playGameSound = function (soundName, loop) { if (loop === void 0) { loop = 1; } if (this._isAllOpen && soundName != "" && Laya.SoundManager.soundVolume != 0) { Laya.SoundManager.playSound(AssetPath_1.AssetPath.getsound(soundName), loop); } }; return AudioControl; }(Laya.EventDispatcher)); exports.AudioControl = AudioControl; },{"../Config/AssetPath":15}],19:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ResourceControl_1 = require("./ResourceControl"); var SkinItem_1 = require("../utils/SkinItem"); var CpaDownsView_1 = require("../Push/CpaDownsView"); var CpaItem_1 = require("../Push/CpaItem"); var BaoKuanGameView_1 = require("../Push/BaoKuanGameView"); var ShiwantuijianView_1 = require("../Push/ShiwantuijianView"); /* * name; */ var ConnectControl = /** @class */ (function (_super) { __extends(ConnectControl, _super); function ConnectControl() { var _this = _super.call(this) || this; /****************************************************** */ _this.motionCross = false; _this.blendType = 0; _this.motionIndex = 0; _this.motions = ["run", "run_2", "attack", "attack_1", "attack_2", "dead", "idle_2", "idle_3", "idle_4", "idle4", "reload", "replace", "replace_2", "stop"]; return _this; } /** * 组件绑定 */ ConnectControl.ConnectComponent = function () { //main fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2pwlk1a", SkinItem_1.SkinItem); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c527", CpaDownsView_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c528", CpaItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c529", BaoKuanGameView_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52a", CpaItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52b", ShiwantuijianView_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52c", CpaItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc21", CpaItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc22", CpaItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52e", CpaItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2uotu6h", CpaItem_1.default); // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2ip616l", GiftView); // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52d", TuijianView); // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2kalr6k",FriendInviteView); }; ConnectControl.prototype.sceneLoaded = function (scene) { Laya.stage.addChild(scene); var animator = scene.getChildAt(2).getComponent(Laya.Animator); this.addButton(100, 100, 160, 30, "动画过渡:否", 20, function (e) { this.motionCross = !this.motionCross; if (this.motionCross) e.target.label = "动画过渡:是"; else e.target.label = "动画过渡:否"; }); this.addButton(100, 160, 160, 30, "混合模式:全身", 20, function (e) { this.blendType++; (this.blendType === 3) && (this.blendType = 0); switch (this.blendType) { case 0: e.target.label = "混合模式:全身"; break; case 1: e.target.label = "混合模式:上身"; break; case 2: e.target.label = "混合模式:下身"; break; } }); this.addButton(100, 220, 260, 40, "切换动作:attack_2", 28, function (e) { switch (this.blendType) { case 0: if (this.motionCross) { animator.crossFade(this.motions[this.motionIndex], 0.2, 0); animator.crossFade(this.motions[this.motionIndex], 0.2, 1); } else { animator.play(this.motions[this.motionIndex], 0); animator.play(this.motions[this.motionIndex], 1); } break; case 1: if (this.motionCross) animator.crossFade(this.motions[this.motionIndex], 0.2, 0); else animator.play(this.motions[this.motionIndex], 0); break; case 2: if (this.motionCross) animator.crossFade(this.motions[this.motionIndex], 0.2, 1); else animator.play(this.motions[this.motionIndex], 1); break; } e.target.label = "切换动作:" + this.motions[this.motionIndex]; this.motionIndex++; (this.motionIndex === this.motions.length) && (this.motionIndex = 0); }); }; ConnectControl.prototype.addButton = function (x, y, width, height, text, size, clickFun) { var thiss = this; Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(null, function () { var changeActionButton = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", text)); changeActionButton.size(width, height); changeActionButton.labelBold = true; changeActionButton.labelSize = size; changeActionButton.sizeGrid = "4,4,4,4"; changeActionButton.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio); changeActionButton.pos(x, y); changeActionButton.on(Laya.Event.CLICK, thiss, clickFun); })); }; /****************************************************** */ /** * 数据绑定 */ ConnectControl.Connnect = function () { this.ConnectFairygui(); this.ConnectComponent(); }; /** * ui框架的绑定 */ ConnectControl.ConnectFairygui = function () { fairygui.UIConfig.gameLoaderManager = ResourceControl_1.ResourceControl.Instance; //特效绑定( url 绑定组名,只有公共特效需要绑定 ) "ui://fqpgxr1kl6mw0":"effect1" fairygui.UIConfig.gameEffectDict = {}; }; return ConnectControl; }(Laya.EventDispatcher)); exports.ConnectControl = ConnectControl; },{"../Push/BaoKuanGameView":50,"../Push/CpaDownsView":52,"../Push/CpaItem":54,"../Push/ShiwantuijianView":56,"../utils/SkinItem":92,"./ResourceControl":28}],20:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LocalDataControl_1 = require("./LocalDataControl"); var TimeUtils_1 = require("../Time/TimeUtils"); var UserDataInfo_1 = require("../Data/UserDataInfo"); var TimesTamper_1 = require("../Time/TimesTamper"); var DateControl = /** @class */ (function () { function DateControl() { DateControl.ins = this; } Object.defineProperty(DateControl, "Instance", { get: function () { if (DateControl.ins == null) { return new DateControl(); } return DateControl.ins; }, enumerable: true, configurable: true }); /************************************************************** */ DateControl.prototype.loadUI = function () { Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(this, function () { var button = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", "关闭HDR")); button.size(200, 40); button.labelBold = true; button.labelSize = 30; button.sizeGrid = "4,4,4,4"; button.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio); button.pos(Laya.stage.width / 2 - button.width * Laya.Browser.pixelRatio / 2, Laya.stage.height - 60 * Laya.Browser.pixelRatio); button.on(Laya.Event.CLICK, this, function () { var enableHDR = this.camera.enableHDR; if (enableHDR) button.label = "开启HDR"; else button.label = "关闭HDR"; this.camera.enableHDR = !enableHDR; }); })); }; /************************************************ */ DateControl.prototype.SetSelf = function () { var lastday = LocalDataControl_1.LocalDataControl.Instance.getstr(UserDataInfo_1.UserDataInfo.lastDay); var nowday = TimeUtils_1.TimeUtils.formatYearMonthDate1(TimesTamper_1.TimesTamper.Instance.serverTime); if (lastday != nowday) { LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lastDay, nowday); DateControl.Fresh = true; } else { DateControl.Fresh = false; } }; return DateControl; }()); exports.DateControl = DateControl; },{"../Data/UserDataInfo":35,"../Time/TimeUtils":58,"../Time/TimesTamper":60,"./LocalDataControl":23}],21:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var JoystickModule_1 = require("../JoystickModule"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var GameState_1 = require("../utils/GameState"); var SceneControl_1 = require("../Control/SceneControl"); var PropManager_1 = require("../PrefabControl/PropManager"); var TimerService_1 = require("../Time/TimerService"); var GameCFG_1 = require("../CFG/GameCFG"); var AudioControl_1 = require("../Control/AudioControl"); var Sdk_1 = require("../WXSDK/Sdk"); var PanelResDic_1 = require("../PrefabControl/PanelResDic"); var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage"); var AgencyTrial_1 = require("../Agency/AgencyTrial"); var AgencySkin_1 = require("../Agency/AgencySkin"); var RecordManager_1 = require("../WXSDK/RecordManager"); var GameStateControl = /** @class */ (function () { function GameStateControl() { /** * 0:未开始,1:游戏中,2:暂停中 */ this.nowGameState = 0; this._zhuanxiangbeishu = 0; this._huadongSpeedX = 0; this._huadongClimbSpeedX = 0; this.endGamePlayerArr = []; this._isneedShunyiX = false; this._nowTime = 0; this._lastAngle = 0; this._time = 0; this.nowMingCi = 0; this._nums = 0; this._all = 0; GameStateControl.ins = this; } Object.defineProperty(GameStateControl, "Instance", { get: function () { if (GameStateControl.ins == null) { return new GameStateControl(); } return GameStateControl.ins; }, enumerable: true, configurable: true }); GameStateControl.prototype.init = function () { this._huadongSpeedX = Number(GameCFG_1.default.dict[4].value); this._huadongClimbSpeedX = Number(GameCFG_1.default.dict[5].value); if (GameCFG_1.default.dict[7]) { this._zhuanxiangbeishu = Number(GameCFG_1.default.dict[7].value); } else { this._zhuanxiangbeishu = 2; } this.initEvent(); }; GameStateControl.prototype.initEvent = function () { DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.lose, this, this.endGame); DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.end, this, this.endGame); DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.npcend, this, this.npcendGameHandler); }; GameStateControl.prototype.npcendGameHandler = function (str) { this.endGamePlayerArr.push(str); }; GameStateControl.prototype.setClickPanel = function (panel) { this._joystickModule = new JoystickModule_1.JoystickModule(panel); this._joystickModule.setEventCallback(this, this.ondownfun, this.onmovefun, this.onupfun); }; GameStateControl.prototype.ondownfun = function () { this._lastAngle = 0; this._nowTime = Laya.Browser.now() / 1000; }; GameStateControl.prototype.onmovefun = function (offsetX) { if (this.nowGameState == 1) { var disAngle = this._joystickModule.angle - this._lastAngle; this._lastAngle = this._joystickModule.angle; if (PropManager_1.PropManager.iscarmanpc) { PropManager_1.PropManager.npcscriptDict["npc_0"].Joy(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, disAngle * this._zhuanxiangbeishu); } else { SceneControl_1.SceneControl.Instance.PlayerScript.Joy(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, offsetX > 0 ? this._huadongClimbSpeedX : -this._huadongClimbSpeedX, disAngle * this._zhuanxiangbeishu); } } }; GameStateControl.prototype.onupfun = function () { if (PropManager_1.PropManager.iscarmanpc) { PropManager_1.PropManager.npcscriptDict["npc_0"].Joy(0, 0); } else { if (this.nowGameState == 1) { SceneControl_1.SceneControl.Instance.PlayerScript.Joy(0, 0, 0); } } }; GameStateControl.prototype.update = function (dt) { if (this.nowGameState == 1) { this._time = 0; var npcdict = PropManager_1.PropManager.npcscriptDict; this._nums = 0; this._all = 0; var s; var npcsp; for (s in npcdict) { npcsp = npcdict[s]; if (npcsp.getAction() == 1) { if (PropManager_1.PropManager.mainRole.transform.position.z < npcsp.getPostion().z) { this._nums++; } this._all++; } } this.nowMingCi = this.endGamePlayerArr.length + ((this._all + 1) - this._nums); PropManager_1.PropManager.txt_mingci.text = "第" + this.nowMingCi + "名"; } }; GameStateControl.prototype.startGame = function () { var RoleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData; var agencyskin = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencySkin_1.AgencySkin); var nohasskinArr = agencyskin.GainNoHaveSkin(); if (nohasskinArr.length == 0) { this.entergame(); } else { PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyTrial_1.AgencyTrial).openview(nohasskinArr); } }; GameStateControl.prototype.entergame = function (jiasu) { RecordManager_1.RecordManager.Instance.RecordStart(); this.nowMingCi = 0; this.endGamePlayerArr.length = 0; this.nowGameState = 1; TimerService_1.TimerService.Instance.addUpdateTarget(this); this.update(500); if (jiasu) { DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.start, jiasu); } else { DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.start); } AudioControl_1.AudioControl.Instance.playbgSound("bgm"); Sdk_1.WxApi.recordAldEvent("主界面点击开始游戏..."); }; GameStateControl.prototype.stopGame = function () { this.nowGameState = 2; this.onupfun(); }; GameStateControl.prototype.endGame = function () { if (PropManager_1.PropManager.jiantouArr && PropManager_1.PropManager.jiantouArr.length > 0) { var arr = PropManager_1.PropManager.jiantouArr; for (var i = arr.length - 1; i >= 0; i--) { arr[i].destroy(); arr.splice(i, 1); } } PropManager_1.PropManager.jiantouArr.length = 0; this.nowGameState = 0; TimerService_1.TimerService.Instance.removeUpdateTarget(this); var npcdict = PropManager_1.PropManager.npcscriptDict; if (npcdict) { for (var s in npcdict) { npcdict[s].stop(); } } this.onupfun(); AudioControl_1.AudioControl.Instance.stopbgSound(); }; return GameStateControl; }()); exports.GameStateControl = GameStateControl; },{"../Agency/AgencySkin":6,"../Agency/AgencyTrial":7,"../Agency/AgencyUserMessage":8,"../CFG/GameCFG":10,"../Control/AudioControl":18,"../Control/SceneControl":29,"../JoystickModule":43,"../PrefabControl/PanelResDic":48,"../PrefabControl/PropManager":49,"../Time/TimerService":59,"../WXSDK/RecordManager":76,"../WXSDK/Sdk":77,"../utils/DispatcherManager":85,"../utils/GameState":86}],22:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Global_1 = require("../Global"); var LayOUT_1 = require("../utils/LayOUT"); /* * name; */ var LayoutControl = /** @class */ (function (_super) { __extends(LayoutControl, _super); function LayoutControl() { var _this = _super.call(this) || this; _this._uilayerZorder = 0; _this._upuilayerZorder = 200; _this._tipslayerZorder = 1000; _this._guidelayerZorder = 600; /** * ui层 */ _this.uiLayer = new fairygui.GComponent(); /** * 最定层 */ _this.topLayer = new fairygui.GComponent(); /** * 背景层( 或者3D场景层 ) */ _this.background = new fairygui.GComponent(); _this._position = new Laya.Vector3(); _this._outPos = new Laya.Vector3(); _this.scaleDelta = 0; LayoutControl.ins = _this; return _this; } Object.defineProperty(LayoutControl, "Instance", { get: function () { if (LayoutControl.ins == null) { return new LayoutControl(); } return LayoutControl.ins; }, enumerable: true, configurable: true }); LayoutControl.prototype.AddLayerByName = function (itemview, layer) { if (layer == LayOUT_1.LayOUT.BG) { LayoutControl.Instance.background.addChild(itemview); } else if (layer == LayOUT_1.LayOUT.UI) { this._uilayerZorder++; LayoutControl.Instance.uiLayer.addChild(itemview); itemview.sortingOrder = this._uilayerZorder; } else if (layer == LayOUT_1.LayOUT.UITop) { this._upuilayerZorder++; LayoutControl.Instance.uiLayer.addChild(itemview); itemview.sortingOrder = this._upuilayerZorder; } else if (layer == LayOUT_1.LayOUT.TIP) { // GameLayerManager.Instance.tipsLayer.addChild(itemview); this._tipslayerZorder++; LayoutControl.Instance.uiLayer.addChild(itemview); itemview.sortingOrder = this._tipslayerZorder; } else if (layer == LayOUT_1.LayOUT.GUIDE) { this._guidelayerZorder++; LayoutControl.Instance.uiLayer.addChild(itemview); itemview.sortingOrder = this._guidelayerZorder; } }; //初始化层级 LayoutControl.prototype.initlayer = function () { Global_1.Global.stage.addChild(fairygui.GRoot.inst.displayObject); fairygui.GRoot.inst.addChild(this.background); fairygui.GRoot.inst.addChild(this.uiLayer); fairygui.GRoot.inst.addChild(this.topLayer); }; LayoutControl.prototype.addHorizontalBox = function (x, y, z) { var box = this.scene.addChild(new Laya.MeshSprite3D(this.mesh2)); box.meshRenderer.material = this.mat1; box.meshRenderer.castShadow = true; box.meshRenderer.receiveShadow = true; this.tmpVector.setValue(x, y, z); box.transform.position = this.tmpVector; var rigidBody = box.addComponent(Laya.Rigidbody3D); rigidBody.mass = 10; rigidBody.friction = 1.0; rigidBody.restitution = 0.2; var boxShape = new Laya.BoxColliderShape(2, 0.33, 0.5); rigidBody.colliderShape = boxShape; }; /************************************************ */ LayoutControl.prototype.ClearLayerByName = function (layer) { switch (layer) { case LayOUT_1.LayOUT.UI: this._uilayerZorder--; if (this._uilayerZorder < 0) { this._uilayerZorder = 0; } break; case LayOUT_1.LayOUT.UITop: this._upuilayerZorder--; if (this._upuilayerZorder < 200) { this._upuilayerZorder = 200; } break; case LayOUT_1.LayOUT.TIP: this._tipslayerZorder--; if (this._tipslayerZorder < 1000) { this._tipslayerZorder = 1000; } break; case LayOUT_1.LayOUT.GUIDE: this._tipslayerZorder--; if (this._tipslayerZorder < 600) { this._tipslayerZorder = 600; } break; } }; LayoutControl.prototype.onComplete = function () { //加载三维地面 var grid = this.scene.addChild(Laya.Loader.getRes("res/threeDimen/staticModel/grid/plane.lh")); //加载二维猴子 this.layaMonkey2D = Laya.stage.addChild(new Laya.Image("res/threeDimen/monkey.png")); //开启定时器循环 Laya.timer.frameLoop(1, this, this.animate); }; LayoutControl.prototype.animate = function () { //变换位置 this._position.x = Math.sin(this.scaleDelta += 0.01); //计算位置 this.camera.viewport.project(this._position, this.camera.projectionViewMatrix, this._outPos); this.layaMonkey2D.pos(this._outPos.x / Laya.stage.clientScaleX, this._outPos.y / Laya.stage.clientScaleY); }; return LayoutControl; }(Laya.EventDispatcher)); exports.LayoutControl = LayoutControl; },{"../Global":41,"../utils/LayOUT":90}],23:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Global_1 = require("../Global"); var PlatfromType_1 = require("../WXSDK/PlatfromType"); /* * 本地数据缓存管理器 */ var LocalDataControl = /** @class */ (function (_super) { __extends(LocalDataControl, _super); function LocalDataControl() { var _this = _super.call(this) || this; LocalDataControl.ins = _this; return _this; } Object.defineProperty(LocalDataControl, "Instance", { get: function () { if (LocalDataControl.ins == null) { return new LocalDataControl(); } return LocalDataControl.ins; }, enumerable: true, configurable: true }); LocalDataControl.prototype.init = function () { }; /** * 添加本地缓存数据 object * @param key * @param value */ LocalDataControl.prototype.AddData = function (key, value) { this.AddLocalData(key, value); }; /** * 获取本地缓存数据 object * @param key */ LocalDataControl.prototype.getObj = function (key) { return this.GetLocalCaCheData(key); }; /** * 添加本地缓存数据 string * @param key * @param value */ LocalDataControl.prototype.addstr = function (key, value) { this.addCacheStr(key, value); }; LocalDataControl.prototype.addnum = function (key, value) { this.addCacheStr(key, value.toString()); }; /** * 获取本地缓存数据 string * @param key */ LocalDataControl.prototype.getstr = function (key) { return this.getCachestr(key); }; /** * 获取本地缓存数据 number * @param key */ LocalDataControl.prototype.getnum = function (key) { return Number(this.getCachestr(key)); }; /** * 清理指定本地缓存数据 * @param key */ LocalDataControl.prototype.removeCache = function (key) { this.removeselectCache(key); }; /** * 清理所有本地缓存数据 */ LocalDataControl.prototype.clearAll = function () { this.clearAllCache(); }; LocalDataControl.prototype.AddLocalData = function (key, value) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: this.setStorageSyncWX(key, value); break; default: Laya.LocalStorage.setJSON(key, value); break; } }; LocalDataControl.prototype.GetLocalCaCheData = function (key) { var obj; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: obj = this.getStorageSyncWX(key); break; default: obj = Laya.LocalStorage.getJSON(key); break; } if (!obj) { obj = {}; } return obj; }; LocalDataControl.prototype.addCacheStr = function (key, value) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: this.setStorageSyncWX(key, value); break; default: Laya.LocalStorage.setItem(key, value); break; } }; LocalDataControl.prototype.getCachestr = function (key) { var str = "0"; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: str = this.getStorageSyncWX(key); break; default: str = Laya.LocalStorage.getItem(key); break; } if (str == null || str == "") { str = "0"; } return str; }; LocalDataControl.prototype.removeselectCache = function (key) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: this.removeStorageWX(key); break; default: Laya.LocalStorage.removeItem(key); break; } }; LocalDataControl.prototype.clearAllCache = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: this.clearStorageWX(); break; default: Laya.LocalStorage.clear(); break; } }; /** * 本地存储 * @param key * @param data */ LocalDataControl.prototype.setStorageSyncWX = function (key, data) { var wx = Laya.Browser.window.wx; if (wx) { wx.setStorageSync(key, data); } }; /** * 获取本地存储 * @param key */ LocalDataControl.prototype.getStorageSyncWX = function (key) { var wx = Laya.Browser.window.wx; if (wx) { return wx.getStorageSync(key); } return null; }; /** * 从本地缓存中移除指定 key * @param key */ LocalDataControl.prototype.removeStorageWX = function (key) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.removeStorage(key); } }; /** * 清理存储数据 */ LocalDataControl.prototype.clearStorageWX = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.clearStorageSync(); } }; return LocalDataControl; }(Laya.EventDispatcher)); exports.LocalDataControl = LocalDataControl; },{"../Global":41,"../WXSDK/PlatfromType":74}],24:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ResDataControl_1 = require("../Control/ResDataControl"); var ResourceControl_1 = require("../Control/ResourceControl"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var PanelResDic_1 = require("../PrefabControl/PanelResDic"); var ViewAction_1 = require("../utils/ViewAction"); var ViewManager_1 = require("../View/ViewManager"); var ComponentEventData_1 = require("../Data/ComponentEventData"); var GamePool_1 = require("../PrefabControl/GamePool"); /* * name; */ var PanelBaseControl = /** @class */ (function (_super) { __extends(PanelBaseControl, _super); /** * 界面初始化 * @param pkgName 包名 * @param resName 界面名 * @param isAddpackage 是否添加包 * @param ActionType 界面打开动画类型 * @param clickBgIsColse 黑色背景 0:无背景 1:背景无关闭事件 2:背景有关闭事件 * @param iscache 是否添加到缓存池(如是为true,则加入进缓存池定时根据是否引用清理。 若是为false,则不清理当前缓存,如若清理,请手动清理 ) */ function PanelBaseControl(pkgName, resName, isAddpackage, ActionType, clickBgIsColse, iscache) { if (pkgName === void 0) { pkgName = ""; } if (resName === void 0) { resName = ""; } if (isAddpackage === void 0) { isAddpackage = false; } if (ActionType === void 0) { ActionType = ViewAction_1.ViewAction.ActionType_none; } if (clickBgIsColse === void 0) { clickBgIsColse = 0; } if (iscache === void 0) { iscache = true; } var _this = _super.call(this) || this; _this.isguideing = false; _this.PackageName = ""; _this.ResourcesName = ""; _this._iscache = true; _this._ActionType = ViewAction_1.ViewAction.ActionType_none; _this._clickBgIsColse = 0; /** * 事件容器 */ _this.EventResDic = {}; /** * 全局事件容器 */ _this.EventGlobal = {}; _this._iscache = iscache; _this.PackageName = pkgName; _this.ResourcesName = resName; _this._isAddpackage = isAddpackage; _this._ActionType = ActionType; _this._clickBgIsColse = clickBgIsColse; _this.showModalWait(); return _this; } PanelBaseControl.prototype.ResolveUI = function (pkgname, resname, isaddpackage, ActionType, clickBgIsColse, iscache) { if (ActionType === void 0) { ActionType = ViewAction_1.ViewAction.ActionType_none; } if (clickBgIsColse === void 0) { clickBgIsColse = 0; } if (iscache === void 0) { iscache = true; } this.PackageName = pkgname; this.ResourcesName = resname; this._ActionType = ActionType; this._clickBgIsColse = clickBgIsColse; ResDataControl_1.ResDataControl.Instance.AddViewPackByName(pkgname, isaddpackage, iscache); this.contentPane = fairygui.UIPackage.createObject(pkgname, resname).asCom; for (var str in this.contentPane._children) { var item = this.contentPane._children[str]; if (item.name == "item_panel") { var itempanel = item; if (itempanel) { for (var str1 in itempanel._children) { var itempanelItem = itempanel._children[str1]; this[itempanelItem.name] = itempanelItem; } } // this[item.name] = item; this.item_panel = item; } else { this[item.name] = item; } } this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height); this.contentPane.setPivot(0.5, 0.5); this.setPivot(0.5, 0.5); this.setclickBgIsColse(); this.initView(); this.initEvent(); this.ShowViewACTION(); }; /** * 加载ui * @param groupName 组名 * @param target 作用域 * @param onLoadedHandler 加载完成回调函数 */ PanelBaseControl.prototype.LoadViewUI = function (groupName, target, onLoadedHandler) { this._loadTarget = target; this._onLoadedHandler = onLoadedHandler; ResourceControl_1.ResourceControl.Instance.loadGroup(groupName, this, this.LoadComplete); }; /******************************************************************* */ PanelBaseControl.prototype.createLabel = function (color, strokeColor) { var STROKE_WIDTH = 4; var label = new Laya.Label(); label.font = "Microsoft YaHei"; label.text = "SAMPLE DEMO"; label.fontSize = 30; label.color = color; if (strokeColor) { label.stroke = STROKE_WIDTH; label.strokeColor = strokeColor; } Laya.stage.addChild(label); return label; }; /****************************************************************** */ /** * 加载资源数组 * @param urls 资源数组 * @param target 作用域 * @param onLoadedHandler 加载完成回调函数 */ PanelBaseControl.prototype.loadUibyArr = function (urls, target, onLoadedHandler) { // this.showModalWait(); this._loadTarget = target; this._onLoadedHandler = onLoadedHandler; ResourceControl_1.ResourceControl.Instance.Loaders(urls, this, this.LoadComplete); }; /********************************************************************* */ PanelBaseControl.prototype.createRadioGroup = function (skin) { var rg = new Laya.RadioGroup(); rg.skin = skin; rg.space = 70; rg.direction = "v"; rg.labels = "Item1, Item2, Item3"; rg.labelColors = "#787878,#d3d3d3,#FFFFFF"; rg.labelSize = 20; rg.labelBold = true; rg.labelPadding = "5,0,0,5"; rg.selectHandler = new Laya.Handler(this, this.onSelectChange); Laya.stage.addChild(rg); return rg; }; PanelBaseControl.prototype.onSelectChange = function (index) { console.log("你选择了第 " + (index + 1) + " 项"); }; /********************************************************************* */ PanelBaseControl.prototype.LoadComplete = function () { if (this._loadTarget && this._onLoadedHandler) { this._onLoadedHandler.call(this._loadTarget); } }; PanelBaseControl.prototype.removeEffectPackage = function (packageName) { ResDataControl_1.ResDataControl.Instance.ClearPackByName(packageName, true); }; PanelBaseControl.prototype.getpanelController = function (name) { if (this.item_panel) { return this.item_panel.getController(name); } return null; }; /************************************************************ */ PanelBaseControl.prototype.setup = function () { this.createLabel("#FFFFFF", null).pos(30, 50); this.createLabel("#00FFFF", null).pos(290, 50); this.createLabel("#FFFF00", "#FFFFFF").pos(30, 100); this.createLabel("#000000", "#FFFFFF").pos(290, 100); this.createLabel("#FFFFFF", "#00FFFF").pos(30, 150); this.createLabel("#0080FF", "#00FFFF").pos(290, 150); }; /************************************************************ */ PanelBaseControl.prototype.getpanelTransition = function (name) { if (this.item_panel) { return this.item_panel.getTransition(name); } return null; }; PanelBaseControl.prototype.getChildformContentPanel = function (name) { if (this.contentPane) { return this.contentPane.getChild(name); } return null; }; /*界面初始化*/ PanelBaseControl.prototype.onInit = function () { _super.prototype.onInit.call(this); if (this.PackageName != "" && this.ResourcesName != "") { this.ResolveUI(this.PackageName, this.ResourcesName, this._isAddpackage, this._ActionType, this._clickBgIsColse, this._iscache); } }; //解析ui PanelBaseControl.prototype.initView = function () { }; PanelBaseControl.prototype.initEvent = function () { }; PanelBaseControl.prototype.ShowViewACTION = function () { switch (this._ActionType) { case ViewAction_1.ViewAction.ActionType_none: this.windowanmoend(); break; case ViewAction_1.ViewAction.ActionType_addmoveToMiddle: this.contentPane.x = fairygui.GRoot.inst.width; Laya.Tween.to(this.contentPane, { x: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend)); break; case ViewAction_1.ViewAction.ActionType_addmoveFromBottom: this.contentPane.y = fairygui.GRoot.inst.height; Laya.Tween.to(this.contentPane, { y: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend)); break; case ViewAction_1.ViewAction.ActionType_addscaleMinToMax: this.contentPane.scaleX = this.contentPane.scaleY = 0.01; Laya.Tween.to(this.contentPane, { scaleX: 1, scaleY: 1 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend)); break; } }; /******************************************************** */ PanelBaseControl.prototype.createCheckBox = function (skin) { var cb = new Laya.CheckBox(skin); Laya.stage.addChild(cb); cb.labelColors = "white"; cb.labelSize = 20; cb.labelFont = "Microsoft YaHei"; cb.labelPadding = "3,0,0,5"; return cb; }; PanelBaseControl.prototype.updateLabel = function (checkBox) { checkBox.label = checkBox.selected ? "已选中" : "未选中"; }; /******************************************************** */ PanelBaseControl.prototype.windowanmoend = function () { Laya.timer.callLater(this, this.onShowView); }; PanelBaseControl.prototype.onShowView = function () { this.closeModalWait(); this.showClickBg(); }; PanelBaseControl.prototype.showClickBg = function () { if (this._clickBg) { this._clickBg.alpha = 0.55; if (this._clickBgIsColse == 2 && !this.hasClickListener()) { this._clickBg.onClick(this, this.ClickExitView); } } }; /**点击关闭页面按钮 */ PanelBaseControl.prototype.ClickExitView = function () { ViewManager_1.ViewManager.Instance.close(this.viewKey, true); }; /*获取管理数据模块*/ PanelBaseControl.prototype.getProxy = function (d) { return PanelResDic_1.PanelResDic.Instance.getSingleTon(d); }; /** * 界面关闭事件 */ PanelBaseControl.prototype.ExitView = function (ActionType) { if (ActionType === void 0) { ActionType = ""; } if (this._clickBg) { this._clickBg.visible = false; } if (ActionType == "") { switch (this._ActionType) { case ViewAction_1.ViewAction.ActionType_none: this.destory(); break; case ViewAction_1.ViewAction.ActionType_addmoveToMiddle: Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory)); break; case ViewAction_1.ViewAction.ActionType_addmoveFromBottom: Laya.Tween.to(this, { y: fairygui.GRoot.inst.height }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory)); break; case ViewAction_1.ViewAction.ActionType_addscaleMinToMax: Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory)); break; } } else { switch (ActionType) { case ViewAction_1.ViewAction.ActionType_none: this.destory(); break; case ViewAction_1.ViewAction.ActionType_removescaleMaxToMin: Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory)); break; case ViewAction_1.ViewAction.ActionType_removemoveToRight: Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory)); break; } } }; PanelBaseControl.prototype.getTransitionByName = function (id) { return this.contentPane.getTransition(id); }; /**注册事件 */ PanelBaseControl.prototype.dispacheDatatrigger = function (type, data) { if (data === void 0) { data = null; } DispatcherManager_1.DispatcherManager.dispatchEvent(type, data); }; /** * 注册全局事件 * @param type * @param thisObject * @param listener */ PanelBaseControl.prototype.addDataEvent = function (type, thisObject, listener) { if (!this.EventGlobal.hasOwnProperty(type)) { var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue); this.EventGlobal[type] = vo; vo.type = type; vo.thisObject = thisObject; vo.listener = listener; DispatcherManager_1.DispatcherManager.addEventListener(type, thisObject, listener); } }; /** * 移除全局事件 * @param type * @param thisObject * @param listener */ PanelBaseControl.prototype.ClearEventData = function (type, thisObject, listener) { if (this.EventGlobal[type]) { var vo = this.EventGlobal[type]; DispatcherManager_1.DispatcherManager.removeEventListener(type, thisObject, listener); vo.clear(); delete this.EventGlobal[type]; } }; /** * 移除组件事件 * @param type 时间类型 * @param callbackobj 作用域 * @param callbackHandler 事件回调 */ PanelBaseControl.prototype.ClearEventByType = function (target, type, thisObject, listener) { if (target && this.EventResDic[target.name]) { var arr = this.EventResDic[target.name]; var i = 0; var nums = arr.length; var vo; for (i; i < nums; i++) { vo = arr[i]; if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) { target.off(type, thisObject, listener); vo.clear(); arr.splice(i, 1); break; } } } }; /** * 注册组件事件,调用此方法,界面关闭会自动移除 * @param type 时间类型 * @param callbackobj 作用域 * @param callbackHandler 事件回调 */ PanelBaseControl.prototype.AddEventByType = function (target, type, thisObject, listener, args) { if (args === void 0) { args = null; } if (target) { if (target.name == null || target.name == "") { throw "baseview addListener target.name is null"; } var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue); vo.target = target; vo.type = type; vo.thisObject = thisObject; vo.listener = listener; if (!this.EventResDic.hasOwnProperty(target.name)) { this.EventResDic[target.name] = []; } var bo = this.JudgeIsHaveEvent(target, type); if (!bo) { target.on(type, thisObject, listener, args); this.EventResDic[target.name].push(vo); } } }; /**判断是否含有事件 */ PanelBaseControl.prototype.JudgeIsHaveEvent = function (target, type) { var eventArr; eventArr = this.EventResDic[target.name]; var childvo; for (var s in eventArr) { childvo = eventArr[s]; if (childvo && childvo.type == type) { return true; } } return false; }; PanelBaseControl.prototype.getComById = function (id) { return this.contentPane.getChild(id).asCom; }; PanelBaseControl.prototype.getControllerByBame = function (id) { return this.contentPane.getController(id); }; /** * 移除所有组件事件 */ PanelBaseControl.prototype.ClearEvent = function () { if (this.EventResDic) { var s; var dict = this.EventResDic; var arr; var i; var nums = 0; var vo; for (s in dict) { arr = dict[s]; if (arr && arr.length > 0) { i = 0; nums = arr.length; for (i = nums - 1; i >= 0; i--) { vo = arr[i]; if (vo) { if (vo.target) { vo.target.off(vo.type, vo.thisObject, vo.listener); } vo.clear(); } arr.splice(i, 1); } } delete this.EventResDic[s]; } } this.EventResDic = {}; }; PanelBaseControl.prototype.clearEvent = function () { }; /* 销毁*/ PanelBaseControl.prototype.destory = function () { this.clearEvent(); this.closeModalWait(); this.ClearGlobalEvent(); this.ClearEvent(); this._loadTarget = null; this._onLoadedHandler = null; Laya.Tween.clearTween(this); ResDataControl_1.ResDataControl.Instance.ClearPackByName(this.PackageName, false); this.PackageName = null; this.ResourcesName = null; if (this._clickBg) { this._clickBg.offClick(this, this.ClickExitView); this._clickBg.dispose(); this._clickBg = null; } this.viewKey = null; this.dispose(); }; PanelBaseControl.prototype.setclickBgIsColse = function () { if (this.isShowing && this._clickBgIsColse > 0 && this.contentPane) { if (!this._clickBg && PanelBaseControl.viewbgUrl != "") { this._clickBg = new fairygui.GLoader(); this._clickBg.touchable = true; this._clickBg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height); this._clickBg.url = PanelBaseControl.viewbgUrl; this._clickBg.fill = fairygui.LoaderFillType.ScaleFree; this._clickBg.alpha = 0; this.contentPane.addChildAt(this._clickBg, 0); } } }; /** * 移除所有全局事件 */ PanelBaseControl.prototype.ClearGlobalEvent = function () { if (this.EventGlobal) { var s; var dict = this.EventGlobal; for (s in dict) { var vo = dict[s]; if (vo) { this.ClearEventData(vo.type, vo.thisObject, vo.listener); } } } this.EventGlobal = {}; }; PanelBaseControl.viewbgUrl = ""; return PanelBaseControl; }(fairygui.Window)); exports.PanelBaseControl = PanelBaseControl; },{"../Control/ResDataControl":27,"../Control/ResourceControl":28,"../Data/ComponentEventData":30,"../PrefabControl/GamePool":47,"../PrefabControl/PanelResDic":48,"../View/ViewManager":70,"../utils/DispatcherManager":85,"../utils/ViewAction":93}],25:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var DispatcherManager_1 = require("../utils/DispatcherManager"); var PanelResDic_1 = require("../PrefabControl/PanelResDic"); var ComponentEventData_1 = require("../Data/ComponentEventData"); var GamePool_1 = require("../PrefabControl/GamePool"); var PanelChildControl = /** @class */ (function (_super) { __extends(PanelChildControl, _super); function PanelChildControl() { var _this = _super.call(this) || this; /** * 事件容器 */ _this.EventResDic = {}; /** * 全局事件容器 */ _this.EventGlobal = {}; /******************************************** */ _this.DIALOG_WIDTH = 220; _this.DIALOG_HEIGHT = 275; _this.CLOSE_BTN_WIDTH = 43; _this.CLOSE_BTN_PADDING = 5; return _this; } /** * 移除所有组件事件 */ PanelChildControl.prototype.ClearEvent = function () { if (this.EventResDic) { var s; var dict = this.EventResDic; var arr; var i; var nums = 0; var vo; for (s in dict) { arr = dict[s]; if (arr && arr.length > 0) { i = 0; nums = arr.length; for (i = nums - 1; i >= 0; i--) { vo = arr[i]; if (vo) { if (vo.target) { vo.target.off(vo.type, vo.thisObject, vo.listener); } vo.clear(); } arr.splice(i, 1); } } delete this.EventResDic[s]; } } this.EventResDic = {}; }; PanelChildControl.prototype.dispose = function () { this.ClearGlobalEvent(); this.ClearEvent(); _super.prototype.dispose.call(this); }; PanelChildControl.prototype.constructFromXML = function (xml) { _super.prototype.constructFromXML.call(this, xml); for (var str in this._children) { var item = this._children[str]; this[item.name] = item; } this.onInit(); }; PanelChildControl.prototype.onInit = function () { }; /*获取管理数据模块*/ PanelChildControl.prototype.getProxy = function (d) { return PanelResDic_1.PanelResDic.Instance.getSingleTon(d); }; PanelChildControl.prototype.dispacheDatatrigger = function (type, data) { if (data === void 0) { data = null; } DispatcherManager_1.DispatcherManager.dispatchEvent(type, data); }; PanelChildControl.prototype.hasDataEvent = function (type) { return DispatcherManager_1.DispatcherManager.hasEventListener(type); }; /** * 注册全局事件 * @param type * @param thisObject * @param listener */ PanelChildControl.prototype.AddEventData = function (type, thisObject, listener) { if (!this.EventGlobal.hasOwnProperty(type)) { var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue); this.EventGlobal[type] = vo; vo.type = type; vo.thisObject = thisObject; vo.listener = listener; DispatcherManager_1.DispatcherManager.addEventListener(type, thisObject, listener); } }; PanelChildControl.prototype.onSkinLoadComplete = function () { var dialog = new Laya.Dialog(); var bg = new Laya.Image(this.assets[0]); dialog.addChild(bg); var button = new Laya.Button(this.assets[1]); // button.name = Dialog.CLOSE; button.pos(this.DIALOG_WIDTH - this.CLOSE_BTN_WIDTH - this.CLOSE_BTN_PADDING, this.CLOSE_BTN_PADDING); dialog.addChild(button); dialog.dragArea = "0,0," + this.DIALOG_WIDTH + "," + this.DIALOG_HEIGHT; dialog.show(); }; /******************************************** */ /** * 移除全局事件 * @param type * @param thisObject * @param listener */ PanelChildControl.prototype.removeDataEvent = function (type, thisObject, listener) { if (this.EventGlobal[type]) { var vo = this.EventGlobal[type]; DispatcherManager_1.DispatcherManager.removeEventListener(type, thisObject, listener); vo.clear(); delete this.EventGlobal[type]; } }; /** * 注册组件事件,调用此方法,界面关闭会自动移除 * @param type 时间类型 * @param callbackobj 作用域 * @param callbackHandler 事件回调 */ PanelChildControl.prototype.AddEventByType = function (target, type, thisObject, listener, args) { if (args === void 0) { args = null; } if (target) { if (target.name == null || target.name == "") { throw "childbaseview addListener target.name is null"; } var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue); vo.target = target; vo.type = type; vo.thisObject = thisObject; vo.listener = listener; if (!this.EventResDic.hasOwnProperty(target.name)) { this.EventResDic[target.name] = []; } var bo = this.JudgeIsHaveEvent(target, type); if (!bo) { target.on(type, thisObject, listener, args); this.EventResDic[target.name].push(vo); } } }; PanelChildControl.prototype.JudgeIsHaveEvent = function (target, type) { var eventArr; eventArr = this.EventResDic[target.name]; var childvo; for (var s in eventArr) { childvo = eventArr[s]; if (childvo && childvo.type == type) { return true; } } return false; }; /** * 移除组件事件 * @param type 时间类型 * @param callbackobj 作用域 * @param callbackHandler 事件回调 */ PanelChildControl.prototype.ClearEventByType = function (target, type, thisObject, listener) { if (target && this.EventResDic[target.name]) { var arr = this.EventResDic[target.name]; var i = 0; var nums = arr.length; var vo; for (i; i < nums; i++) { vo = arr[i]; if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) { target.off(type, thisObject, listener); vo.clear(); arr.splice(i, 1); break; } } } }; /** * 移除所有全局事件 */ PanelChildControl.prototype.ClearGlobalEvent = function () { if (this.EventGlobal) { var s; var dict = this.EventGlobal; for (s in dict) { var vo = dict[s]; if (vo) { this.removeDataEvent(vo.type, vo.thisObject, vo.listener); } } } this.EventGlobal = {}; }; /***************************************************** */ PanelChildControl.prototype.placeHScroller = function () { var hs = new Laya.HScrollBar(); hs.skin = "res/ui/hscroll.png"; hs.width = 300; hs.pos(50, 170); hs.min = 0; hs.max = 100; hs.changeHandler = new Laya.Handler(this, this.onChange); Laya.stage.addChild(hs); }; PanelChildControl.prototype.placeVScroller = function () { var vs = new Laya.VScrollBar(); vs.skin = "res/ui/vscroll.png"; vs.height = 300; vs.pos(400, 50); vs.min = 0; vs.max = 100; vs.changeHandler = new Laya.Handler(this, this.onChange); Laya.stage.addChild(vs); }; PanelChildControl.prototype.onChange = function (value) { console.log("滚动条的位置: value=" + value); }; return PanelChildControl; }(fairygui.GComponent)); exports.PanelChildControl = PanelChildControl; },{"../Data/ComponentEventData":30,"../PrefabControl/GamePool":47,"../PrefabControl/PanelResDic":48,"../utils/DispatcherManager":85}],26:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PoolManager = /** @class */ (function () { function PoolManager() { PoolManager.PoolManagerInstance = this; } Object.defineProperty(PoolManager, "Instance", { get: function () { if (PoolManager.PoolManagerInstance) { return PoolManager.PoolManagerInstance; } else { var instance = new PoolManager(); return instance; } }, enumerable: true, configurable: true }); PoolManager.GetSprite3D = function (_obj) { var objName = _obj.name; if (this.Sprite3DDic[objName] != null && this.Sprite3DDic[objName] != undefined) { if (this.Sprite3DDic[objName].length > 0) { var obj = this.Sprite3DDic[objName][0]; if (!obj || obj.destroyed) obj = Laya.Sprite3D.instantiate(_obj); this.Sprite3DDic[objName].splice(0, 1); // obj.transform.position = _obj.transform.position.clone(); // obj.transform.rotation = _obj.transform.rotation.clone(); obj.transform.scale = _obj.transform.scale.clone(); obj.active = true; return obj; } else { var newobj = Laya.Sprite3D.instantiate(_obj); newobj.active = true; return newobj; } } else { var newobj = Laya.Sprite3D.instantiate(_obj); newobj.active = true; return newobj; } }; PoolManager.RecoverSprite3D = function (_obj, _active) { if (_active === void 0) { _active = false; } if (!_obj) { console.warn("PoolManager Recover Error!", null); return; } if (_obj.destroyed) { console.warn("PoolManager Recover Error!", "destroyed"); return; } if (!_active && _obj.active == false) { console.warn("PoolManager Recover Error!", _obj.name); return; } var objName = _obj.name; if (this.Sprite3DDic[objName] != null && this.Sprite3DDic[objName] != undefined) { var array = this.Sprite3DDic[objName]; if (array.length > this.PoolSize) { _obj.destroy(); return; } else { array.push(_obj); } } else { array = []; array.push(_obj); this.Sprite3DDic[objName] = array; //console.log(objName,array.length); } _obj.transform.position = new Laya.Vector3(0, 0, -100); _obj.removeSelf(); _obj.active = false; }; PoolManager.ClearPool = function () { for (var key in this.Sprite3DDic) { var objs = this.Sprite3DDic[key]; for (var i = 0; i < objs.length; i++) { objs[i].destroy(); } } this.Sprite3DDic = {}; }; PoolManager.PoolSize = 80; PoolManager.Sprite3DDic = {}; return PoolManager; }()); exports.default = PoolManager; },{}],27:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ResourceControl_1 = require("./ResourceControl"); var LocalData_1 = require("../Data/LocalData"); var GamePool_1 = require("../PrefabControl/GamePool"); var AssetPath_1 = require("../Config/AssetPath"); var TimerService_1 = require("../Time/TimerService"); var Tab = Laya.Tab; /* * 资源管理器; */ var ResDataControl = /** @class */ (function () { function ResDataControl() { /************************************************ */ this._time = 0; this.ClearInterval = 50000; this.CheckInterval = 20000; /******************************************************************* */ this.skins = ["res/ui/tab1.png", "res/ui/tab2.png"]; ResDataControl.ins = this; } Object.defineProperty(ResDataControl, "Instance", { get: function () { if (ResDataControl.ins == null) { return new ResDataControl(); } return ResDataControl.ins; }, enumerable: true, configurable: true }); /** * 添加包 * @param path 路径( 事例:res/ui/ ) * @param pkgname 包名 * @param isaddpackage 是否添加 * @param isCache 是否缓存 */ ResDataControl.prototype.AddPackByName = function (path, pkgname, isaddpackage, isCache) { if (isaddpackage === void 0) { isaddpackage = true; } if (isCache === void 0) { isCache = true; } if (isaddpackage) { fairygui.UIPackage.addPackage(path + pkgname, pkgname); } this.AddLocalLiveData(pkgname, isCache); }; ResDataControl.prototype.init = function () { GamePool_1.GamePool.Mark(LocalData_1.LocalData.ResDicValue, LocalData_1.LocalData); this.urlRes = {}; this.packageRes = {}; this.NoLiveData = { "loading": true, "main": true, "uicomponent": true }; TimerService_1.TimerService.Instance.addUpdateTarget(this); }; /** * 清理资源缓存(Array) * @param urls 资源数组 * @param packageName 包名 */ ResDataControl.prototype.RemoveResources = function (urls, packageName) { if (packageName === void 0) { packageName = ""; } if (packageName != "") { fairygui.UIPackage.removePackage(packageName); } for (var s in urls) { this.RemoveResourcesByurl(urls[s].url, true); } }; /************************************************ */ ResDataControl.prototype.placeHSlider = function () { var hs = new Laya.HSlider(); hs.skin = "res/ui/hslider.png"; hs.width = 300; hs.pos(50, 170); hs.min = 0; hs.max = 100; hs.value = 50; hs.tick = 1; Laya.stage.addChild(hs); }; ResDataControl.prototype.placeVSlider = function () { var vs = new Laya.VSlider(); vs.skin = "res/ui/vslider.png"; vs.height = 300; vs.pos(400, 50); vs.min = 0; vs.max = 100; vs.value = 50; vs.tick = 1; Laya.stage.addChild(vs); }; ResDataControl.prototype.update = function (dt) { this._time += dt; if (this._time > this.CheckInterval) //1分钟检查一次 { if (ResourceControl_1.ResourceControl.Instance.running) //如果当前在加载中,延时1秒检测 { this._time -= 1000; return; } this.RefreshGroupRes(); this._time = 0; } }; /** * 清理资源缓存(url) * @param url 要清理的资源url * @param isClear 对于缓存池中的数据,当引用为0时,是否直接强制清除( 如果为false,则等待缓存定时刷新时候再去判断 ) */ ResDataControl.prototype.RemoveResourcesByurl = function (url, isClear) { if (isClear === void 0) { isClear = false; } if (this.urlRes.hasOwnProperty(url)) { if (isClear) { Laya.loader.clearRes(url); delete this.urlRes[url]; } else { this.urlRes[url]--; } } else { Laya.loader.clearRes(url); } }; ResDataControl.prototype.ClearLiveDataByPackName = function (pkgName) { if (this.packageRes[pkgName]) { var vo = this.packageRes[pkgName]; vo.clear(); delete this.packageRes[pkgName]; } }; /** * 添加ui包 * @param pkgname 包名 * @param isaddpackage 是否创建uipackage * @param isCache 是否添加到组缓存中( 如果添加,则参与定时清理的逻辑,常驻资源请勿设置为ture ) */ ResDataControl.prototype.AddViewPackByName = function (pkgname, isaddpackage, isCache) { if (isaddpackage === void 0) { isaddpackage = true; } if (isCache === void 0) { isCache = true; } if (isaddpackage) { if (pkgname == "main") { fairygui.UIPackage.addPackage(AssetPath_1.AssetPath.res + AssetPath_1.AssetPath.subpacksgeui + pkgname, pkgname); } else { fairygui.UIPackage.addPackage(AssetPath_1.AssetPath.resources + AssetPath_1.AssetPath.ui + pkgname, pkgname); } } this.AddLocalLiveData(pkgname, isCache); }; /** * 移除包 * @param pkgname 包名 * @param isclear 是否强制清除( 如果为false则等待定时器判断清理,如果为true则强制清除 ) */ ResDataControl.prototype.ClearPackByName = function (pkgname, isclear) { if (isclear === void 0) { isclear = false; } if (pkgname == "" || pkgname == null) { return; } if (isclear) { fairygui.UIPackage.removePackage(pkgname); if (this.packageRes.hasOwnProperty(pkgname)) { delete this.packageRes[pkgname]; } } else { if (this.packageRes.hasOwnProperty(pkgname)) { var vo = this.packageRes[pkgname]; if (vo) { vo.ref--; } } } }; ResDataControl.prototype.RefreshGroupRes = function () { var nowTime = Laya.Browser.now(); var s; if (this.packageRes) { var vo; for (s in this.packageRes) { vo = this.packageRes[s]; if (vo.ref <= 0 && (nowTime - vo.time) > this.ClearInterval) { this.ClearPackByName(vo.packageName, true); this.ClearLiveDataByPackName(vo.packageName); } } } //清理图片缓存 if (this.urlRes) { var resourceurlPool = this.urlRes; for (s in resourceurlPool) { if (resourceurlPool[s] <= 0) { this.RemoveResourcesByurl(s, true); } } } }; ResDataControl.prototype.onSkinLoaded = function () { var tabA = this.createTab(this.skins[0]); tabA.pos(40, 120); tabA.labelColors = "#000000,#d3d3d3,#333333"; var tabB = this.createTab(this.skins[1]); tabB.pos(40, 220); tabB.labelColors = "#FFFFFF,#8FB299,#FFFFFF"; }; ResDataControl.prototype.createTab = function (skin) { var tab = new Tab(); tab.skin = skin; tab.labelBold = true; tab.labelSize = 20; tab.labelStrokeColor = "#000000"; tab.labels = "Tab Control 1,Tab Control 2,Tab Control 3"; tab.labelPadding = "0,0,0,0"; tab.selectedIndex = 1; Laya.stage.addChild(tab); return tab; }; /******************************************************************* */ /** * 获取已经加载过的数据 * @param url 资源url * @param isCache 是否存储在缓存池中,默认为true */ ResDataControl.prototype.GainResources = function (url, isCache) { if (isCache === void 0) { isCache = true; } if (isCache) { if (this.urlRes[url] == null) { this.urlRes[url] = 0; } this.urlRes[url]++; } return Laya.loader.getRes(url); }; ResDataControl.prototype.AddLocalLiveData = function (pkgname, isCache) { if (isCache && !this.NoLiveData.hasOwnProperty(pkgname)) { var vo; if (!this.packageRes.hasOwnProperty(pkgname)) { vo = GamePool_1.GamePool.GetItem(LocalData_1.LocalData.ResDicValue); vo.packageName = pkgname; this.packageRes[pkgname] = vo; } else { vo = this.packageRes[pkgname]; } vo.ref++; vo.time = Laya.Browser.now(); } }; return ResDataControl; }()); exports.ResDataControl = ResDataControl; },{"../Config/AssetPath":15,"../Data/LocalData":32,"../PrefabControl/GamePool":47,"../Time/TimerService":59,"./ResourceControl":28}],28:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * name; */ var Handler = Laya.Handler; var DispatcherManager_1 = require("../utils/DispatcherManager"); var RecConfigs_1 = require("../Config/RecConfigs"); var ResourceControl = /** @class */ (function (_super) { __extends(ResourceControl, _super); function ResourceControl() { var _this = _super.call(this) || this; _this._groupIndex = 0; _this.running = false; /** * 要加载的总数量 */ _this._loadNum = 0; /** * 已经加载的数量 */ _this._loadedNum = 0; _this._preloadNum = 0; _this._cut = 0; _this._nowLoadArr = null; ResourceControl.ins = _this; return _this; } Object.defineProperty(ResourceControl, "Instance", { get: function () { if (ResourceControl.ins == null) { return new ResourceControl(); } return ResourceControl.ins; }, enumerable: true, configurable: true }); ResourceControl.prototype.init = function () { this._configs = new Array(); this._groups = {}; Laya.loader.retryNum = 4; Laya.loader.on(Laya.Event.ERROR, this, this.onError); Laya.loader.on("errorsMsg", this, this.errorsMsghandler); Laya.loader.on("gameerrorsMsg", this, this.gameerrorsMsghandler); }; ResourceControl.prototype.onLoadConfigComplete = function () { if (this._onConfigCompleteTarget != null && this._onConfigComplete != null) { this._onConfigComplete.call(this._onConfigCompleteTarget); } }; ResourceControl.prototype.errorsMsghandler = function (msg) { DispatcherManager_1.DispatcherManager.dispatchEvent("loadfailEvent", msg); }; ResourceControl.prototype.gameerrorsMsghandler = function (msg) { DispatcherManager_1.DispatcherManager.dispatchEvent("gameserrosEvent", msg); }; /** * 加载资源组 * @param groupName 组名 * @param onResourceLoadTarget 作用域 * @param ResourceLoadComplete 完成事件 * @param onResourceProgress 加载进度事件 * @param isShow 是否显示加载状态 */ ResourceControl.prototype.loadGroup = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isShow === void 0) { isShow = true; } if (args === void 0) { args = null; } // Debuger.log(groupName); var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName]; data.isShow = isShow; data.args = args; data.type = "group"; data.resouseType = "2D"; this._configs.push(data); this.loadStart(); }; /** * 加载单个资源 * @param url 资源url * @param type 资源类型 * @param onResourceLoadTarget 作用域 * @param ResourceLoadComplete 完成事件 * @param onResourceProgress 加载进度事件 * @param isShow 是否显示加载状态 */ ResourceControl.prototype.Loader = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isShow === void 0) { isShow = true; } if (args === void 0) { args = null; } var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = [{ url: url, type: type }]; data.isShow = isShow; data.args = args; data.type = "single"; data.resouseType = "2D"; this._configs.push(data); this.loadStart(); }; /** * 加载数组资源 * @param urls * @param onResourceLoadTarget * @param ResourceLoadComplete * @param onResourceProgress * @param isShow */ ResourceControl.prototype.Loaders = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isShow === void 0) { isShow = true; } if (args === void 0) { args = null; } var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = urls; data.isShow = isShow; data.type = "arr"; data.args = args; data.resouseType = "2D"; this._configs.push(data); this.loadStart(); }; /** * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 ) * @param urls * @param onResourceLoadTarget * @param ResourceLoadComplete * @param onResourceProgress * @param isShow */ ResourceControl.prototype.loaderArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, cut) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (cut === void 0) { cut = 3; } var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = urls; data.isShow = false; data.type = "loaderArr"; data.cut = cut; data.resouseType = "2D"; this._configs.push(data); this.startLoad1(); }; ResourceControl.prototype.startLoad1 = function () { if (!this.running && this._configs.length > 0) { this._nowLoadData = this._configs.shift(); this._nowLoadArr = this._nowLoadData.urls.concat().reverse(); this._loadNum = this._nowLoadArr.length; this._loadedNum = 0; this._preloadNum = this._loadedNum; this._cut = Number(this._nowLoadData.cut); this.loadStart1(); } }; ResourceControl.prototype.loadStart1 = function () { if (this.running) { return; } if (this._nowLoadArr && this._nowLoadArr.length > 0) { this.running = true; var needArr; if (this._nowLoadArr.length > this._cut) { needArr = this._nowLoadArr.splice(0, this._cut); } else { needArr = this._nowLoadArr.splice(0); } this._cut = needArr.length; this._preloadNum = this._loadedNum; this.onLoadingArr(0); var resouseType = this._nowLoadData.resouseType; if (resouseType == "2D" || resouseType == null) { Laya.loader.load(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false)); } else { Laya.loader.create(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false)); } } else { this._nowLoadData = null; this.startLoad1(); } }; ResourceControl.prototype.onLoadingArr = function (value) { this._loadedNum = this._preloadNum + value * this._cut; if (this._nowLoadData) { var allvalue = Math.ceil((this._loadedNum / this._loadNum) * 100); if (this._nowLoadData.progress != null) { this._nowLoadData.progress.call(this._nowLoadData.completeTarget, allvalue, Math.floor(value * 100)); } } }; ResourceControl.prototype.onLoadCompleteArr = function () { this.onLoadingArr(1); this._loadedNum = this._preloadNum + this._cut; this.running = false; if (this._loadedNum == this._loadNum) { if (this._nowLoadData && this._nowLoadData.complete) { this._nowLoadData.complete.call(this._nowLoadData.completeTarget); } } Laya.timer.callLater(this, this.loadStart1); // this.loadStart1(); }; ResourceControl.prototype.loadStart = function () { if (this.running || this._configs.length == 0) { return; } this.running = true; this._nowLoadData = this._configs[0]; var arr = this._nowLoadData.urls; var isShow = this._nowLoadData.isShow; if (isShow) { fairygui.GRoot.inst.showModalWait(); } var resouseType = this._nowLoadData.resouseType; if (arr != null) { if (resouseType == "2D" || resouseType == null) { Laya.loader.load(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false)); } else { Laya.loader.create(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false)); } } }; // 加载进度侦听器 ResourceControl.prototype.onLoading = function (progress) { if (this._nowLoadData) { progress = Math.ceil(Number(progress * 100)); if (this._nowLoadData.progress != null) { this._nowLoadData.progress.call(this._nowLoadData.completeTarget, progress); } } }; ResourceControl.prototype.onLoadComplete = function (args) { if (args === void 0) { args = null; } fairygui.GRoot.inst.closeModalWait(); if (this._nowLoadData && this._nowLoadData.complete) { if (this._nowLoadData.args) { this._nowLoadData.complete.call(this._nowLoadData.completeTarget, this._nowLoadData.args); } else { this._nowLoadData.complete.call(this._nowLoadData.completeTarget); } } this.running = false; this._nowLoadData = null; this._configs.shift(); this.loadStart(); }; ResourceControl.prototype.onError = function (err) { fairygui.GRoot.inst.closeModalWait(); }; /** * 加载3D单个资源 * @param url 资源url * @param type 资源类型 * @param onResourceLoadTarget 作用域 * @param ResourceLoadComplete 完成事件 * @param onResourceProgress 加载进度事件 * @param isShow 是否显示加载状态 */ ResourceControl.prototype.Loader3D = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isShow === void 0) { isShow = true; } var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = [{ url: url, type: type }]; data.isShow = isShow; data.type = "single"; data.resouseType = "3D"; this._configs.push(data); this.loadStart(); }; /** * 加载3D资源组 * @param groupName 组名 * @param onResourceLoadTarget 作用域 * @param ResourceLoadComplete 完成事件 * @param onResourceProgress 加载进度事件 * @param isShow 是否显示加载状态 */ ResourceControl.prototype.loadGroup3D = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isShow === void 0) { isShow = true; } if (args === void 0) { args = null; } var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName]; data.isShow = isShow; data.args = args; data.type = "group"; data.resouseType = "3D"; this._configs.push(data); this.loadStart(); }; /** * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 ) * @param urls * @param onResourceLoadTarget * @param ResourceLoadComplete * @param onResourceProgress * @param isShow */ ResourceControl.prototype.loader3DArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isshow, args) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isshow === void 0) { isshow = false; } if (args === void 0) { args = null; } var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = urls; data.isShow = isshow; data.args = args; data.type = "loaderArr"; data.resouseType = "3D"; this._configs.push(data); this.loadStart(); }; /** * 加载特效 * @param groupName * @param onResourceLoadTarget * @param ResourceLoadComplete * @param args */ ResourceControl.prototype.loadEffect = function (groupName, onResourceLoadTarget, ResourceLoadComplete, args) { if (args === void 0) { args = null; } var urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName]; if (urls && urls.length > 0) { Laya.loader.load(urls, Handler.create(onResourceLoadTarget, ResourceLoadComplete, [args])); } }; return ResourceControl; }(Laya.EventDispatcher)); exports.ResourceControl = ResourceControl; },{"../Config/RecConfigs":16,"../utils/DispatcherManager":85}],29:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LayoutControl_1 = require("./LayoutControl"); var AssetPath_1 = require("../Config/AssetPath"); var CameraManager_1 = require("../Game/CameraManager"); var PropManager_1 = require("../PrefabControl/PropManager"); var Player_1 = require("../Game/Player"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var GameState_1 = require("../utils/GameState"); var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage"); var PanelResDic_1 = require("../PrefabControl/PanelResDic"); var GameUtils_1 = require("../utils/GameUtils"); var NpcCFG_1 = require("../CFG/NpcCFG"); var NpcScript_1 = require("../Game/NpcScript"); var ResourceControl_1 = require("./ResourceControl"); var GameCFG_1 = require("../CFG/GameCFG"); var CharacterState_1 = require("../PrefabControl/CharacterState"); var UserInfoEvent_1 = require("../Data/UserInfoEvent"); var CharacterPool_1 = require("../PrefabControl/CharacterPool"); var Sprite = Laya.Sprite; var Event = Laya.Event; var SceneControl = /** @class */ (function () { function SceneControl() { this._initPosY = 1; this.index = 0; this.preRadian = 0; SceneControl.ins = this; } Object.defineProperty(SceneControl, "Instance", { get: function () { if (SceneControl.ins == null) { return new SceneControl(); } return SceneControl.ins; }, enumerable: true, configurable: true }); //创建主角 SceneControl.prototype.CreatePlayer = function (rolecfg) { var iscreate = false; if (!PropManager_1.PropManager.mainRole) { iscreate = true; } else if (PropManager_1.PropManager.mainRole.name != "Character" + rolecfg.name) { iscreate = true; this.ClearMomentCharacter(); } if (iscreate) { // var sp:Laya.Sprite3D = Laya.Loader.getRes(AssetPath.get3DRoleModel(RoleData.roleCfg.name)) as Laya.Sprite3D; // PropManager.mainRole = Laya.Sprite3D.instantiate(sp, PropManager.scene3D, false,new Laya.Vector3( 0,0,0 )) as Laya.Sprite3D; PropManager_1.PropManager.mainRole = CharacterPool_1.CharacterPool.AddCharacter(rolecfg.name, Player_1.Player, PropManager_1.PropManager.scene3D); PropManager_1.PropManager.mainRole.name = "Character" + rolecfg.name; this.PlayerScript = PropManager_1.PropManager.mainRole.getComponent(Player_1.Player); // this.mainRoleScript.resouseName = RoleData.roleCfg.name; // if( ) // this.mainRoleScript = PropManager.mainRole.addComponent( MainRAoleScript ); } var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage); var RoleData = agencyusermessage.RoleData; var info = RoleData.levelcfg.roleinitpos; var chidarr = GameUtils_1.GameUtils.cutstrtoArr(info.offsetPos); var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2])); var posVec = new Laya.Vector3; var selectVec; if (info.initbuild == "startpanel") { posVec.x = PropManager_1.PropManager.startPlane.transform.position.x + offsetPos.x; posVec.y = PropManager_1.PropManager.startPlane.transform.position.y + offsetPos.y; posVec.z = PropManager_1.PropManager.startPlane.transform.position.z + offsetPos.z; selectVec = PropManager_1.PropManager.startPlane.getChildByName("child_pos").transform.position; } else { var childpos = PropManager_1.PropManager.getPosVecbyScene(RoleData.levelmapArr[0], info.initbuild); posVec.x = childpos.x + offsetPos.x; posVec.y = childpos.y + offsetPos.y; posVec.z = childpos.z + offsetPos.z; selectVec = childpos; } PropManager_1.PropManager.mainRole.transform.position = posVec; this.cameraScript.SetCameraPosition(PropManager_1.PropManager.mainRole.transform.position); this.PlayerScript.setnowSelectVec(selectVec); this.PlayerScript.nowAction = CharacterState_1.CharacterState.stand; this.PlayerScript.PlayAnimator(CharacterState_1.CharacterState.stand); // var UIPos = PropManager.mainRole.transform.position; // var NAMEUI = new Laya.Text(); // NAMEUI.text = "自己"; // NAMEUI.fontSize = 60; // NAMEUI.color = "#ffffff"; // NAMEUI.scaleX = 0.5; // NAMEUI.scaleY = 0.5; // NAMEUI.align = "center"; // NAMEUI.valign = "middle"; // Laya.stage.addChild(NAMEUI); // Laya.timer.frameLoop(1, this, () => { // let ScreenPos = new Laya.Vector3(); // PropManager.carma.worldToViewportPoint(UIPos, ScreenPos); // NAMEUI.pos(ScreenPos.x, ScreenPos.y); // }) }; //创建npc SceneControl.prototype.createNpc = function () { console.log("CreatNpc---"); this.ClearNpc(); var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage); var RoleData = agencyusermessage.RoleData; var arr = RoleData.levelcfg.npc; var childdict; var index = 0; PropManager_1.PropManager.npcnum = arr.length; for (var s in arr) { childdict = arr[s]; var selectVec = null; var npccfg = NpcCFG_1.default.dict[childdict.id]; var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DRoleModel(npccfg.name)); var chidarr = GameUtils_1.GameUtils.cutstrtoArr(childdict.offsetPos); var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2])); var posVec = new Laya.Vector3; if (childdict.scene == "startpanel") { posVec.x = PropManager_1.PropManager.startPlane.transform.position.x + offsetPos.x; posVec.y = PropManager_1.PropManager.startPlane.transform.position.y + 1 + offsetPos.y; posVec.z = PropManager_1.PropManager.startPlane.transform.position.z + offsetPos.z; selectVec = PropManager_1.PropManager.startPlane.getChildByName("child_pos").transform.position; } else { var childpos = PropManager_1.PropManager.getPosVecbyScene(childdict.scene, childdict.initbuild); posVec.x = childpos.x + offsetPos.x; posVec.y = childpos.y + offsetPos.y; posVec.z = childpos.z + offsetPos.z; selectVec = childpos; } var npcsp = CharacterPool_1.CharacterPool.AddCharacter(npccfg.name, NpcScript_1.NpcScript, PropManager_1.PropManager.scene3D); npcsp.name = "npc_" + index; npcsp.transform.position = posVec; var npcscript = npcsp.getComponent(NpcScript_1.NpcScript); npcscript.setnowSelectVec(selectVec); npcscript.npcinfo(npccfg); PropManager_1.PropManager.npcDict[npcsp.name] = npcsp; PropManager_1.PropManager.npcscriptDict[npcsp.name] = npcscript; npcscript.PlayAnimator(CharacterState_1.CharacterState.stand); index++; // this.ShowUI(npcsp); } console.log("CreatNpc2---"); }; SceneControl.prototype.ShowUI = function (_sprite) { var UIPos = _sprite.transform.position; var NAMEUI = new Laya.Text(); var random = GameUtils_1.GameUtils.randRangeint(1, 30); NAMEUI.text = "npc_" + this.index; NAMEUI.fontSize = 60; NAMEUI.color = "#ffffff"; NAMEUI.scaleX = 0.5; NAMEUI.scaleY = 0.5; NAMEUI.align = "center"; NAMEUI.valign = "middle"; Laya.stage.addChild(NAMEUI); Laya.timer.frameLoop(1, this, function () { var ScreenPos = new Laya.Vector3(); PropManager_1.PropManager.carma.worldToViewportPoint(UIPos, ScreenPos); NAMEUI.pos(ScreenPos.x, ScreenPos.y + 20); }); this.index++; }; SceneControl.prototype.ShowTheGameScene = function () { var pathArr = []; var urlArr = []; this.cameraScript.iscanfollow = true; var roleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData; var arr = roleData.levelmapArr; var i = 0; for (i = 0; i < arr.length; i++) { if (urlArr.indexOf(AssetPath_1.AssetPath.get3DModel(arr[i])) == -1) { urlArr.push(AssetPath_1.AssetPath.get3DModel(arr[i])); } } var npcArr = roleData.levelcfg.npc; for (i = 0; i < npcArr.length; i++) { if (urlArr.indexOf(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) { urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)); } } for (i = 0; i < urlArr.length; i++) { pathArr.push({ url: urlArr[i] }); } ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.SceneCreatComplete, null, true); }; SceneControl.prototype.SceneCreatComplete = function () { this.RefreshTerrain(); var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage); var RoleData = agencyusermessage.RoleData; this.CreatePlayer(RoleData.roleCfg); this.createNpc(); }; SceneControl.prototype.ListenOnEvent = function () { DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.start, this, this.EnterGame); DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.jump, this, this.Jump); DispatcherManager_1.DispatcherManager.addEventListener(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid, this, this.RefreshCharacterModel); }; SceneControl.prototype.CharacterLoadEnd = function (url) { var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage); var RoleData = agencyusermessage.RoleData; if (AssetPath_1.AssetPath.get3DModel(RoleData.roleCfg.name) == url) { this.CreatePlayer(RoleData.roleCfg); } }; SceneControl.prototype.Jump = function () { this.PlayerScript.TestJump(); }; /************************************************************** */ SceneControl.prototype.setup = function () { this.createSprite(); Laya.stage.on(Event.MOUSE_UP, this, this.onMouseUp); Laya.stage.on(Event.MOUSE_OUT, this, this.onMouseUp); }; SceneControl.prototype.createSprite = function () { this.sp = new Sprite(); var w = 200, h = 300; this.sp.graphics.drawRect(0, 0, w, h, "#FF7F50"); this.sp.size(w, h); this.sp.pivot(w / 2, h / 2); this.sp.pos(Laya.stage.width / 2, Laya.stage.height / 2); Laya.stage.addChild(this.sp); this.sp.on(Event.MOUSE_DOWN, this, this.onMouseDown); }; SceneControl.prototype.onMouseDown = function (e) { var touches = e.touches; if (touches && touches.length == 2) { this.preRadian = Math.atan2(touches[0].stageY - touches[1].stageY, touches[0].stageX - touches[1].stageX); Laya.stage.on(Event.MOUSE_MOVE, this, this.onMouseMove); } }; SceneControl.prototype.onMouseMove = function (e) { var touches = e.touches; if (touches && touches.length == 2) { var nowRadian = Math.atan2(touches[0].stageY - touches[1].stageY, touches[0].stageX - touches[1].stageX); this.sp.rotation += 180 / Math.PI * (nowRadian - this.preRadian); this.preRadian = nowRadian; } }; SceneControl.prototype.onMouseUp = function (e) { Laya.stage.off(Event.MOUSE_MOVE, this, this.onMouseMove); }; /********************************** */ SceneControl.prototype.EnterGame = function (jiasu) { this.PlayerScript.startRun(jiasu); var npcdict = PropManager_1.PropManager.npcscriptDict; for (var s in npcdict) { var npcscript = npcdict[s]; npcscript.startRun(); } }; SceneControl.prototype.ClearMomentCharacter = function () { if (PropManager_1.PropManager.mainRole && this.PlayerScript) { CharacterPool_1.CharacterPool.ClearCharacter(PropManager_1.PropManager.mainRole, this.PlayerScript.resouseName, this.PlayerScript); this.PlayerScript = null; PropManager_1.PropManager.mainRole = null; } }; SceneControl.prototype.SetScene = function () { var backgroundParent = LayoutControl_1.LayoutControl.Instance.background.displayObject; var scenebg = fairygui.UIPackage.createObject("main", "gambg"); scenebg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height); LayoutControl_1.LayoutControl.Instance.background.addChild(scenebg); // UiManager.instance.add( GameBgView,null,LayerNotify.LAYER_BACKGROUND ); //添加3D场景 PropManager_1.PropManager.scene3D = backgroundParent.addChild(new Laya.Scene3D()); PropManager_1.PropManager.scene3D.physicsSimulation.continuousCollisionDetection = true; //添加照相机 PropManager_1.PropManager.carma = (PropManager_1.PropManager.scene3D.addChild(new Laya.Camera(0, 0.1, 70))); this.cameraScript = PropManager_1.PropManager.carma.addComponent(CameraManager_1.CameraManager); PropManager_1.PropManager.carma.clearFlag = Laya.BaseCamera.CLEARFLAG_DEPTHONLY; //添加方向光 var directionLight = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("DirectionalLight")); //PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight; PropManager_1.PropManager.scene3D.addChild(directionLight); // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0)); // var directionLight: Laya.DirectionLight = PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight; // directionLight.color = new Laya.Vector3(1,1,1); // directionLight.intensity = 0.5; // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0)); PropManager_1.PropManager.startPlane = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("startpanel")); PropManager_1.PropManager.scene3D.addChild(PropManager_1.PropManager.startPlane); PropManager_1.PropManager.endPlane = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("endpanel")); PropManager_1.PropManager.scene3D.addChild(PropManager_1.PropManager.endPlane); // PropManager.bgsprite3d = Laya.Loader.getRes(AssetPath.get3DModel("distantview")); // PropManager.scene3D.addChild(PropManager.bgsprite3d); //雾化代码 PropManager_1.PropManager.scene3D.enableFog = true; //设置雾化的颜色 var fogArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[2].value); if (GameCFG_1.default.dict[8]) { var wucolor = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[8].value); PropManager_1.PropManager.scene3D.fogColor = new Laya.Vector3(Number(wucolor[0]), Number(wucolor[1]), Number(wucolor[2])); } else { PropManager_1.PropManager.scene3D.fogColor = new Laya.Vector3(0, 0, 0.6); } //设置雾化的起始位置,相对于相机的距离 var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[3].value); PropManager_1.PropManager.scene3D.fogStart = Number(valueArr[0]); //设置雾化最浓处的距离。 PropManager_1.PropManager.scene3D.fogRange = Number(valueArr[1]); this.ShowTheGameScene(); this.ListenOnEvent(); }; /**清除所有NPC */ SceneControl.prototype.ClearNpc = function () { var npcdict = PropManager_1.PropManager.npcDict; var s; for (s in npcdict) { var sp = npcdict[s]; var npcscript = PropManager_1.PropManager.npcscriptDict[s]; var resousename = npcscript.resouseName; CharacterPool_1.CharacterPool.ClearCharacter(sp, resousename, npcscript); delete PropManager_1.PropManager.npcscriptDict[s]; delete npcdict[s]; } }; SceneControl.prototype.Pattern = function (mapSprite3D) { console.log("Pattern1----"); if (PropManager_1.PropManager.patternDict[mapSprite3D.name]) { delete PropManager_1.PropManager.patternDict[mapSprite3D.name]; } var BlocksSprite = mapSprite3D.getChildByName("Blocks"); var chiddict = {}; var chidsp; var buildSp; var index = 0; while (BlocksSprite.getChildByName("build_all_" + index)) { buildSp = BlocksSprite.getChildByName("build_all_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_all_" + index] = chidsp.transform.position; if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) { PropManager_1.PropManager.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_front_" + index)) { buildSp = BlocksSprite.getChildByName("build_front_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_front_" + index] = chidsp.transform.position; if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) { PropManager_1.PropManager.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_left_" + index)) { buildSp = BlocksSprite.getChildByName("build_left_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_left_" + index] = chidsp.transform.position; if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) { PropManager_1.PropManager.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_right_" + index)) { buildSp = BlocksSprite.getChildByName("build_right_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_right_" + index] = chidsp.transform.position; if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) { PropManager_1.PropManager.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_frontleft_" + index)) { buildSp = BlocksSprite.getChildByName("build_frontleft_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_frontleft_" + index] = chidsp.transform.position; if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) { PropManager_1.PropManager.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_frontright_" + index)) { buildSp = BlocksSprite.getChildByName("build_frontright_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_frontright_" + index] = chidsp.transform.position; if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) { PropManager_1.PropManager.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_leftright_" + index)) { buildSp = BlocksSprite.getChildByName("build_leftright_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_leftright_" + index] = chidsp.transform.position; if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) { PropManager_1.PropManager.diePosY = buildSp.transform.position.y; } index++; } index = 0; var Props = mapSprite3D.getChildByName("Props"); while (Props.getChildByName("Scaffolding_" + index)) { chidsp = Props.getChildByName("Scaffolding_" + index).getChildByName("child_pos"); chiddict["Scaffolding_" + index] = chidsp.transform.position; index++; } index = 0; while (Props.getChildByName("grilling_" + index)) { chidsp = Props.getChildByName("grilling_" + index).getChildByName("child_pos"); chiddict["grilling_" + index] = chidsp.transform.position; index++; } index = 0; var jumpchildSp; var iscreatejt = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData.LevelID < 3 ? true : false; while (Props.getChildByName("JumpBoost_" + index)) { jumpchildSp = Props.getChildByName("JumpBoost_" + index); if (iscreatejt) { var pos = jumpchildSp.transform.position.clone(); pos.y += 3; var jiantou = Laya.Sprite3D.instantiate(Laya.loader.getRes(AssetPath_1.AssetPath.get3DRoleModel("Arrow")), PropManager_1.PropManager.scene3D, false, pos); PropManager_1.PropManager.jiantouArr.push(jiantou); } index++; } PropManager_1.PropManager.patternDict[mapSprite3D.name] = chiddict; console.log("Pattern2----"); }; /***************************************************** */ SceneControl.prototype.onSpriteClick = function (e) { var randomAngle = Math.random() * 180; //发送自定义事件 // this.sp.event(Interaction_CustomEvent.ROTATE, [randomAngle]); }; // 触发自定义的rotate事件 SceneControl.prototype.onRotate = function (newAngle) { Laya.Tween.to(this.sp, { "rotation": newAngle }, 1000, Laya.Ease.elasticOut); }; /***************************************************** */ SceneControl.prototype.RefreshCharacterModel = function () { var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage); var RoleData = agencyusermessage.RoleData; var pathArr = []; pathArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(RoleData.roleCfg.name) }); ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.CharacterLoadEnd, null, true, AssetPath_1.AssetPath.get3DModel(RoleData.roleCfg.name)); }; /*********更新地形 */ SceneControl.prototype.RefreshTerrain = function () { var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage); var RoleData = agencyusermessage.RoleData; var nowlevelcfg = RoleData.levelcfg; var mapArr = RoleData.levelmapArr; var mapSprite3D; var mapname; var _lastmapSprite3D; for (var s in PropManager_1.PropManager.nowmapDict) { PropManager_1.PropManager.nowmapDict[s].active = false; } for (var i = 0; i < mapArr.length; i++) { mapname = mapArr[i]; console.log("mapname1----", mapname); if (PropManager_1.PropManager.nowmapDict[mapname]) { mapSprite3D = PropManager_1.PropManager.nowmapDict[mapname]; mapSprite3D.active = true; } else { console.log("mapname2----", mapname); var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel(mapname)); console.log("mapname3----", mapname); mapSprite3D = Laya.Sprite3D.instantiate(sp, PropManager_1.PropManager.scene3D, false, null); console.log("mapname4----", mapname); PropManager_1.PropManager.nowmapDict[mapname] = mapSprite3D; console.log("mapname5----", mapname); } if (i == 0) { var arr = GameUtils_1.GameUtils.cutstrtoArr(nowlevelcfg.firstScenepos); mapSprite3D.transform.position = new Laya.Vector3(Number(arr[0]), Number(arr[1]), Number(arr[2])); } else { var endPos = _lastmapSprite3D.getChildByName("END").transform.position.clone(); endPos.x = 0; endPos.y = 0; mapSprite3D.transform.position = endPos; } this.Pattern(mapSprite3D); _lastmapSprite3D = mapSprite3D; var endPos1 = mapSprite3D.getChildByName("END").transform.position.clone(); endPos1.z += Number(GameCFG_1.default.dict[6].value); PropManager_1.PropManager.endPlane.transform.position = endPos1; PropManager_1.PropManager.gamewinPosZ = endPos1.z; PropManager_1.PropManager.gamewinPosZ -= 2; // PropManager.bgsprite3d.transform.position = new Laya.Vector3( 0,-20,-40 ); } }; /*使用界面显示,0:砸蛋,1:宝箱*/ SceneControl.EggGGroup = 0; /**签到是否正在显示 */ SceneControl.IsShowSign = false; return SceneControl; }()); exports.SceneControl = SceneControl; },{"../Agency/AgencyUserMessage":8,"../CFG/GameCFG":10,"../CFG/NpcCFG":13,"../Config/AssetPath":15,"../Data/UserInfoEvent":36,"../Game/CameraManager":38,"../Game/NpcScript":39,"../Game/Player":40,"../PrefabControl/CharacterPool":45,"../PrefabControl/CharacterState":46,"../PrefabControl/PanelResDic":48,"../PrefabControl/PropManager":49,"../utils/DispatcherManager":85,"../utils/GameState":86,"../utils/GameUtils":87,"./LayoutControl":22,"./ResourceControl":28}],30:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GamePool_1 = require("../PrefabControl/GamePool"); var ComponentEventData = /** @class */ (function () { function ComponentEventData() { } ComponentEventData.prototype.listenKeyboard = function () { this.keyDownList = []; //添加键盘按下事件,一直按着某按键则会不断触发 Laya.stage.on(Laya.Event.KEY_DOWN, this, this.onKeyDown); //添加键盘抬起事件 Laya.stage.on(Laya.Event.KEY_UP, this, this.onKeyUp); }; /**键盘按下处理*/ ComponentEventData.prototype.onKeyDown = function (e) { var keyCode = e["keyCode"]; this.keyDownList[keyCode] = true; }; ComponentEventData.prototype.clear = function () { this.target = null; this.type = null; this.thisObject = null; this.listener = null; GamePool_1.GamePool.RemoveItem(ComponentEventData.ResDicValue, this); }; /**键盘抬起处理*/ ComponentEventData.prototype.onKeyUp = function (e) { delete this.keyDownList[e["keyCode"]]; }; ComponentEventData.ResDicValue = "ComponentEventData"; return ComponentEventData; }()); exports.ComponentEventData = ComponentEventData; },{"../PrefabControl/GamePool":47}],31:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * name; */ var DataInfoBase = /** @class */ (function (_super) { __extends(DataInfoBase, _super); function DataInfoBase() { return _super.call(this) || this; } /***********混淆********* */ DataInfoBase.prototype.showApe = function () { var monkey1Path = "./res/apes/monkey1.png", monkey2Path = "./res/apes/monkey2.png"; // 方法1:使用loadImage var ape = new Laya.Sprite(); Laya.stage.addChild(ape); ape.loadImage(monkey1Path); // 方法2:使用drawTexture Laya.loader.load(monkey2Path, Laya.Handler.create(this, function () { var monkey2 = Laya.loader.getRes(monkey2Path); var ape2 = new Laya.Sprite(); Laya.stage.addChild(ape2); ape2.graphics.drawTexture(monkey2, 100, 0); })); }; /*********************** */ DataInfoBase.prototype.DataInfo = function (data) { if (data) { for (var s in data) { var itemd = this[s]; if (itemd != null) { this[s] = data[s]; } // else // { // Debuger.log( "VO:未定义属性-" + s ); // } } } }; /*********混淆 */ DataInfoBase.prototype.createButton = function (skin, name, cb, index) { var btn = new Laya.Button(skin, name); Laya.stage.addChild(btn); btn.on(Laya.Event.CLICK, this, cb); btn.size(147, 55); btn.name = name; btn.right = 10; btn.top = index * (btn.height + 10); return btn; }; /***************** */ DataInfoBase.prototype.dispatchEvent = function (type, data) { this.event(type, data); }; return DataInfoBase; }(Laya.EventDispatcher)); exports.DataInfoBase = DataInfoBase; },{}],32:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GamePool_1 = require("../PrefabControl/GamePool"); var Sprite = Laya.Sprite; var Event = Laya.Event; /* * name; */ var LocalData = /** @class */ (function (_super) { __extends(LocalData, _super); function LocalData() { var _this = _super !== null && _super.apply(this, arguments) || this; /** * 引用次数 */ _this.ref = 0; /** * 最后一次被引用的时间 */ _this.time = 0; /** * 包名 */ _this.packageName = ""; return _this; } LocalData.prototype.createCoralRect = function () { var coralRect = new Sprite(); coralRect.graphics.drawRect(0, 0, Laya.stage.width, Laya.stage.height / 2, "#FF7F50"); //设置名称 coralRect.name = "珊瑚色容器"; coralRect.size(Laya.stage.width, Laya.stage.height / 2); Laya.stage.addChild(coralRect); coralRect.on(Event.MOUSE_DOWN, this, this.onDown); }; LocalData.prototype.createDeepSkyblueRect = function () { var deepSkyblueRect = new Sprite(); deepSkyblueRect.graphics.drawRect(0, 0, 100, 100, "#00BFFF"); //设置名称 deepSkyblueRect.name = "天蓝色矩形"; //设置宽高(要接收鼠标事件必须设置宽高,否则不会被命中) deepSkyblueRect.size(100, 100); deepSkyblueRect.pos(10, 10); Laya.stage.addChild(deepSkyblueRect); deepSkyblueRect.on(Event.MOUSE_DOWN, this, this.onDown); }; LocalData.prototype.clear = function () { this.ref = 0; this.time = 0; this.packageName = ""; GamePool_1.GamePool.RemoveItem(LocalData.ResDicValue, this); }; /**侦听处理方法*/ LocalData.prototype.onDown = function (e) { this.logger.text += "点击 - " + e.target.name + "\n"; }; LocalData.ResDicValue = "LocalData"; return LocalData; }(Laya.EventDispatcher)); exports.LocalData = LocalData; },{"../PrefabControl/GamePool":47}],33:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var DispatcherManager_1 = require("../utils/DispatcherManager"); var UserInfoEvent_1 = require("../Data/UserInfoEvent"); var LocalDataControl_1 = require("../Control/LocalDataControl"); var UserDataInfo_1 = require("../Data/UserDataInfo"); var RoleCFG_1 = require("../CFG/RoleCFG"); var LevelCFG_1 = require("../CFG/LevelCFG"); var GameUtils_1 = require("../utils/GameUtils"); var DataInfoBase_1 = require("./DataInfoBase"); var Templet = Laya.Templet; var Event = Laya.Event; var RoleData = /** @class */ (function (_super) { __extends(RoleData, _super); function RoleData() { var _this = _super.call(this) || this; /** * 金币 */ _this._Gold = 0; _this._roleid = 0; _this._leveid = 0; _this.mStartX = 400; _this.mStartY = 500; _this.mActionIndex = 0; _this.mCurrIndex = 0; _this.mCurrSkinIndex = 0; /****************************************************** */ _this.movespeed = 0; _this.frontjump = new Laya.Vector3; _this.leftjump = new Laya.Vector3; _this.rightjump = new Laya.Vector3; _this.upclimb = 0; _this.slideclimb = new Laya.Vector3; RoleData.ins = _this; return _this; } Object.defineProperty(RoleData, "Instance", { get: function () { if (RoleData.ins == null) { return new RoleData(); } return RoleData.ins; }, enumerable: true, configurable: true }); RoleData.prototype.init = function () { var localdatacontrol = LocalDataControl_1.LocalDataControl.Instance; // var nowGold:number = Number(PlayerAccount.CurrentAccount.CurAccountData.GetUser(AccountUser.money)); // this.Gold = nowGold; this.Money = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.gold); this._roleid = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.roleid); if (this.CharacterID == 0) { this.CharacterID = 1; } else { this.InitCharacterInfo(); } this._leveid = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.levelid); if (this._leveid == 0) { this._leveid = 1; } this.RefreshLevel(); }; Object.defineProperty(RoleData.prototype, "nowlevel", { get: function () { return this._leveid; }, enumerable: true, configurable: true }); RoleData.prototype.getNowServerLevel = function () { return this._leveid; }; RoleData.prototype.LevelUp = function () { this._leveid++; LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.levelid, this._leveid.toString()); this.RefreshLevel(); }; /*********************************************************** */ RoleData.prototype.startFun = function () { this.mAniPath = "res/spine/spineRes6/alien.sk"; this.mFactory = new Templet(); this.mFactory.on(Event.COMPLETE, this, this.parseComplete); this.mFactory.on(Event.ERROR, this, this.onError); this.mFactory.loadAni(this.mAniPath); }; RoleData.prototype.onError = function () { console.log("error"); }; RoleData.prototype.parseComplete = function () { //创建模式为1,可以启用换装 this.mArmature = this.mFactory.buildArmature(1); this.mArmature.x = this.mStartX; this.mArmature.y = this.mStartY; this.mArmature.scale(0.5, 0.5); Laya.stage.addChild(this.mArmature); this.mArmature.on(Event.LABEL, this, this.onEvent); this.play(); }; /******************************************************************** */ RoleData.prototype.RefreshLevel = function () { var lv = this._leveid; var nowcfglv = 0; var allnums = LevelCFG_1.default.vec.length; if (lv > allnums) { var value = (lv - allnums) % (allnums - 2); if (value == 0) { nowcfglv = allnums; } else { nowcfglv = value + 2; } } else { nowcfglv = lv; } this.levelcfg = LevelCFG_1.default.dict[nowcfglv]; this.levelmapArr = GameUtils_1.GameUtils.cutstrtoArr(this.levelcfg.road); DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_levelid); }; RoleData.prototype.play = function () { this.mCurrIndex++; if (this.mCurrIndex >= this.mArmature.getAnimNum()) { this.mCurrIndex = 0; } this.mArmature.play(this.mCurrIndex, false); }; RoleData.prototype.onEvent = function (e) { Laya.stage.addChild(this.mLabelSprite); this.mLabelSprite.x = this.mStartX; this.mLabelSprite.y = this.mStartY; this.mLabelSprite.graphics.clear(); }; RoleData.prototype.InitCharacterInfo = function () { this.roleCfg = RoleCFG_1.default.dict[this._roleid]; this.movespeed = this.roleCfg.speed; this.frontjump = this.roleCfg.frontjump; this.leftjump = this.roleCfg.leftjump; this.rightjump = this.roleCfg.rightjump; this.upclimb = Number(this.roleCfg.upclimb); this.slideclimb = this.roleCfg.slideclimb; // this.frontjump.x = Number( this.roleCfg.frontjump.x ); // this.frontjump.y = Number( this.roleCfg.frontjump.y ); // this.frontjump.z = Number( this.roleCfg.frontjump.z ); // this.leftjump.x = Number( this.roleCfg.leftjump.x ); // this.leftjump.y = Number( this.roleCfg.leftjump.y ); // this.leftjump.z = Number( this.roleCfg.leftjump.z ); // this.rightjump.x = Number( this.roleCfg.rightjump.x ); // this.rightjump.y = Number( this.roleCfg.rightjump.y ); // this.rightjump.z = Number( this.roleCfg.rightjump.z ); // this.slideclimb.x = Number( this.roleCfg.slideclimb.x ); // this.slideclimb.y = Number( this.roleCfg.slideclimb.y ); // this.slideclimb.z = Number( this.roleCfg.slideclimb.z ); }; Object.defineProperty(RoleData.prototype, "LevelID", { // public set leveid( value:number ) // { // if( this._leveid != value ) // { // this._leveid = value; // this.levelcfg = LevelCFG.dict[ this._leveid ]; // this.levelmapArr = GameUtils.cutstrtoArr(this.levelcfg.road); // CacheManager.getInstance().addstr( UserDataInfo.levelid,this._leveid.toString() ); // DispatcherManager.dispatchEvent( UserInfoEvent.userinfoEvent_updateroleid ); // } // } get: function () { return this._leveid; }, enumerable: true, configurable: true }); Object.defineProperty(RoleData.prototype, "CharacterID", { get: function () { return this._roleid; }, set: function (value) { if (this._roleid != value) { this._roleid = value; this.InitCharacterInfo(); LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.roleid, this._roleid.toString()); DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid); } }, enumerable: true, configurable: true }); Object.defineProperty(RoleData.prototype, "Money", { get: function () { return this._Gold; }, set: function (value) { if (this._Gold != value) { this._Gold = value; LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.gold, this._Gold.toString()); DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.UserInfoEvent_updateUserData); } }, enumerable: true, configurable: true }); return RoleData; }(DataInfoBase_1.DataInfoBase)); exports.RoleData = RoleData; },{"../CFG/LevelCFG":11,"../CFG/RoleCFG":14,"../Control/LocalDataControl":23,"../Data/UserDataInfo":35,"../Data/UserInfoEvent":36,"../utils/DispatcherManager":85,"../utils/GameUtils":87,"./DataInfoBase":31}],34:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var SkinData = /** @class */ (function () { function SkinData() { /** * 0:未拥有,1:已经拥有 */ this.state = 0; this.hasnum = 0; /************************************ */ } /************************************ */ SkinData.prototype.createText = function () { var txt = new Laya.Text(); txt.text = "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!"; txt.width = 300; txt.fontSize = 40; txt.color = "#ffffff"; //设置文本为多行文本 txt.wordWrap = true; txt.x = Laya.stage.width - txt.textWidth >> 1; txt.y = Laya.stage.height - txt.textHeight >> 1; Laya.stage.addChild(txt); }; return SkinData; }()); exports.SkinData = SkinData; },{}],35:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Event = Laya.Event; var UserDataInfo = /** @class */ (function () { function UserDataInfo() { } /******************************* */ UserDataInfo.prototype.onCallLater = function () { console.log("onCallLater triggered"); var text = new Laya.Text(); text.font = "SimHei"; text.fontSize = 30; text.color = "#FFFFFF"; text.text = "打开控制台可见该函数仅触发了一次"; text.size(Laya.stage.width, Laya.stage.height); text.wordWrap = true; text.valign = "middle"; text.align = "center"; Laya.stage.addChild(text); }; UserDataInfo.prototype.onDecreaseAlpha1 = function (e) { //移除鼠标单击事件 this.button1.off(Event.CLICK, this, this.onDecreaseAlpha1); //定时执行一次(间隔时间) Laya.timer.once(3000, this, this.onComplete1); }; UserDataInfo.prototype.onDecreaseAlpha2 = function (e) { //移除鼠标单击事件 this.button2.off(Event.CLICK, this, this.onDecreaseAlpha2); //定时执行一次(基于帧率) Laya.timer.frameOnce(60, this, this.onComplete2); }; UserDataInfo.prototype.onComplete1 = function () { //spBtn1的透明度减少0.5 this.button1.alpha -= 0.5; }; UserDataInfo.prototype.onComplete2 = function () { //spBtn2的透明度减少0.5 this.button2.alpha -= 0.5; }; /******************************************************** */ /** * 记录上次离开时间 */ UserDataInfo.lasttime = "lasttime"; UserDataInfo.caplastflushtime = "captime"; UserDataInfo.capstorageappids = "capappids"; UserDataInfo.hasgetappids = "hasgetappids"; /******************************* */ /** * 角色信息 */ UserDataInfo.roleData = "roleData"; /********************************************************************** */ UserDataInfo.gold = "gold"; UserDataInfo.roleid = "roleid"; UserDataInfo.levelid = "levelid"; /** * 皮肤 */ UserDataInfo.skin = "skin"; UserDataInfo.lastDay = "lastDay"; UserDataInfo.nowdayShare = "dayshare"; UserDataInfo.nowdayVideo = "dayvideo"; return UserDataInfo; }()); exports.UserDataInfo = UserDataInfo; },{}],36:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var UserInfoEvent = /** @class */ (function () { function UserInfoEvent() { } UserInfoEvent.UserInfoEvent_updateUserData = "UserInfoEvent_updateUserData"; UserInfoEvent.userinfoEvent_updateroleid = "userinfoEvent_updateroleid"; UserInfoEvent.userinfoEvent_levelid = "userinfoEvent_levelid"; UserInfoEvent.updatePlayerInfo = "UserInfoEvent_updatePlayerInfo"; return UserInfoEvent; }()); exports.UserInfoEvent = UserInfoEvent; },{}],37:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Global_1 = require("./Global"); var PanelResDic_1 = require("./PrefabControl/PanelResDic"); var DispatcherManager_1 = require("./utils/DispatcherManager"); var ComponentEventData_1 = require("./Data/ComponentEventData"); var RecConfigs_1 = require("./Config/RecConfigs"); var TimesTamper_1 = require("./Time/TimesTamper"); var AssetPath_1 = require("./Config/AssetPath"); var TimerService_1 = require("./Time/TimerService"); var GlobalWaiting_1 = require("./GlobalWaiting"); var PanelBaseControl_1 = require("./Control/PanelBaseControl"); var GamePool_1 = require("./PrefabControl/GamePool"); var LayoutControl_1 = require("./Control/LayoutControl"); var ViewManager_1 = require("./View/ViewManager"); var ResourceControl_1 = require("./Control/ResourceControl"); var ResDataControl_1 = require("./Control/ResDataControl"); var AudioControl_1 = require("./Control/AudioControl"); var ConnectControl_1 = require("./Control/ConnectControl"); var pingtaiutils_1 = require("./WXSDK/pingtaiutils"); var AgencyLogin_1 = require("./Agency/AgencyLogin"); var AgencyUserMessage_1 = require("./Agency/AgencyUserMessage"); var AgencyMain_1 = require("./Agency/AgencyMain"); var AgencyInGame_1 = require("./Agency/AgencyInGame"); var AgencySkin_1 = require("./Agency/AgencySkin"); var AgencyTrial_1 = require("./Agency/AgencyTrial"); var AgencyLottery_1 = require("./Agency/AgencyLottery"); /* * name; */ var GameContents = /** @class */ (function (_super) { __extends(GameContents, _super); function GameContents() { return _super.call(this) || this; } /** * 初始化游戏 */ GameContents.prototype.initGame = function () { RecConfigs_1.RecConfigs.Instance.init(); DispatcherManager_1.DispatcherManager.init(); TimerService_1.TimerService.Instance.init(); LayoutControl_1.LayoutControl.Instance.initlayer(); ViewManager_1.ViewManager.Instance.init(); ResourceControl_1.ResourceControl.Instance.init(); ResDataControl_1.ResDataControl.Instance.init(); AudioControl_1.AudioControl.Instance.init(); ConnectControl_1.ConnectControl.Connnect(); TimesTamper_1.TimesTamper.Instance.init(); pingtaiutils_1.pingtaiutils.Instance.init(); this.initPoolObject(); this.initProxy(); this.initmapView(); this.beginLoadHandler(); }; /** * 初始化对象池 */ GameContents.prototype.initPoolObject = function () { GamePool_1.GamePool.Mark(ComponentEventData_1.ComponentEventData.ResDicValue, ComponentEventData_1.ComponentEventData); }; /** * 初始化模块代理类 */ GameContents.prototype.initProxy = function () { var mvcpool = PanelResDic_1.PanelResDic.Instance; mvcpool.AgencyAdd(AgencyLogin_1.AgencyLogin); mvcpool.AgencyAdd(AgencyUserMessage_1.AgencyUserMessage); mvcpool.AgencyAdd(AgencyMain_1.AgencyMain); mvcpool.AgencyAdd(AgencyInGame_1.AgencyInGame); mvcpool.AgencyAdd(AgencySkin_1.AgencySkin); mvcpool.AgencyAdd(AgencyTrial_1.AgencyTrial); mvcpool.AgencyAdd(AgencyLottery_1.AgencyLottery); }; GameContents.prototype.initmapView = function () { var mvcpool = PanelResDic_1.PanelResDic.Instance; // mvcpool.mapView( MapViewType.DailyrewardView,DailyrewardView ); }; GameContents.prototype.beginLoadHandler = function () { var patharr = []; patharr.push({ url: AssetPath_1.AssetPath.getResConfig(), type: Laya.Loader.JSON }); patharr.push({ url: AssetPath_1.AssetPath.getGameVersion(), type: Laya.Loader.JSON }); ResourceControl_1.ResourceControl.Instance.Loaders(patharr, this, this.recloadComplete); }; GameContents.prototype.recloadComplete = function () { var gameversion = ResDataControl_1.ResDataControl.Instance.GainResources(AssetPath_1.AssetPath.getGameVersion(), false); if (gameversion) { Global_1.Global.gameVersion = gameversion.version; } else { Global_1.Global.gameVersion = "1.0.0"; } var configres = ResDataControl_1.ResDataControl.Instance.GainResources(AssetPath_1.AssetPath.getResConfig(), false); RecConfigs_1.RecConfigs.Instance.initRec(configres); ResourceControl_1.ResourceControl.Instance.loadGroup("loading", this, this.onPreLoaded, this.onPreprogress); }; GameContents.prototype.onPreprogress = function (value) { }; GameContents.prototype.onPreLoaded = function () { ResDataControl_1.ResDataControl.Instance.AddViewPackByName("loading", true, false); var globalwaiturl = fairygui.UIPackage.getItemURL("loading", "globalWaiting"); PanelBaseControl_1.PanelBaseControl.viewbgUrl = fairygui.UIPackage.getItemURL("loading", "img_black"); fairygui.UIObjectFactory.setPackageItemExtension(globalwaiturl, GlobalWaiting_1.GlobalWaiting); fairygui.UIConfig.globalModalWaiting = globalwaiturl; fairygui.UIConfig.windowModalWaiting = globalwaiturl; // CPAUtils.init(); this.Login(); }; GameContents.prototype.Login = function () { PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyLogin_1.AgencyLogin).Login(); }; return GameContents; }(Laya.EventDispatcher)); exports.GameContents = GameContents; },{"./Agency/AgencyInGame":2,"./Agency/AgencyLogin":3,"./Agency/AgencyLottery":4,"./Agency/AgencyMain":5,"./Agency/AgencySkin":6,"./Agency/AgencyTrial":7,"./Agency/AgencyUserMessage":8,"./Config/AssetPath":15,"./Config/RecConfigs":16,"./Control/AudioControl":18,"./Control/ConnectControl":19,"./Control/LayoutControl":22,"./Control/PanelBaseControl":24,"./Control/ResDataControl":27,"./Control/ResourceControl":28,"./Data/ComponentEventData":30,"./Global":41,"./GlobalWaiting":42,"./PrefabControl/GamePool":47,"./PrefabControl/PanelResDic":48,"./Time/TimerService":59,"./Time/TimesTamper":60,"./View/ViewManager":70,"./WXSDK/pingtaiutils":82,"./utils/DispatcherManager":85}],38:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PropManager_1 = require("../PrefabControl/PropManager"); var GameUtils_1 = require("../utils/GameUtils"); var GameCFG_1 = require("../CFG/GameCFG"); var Sprite = Laya.Sprite; var TiledMap = Laya.TiledMap; var Point = Laya.Point; var Rectangle = Laya.Rectangle; var Handler = Laya.Handler; var CameraManager = /** @class */ (function (_super) { __extends(CameraManager, _super); function CameraManager() { var _this = _super.call(this) || this; _this.iscanfollow = false; /***************************************************************** */ _this._upvec = new Laya.Vector3(0, 1, 0); _this._index = 0; _this._slerpValue = 8; _this._lookatVec = new Laya.Vector3; return _this; } CameraManager.prototype.onAwake = function () { //获取脚本所属对象 this.camera = this.owner; this._toVec = new Laya.Vector3(); this.camera.fieldOfView = 90; }; CameraManager.prototype.onStart = function () { this._transform = this.camera.transform; //旋转摄像机角度 this._transform.rotate(new Laya.Vector3(0, 0, 0), true, false); // this.camera.clearColor = null; }; CameraManager.prototype.createMap = function () { this.tiledMap = new TiledMap(); this.tiledMap.createMap("res/tiledMap/isometric_grass_and_water.json", new Rectangle(0, 0, Laya.stage.width, Laya.stage.height), Handler.create(this, this.mapLoaded), null, new Point(1600, 800)); }; CameraManager.prototype.onStageClick = function () { var p = new Point(0, 0); this.layer.getTilePositionByScreenPos(Laya.stage.mouseX, Laya.stage.mouseY, p); this.layer.getScreenPositionByTilePos(Math.floor(p.x), Math.floor(p.y), p); this.sprite.pos(p.x, p.y); }; CameraManager.prototype.mapLoaded = function () { this.layer = this.tiledMap.getLayerByIndex(0); var radiusX = 32; var radiusY = Math.tan(180 / Math.PI * 30) * radiusX; var color = "#FF7F50"; this.sprite = new Sprite(); this.sprite.graphics.drawLine(0, 0, -radiusX, radiusY, color); this.sprite.graphics.drawLine(0, 0, radiusX, radiusY, color); this.sprite.graphics.drawLine(-radiusX, radiusY, 0, radiusY * 2, color); this.sprite.graphics.drawLine(radiusX, radiusY, 0, radiusY * 2, color); Laya.stage.addChild(this.sprite); }; CameraManager.prototype.onUpdate = function () { if (this.iscanfollow) { if (PropManager_1.PropManager.iscarmanpc) { if (PropManager_1.PropManager.npcDict["npc_0"]) { Laya.Vector3.add(PropManager_1.PropManager.npcDict["npc_0"].transform.position, this._disVector, this._toVec); this._transform.position = this._toVec; this._transform.position.x = PropManager_1.PropManager.npcDict["npc_0"].transform.position.x; this._transform.lookAt(PropManager_1.PropManager.npcDict["npc_0"].transform.position, this._upvec); } } else { if (PropManager_1.PropManager.mainRole) { Laya.Vector3.add(PropManager_1.PropManager.mainRole.transform.position, this._disVector, this._toVec); // this._toVec.x = PropManager.mainRole.transform.position.x; // this._transform.position = this._toVec; // this._transform.lookAt( PropManager.mainRole.transform.position,this._upvec ); Laya.Vector3.lerp(this._transform.position, this._toVec, 16 / 1000 * this._slerpValue, this._toVec); // this._toVec.z = PropManager.mainRole.transform.position.z+this._disVector.z; // this._toVec.y = PropManager.mainRole.transform.position.y + this._disVector.y; this._transform.position = this._toVec; this._lookatVec.x = this._toVec.x; this._lookatVec.y = PropManager_1.PropManager.mainRole.transform.position.y; this._lookatVec.z = PropManager_1.PropManager.mainRole.transform.position.z; this._transform.lookAt(this._lookatVec, this._upvec); } } } }; CameraManager.prototype.GameEndRotate = function (targetPos, speed) { this.iscanfollow = false; this._transform.translate(speed, false); this._transform.lookAt(targetPos, this._upvec); }; CameraManager.prototype.SetCameraPosition = function (vec) { var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[1].value); this._disVector = new Laya.Vector3(Number(valueArr[0]), Number(valueArr[1]), Number(valueArr[2])); Laya.Vector3.add(vec, this._disVector, this._toVec); this.camera.transform.position = this._toVec; this.camera.transform.position.x = vec.x; // this.camera.transform.lookAt( vec,new Laya.Vector3( 0,1,0 ) ); }; return CameraManager; }(Laya.Script3D)); exports.CameraManager = CameraManager; },{"../CFG/GameCFG":10,"../PrefabControl/PropManager":49,"../utils/GameUtils":87}],39:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TimerService_1 = require("../Time/TimerService"); var PropManager_1 = require("../PrefabControl/PropManager"); var CharacterState_1 = require("../PrefabControl/CharacterState"); var BuildCFG_1 = require("../CFG/BuildCFG"); var CameraManager_1 = require("./CameraManager"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var GameState_1 = require("../utils/GameState"); var GameUtils_1 = require("../utils/GameUtils"); var AssetManager_1 = require("../Control/AssetManager"); var PoolManager_1 = require("../Control/PoolManager"); var NpcScript = /** @class */ (function (_super) { __extends(NpcScript, _super); function NpcScript() { var _this = _super.call(this) || this; _this._nowAction = ""; _this.resouseName = ""; _this._shangpaVec = new Laya.Vector3; /**是否发生碰撞 */ _this.haveCollision = false; _this._TargetCollision = ""; _this._normalizeVec = new Laya.Vector3; _this.staybuild = ""; _this.stayscene = ""; /** * 0:未锁,1:锁左边,2:锁右边 */ _this._lockxstate = 0; /** * 状态,0:等待状态,1:开始状态,2:完成状态 */ _this._nowRoleState = 0; _this.movespeed = 0; _this.frontjumpspeed = new Laya.Vector3; _this.leftjumpspeed = new Laya.Vector3; _this.rightjumpspeed = new Laya.Vector3; _this.climbspeed = 0; _this.sideclimbspeed = new Laya.Vector3; _this._lockbyBuildname = ""; /** * 0:未被锁,1:锁定左边,2:锁定右边, */ _this._lockstate = 0; _this.LastAction = ""; _this._moveTime = 0; _this._chixuTime = 0; _this._isActionNums = false; _this._isneedactionnum = 0; _this._needactiontime = 0; _this.NowLastActionState = ""; _this._moveVec = new Laya.Vector3; _this.jumpSpeed = new Laya.Vector3; _this.jumpHight = 0; _this._disy = 0; _this.Gravity_g = 10; //重力加速度 _this._checktime = 0; _this._ending = false; _this._endAnmoSpeed = new Laya.Vector3(); _this._endanmotime = 1; _this._endAnmoSpeed1 = new Laya.Vector3; _this._changeMoveX = 0; _this.HaveForceJump = false; _this.quaternion = new Laya.Quaternion; return _this; } NpcScript.prototype.onAwake = function () { this._animator = this.owner.getComponent(Laya.Animator); PropManager_1.PropManager.setAnimator(this._animator); }; NpcScript.prototype.onStart = function () { this._speedMoveV3 = new Laya.Vector3(0, 0, 0); this._transform = this.owner.transform; var sp = this.owner; // (sp.getChildByName("lefttrail") as Laya.TrailSprite3D).active = false; // (sp.getChildByName("righttrail") as Laya.TrailSprite3D ).active = false; var LeftTrial1 = sp.getChildByName("lefttrail"); var RightTrial1 = sp.getChildByName("righttrail"); console.log(); var scale = 0.001; var index = GameUtils_1.GameUtils.randRangeint(0, AssetManager_1.AssetManager.AllMapDic.length - 1); index = index % AssetManager_1.AssetManager.AllMapDic.length; var prefabs = AssetManager_1.AssetManager.AllMapDic[index]; this.LeftTrial = PoolManager_1.default.GetSprite3D(prefabs); LeftTrial1.parent.addChild(this.LeftTrial); this.LeftTrial.transform.localPosition = LeftTrial1.transform.localPosition.clone(); this.LeftTrial.transform.localRotationEuler = LeftTrial1.transform.localRotationEuler.clone(); this.LeftTrial.transform.localScale = new Laya.Vector3(scale, scale, scale); this.RightTrial = PoolManager_1.default.GetSprite3D(prefabs); RightTrial1.parent.addChild(this.RightTrial); this.RightTrial.transform.localPosition = RightTrial1.transform.localPosition.clone(); this.RightTrial.transform.localRotationEuler = RightTrial1.transform.localRotationEuler.clone(); this.RightTrial.transform.localScale = new Laya.Vector3(scale, scale, scale); RightTrial1.active = false; LeftTrial1.active = false; console.log(sp.name); }; NpcScript.prototype.startRun = function () { if (this._nowNpcinfo.gravity) { this.Gravity_g = this._nowNpcinfo.gravity; } else { this.Gravity_g = 10; } this._checktime = 500; this._nowRoleState = 1; this._ending = false; this._changeMoveX = 0; this._initPosVec = this._transform.position.clone(); this.staybuild = ""; this.stayscene = ""; this._nowAction = CharacterState_1.CharacterState.stand; this.nowAction = CharacterState_1.CharacterState.run; this._speedMoveV3.x = 0; this._speedMoveV3.y = 0; this._speedMoveV3.z = -this.movespeed; this._iscanMove = true; TimerService_1.TimerService.Instance.addUpdateTarget(this); }; NpcScript.prototype.npcinfo = function (cfg) { this._nowNpcinfo = cfg; this.movespeed = this._nowNpcinfo.speed; this.climbspeed = Number(this._nowNpcinfo.upclimb); this.frontjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.frontjump.x), Number(this._nowNpcinfo.frontjump.y), Number(this._nowNpcinfo.frontjump.z)); this.leftjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.leftjump.x), Number(this._nowNpcinfo.leftjump.y), Number(this._nowNpcinfo.leftjump.z)); this.rightjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.rightjump.x), Number(this._nowNpcinfo.rightjump.y), Number(this._nowNpcinfo.rightjump.z)); this.sideclimbspeed = new Laya.Vector3(Number(this._nowNpcinfo.slideclimb.x), Number(this._nowNpcinfo.slideclimb.y), Number(this._nowNpcinfo.slideclimb.z)); // this.frontjump.x = Number( this._nowNpcinfo.frontjump.x ); // this.frontjump.y = Number( this._nowNpcinfo.frontjump.y ); // this.frontjump.z = Number( this._nowNpcinfo.frontjump.z ); // this.leftjump.x = Number( this._nowNpcinfo.leftjump.x ); // this.leftjump.y = Number( this._nowNpcinfo.leftjump.y ); // this.leftjump.z = Number( this._nowNpcinfo.leftjump.z ); // this.rightjump.x = Number( this._nowNpcinfo.rightjump.x ); // this.rightjump.y = Number( this._nowNpcinfo.rightjump.y ); // this.rightjump.z = Number( this._nowNpcinfo.rightjump.z ); // this.upclimb = Number( this._nowNpcinfo.upclimb ); // this.slideclimb.x = Number( this._nowNpcinfo.slideclimb.x ); // this.slideclimb.y = Number( this._nowNpcinfo.slideclimb.y ); // this.slideclimb.z = Number( this._nowNpcinfo.slideclimb.z ); }; /** * 开始碰撞时执行 */ NpcScript.prototype.onCollisionEnter = function (collision) { if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { var contactPoint = collision.contacts[0]; this.Calculate(contactPoint.normal, collision.other.owner); } }; NpcScript.prototype.setnowSelectVec = function (pos) { this._nowselectVec = pos; }; NpcScript.prototype.Calculate = function (normal, target) { if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) { return; } this._TargetCollision = target.name; var n = new Laya.Vector3; Laya.Vector3.normalize(normal, this._normalizeVec); if (this._TargetCollision.indexOf("build") != -1 || this._TargetCollision.indexOf("Scaffolding") != -1 || this._TargetCollision.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬 { if (this._TargetCollision.indexOf("build") != -1) { this.staybuild = this._TargetCollision; this.stayscene = target.parent.parent.name; } if (this._TargetCollision.indexOf("irongauze") != -1) { this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name); } else { this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._TargetCollision); } if (this._normalizeVec.z == -1) //上爬 { if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.1)) { this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); this.nowAction = CharacterState_1.CharacterState.run; } else { this.nowAction = CharacterState_1.CharacterState.climbup; this._shangpaVec = this._nowselectVec.clone(); } } else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) { this.nowAction = CharacterState_1.CharacterState.run; } else if (this._normalizeVec.x == -1) { if (this.nowAction == CharacterState_1.CharacterState.run) { this._lockxstate = 1; } else if (this.nowAction == CharacterState_1.CharacterState.climbup) { this._lockxstate = 1; } else { this.nowAction = CharacterState_1.CharacterState.climbleft; } } else if (this._normalizeVec.x == 1) { if (this.nowAction == CharacterState_1.CharacterState.run) { this._lockxstate = 2; } else if (this.nowAction == CharacterState_1.CharacterState.climbup) { this._lockxstate = 2; } else { this.nowAction = CharacterState_1.CharacterState.climbright; } } else { if (this._normalizeVec.z != 1) { this.nowAction = CharacterState_1.CharacterState.climbupblock; this._shangpaVec = this._nowselectVec.clone(); } } } else if (this._TargetCollision.indexOf("panel_jump") != -1) //加速板跳跃 { this.nowAction = CharacterState_1.CharacterState.speedupjump; // this.setJump( this.nowAction ); } else if (this._TargetCollision.indexOf("panel_downslip") != -1) { this.nowAction = CharacterState_1.CharacterState.downmove; // this.setJump( this.nowAction ); } else if (this._TargetCollision.indexOf("box_Board") != -1 && this.nowAction != CharacterState_1.CharacterState.downmove) { if (this._normalizeVec.z == -1) //上爬 { this.nowAction = CharacterState_1.CharacterState.climbup; this._shangpaVec = this._nowselectVec.clone(); } } else if (this._TargetCollision.indexOf("box_sidejump") != -1) { this.nowAction = CharacterState_1.CharacterState.sidespeedup; // this.setJump( this.nowAction ); } else if (this._TargetCollision.indexOf("box_Surmount") != -1) { this.nowAction = CharacterState_1.CharacterState.cross; // this.setJump( this.nowAction ); } else if (this._TargetCollision.indexOf("irongauze") != -1) { this.nowAction = CharacterState_1.CharacterState.climbup; this._shangpaVec = this._nowselectVec.clone(); } }; /** * 持续碰撞时执行 */ NpcScript.prototype.onCollisionStay = function (collision) { // Debuger.log( "碰撞中" ); if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { this.haveCollision = true; var contactPoint = collision.contacts[0]; var target = collision.other.owner; var targetname = target.name; if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1 && targetname.indexOf("role") == -1) { this._TargetCollision = targetname; } if (this._TargetCollision.indexOf("build") != -1 || this._TargetCollision.indexOf("Scaffolding") != -1 || this._TargetCollision.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬 { if (this._TargetCollision.indexOf("build") != -1) { this.staybuild = this._TargetCollision; this.stayscene = target.parent.parent.name; } if (this._TargetCollision.indexOf("irongauze") != -1) { this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name); } else { this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._TargetCollision); } } } }; /** * 结束碰撞时执行 */ NpcScript.prototype.onCollisionExit = function (collision) { this.haveCollision = false; if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { var contactPoint = collision.contacts[0]; this.CheckEnd(contactPoint.normal, collision.other.owner); } }; NpcScript.prototype.CheckEnd = function (normal, target) { if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) { return; } if (this.HaveForceJump) { this.HaveForceJump = false; return; } if (this._lockxstate) { this._lockxstate = 0; return; } if (this._TargetCollision != target.name) { return; } if (target.name.indexOf("panel_jump") != -1) { return; } switch (this.nowAction) { case CharacterState_1.CharacterState.climbup: case CharacterState_1.CharacterState.climbupblock: if (this._TargetCollision.indexOf("box_Board") != -1) { this.JumpAction(this._changeMoveX); } else { if (this._changeMoveX > 0) { this.nowAction = CharacterState_1.CharacterState.jumpright; } else if (this._changeMoveX < 0) { this.nowAction = CharacterState_1.CharacterState.jumpleft; } } break; case CharacterState_1.CharacterState.climbright: case CharacterState_1.CharacterState.climbleft: this.JumpAction(this._changeMoveX); break; case CharacterState_1.CharacterState.run: this.JumpAction(this._changeMoveX); break; case CharacterState_1.CharacterState.MoveX: this.JumpAction(this._speedMoveV3.x); break; } }; NpcScript.prototype.JumpAction = function (value, isquanzhong) { if (isquanzhong === void 0) { isquanzhong = false; } if (value > 0) { this.nowAction = CharacterState_1.CharacterState.jumpright; } else if (value < 0) { this.nowAction = CharacterState_1.CharacterState.jumpleft; } else { if (isquanzhong) { if (this._TargetCollision.indexOf("build") != -1) { var sort = GameUtils_1.GameUtils.randRangeint(0, 100); var allvalue = 0; var sort; var selectdir = ""; if (this._TargetCollision.indexOf("leftright") != -1) { allvalue = this._nowNpcinfo.jump_left + this._nowNpcinfo.jump_right; sort = GameUtils_1.GameUtils.randRangeint(0, allvalue); if (sort <= this._nowNpcinfo.jump_left) { selectdir = "left"; } else { selectdir = "right"; } } else if (this._TargetCollision.indexOf("frontright") != -1) { allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_right; sort = GameUtils_1.GameUtils.randRangeint(0, allvalue); if (sort <= this._nowNpcinfo.start_ahead) { selectdir = "front"; } else { selectdir = "right"; } } else if (this._TargetCollision.indexOf("frontleft") != -1) { allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left; sort = GameUtils_1.GameUtils.randRangeint(0, allvalue); if (sort <= this._nowNpcinfo.start_ahead) { selectdir = "front"; } else { selectdir = "left"; } } else if (this._TargetCollision.indexOf("right") != -1) { selectdir = "right"; } else if (this._TargetCollision.indexOf("left") != -1) { selectdir = "left"; } else if (this._TargetCollision.indexOf("front") != -1) { selectdir = "front"; } else { allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left + this._nowNpcinfo.jump_right; sort = GameUtils_1.GameUtils.randRangeint(0, allvalue); if (sort <= this._nowNpcinfo.start_ahead) { selectdir = "front"; } else if (sort <= this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left) { selectdir = "left"; } else { selectdir = "right"; } } switch (selectdir) { case "left": this.nowAction = CharacterState_1.CharacterState.jumpleft; break; case "right": this.nowAction = CharacterState_1.CharacterState.jumpright; break; case "front": this.nowAction = CharacterState_1.CharacterState.jump; break; default: this.nowAction = CharacterState_1.CharacterState.jump; break; } } else { this.nowAction = CharacterState_1.CharacterState.jump; } } else { this.nowAction = CharacterState_1.CharacterState.jump; } } }; Object.defineProperty(NpcScript.prototype, "nowAction", { get: function () { return this._nowAction; }, set: function (value) { if (this._nowRoleState == 1) { if (this._nowAction != value || this.LastAction == CharacterState_1.CharacterState.speedupjump || this.LastAction == CharacterState_1.CharacterState.jumpright) { this.LastAction = this._nowAction; this._nowAction = value; this._moveTime = 0; switch (this._nowAction) { case CharacterState_1.CharacterState.stand: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.stand); break; case CharacterState_1.CharacterState.run: if (this.LastAction == CharacterState_1.CharacterState.jump || this.LastAction == CharacterState_1.CharacterState.jumpleft || this.LastAction == CharacterState_1.CharacterState.jumpright) { this._isActionNums = true; this._isneedactionnum = 1; var sort = GameUtils_1.GameUtils.randRangeint(0, 100); if (sort < 50) { this.PlayAnimator(CharacterState_1.CharacterState.land1); } else { this.PlayAnimator(CharacterState_1.CharacterState.land2); } } else { this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.run); } break; case CharacterState_1.CharacterState.jump: this.PlayAnimator(CharacterState_1.CharacterState.jump); this._isActionNums = true; this._isneedactionnum = 1; this.jumpSpeed.x = this.frontjumpspeed.x; this.jumpSpeed.y = this.frontjumpspeed.y; this.jumpSpeed.z = this.frontjumpspeed.z; break; case CharacterState_1.CharacterState.jumpleft: this.jumpSpeed = this.leftjumpspeed; // this.jumpSpeed.x = this.leftjumpspeed.x; // this.jumpSpeed.y = this.leftjumpspeed.y; // this.jumpSpeed.z = this.leftjumpspeed.z; this._isActionNums = true; this._isneedactionnum = 1; this.PlayAnimator(CharacterState_1.CharacterState.leftjump); break; case CharacterState_1.CharacterState.jumpright: this.jumpSpeed = this.rightjumpspeed; // this.jumpSpeed.x = this.rightjumpspeed.x; // this.jumpSpeed.y = this.rightjumpspeed.y; // this.jumpSpeed.z = this.rightjumpspeed.z; this._isActionNums = true; this._isneedactionnum = 1; this.PlayAnimator(CharacterState_1.CharacterState.rightjump); break; case CharacterState_1.CharacterState.speedupjump: var buildcfg = BuildCFG_1.default.dict["panel_jump"]; this.jumpSpeed.x = buildcfg.buffx; this.jumpSpeed.y = buildcfg.buffy; if (this.LastAction == CharacterState_1.CharacterState.speedupjump) { this.jumpSpeed.z = this.jumpSpeed.z * buildcfg.buffz; } else { this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz; } if (this.NowLastActionState == value) { this.jumpSpeed.y = buildcfg.buffy * 2; } else { this.jumpSpeed.y = buildcfg.buffy; } this._isActionNums = true; this._isneedactionnum = 1; var sort = GameUtils_1.GameUtils.randRangeint(0, 100); if (sort < 50) { this.PlayAnimator(CharacterState_1.CharacterState.highjump1); } else { this.PlayAnimator(CharacterState_1.CharacterState.highjump2); } break; case CharacterState_1.CharacterState.downmove: var buildcfg = BuildCFG_1.default.dict["panel_downslip"]; this.jumpSpeed.x = buildcfg.buffx; this.jumpSpeed.y = buildcfg.buffy; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz; this._chixuTime = buildcfg.time; this._isActionNums = true; this._isneedactionnum = 1; this.PlayAnimator(CharacterState_1.CharacterState.huachan); break; case CharacterState_1.CharacterState.cross: var buildcfg = BuildCFG_1.default.dict["box_Surmount"]; this.jumpSpeed.x = buildcfg.buffx; this.jumpSpeed.y = buildcfg.buffy + 0.5; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz; this._chixuTime = buildcfg.time; this._isActionNums = true; this._isneedactionnum = 1; this.PlayAnimator(CharacterState_1.CharacterState.hurdle); break; case CharacterState_1.CharacterState.climbup: case CharacterState_1.CharacterState.climbupblock: this.jumpSpeed.x = 0; this.jumpSpeed.y = this.climbspeed; this.jumpSpeed.z = 0; this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.climbwall); break; case CharacterState_1.CharacterState.climbleft: this.jumpSpeed = new Laya.Vector3(0, this.sideclimbspeed.y, this.sideclimbspeed.z); // this.jumpSpeed.x = 0; // this.jumpSpeed.y = this.sideclimbspeed.y; // this.jumpSpeed.z = this.sideclimbspeed.z; this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.runwallleft); break; case CharacterState_1.CharacterState.climbright: this.jumpSpeed = new Laya.Vector3(0, this.sideclimbspeed.y, this.sideclimbspeed.z); // this.jumpSpeed.x = 0; // this.jumpSpeed.y = this.sideclimbspeed.y; // this.jumpSpeed.z = this.sideclimbspeed.z; this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.runwallright); break; case CharacterState_1.CharacterState.ClimbMotion: this._isActionNums = true; this._isneedactionnum = 0; this._needactiontime = 0.3; this._moveTime = 0; this.PlayAnimator(CharacterState_1.CharacterState.climbend); break; } this.NowLastActionState = value; } } }, enumerable: true, configurable: true }); NpcScript.prototype.update = function (dt) { if (this._nowRoleState == 1) { dt = 16; this._checktime += dt; if (PropManager_1.PropManager.iscarmanpc) { } else { if (this._checktime >= 500) { this._checktime = 0; if (this._nowNpcinfo && PropManager_1.PropManager.mainRole) { if (this._transform.position.z + this._nowNpcinfo.distance < PropManager_1.PropManager.mainRole.transform.position.z) { this._iscanMove = false; } else { this._iscanMove = true; } } } } if (this._iscanMove) { var distime = dt / 1000; this._moveTime += distime; switch (this.nowAction) { case CharacterState_1.CharacterState.run: //跑动 this._moveVec.y = 0; this._moveVec.z = distime * this._speedMoveV3.z; if (this._lockxstate == 0) { this._moveVec.x = this._changeMoveX * distime; } else if (this._lockxstate == 1) { if (this._changeMoveX < 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else if (this._lockxstate == 2) { if (this._changeMoveX > 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } this._transform.translate(this._moveVec, false); break; case CharacterState_1.CharacterState.climbup: //爬升 this._moveVec.z = 0; this._moveVec.y = distime * this.jumpSpeed.y; if (this._lockxstate == 1) { if (this._changeMoveX < 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else if (this._lockstate == 2) { if (this._changeMoveX > 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else { this._moveVec.x = this._changeMoveX * distime; } this._transform.translate(this._moveVec, false); if (this._shangpaVec) { if (this._transform.position.y + 1 > this._shangpaVec.y) { this.nowAction = CharacterState_1.CharacterState.ClimbMotion; } } else if (this._nowselectVec) { if (this._transform.position.y + 1 > this._nowselectVec.y) { this.nowAction = CharacterState_1.CharacterState.ClimbMotion; } } break; case CharacterState_1.CharacterState.climbupblock: this._moveVec.z = 0; this._moveVec.y = distime * this.jumpSpeed.y; this._moveVec.x = 0; this._transform.translate(this._moveVec, false); if (this._shangpaVec) { if (this._transform.position.y + 1 > this._shangpaVec.y) { this.nowAction = CharacterState_1.CharacterState.ClimbMotion; } } else if (this._transform.position.y + 1 > this._nowselectVec.y) { this.nowAction = CharacterState_1.CharacterState.ClimbMotion; } break; case CharacterState_1.CharacterState.jump: //跳跃 case CharacterState_1.CharacterState.jumpleft: case CharacterState_1.CharacterState.jumpright: this._disy = this.jumpSpeed.y - this.Gravity_g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case CharacterState_1.CharacterState.speedupjump: this._disy = this.jumpSpeed.y - this.Gravity_g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case CharacterState_1.CharacterState.climbleft: case CharacterState_1.CharacterState.climbright: this._moveVec.z = distime * this.jumpSpeed.y; this._moveVec.y = this.jumpSpeed.y * distime; this._moveVec.x = 0; this._transform.translate(this._moveVec, false); break; case CharacterState_1.CharacterState.MoveX: this._moveVec.z = distime * this._speedMoveV3.z; this._moveVec.x = this._speedMoveV3.x * distime; this._transform.translate(this._moveVec, false); if (this._moveTime > 0.1) { this.nowAction = CharacterState_1.CharacterState.run; } break; case CharacterState_1.CharacterState.downmove: this._moveVec.y = this.jumpSpeed.x; this._moveVec.x = this.jumpSpeed.y; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); if (this._moveTime > this._chixuTime) { this.nowAction = CharacterState_1.CharacterState.run; } break; case CharacterState_1.CharacterState.sidespeedup: this._moveVec.y = 0; this._moveVec.x = 0; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); if (this._moveTime > this._chixuTime && this.LastAction == CharacterState_1.CharacterState.climbleft || this.LastAction == CharacterState_1.CharacterState.climbright) { this.nowAction = this.LastAction; } else { this.nowAction = CharacterState_1.CharacterState.jump; // this.setJump( this.nowAction ); } break; case CharacterState_1.CharacterState.cross: this._disy = this.jumpSpeed.y - this.Gravity_g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case CharacterState_1.CharacterState.ClimbMotion: if (this._nowselectVec) { if (this._transform.position.y < this._nowselectVec.y) { this._moveVec.x = 0; this._moveVec.y = (1 / 0.3) * distime; this._moveVec.z = 0; this._transform.translate(this._moveVec, false); } } break; } if (this._nowselectVec && (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.downmove) && !this.haveCollision) { if (this._transform.position.z <= this._nowselectVec.z) { if (this._changeMoveX > 0) { this.nowAction = CharacterState_1.CharacterState.jumpright; } else if (this._changeMoveX < 0) { this.nowAction = CharacterState_1.CharacterState.jumpleft; } else { this.nowAction = CharacterState_1.CharacterState.jump; } } } if (this._transform.position.y < PropManager_1.PropManager.diePosY) //角色死亡 { if (this.stayscene == "" || this.staybuild == "") { this._transform.position = this._initPosVec.clone(); } else { this._transform.position = PropManager_1.PropManager.getPosVecbyScene(this.stayscene, this.staybuild).clone(); } this.nowAction = CharacterState_1.CharacterState.run; } if (this._transform.position.z < PropManager_1.PropManager.gamewinPosZ) { this.Win(); } if (this._isActionNums) { //如果当前播放state已经播放完了一次 if (this._isneedactionnum > 0) { if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) { switch (this._nowActionName) { case CharacterState_1.CharacterState.jump: case CharacterState_1.CharacterState.leftjump: case CharacterState_1.CharacterState.rightjump: case CharacterState_1.CharacterState.highjump1: case CharacterState_1.CharacterState.highjump2: case CharacterState_1.CharacterState.hurdle: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.sky); break; case CharacterState_1.CharacterState.huachan: case CharacterState_1.CharacterState.climbend: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.run); this.nowAction = CharacterState_1.CharacterState.run; this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); break; case CharacterState_1.CharacterState.land1: case CharacterState_1.CharacterState.land2: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.run); break; } } } else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) { switch (this._nowActionName) { case CharacterState_1.CharacterState.jump: case CharacterState_1.CharacterState.leftjump: case CharacterState_1.CharacterState.rightjump: case CharacterState_1.CharacterState.highjump1: case CharacterState_1.CharacterState.highjump2: case CharacterState_1.CharacterState.hurdle: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.sky); break; case CharacterState_1.CharacterState.huachan: case CharacterState_1.CharacterState.climbend: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.run); this.nowAction = CharacterState_1.CharacterState.run; this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); break; } } } } else { if (this._ending) { var distime = dt / 1000; this._moveTime += distime; if (this._moveTime >= this._endanmotime) { this.GameOver(); } else { this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime; this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime; this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime; PropManager_1.PropManager.carma.getComponent(CameraManager_1.CameraManager).GameEndRotate(this._transform.position, this._endAnmoSpeed1); } } } } }; NpcScript.prototype.GameOver = function () { this._ending = false; TimerService_1.TimerService.Instance.removeUpdateTarget(this); DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.end); }; NpcScript.prototype.Win = function () { TimerService_1.TimerService.Instance.removeUpdateTarget(this); this._nowRoleState = 2; this.PlayAnimator(CharacterState_1.CharacterState.sky); DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.npcend, this.owner.name); }; NpcScript.prototype.stop = function () { TimerService_1.TimerService.Instance.removeUpdateTarget(this); }; NpcScript.prototype.destroy = function () { TimerService_1.TimerService.Instance.removeUpdateTarget(this); _super.prototype.destroy.call(this); }; NpcScript.prototype.Joy = function (value, angle) { if (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.climbup || CharacterState_1.CharacterState.climbleft || CharacterState_1.CharacterState.climbright) { this._changeMoveX = value; } if (this.nowAction == CharacterState_1.CharacterState.climbleft && this._changeMoveX > 0) //强制跳跃 { this.HaveForceJump = true; this.nowAction = CharacterState_1.CharacterState.jumpright; } else if (this.nowAction == CharacterState_1.CharacterState.climbright && this._changeMoveX < 0) { this.HaveForceJump = true; this.nowAction = CharacterState_1.CharacterState.jumpleft; } if (this.nowAction == CharacterState_1.CharacterState.jump || this.nowAction == CharacterState_1.CharacterState.jumpleft || this.nowAction == CharacterState_1.CharacterState.jumpright || this.nowAction == CharacterState_1.CharacterState.speedupjump) angle = -angle * Math.PI / 180; Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion); Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed); }; NpcScript.prototype.PlayAnimator = function (actionName) { // this._nowActionName = actionName; var _actionname = this.TransitionActionName(actionName); this._nowActionName = actionName; if (this._animator) { if (this._nowActionName == CharacterState_1.CharacterState.climbend) { this._animator.speed = 1.5; } else { this._animator.speed = 1; } this._animator.play(_actionname, 0, 0); } }; /**转换动作名称 */ NpcScript.prototype.TransitionActionName = function (_actionname) { switch (_actionname) { case "rollover1": return "cefan1"; case "rollover2": return "cefan2"; case "runwallleft": return "paoqiangleft"; case "rightjump": return "rightjump"; case "runwallright": return "paoqiangright"; case "leftjump": return "leftjump"; case "climbwall": return "paqiang"; case "climbend": return "climbend"; case "stand": return "stand"; case "sky": return "kongzhong"; case "land1": return "luodi1"; case "land2": return "luodi2"; case "highjump1": return "datiao1"; case "highjump2": return "datiao2"; case "run": return "run"; case "jump": return "jump"; case "climbup": return "Climb"; case "falldown": return "Freefalling"; case "climbleft": return "left_climb"; case "climbright": return "right_climb"; case "jumpright": return "right_jump"; case "jumpleft": return "left_jump"; case "ClimbMotion": return "PlayPalouAction"; case "huachan": return "huachan"; case "hurdle": return "kualan"; case "speedupjump": return "jiasuJump"; case "MoveX": return "xshunyi"; case "downmove": return "downSlide"; case "sidespeedup": return "slidejiasu"; case "cross": return "surmount"; case "climbupblock": return "lockclimb"; } }; NpcScript.prototype.TestJump = function () { this.nowAction = CharacterState_1.CharacterState.jump; }; NpcScript.prototype.getPostion = function () { return this._transform.position; }; NpcScript.prototype.getAction = function () { return this._nowRoleState; }; NpcScript.prototype.onDestroy = function () { console.log("拖尾回收成功----"); PoolManager_1.default.RecoverSprite3D(this.LeftTrial); PoolManager_1.default.RecoverSprite3D(this.RightTrial); }; return NpcScript; }(Laya.Script3D)); exports.NpcScript = NpcScript; },{"../CFG/BuildCFG":9,"../Control/AssetManager":17,"../Control/PoolManager":26,"../PrefabControl/CharacterState":46,"../PrefabControl/PropManager":49,"../Time/TimerService":59,"../utils/DispatcherManager":85,"../utils/GameState":86,"../utils/GameUtils":87,"./CameraManager":38}],40:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TimerService_1 = require("../Time/TimerService"); var PropManager_1 = require("../PrefabControl/PropManager"); var CharacterState_1 = require("../PrefabControl/CharacterState"); var PanelResDic_1 = require("../PrefabControl/PanelResDic"); var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage"); var BuildCFG_1 = require("../CFG/BuildCFG"); var CameraManager_1 = require("./CameraManager"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var GameState_1 = require("../utils/GameState"); var GameUtils_1 = require("../utils/GameUtils"); var GameStateControl_1 = require("../Control/GameStateControl"); var AudioControl_1 = require("../Control/AudioControl"); var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform"); var PlayerAccount_1 = require("../WXSDK/PlayerAccount"); var AssetManager_1 = require("../Control/AssetManager"); var PoolManager_1 = require("../Control/PoolManager"); var Player = /** @class */ (function (_super) { __extends(Player, _super); function Player() { var _this = _super.call(this) || this; _this._isActionNums = false; _this._isneedactionnum = 0; _this._needactiontime = 0; _this._nowActionState = ""; _this._multiple = new Laya.Vector3(1, 1, 1); _this.LastActionState = ""; _this._moveTime = 0; /** * 加速buffvec */ _this._lastjiasuState = ""; _this.buff_speeduptime = 0; _this.canshake = false; _this.shaketime = 0; _this.doublespeedup = false; _this.resouseName = ""; _this._isColling = false; _this._nowCollTargetName = ""; _this._normalizeVec = new Laya.Vector3; _this._nowbuildname = ""; _this._nowscenename = ""; /** * 0:未锁,1:锁左边,2:锁右边 */ _this._lockxstate = 0; _this._lockbyBuildname = ""; /** * 0:未被锁,1:锁定左边,2:锁定右边, */ _this._lockstate = 0; _this._shangpaVec = new Laya.Vector3; _this.NowLastActionState = ""; _this._moveVec = new Laya.Vector3; _this.jumpSpeed = new Laya.Vector3; _this.jumpHight = 0; _this._disy = 0; _this.g = 10; //重力加速度 _this._ending = false; _this._endAnmoSpeed = new Laya.Vector3(); _this._endanmotime = 1; _this._endAnmoSpeed1 = new Laya.Vector3; _this._changeMoveX = 0; _this.isforceJump = false; _this.quaternion = new Laya.Quaternion; Player.ins = _this; return _this; } Object.defineProperty(Player, "Instance", { get: function () { if (Player.ins == null) { return new Player(); } return Player.ins; }, enumerable: true, configurable: true }); Player.prototype.onAwake = function () { this._animator = this.owner.getComponent(Laya.Animator); PropManager_1.PropManager.setAnimator(this._animator); this._speedMoveV3 = new Laya.Vector3(0, 0, 0); var sp = this.owner; this._transform = sp.transform; this._RoleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData; sp.getComponent(Laya.Rigidbody3D).ccdMotionThreshold = 0.001; var LeftTrial1 = sp.getChildByName("lefttrail"); var RightTrial1 = sp.getChildByName("righttrail"); // this.LeftTrial = sp.getChildByName("lefttrail") as Laya.TrailSprite3D; // this.RightTrial = sp.getChildByName("righttrail") as Laya.TrailSprite3D; var scale = 0.001; var index = GameUtils_1.GameUtils.randRangeint(0, AssetManager_1.AssetManager.AllMapDic.length - 1); index = index % AssetManager_1.AssetManager.AllMapDic.length; var prefabs = AssetManager_1.AssetManager.AllMapDic[index]; this.LeftTrial = PoolManager_1.default.GetSprite3D(prefabs); LeftTrial1.parent.addChild(this.LeftTrial); this.LeftTrial.transform.localPosition = LeftTrial1.transform.localPosition.clone(); this.LeftTrial.transform.localRotationEuler = LeftTrial1.transform.localRotationEuler.clone(); this.LeftTrial.transform.localScale = LeftTrial1.transform.localScale.clone(); this.LeftTrial.transform.localScale = new Laya.Vector3(scale, scale, scale); this.RightTrial = PoolManager_1.default.GetSprite3D(prefabs); RightTrial1.parent.addChild(this.RightTrial); this.RightTrial.transform.localPosition = RightTrial1.transform.localPosition.clone(); this.RightTrial.transform.localRotationEuler = RightTrial1.transform.localRotationEuler.clone(); this.RightTrial.transform.localScale = new Laya.Vector3(scale, scale, scale); RightTrial1.active = false; LeftTrial1.active = false; }; Player.prototype.startRun = function (jiasu) { var _this = this; if (this._RoleData.roleCfg.gravity) { this.g = this._RoleData.roleCfg.gravity; } else { this.g = 10; } this._multiple.x = 1; this._multiple.y = 1; this._multiple.z = 1; this.buff_speeduptime = 0; this.doublespeedup = false; this._lastjiasuState = ""; this._ending = false; this._changeMoveX = 0; this._initPosVec = this._transform.position.clone(); console.log("玩家的初始位置----", this._initPosVec); this._nowbuildname = ""; this._nowscenename = ""; this.nowAction = CharacterState_1.CharacterState.run; this._speedMoveV3.x = 0; this._speedMoveV3.y = 0; if (jiasu) { this._speedMoveV3.z = -this._RoleData.movespeed * 2; Laya.timer.once(3000, this, function () { _this._speedMoveV3.z = -_this._RoleData.movespeed; }); } else { this._speedMoveV3.z = -this._RoleData.movespeed; } this._iscanMove = true; TimerService_1.TimerService.Instance.addUpdateTarget(this); }; // private pzdict:any = {}; // private pzarr:Array = []; /** * 开始碰撞时执行 */ Player.prototype.onCollisionEnter = function (collision) { if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { var contactPoint = collision.contacts[0]; this.Calculate(contactPoint.normal, collision.other.owner, contactPoint.positionOnB); } }; /** * 持续碰撞时执行 */ Player.prototype.onCollisionStay = function (collision) { // Debuger.log( "碰撞中" ); if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { this._isColling = true; var contactPoint = collision.contacts[0]; var target = collision.other.owner; var targetname = target.name; if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1) { this._nowCollTargetName = targetname; } if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 || this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬 { if (this._nowCollTargetName.indexOf("build") != -1) { this._nowbuildname = this._nowCollTargetName; this._nowscenename = target.parent.parent.name; } if (this._nowCollTargetName.indexOf("irongauze") != -1) { this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name); } else { this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName); } } } }; /** * 结束碰撞时执行 */ Player.prototype.onCollisionExit = function (collision) { this._isColling = false; if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { var contactPoint = collision.contacts[0]; this.CheckEnd(contactPoint.normal, collision.other.owner); } }; /**检测结束碰撞 */ Player.prototype.CheckEnd = function (normal, target) { if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) { return; } if (this.isforceJump) { this.isforceJump = false; return; } if (this._lockxstate) { this._lockxstate = 0; return; } if (this._nowCollTargetName != target.name) { return; } if (target.name.indexOf("panel_jump") != -1) { return; } switch (this.nowAction) { case CharacterState_1.CharacterState.climbup: case CharacterState_1.CharacterState.climbupblock: if (this._nowCollTargetName.indexOf("box_Board") != -1) { this.JumpAction(this._changeMoveX); } else { if (this._changeMoveX > 0) { this.nowAction = CharacterState_1.CharacterState.jumpright; } else if (this._changeMoveX < 0) { this.nowAction = CharacterState_1.CharacterState.jumpleft; } } break; case CharacterState_1.CharacterState.climbright: case CharacterState_1.CharacterState.climbleft: this.JumpAction(this._changeMoveX); break; case CharacterState_1.CharacterState.run: this.JumpAction(this._changeMoveX); break; case CharacterState_1.CharacterState.MoveX: this.JumpAction(this._speedMoveV3.x); break; } }; Player.prototype.setnowSelectVec = function (pos) { this._nowselectVec = pos; }; /**计算碰撞 */ Player.prototype.Calculate = function (normal, target, collpoint) { if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) { return; } this._nowCollTargetName = target.name; var n = new Laya.Vector3; Laya.Vector3.normalize(normal, this._normalizeVec); if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 || this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬 { if (this._nowCollTargetName.indexOf("build") != -1) { this._nowbuildname = this._nowCollTargetName; this._nowscenename = target.parent.parent.name; } if (this._nowCollTargetName.indexOf("irongauze") != -1) { this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name); } else { this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName); } if (this._normalizeVec.z == -1) //上爬 { if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.2)) { this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); this.nowAction = CharacterState_1.CharacterState.run; } else { this.nowAction = CharacterState_1.CharacterState.climbup; this._shangpaVec = this._nowselectVec.clone(); } } else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) { this.nowAction = CharacterState_1.CharacterState.run; } else if (this._normalizeVec.x == -1) { if (this.nowAction == CharacterState_1.CharacterState.run) { this._lockxstate = 1; } else if (this.nowAction == CharacterState_1.CharacterState.climbup) { this._lockxstate = 1; } else { this.nowAction = CharacterState_1.CharacterState.climbleft; } } else if (this._normalizeVec.x == 1) { if (this.nowAction == CharacterState_1.CharacterState.run) { this._lockxstate = 2; } else if (this.nowAction == CharacterState_1.CharacterState.climbup) { this._lockxstate = 2; } else { this.nowAction = CharacterState_1.CharacterState.climbright; } } else { if (this._normalizeVec.z != 1) { this.nowAction = CharacterState_1.CharacterState.climbupblock; this._shangpaVec = this._nowselectVec.clone(); } } } else if (this._nowCollTargetName.indexOf("panel_jump") != -1) //加速板跳跃 { this.nowAction = CharacterState_1.CharacterState.speedupjump; } else if (this._nowCollTargetName.indexOf("panel_downslip") != -1) { this.nowAction = CharacterState_1.CharacterState.downmove; } else if (this._nowCollTargetName.indexOf("box_Board") != -1 && this.nowAction != CharacterState_1.CharacterState.downmove) { if (this._normalizeVec.z == -1) //上爬 { this.nowAction = CharacterState_1.CharacterState.climbup; this._shangpaVec = this._nowselectVec.clone(); } } else if (this._nowCollTargetName.indexOf("box_sidejump") != -1) { this.nowAction = CharacterState_1.CharacterState.sidespeedup; } else if (this._nowCollTargetName.indexOf("box_Surmount") != -1) { this.nowAction = CharacterState_1.CharacterState.cross; } else if (this._nowCollTargetName.indexOf("irongauze") != -1) { this.nowAction = CharacterState_1.CharacterState.climbup; this._shangpaVec = this._nowselectVec.clone(); } }; Player.prototype.JumpAction = function (value) { if (value > 0) { this.nowAction = CharacterState_1.CharacterState.jumpright; // this.setJump( this.nowAction ); } else if (value < 0) { this.nowAction = CharacterState_1.CharacterState.jumpleft; // this.setJump( this.nowAction ); } else { this.nowAction = CharacterState_1.CharacterState.jump; // this.setJump( this.nowAction ); } }; Player.prototype.PlayAnimator = function (actionName) { var _actionname = this.TransitionActionName(actionName); this._StateName = actionName; if (this._animator) { if (this._StateName == CharacterState_1.CharacterState.climbend || this._StateName == CharacterState_1.CharacterState.land1 || this._StateName == CharacterState_1.CharacterState.land2) { this._animator.speed = 1.5; } else { this._animator.speed = 1; } this._animator.play(_actionname, 0, 0); } }; /**转换动作名称 */ Player.prototype.TransitionActionName = function (_actionname) { switch (_actionname) { case "rollover1": return "cefan1"; case "rollover2": return "cefan2"; case "runwallleft": return "paoqiangleft"; case "rightjump": return "rightjump"; case "runwallright": return "paoqiangright"; case "leftjump": return "leftjump"; case "climbwall": return "paqiang"; case "climbend": return "climbend"; case "stand": return "stand"; case "sky": return "kongzhong"; case "land1": return "luodi1"; case "land2": return "luodi2"; case "highjump1": return "datiao1"; case "highjump2": return "datiao2"; case "run": return "run"; case "jump": return "jump"; case "climbup": return "Climb"; case "falldown": return "Freefalling"; case "climbleft": return "left_climb"; case "climbright": return "right_climb"; case "jumpright": return "right_jump"; case "jumpleft": return "left_jump"; case "ClimbMotion": return "PlayPalouAction"; case "huachan": return "huachan"; case "hurdle": return "kualan"; case "speedupjump": return "jiasuJump"; case "MoveX": return "xshunyi"; case "downmove": return "downSlide"; case "sidespeedup": return "slidejiasu"; case "cross": return "surmount"; case "climbupblock": return "lockclimb"; } }; Object.defineProperty(Player.prototype, "nowAction", { get: function () { return this._nowActionState; }, set: function (value) { if (this._nowActionState != value || this.LastActionState == CharacterState_1.CharacterState.speedupjump || this._nowActionState == CharacterState_1.CharacterState.speedupjump) { this.LastActionState = this._nowActionState; this._nowActionState = value; this._moveTime = 0; this.canshake = false; this.ChangeTrial(true); switch (this._nowActionState) { case CharacterState_1.CharacterState.stand: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.stand); break; case CharacterState_1.CharacterState.run: if (this.LastActionState == CharacterState_1.CharacterState.jump || this.LastActionState == CharacterState_1.CharacterState.jumpleft || this.LastActionState == CharacterState_1.CharacterState.jumpright) { this._isActionNums = true; this._isneedactionnum = 1; var sort = GameUtils_1.GameUtils.randRangeint(0, 100); if (sort < 50) { this.PlayAnimator(CharacterState_1.CharacterState.land1); } else { this.PlayAnimator(CharacterState_1.CharacterState.land2); } } else { this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.run); } break; case CharacterState_1.CharacterState.jump: this.PlayAnimator(CharacterState_1.CharacterState.jump); PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position); this._isActionNums = true; this._isneedactionnum = 1; this.jumpSpeed.x = this._RoleData.frontjump.x; this.jumpSpeed.y = this._RoleData.frontjump.y; this.jumpSpeed.z = this._RoleData.frontjump.z; AudioControl_1.AudioControl.Instance.playGameSound("tiao"); WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort(); break; case CharacterState_1.CharacterState.jumpleft: PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position); this.jumpSpeed.x = this._RoleData.leftjump.x; this.jumpSpeed.y = this._RoleData.leftjump.y; this.jumpSpeed.z = this._RoleData.leftjump.z; this._isActionNums = true; this._isneedactionnum = 1; this.PlayAnimator(CharacterState_1.CharacterState.leftjump); AudioControl_1.AudioControl.Instance.playGameSound("tiao"); WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort(); break; case CharacterState_1.CharacterState.jumpright: PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position); this.jumpSpeed.x = this._RoleData.rightjump.x; this.jumpSpeed.y = this._RoleData.rightjump.y; this.jumpSpeed.z = this._RoleData.rightjump.z; this._isActionNums = true; this._isneedactionnum = 1; this.PlayAnimator(CharacterState_1.CharacterState.rightjump); AudioControl_1.AudioControl.Instance.playGameSound("tiao"); WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort(); break; case CharacterState_1.CharacterState.speedupjump: var buildcfg = BuildCFG_1.default.dict["panel_jump"]; if (this.buff_speeduptime > 0) { this._multiple.x = 1; this._multiple.y = 1; this._multiple.z = buildcfg.buffz * buildcfg.buffz; this.doublespeedup = true; } else { this._multiple.x = 1; this._multiple.y = 1; this._multiple.z = buildcfg.buffz; } this.buff_speeduptime = buildcfg.time; this.jumpSpeed.x = buildcfg.buffx * this._multiple.x; if (this.NowLastActionState == value) { this.jumpSpeed.y = buildcfg.buffy * 2; } else { this.jumpSpeed.y = buildcfg.buffy; } this.jumpSpeed.y = buildcfg.buffy; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z; this._isActionNums = true; this._isneedactionnum = 1; var sort = GameUtils_1.GameUtils.randRangeint(0, 100); if (sort < 50) { this.PlayAnimator(CharacterState_1.CharacterState.highjump1); } else { this.PlayAnimator(CharacterState_1.CharacterState.highjump2); } AudioControl_1.AudioControl.Instance.playGameSound("tiao"); Laya.timer.clear(this, this.playspeedSound); Laya.timer.once(200, this, this.playspeedSound); WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort(); break; case CharacterState_1.CharacterState.downmove: var buildcfg = BuildCFG_1.default.dict["panel_downslip"]; if (this.buff_speeduptime > 0) { this._multiple.x = 1; this._multiple.y = 1; this._multiple.z = buildcfg.buffz * buildcfg.buffz; this.doublespeedup = true; } else { this._multiple.x = 1; this._multiple.y = 1; this._multiple.z = buildcfg.buffz; } this.buff_speeduptime = buildcfg.time; this.jumpSpeed.x = buildcfg.buffx * this._multiple.x; this.jumpSpeed.y = buildcfg.buffy * this._multiple.y; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z; this._isActionNums = true; this._isneedactionnum = 1; this.PlayAnimator(CharacterState_1.CharacterState.huachan); this.playspeedSound(); WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort(); break; case CharacterState_1.CharacterState.sidespeedup: var buildcfg = BuildCFG_1.default.dict["box_sidejump"]; if (this.buff_speeduptime > 0) { this._multiple.x = 1; this._multiple.y = 1; this._multiple.z = buildcfg.buffz * buildcfg.buffz; this.doublespeedup = true; } else { this._multiple.x = 1; this._multiple.y = 1; this._multiple.z = buildcfg.buffz; } this.buff_speeduptime = buildcfg.time; this.jumpSpeed.x = buildcfg.buffx * this._multiple.x; this.jumpSpeed.y = buildcfg.buffy * this._multiple.y; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z; this._isActionNums = false; this.playspeedSound(); WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort(); // this.PlayAnimator( CharacterState. ); break; case CharacterState_1.CharacterState.cross: var buildcfg = BuildCFG_1.default.dict["box_Surmount"]; if (this.buff_speeduptime > 0) { this._multiple.x = 1; this._multiple.y = 1; this._multiple.z = buildcfg.buffz * buildcfg.buffz; this.doublespeedup = true; } else { this._multiple.x = 1; this._multiple.y = 1; this._multiple.z = buildcfg.buffz; } this.buff_speeduptime = buildcfg.time; this.jumpSpeed.x = buildcfg.buffx * this._multiple.x; this.jumpSpeed.y = (buildcfg.buffy + 0.5) * this._multiple.y; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z; this._isActionNums = true; this._isneedactionnum = 1; this.PlayAnimator(CharacterState_1.CharacterState.hurdle); break; case CharacterState_1.CharacterState.climbup: case CharacterState_1.CharacterState.climbupblock: this.jumpSpeed.x = 0; this.jumpSpeed.y = this._RoleData.upclimb; this.jumpSpeed.z = 0; this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.climbwall); WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort(); this.canshake = true; this.shaketime = 0; this.ChangeTrial(false); break; case CharacterState_1.CharacterState.climbleft: this.jumpSpeed.x = 0; this.jumpSpeed.y = this._RoleData.slideclimb.y; this.jumpSpeed.z = this._RoleData.slideclimb.z; this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.runwallleft); this.ChangeTrial(false); break; case CharacterState_1.CharacterState.climbright: this.jumpSpeed.x = 0; this.jumpSpeed.y = this._RoleData.slideclimb.y; this.jumpSpeed.z = this._RoleData.slideclimb.z; this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.runwallright); this.ChangeTrial(false); break; case CharacterState_1.CharacterState.ClimbMotion: this._isActionNums = true; this._isneedactionnum = 0; this._needactiontime = 0.3; this._moveTime = 0; this.PlayAnimator(CharacterState_1.CharacterState.climbend); break; } this.NowLastActionState = value; } }, enumerable: true, configurable: true }); Player.prototype.playspeedSound = function () { AudioControl_1.AudioControl.Instance.playGameSound("speedup"); }; Player.prototype.ChangeTrial = function (bo) { if (this.LeftTrial && this.RightTrial && this.LeftTrial.active != bo) { this.LeftTrial.active = bo; this.RightTrial.active = bo; } }; Player.prototype.Joy = function (value, value1, angle) { if (this.nowAction == CharacterState_1.CharacterState.run) { this._changeMoveX = value; } else if (this.nowAction == CharacterState_1.CharacterState.climbup || CharacterState_1.CharacterState.climbleft || CharacterState_1.CharacterState.climbright) { this._changeMoveX = value1; } if (this.nowAction == CharacterState_1.CharacterState.climbleft && this._changeMoveX > 0) //强制跳跃 { this.isforceJump = true; this.nowAction = CharacterState_1.CharacterState.jumpright; } else if (this.nowAction == CharacterState_1.CharacterState.climbright && this._changeMoveX < 0) { this.isforceJump = true; this.nowAction = CharacterState_1.CharacterState.jumpleft; } if (this.nowAction == CharacterState_1.CharacterState.jump || this.nowAction == CharacterState_1.CharacterState.jumpleft || this.nowAction == CharacterState_1.CharacterState.jumpright || this.nowAction == CharacterState_1.CharacterState.speedupjump) { angle = -angle * Math.PI / 180; Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion); var jumpz = this.jumpSpeed.z; Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed); this.jumpSpeed.z = jumpz; } }; Player.prototype.update = function (dt) { dt = 16; if (this._iscanMove) { var distime = dt / 1000; this._moveTime += distime; switch (this.nowAction) { case CharacterState_1.CharacterState.run: //跑动 this._moveVec.y = 0; this._moveVec.z = distime * (this._speedMoveV3.z * this._multiple.z); if (this._lockxstate == 0) { this._moveVec.x = this._changeMoveX * distime; } else if (this._lockxstate == 1) { if (this._changeMoveX < 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else if (this._lockxstate == 2) { if (this._changeMoveX > 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } this._transform.translate(this._moveVec, false); break; case CharacterState_1.CharacterState.climbup: //爬升 this._moveVec.z = 0; this._moveVec.y = distime * this.jumpSpeed.y; if (this._lockxstate == 1) { if (this._changeMoveX < 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else if (this._lockstate == 2) { if (this._changeMoveX > 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else { this._moveVec.x = this._changeMoveX * distime; } this._transform.translate(this._moveVec, false); if (this._shangpaVec) { if (this._transform.position.y + 1 > this._shangpaVec.y) { this.nowAction = CharacterState_1.CharacterState.ClimbMotion; } } else if (this._nowselectVec) { if (this._transform.position.y + 1 > this._nowselectVec.y) { this.nowAction = CharacterState_1.CharacterState.ClimbMotion; } } break; case CharacterState_1.CharacterState.climbupblock: this._moveVec.z = 0; this._moveVec.y = distime * this.jumpSpeed.y; this._moveVec.x = 0; this._transform.translate(this._moveVec, false); if (this._shangpaVec) { if (this._transform.position.y + 1 > this._shangpaVec.y) { this.nowAction = CharacterState_1.CharacterState.ClimbMotion; } } else if (this._transform.position.y + 1 > this._nowselectVec.y) { this.nowAction = CharacterState_1.CharacterState.ClimbMotion; } break; case CharacterState_1.CharacterState.jump: //跳跃 case CharacterState_1.CharacterState.jumpleft: case CharacterState_1.CharacterState.jumpright: this._disy = this.jumpSpeed.y - this.g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case CharacterState_1.CharacterState.speedupjump: this._disy = this.jumpSpeed.y - this.g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case CharacterState_1.CharacterState.climbleft: case CharacterState_1.CharacterState.climbright: this._moveVec.z = distime * this.jumpSpeed.y; this._moveVec.y = this.jumpSpeed.y * distime; this._moveVec.x = 0; this._transform.translate(this._moveVec, false); break; case CharacterState_1.CharacterState.MoveX: this._moveVec.z = distime * this._speedMoveV3.z; this._moveVec.x = this._speedMoveV3.x * distime; this._transform.translate(this._moveVec, false); if (this._moveTime > 0.1) { this.nowAction = CharacterState_1.CharacterState.run; } break; case CharacterState_1.CharacterState.downmove: this._moveVec.y = this.jumpSpeed.x; this._moveVec.x = this.jumpSpeed.y; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case CharacterState_1.CharacterState.sidespeedup: this._moveVec.y = 0; this._moveVec.x = 0; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); if (this.buff_speeduptime <= 0 && this.LastActionState == CharacterState_1.CharacterState.climbleft || this.LastActionState == CharacterState_1.CharacterState.climbright) { this.nowAction = this.LastActionState; } else { this.nowAction = CharacterState_1.CharacterState.jump; } break; case CharacterState_1.CharacterState.cross: this._disy = this.jumpSpeed.y - this.g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case CharacterState_1.CharacterState.ClimbMotion: if (this._nowselectVec) { if (this._transform.position.y < this._nowselectVec.y) { this._moveVec.x = 0; this._moveVec.y = (1 / 0.3) * distime; this._moveVec.z = 0; this._transform.translate(this._moveVec, false); } } break; } if (this._nowselectVec && (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.downmove) && !this._isColling) { if (this._transform.position.z <= this._nowselectVec.z) { if (this._changeMoveX > 0) { this.nowAction = CharacterState_1.CharacterState.jumpright; } else if (this._changeMoveX < 0) { this.nowAction = CharacterState_1.CharacterState.jumpleft; } else { this.nowAction = CharacterState_1.CharacterState.jump; } } } if (this._transform.position.y < PropManager_1.PropManager.diePosY - PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.DieDistance) //角色死亡 { if (this._nowscenename == "" || this._nowbuildname == "") { if (GameState_1.GameState.fuhuocishu > 0) { this.Revive(); } else { this.Lose(); } } else { if (GameState_1.GameState.fuhuocishu > 0) { this.Revive(); } else { this.Lose(); } } this.nowAction = CharacterState_1.CharacterState.stand; } if (this._transform.position.z < PropManager_1.PropManager.gamewinPosZ) //到达终点 { this.Win(); } else { PropManager_1.PropManager.pro_jindu.value = this._transform.position.z / PropManager_1.PropManager.gamewinPosZ * 100; } if (this._isActionNums) { if (this._isneedactionnum > 0) { if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) { switch (this._StateName) { case CharacterState_1.CharacterState.jump: case CharacterState_1.CharacterState.leftjump: case CharacterState_1.CharacterState.rightjump: case CharacterState_1.CharacterState.highjump1: case CharacterState_1.CharacterState.highjump2: case CharacterState_1.CharacterState.hurdle: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.sky); break; case CharacterState_1.CharacterState.huachan: case CharacterState_1.CharacterState.climbend: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.run); this.nowAction = CharacterState_1.CharacterState.run; this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); break; case CharacterState_1.CharacterState.land1: // this._isActionNums = false; // this.PlayAnimator( CharacterState.run ); case CharacterState_1.CharacterState.land2: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.run); break; case CharacterState_1.CharacterState.huachan: this.nowAction = CharacterState_1.CharacterState.run; break; } } } else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) { switch (this._StateName) { case CharacterState_1.CharacterState.jump: case CharacterState_1.CharacterState.leftjump: case CharacterState_1.CharacterState.rightjump: case CharacterState_1.CharacterState.highjump1: case CharacterState_1.CharacterState.highjump2: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.sky); this._changeMoveX = 0; break; case CharacterState_1.CharacterState.hurdle: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.sky); break; case CharacterState_1.CharacterState.huachan: case CharacterState_1.CharacterState.climbend: this._isActionNums = false; this.PlayAnimator(CharacterState_1.CharacterState.run); this.nowAction = CharacterState_1.CharacterState.run; this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); break; } } } if (this.buff_speeduptime > 0) { this.buff_speeduptime -= distime; PropManager_1.PropManager.Instance.SpeedUpEffect("jiasulizi", this._transform.position); if (this.doublespeedup) { PropManager_1.PropManager.Instance.SpeedUpEffect1("jiasulizi", this._transform.position); } } else { this._multiple.x = 1; this._multiple.y = 1; this._multiple.z = 1; this.doublespeedup = false; PropManager_1.PropManager.Instance.CloseSpeedUpEffect(); PropManager_1.PropManager.Instance.CloseSpeedUpEffect1(); } if (this.canshake) { this.shaketime += distime; if (this.shaketime >= 0.5) { this.shaketime = 0; WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort(); } } } else { if (this._ending) { var distime = dt / 1000; this._moveTime += distime; if (this._moveTime >= this._endanmotime) { this.GameOver(); } else { this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime; this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime; this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime; PropManager_1.PropManager.carma.getComponent(CameraManager_1.CameraManager).GameEndRotate(this._transform.position, this._endAnmoSpeed1); } } } }; Player.prototype.Win = function () { AudioControl_1.AudioControl.Instance.playGameSound("over"); DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.end); var carmaTrans = PropManager_1.PropManager.carma.transform; this._endAnmoSpeed.z = (this._transform.position.z - 2 - carmaTrans.position.z) / this._endanmotime; this._endAnmoSpeed.y = (this._transform.position.y - carmaTrans.position.y) / this._endanmotime; this._endAnmoSpeed.x = (this._transform.position.x + 3 - carmaTrans.position.x) / this._endanmotime; this._moveTime = 0; this._iscanMove = false; this._ending = true; this.PlayAnimator(CharacterState_1.CharacterState.sky); PropManager_1.PropManager.Instance.GameOverEffecf("yanhua", this._transform.position, GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0 ? true : false); }; /**出现复活界面 */ Player.prototype.Revive = function () { AudioControl_1.AudioControl.Instance.playGameSound("over"); GameState_1.GameState.isdie = true; DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.revive); this._iscanMove = false; this.PlayAnimator(CharacterState_1.CharacterState.stand); // this._ending = true; }; Player.prototype.Lose = function () { AudioControl_1.AudioControl.Instance.playGameSound("over"); GameState_1.GameState.isdie = true; DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose); this._iscanMove = false; this.PlayAnimator(CharacterState_1.CharacterState.stand); this._ending = true; }; Player.prototype.GameOver = function () { this._ending = false; TimerService_1.TimerService.Instance.removeUpdateTarget(this); }; Player.prototype.TestJump = function () { this.nowAction = CharacterState_1.CharacterState.jump; }; Player.prototype.destroy = function () { TimerService_1.TimerService.Instance.removeUpdateTarget(this); _super.prototype.destroy.call(this); }; Player.prototype.XMove = function (state) { if (this.nowAction == CharacterState_1.CharacterState.run) { this._moveTime = 0; this._speedMoveV3.x = state * 20; this.nowAction = CharacterState_1.CharacterState.MoveX; } }; Player.prototype.dispose = function () { TimerService_1.TimerService.Instance.removeUpdateTarget(this); }; Player.prototype.onDestroy = function () { console.log("拖尾回收成功2222222----"); PoolManager_1.default.RecoverSprite3D(this.LeftTrial); PoolManager_1.default.RecoverSprite3D(this.RightTrial); }; return Player; }(Laya.Script3D)); exports.Player = Player; },{"../Agency/AgencyUserMessage":8,"../CFG/BuildCFG":9,"../Control/AssetManager":17,"../Control/AudioControl":18,"../Control/GameStateControl":21,"../Control/PoolManager":26,"../PrefabControl/CharacterState":46,"../PrefabControl/PanelResDic":48,"../PrefabControl/PropManager":49,"../Time/TimerService":59,"../WXSDK/PlayerAccount":75,"../WXSDK/WXGamePlatform":81,"../utils/DispatcherManager":85,"../utils/GameState":86,"../utils/GameUtils":87,"./CameraManager":38}],41:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Global = /** @class */ (function () { function Global() { } Global.curHeight = function () { return Laya.stage.height; }; Global.curWidth = function () { return Laya.stage.width; }; Global.setVars = function () { Global.stage = Laya.stage; Global.sethttpurl(); }; Global.getUrl = function (url) { if (url.indexOf("wxlocal") == -1) { return Global.resourcehtttp + url + Global.versions; } return url; }; Global.sethttpurl = function () { if (Global.isdebug) { Global.httpurl = "https://wxgamedev.51yoyoyo.com/"; } else { Global.httpurl = "https://minport.51yoyoyo.com/"; } }; Global.httpurl = ""; Global.resourcehtttp = ""; Global.cdnurl = "https://wxgame.51yoyoyo.com/"; /** * 资源后缀版本号 */ Global.versions = ""; //"?v=1.0.7"; Global.initWidth = 720; Global.initHeight = 1280; /** * 资源版本号 */ Global.resconfigVersion = ""; /** * 当前平台 */ Global.nowplatfrom = ""; /** * 当前游戏appid */ Global.appid = "wx46f4626932e5f48b"; /** * 游戏版本号 */ Global.gameVersion = "1.0.1"; /** * 是否调试版本 */ Global.isdebug = false; Global.AppKeyID = 0; Global.MemberID = 0; return Global; }()); exports.Global = Global; },{}],42:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GlobalWaiting = /** @class */ (function (_super) { __extends(GlobalWaiting, _super); function GlobalWaiting() { var _this = _super.call(this) || this; _this._isforcehide = false; _this._lastTime = 0; return _this; } GlobalWaiting.prototype.constructFromXML = function (xml) { this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height); _super.prototype.constructFromXML.call(this, xml); this.img_0 = this.getChild("img_0").asImage; this.img_0.visible = false; this.on(Laya.Event.DISPLAY, this, this.onAddedToStage); this.on(Laya.Event.UNDISPLAY, this, this.onRemoveFromStage); }; GlobalWaiting.prototype.onAddedToStage = function () { this._lastTime = Laya.Browser.now(); Laya.timer.frameLoop(1, this, this.onTimer); }; GlobalWaiting.prototype.onTimer = function () { if (this.img_0) { var nowtime = Laya.Browser.now(); var distime = nowtime - this._lastTime; if (distime / 1000 >= 0) { if (!this._isforcehide) { this.img_0.visible = true; } var i = this.img_0.rotation; i += 10; if (i > 360) i = i % 360; this.img_0.rotation = i; } else { this.img_0.visible = false; } } }; GlobalWaiting.prototype.hideimg = function () { this._isforcehide = true; if (this.img_0) { this.img_0.visible = false; } }; GlobalWaiting.prototype.onRemoveFromStage = function () { Laya.timer.clear(this, this.onTimer); }; return GlobalWaiting; }(fairygui.GComponent)); exports.GlobalWaiting = GlobalWaiting; },{}],43:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var JoystickModule = /** @class */ (function (_super) { __extends(JoystickModule, _super); function JoystickModule(clickpanel) { var _this = _super.call(this) || this; _this.dis = 0; _this.degree = 0; _this.angle = 0; _this.offx = 0; _this._iscanCBack = false; _this.mLastMouseX = 0; _this.mLastMouseY = 0; _this.mX = 0; _this.mY = 0; _this._iacanCallback = false; _this._clickpanel = clickpanel; _this._button = new Laya.Point(); _this.touchId = -1; _this.radius = 400; _this._curPos = new Laya.Point(); _this._clickpanel.on(Laya.Event.MOUSE_DOWN, _this, _this.onTouchDown); return _this; } JoystickModule.prototype.onTouchDown = function (evt) { if (this.touchId == -1) { //First touch this.touchId = evt.touchId; this.offx = 0; this._iscanCBack = false; fairygui.GRoot.inst.globalToLocal(Laya.stage.mouseX, Laya.stage.mouseY, this._curPos); var bx = this._curPos.x; var by = this._curPos.y; this._lastStageX = bx; this._lastStageY = by; this._startStageX = bx; this._startStageY = by; this._button.x = bx; this._button.y = by; if (this._callobj && this._downCallback) { this._downCallback.call(this._callobj); } this._clickpanel.on(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove); this._clickpanel.on(Laya.Event.MOUSE_UP, this, this.OnTouchUp); this._clickpanel.on(Laya.Event.MOUSE_OUT, this, this.OnTouchUp); } }; JoystickModule.prototype.setEventCallback = function (callobj, downCallback, movecallback, upcallback) { this._callobj = callobj; this._downCallback = downCallback; this._movecallback = movecallback; this._updatecallback = upcallback; }; JoystickModule.prototype.Trigger = function (evt) { this.onTouchDown(evt); }; //创建地图 JoystickModule.prototype.createMap = function () { //创建地图对象 this.tiledMap = new Laya.TiledMap(); this.mX = this.mY = 0; //创建地图,适当的时候调用destory销毁地图 this.tiledMap.createMap("res/tiledMap/desert.json", new Laya.Rectangle(0, 0, Laya.Browser.width, Laya.Browser.height), new Laya.Handler(this, this.completeHandler)); }; /** * 地图加载完成的回调 */ JoystickModule.prototype.completeHandler = function () { console.log("地图创建完成"); console.log("ClientW:" + Laya.Browser.clientWidth + " ClientH:" + Laya.Browser.clientHeight); }; /************************************************* */ JoystickModule.prototype.OnTouchUp = function (evt) { if (evt === void 0) { evt = null; } if (this.touchId != -1 && evt.touchId == this.touchId) { this.touchup(); if (this._callobj && this._updatecallback) { this._updatecallback.call(this._callobj); } } }; JoystickModule.prototype.touchup = function () { this._iscanCBack = false; this.touchId = -1; this._clickpanel.off(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove); this._clickpanel.off(Laya.Event.MOUSE_UP, this, this.OnTouchUp); this._clickpanel.off(Laya.Event.MOUSE_OUT, this, this.OnTouchUp); this._iacanCallback = false; this.degree = 0; }; JoystickModule.prototype.OnTouchMove = function (evt) { if (this.touchId != -1 && evt.touchId == this.touchId) { var bx = Laya.stage.mouseX; var by = Laya.stage.mouseY; var moveX = bx - this._lastStageX; var moveY = by - this._lastStageY; this._lastStageX = bx; this._lastStageY = by; var buttonX = this._button.x + moveX; var buttonY = this._button.y + moveY; var offsetX = buttonX - this._startStageX; var offsetY = buttonY - this._startStageY; var disX = 0; if (moveX >= 2 || moveX <= -2) { this._iscanCBack = true; } else { this._iscanCBack = false; } this.offx = moveX; if (offsetX == 0 && offsetY == 0) { return; } if (offsetX > 0) { if (offsetX > this.radius) { disX = this.radius; this.angle = 90; } else { disX = this.radius - offsetX; this.angle = 90 - disX / this.radius * 90; } } else if (offsetX == 0) { this.angle = 0; } else { if (-offsetX > this.radius) { disX = this.radius; this.angle = -90; } else { disX = this.radius + offsetX; this.angle = -(90 - disX / this.radius * 90); } } var rad = Math.atan2(offsetY, offsetX); this.degree = rad; var maxX = this.radius * Math.cos(rad); var maxY = this.radius * Math.sin(rad); if (Math.abs(offsetX) > Math.abs(maxX)) offsetX = maxX; if (Math.abs(offsetY) > Math.abs(maxY)) offsetY = maxY; buttonX = this._startStageX + offsetX; buttonY = this._startStageY + offsetY; if (buttonX < 0) buttonX = 0; if (buttonY > fairygui.GRoot.inst.height) buttonY = fairygui.GRoot.inst.height; this._button.x = buttonX; this._button.y = buttonY; this.dis = Math.sqrt(offsetX * offsetX + offsetY * offsetY); this._iacanCallback = true; if (this._iscanCBack && this._callobj && this._movecallback && this._iacanCallback) { this._movecallback.call(this._callobj, this.offx); } } }; JoystickModule.prototype.dispose = function () { this._clickpanel.off(Laya.Event.MOUSE_DOWN, this, this.onTouchDown); }; // private _center:fairygui.GImage; JoystickModule.JoystickMoving = "JoystickMoving"; JoystickModule.JoystickUp = "JoystickUp"; return JoystickModule; }(Laya.EventDispatcher)); exports.JoystickModule = JoystickModule; },{}],44:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Global_1 = require("./Global"); var Stage = Laya.Stage; var AssetPath_1 = require("./Config/AssetPath"); var GameContents_1 = require("./GameContents"); var Sdk_1 = require("./WXSDK/Sdk"); var Main = /** @class */ (function () { function Main() { //根据IDE设置初始化引擎 // Laya.init(Global.initWidth, Global.initHeight, Laya["WebGL"]); Laya3D.init(Global_1.Global.initWidth, Global_1.Global.initHeight); Laya.stage.scaleMode = Stage.SCALE_FIXED_WIDTH; Laya.stage.alignH = Stage.ALIGN_CENTER; Laya.stage.alignV = Stage.ALIGN_TOP; Laya.stage.screenMode = Stage.SCREEN_VERTICAL; Laya.stage.bgColor = "#54B9F6"; // Laya.Stat.show(); Laya.alertGlobalError = true; window['Config3D'] && (window['Config3D']["_default"]["_defaultPhysicsMemory"] = 128); if (Laya.Browser.window.tt) { // WxApi.WxInit(); Sdk_1.WxApi.CheckWXUpdate(); } Laya.stage.on("resize", this, this.onResize); } Main.prototype.onResize = function () { Laya.stage.off("resize", this, this.onResize); Global_1.Global.setVars(); AssetPath_1.AssetPath.init(); fairygui.UIConfig.packageFileExtension = "bin"; fairygui.UIConfig.textureLinearSampling = true; fairygui.UIConfig.defaultFont = "黑体"; fairygui.UIConfig.versions = Global_1.Global.versions; var gameContent = new GameContents_1.GameContents(); gameContent.initGame(); }; return Main; }()); //激活启动类 new Main(); },{"./Config/AssetPath":15,"./GameContents":37,"./Global":41,"./WXSDK/Sdk":77}],45:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AssetPath_1 = require("../Config/AssetPath"); var CharacterPool = /** @class */ (function () { function CharacterPool() { } CharacterPool.AddCharacter = function (resouceName, clas, parent) { var skinnedmesh; var arr = CharacterPool.roledict[resouceName]; if (arr && arr.length > 0) { skinnedmesh = arr.shift(); skinnedmesh.active = true; parent.addChild(skinnedmesh); } else { var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DRoleModel(resouceName)); skinnedmesh = Laya.Sprite3D.instantiate(sp, parent, false, new Laya.Vector3(0, 0, 0)); } if (clas) { var cla = skinnedmesh.addComponent(clas); cla.resouseName = resouceName; } var _out = new Laya.Quaternion; Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), 180 * Math.PI / 180, _out); skinnedmesh.transform.rotation = _out; return skinnedmesh; }; CharacterPool.ClearCharacter = function (sp, resouceName, cla) { if (!CharacterPool.roledict[resouceName]) { CharacterPool.roledict[resouceName] = []; } if (cla) { cla.destroy(); } sp.active = false; sp.removeSelf(); CharacterPool.roledict[resouceName].push(sp); }; CharacterPool.roledict = {}; return CharacterPool; }()); exports.CharacterPool = CharacterPool; },{"../Config/AssetPath":15}],46:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CharacterState = /** @class */ (function () { function CharacterState() { } /**侧翻 cefan1 */ CharacterState.rollover1 = "rollover1"; /**侧翻 cefan2 */ CharacterState.rollover2 = "rollover2"; /**跑墙左 paoqiangleft */ CharacterState.runwallleft = "runwallleft"; /**右跳 rightjump */ CharacterState.rightjump = "rightjump"; /**跑墙右 paoqiangright */ CharacterState.runwallright = "runwallright"; /**左跳 leftjump*/ CharacterState.leftjump = "leftjump"; /**爬墙 paqiang */ CharacterState.climbwall = "climbwall"; /** ? climbend */ CharacterState.climbend = "climbend"; /**站立 stand*/ CharacterState.stand = "stand"; /**空中 kongzhong */ CharacterState.sky = "sky"; /**落地 luodi1 */ CharacterState.land1 = "land1"; /**落地 luodi2 */ CharacterState.land2 = "land2"; /**大跳 datiao1 */ CharacterState.highjump1 = "highjump1"; /**大跳 datiao2 */ CharacterState.highjump2 = "highjump2"; /**跑动 run */ CharacterState.run = "run"; /**跳跃 jump*/ CharacterState.jump = "jump"; /**爬升 Climb */ CharacterState.climbup = "climbup"; /**自由落体 Freefalling */ CharacterState.falldown = "falldown"; /**左爬 left_climb */ CharacterState.climbleft = "climbleft"; /**右爬 right_climb*/ CharacterState.climbright = "climbright"; /**右跳 right_jump */ CharacterState.jumpright = "jumpright"; /**左跳 left_jump */ CharacterState.jumpleft = "jumpleft"; /** PlayPalouAction*/ CharacterState.ClimbMotion = "ClimbMotion"; /** ? huachan */ CharacterState.huachan = "huachan"; /**跨栏 kualan */ CharacterState.hurdle = "hurdle"; /** * 加速板跳跃 jiasuJump */ CharacterState.speedupjump = "speedupjump"; /** * x方向瞬移 xshunyi */ CharacterState.MoveX = "MoveX"; /** * 下滑位移 downSlide */ CharacterState.downmove = "downmove"; /** * 侧面加速 slidejiasu */ CharacterState.sidespeedup = "sidespeedup"; /** * 翻越 surmount */ CharacterState.cross = "cross"; /** * 锁定爬升 lockclimb */ CharacterState.climbupblock = "climbupblock"; return CharacterState; }()); exports.CharacterState = CharacterState; },{}],47:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * 对象池类 */ var Animation = Laya.Animation; var GamePool = /** @class */ (function (_super) { __extends(GamePool, _super); function GamePool() { var _this = _super.call(this) || this; _this.AniConfPath = "res/fighter/fighter.json"; return _this; } GamePool.RemoveItem = function (key, obj) { if (GamePool.contain[key]) { var index = GamePool.contain[key].indexOf(obj); if (index == -1) { GamePool.contain[key].push(obj); } } }; GamePool.GetItem = function (key) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } if (GamePool.contain[key]) { var arr = GamePool.contain[key]; if (arr.length == 0) { var calssobj = GamePool.sprite3DArray[key]; var vo = new calssobj(); return vo; } return GamePool.contain[key].shift(); } else { console.log("此key值对应的类未被注册"); return null; } }; /******************************************* */ GamePool.prototype.createAnimation = function () { var ani = new Animation(); ani.loadAtlas(this.AniConfPath); // 加载图集动画 ani.interval = 30; // 设置播放间隔(单位:毫秒) ani.index = 1; // 当前播放索引 ani.play(); // 播放图集动画 // 获取动画的边界信息 var bounds = ani.getGraphicBounds(); ani.pivot(bounds.width / 2, bounds.height / 2); ani.pos(Laya.stage.width / 2, Laya.stage.height / 2); Laya.stage.addChild(ani); }; /******************************************* */ GamePool.GetItemFairyGUI = function (url) { if (!GamePool.contain[url]) { GamePool.contain[url] = []; } var arr = GamePool.contain[url]; if (arr.length == 0) { var vo = fairygui.UIPackage.createObjectFromURL(url); return vo; } return GamePool.contain[url].shift(); }; GamePool.Mark = function (key, classarg) { GamePool.sprite3DArray[key] = classarg; GamePool.contain[key] = []; }; GamePool.sprite3DArray = {}; GamePool.contain = {}; return GamePool; }(Laya.EventDispatcher)); exports.GamePool = GamePool; },{}],48:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Singleton_1 = require("../utils/Singleton"); /* * name; */ var PanelResDic = /** @class */ (function (_super) { __extends(PanelResDic, _super); function PanelResDic() { var _this = _super.call(this) || this; PanelResDic.ins = _this; return _this; } Object.defineProperty(PanelResDic, "Instance", { get: function () { if (PanelResDic.ins == null) { return new PanelResDic(); } return PanelResDic.ins; }, enumerable: true, configurable: true }); PanelResDic.getView = function (viewkey) { if (!PanelResDic._mapviewDict[viewkey]) { throw "err0 未绑定的viewkey:" + viewkey; } return PanelResDic._mapviewDict[viewkey]; }; PanelResDic.prototype.getSingleTon = function (ref) { return Singleton_1.Singleton.Instance(ref); }; PanelResDic.prototype.mapView = function (viewkey, ref) { if (!PanelResDic._mapviewDict[viewkey]) { PanelResDic._mapviewDict[viewkey] = ref; ref.key = viewkey; } }; PanelResDic.prototype.AgencyAdd = function (ref) { Singleton_1.Singleton.create(ref); }; PanelResDic.prototype.AgencyClear = function (ref) { Singleton_1.Singleton.remove(ref); }; PanelResDic._mapviewDict = {}; return PanelResDic; }(Laya.EventDispatcher)); exports.PanelResDic = PanelResDic; },{"../utils/Singleton":91}],49:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AssetPath_1 = require("../Config/AssetPath"); var GameUtils_1 = require("../utils/GameUtils"); var PropManager = /** @class */ (function () { function PropManager() { this._outQUaternion4 = new Laya.Quaternion; this._outQUaternion = new Laya.Quaternion; PropManager.ins = this; } Object.defineProperty(PropManager, "Instance", { get: function () { if (PropManager.ins == null) { return new PropManager(); } return PropManager.ins; }, enumerable: true, configurable: true }); PropManager.getPosVecbyScene = function (sceneName, buildname) { if (PropManager.patternDict[sceneName]) { return PropManager.patternDict[sceneName][buildname]; } return null; }; /** * @param animator * @param animatorDict */ PropManager.setAnimator = function (animator) { var chiddict; for (var s in PropManager.actionDict) { if (!animator.getControllerLayer().getAnimatorState(s)) { chiddict = PropManager.actionDict[s]; //创建一个动画动作状态 var state1 = new Laya.AnimatorState(); //设置动作状态的名称 state1.name = s; //设置动作状态播放的起始时间(起始时间与结束时间的设置为0-1的百分比数值) 要截取的时间点 / 动画的总时长 state1.clipStart = chiddict.s / PropManager.actionnums; //设置动作状态播放的结束时间 state1.clipEnd = chiddict.e / PropManager.actionnums; //得到默认动画赋值给Clip(getDefaultState默认动画为Unity中animation的数组顺序0下标的动画) state1.clip = animator.getDefaultState().clip; //动画播放是否循环 state1.clip.islooping = chiddict.islooping; //添加动画状态到动画组件里 animator.addState(state1); } } }; PropManager.prototype.InitEffect = function () { var lizi = PropManager.getlizibyName("speedupeffect"); lizi.particleSystem.play(); lizi.active = false; var lizi = PropManager.getlizibyName("color_white"); lizi.particleSystem.play(); lizi.active = false; var lizi = PropManager.getlizibyName("color_yellow"); lizi.particleSystem.play(); lizi.active = false; }; PropManager.prototype.SetEffectColor = function (name, pos) { var closetime = 0; Laya.timer.clear(this, this.EffectEnd); this.EffectEndColor(); if (name == "color_white") { var sort = GameUtils_1.GameUtils.randRangeint(0, 100); if (sort > 50) { name = "color_yellow"; } } closetime = 500; this._tanselizi = PropManager.getlizibyName(name); this._tanselizi.transform.position = pos; this._tanselizi.particleSystem.play(); if (closetime != 0) { Laya.timer.once(closetime, this, this.EffectEndColor); } }; PropManager.prototype.EffectEndColor = function () { if (this._tanselizi) { this._tanselizi.particleSystem.stop(); this._tanselizi.active = false; } }; PropManager.prototype.SpeedUpEffect1 = function (name, pos) { if (!this._engamelizi4 || (this._engamelizi4 && !this._engamelizi4.active)) { this._engamelizi4 = PropManager.getlizibyName("speedupeffect"); this._engamelizi4.particleSystem.looping = true; this._engamelizi4.transform.scale = new Laya.Vector3(20, 20, 20); Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion4); this._engamelizi4.transform.rotation = this._outQUaternion4; this._engamelizi4.particleSystem.play(); } var lzpos = pos.clone(); lzpos.y += 5; lzpos.z -= 10; this._engamelizi4.transform.position = lzpos; }; PropManager.prototype.CloseSpeedUpEffect1 = function () { if (this._engamelizi4 && this._engamelizi4.active) { this._engamelizi4.active = false; } }; PropManager.prototype.SpeedUpEffect = function (name, pos) { if (!this._engamelizi3 || (this._engamelizi3 && !this._engamelizi3.active)) { this._engamelizi3 = PropManager.getlizibyName("speedupeffect"); this._engamelizi3.particleSystem.looping = true; this._engamelizi3.transform.scale = new Laya.Vector3(20, 20, 20); Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion); this._engamelizi3.transform.rotation = this._outQUaternion; this._engamelizi3.particleSystem.play(); } var lzpos = pos.clone(); lzpos.y += 5; this._engamelizi3.transform.position = lzpos; }; PropManager.prototype.CloseSpeedUpEffect = function () { if (this._engamelizi3 && this._engamelizi3.active) { this._engamelizi3.active = false; } }; PropManager.prototype.GameOverEffecf = function (name, pos, iswin) { this._engamelizi1 = PropManager.getlizibyName("fireworks"); this._engamelizi1.transform.position = pos; this._engamelizi1.particleSystem.play(); if (iswin) { this._engamelizi2 = PropManager.getlizibyName("winline"); this._engamelizi2.transform.position = pos; this._engamelizi2.particleSystem.play(); } }; PropManager.prototype.CloseGameOverEffect = function () { if (this._engamelizi1) { this._engamelizi1.particleSystem.stop(); this._engamelizi1.active = false; } if (this._engamelizi2) { this._engamelizi2.particleSystem.stop(); this._engamelizi2.active = false; } }; // public setliziPlay( name:string,pos:Laya.Vector3 ):void // { // var closetime:number = 0; // Laya.timer.clear( this,this.liziend ); // switch( name ) // { // case "tanse_bai": // if( name == "tanse_bai" ) // { // var sort:number = GameUtils.randRangeint( 0,100 ); // if( sort > 50 ) // { // name = "tanse_huang"; // } // } // closetime = 500; // break; // case "jiasulizi": // break; // case "win_xian": // closetime = 0; // break; // case "yanhua": // closetime = 0; // break; // } // var lizi:Laya.ShuriKenParticle3D = PropManager.getlizibyName( name ); // lizi.transform.position = pos; // lizi.particleSystem.play(); // if( closetime != 0 ) // { // Laya.timer.once( closetime,this,this.liziend,[lizi] ); // } // } PropManager.prototype.EffectEnd = function (lizi) { if (lizi) { lizi.particleSystem.stop(); lizi.active = false; } }; PropManager.getlizibyName = function (name) { var lizisp; if (PropManager.liziDict[name]) { lizisp = PropManager.liziDict[name]; } else { lizisp = Laya.Sprite3D.instantiate(Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel(name))); PropManager.liziDict[name] = lizisp; PropManager.scene3D.addChild(lizisp); } lizisp.active = true; return lizisp; }; PropManager.nowmapDict = {}; PropManager.diePosY = 0; PropManager.gamewinPosZ = 0; PropManager.patternDict = {}; PropManager.npcDict = {}; PropManager.npcscriptDict = {}; PropManager.npcnum = 0; PropManager.iscarmanpc = false; PropManager.liziDict = {}; PropManager.jiantouArr = []; // /** // * 判断是否爬到顶端 // */ // static checkisClimbTop( sceneName:string,buildname:string, pos:Laya.Vector3 ):boolean // { // var vec:Laya.Vector3 = PropManager.getPosVecbyScene( sceneName,buildname ); // if( vec && Math.abs(vec.y - pos.y) < 1.5 ) // { // return true; // } // return false; // } PropManager.actionnums = 575; PropManager.actionDict = { "climbend": { s: 550, e: 575, islooping: false }, "stand": { s: 0, e: 80, islooping: true }, "run": { s: 90, e: 106, islooping: true }, "jump": { s: 110, e: 132, islooping: true }, "kongzhong": { s: 132, e: 145, islooping: true }, "luodi1": { s: 145, e: 160, islooping: true }, "luodi2": { s: 170, e: 202, islooping: true }, "datiao1": { s: 210, e: 235, islooping: true }, "datiao2": { s: 240, e: 273, islooping: true }, "huachan": { s: 280, e: 310, islooping: true }, "kualan": { s: 310, e: 346, islooping: true }, "cefan1": { s: 350, e: 391, islooping: true }, "cefan2": { s: 400, e: 434, islooping: true }, "paoqiangleft": { s: 440, islooping: true, e: 456 }, "rightjump": { s: 460, e: 477, islooping: true }, "paoqiangright": { s: 480, e: 496, islooping: true }, "leftjump": { s: 500, e: 517, islooping: true }, "paqiang": { s: 520, e: 542, islooping: true } }; return PropManager; }()); exports.PropManager = PropManager; },{"../Config/AssetPath":15,"../utils/GameUtils":87}],50:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelChildControl_1 = require("../Control/PanelChildControl"); var CpaEvent_1 = require("./CpaEvent"); var PlayerAccount_1 = require("../WXSDK/PlayerAccount"); var RecommendView_1 = require("./RecommendView"); var TimerService_1 = require("../Time/TimerService"); var BaoKuanGameView = /** @class */ (function (_super) { __extends(BaoKuanGameView, _super); function BaoKuanGameView() { var _this = _super.call(this) || this; _this._time = 0; _this.key = 0; _this._istart = false; return _this; } BaoKuanGameView.prototype.onInit = function () { this.initView(); this.initEvent(); }; BaoKuanGameView.prototype.initView = function () { this.c_state = this.getController("c_state"); this.t0 = this.getTransition("t0"); this.c_state.selectedIndex = 0; }; BaoKuanGameView.prototype.initEvent = function () { console.log("监听互推事件---BaokuanGame0"); this.AddEventData(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler); }; BaoKuanGameView.prototype.yqhomedataHandler = function () { console.log("监听互推事件---BaokuanGame1"); this.RefreshBKYX(); TimerService_1.TimerService.Instance.addUpdateTarget(this); }; BaoKuanGameView.prototype.update = function (dt) { if (this._istart) { this._time += dt; if (this._time >= 5000) { this._time = 0; this.RefreshBKYX(true); } } }; BaoKuanGameView.prototype.RefreshBKYX = function (isanmo) { if (isanmo === void 0) { isanmo = false; } if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.recommend) return; console.log("监听互推事件---BaokuanGame2"); this.c_state.selectedIndex = 1; var datas = RecommendView_1.Recommend.cainixihuanData; var item; for (var i = 0; i < 4; i++) { if (this.key + i >= datas.length - 1) { this.key = 0; } var curdata = datas[this.key + i]; item = this["item_" + i]; item.showData(curdata, true); if (curdata == null) continue; } this.key += 4; if (this.key >= datas.length - 1) { this.key = 0; } this._istart = true; if (isanmo) { this.t0.play(null, 1); } }; return BaoKuanGameView; }(PanelChildControl_1.PanelChildControl)); exports.default = BaoKuanGameView; },{"../Control/PanelChildControl":25,"../Time/TimerService":59,"../WXSDK/PlayerAccount":75,"./CpaEvent":53,"./RecommendView":55}],51:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelBaseControl_1 = require("../Control/PanelBaseControl"); var RecommendView_1 = require("./RecommendView"); var ViewManager_1 = require("../View/ViewManager"); var TimerService_1 = require("../Time/TimerService"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var GameState_1 = require("../utils/GameState"); var CompletePanel_1 = require("../View/CompletePanel"); var RoleData_1 = require("../Data/RoleData"); var ChoutiPanView = /** @class */ (function (_super) { __extends(ChoutiPanView, _super); function ChoutiPanView(end) { var _this = _super.call(this, "main", "choutipanView") || this; _this._iscanmove = false; _this.isend = 0; _this._movetime = 0; _this._flushtime = 0; _this.dir = true; _this._nowvalue = 0; _this.isend = end; return _this; } ChoutiPanView.prototype.initView = function () { this.list_0.setVirtual(); this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false); this.list_1.setVirtual(); this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false); this._nowList0 = RecommendView_1.Recommend.gdyxData; this._nowList1 = RecommendView_1.Recommend.gdyxData; this.list_0.numItems = this._nowList0.length; this.list_1.numItems = this._nowList1.length; this._isStart = true; this._iscanmove = true; TimerService_1.TimerService.Instance.addUpdateTarget(this); }; ChoutiPanView.prototype.initEvent = function () { this.AddEventByType(this.btn_return, Laya.Event.CLICK, this, this.onclosefun); this.AddEventByType(this.btn_jixugame, Laya.Event.CLICK, this, this.onclosefun); this.AddEventByType(this.list_1, Laya.Event.MOUSE_DOWN, this, this.downclick); this.AddEventByType(this.list_1, Laya.Event.MOUSE_UP, this, this.upclick); this.AddEventByType(this.list_1, Laya.Event.MOUSE_OUT, this, this.upclick); }; ChoutiPanView.prototype.itemrenderlist = function (index, item) { if (index < this._nowList0.length) { item.showData(this._nowList0[index]); } }; ChoutiPanView.prototype.itemrenderlist1 = function (index, item) { if (index < this._nowList1.length) { item.showData(this._nowList1[index]); } }; ChoutiPanView.prototype.downclick = function () { this._isdown = true; this._iscanmove = false; Laya.timer.clear(this, this.timeoutCallback); }; ChoutiPanView.prototype.timeoutCallback = function () { this._iscanmove = true; }; ChoutiPanView.prototype.upclick = function () { if (this._isdown) { this._isdown = false; this._nowvalue = this.list_1.scrollPane.percY; Laya.timer.once(2000, this, this.timeoutCallback); } }; ChoutiPanView.prototype.update = function (dt) { if (this._isStart) { if (this.list_1.scrollPane && this._nowList1 && this._iscanmove) { if (this.dir) { this._nowvalue += 0.001; if (this._nowvalue >= 1) { this._nowvalue = 1; this.dir = false; } } else { this._nowvalue -= 0.001; if (this._nowvalue <= 0) { this._nowvalue = 0; this.dir = true; } } this.list_1.scrollPane.setPercY(this._nowvalue); } } }; ChoutiPanView.prototype.onclosefun = function () { if (this.isend == 1) { ViewManager_1.ViewManager.Instance.close(ChoutiPanView); DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose); } else if (this.isend == 2) { var gold = RoleData_1.RoleData.Instance.levelcfg.winGold; ViewManager_1.ViewManager.Instance.close(ChoutiPanView); ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, gold); } else { ViewManager_1.ViewManager.Instance.close(ChoutiPanView); } }; ChoutiPanView.prototype.destory = function () { TimerService_1.TimerService.Instance.removeUpdateTarget(this); _super.prototype.destory.call(this); }; ChoutiPanView.key = "ChoutiPanView"; return ChoutiPanView; }(PanelBaseControl_1.PanelBaseControl)); exports.default = ChoutiPanView; },{"../Control/PanelBaseControl":24,"../Data/RoleData":33,"../Time/TimerService":59,"../View/CompletePanel":61,"../View/ViewManager":70,"../utils/DispatcherManager":85,"../utils/GameState":86,"./RecommendView":55}],52:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelChildControl_1 = require("../Control/PanelChildControl"); var CpaEvent_1 = require("./CpaEvent"); var RecommendView_1 = require("./RecommendView"); var TimerService_1 = require("../Time/TimerService"); var SceneControl_1 = require("../Control/SceneControl"); var CpaDownsView = /** @class */ (function (_super) { __extends(CpaDownsView, _super); function CpaDownsView() { var _this = _super.call(this) || this; _this._iscanmove = false; _this._movetime = 0; _this._flushtime = 0; _this.dir = true; _this._nowvalue = 0; return _this; } CpaDownsView.prototype.onInit = function () { this.c_state = this.getController("c_state"); this.c_state.selectedIndex = 0; this.initView(); this.initEvent(); }; CpaDownsView.prototype.initView = function () { this.list_0.setVirtual(); this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false); this._isStart = false; }; CpaDownsView.prototype.initEvent = function () { this.AddEventData(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler); this.AddEventByType(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick); this.AddEventByType(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick); this.AddEventByType(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick); }; CpaDownsView.prototype.downclick = function () { if (SceneControl_1.SceneControl.IsShowSign) return; this._isdown = true; this._iscanmove = false; Laya.timer.clear(this, this.timeoutCallback); // ttad.CreateMoreGameBtn(); }; CpaDownsView.prototype.timeoutCallback = function () { if (SceneControl_1.SceneControl.IsShowSign) return; this._iscanmove = true; }; CpaDownsView.prototype.upclick = function () { if (SceneControl_1.SceneControl.IsShowSign) return; if (this._isdown) { this._isdown = false; this._nowvalue = this.list_0.scrollPane.percX; Laya.timer.once(2000, this, this.timeoutCallback); } }; CpaDownsView.prototype.update = function (dt) { if (this._isStart) { if (this.list_0.scrollPane && this._nowList && this._iscanmove) { if (this.dir) { this._nowvalue += 0.001; if (this._nowvalue >= 1) { this._nowvalue = 1; this.dir = false; } } else { this._nowvalue -= 0.001; if (this._nowvalue <= 0) { this._nowvalue = 0; this.dir = true; } } this.list_0.scrollPane.setPercX(this._nowvalue); } } }; CpaDownsView.prototype.itemrenderlist = function (index, item) { if (index < this._nowList.length) { item.showData(this._nowList[index], true); } }; CpaDownsView.prototype.yqhomedataHandler = function () { this.c_state.selectedIndex = 1; this._nowList = RecommendView_1.Recommend.cainixihuanData; this.list_0.numItems = this._nowList.length; for (var i = 0; i < this._nowList.length; i++) { } this._isStart = true; this._iscanmove = true; TimerService_1.TimerService.Instance.addUpdateTarget(this); }; CpaDownsView.prototype.dispose = function () { TimerService_1.TimerService.Instance.removeUpdateTarget(this); _super.prototype.dispose.call(this); }; return CpaDownsView; }(PanelChildControl_1.PanelChildControl)); exports.default = CpaDownsView; },{"../Control/PanelChildControl":25,"../Control/SceneControl":29,"../Time/TimerService":59,"./CpaEvent":53,"./RecommendView":55}],53:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CpaEvent = /** @class */ (function () { function CpaEvent() { } CpaEvent.YQHomeData = "CpaEvent_YQHomeData"; return CpaEvent; }()); exports.default = CpaEvent; },{}],54:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelChildControl_1 = require("../Control/PanelChildControl"); var GameUtils_1 = require("../utils/GameUtils"); var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk"); var CpaItem = /** @class */ (function (_super) { __extends(CpaItem, _super); function CpaItem() { var _this = _super.call(this) || this; _this.ispenchoutipan = false; return _this; } CpaItem.prototype.onInit = function () { this.name = "capItem"; this.AddEventByType(this, Laya.Event.CLICK, this, this.onbtnclick); }; CpaItem.prototype.onbtnclick = function () { if (this._vo) { var data = this._vo; FYHD_Sdk_1.FYHD_Sdk.ShowHuTuiJump(data, this.ispenchoutipan); // var appid = data.to_appid; // var path = data.jump_path; // let param = {"appId":appid.toString(),"path":path.toString()}; // if(Laya.Browser.onMobile) // { // Laya.Browser.window.wx.navigateToMiniProgram( // { // appId:appid.toString(), // path:path.toString(), // success:res=> // { // WxApi.recordAldEvent("跳转到游戏失成功","1"); // }, // fail:res=> // { // if( this.ispenchoutipan ) // { // ViewManager.Instance.add( ChoutiPanView ); // } // } // }); // } } }; CpaItem.prototype.showData = function (data, isopenchoutipan) { if (isopenchoutipan === void 0) { isopenchoutipan = false; } this.ispenchoutipan = isopenchoutipan; this._vo = data; if (data) { this.load_icon.url = data.icon; if (this.txt_word) { this.txt_word.text = data.togame_name; } if (this.img_tip) { this.img_tip.visible = Math.random() > 0.5 ? true : false; } if (this.txt_word1) { this.txt_word1.text = GameUtils_1.GameUtils.randRangeint(235470, 1561430).toString() + "人玩"; } } }; return CpaItem; }(PanelChildControl_1.PanelChildControl)); exports.default = CpaItem; },{"../Control/PanelChildControl":25,"../WXSDK/FYHD_Sdk":71,"../utils/GameUtils":87}],55:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var DispatcherManager_1 = require("../utils/DispatcherManager"); var CpaEvent_1 = require("./CpaEvent"); var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk"); var recommendPan = /** @class */ (function () { function recommendPan(data) { this.game_flg = data["game_flg"]; this.game_id = data["game_id"]; this.game_name = data["game_name"]; this.id = data["id"]; this.location_flg = data["location_flg"]; this.location_id = data["location_id"]; this.location_name = data["location_name"]; this.matter_type = data["matter_type"]; } return recommendPan; }()); exports.recommendPan = recommendPan; var Recommend = /** @class */ (function () { function Recommend() { Recommend.InitData(); } Recommend.InitData = function () { Recommend.cainixihuanData = Recommend.GetCaiNiXiaHuanDatas(); Recommend.jiesuanData = Recommend.GetJIeSuanDatas(); Recommend.gdyxData = Recommend.GetGDYXDatas(); Recommend.baokuanyouxiData = Recommend.GetBaoKuanYouXiDatas(); Recommend.moreData = Recommend.GetMoreDatas(); for (var key in FYHD_Sdk_1.FYHD_Sdk.pushData) { Recommend.recommendDic[FYHD_Sdk_1.FYHD_Sdk.pushData[key].location_flg] = new recommendPan(FYHD_Sdk_1.FYHD_Sdk.pushData[key]); } Recommend.getdata = true; DispatcherManager_1.DispatcherManager.dispatchEvent(CpaEvent_1.default.YQHomeData); console.log("互推数据初始化recommend--------------"); }; Recommend.GetSSDatas = function () { var items = []; if (!FYHD_Sdk_1.FYHD_Sdk.pushData) return items; for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) { items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i])); } return items; }; Recommend.GetCaiNiXiaHuanDatas = function () { var items = []; if (!FYHD_Sdk_1.FYHD_Sdk.pushData) return items; for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) { items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i])); } return items; }; Recommend.GetMoreDatas = function () { var items = []; if (!FYHD_Sdk_1.FYHD_Sdk.pushData) return items; for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) { items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i])); } return items; }; Recommend.GetBaoKuanYouXiDatas = function () { var items = []; if (!FYHD_Sdk_1.FYHD_Sdk.pushData) return items; for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) { items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i])); } return items; }; Recommend.GetJIeSuanDatas = function () { var items = []; if (!FYHD_Sdk_1.FYHD_Sdk.pushData) return items; for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) { items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i])); } return items; }; Recommend.GetGDYXDatas = function () { var items = []; if (!FYHD_Sdk_1.FYHD_Sdk.pushData) return items; for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) { items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i])); } return items; }; Recommend.getdata = false; Recommend.recommendDic = {}; Recommend.cainixihuanData = []; Recommend.baokuanyouxiData = []; Recommend.gdyxData = []; Recommend.jiesuanData = []; Recommend.moreData = []; return Recommend; }()); exports.Recommend = Recommend; var RecommendItem = /** @class */ (function () { function RecommendItem(Data) { this.icon = Data["icon"]; this.to_appid = Data["to_appid"]; this.togame_name = Data["togame_name"]; this.jump_path = Data["jump_path"]; this.jump_type = Data["jump_type"]; this.panel = Data["panel"]; this.qrcode = Data["qrcode"]; } return RecommendItem; }()); exports.RecommendItem = RecommendItem; var RecommendView = /** @class */ (function () { function RecommendView() { } return RecommendView; }()); exports.default = RecommendView; },{"../WXSDK/FYHD_Sdk":71,"../utils/DispatcherManager":85,"./CpaEvent":53}],56:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelChildControl_1 = require("../Control/PanelChildControl"); var RecommendView_1 = require("./RecommendView"); var TimerService_1 = require("../Time/TimerService"); // import { ttad } from "../ttad"; var ShiwantuijianView = /** @class */ (function (_super) { __extends(ShiwantuijianView, _super); function ShiwantuijianView() { var _this = _super.call(this) || this; _this._iscanmove = false; _this._movetime = 0; _this._flushtime = 0; _this.dir = true; _this._nowvalue = 0; return _this; } ShiwantuijianView.prototype.onInit = function () { this.initView(); this.initEvent(); }; ShiwantuijianView.prototype.initView = function () { this.list_0.setVirtual(); this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false); this._nowlist = RecommendView_1.Recommend.jiesuanData; if (this._nowlist.length > 0) { this.list_0.numItems = this._nowlist.length; this.visible = true; for (var i = 0; i < this._nowlist.length; i++) { } this._isStart = true; this._iscanmove = true; TimerService_1.TimerService.Instance.addUpdateTarget(this); } else { this.visible = false; } }; ShiwantuijianView.prototype.initEvent = function () { this.AddEventByType(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick); this.AddEventByType(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick); this.AddEventByType(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick); }; ShiwantuijianView.prototype.downclick = function () { this._isdown = true; this._iscanmove = false; Laya.timer.clear(this, this.timeoutCallback); // ttad.CreateMoreGameBtn(); }; ShiwantuijianView.prototype.timeoutCallback = function () { this._iscanmove = true; }; ShiwantuijianView.prototype.upclick = function () { if (this._isdown) { this._isdown = false; this._nowvalue = this.list_0.scrollPane.percY; Laya.timer.once(2000, this, this.timeoutCallback); } }; ShiwantuijianView.prototype.itemrenderlist = function (index, item) { if (index < this._nowlist.length) { item.showData(this._nowlist[index], true); } }; ShiwantuijianView.prototype.update = function (dt) { if (this._isStart) { if (this.list_0.scrollPane && this._nowlist && this._nowlist.length > 0 && this._iscanmove) { if (this.dir) { this._nowvalue += 0.001; if (this._nowvalue >= 1) { this._nowvalue = 1; this.dir = false; } } else { this._nowvalue -= 0.001; if (this._nowvalue <= 0) { this._nowvalue = 0; this.dir = true; } } this.list_0.scrollPane.setPercY(this._nowvalue); } } }; ShiwantuijianView.prototype.dispose = function () { this._iscanmove = false; TimerService_1.TimerService.Instance.removeUpdateTarget(this); _super.prototype.dispose.call(this); }; return ShiwantuijianView; }(PanelChildControl_1.PanelChildControl)); exports.default = ShiwantuijianView; },{"../Control/PanelChildControl":25,"../Time/TimerService":59,"./RecommendView":55}],57:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var RecommendView_1 = require("./RecommendView"); var ViewManager_1 = require("../View/ViewManager"); var PanelBaseControl_1 = require("../Control/PanelBaseControl"); var GameUtils_1 = require("../utils/GameUtils"); var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk"); var TuijianView = /** @class */ (function (_super) { __extends(TuijianView, _super); function TuijianView() { return _super.call(this, "main", "tuijianView") || this; } TuijianView.prototype.initView = function () { this.list_1.setVirtual(); this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false); this.list_2.setVirtual(); this.list_2.itemRenderer = Laya.Handler.create(this, this.itemrenderlist2, null, false); this._nowlist1 = RecommendView_1.Recommend.gdyxData; this._nowlist2 = RecommendView_1.Recommend.gdyxData; this.list_1.numItems = 7; this.list_2.numItems = this._nowlist2.length; }; TuijianView.prototype.initEvent = function () { this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun); this.AddEventByType(this.more, Laya.Event.CLICK, this, this.JumpApp); }; TuijianView.prototype.itemrenderlist1 = function (index, item) { if (index < 7) { item.showData(this._nowlist1[index]); } }; TuijianView.prototype.itemrenderlist2 = function (index, item) { if (index < this._nowlist2.length) { item.showData(this._nowlist2[index]); } }; TuijianView.prototype.onclosefun = function () { ViewManager_1.ViewManager.Instance.close(TuijianView); }; //随机跳转游戏 TuijianView.prototype.JumpApp = function () { var ran = GameUtils_1.GameUtils.randRangeint(0, this._nowlist1.length - 1); FYHD_Sdk_1.FYHD_Sdk.ShowHuTuiJump(this._nowlist1[ran], false); }; TuijianView.key = "TuijianView"; return TuijianView; }(PanelBaseControl_1.PanelBaseControl)); exports.default = TuijianView; },{"../Control/PanelBaseControl":24,"../View/ViewManager":70,"../WXSDK/FYHD_Sdk":71,"../utils/GameUtils":87,"./RecommendView":55}],58:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TimeUtils = /** @class */ (function () { function TimeUtils() { } /** * 月/日 小时:分钟 * @param value */ TimeUtils.formatData = function (value) { var str = ""; var date = new Date(value * 1000); str = this.getTwo(date.getMonth() + 1) + "/" + this.getTwo(date.getDate()) + " " + this.getTwo(date.getHours()) + ":" + this.getTwo(date.getMinutes()); return str; }; /** * 月/日 * @param value */ TimeUtils.formatData1 = function (value) { var str = ""; var date = new Date(value * 1000); str = (date.getMonth() + 1) + "月" + date.getDate() + "日"; return str; }; /** * 年月日 * @param value */ TimeUtils.formatYearMonthDate = function (value) { var str = ""; var date = new Date(value * 1000); str = date.getFullYear() + "." + (date.getMonth() + 1) + "." + date.getDate(); return str; }; /** * 年-月-日 * @param value */ TimeUtils.formatYearMonthDate1 = function (value) { var str = ""; var date = new Date(value * 1000); var month = (date.getMonth() + 1) >= 10 ? (date.getMonth() + 1).toString() : "0" + (date.getMonth() + 1); var dates = date.getDate() >= 10 ? date.getDate().toString() : "0" + date.getDate(); str = date.getFullYear() + "-" + month + "-" + dates; return str; }; TimeUtils.LXandJXTimeType = function (value) { var str = ""; if (value < 0) { str = "0秒"; } else if (value < 60) { str = Math.floor(value) + "秒"; } else if (value < 60 * 60) { str = Math.floor(value / 60) + "分钟"; } else { var hour; hour = Math.floor(value / 60 / 60); str = hour + "小时"; str += Math.floor((value - hour * 60 * 60) / 60) + "分钟"; } return str; }; /** * 格式化时间 * @param time 秒 * @return 返回24:59:59 */ TimeUtils.formatTime = function (time) { var str = ""; var hours = Math.floor(time / 3600); if (hours > 0) { str += hours >= 10 ? (hours + ":") : ("0" + hours + ":"); } var minutes = Math.floor((time % 3600) / 60); str += minutes >= 10 ? (minutes + ":") : ("0" + minutes + ":"); var second = Math.floor(time % 60); str += second >= 10 ? (second + "") : ("0" + second); return str; }; /** * 格式化时间 * @param time 秒 * @return 返回24小时59分59秒 */ TimeUtils.formatTime1 = function (time) { var str = ""; var hours = Math.floor(time / 3600); if (hours > 0) { str += hours + "小时"; } var minutes = Math.floor((time % 3600) / 60); str += minutes + "分钟"; var second = Math.floor(time % 60); str += second + "秒"; return str; }; /** * 格式化时间 * @param time 秒 * @return 返回1小时24分10秒 */ TimeUtils.formatTime5 = function (time) { var str = ""; var hours = Math.floor(time / 3600); if (hours > 0) { str += hours + "小时"; } var minutes = Math.floor((time % 3600) / 60); if (minutes > 0) { str += minutes + "分"; } var second = Math.floor(time % 60); str += second + "秒"; return str; }; /** * 格式化时间 * @param time 秒 * @return 返回1天24小时59分59秒 */ TimeUtils.formatTime2 = function (time) { var str = ""; var day = Math.floor(time / 86400); if (day > 0) { str += day + "天"; } var hours = Math.floor(time / 3600); if (hours > 0) { str += hours + "小时"; } var minutes = Math.floor((time % 3600) / 60); if (minutes > 0) { str += minutes + "分钟"; } var second = Math.ceil(time % 60); str += second + "秒"; return str; }; /** * 格式化时间 * @param time 秒 * @return 返回1天24小时( 只保留两个 ) */ TimeUtils.formatTime6 = function (time) { var str = ""; var index = 0; var day = Math.floor(time / 86400); if (day > 0) { str += day + "天"; index++; } var hours = Math.floor((time % 86400) / 3600); if (hours > 0) { str += hours + "小时"; index++; } if (index < 2) { var minutes = Math.floor((time % 3600) / 60); if (minutes > 0) { str += minutes + "分"; index++; } } if (index < 2) { var second = Math.ceil(time % 60); str += second + "秒"; } return str; }; /** * 格式化时间 * @param time 秒 * @return 返回1天24小时59分 */ TimeUtils.formatTime3 = function (time) { var str = ""; var day = Math.floor(time / 86400); str += day + "天"; var hours = Math.floor(time % 86400 / 3600); str += hours + "小时"; var minutes = Math.floor((time % 86400 % 3600) / 60); str += minutes + "分"; return str; }; /** * 格式化时间 * @param time 秒 * @return 返回1天24小时59分 */ TimeUtils.formatTime4 = function (time) { var str = ""; if (time > 86400) { var day = Math.floor(time / 86400); str += day + "天"; } if (time > 3600) { var hours = Math.floor(time % 86400 / 3600); str += hours + "小时"; } if (time > 60) { var minutes = Math.floor((time % 86400 % 3600) / 60); str += minutes + "分钟"; } return str; }; /** * 格式化时间 * @param time 秒 * @return 返回1天24小时59分 */ TimeUtils.formatTime4Arr = function (time) { var arrTime = []; var str = ""; // if (time >= 86400) { // var day: number = Math.floor(time / 86400); // arrTime.unshift(String(day)); // } if (time >= 3600) { var hours = Math.floor(time % 86400 / 3600); arrTime.unshift(String(hours)); } if (time >= 60) { var minutes = Math.floor((time % 86400 % 3600) / 60); arrTime.unshift(String(minutes)); } return arrTime; }; TimeUtils.getTwo = function (value) { var str = String(value); if (str.length < 2) { str = "0" + str; } return str; }; /** * 日期转时间戳 * @param str 2018-1-1 */ TimeUtils.datetoTime = function (str) { return Date.parse(str) / 1000; }; return TimeUtils; }()); exports.TimeUtils = TimeUtils; },{}],59:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * name; */ var TimerService = /** @class */ (function (_super) { __extends(TimerService, _super); function TimerService() { var _this = _super.call(this) || this; _this._timeScale = 1; _this._unscalableList = []; TimerService.ins = _this; return _this; } Object.defineProperty(TimerService, "Instance", { get: function () { if (TimerService.ins == null) { return new TimerService(); } return TimerService.ins; }, enumerable: true, configurable: true }); TimerService.prototype.init = function () { Laya.timer.frameLoop(1, this, this.onTimer); }; TimerService.prototype.initEvent = function () { }; TimerService.prototype.stop = function () { Laya.timer.clear(this, this.onTimer); }; TimerService.prototype.recover = function () { this.stop(); Laya.timer.frameLoop(1, this, this.onTimer); }; TimerService.prototype.onTimer = function () { var i = 0; for (i = 0; i < this._unscalableList.length; i++) { this._unscalableList[i].update(Laya.timer.delta * this._timeScale); } }; TimerService.prototype.hasUpdataTarget = function (updateTarget) { var index; index = this._unscalableList.indexOf(updateTarget); if (index != -1) { return true; } return false; }; TimerService.prototype.addUpdateTarget = function (updateTarget) { var index; index = this._unscalableList.indexOf(updateTarget); if (index == -1) { this._unscalableList.push(updateTarget); } }; TimerService.prototype.removeUpdateTarget = function (updateTarget) { var index = this._unscalableList.indexOf(updateTarget); if (index != -1) { this._unscalableList.splice(index, 1); } }; Object.defineProperty(TimerService.prototype, "timeScale", { get: function () { return this._timeScale; }, /** * @private */ set: function (value) { if (value < 0 || isNaN(value)) { value = 1; } this._timeScale = value; }, enumerable: true, configurable: true }); return TimerService; }(Laya.EventDispatcher)); exports.TimerService = TimerService; },{}],60:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var UserDataInfo_1 = require("../Data/UserDataInfo"); var LocalDataControl_1 = require("../Control/LocalDataControl"); var TimesTamper = /** @class */ (function () { function TimesTamper() { this.lastgameTime = 0; /** * 同步服务器时间(秒) */ this._serverTime = 0; this.iscan = false; this._onlinedistime = 0; this._time = 0; this._onlinetime = 0; } Object.defineProperty(TimesTamper, "Instance", { get: function () { if (TimesTamper.ins == null) { return new TimesTamper(); } return TimesTamper.ins; }, enumerable: true, configurable: true }); TimesTamper.prototype.init = function () { this.lastgameTime = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.lasttime); Laya.timer.frameLoop(1, this, this.update); }; TimesTamper.prototype.updateServiceTime = function (serverTime) { this._serverTime = Number(serverTime); this.iscan = true; this._onlinedistime = this._serverTime; LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lasttime, this._serverTime.toString()); }; TimesTamper.prototype.update = function () { if (this.iscan) { this._time += Laya.timer.delta; this._onlinetime += Laya.timer.delta; this._serverTime += Laya.timer.delta / 1000; if (this._time >= 30000) { this._time = 0; LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lasttime, this._serverTime.toString()); } if (this._onlinetime >= 90000) { this._onlinetime = 0; this.sendonlineTongji(); } } }; TimesTamper.prototype.sendonlineTongji = function () { var distime = this.serverTime - this._onlinedistime; if (distime > 0) { this._onlinedistime = this.serverTime; } }; Object.defineProperty(TimesTamper.prototype, "serverTime", { /** * 服务器时间 ( 秒 ) * @return * */ get: function () { return this._serverTime; }, enumerable: true, configurable: true }); return TimesTamper; }()); exports.TimesTamper = TimesTamper; },{"../Control/LocalDataControl":23,"../Data/UserDataInfo":35}],61:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelBaseControl_1 = require("../Control/PanelBaseControl"); var ViewAction_1 = require("../utils/ViewAction"); var GameStateControl_1 = require("../Control/GameStateControl"); var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage"); var AgencyInGame_1 = require("../Agency/AgencyInGame"); var PlayerAccount_1 = require("../WXSDK/PlayerAccount"); var ViewManager_1 = require("../View/ViewManager"); var GuangGao_1 = require("../WXSDK/GuangGao"); var GameState_1 = require("../utils/GameState"); var Player_1 = require("../Game/Player"); var PropManager_1 = require("../PrefabControl/PropManager"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var CharacterState_1 = require("../PrefabControl/CharacterState"); var RecordManager_1 = require("../WXSDK/RecordManager"); var ttad_1 = require("../WXSDK/ttad"); // import ChoutiPanView from "../Push/ChoutiPanView"; var CompletePanel = /** @class */ (function (_super) { __extends(CompletePanel, _super); function CompletePanel(gold) { var _this = _super.call(this, "main", "gameresult", false, ViewAction_1.ViewAction.ActionType_none, 1) || this; _this.getgold = 0; _this._position = new Laya.Vector3(); _this._outPos = new Laya.Vector3(); _this.scaleDelta = 0; _this.scale = new Laya.Vector3(0.1, 0.1, 0.1); _this.time = 9; _this.count = false; _this.fuhuo = false; _this.getgold = gold; return _this; } /*************************************************************** */ CompletePanel.prototype.loadScene = function () { Laya.Scene3D.load("res/threeDimen/scene/ParticleScene/Example_01.ls", Laya.Handler.create(this, function (scene) { this.scene = Laya.stage.addChildAt(scene, 0); var camera = this.scene.addChild(new Laya.Camera(0, 0.1, 100)); camera.transform.translate(new Laya.Vector3(0, 1, 0)); })); }; CompletePanel.prototype.garbageCollection = function () { this.scene.destroy(); //销毁场景 this.scene = null; Laya.Resource.destroyUnusedResources(); //销毁无用资源(没有被场景树引用,并且没有加资源锁的) }; /*************************************************************** */ CompletePanel.prototype.btn1click = function () { if (this.c_state.selectedIndex == 0) { if (this.duihao.visible) { this.playvideocallback(); } else { this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold); this.getProxy(AgencyUserMessage_1.AgencyUserMessage).LevelUp(); this._gameProxy.returnmainview(true); } } else if (this.c_state.selectedIndex == 1) { this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold); this._gameProxy.returnmainview(); // ViewManager.Instance.add( ChoutiPanView ); } else if (this.c_state.selectedIndex == 2) { // ShareUtil.shareImage("分享复活----",this.sharerevive,"1") this.sharerevive(); } }; CompletePanel.prototype.onComplete = function () { Laya.Sprite3D.load("res/threeDimen/skinModel/LayaMonkey/LayaMonkey.lh", Laya.Handler.create(this, function (layaMonkey3D) { this.layaMonkey3D = layaMonkey3D; this.scene.addChild(layaMonkey3D); this.layaMonkey2D = Laya.stage.addChild(new Laya.Image("res/threeDimen/monkey.png")); Laya.timer.frameLoop(1, this, this.animate); })); }; CompletePanel.prototype.animate = function () { this._position.x = Math.sin(this.scaleDelta += 0.01); this.layaMonkey3D.transform.position = this._position; this.layaMonkey3D.transform.scale = this.scale; //转换坐标 this.camera.viewport.project(this.layaMonkey3D.transform.position, this.camera.projectionViewMatrix, this._outPos); //赋值给2D this.layaMonkey2D.pos(this._outPos.x / Laya.stage.clientScaleX, this._outPos.y / Laya.stage.clientScaleY); }; /******************************************** */ CompletePanel.prototype.btn0click = function () { if (this.c_state.selectedIndex == 0) { this.playvideocallback(); // pingtaiutils.Instance.playVideo( "",this,this.playvideocallback ); } else if (this.c_state.selectedIndex == 1) { this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold); this._gameProxy.returnmainview(); // ViewManager.Instance.add( ChoutiPanView ); } else if (this.c_state.selectedIndex == 2) { this.count = false; // pingtaiutils.Instance.playVideo("",this,this.playvideorevive); this.playvideorevive(); } }; /**看视频复活成功 */ CompletePanel.prototype.playvideorevive = function () { var _this = this; ttad_1.ttad.ShowVideo((function (isLoad) { if (isLoad) { // ViewManager.Instance.add(ChoutiPanView); GameState_1.GameState.fuhuocishu--; ViewManager_1.ViewManager.Instance.close(CompletePanel); GameState_1.GameState.isdie = false; Player_1.Player.Instance._iscanMove = true; // Player.Instance.PlayAnimator( CharacterState.run ); Player_1.Player.Instance.nowAction = CharacterState_1.CharacterState.run; if (Player_1.Player.Instance._nowscenename == "" || Player_1.Player.Instance._nowbuildname == "") { console.log("玩家位置----", Player_1.Player.Instance._initPosVec); console.log("玩家速度_moveVec", Player_1.Player.Instance._moveVec); Player_1.Player.Instance._transform.position = new Laya.Vector3(0, 1, 3); } else { console.log("当前场景名字---", Player_1.Player.Instance._nowscenename); console.log("当前建筑名字---", Player_1.Player.Instance._nowbuildname); console.log("建筑物位置----", PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname)); Player_1.Player.Instance._transform.position = PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname).clone(); } Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed * 2; Laya.timer.once(3000, _this, function () { Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed; }); } else { _this.count = true; } })); }; /**分享复活成功 */ CompletePanel.prototype.sharerevive = function () { var _this = this; RecordManager_1.RecordManager.Instance.ShareVideo(function (isLoad) { if (isLoad) { RecordManager_1.RecordManager.Instance.RecordStart(); GameState_1.GameState.fuhuocishu--; // GameState.recordscree = true; ViewManager_1.ViewManager.Instance.close(CompletePanel); GameState_1.GameState.isdie = false; Player_1.Player.Instance._iscanMove = true; // Player.Instance.PlayAnimator( CharacterState.run ); Player_1.Player.Instance.nowAction = CharacterState_1.CharacterState.run; if (Player_1.Player.Instance._nowscenename == "" || Player_1.Player.Instance._nowbuildname == "") { console.log("玩家位置----", Player_1.Player.Instance._initPosVec); Player_1.Player.Instance._transform.position = new Laya.Vector3(0, 1, 3); } else { console.log("当前场景名字---", Player_1.Player.Instance._nowscenename); console.log("当前建筑名字---", Player_1.Player.Instance._nowbuildname); console.log("建筑物位置----", PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname)); Player_1.Player.Instance._transform.position = PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname).clone(); } // GlobalTip.Instance.showWordTips("复活加速成功"); Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed * 2; Laya.timer.once(3000, _this, function () { Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed; }); } else { _this.count = true; } }); // if(_success){ // // ViewManager.Instance.add(ChoutiPanView); // GameState.fuhuocishu --; // ViewManager.Instance.close( CompletePanel ); // GameState.isdie = false; // Player.Instance._iscanMove = true; // // Player.Instance.PlayAnimator( CharacterState.run ); // Player.Instance.nowAction = CharacterState.run; // if (Player.Instance._nowscenename == "" || Player.Instance._nowbuildname == "") { // console.log("玩家位置----",Player.Instance._initPosVec); // Player.Instance._transform.position = Player.Instance._initPosVec.clone() // } // else { // console.log("当前场景名字---",Player.Instance._nowscenename); // console.log("当前建筑名字---",Player.Instance._nowbuildname); // console.log("建筑物位置----",PropManager.getPosVecbyScene(Player.Instance._nowscenename, Player.Instance._nowbuildname)); // Player.Instance._transform.position = PropManager.getPosVecbyScene(Player.Instance._nowscenename, Player.Instance._nowbuildname).clone(); // } // // GlobalTip.Instance.showWordTips("复活加速成功"); // Player.Instance._speedMoveV3.z = -Player.Instance._RoleData.movespeed*2; // Laya.timer.once(3000,this,()=>{ // Player.Instance._speedMoveV3.z = -Player.Instance._RoleData.movespeed; // }) // } // else{ // this.count = true; // } }; CompletePanel.prototype.playvideocallback = function () { var _this = this; ttad_1.ttad.ShowVideo((function (isLoad) { if (isLoad) { _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(_this.getgold * 3); _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).LevelUp(); _this._gameProxy.returnmainview(true); _this.BattleBtn.visible = false; } })); // ttad.ShowVideo((isLoad=>{ // if(isLoad){ // ( this.getProxy( AgencyUserMessage ) as AgencyUserMessage ).GoldUp( this.getgold*3 ); // this._gameProxy.returnmainview(true); // } // })) }; //分享视频 CompletePanel.prototype.ShareVideoCallBack = function () { var _this = this; RecordManager_1.RecordManager.Instance.ShareVideo((function (isLoad) { if (isLoad) { _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(_this.getgold * 3); _this.BattleBtn.visible = false; _this.ShareVideo.visible = false; } })); }; //点击勾选框 CompletePanel.prototype.ClickKuang = function () { if (this.duihao.visible) { this.duihao.visible = false; this.btn_1.visible = this.duihao.visible; this.btn_2.visible = !this.duihao.visible; } else { this.duihao.visible = true; this.btn_1.visible = this.duihao.visible; this.btn_2.visible = !this.duihao.visible; } }; CompletePanel.prototype.destory = function () { Laya.timer.clear(this, this.CountTime); // Laya.timer.clear(this,this.playanimator); // GuangGao.Clear(); ttad_1.ttad.Clear(); _super.prototype.destory.call(this); }; CompletePanel.prototype.initView = function () { var _this = this; this.tianjia.visible = false; this.TianJiaAni = this.getTransitionByName("tianjiaani"); this.TianJiaAni.stop(); // Laya.timer.loop(2000,this,this.playanimator); this.count = true; this._gameProxy = this.getProxy(AgencyInGame_1.AgencyInGame); this.c_state = this.getControllerByBame("c_state"); this.txt_gold.text = this.getgold.toString(); this.duihao = this.kuang.getChildAt(1); this.duihao.visible = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.Choose; this.share_goldnum = this.ShareVideo.getChildAt(4); this.ShareVideoBtn = this.ShareVideo.getChildAt(1); this.jiesuanbtn = this.ShareVideo.getChildAt(2); this.share_goldnum.text = this.getgold.toString(); this.btn_1.visible = this.duihao.visible; this.btn_2.visible = !this.duihao.visible; if (GameState_1.GameState.recordscree) { this.BattleBtn.visible = false; } else { this.BattleBtn.visible = false; if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.ShowBattleBtn) { this.BattleBtn.visible = true; } } // this.BattleBtn.visible = !GameState.recordscree; if (!GameState_1.GameState.isdie) { //玩家未死亡的状态 if (GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0) { this.c_state.selectedIndex = 0; } else { this.c_state.selectedIndex = 1; } } else { if (GameState_1.GameState.fuhuocishu > 0) { this.c_state.selectedIndex = 2; Laya.timer.loop(1000, this, this.CountTime); } else { this.c_state.selectedIndex = 1; } } if (this.c_state.selectedIndex == 0) { this.ShareVideo.visible = true; this.jiesuanbtn.visible = false; Laya.timer.once(2000, this, function () { _this.jiesuanbtn.visible = true; }); } else { this.ShareVideo.visible = false; } GuangGao_1.GuangGao.CheatBanner(this.btn_1); }; CompletePanel.prototype.playanimator = function () { this.TianJiaAni.play(null, 1); }; CompletePanel.prototype.ClickJieSuan = function () { this.ShareVideo.visible = false; }; CompletePanel.prototype.initEvent = function () { this.AddEventByType(this.btn_0, Laya.Event.CLICK, this, this.btn0click); this.AddEventByType(this.btn_1, Laya.Event.CLICK, this, this.btn1click); this.AddEventByType(this.BattleBtn, Laya.Event.CLICK, this, this.ShareBattle); this.AddEventByType(this.btn_2, Laya.Event.CLICK, this, this.btn1click); this.AddEventByType(this.kuang, Laya.Event.CLICK, this, this.ClickKuang); this.AddEventByType(this.ShareVideoBtn, Laya.Event.CLICK, this, this.ShareVideoCallBack); this.AddEventByType(this.jiesuanbtn, Laya.Event.CLICK, this, this.ClickJieSuan); }; //倒计时 CompletePanel.prototype.CountTime = function () { if (this.count && this.time > 0) { this.time -= 1; this.timenum.text = this.time.toString(); if (this.time < 1) { Laya.timer.clear(this, this.CountTime); GameState_1.GameState.fuhuocishu--; // Laya.timer.clear(this,this.playanimator); ViewManager_1.ViewManager.Instance.close(CompletePanel); DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose); } } }; //录屏分享 CompletePanel.prototype.ShareBattle = function () { var _this = this; RecordManager_1.RecordManager.Instance.ShareVideo(function (isLoad) { if (isLoad) { _this.BattleBtn.visible = false; } }); // RecordManager.Instance.ShareVideo((isLoad=>{ // if(isLoad){ // this.BattleBtn.visible = false; // } // })) }; CompletePanel.key = "CompletePanel"; return CompletePanel; }(PanelBaseControl_1.PanelBaseControl)); exports.CompletePanel = CompletePanel; },{"../Agency/AgencyInGame":2,"../Agency/AgencyUserMessage":8,"../Control/GameStateControl":21,"../Control/PanelBaseControl":24,"../Game/Player":40,"../PrefabControl/CharacterState":46,"../PrefabControl/PropManager":49,"../View/ViewManager":70,"../WXSDK/GuangGao":72,"../WXSDK/PlayerAccount":75,"../WXSDK/RecordManager":76,"../WXSDK/ttad":83,"../utils/DispatcherManager":85,"../utils/GameState":86,"../utils/ViewAction":93}],62:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelBaseControl_1 = require("../Control/PanelBaseControl"); var GameUtils_1 = require("../utils/GameUtils"); var TimerService_1 = require("../Time/TimerService"); var GuangGao_1 = require("../WXSDK/GuangGao"); var ViewAction_1 = require("../utils/ViewAction"); var ViewManager_1 = require("./ViewManager"); var SceneControl_1 = require("../Control/SceneControl"); var GameStateControl_1 = require("../Control/GameStateControl"); var GlobalTip_1 = require("../utils/GlobalTip"); var ttad_1 = require("../WXSDK/ttad"); var EggPanel = /** @class */ (function (_super) { __extends(EggPanel, _super); function EggPanel() { var _this = _super.call(this, "main", "eggview", false, ViewAction_1.ViewAction.ActionType_none, 1) || this; _this._isComplete = false; _this._isShowBanner = false; _this._bannerVal = 0.5; _this._maxClickCnt = 18; _this._clickCnt = 0; _this._interval = 100; _this._decrement = 1; _this._time = 0; return _this; } EggPanel.prototype.initView = function () { this.hitani = this.getTransitionByName("hitani"); this.pro_0.value = 1; this._bannerVal = GameUtils_1.GameUtils.randRangefloat(0.2, 0.4); TimerService_1.TimerService.Instance.addUpdateTarget(this); // GuangGao.CheatBanner(this.btn_1); // GuangGao.Clear();//h["default"].Clear()r["default"] ttad_1.ttad.Clear(); var sceneheight = Laya.stage.height; this.btn_1.y = sceneheight - this.btn_1.height - 15; this.getrewardbtn.y = this.btn_1.y; this.getrewardbtn.visible = false; if (SceneControl_1.SceneControl.EggGGroup == 0) { this.n6.visible = true; } }; EggPanel.prototype.bannercallback = function () { }; EggPanel.prototype.initEvent = function () { this.AddEventByType(this.btn_1, Laya.Event.CLICK, this, this.qiaoDa); this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, EggPanel.onclosefun); this.AddEventByType(this.getrewardbtn, Laya.Event.CLICK, this, EggPanel.VideoGetReward); }; EggPanel.prototype.update = function (dt) { this._time += dt; if (this._time >= this._interval) { this._time = 0; this.Daojishi(); } }; EggPanel.prototype.Daojishi = function () { var pv = this.pro_0.value; pv -= this._decrement; if (pv <= 0) pv = 1; this.pro_0.value = pv; this._clickCnt = Math.ceil(pv * this._maxClickCnt / 100); }; EggPanel.prototype.qiaoDa = function () { var _this = this; if (!this._isComplete) { if (this.hitani != null && !this.hitani.playing) { this.hitani.play(null, 1); } this._clickCnt++; if (this._clickCnt > this._maxClickCnt) this._clickCnt = this._maxClickCnt; var pv = this._clickCnt / this._maxClickCnt; if (pv > 1) { pv = 1; } this.pro_0.value = pv * 100; if (pv >= this._bannerVal && !this._isShowBanner) { this._isShowBanner = true; this.getrewardbtn.visible = true; // GuangGao.OpenBanner(); Laya.timer.once(2000, this, function () { _this.getrewardbtn.visible = false; }); } if (pv >= 1) { this._isComplete = true; EggPanel.getreward(); } } }; EggPanel.getreward = function () { // var zpproxy:AgencyLottery = this.getProxy( AgencyLottery ) as AgencyLottery; // var index = ( this.getProxy( AgencyLottery ) as AgencyLottery ).GetReward(); // var selectcfg:LotteryCFG = LotteryCFG.vec[ index ]; // zpproxy.getreward( selectcfg ); // TimerService.Instance.removeUpdateTarget( this ); GlobalTip_1.GlobalTip.Instance.showWordTips("获得开局加速"); EggPanel.onclosefun(); }; //看视频得奖励 EggPanel.VideoGetReward = function () { ttad_1.ttad.ShowVideo((function (isLoad) { if (isLoad) { GlobalTip_1.GlobalTip.Instance.showWordTips("获得开局加速"); EggPanel.onclosefun(); } else { EggPanel.onclosefun(); } })); }; EggPanel.prototype.hidebanner = function () { // PlatformTool.getInstance().hideBanner("EggView"); GuangGao_1.GuangGao.hidebanner(); }; EggPanel.onclosefun = function () { ViewManager_1.ViewManager.Instance.close(EggPanel); }; EggPanel.prototype.destory = function () { // PlatformTool.getInstance().hideBanner("EggView"); // GuangGao.hidebanner(); TimerService_1.TimerService.Instance.removeUpdateTarget(this); _super.prototype.destory.call(this); GameStateControl_1.GameStateControl.Instance.entergame(true); }; EggPanel.key = "EggPanel"; return EggPanel; }(PanelBaseControl_1.PanelBaseControl)); exports.default = EggPanel; },{"../Control/GameStateControl":21,"../Control/PanelBaseControl":24,"../Control/SceneControl":29,"../Time/TimerService":59,"../WXSDK/GuangGao":72,"../WXSDK/ttad":83,"../utils/GameUtils":87,"../utils/GlobalTip":88,"../utils/ViewAction":93,"./ViewManager":70}],63:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelBaseControl_1 = require("../Control/PanelBaseControl"); var GameUtils_1 = require("../utils/GameUtils"); var TimerService_1 = require("../Time/TimerService"); var GuangGao_1 = require("../WXSDK/GuangGao"); var ViewManager_1 = require("./ViewManager"); var GlobalTip_1 = require("../utils/GlobalTip"); var PlayerAccount_1 = require("../WXSDK/PlayerAccount"); var RoleData_1 = require("../Data/RoleData"); var ttad_1 = require("../WXSDK/ttad"); var GiftView = /** @class */ (function (_super) { __extends(GiftView, _super); function GiftView() { var _this = _super.call(this, "main", "giftcheatview") || this; _this._isComplete = false; _this._isShowBanner = false; _this._bannerVal = 0.5; _this._maxClickCnt = 18; _this._clickCnt = 0; _this._interval = 100; _this._decrement = 1; _this._time = 0; return _this; } GiftView.prototype.initView = function () { this.anniu = this.item.asCom.getChildAt(2); this.kuaisudianji = this.item.asCom.getChildAt(0); this.shou = this.item.asCom.getChildAt(3); this.di = this.item.asCom.getChildAt(1); this.getrewardbtn = this.item.asCom.getChildAt(4); this.getrewardbtn.visible = false; this.clickani = this.item.getTransition("clickbtnani"); this.jindu.value = 1; this._bannerVal = GameUtils_1.GameUtils.randRangefloat(0.2, 0.4); TimerService_1.TimerService.Instance.addUpdateTarget(this); // GuangGao.Clear(); ttad_1.ttad.Clear(); Laya.timer.loop(2000, this, this.playAnimator); // var sceneheight = Laya.stage.height; // this.btnbox.y=sceneheight-this.btnbox.y-15; }; GiftView.prototype.playAnimator = function () { this.clickani.play(null, 1); }; GiftView.prototype.initEvent = function () { this.AddEventByType(this.anniu, Laya.Event.CLICK, this, this.qiaoDa); this.AddEventByType(this.getrewardbtn, Laya.Event.CLICK, this, this.VideoGetReward); }; GiftView.prototype.update = function (dt) { this._time += dt; if (this._time >= this._interval) { this._time = 0; this.Daojishi(); } }; GiftView.prototype.Daojishi = function () { var pv = this.jindu.value; pv -= this._decrement; if (pv <= 0) pv = 1; this.jindu.value = pv; this._clickCnt = Math.ceil(pv * this._maxClickCnt / 100); }; GiftView.prototype.qiaoDa = function () { var _this = this; if (this.shou.visible) { this.shou.visible = false; this.kuaisudianji.visible = false; Laya.timer.clear(this, this.playAnimator); } if (!this._isComplete) { this._clickCnt++; if (this._clickCnt > this._maxClickCnt) this._clickCnt = this._maxClickCnt; var pv = this._clickCnt / this._maxClickCnt; if (pv > 1) { pv = 1; } this.jindu.value = pv * 100; if (pv >= this._bannerVal && !this._isShowBanner) { this._isShowBanner = true; this.getrewardbtn.visible = true; Laya.timer.once(2000, this, function () { _this.getrewardbtn.visible = false; }); } if (pv >= 1) { this._isComplete = true; GiftView.getreward(); } } }; GiftView.getreward = function () { RoleData_1.RoleData.Instance.Money += PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward; // ( this.getProxy( AgencyUserMessage ) as AgencyUserMessage ).GoldUp( PlayerAccount.CurrentAccount.CurAccountData.CheatReward ); // var index = ( this.getProxy( AgencyLottery ) as AgencyLottery ).GetReward(); // var selectcfg:LotteryCFG = LotteryCFG.vec[ index ]; // zpproxy.getreward( selectcfg ); // TimerService.Instance.removeUpdateTarget( this ); GlobalTip_1.GlobalTip.Instance.showWordTips("获得" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward + "金币"); GiftView.onclosefun(); }; //看视频得奖励 GiftView.prototype.VideoGetReward = function () { ttad_1.ttad.ShowVideo((function (isLoad) { if (isLoad) { RoleData_1.RoleData.Instance.Money += PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward; GlobalTip_1.GlobalTip.Instance.showWordTips("获得" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward + "金币"); GiftView.onclosefun(); } else { GiftView.onclosefun(); } })); }; GiftView.prototype.hidebanner = function () { GuangGao_1.GuangGao.hidebanner(); }; GiftView.onclosefun = function () { ViewManager_1.ViewManager.Instance.close(GiftView); }; GiftView.prototype.destory = function () { GuangGao_1.GuangGao.hidebanner(); TimerService_1.TimerService.Instance.removeUpdateTarget(this); _super.prototype.destory.call(this); }; GiftView.key = "GiftView"; return GiftView; }(PanelBaseControl_1.PanelBaseControl)); exports.default = GiftView; },{"../Control/PanelBaseControl":24,"../Data/RoleData":33,"../Time/TimerService":59,"../WXSDK/GuangGao":72,"../WXSDK/PlayerAccount":75,"../WXSDK/ttad":83,"../utils/GameUtils":87,"../utils/GlobalTip":88,"./ViewManager":70}],64:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelBaseControl_1 = require("../Control/PanelBaseControl"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var GameState_1 = require("../utils/GameState"); /* * name; */ var WordTipsPanel = /** @class */ (function (_super) { __extends(WordTipsPanel, _super); function WordTipsPanel() { var _this = _super.call(this, "loading", "wordTips") || this; _this.nowword = ""; return _this; } /****************************************** */ WordTipsPanel.prototype.showText = function () { var text = new Laya.Text(); text.text = "Orientation-Portrait"; text.color = "gray"; text.font = "Impact"; text.fontSize = 50; text.x = Laya.stage.width - text.width >> 1; text.y = Laya.stage.height - text.height >> 1; Laya.stage.addChild(text); }; /****************************************** */ WordTipsPanel.prototype.showWord = function (word) { this.nowword = word; this.text_word.text = word; this.t1.play(Laya.Handler.create(this, this.playEndCallback), 1); }; WordTipsPanel.prototype.onInit = function () { _super.prototype.onInit.call(this); this.t1 = this.getpanelTransition("t1"); }; WordTipsPanel.prototype.createCantralRect = function () { this.rect = new Laya.Sprite(); this.rect.graphics.drawRect(-100, -100, 200, 200, "gray"); Laya.stage.addChild(this.rect); this.updateRectPos(); }; WordTipsPanel.prototype.updateRectPos = function () { this.rect.x = Laya.stage.width / 2; this.rect.y = Laya.stage.height / 2; }; /*************************************************** */ WordTipsPanel.prototype.playEndCallback = function () { DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.removeselect, this); }; WordTipsPanel.key = "WordTipsPanel"; return WordTipsPanel; }(PanelBaseControl_1.PanelBaseControl)); exports.WordTipsPanel = WordTipsPanel; },{"../Control/PanelBaseControl":24,"../utils/DispatcherManager":85,"../utils/GameState":86}],65:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelBaseControl_1 = require("../Control/PanelBaseControl"); var LoadingPanel = /** @class */ (function (_super) { __extends(LoadingPanel, _super); function LoadingPanel() { return _super.call(this, "loading", "loading") || this; } LoadingPanel.prototype.onInit = function () { _super.prototype.onInit.call(this); }; LoadingPanel.prototype.showWord = function (value) { this.pro.value = value; }; LoadingPanel.prototype.onBoyClick = function (e) { //点击后小人会放大缩小 var boy = e.target; if (boy.scaleX === 1) { boy.scale(1.2, 1.2); } else { boy.scale(1, 1); } }; LoadingPanel.prototype.onTxtClick = function (e) { //点击后切换适配模式 e.stopPropagation(); }; LoadingPanel.prototype.destory = function () { this.clearEvent(); _super.prototype.destory.call(this); }; LoadingPanel.key = "LoadingPanel"; return LoadingPanel; }(PanelBaseControl_1.PanelBaseControl)); exports.LoadingPanel = LoadingPanel; },{"../Control/PanelBaseControl":24}],66:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelBaseControl_1 = require("../Control/PanelBaseControl"); var ViewAction_1 = require("../utils/ViewAction"); var ViewManager_1 = require("../View/ViewManager"); var LotteryCFG_1 = require("../CFG/LotteryCFG"); var AssetPath_1 = require("../Config/AssetPath"); var RoleCFG_1 = require("../CFG/RoleCFG"); var AgencyLottery_1 = require("../Agency/AgencyLottery"); var GuangGao_1 = require("../WXSDK/GuangGao"); var ttad_1 = require("../WXSDK/ttad"); var LotteryPanel = /** @class */ (function (_super) { __extends(LotteryPanel, _super); function LotteryPanel() { return _super.call(this, "main", "LotteryView", false, ViewAction_1.ViewAction.ActionType_none, 1) || this; } LotteryPanel.prototype.showLogger = function () { this.logger = new Laya.Text(); this.logger.fontSize = 30; this.logger.color = "#FFFFFF"; this.logger.align = 'center'; this.logger.valign = 'middle'; this.logger.size(Laya.stage.width, Laya.stage.height); this.logger.text = "等待响应...\n"; Laya.stage.addChild(this.logger); }; /************************************* */ LotteryPanel.prototype.onHttpRequestError = function (e) { console.log(e); }; LotteryPanel.prototype.initEvent = function () { this.AddEventByType(this.backbtn, Laya.Event.CLICK, this, this.onclosefun); this.AddEventByType(this.lotterybtn, Laya.Event.CLICK, this, this.choujiangclick); }; LotteryPanel.prototype.playComplte = function () { if (this.tw) { this.tw.clear(); this.tw = null; } this.backbtn.enabled = true; this.lotterybtn.enabled = true; this.agencylottery.getreward(this._selectcfg); }; LotteryPanel.prototype.onclosefun = function () { if (this.tw) { this.tw.clear(); this.tw = null; } GuangGao_1.GuangGao.Clear(); ViewManager_1.ViewManager.Instance.close(LotteryPanel); }; LotteryPanel.prototype.initView = function () { this.agencylottery = this.getProxy(AgencyLottery_1.AgencyLottery); var vec = LotteryCFG_1.default.vec; for (var i = 0; i < vec.length; i++) { var cfg = vec[i]; if (cfg.type == 1) { this["icon_" + i].url = fairygui.UIPackage.getItemURL("main", "img_gold"); this["txt_" + i].text = "X" + cfg.value; } else { var rolecfg = RoleCFG_1.default.dict[cfg.value]; this["icon_" + i].url = AssetPath_1.AssetPath.getroleicon(rolecfg.icon); this["txt_" + i].text = rolecfg.rolename; } } GuangGao_1.GuangGao.CheatBanner(this.lotterybtn); }; /**************************************** */ LotteryPanel.prototype.onSocketClose = function () { console.log("Socket closed"); }; LotteryPanel.prototype.onMessageReveived = function (message) { console.log("Message from server:"); if (typeof message == "string") { console.log(message); } else if (message instanceof ArrayBuffer) { } }; /**************************************** */ LotteryPanel.prototype.choujiangclick = function () { this.videocallback(); // pingtaiutils.Instance.playVideo( "",this,this.videocallback ); }; LotteryPanel.prototype.videocallback = function () { var _this = this; ttad_1.ttad.ShowVideo((function (isLoad) { if (isLoad) { _this.startPlay(); } })); }; LotteryPanel.prototype.startPlay = function () { var index = this.agencylottery.GetReward(); this._selectcfg = LotteryCFG_1.default.vec[index]; this.backbtn.enabled = false; this.lotterybtn.enabled = false; this._nowgetIndex = index; var angle = 360 * 6 + (this._nowgetIndex) * 45 - 15; if (this.item_panel.rotation == 0) { this._tweeObject = { value: 0 }; } else { this._tweeObject = { value: this._preIndex * 45 - 15 }; } this._preIndex = this._nowgetIndex; this.tw = laya.utils.Tween.to(this._tweeObject, { value: angle }, 3000, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.playComplte)); this.tw.update = Laya.Handler.create(this, function () { var value = this._tweeObject.value % 360; this.item_panel.rotation = value; }, null, false); }; LotteryPanel.key = "LotteryPanel"; return LotteryPanel; }(PanelBaseControl_1.PanelBaseControl)); exports.LotteryPanel = LotteryPanel; },{"../Agency/AgencyLottery":4,"../CFG/LotteryCFG":12,"../CFG/RoleCFG":14,"../Config/AssetPath":15,"../Control/PanelBaseControl":24,"../View/ViewManager":70,"../WXSDK/GuangGao":72,"../WXSDK/ttad":83,"../utils/ViewAction":93}],67:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelBaseControl_1 = require("../Control/PanelBaseControl"); var GameStateControl_1 = require("../Control/GameStateControl"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var GameState_1 = require("../utils/GameState"); var PropManager_1 = require("../PrefabControl/PropManager"); var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage"); var UserInfoEvent_1 = require("../Data/UserInfoEvent"); var AgencySkin_1 = require("../Agency/AgencySkin"); var AgencyInGame_1 = require("../Agency/AgencyInGame"); var ViewManager_1 = require("../View/ViewManager"); var AgencyLottery_1 = require("../Agency/AgencyLottery"); var TuijianView_1 = require("../Push/TuijianView"); var ttad_1 = require("../WXSDK/ttad"); var Sdk_1 = require("../WXSDK/Sdk"); var PlayerAccount_1 = require("../WXSDK/PlayerAccount"); var AssetPath_1 = require("../Config/AssetPath"); var LocalDataControl_1 = require("../Control/LocalDataControl"); var UserDataInfo_1 = require("../Data/UserDataInfo"); var SceneControl_1 = require("../Control/SceneControl"); var MainPanel = /** @class */ (function (_super) { __extends(MainPanel, _super); function MainPanel() { var _this = _super.call(this, "main", "mainview") || this; /****************************************** */ // 一只凤凰的分辨率是550 * 400 _this.phoenixWidth = 550; _this.phoenixHeight = 400; _this.bgColorTweener = new Laya.Tween(); _this.gradientInterval = 2000; _this.bgColorChannels = { r: 99, g: 0, b: 0xFF }; //#endregion //#region 初始化签到 _this.isShowSign = false; _this.PaoKuSign = "PaoKuSignInfo"; _this.SignInfo = null; MainPanel.instance = _this; return _this; } MainPanel.prototype.updateUserDataHandler = function () { this.txt_gold.text = this.agencyusermessage.RoleData.Money.toString(); }; MainPanel.prototype.returnmainHandler = function () { var RoleData = this.agencyusermessage.RoleData; // if( RoleData.nowlevel <= 2 ) // { // this.c_state.selectedIndex = 0; // } // else // { this.c_state.selectedIndex = 1; // } }; MainPanel.prototype.onInit = function () { _super.prototype.onInit.call(this); }; MainPanel.prototype.createPhoenixes = function () { var scaleFactor = Math.min(Laya.stage.width / (this.phoenixWidth * 2), Laya.stage.height / this.phoenixHeight); // 加了混合模式的凤凰 var blendedPhoenix; blendedPhoenix.blendMode = "lighter"; blendedPhoenix.scale(scaleFactor, scaleFactor); blendedPhoenix.y = (Laya.stage.height - this.phoenixHeight * scaleFactor) / 2; // 正常模式的凤凰 var normalPhoenix; normalPhoenix.scale(scaleFactor, scaleFactor); normalPhoenix.x = this.phoenixWidth * scaleFactor; normalPhoenix.y = (Laya.stage.height - this.phoenixHeight * scaleFactor) / 2; }; /****************************************** */ MainPanel.prototype.initView = function () { this.ExitBtn.visible = false; this.MoreFunBtn.visible = false; this.MoreGameBtn.visible = false; ttad_1.ttad.Showbanner(); // Laya.timer.once(500,this,()=>{ // console.log("main界面白名单----",FYHD_Sdk.iswhite); // if(FYHD_Sdk.iswhite){ // this.ExitBtn.visible = true; // } // else{ // this.ExitBtn.visible = false; // } // }) this.MoreFunBtnScale = this.getTransitionByName("morefunbtnscale"); Laya.timer.loop(1000, this, this.playanimator2); this.SkinAni = this.SkinBtn.getTransition("skinani"); this.LotteryAni = this.LotteryBtn.getTransition("lotteryani"); this.MoreAni = this.MoreGameBtn.getTransition("moreani"); Laya.timer.loop(3000, this, this.playanimator); this.agencyusermessage = this.getProxy(AgencyUserMessage_1.AgencyUserMessage); PropManager_1.PropManager.pro_jindu = this.pro_dis; PropManager_1.PropManager.txt_mingci = this.txt_mingci; this.c_state = this.getControllerByBame("c_state"); GameStateControl_1.GameStateControl.Instance.setClickPanel(this.load_clickpanel); this.returnmainHandler(); this.updateUserDataHandler(); this.InitSignItem(); }; MainPanel.prototype.playanimator = function () { this.SkinAni.play(null, 1); this.LotteryAni.play(null, 1); this.MoreAni.play(null, 1); }; MainPanel.prototype.playanimator2 = function () { this.MoreFunBtnScale.play(null, 1); }; MainPanel.prototype.choujiangclick = function () { if (SceneControl_1.SceneControl.IsShowSign) return; ttad_1.ttad.Clear(); this.getProxy(AgencyLottery_1.AgencyLottery).openView(); }; MainPanel.prototype.tuijianclick = function () { if (SceneControl_1.SceneControl.IsShowSign) return; ViewManager_1.ViewManager.Instance.add(TuijianView_1.default); }; MainPanel.prototype.skinclick = function () { if (SceneControl_1.SceneControl.IsShowSign) return; ttad_1.ttad.Clear(); this.getProxy(AgencySkin_1.AgencySkin).openview(); }; MainPanel.prototype.moreclick = function () { if (SceneControl_1.SceneControl.IsShowSign) return; // ViewManager.Instance.add( ChoutiPanView ); ttad_1.ttad.CreateMoreGameBtn(); }; MainPanel.prototype.btnclick = function () { if (SceneControl_1.SceneControl.IsShowSign) return; GameState_1.GameState.GameNum++; ttad_1.ttad.Clear(); this.c_state.selectedIndex = 2; this.txt_lv.text = this.agencyusermessage.RoleData.getNowServerLevel().toString(); this.getProxy(AgencyInGame_1.AgencyInGame).startGame(); }; MainPanel.prototype.setclick = function () { }; MainPanel.prototype.mapLoaded = function () { this.layer = this.tiledMap.getLayerByIndex(0); var radiusX = 32; var radiusY = Math.tan(180 / Math.PI * 30) * radiusX; var color = "#FF7F50"; this.sprite = new Laya.Sprite(); this.sprite.graphics.drawLine(0, 0, -radiusX, radiusY, color); this.sprite.graphics.drawLine(0, 0, radiusX, radiusY, color); this.sprite.graphics.drawLine(-radiusX, radiusY, 0, radiusY * 2, color); this.sprite.graphics.drawLine(radiusX, radiusY, 0, radiusY * 2, color); Laya.stage.addChild(this.sprite); }; /*************************************** */ MainPanel.prototype.initEvent = function () { this.AddEventByType(this.load_start, Laya.Event.CLICK, this, this.btnclick); this.AddEventByType(this.SkinBtn, Laya.Event.CLICK, this, this.skinclick); // this.AddEventByType( this.MoreGameBtn,Laya.Event.CLICK,this,this.moreclick ); // this.AddEventByType( this.MoreFunBtn,Laya.Event.CLICK,this,this.moreclick ); // this.AddEventByType( this.ExitBtn,Laya.Event.CLICK,this,this.tuijianclick ); this.addDataEvent(GameState_1.GameState.returnMainView, this, this.returnmainHandler); this.AddEventByType(this.LotteryBtn, Laya.Event.CLICK, this, this.choujiangclick); this.addDataEvent(UserInfoEvent_1.UserInfoEvent.UserInfoEvent_updateUserData, this, this.updateUserDataHandler); }; MainPanel.prototype.InitSignItem = function () { this.LoadSignData(); var _bo = true; if (this.getSystemTime() == this.SignInfo["time"]) { _bo = false; } else { this.SignInfo["FisstLoad"] = 0; } if (this.SignInfo["FisstLoad"] == 1) { _bo = false; } // if(PlayerAccount.CurrentAccount.CurAccountData.SignDebug) // { // _bo=true; // } SceneControl_1.SceneControl.IsShowSign = _bo; this.SignPanel.visible = _bo; if (!_bo) { return; } this.SignFun(); }; MainPanel.prototype.btn_SignFun = function () { if (this.getSystemTime() == this.SignInfo["time"]) { this.isShowSign = true; } this.SignFun(); if (this.isShowSign) { Sdk_1.WxApi.ShowTxt("已签到"); //y.WxApi.ShowTxt("已签到") this.SignSelectedMoney = 0 + ""; } }; MainPanel.prototype.SignFun = function () { this.SignItem = new Array(); this.SignItem.push(this.SignItem1); this.SignItem.push(this.SignItem2); this.SignItem.push(this.SignItem3); this.SignItem.push(this.SignItem4); this.SignItem.push(this.SignItem5); this.SignItem.push(this.SignItem6); this.SignItem.push(this.SignItem7); this.SignTickImage = this.SignAd.asCom.getChildAt(2); var signTickButton = this.SignAd.asCom.getChildAt(1); this.signAdButton = this.SignAd.asCom.getChildAt(3); this.signNoramButton = this.SignAd.asCom.getChildAt(4); this.SignDanbeiBtn = this.SignAd.asCom.getChildAt(5); this.SignTickImage.visible = (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.ShowSign); // this.signNoramButton.visible = this.SignTickImage.visible; // this.SignAd.visible = false; this.SignDanbeiBtn.visible = false; this.AddEventByType(signTickButton, Laya.Event.CLICK, this, this.SignTickButtonFun); this.AddEventByType(this.signAdButton, Laya.Event.CLICK, this, this.SignAdButtonFun); this.AddEventByType(this.signNoramButton, Laya.Event.CLICK, this, this.SignNormalButtonFun); // this.AddEventByType(this.SignDanbeiBtn,Laya.Event.CLICK,this,this.SignNormalButtonFun); var num = this.SignInfo["day"]; var numIndex = 100; if (num < 7) { numIndex = 100; } else { numIndex = 107; num = num % 7; } this.SignPiFu = null; this.SignSelectedMoney = 0 + ""; for (var index = 0; index < this.SignItem.length; index++) { var data = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetRewardConfig((numIndex + 1 + index)); var pifu = null; if (data["reward_item"] != 1000) { if (Number(data["reward_item"]) > 6000) { var pifuIndedx = Number(data["reward_item"]) % 6000; pifu = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetSkinAttr(pifuIndedx); console.log(pifu); } } var isOk = true; var isCnaSign = true; if (index < num) { isOk = true; isCnaSign = false; } else if (index == num) { isOk = false; isCnaSign = true; } else { isOk = false; isCnaSign = false; } var text; if (index < 6) { text = "第 " + (index + 1) + " 天"; } else { text = "豪华皮肤"; } this.SetSignItemInfo(this.SignItem[index], text, data, isOk, isCnaSign, pifu); } ttad_1.ttad.Showbanner(); // }; /**签到*/ MainPanel.prototype.SetSignItemInfo = function (_signItem, text, data, _isOk, _isCanSign, pifu) { console.log(data); if (pifu == null) { console.log(111111111111); var mytext = _signItem.asCom.getChildAt(2); mytext.text = text; var mymoney = _signItem.asCom.getChildAt(3); mymoney.text = data["reward_num"]; _signItem.asCom.getChildAt(5).visible = false; if (_isOk) { _signItem.asCom.getChildAt(1).visible = false; _signItem.asCom.getChildAt(6).visible = true; _signItem.asCom.getChildAt(7).visible = true; } else if (_isCanSign) { _signItem.asCom.getChildAt(1).visible = true; _signItem.asCom.getChildAt(7).visible = false; _signItem.asCom.getChildAt(6).visible = false; this.SignSelectedItem = _signItem; this.SignSelectedText = text; this.SignSelectedMoney = data["reward_num"]; // var child1=_signItem.asCom.getChildAt(7) as fairygui.GButton; // child1.visible=true; // this.addListener(child1,Laya.Event.CLICK,this.SignButtonFun,null); // this.addListener( child1,Laya.Event.CLICK,this,this.SignButtonFun ); } else { _signItem.asCom.getChildAt(1).visible = false; _signItem.asCom.getChildAt(6).visible = false; _signItem.asCom.getChildAt(7).visible = false; } } else { console.log(2222222222); var mytext = _signItem.asCom.getChildAt(2); var mymoney = _signItem.asCom.getChildAt(3); mymoney.visible = false; var myimage = _signItem.asCom.getChildAt(4); myimage.visible = false; var GLoader = _signItem.asCom.getChildAt(5); if (_isOk) { GLoader.icon = AssetPath_1.AssetPath.getroleicon(pifu.icon); _signItem.asCom.getChildAt(1).visible = false; _signItem.asCom.getChildAt(6).visible = true; _signItem.asCom.getChildAt(7).visible = true; } else if (_isCanSign) { _signItem.asCom.getChildAt(1).visible = true; _signItem.asCom.getChildAt(7).visible = false; _signItem.asCom.getChildAt(6).visible = false; this.SignSelectedItem = _signItem; this.SignSelectedText = text; this.SignSelectedMoney = 0 + ""; this.SignPiFu = pifu; GLoader.visible = true; GLoader.icon = AssetPath_1.AssetPath.getroleicon(this.SignPiFu.icon); // this.addListener(child1,Laya.Event.CLICK,this.SignButtonFun,null); // this.addListener( child1,Laya.Event.CLICK,this,this.SignButtonFun ); } else { GLoader.icon = AssetPath_1.AssetPath.getroleicon(pifu.icon); _signItem.asCom.getChildAt(1).visible = false; _signItem.asCom.getChildAt(6).visible = false; _signItem.asCom.getChildAt(7).visible = false; } } }; MainPanel.prototype.SignButtonFun = function () { var _this = this; console.log("收取了"); if (this.getSystemTime == this.SignInfo["time"]) { return; } this.SignAd.visible = true; Laya.timer.once(3000, this, function () { _this.signNoramButton.visible = true; }); this.SetSignItemInfo(this.SignSelectedItem, this.SignSelectedText, this.SignSelectedMoney, true, false, this.SignPiFu); this.SaveSignData(); }; /*勾选方法*/ MainPanel.prototype.SignTickButtonFun = function () { this.SignTickImage.visible = !this.SignTickImage.visible; // this.SignDanbeiBtn.visible = !this.SignTickImage.visible; // this.signNoramButton.visible = this.SignTickImage.visible; }; /*点击视频双倍领取*/ MainPanel.prototype.SignAdButtonFun = function () { this.WinAdButtonFun(); }; /*普通领取*/ MainPanel.prototype.SignNormalButtonFun = function () { this.SaveSignData(); if (this.SignTickImage.visible == true) { this.WinAdButtonFun(); } else { this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(Number(this.SignSelectedMoney) * 1); if (this.SignPiFu != null) { this.SignAddPifu(); } this.updateUserDataHandler(); SceneControl_1.SceneControl.IsShowSign = false; this.SignPanel.visible = false; ttad_1.ttad.Clear(); //;y.WxApi.ShowTxt("签到成功") } }; /**胜利界面广告按钮*/ MainPanel.prototype.WinAdButtonFun = function () { var _this = this; Sdk_1.WxApi.recordAldEvent("签到..."); if (!Laya.Browser.onMobile) { return; } ttad_1.ttad.ShowVideo(function (flag) { console.log("播放视频返回成功" + flag); if (flag) { console.log("播放视频返回"); _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(Number(_this.SignSelectedMoney) * 2); if (_this.SignPiFu != null) { _this.SignAddPifu(); } _this.SaveSignData(); //this.SaveSignData() _this.SignPanel.visible = false; SceneControl_1.SceneControl.IsShowSign = false; _this.updateUserDataHandler(); ttad_1.ttad.Clear(); } }); }; MainPanel.prototype.LoadSignData = function () { // this.SignInfo={"day":0,"time":0,"FisstLoad":0}; // Laya.LocalStorage.setJSON("PaoKuSign",this.SignInfo); this.SignInfo = Laya.LocalStorage.getJSON(this.PaoKuSign); if (this.SignInfo == 0 || this.SignInfo == null) { var time = this.getSystemTime(); this.SignInfo = { "day": 0, "time": 0, "FisstLoad": 0 }; Laya.LocalStorage.setJSON(this.PaoKuSign, this.SignInfo); } console.log("asdasd"); }; MainPanel.prototype.SaveSignData = function () { this.SignInfo["FisstLoad"] = 1; this.SignInfo["day"]++; this.SignInfo["time"] = this.getSystemTime(); Laya.LocalStorage.setJSON(this.PaoKuSign, this.SignInfo); }; MainPanel.prototype.getSystemTime = function () { var curDate = new Date(); var month = curDate.getMonth() + 1; console.log("月:" + month.toString()); var date = curDate.getDate(); console.log("日:" + date.toString()); return Number((month + "" + date)); }; MainPanel.prototype.SignAddPifu = function () { var cachedata = LocalDataControl_1.LocalDataControl.Instance.GetLocalCaCheData(UserDataInfo_1.UserDataInfo.skin); // var cachedata = CacheManager.getInstance().getCacheObj( UserCacheType.skin ); var id = this.SignPiFu["id"]; var _skinProxy = this.getProxy(AgencySkin_1.AgencySkin); var piFuVO = null; for (var index = 0; index < _skinProxy.pifuArr.length; index++) { piFuVO = _skinProxy.pifuArr[index]; if (piFuVO.roleCFG.id == id) { break; } } piFuVO.state = 1; AgencySkin_1.AgencySkin.instance.AddLocalSkinData(piFuVO.roleCFG.id, piFuVO.state, piFuVO.hasnum); DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.updateSKinView); console.log("获取皮肤"); console.log(cachedata); }; MainPanel.key = "MainPanel"; return MainPanel; }(PanelBaseControl_1.PanelBaseControl)); exports.MainPanel = MainPanel; },{"../Agency/AgencyInGame":2,"../Agency/AgencyLottery":4,"../Agency/AgencySkin":6,"../Agency/AgencyUserMessage":8,"../Config/AssetPath":15,"../Control/GameStateControl":21,"../Control/LocalDataControl":23,"../Control/PanelBaseControl":24,"../Control/SceneControl":29,"../Data/UserDataInfo":35,"../Data/UserInfoEvent":36,"../PrefabControl/PropManager":49,"../Push/TuijianView":57,"../View/ViewManager":70,"../WXSDK/PlayerAccount":75,"../WXSDK/Sdk":77,"../WXSDK/ttad":83,"../utils/DispatcherManager":85,"../utils/GameState":86}],68:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelBaseControl_1 = require("../Control/PanelBaseControl"); var ViewAction_1 = require("../utils/ViewAction"); var AgencySkin_1 = require("../Agency/AgencySkin"); var GameState_1 = require("../utils/GameState"); var UserInfoEvent_1 = require("../Data/UserInfoEvent"); var ResourceControl_1 = require("../Control/ResourceControl"); var AssetPath_1 = require("../Config/AssetPath"); var CharacterState_1 = require("../PrefabControl/CharacterState"); var ViewManager_1 = require("../View/ViewManager"); var CharacterPool_1 = require("../PrefabControl/CharacterPool"); var Player_1 = require("../Game/Player"); var SkinPanel = /** @class */ (function (_super) { __extends(SkinPanel, _super); function SkinPanel() { var _this = _super.call(this, "main", "skinview", false, ViewAction_1.ViewAction.ActionType_none, 0) || this; _this._isdestorys = false; _this._out = new Laya.Quaternion; return _this; } SkinPanel.prototype.initView = function () { this._isdestorys = false; this.c_title = this.getControllerByBame("c_title"); this.agencyskin = this.getProxy(AgencySkin_1.AgencySkin); this.list_0.setVirtual(); this.list_0.itemRenderer = Laya.Handler.create(this, this.itemlistrender, null, false); this.c_title.selectedIndex = 0; this.onchange(); //添加3D场景 this._ui3DScene = this.displayObject.addChildAt(new Laya.Scene3D(), 0); //添加照相机 this._uicarma3D = (this._ui3DScene.addChild(new Laya.Camera(0, 0.1, 80))); // this._uicarma3D.clearColor = null; this._uicarma3D.viewport = new Laya.Viewport(this.x, this.y, this.width, this.height); this._uicarma3D.transform.translate(new Laya.Vector3(0, 1.2, 5), false); // //添加方向光 // this._uilight = PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight; // this._uilight.color = new Laya.Vector3(0.6,0.6,0.6); // this._uilight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0)); this.updateroleHandler(); }; SkinPanel.prototype.initEvent = function () { this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun); this.AddEventByType(this.c_title, fairygui.Events.STATE_CHANGED, this, this.onchange); this.addDataEvent(GameState_1.GameState.updateSKinView, this, this.onchange); this.addDataEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid, this, this.updateroleHandler); }; SkinPanel.prototype.ClearCharacter = function () { if (this._rolemo) { var script = this._rolemo.getComponent(Player_1.Player); CharacterPool_1.CharacterPool.ClearCharacter(this._rolemo, script.resouseName, script); this._rolemo = null; } }; SkinPanel.prototype.onclosefun = function () { ViewManager_1.ViewManager.Instance.close(SkinPanel); }; SkinPanel.prototype.destory = function () { this._isdestorys = true; this.ClearCharacter(); if (this._uicarma3D) { this._uicarma3D.destroy(); this._uicarma3D = null; } if (this._ui3DScene) { this._ui3DScene.destroy(); this._ui3DScene = null; } _super.prototype.destory.call(this); }; SkinPanel.prototype.onchange = function () { if (this.c_title.selectedIndex == 0) { this.list_0.numItems = this.agencyskin.pifuArr.length; } else { this.list_0.numItems = 0; } }; SkinPanel.prototype.itemlistrender = function (index, item) { if (this.c_title.selectedIndex == 0) { if (index < this.agencyskin.pifuArr.length) { item.showData(this.agencyskin.pifuArr[index]); } } }; SkinPanel.prototype.updateroleHandler = function () { var RoleData = this.agencyskin.RoleData; this.ClearCharacter(); var pathArr = []; pathArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(RoleData.roleCfg.name) }); ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.loadcomplete, null, true, RoleData.roleCfg.name); }; SkinPanel.prototype.loadcomplete = function (resousename) { var RoleData = this.agencyskin.RoleData; if (!this._isdestorys && this._ui3DScene && resousename == RoleData.roleCfg.name) { this._rolemo = CharacterPool_1.CharacterPool.AddCharacter(resousename, Player_1.Player, this._ui3DScene); this._rolemo.transform.position = new Laya.Vector3(0, 2, 0); Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), -135 * 180 / Math.PI, this._out); this._rolemo.transform.rotation = this._out; this._rolemo.getComponent(Player_1.Player).PlayAnimator(CharacterState_1.CharacterState.stand); } }; SkinPanel.key = "SkinPanel"; return SkinPanel; }(PanelBaseControl_1.PanelBaseControl)); exports.SkinPanel = SkinPanel; },{"../Agency/AgencySkin":6,"../Config/AssetPath":15,"../Control/PanelBaseControl":24,"../Control/ResourceControl":28,"../Data/UserInfoEvent":36,"../Game/Player":40,"../PrefabControl/CharacterPool":45,"../PrefabControl/CharacterState":46,"../View/ViewManager":70,"../utils/GameState":86,"../utils/ViewAction":93}],69:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PanelBaseControl_1 = require("../Control/PanelBaseControl"); var ViewAction_1 = require("../utils/ViewAction"); var GameUtils_1 = require("../utils/GameUtils"); var AssetPath_1 = require("../Config/AssetPath"); var AgencyTrial_1 = require("../Agency/AgencyTrial"); var GuangGao_1 = require("../WXSDK/GuangGao"); var ttad_1 = require("../WXSDK/ttad"); var TrialPanel = /** @class */ (function (_super) { __extends(TrialPanel, _super); function TrialPanel(arr) { var _this = _super.call(this, "main", "shiyongView", false, ViewAction_1.ViewAction.ActionType_none, 1) || this; _this.skinarr = arr; return _this; } TrialPanel.prototype.onInit = function () { _super.prototype.onInit.call(this); }; TrialPanel.prototype.initView = function () { this.agencytrial = this.getProxy(AgencyTrial_1.AgencyTrial); var index = GameUtils_1.GameUtils.randRangeint(0, this.skinarr.length - 1); this._selectvo = this.skinarr[index]; this.load_icon.url = AssetPath_1.AssetPath.getroleicon(this._selectvo.roleCFG.icon); // pingtaiutils.Instance.createBanner( "ShiYongView" ); GuangGao_1.GuangGao.CheatBanner(this.btn_close); }; TrialPanel.prototype.initEvent = function () { this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun); this.AddEventByType(this.btn_video, Laya.Event.CLICK, this, this.videofun); }; TrialPanel.prototype.videofun = function () { // pingtaiutils.Instance.playVideo( "",this,this.videocallback ); this.videocallback(); }; TrialPanel.prototype.videocallback = function () { var _this = this; ttad_1.ttad.ShowVideo((function (isLoad) { if (isLoad) { _this.agencytrial.ExitPanel(_this._selectvo); } })); }; TrialPanel.prototype.onclosefun = function () { this.agencytrial.ExitPanel(null); }; TrialPanel.prototype.destory = function () { // GuangGao.Clear(); ttad_1.ttad.Clear(); _super.prototype.destory.call(this); }; TrialPanel.key = "TrialPanel"; return TrialPanel; }(PanelBaseControl_1.PanelBaseControl)); exports.TrialPanel = TrialPanel; },{"../Agency/AgencyTrial":7,"../Config/AssetPath":15,"../Control/PanelBaseControl":24,"../WXSDK/GuangGao":72,"../WXSDK/ttad":83,"../utils/GameUtils":87,"../utils/ViewAction":93}],70:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LayOUT_1 = require("../utils/LayOUT"); var LayoutControl_1 = require("../Control/LayoutControl"); /** * * @author * */ var ViewManager = /** @class */ (function (_super) { __extends(ViewManager, _super); function ViewManager() { var _this = _super.call(this) || this; ViewManager.ins = _this; return _this; } Object.defineProperty(ViewManager, "Instance", { get: function () { if (ViewManager.ins == null) { return new ViewManager(); } return ViewManager.ins; }, enumerable: true, configurable: true }); ViewManager.prototype.init = function () { this._views = {}; this.initEvent(); }; ViewManager.prototype.initEvent = function () { }; /** * view 视图对象类 * data 绑定数据 ( data 如果不为空,代表构造函数传参 ) * layer 层级 */ ViewManager.prototype.add = function (view, data, layer) { if (data === void 0) { data = null; } if (layer === void 0) { layer = LayOUT_1.LayOUT.UI; } if (view.key == null) { throw new Error("view have no key"); } var type = view.key; if (this._views[type]) { var itemview = this._views[type]; return itemview; } var d; if (data != null) { d = new view(data); } else { d = new view(); } d.viewKey = view; d.gameLayer = layer; LayoutControl_1.LayoutControl.Instance.AddLayerByName(d, layer); this._views[type] = d; return d; }; /** * 关闭界面 * @param view 界面 * @param isbgclose 是否是点击背景关闭的状态 * @param isplayAnmo 是否播放关闭动画( 主要用于强制关闭 ) */ ViewManager.prototype.close = function (view, isbgclose, isplayAnmo) { if (isbgclose === void 0) { isbgclose = false; } if (isplayAnmo === void 0) { isplayAnmo = true; } var type = view.key; var item = this._views[type]; if (!item) { return; } LayoutControl_1.LayoutControl.Instance.ClearLayerByName(item.gameLayer); if (isplayAnmo) { item.ExitView(); } else { item.destory(); } delete this._views[type]; }; ViewManager.prototype.onresize = function (w, h) { if (this._views != null) { var itemview; for (var item in this._views) { itemview = this._views[item]; itemview.setSize(w, h); } } }; ViewManager.prototype.getView = function (view) { var type = view.key; return this._views[type]; }; return ViewManager; }(Laya.EventDispatcher)); exports.ViewManager = ViewManager; },{"../Control/LayoutControl":22,"../utils/LayOUT":90}],71:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var RecommendView_1 = require("../Push/RecommendView"); var ViewManager_1 = require("../View/ViewManager"); var ChoutiPanView_1 = require("../Push/ChoutiPanView"); // import { Main } from "../Main"; // import ListItem from "../GameTools/ListItem"; // import { PanelManager, PanelType } from "../View/PanelManager"; // import GuangGao from "./GuangGao"; // import { WXSDK } from "./WXSDK"; var FYHD_Sdk = /** @class */ (function () { function FYHD_Sdk() { } //初始化sdk FYHD_Sdk.InitSdk = function () { Laya.Browser.window.sdk.getFyhd().startSdk(); FYHD_Sdk.UserInfoAuth(); // let white = Laya.LocalStorage.getItem("is_white"); // if(white){ // FYHD_Sdk.iswhite = true; // } // else{ // FYHD_Sdk.getWhiteConfig(); // } // let newuser = Laya.LocalStorage.getItem("is_newuser"); // if(!newuser){ // FYHD_Sdk.isnewuser = true; // Laya.LocalStorage.setItem("is_newuser","1"); // } // else{ // FYHD_Sdk.isnewuser = false; // } // FYHD_Sdk.PushData(); }; //用户授权 FYHD_Sdk.UserInfoAuth = function () { if (!Laya.Browser.onWeiXin) return; Laya.Browser.window.sdk.getFyhd().getFyhdUserInfo(null, false, function (data) { console.log("无授权回调:" + JSON.stringify(data)); if (data.result.user) { FYHD_Sdk.openid = data.result.user.openid; FYHD_Sdk.AuthInfo(); } }); }; FYHD_Sdk.AuthInfo = function () { var args = { openid: FYHD_Sdk.openid, }; Laya.Browser.window.sdk.getFyhd().loginData(args, function (data) { console.log("授权上报回调:" + JSON.stringify(data)); FYHD_Sdk.ValueUser(); }); }; FYHD_Sdk.ValueUser = function () { var args = { openid: FYHD_Sdk.openid, }; Laya.Browser.window.sdk.getFyhd().valueuser(args, function (data) { console.log("有效用户上报:" + JSON.stringify(data)); }); }; FYHD_Sdk.getWhiteConfig = function () { Laya.Browser.window.sdk.getFyhd().whiteConfig(function (e) { FYHD_Sdk.iswhite = e.data.is_white; if (FYHD_Sdk.iswhite) { Laya.LocalStorage.setItem("is_white", "1"); } console.log("白名单---", e); }); }; FYHD_Sdk.SetHuTuiList = function (list, scrol, type) { if (scrol === void 0) { scrol = 1; } if (type === void 0) { type = ""; } var arr = this.pushData; if (!arr || arr.length == 0) return; list.selectEnable = false; scrol == 1 ? list.vScrollBarSkin = "" : list.hScrollBarSkin = ""; list.renderHandler = Laya.Handler.create(this, this.updateItem, [type], false); list.array = arr; list.refresh(); }; FYHD_Sdk.updateItem = function (type, cell, index) { // var aditem = cell.getComponent(ListItem) as ListItem; // aditem.Refresh(type); }; //点击事件上报 FYHD_Sdk.ClickAd = function (ad_type) { console.log("上报类型---", ad_type); if (!Laya.Browser.onWeiXin) return; var param = { ad_type: ad_type, //此处添加openid openid: FYHD_Sdk.openid }; console.log("点击参数:" + param); Laya.Browser.window.sdk.getFyhd().advertisement(param, function (data) { console.log("点击结果:" + JSON.stringify(data)); }); }; //互推信息 FYHD_Sdk.PushData = function () { //console.log("pushdata--",Main.WX); if (!Laya.Browser.onWeiXin) return; var param = {}; Laya.Browser.window.sdk.getFyhd().shareRecommend(param, function (data) { console.log("热门游戏数据--", data); if (data.data) { FYHD_Sdk.pushData = data.data; FYHD_Sdk.pushData.sort(FYHD_Sdk.ListSort); FYHD_Sdk.isHaveDate = true; //此处派发事件,展示互推 //EventManager.event(FYHD_Sdk.ShowAd); } console.log("获取互推信息:" + JSON.stringify(FYHD_Sdk.pushData)); new RecommendView_1.Recommend(); }); }; FYHD_Sdk.ShowHuTuiJump = function (data, open) { if (!Laya.Browser.onWeiXin) return; if (data.jump_type == 2) //二维码跳转方法 { Laya.Browser.window.wx.previewImage({ current: data.qrcode, urls: [data.qrcode] }); } else if (data.jump_type == 1) //直跳方法 { Laya.Browser.window.wx.navigateToMiniProgram({ appId: data.to_appid, path: data.jump_path, success: function (res) { // 打开成功 console.log("上报成功:" + JSON.stringify(res)); FYHD_Sdk.PushClick(data.to_appid); }, fail: function (res) { if (open) { ViewManager_1.ViewManager.Instance.add(ChoutiPanView_1.default); } } }); } else if (data.jump_type == 0) //平台跳转方法 { Laya.Browser.window.wx.navigateToMiniProgram({ appId: data.platform_appid, path: data.jump_path, success: function (res) { // 打开成功 console.log("上报成功:" + JSON.stringify(res)); FYHD_Sdk.PushClick(data.to_appid); }, fail: function (res) { if (open) { ViewManager_1.ViewManager.Instance.add(ChoutiPanView_1.default); } } }); } }; //互推点击 FYHD_Sdk.PushClick = function (to_appid) { if (!Laya.Browser.onWeiXin) return; var param = { openid: FYHD_Sdk.openid, to_appid: to_appid, }; Laya.Browser.window.sdk.getFyhd().sharePlay(param, function (data) { console.log("点击上报结果:" + JSON.stringify(data)); }); }; FYHD_Sdk.ListSort = function (a, b) { if (Number(a["panel"]) < Number(b["panel"])) { return -1; } if (Number(a["panel"]) == Number(b["panel"])) { return 0; } if (Number(a["panel"]) > Number(b["panel"])) { return 1; } }; FYHD_Sdk.Ad_ClickType = { Video: "video_click", Watch: "watch", Share: "share", Banner: "banner", Push: "push", PushClick: "icon_click" }; FYHD_Sdk.pushData = []; FYHD_Sdk.isHaveDate = false; FYHD_Sdk.ShowAd = "ShowAd"; return FYHD_Sdk; }()); exports.FYHD_Sdk = FYHD_Sdk; },{"../Push/ChoutiPanView":51,"../Push/RecommendView":55,"../View/ViewManager":70}],72:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PlayerAccount_1 = require("./PlayerAccount"); var ttad_1 = require("./ttad"); var WxGameItem = /** @class */ (function () { function WxGameItem() { this.appNameHidden = false; this.color = "C93B3BFF"; this.size = 100; this.borderWidth = 50; this.borderColor = "A1A0A0FF"; } return WxGameItem; }()); exports.WxGameItem = WxGameItem; var GuangGao = /** @class */ (function () { function GuangGao() { this.isVideoLoadCom = false; } Object.defineProperty(GuangGao, "hasbanner", { get: function () { if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.banner) { return true; } else { return false; } }, enumerable: true, configurable: true }); Object.defineProperty(GuangGao, "hasvideo", { get: function () { if (Laya.Browser.onWeiXin && PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video) { var videonum = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetGlobe; return true; } else { return false; } }, enumerable: true, configurable: true }); //预先加载视屏广告 GuangGao.InitVideo = function () { var _this = this; if (!Laya.Browser.onWeiXin || !PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video) return; console.log(this.bannerAdUnitId); //vedio this.fsaasfafssfa = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: this.videlAdUnitId }); this.fsaasfafssfa.onLoad(function () { console.log('激励视频 广告加载成功'); _this.asfasfsaffsa = true; }); this.fsaasfafssfa.onError(function (err) { console.log("激励视屏加载失败:" + err); _this.asfasfsaffsa = false; }); this.afsfsaafsfsa = true; }; //看视频 GuangGao.ShowVideo = function (callback) { var _this = this; if (this.hasvideo) { if (this.asfasfsaffsa) { console.log("showVideoAd:" + this.asfasfsaffsa); this.SetVideoCallBack(callback); this.fsaasfafssfa.show().catch(function (err) { _this.fsaasfafssfa.load().then(function () { _this.SetVideoCallBack(callback); _this.fsaasfafssfa.show(); }); }); } else { // ShareUtil.shareImage("视频没有分享", callback // , "1"); } } else { callback(false); // ShareUtil.shareImage("视频没有分享", callback // , "1"); } }; GuangGao.SetVideoCallBack = function (callback) { var _this = this; this.fsaasfafssfa.offClose(); this.fsaasfafssfa.onClose(function (res) { console.log("激励视频关闭:" + res.isEnded); if (res && res.isEnded || res === undefined) { callback && callback(true); } else { callback && callback(false); } _this.fsaasfafssfa.offClose(); }); }; //打开banner GuangGao.OpenBanner = function (gap, callVack, iswait) { // if (!this.hasbanner) // { // callVack(null); // return; // } var _this = this; if (gap === void 0) { gap = 0; } if (callVack === void 0) { callVack = null; } if (iswait === void 0) { iswait = false; } if (!Laya.Browser.onWeiXin) { callVack(null); return; } this.canshowbanner = true; var idd = this.bannerAdUnitId; console.log("adUnitId:" + idd); var newBanner = Laya.Browser.window.wx.createBannerAd({ adUnitId: idd, style: { left: 0, top: 0, width: 460 } }); newBanner.onError(function (err) { console.log(err); callVack(null); }); newBanner.onLoad(function () { if (_this.curbanner) _this.curbanner.destroy(); _this.curbanner = newBanner; var hight = _this.GetRealHight(gap); if (callVack != null) { callVack(hight); } if (_this.canshowbanner && !iswait) { _this.curbanner.show(); } else { _this.curbanner.hide(); } }); }; GuangGao.GetRealHight = function (gap) { if (this.curbanner) { var info = Laya.Browser.window.wx.getSystemInfoSync(); this.curbanner.style.width = info.windowWidth; this.curbanner.style.top = info.windowHeight - this.curbanner.style.realHeight - gap; return Laya.stage.height / info.windowHeight * this.curbanner.style.realHeight; } }; //clear GuangGao.Clear = function () { GuangGao.clearTween(); Laya.timer.clearAll(this); Laya.Tween.clearAll(this); this.canshowbanner = false; if (this.curbanner) this.curbanner.hide(); // if (!Laya.Browser.onWeiXin) return; // if (this.curbanner) this.curbanner.hide(); }; GuangGao.hidebanner = function () { if (!Laya.Browser.onWeiXin) return; if (this.curbanner) this.curbanner.hide(); }; GuangGao.showbanner = function () { if (!Laya.Browser.onWeiXin) return; if (this.curbanner) this.curbanner.show(); }; Object.defineProperty(GuangGao, "cancheat", { get: function () { if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.cheat) { return true; } else { return false; } // if(!PlayerAccount.CurrentAccount.CurAccountData.cheat) // { // console.log("cheat:false-> CurAccountData.cheat != 1"); // return false; // } // var checkscence = PlayerAccount.CurrentAccount.CurAccountData.checkscence; // if (checkscence == false) // { // console.log("cheat:true-> " + WxApi.sceneValue); // return true; // } // if (WxApi.sceneValue == "1037" || WxApi.sceneValue == "1058"|| WxApi.sceneValue == "1067" || WxApi.sceneValue == "1095") // { // console.log("cheat:true-> " + WxApi.sceneValue); // return true; // } // console.log("cheat:false-> " + WxApi.sceneValue); // return false; }, enumerable: true, configurable: true }); GuangGao.SetPosBanner = function (btn, complete) { var _this = this; if (Laya.Browser.onPC) { complete(false); return; } var info = Laya.Browser.window.wx.getSystemInfoSync(); //console.log(info); //console.log(btn); //console.log(btn.y,Laya.stage.height,info.windowHeight); var reshight = btn.y * info.windowHeight / Laya.stage.height; //console.log("reshight",reshight); var idd = this.bannerAdUnitId; console.log("adUnitId:" + idd); if (this.curbanner) this.curbanner.destroy(); var newBanner = Laya.Browser.window.wx.createBannerAd({ adUnitId: idd, style: { left: 0, top: 0, width: 720 } }); newBanner.onError(function (err) { console.log(err); complete(false); }); newBanner.onLoad(function () { _this.curbanner = newBanner; _this.curbanner.style.top = reshight; //console.log("top",this.asgagassga.style.top); if (_this.curbanner) { console.log("banner show"); _this.curbanner.show(); Laya.timer.once(2300, _this, function () { _this.curbanner.style.top = info.windowHeight - GuangGao.bannerhigt; complete(true); }); } }); newBanner.onResize(function (res) { GuangGao.bannerhigt = res.height; _this.curbanner.style.width = info.windowWidth; _this.curbanner.style.top = reshight; }); }; //按钮误导 GuangGao.CheatBanner = function (btn, complete, gap) { if (complete === void 0) { complete = null; } if (gap === void 0) { gap = 0; } ttad_1.ttad.Showbanner(); // if(!GuangGao.cancheat) // { // console.log("ignorecheat"); // GuangGao.OpenBanner(0,(height) => // { // if(height == null) // { // } // }); // } // else // { // btn.y = Laya.stage.height-btn.height - 100; // GuangGao.OpenBanner(gap,(height) => // { // if(height == null) // { // } // else // { // console.log("cheatstart","bottom:100"); // // btn.mouseEnabled = false; // var end=Laya.stage.height-height-btn.height - 80; // console.log("y:" + end); // Laya.timer.once(PlayerAccount.CurrentAccount.CurAccountData.cheattime*1000,this,()=> // { // // btn.mouseEnabled = true; // this.showbanner(); // GuangGao.clearTween(); // GuangGao.tween = Laya.Tween.to(btn,{y:end},200,null,Laya.Handler.create(this,()=> // { // if(complete != null) // { // complete(); // } // })) // }) // } // },true); // } }; GuangGao.clearTween = function () { if (GuangGao.tween) { GuangGao.tween.clear(); GuangGao.tween = null; } }; GuangGao.prototype.loadVideo = function (cb) { var _this = this; if (!Laya.Browser.onWeiXin) { if (cb) cb(true); return; } ; this._onLoadVideo = cb; if (!this._rewardedVideoAd) { var index = GuangGao.videlAdUnitId; this._rewardedVideoAd = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: index }); var isc = false; this._rewardedVideoAd.onLoad(function () { console.log("[LOG] 激励视频广告加载成功"); _this.isVideoLoadCom = true; if (isc) return; isc = true; _this._onLoadVideo && _this._onLoadVideo(true); _this._onLoadVideo = null; }); this._rewardedVideoAd.onError(function (err) { console.log("[LOG] 激励视频广告加载失败"); console.log(err); _this.isVideoLoadCom = false; _this._onLoadVideo && _this._onLoadVideo(false); _this._onLoadVideo = null; }); this._rewardedVideoAd.onClose(function (res) { if (!res || res.isEnded) { _this._onVideoClose && _this._onVideoClose(true); _this._onVideoClose = null; } else { _this._onVideoClose && _this._onVideoClose(false); _this._onVideoClose = null; } }); } else { if (this.isVideoLoadCom) { this._onLoadVideo && this._onLoadVideo(true); this._onLoadVideo = null; } else { this._onLoadVideo && this._onLoadVideo(false); this._onLoadVideo = null; } } }; GuangGao.prototype.showVideo = function (cb) { var _this = this; if (!Laya.Browser.onWeiXin) { if (cb) cb(true); return; } ; this._onVideoClose = cb; this._rewardedVideoAd.show().catch(function (err) { _this._rewardedVideoAd.load().then(function () { _this._rewardedVideoAd.show(); }); }); }; GuangGao.videlAdUnitId = "adunit-0c687084c908ee89"; GuangGao.bannerAdUnitId = "adunit-8c2d586135fa6d4f"; GuangGao.afsfsaafsfsa = false; //视屏广告是否加载成功 GuangGao.asfasfsaffsa = false; GuangGao.canshowbanner = true; GuangGao.bannerhigt = 0; return GuangGao; }()); exports.GuangGao = GuangGao; },{"./PlayerAccount":75,"./ttad":83}],73:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Event = Laya.Event; var HttpRequest = Laya.HttpRequest; var PlayerAccount_1 = require("./PlayerAccount"); var Sdk_1 = require("./Sdk"); var TimesTamper_1 = require("../Time/TimesTamper"); var Global_1 = require("../Global"); // const PROTOCOL_URL:string = "https://pipelineapi.xwxgame.com/"; var PROTOCOL_URL = "https://parkourracetoutiao2api.xwxgame.com/"; var PROTOCOLS = /** @class */ (function () { function PROTOCOLS() { } PROTOCOLS.Login = "user/login"; // not token PROTOCOLS.game = "game/start"; PROTOCOLS.end = "game/play"; PROTOCOLS.Sign = "sign/sign"; // public static EquipHero = "theme/equipHero"; // public static BuyHero = "theme/buyHero"; // public static EquipHat = "theme/equipHat"; // public static BuyHat = "theme/buyHat"; // public static BuyDance = "theme/buyDance"; // public static EquipDance = "theme/equipDance"; PROTOCOLS.Buy = "theme/buy"; PROTOCOLS.Equip = "theme/equip"; PROTOCOLS.share = "fission/share"; PROTOCOLS.vd = "fission/vd"; PROTOCOLS.revival = "game/revival"; PROTOCOLS.fission = "theme/fission"; PROTOCOLS.themefission = "theme/fission"; PROTOCOLS.treasure = "treasure/click"; PROTOCOLS.Config = "config/table"; PROTOCOLS.Lottery = "lottery/lottery"; PROTOCOLS.GetAchieve = "achievement/getRewards"; PROTOCOLS.usersync = "user/sync"; return PROTOCOLS; }()); exports.PROTOCOLS = PROTOCOLS; ; var NetworkManager = /** @class */ (function () { function NetworkManager() { NetworkManager.instance = this; } Object.defineProperty(NetworkManager, "Instance", { get: function () { if (NetworkManager.instance) { return NetworkManager.instance; } else { return new NetworkManager(); } }, enumerable: true, configurable: true }); //#region 登入 /******************************* login *****************************/ NetworkManager.prototype.login = function (progresscb, completecb, errorcb) { var userInfor = PlayerAccount_1.PlayerAccount.CurrentAccount; var ver = Global_1.Global.gameVersion; var args = "code=" + userInfor.Code + "&nickname=" + userInfor.NickName + "&avatar=" + userInfor.Avatar + "&gender=" + userInfor.Gender + "&country=" + userInfor.Country + "&province=" + userInfor.Province + "&city=" + userInfor.City + "& device=" + userInfor.Device + "$&share_id=" + userInfor.ShareId + "&scene=" + userInfor.Scene + "&v=" + ver; var httpRequest = new HttpRequest(); httpRequest.once(Event.PROGRESS, this, this.onHttpRequestProgress, [progresscb, httpRequest]); httpRequest.once(Event.COMPLETE, this, this.onLoginRequestComplete, [completecb, httpRequest]); httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]); httpRequest.send(PROTOCOL_URL + PROTOCOLS.Login, args, "post", "text"); }; NetworkManager.prototype.onHttpRequestProgress = function (progresscb, httpRequest) { if (progresscb) { console.log("HttpRequestProgress:..."); progresscb.run(); } }; NetworkManager.prototype.onLoginRequestComplete = function (completecb, httpRequest) { //console.log("登录数据:", httpRequest.data); var data = JSON.parse(httpRequest.data); if (data["code"] != "0") { console.log("登录异常错误!错误信息:", httpRequest.data); Sdk_1.WxApi.recordAldEvent("登录异常错误!错误信息:= " + data["code"], "httpRequest.dat"); //completecb.runWith(data); return; } PlayerAccount_1.PlayerAccount.ServerTime = data["t"]; TimesTamper_1.TimesTamper.Instance.updateServiceTime(Number(data["t"])); Sdk_1.WxApi.recordAldEvent("登录正式成功"); PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, completecb); // ShareUtil.ShareMessage(); }; NetworkManager.prototype.onHttpRequestError = function (errorcb, httpRequest) { if (errorcb != null) { errorcb.runWith(httpRequest); } Sdk_1.WxApi.recordAldEvent("Error! Http request error.. ", "httpRequest.dat"); Sdk_1.WxApi.ShowLoading("连接网络失败..."); Laya.timer.once(8000, this, function () { Sdk_1.WxApi.HideLoading(); }); console.log("Error! Http request error..." + httpRequest.data); }; //#endregion /* * 通用Http Post协议发送 * protocol 对应“PROTOCOLS”字典中协议名称 * hasToken 是否使用token,目前只有login协议不需要token,其他都需要token,所以此处自动组合 * param 参数列表,key是字段名,val是值,值需要先转string * completecb 协议发送成功回调函数 * errorcb 协议发送失败回调函数 * return 返回值为void */ NetworkManager.prototype.HttpPostRequest = function (protocol, param, completecb, errorcb, hasToken) { if (hasToken === void 0) { hasToken = true; } var args = ""; var url = PROTOCOL_URL + protocol; // chechk add token var account = PlayerAccount_1.PlayerAccount.CurrentAccount; var accountdata = account.CurAccountData; if (hasToken == true) { args = "token=" + accountdata.m_token + "&"; } Sdk_1.WxApi.ShowLoading("连接网络中..."); if (protocol == PROTOCOLS.game || protocol == PROTOCOLS.end || protocol == PROTOCOLS.fission || protocol == PROTOCOLS.vd || protocol == PROTOCOLS.themefission || protocol == PROTOCOLS.Lottery || protocol == PROTOCOLS.usersync) { var str = "abcdefghijkimnopqrstuvwxyz0123456789"; var code = "{"; var mask = ""; for (var i = 0; i < 4; i++) { mask += str[Math.floor(Math.random() * 100) % str.length]; } for (var i = 0; i < param.length; i++) { for (var key in param[i]) { code += "\"" + key + "\":\"" + param[i][key] + "\""; } if (i < param.length - 1) { code += ","; } else { code += "}"; } } args += "_r=" + mask + this.base64Encode(code); } else { if (param != null) { for (var i = 0; i < param.length; i++) { for (var key in param[i]) { var val = param[i][key]; args += key + "=" + val; if (i < param.length - 1) { args += "&"; } } } } } var httpRequest = new HttpRequest(); httpRequest.once(Event.COMPLETE, this, this.onHttpRequestComplete, [completecb, errorcb, httpRequest]); httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]); httpRequest.send(url, args, "post", "text"); }; NetworkManager.prototype.onHttpRequestComplete = function (succeedcb, failurecb, httpRequest) { Sdk_1.WxApi.HideLoading(); var data = JSON.parse(httpRequest.data); if (data["code"] == 0) { PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, null); if (succeedcb != null) { succeedcb.runWith(data); } } else { if (failurecb != null) { failurecb.runWith(data); } console.log("Error! Http request complete error, code: " + data["code"] + " message: " + data["message"]); } }; NetworkManager.prototype.base64Encode = function (str) { var c1, c2, c3; var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var i = 0, len = str.length, string = ''; while (i < len) { c1 = str.charCodeAt(i++) & 0xff; if (i == len) { string += base64EncodeChars.charAt(c1 >> 2); string += base64EncodeChars.charAt((c1 & 0x3) << 4); string += "=="; break; } c2 = str.charCodeAt(i++); if (i == len) { string += base64EncodeChars.charAt(c1 >> 2); string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)); string += base64EncodeChars.charAt((c2 & 0xF) << 2); string += "="; break; } c3 = str.charCodeAt(i++); string += base64EncodeChars.charAt(c1 >> 2); string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)); string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6)); string += base64EncodeChars.charAt(c3 & 0x3F); } return string; }; return NetworkManager; }()); exports.NetworkManager = NetworkManager; },{"../Global":41,"../Time/TimesTamper":60,"./PlayerAccount":75,"./Sdk":77}],74:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PlatfromType = /** @class */ (function () { function PlatfromType() { } /** * 电脑 */ PlatfromType.pc = "pc"; /** * 微信小游戏 */ PlatfromType.wx = "wx"; /** * qq小游戏 */ PlatfromType.qq = "qq"; /** * 抖音 */ PlatfromType.tt = "tt"; return PlatfromType; }()); exports.PlatfromType = PlatfromType; },{}],75:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Sdk_1 = require("../WXSDK/Sdk"); var GameUtils_1 = require("../utils/GameUtils"); var NetworkManager_1 = require("./NetworkManager"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var UserInfoEvent_1 = require("../Data/UserInfoEvent"); var requiretype; (function (requiretype) { requiretype[requiretype["\u7CFB\u7EDF\u8D60\u9001"] = 1] = "\u7CFB\u7EDF\u8D60\u9001"; requiretype[requiretype["\u91D1\u5E01\u8D2D\u4E70"] = 2] = "\u91D1\u5E01\u8D2D\u4E70"; requiretype[requiretype["\u89C2\u770B\u89C6\u9891"] = 3] = "\u89C2\u770B\u89C6\u9891"; requiretype[requiretype["\u5206\u4EAB"] = 4] = "\u5206\u4EAB"; requiretype[requiretype["\u7B7E\u5230"] = 5] = "\u7B7E\u5230"; requiretype[requiretype["\u6D3B\u52A8"] = 6] = "\u6D3B\u52A8"; requiretype[requiretype["\u901A\u8FC7\u5173\u5361"] = 7] = "\u901A\u8FC7\u5173\u5361"; requiretype[requiretype["\u7D2F\u8BA1\u767B\u9646"] = 8] = "\u7D2F\u8BA1\u767B\u9646"; requiretype[requiretype["\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230"] = 9] = "\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230"; requiretype[requiretype["\u7816\u77F3\u8D2D\u4E70"] = 10] = "\u7816\u77F3\u8D2D\u4E70"; })(requiretype = exports.requiretype || (exports.requiretype = {})); var AccountConfig; (function (AccountConfig) { AccountConfig[AccountConfig["crop"] = 0] = "crop"; AccountConfig[AccountConfig["things"] = 1] = "things"; AccountConfig[AccountConfig["land"] = 2] = "land"; AccountConfig[AccountConfig["global"] = 3] = "global"; AccountConfig[AccountConfig["entity"] = 4] = "entity"; AccountConfig[AccountConfig["sign"] = 5] = "sign"; AccountConfig[AccountConfig["rewards"] = 6] = "rewards"; AccountConfig[AccountConfig["achievement"] = 7] = "achievement"; AccountConfig[AccountConfig["invite"] = 8] = "invite"; AccountConfig[AccountConfig["mission"] = 9] = "mission"; AccountConfig[AccountConfig["treasure_click"] = 10] = "treasure_click"; AccountConfig[AccountConfig["theme"] = 11] = "theme"; AccountConfig[AccountConfig["lottery"] = 12] = "lottery"; })(AccountConfig = exports.AccountConfig || (exports.AccountConfig = {})); var AccountUser; (function (AccountUser) { AccountUser[AccountUser["money"] = 0] = "money"; AccountUser[AccountUser["diamond"] = 1] = "diamond"; AccountUser[AccountUser["user_id"] = 2] = "user_id"; AccountUser[AccountUser["game_times"] = 3] = "game_times"; AccountUser[AccountUser["get_themes"] = 4] = "get_themes"; AccountUser[AccountUser["video_times"] = 5] = "video_times"; AccountUser[AccountUser["equip_themes"] = 6] = "equip_themes"; AccountUser[AccountUser["last_action_time"] = 7] = "last_action_time"; AccountUser[AccountUser["last_favorite_time"] = 8] = "last_favorite_time"; AccountUser[AccountUser["progress_themes"] = 9] = "progress_themes"; AccountUser[AccountUser["revival"] = 10] = "revival"; AccountUser[AccountUser["stage"] = 11] = "stage"; AccountUser[AccountUser["vmoney"] = 12] = "vmoney"; })(AccountUser = exports.AccountUser || (exports.AccountUser = {})); var heroAttr; (function (heroAttr) { heroAttr[heroAttr["id"] = 0] = "id"; heroAttr[heroAttr["name"] = 1] = "name"; heroAttr[heroAttr["quality"] = 2] = "quality"; heroAttr[heroAttr["icon"] = 3] = "icon"; heroAttr[heroAttr["prefab"] = 4] = "prefab"; heroAttr[heroAttr["require_num"] = 5] = "require_num"; heroAttr[heroAttr["require_type"] = 6] = "require_type"; })(heroAttr = exports.heroAttr || (exports.heroAttr = {})); var signdata; (function (signdata) { signdata[signdata["sign_days"] = 0] = "sign_days"; signdata[signdata["sign_time"] = 1] = "sign_time"; })(signdata = exports.signdata || (exports.signdata = {})); var entity; (function (entity) { entity[entity["id"] = 0] = "id"; entity[entity["name"] = 1] = "name"; entity[entity["entity_id"] = 2] = "entity_id"; entity[entity["icon"] = 3] = "icon"; })(entity = exports.entity || (exports.entity = {})); var skinattr; (function (skinattr) { skinattr[skinattr["effectValue_1"] = 0] = "effectValue_1"; skinattr[skinattr["effectValue_2"] = 1] = "effectValue_2"; skinattr[skinattr["effectValue_3"] = 2] = "effectValue_3"; skinattr[skinattr["effectValue_4"] = 3] = "effectValue_4"; })(skinattr = exports.skinattr || (exports.skinattr = {})); var AccountData = /** @class */ (function () { function AccountData(_token, _config, _appSetting, _user, _userbase, _useInvite, _user_stage, _user_sign, _user_achievement, _lottery, _use_land_task, _user_video) { if (_useInvite === void 0) { _useInvite = null; } if (_user_stage === void 0) { _user_stage = null; } this.openid = ""; this.userId = ""; this.roadconfig = {}; this.m_RewardDic = {}; this.m_EntityDic = {}; this.m_AchievementDic = {}; this.m_token = _token; this.m_app_setting = _appSetting; this.m_user = _user; this.m_user_base = _userbase; this.m_sign = _user_sign; this.m_task = _user_achievement; this.lottery = _lottery; this.m_use_land_task = _use_land_task; this.m_user_video = _user_video; this.userId = this.m_user["user_id"]; this.openid = this.m_user_base["openid"]; console.log("user_id:" + this.userId); //console.log("open_id:"+this.openid); } Object.defineProperty(AccountData.prototype, "DieDistance", { // public m_skinDic:Dictionary = new Dictionary(); //获取玩家落入空中死亡距离 get: function () { return Number(this.m_app_setting["DieDistance"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "HitEgg", { //获取开局砸蛋几率 get: function () { return Number(this.m_app_setting["HitEgg"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "EndCheat", { //获取结算后砸蛋出现几率 get: function () { return Number(this.m_app_setting["EndCheat"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "CheatReward", { //获取误触奖励金币数 get: function () { return Number(this.m_app_setting["CheatReward"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "WhiteUser", { //白名单用户 get: function () { return this.m_app_setting["WhiteUser"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "StrategySwitch", { //签到功能是否开启 get: function () { return this.m_app_setting["StrategySwitch"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "ShowSign", { //签到功能是否开启 get: function () { return this.m_app_setting["ShowSign"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "Choose", { //自动勾选 get: function () { return this.m_app_setting["choose"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "ShowBattleBtn", { //发起挑战按钮开关 get: function () { return this.m_app_setting["ShowBattleBtn"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "lotterytime", { get: function () { return Number(this.lottery["day_video_times"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "share", { get: function () { return this.m_app_setting["share"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "sharecontent", { get: function () { return this.m_app_setting["sharecontent"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "ShareImage", { get: function () { return this.m_app_setting["ShareImage"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "cheattime", { get: function () { return Number(this.m_app_setting["cheattime"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "banner", { get: function () { return this.m_app_setting["banner"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "video", { get: function () { return this.m_app_setting["video"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "BtnCanMove", { get: function () { return this.m_app_setting["BtnCanMove"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "checkscence", { get: function () { return this.m_app_setting["checkscence"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "banner_dis", { get: function () { return Number(this.m_app_setting["banner_dis"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "bannerMoveTime", { get: function () { return Number(this.m_app_setting["bannerMoveTime"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "createBannerTimes", { get: function () { return Number(this.m_app_setting["createBannerTimes"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "bannerMoveProp", { get: function () { return Number(this.m_app_setting["bannerMoveProp"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "isShareThenVideo", { get: function () { return this.m_app_setting["isShareThenVideo"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "isShowHuiTui", { get: function () { return this.m_app_setting["isShowHuiTui"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "start_sprint", { get: function () { return Number(this.m_app_setting["start_sprint"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "IsVideoModel", { get: function () { return this.m_app_setting["IsVideoModel"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "videoModelNum", { get: function () { return Number(this.m_app_setting["videoModelNum"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "VideoModelTitle", { get: function () { return this.m_app_setting["VideoModelTitle"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "failcount", { get: function () { return Number(this.m_app_setting["failcount"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "spminspeed", { get: function () { return Number(this.m_app_setting["spminspeed"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "bgm", { get: function () { return this.m_app_setting["bgm"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "camerahight", { get: function () { return Number(this.m_app_setting["camerahight"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "ctnfilename", { get: function () { return this.m_app_setting["ctnfilename"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "cheat", { get: function () { return this.m_app_setting["cheat"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "shakestage", { get: function () { return this.m_app_setting["shakestage"] && this.m_app_setting["shakestage"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "stageconfigcdn", { get: function () { return this.m_app_setting["stageconfigcdn"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "playerspeed", { get: function () { return Number(this.m_app_setting["playerspeed"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "videlAdUnitId", { get: function () { return this.m_app_setting["videlAdUnitId"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "bannerAdUnitId", { get: function () { return this.m_app_setting["bannerAdUnitId"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "tri", { get: function () { return this.m_app_setting["tri"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "recommend", { get: function () { return this.m_app_setting["recommend"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "recommendflg", { get: function () { return this.m_app_setting["recommendflg"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "egg", { get: function () { return this.m_app_setting["egg"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "eggrate", { get: function () { return Number(this.m_app_setting["eggrate"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "UseId", { get: function () { return this.userId; }, enumerable: true, configurable: true }); AccountData.prototype.GetConfig = function (_type) { var type = AccountConfig[_type]; return this.m_configs[type]; }; AccountData.prototype.GetUser = function (_type) { var type = AccountUser[_type]; return this.m_user[type]; }; Object.defineProperty(AccountData.prototype, "GetVideoTotal", { get: function () { return Number(this.m_user_video["total"]); }, enumerable: true, configurable: true }); AccountData.prototype.GetSign = function (_datatype) { var type = signdata[_datatype]; return this.m_sign[type]; }; AccountData.prototype.GetRewardConfig = function (_rewardid) { var reward = this.m_RewardDic[_rewardid]; return reward; }; AccountData.prototype.GetEntity = function (_id, attr) { if (!this.m_EntityDic[_id]) return null; return this.m_EntityDic[_id][entity[attr]]; }; AccountData.prototype.GetRewardDic = function () { var config = this.GetConfig(AccountConfig.rewards); for (var key in config) { this.m_RewardDic[config[key].id] = config[key]; } }; AccountData.prototype.GetEntityDic = function () { var config = this.GetConfig(AccountConfig.entity); for (var key in config) { this.m_EntityDic[config[key].entity_id] = config[key]; } }; AccountData.prototype.GetThemeById = function (_id) { var data = this.GetConfig(AccountConfig.theme); if (data) { for (var index = 0; index < data.length; index++) { var element = data[index]; if (element.id == _id) { return element; } } } }; AccountData.prototype.GetSkinAttr = function (_id) { var config = this.GetConfig(AccountConfig.theme); for (var i = 0; i < config.length; i++) { if (config[i].id == _id) { return config[i]; } } }; AccountData.prototype.GetAchievementData = function () { var data = this.GetConfig(AccountConfig.achievement); var dic = {}; for (var key1 in data) { var type1 = data[key1].type; //var obj = {}; if (dic[type1]) { continue; } var array = []; for (var key2 in data) { var type2 = data[key2].type; if (type1 == type2) { array.push(data[key2]); } } dic[type1] = array; } this.m_AchievementDic = dic; }; AccountData.prototype.HasTheme = function (_id) { var has = false; var getthemes = this.GetUser(AccountUser.get_themes); for (var i = 0; i < getthemes.length; i++) { if (getthemes[i] == _id) { has = true; } } return has; }; AccountData.prototype.GetSkinDic = function (_config) { }; AccountData.prototype.GetHeroProgress = function (_id) { var config = this.m_user["progress_heroes"]; var progress = config[_id] ? config[_id] : 0; return progress; }; AccountData.prototype.GetHatProgress = function (_id) { var config = this.m_user["progress_hats"]; var progress = config[_id] ? config[_id] : 0; return progress; }; AccountData.prototype.GetCbProgress = function (_id) { var config = this.m_user["progress_dances"]; var progress = config[_id] ? config[_id] : 0; return progress; }; AccountData.prototype.HasMotor = function (_id) { var data = this.GetUser(AccountUser.get_themes); for (var i = 0; i < data.length; i++) { var hd = data[i]; if (_id == hd) { return true; } } return false; }; //获取皮肤的进度 AccountData.prototype.GetMotorProgress = function (_id) { var config = this.m_user["progress_themes"]; var progress = config[_id] ? config[_id] : 0; return progress; }; AccountData.prototype.GetSeverConfig = function (_config) { this.m_configs = _config; this.GetSkinDic(this.m_configs); this.GetRewardDic(); this.GetEntityDic(); // this.GetAchievementData(); var _globe = _config["global"]; for (var index = 0; index < _globe.length; index++) { var element = _globe[index]; if (element.key == "tilirec") { PlayerAccount.CurrentAccount.tilirec = Number(element.value); return; } } }; AccountData.prototype.UpdateSkinDic = function () { this.GetSkinDic(this.m_configs); }; AccountData.prototype.GetGlobe = function (_key) { var globe = this.GetConfig(AccountConfig.global); for (var key in globe) { var obj = globe[key]; var kkk = obj["key"]; if (kkk == _key) { var value = obj["value"]; return value; } } return null; }; return AccountData; }()); exports.AccountData = AccountData; var PlayerAccount = /** @class */ (function () { function PlayerAccount(_code, _nickname, _avatar, _gender, _country, _province, _city, _device, _shareid, _scence, _ver) { this.IsTest = false; this.localTime = Laya.timer.currTimer; this.Code = _code; this.NickName = _nickname; this.Avatar = _avatar; this.Gender = _gender; this.Country = _country; this.Province = _province; this.City = _city; this.Device = _device; this.ShareId = _shareid; this.Scene = _scence; this.ver = _ver; this.IsTest = false; PlayerAccount.instance = this; } Object.defineProperty(PlayerAccount, "CurrentAccount", { get: function () { if (PlayerAccount.instance == null) { console.log("生成本地测试账号..."); return PlayerAccount.TestAccount; } return PlayerAccount.instance; }, enumerable: true, configurable: true }); Object.defineProperty(PlayerAccount, "TestAccount", { get: function () { var code = Laya.LocalStorage.getItem("localcode"); if (!code) { var time = new Date().getTime().toString(); var random = GameUtils_1.GameUtils.randRangeint(10000, 99999).toString(); code = "xj_" + time + random; Laya.LocalStorage.setItem("localcode", code); console.log(time, random); console.log("新用户", code); } else { console.log("老用户", code); } var curaccount = new PlayerAccount(code, null, null, null, null, null, null, null, null, null, null); curaccount.IsTest = true; return curaccount; }, enumerable: true, configurable: true }); PlayerAccount.prototype.SetAccountData = function (data, completecb) { var _this = this; var token = data["token"]; var configs = data["configs"]; var app_setting = data["app_setting"]; var user = data["user"]; var user_base = data["user_base"]; var user_sign = data["user_sign"]; var user_achievement = data["user_achievement"]; var user_lottery = data["user_lottery"]; var user_land_task = data["user_land_task"]; var user_video = data["user_video"]; if (this.CurAccountData == null) { Sdk_1.WxApi.recordAldEvent("开始获取config数据"); this.CurAccountData = new AccountData(token, configs, app_setting, user, user_base, null, null, user_sign, user_achievement, user_lottery, user_land_task, user_video); this.CheckLocalConfig(data.table_version, function (_config) { _this.CurAccountData.GetSeverConfig(_config); _this.nowConfig = _config; if (completecb != null) { completecb.runWith(data); } }); } else { if (configs) { this.CurAccountData.m_configs = configs; } if (app_setting) { this.CurAccountData.m_app_setting = app_setting; } if (user) { this.CurAccountData.m_user = user; } if (user_base) { this.CurAccountData.m_user_base = user_base; } if (user_sign) { this.CurAccountData.m_sign = user_sign; } if (user_achievement) { this.CurAccountData.m_task = user_achievement; } if (user_lottery) { this.CurAccountData.lottery = user_lottery; } if (user_land_task) { this.CurAccountData.m_use_land_task = user_land_task; } if (user_video) { this.CurAccountData.m_user_video = user_video; } } DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.updatePlayerInfo); }; PlayerAccount.prototype.CheckLocalConfig = function (_ver, cb) { var curconfig = Laya.LocalStorage.getJSON(PlayerAccount.localcofigkey); if (curconfig) { //Laya.LocalStorage.removeItem(PlayerAccount.localcofigkey); if (curconfig.ver == _ver) { console.log("sever配置是最新的...", _ver); Sdk_1.WxApi.recordAldEvent("config接口获取成功"); cb(curconfig); } else { NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) { data.configs.ver = _ver; Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs); console.log("sever配置更新完成...", _ver); Sdk_1.WxApi.recordAldEvent("config接口获取成功"); cb(data.configs); }), Laya.Handler.create(this, function (data) { console.log("配置获取失败" + data); Sdk_1.WxApi.recordAldEvent("config接口获取失败"); })); } } else { NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) { data.configs.ver = _ver; Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs); console.log("sever保存配置完成...", _ver); Sdk_1.WxApi.recordAldEvent("config接口获取成功"); cb(data.configs); }), Laya.Handler.create(this, function (data) { console.log("配置获取失败" + data); Sdk_1.WxApi.recordAldEvent("config接口获取失败"); })); } }; Object.defineProperty(PlayerAccount.prototype, "ServerTime", { get: function () { var time = Laya.timer.currTimer; var stime = PlayerAccount.ServerTime + Math.ceil((time - this.localTime) / 1000); return stime; }, enumerable: true, configurable: true }); PlayerAccount.localcofigkey = "mconfig"; return PlayerAccount; }()); exports.PlayerAccount = PlayerAccount; },{"../Data/UserInfoEvent":36,"../WXSDK/Sdk":77,"../utils/DispatcherManager":85,"../utils/GameUtils":87,"./NetworkManager":73}],76:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var RecordManager = /** @class */ (function () { function RecordManager() { RecordManager.instance = this; console.log("new record"); } Object.defineProperty(RecordManager, "Instance", { get: function () { if (RecordManager.instance) { return RecordManager.instance; } else { var curmanager = new RecordManager(); curmanager.OnNew(); return curmanager; } }, enumerable: true, configurable: true }); RecordManager.prototype.RecordStart = function () { if (!Laya.Browser.onMobile) return; console.log("RecordStart"); this.record.start({ duration: 60, }); }; RecordManager.prototype.RecordStop = function () { if (!Laya.Browser.onMobile) return; console.log("RecordStop"); this.record.stop(); }; RecordManager.prototype.ShareVideo = function (_cb) { if (!Laya.Browser.onMobile) return; Laya.Browser.window.tt.shareAppMessage({ channel: "video", query: "", templateId: "266q4fgb8al7i3e7ie", title: "赢得了我,认你做大哥又如何", desc: "赢得了我,认你做大哥又如何", extra: { videoPath: this.completepath, videoTopics: ["赢得了我,认你做大哥又如何"] }, success: function () { _cb && _cb(true); console.log("分享视频成功"); }, fail: function (e) { _cb && _cb(false); console.log("分享视频失败"); } }); }; RecordManager.prototype.OnNew = function () { var _this = this; if (!Laya.Browser.onMobile) return; this.record = Laya.Browser.window.tt.getGameRecorderManager(); this.record.onStart(function (res) { // 录屏开始 console.log(res); }); this.record.onStop(function (res) { _this.completepath = res.videoPath; console.log(res.videoPath); }); }; return RecordManager; }()); exports.RecordManager = RecordManager; },{}],77:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var systemtype; (function (systemtype) { systemtype[systemtype["ios"] = 0] = "ios"; systemtype[systemtype["android"] = 1] = "android"; systemtype[systemtype["other"] = 2] = "other"; })(systemtype = exports.systemtype || (exports.systemtype = {})); var WxApi = /** @class */ (function () { function WxApi() { } WxApi.recordAldEvent = function (key, value) { if (value === void 0) { value = ""; } // if(Laya.Browser.window && Laya.Browser.window.wx) // { // Laya.Browser.window.wx.aldSendEvent(key,{key:value}); // } console.log("事件: ", key); }; WxApi.WXLogin = function (cb) { var that = this; Laya.Browser.window.wx.login({ success: function (res) { if (res.code) { console.log("code:", res.code); cb(res); } else { console.log('获取用户登录态失败!' + res.errMsg); } }, fail: function (res) { console.log("wx.login: failed, res=" + res); } }); }; WxApi.WxInit = function () { var _this = this; if (!Laya.Browser.onWeiXin) return; Laya.Browser.window.wx.showShareMenu({ withShareTicket: true }); Laya.Browser.window.wx.onShow(function (option) { console.log(option); _this.shareOpenId = option.query.userId; _this.querychannel = option.query.channel; if (option.referrerInfo) { _this.referrerInfoappId = option.referrerInfo.appId; console.log("onShow appId is:", option.referrerInfo.appId); } _this.sceneValue = option.scene; var scene = Laya.LocalStorage.getItem("scene"); if (scene) { _this.sceneValue = scene; console.log("读取配置场景值:" + scene); } else { console.log("第一次拉取场景值:" + _this.sceneValue); Laya.LocalStorage.setItem("scene", _this.sceneValue); } }); }; WxApi.ShowLoading = function (title) { if (title === void 0) { title = "加载中..."; } // if (this.isShowing) return; // this.isShowing = true; // (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.showLoading({ title: title, mask: true }); }; WxApi.HideLoading = function () { // this.isShowing = false; // (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.hideLoading(); }; WxApi.aldSendOpenid = function (_openid) { // if(Laya.Browser.onMiniGame) // { // console.log("aldSendOpenid",_openid); // Laya.Browser.window.wx.aldSendOpenid(_openid); // } }; //检测更新 WxApi.CheckWXUpdate = function () { var updateManager = Laya.Browser.window.tt.getUpdateManager(); updateManager.onCheckForUpdate(function (res) { console.log("最新版本:" + res.hasUpdate); }); updateManager.onUpdateReady(function () { Laya.Browser.window.tt.showModal({ showCancel: false, title: '更新提示', content: '新版本已经准备好,是否重启应用?', success: function (res) { updateManager.applyUpdate(); }, fail: function (res) { updateManager.applyUpdate(); } }); }); }; WxApi.levelStart = function (stageId, stageName, userId) { // console.log("开始记录关卡:" + stageId); // if (Laya.Browser.window && Laya.Browser.window.wx) { // Laya.Browser.window.wx.aldStage.onStart( // { // stageId: stageId, //关卡ID 该字段必传 // stageName: stageName, //关卡名称 该字段必传 // userId: userId //用户ID 可选 // } // ); // if(WxApi.newaccount) // { // Laya.Browser.window.wx.aldStage.onStart( // { // stageId: "新用户:" + stageId, //关卡ID 该字段必传 // stageName: stageName, //关卡名称 该字段必传 // userId: userId //用户ID 可选 // } // ); // } // } }; WxApi.levelRunning = function (stageId, stageName, userId, userevive) { console.log("记录关卡中:" + stageId); // if(Laya.Browser.window && Laya.Browser.window.wx) // { // Laya.Browser.window.wx.aldStage.onRunning({ // stageId : stageId, //关卡ID 该字段必传 // stageName : stageName, //关卡名称 该字段必传 // userId : userId, //用户ID 可选 // event : "revive", //使用道具 关卡进行中,用户触发的操作 该字段必传 // params : { // itemName : "使用复活",//使用道具名称 该字段必传 // itemCount : 1, //使用道具数量 可选 // desc : userevive //使用道具描述 // } // }); // if(WxApi.newaccount) // { // Laya.Browser.window.wx.aldStage.onRunning({ // stageId :"新用户:" + stageId, //关卡ID 该字段必传 // stageName : stageName, //关卡名称 该字段必传 // userId : userId, //用户ID 可选 // event : "revive", //使用道具 关卡进行中,用户触发的操作 该字段必传 // params : { // itemName : "使用复活",//使用道具名称 该字段必传 // itemCount : 1, //使用道具数量 可选 // desc : userevive //使用道具描述 // } // }) // } // } }; WxApi.levelSuccess = function (stageId, stageName, userId) { console.log("记录关卡:完成" + stageId); // if (Laya.Browser.window && Laya.Browser.window.wx) { // Laya.Browser.window.wx.aldStage.onEnd( // { // stageId: stageId, //关卡ID 该字段必传 // stageName: stageName, //关卡名称 该字段必传 // userId: userId, //用户ID 可选 // event: "complete", //关卡完成 关卡进行中,用户触发的操作 该字段必传 // params: // { // desc: "关卡完成" //描述 // } // } // ); // if(WxApi.newaccount) // { // Laya.Browser.window.wx.aldStage.onEnd( // { // stageId:"新用户:" + stageId, //关卡ID 该字段必传 // stageName: stageName, //关卡名称 该字段必传 // userId: userId, //用户ID 可选 // event: "complete", //关卡完成 关卡进行中,用户触发的操作 该字段必传 // params: // { // desc: "关卡完成" //描述 // } // } // ); // } // } }; WxApi.levelFail = function (stageId, stageName, userId, score, carname) { console.log("记录关卡:失败" + stageId); // if (Laya.Browser.window && Laya.Browser.window.wx) { // Laya.Browser.window.wx.aldStage.onEnd( // { // stageId: stageId, //关卡ID 该字段必传 // stageName: stageName, //关卡名称 该字段必传 // userId: userId, //用户ID 可选 // event: "fail", //关卡完成 关卡进行中,用户触发的操作 该字段必传 // params: // { // desc: "失败", // score: score,//描述 // car: carname//描述 // } // } // ); // if(WxApi.newaccount) // { // Laya.Browser.window.wx.aldStage.onEnd( // { // stageId:"新用户:" + stageId, //关卡ID 该字段必传 // stageName: stageName, //关卡名称 该字段必传 // userId: userId, //用户ID 可选 // event: "fail", //关卡完成 关卡进行中,用户触发的操作 该字段必传 // params: // { // desc: "失败", // score: score,//描述 // car: carname//描述 // } // } // ); // } // } }; WxApi.OnShow = function (cb) { if (!Laya.Browser.window.tt) return; Laya.Browser.window.tt.onShow(cb); }; WxApi.OffShow = function (cb) { if (!Laya.Browser.onWeiXin) return; Laya.Browser.window.tt.offShow(cb); }; WxApi.shake = function () { Laya.Browser.window.tt.vibrateShort({}); }; WxApi.shakeLong = function () { Laya.Browser.window.tt.vibrateLong({}); }; WxApi.Shake = function (_short) { if (_short === void 0) { _short = true; } if (Laya.Browser.window.tt && WxApi.CanShake) { if (_short) { this.shake(); } else { this.shakeLong(); } } if (!_short) { this.stageShake(); } }; WxApi.stageShake = function (callBack, speed) { if (callBack === void 0) { callBack = null; } if (speed === void 0) { speed = 32; } if (this.isShake || !this.canshakestage) return; this.isShake = true; var point = new Laya.Vector2(Laya.stage.x, Laya.stage.y); Laya.stage.timerLoop(speed, this, this.shakeObject, [point, callBack]); }; WxApi.shakeObject = function (_point, _callBack) { var count = (this.num++) % 4; this.offsetArr[this.num % 2] = count < 2 ? 0 : this.offset; Laya.stage.x = this.offsetArr[0] + _point.x; Laya.stage.y = this.offsetArr[1] + _point.y; if (this.num > (this.times * 4 + 1)) { Laya.stage.clearTimer(this, this.shakeObject); Laya.stage.pos(0, 0); this.num = 0; this.isShake = false; if (_callBack != null) { _callBack(); } } }; WxApi.ShowTxt = function (text) { if (Laya.Browser.window.tt) { Laya.Browser.window.tt.showToast({ title: text }); } else { console.log(text); } }; Object.defineProperty(WxApi, "SystemFrom", { get: function () { if (!Laya.Browser.onWeiXin) return systemtype.other; var info = Laya.Browser.window.wx.getSystemInfoSync(); var system = info.system; var IOS = system.indexOf("iOS") != -1; var Android = system.indexOf("Android") != -1; if (IOS) { return systemtype.ios; } else if (Android) { return systemtype.android; } else { return systemtype.other; } }, enumerable: true, configurable: true }); Object.defineProperty(WxApi, "IsLongScreenSystem", { get: function () { if (!Laya.Browser.onWeiXin) return false; var systemInfo = Laya.Browser.window.wx.getSystemInfoSync(); var platformModel = "ipx"; if (systemInfo != null) { var model = systemInfo.model; platformModel = systemInfo.brand + "_" + model + "_" + systemInfo.system + "_wx" + systemInfo.version + "_SDKVer" + systemInfo.SDKVersion; console.log("platformModel:" + platformModel); return !(model.indexOf("X") < 0) || ((model.indexOf("oppo") >= 0 || model.indexOf("OPPO") >= 0) && (model.indexOf("R15") >= 0 || model.indexOf("r15") >= 0)) || systemInfo.statusBarHeight > 20 || (model.indexOf("Note") >= 0 && (model.indexOf("7") >= 0 || model.indexOf("8") >= 0)) || ((model.indexOf("iPhone") >= 0) && (model.indexOf("11") >= 0)); } }, enumerable: true, configurable: true }); WxApi.writeStage = function (stage) { var kvDataList = new Array(); var date = new Date().getTime(); var myValue = JSON.stringify({ "wxgame": { "stage": stage, "update_time": date.toString(), } }); kvDataList.push({ key: "stage", value: myValue }); if (Laya.Browser.window.wx) { Laya.Browser.window.wx.setUserCloudStorage({ KVDataList: kvDataList, success: function (r) { console.log("上传分数成功"); } }); } }; WxApi.cpVersionGreaterOrEqual = function (v1, v2) { console.log("[LOG]\u57FA\u7840\u5E93\u7248\u672C\u53F7 curVer:" + v1 + " targVer:" + v2); var v1Arr = v1.split("."); var v2Arr = v2.split("."); var len = v1Arr.length; if (v2Arr.length < len) { len = v2Arr.length; } for (var i = 0; i < len; i++) { var ver1 = Number(v1Arr[i]); var ver2 = Number(v2Arr[i]); if (ver1 > ver2) { return true; } else if (ver1 < ver2) { return false; } } return v1Arr.length >= v2Arr.length; }; WxApi.newaccount = false; WxApi.sceneValue = ""; WxApi.shareOpenId = ""; WxApi.querychannel = ""; WxApi.referrerInfoappId = ""; //显示加载信息 WxApi.isShowing = false; WxApi.CanShake = true; WxApi.times = 1.3; WxApi.num = 0; WxApi.offsetArr = [0, 0]; WxApi.offset = 14; WxApi.canshakestage = false; return WxApi; }()); exports.WxApi = WxApi; },{}],78:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var DispatcherManager_1 = require("../utils/DispatcherManager"); var SocketNofify_1 = require("../WXSDK/SocketNofify"); var ServerSocket = /** @class */ (function () { /** * socket连接中 */ function ServerSocket() { /** * 1:自动断线,2:主动断线 */ this._offlinestate = 0; /** * 断线重连次数 */ this._connetNums = 0; this._socketconneting = false; ServerSocket.ins = this; } Object.defineProperty(ServerSocket, "Instance", { get: function () { if (ServerSocket.ins == null) { return new ServerSocket(); } return ServerSocket.ins; }, enumerable: true, configurable: true }); //连接服务器 ServerSocket.prototype.connectServer = function (gameHost) { this._socketconneting = true; this.removeSocket(); if (!this.sock || !this.sock.connected) { this.openwaitpanel(); if (!this.sock) { this.sock = new Laya.Socket(); this.sock.on(Laya.Event.OPEN, this, this.onSocketOpen); this.sock.on(Laya.Event.MESSAGE, this, this.onReceiveMessage); this.sock.on(Laya.Event.CLOSE, this, this.onSocketClose); this.sock.on(Laya.Event.ERROR, this, this.ioErro); } this.sock.connectByUrl(gameHost); } }; ServerSocket.prototype.isConnect = function () { if (this.sock && this.sock.connected) { return true; } return false; }; ServerSocket.prototype.ioErro = function (e) { if (e === void 0) { e = null; } this._socketconneting = false; this._connetNums++; this.closewaitpanel(); this.removeSocket(); this._offlinestate = 1; }; ServerSocket.prototype.removeSocket = function () { this._socketconneting = false; if (this.sock) { this.sock.off(Laya.Event.OPEN, this, this.onSocketOpen); this.sock.off(Laya.Event.MESSAGE, this, this.onReceiveMessage); this.sock.off(Laya.Event.CLOSE, this, this.onSocketClose); this.sock.off(Laya.Event.ERROR, this, this.ioErro); this.sock.cleanSocket(); this.sock.close(); this.sock = null; } }; /** * 手动关闭游戏socket */ ServerSocket.prototype.colseSocket = function (offlinestate) { if (offlinestate === void 0) { offlinestate = 1; } if (this.isConnect()) { this.closewaitpanel(); this.removeSocket(); if (offlinestate != -1) { this._offlinestate = offlinestate; } DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CLOSE); } }; ServerSocket.prototype.onSocketClose = function (e) { if (e === void 0) { e = null; } this._socketconneting = false; this.closewaitpanel(); this._offlinestate = 1; DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CLOSE); }; ServerSocket.prototype.closewaitpanel = function () { fairygui.GRoot.inst.closeModalWait(); }; ServerSocket.prototype.openwaitpanel = function () { fairygui.GRoot.inst.showModalWait(); }; //连接成功返回 ServerSocket.prototype.onSocketOpen = function (event) { if (event === void 0) { event = null; } this._connetNums = 0; this.closewaitpanel(); this._offlinestate = 0; DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CONNECT_SUCCEED, null, false); }; //向服务端发送消息 ServerSocket.prototype.sendMessage = function (act, data, isShowWait) { if (isShowWait === void 0) { isShowWait = true; } if (this.sock && this.sock.connected) { if (isShowWait) { this.openwaitpanel(); } if (!data) { data = {}; } data.ACTION = act; this.sock.send(JSON.stringify(data)); } else { } }; //消息返回后,会广播出去 //Global.addEventListener("你发送的cmd名称",监听方法,this) ServerSocket.prototype.onReceiveMessage = function (msg) { if (msg === void 0) { msg = null; } var socketdata = JSON.parse(msg); }; return ServerSocket; }()); exports.ServerSocket = ServerSocket; },{"../WXSDK/SocketNofify":79,"../utils/DispatcherManager":85}],79:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var SocketNofify = /** @class */ (function () { function SocketNofify() { } /** * socket连接成功 */ SocketNofify.SOCKET_CONNECT_SUCCEED = "SOCKET_CONNECT_SUCCEED"; /** * socket关闭 */ SocketNofify.SOCKET_CLOSE = "SOCKET_CLOSE"; /** * 游戏重新连接 */ SocketNofify.Game_againConnetSocket = "Game_againConnetSocket"; return SocketNofify; }()); exports.SocketNofify = SocketNofify; },{}],80:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var WECHATEVENT = /** @class */ (function () { function WECHATEVENT() { } /** * 游戏进入后台事件 */ WECHATEVENT.WECHATEVENT_onhide = "WECHATEVENT_onhide"; WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd = "WECHATEVENT_onAudioInterruptionEnd"; WECHATEVENT.WECHATEVENT_losefocus = "WECHATEVENT_losefocus"; WECHATEVENT.WECHATEVENT_getfocus = "WECHATEVENT_getfocus"; WECHATEVENT.WECHATEVENT_updateVideoNums = "WECHATEVENT_updateVideoNums"; /** * 用户打点 */ WECHATEVENT.message_9891002 = "9891002"; /** * 获取后台数据 */ WECHATEVENT.message_9891101 = "9891101"; WECHATEVENT.WECHATEVENT_loginSucceed = "WECHATEVENT_loginSucceed"; /** * 游戏从后台恢复显示事件 */ WECHATEVENT.WECHATEVENT_onshow = "WECHATEVENT_onshow"; /** * 从收藏或者浮窗进入游戏 */ WECHATEVENT.WECHATEVENT_fromscorfk = "WECHATEVENT_fromscorfk"; /** * 登录 */ WECHATEVENT.message_9891001 = "9891001"; /** * 广告点击 */ WECHATEVENT.message_9891102 = "9891102"; /** * 点击确定跳转到外部游戏 */ WECHATEVENT.message_9891103 = "9891103"; return WECHATEVENT; }()); exports.WECHATEVENT = WECHATEVENT; },{}],81:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GameUtils_1 = require("../utils/GameUtils"); var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT"); var Global_1 = require("../Global"); var DateControl_1 = require("../Control/DateControl"); var LocalDataControl_1 = require("../Control/LocalDataControl"); var UserDataInfo_1 = require("../Data/UserDataInfo"); var GlobalTip_1 = require("../utils/GlobalTip"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var AudioControl_1 = require("../Control/AudioControl"); /* * name; */ var WXGamePlatform = /** @class */ (function () { function WXGamePlatform() { this.isShareing = false; this.bannerRunTime = 0; this._bannerTypeList = []; this._screenwidth = 0; this.bannerheight = 0; this.bannerwidth = 0; this.isonResize = false; /** * 排行榜打开类型存储 */ this._openrankDict = {}; WXGamePlatform.ins = this; } Object.defineProperty(WXGamePlatform, "Instance", { get: function () { if (WXGamePlatform.ins == null) { return new WXGamePlatform(); } return WXGamePlatform.ins; }, enumerable: true, configurable: true }); WXGamePlatform.prototype.init = function () { this.showShareMenu({ withShareTicket: true }); this.onAudioInterruptionBegin(); this.onAudioInterruptionEnd(); }; WXGamePlatform.prototype.initShareDian = function (data) { if (data && data.length > 0) { var itemd; for (var s in data) { itemd = data[s]; WXGamePlatform.ShareDict[itemd.key] = itemd; } var firstd = data[0]; this.onShareAppMessage(firstd.tile, Global_1.Global.cdnurl + firstd.img); } }; WXGamePlatform.prototype.initData = function () { if (DateControl_1.DateControl.Fresh) { WXGamePlatform.dayShareNum = 0; WXGamePlatform.dayVideoNum = 0; this.updateDayShareInfo(); this.updateDayVideoInfo(); } else { WXGamePlatform.dayShareNum = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.nowdayShare); WXGamePlatform.dayVideoNum = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.nowdayVideo); } }; /** * 存储当天分享的信息 */ WXGamePlatform.prototype.updateDayShareInfo = function () { LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.nowdayShare, WXGamePlatform.dayShareNum.toString()); }; WXGamePlatform.prototype.updateDayVideoInfo = function () { LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.nowdayVideo, WXGamePlatform.dayVideoNum.toString()); }; WXGamePlatform.prototype.createUserAndLogin = function (callobj, succeedcallback, progressCallback, failcallback) { if (progressCallback === void 0) { progressCallback = null; } if (failcallback === void 0) { failcallback = null; } WXGamePlatform.loginCallobj = callobj; WXGamePlatform.loginsucceedcallback = succeedcallback; WXGamePlatform.loginprogressCallback = progressCallback; var wx = Laya.Browser.window.wx; if (wx) { var login_info = WXGamePlatform.Instance.getLaunchOptionsSync(); if (login_info) { var query = login_info.query; if (query && query.ChanID) { WXGamePlatform.QuDaoID = query.ChanID; } var referrerInfo = login_info.referrerInfo; if (WXGamePlatform.QuDaoID == "" && referrerInfo && referrerInfo.appId) { WXGamePlatform.QuDaoID = referrerInfo.appId; } if (login_info.scene) { WXGamePlatform.fromscene = Number(login_info.scene); } } var systemres = wx.getSystemInfoSync(); var version = systemres.SDKVersion; if (wx.getUpdateManager) { var updateManager = wx.getUpdateManager(); updateManager.onCheckForUpdate(function (res) { // 请求完新版本信息的回调 if (res.hasUpdate == true) { updateManager.onUpdateReady(function () { Laya.Browser.window.wx.showModal({ title: '更新提示', content: '新版本已经准备好,是否重启应用?', success: function (res) { if (res.confirm) { // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 updateManager.applyUpdate(); } else { WXGamePlatform.Instance.exitGame(); } } }); }); updateManager.onUpdateFailed(function () { // 新版本下载失败 WXGamePlatform.Instance.exitGame(); }); } else { // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback ) // { // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 ); // } var wxplatform = WXGamePlatform.Instance; wxplatform.login(callobj, succeedcallback, failcallback); } }); } else { // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback ) // { // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 ); // } var wxplatform = WXGamePlatform.Instance; wxplatform.login(callobj, succeedcallback, failcallback); } } }; WXGamePlatform.prototype.createUserInfoButton = function (callobj, callback, failcallback) { this.userinfocallobj = callobj; this.userinfosuccallback = callback; this.userinfofailcallback = failcallback; var wx = Laya.Browser.window.wx; var res = wx.getSystemInfoSync(); if (res) { var posx = (res.windowWidth - 151) / 2; var posy = res.windowHeight - 172 - 40; WXGamePlatform.Instance.userinfobutton = wx.createUserInfoButton({ type: 'image', image: 'wxlocal/login.png', style: { left: posx, top: posy, width: 151, height: 72 } }); WXGamePlatform.Instance.userinfobutton.onTap(WXGamePlatform.Instance.userinfoButtonClick); } }; /** * 判断是否已经授权 */ WXGamePlatform.prototype.getaccredit = function (callobj, accreditCallback) { if (WXGamePlatform.accreditstate == 0) { var wx = Laya.Browser.window.wx; if (wx) { wx.getSetting({ success: function (res) { var itemd = res.authSetting; if (itemd.hasOwnProperty("scope.userInfo") && itemd["scope.userInfo"] == true) //已经授权过 { if (accreditCallback && callobj) { accreditCallback.call(callobj, true); } } else { if (accreditCallback && callobj) { accreditCallback.call(callobj, false); } } } }); } else { if (accreditCallback && callobj) { accreditCallback.call(callobj, true); } } } else { if (accreditCallback && callobj) { accreditCallback.call(callobj, true); } } }; WXGamePlatform.prototype.userinfoButtonClick = function (res) { var wxplatform = WXGamePlatform.Instance; if (res) { var errMsg = res.errMsg; if (errMsg == "getUserInfo:ok") { WXGamePlatform.accreditstate = 1; wxplatform.closeuserinfobUtton(); wxplatform.getUserInfo(false, wxplatform.userinfocallobj, wxplatform.userinfosuccallback, wxplatform.userinfofailcallback); } else { if (wxplatform.userinfocallobj && wxplatform.userinfofailcallback) { wxplatform.userinfofailcallback.call(wxplatform.userinfocallobj); } } } }; WXGamePlatform.prototype.closeuserinfobUtton = function () { var wxplatform = WXGamePlatform.Instance; if (wxplatform.userinfobutton) { wxplatform.userinfobutton.offTap(wxplatform.userinfoButtonClick); wxplatform.userinfobutton.destroy(); wxplatform.userinfobutton = null; } }; WXGamePlatform.prototype.getUserInfo = function (islogin, callobj, callback, failcallback) { fairygui.GRoot.inst.showModalWait(); var wxplatform = WXGamePlatform.Instance; var wx = Laya.Browser.window.wx; if (wx) { wx.getUserInfo({ success: function (res) { var userInfo = res.userInfo; WXGamePlatform.nickName = userInfo.nickName; if (islogin) { wxplatform.login(callobj, callback, failcallback); } else { if (callobj && callback) { callback.call(callobj, WXGamePlatform.nickName); } } } }); } }; /** * 登录 * @param callobj * @param succeedcallback * @param failCallback */ WXGamePlatform.prototype.login = function (callobj, callback, failcallback) { var wxplatform = WXGamePlatform.Instance; if (Laya.Browser.window.wx) { Laya.Browser.window.wx.login({ success: function (res) { WXGamePlatform.code = res.code; var itemd = {}; if (WXGamePlatform.QuDaoID != "") { itemd.ChanID = WXGamePlatform.QuDaoID; } itemd.Code = WXGamePlatform.code; itemd.AppID = Global_1.Global.appid; itemd.Version = Global_1.Global.gameVersion; }, fail: function (res) { wxplatform.login(callobj, callback, failcallback); } }); } }; WXGamePlatform.prototype.loginSucceedCallback = function (data) { if (WXGamePlatform.loginCallobj && WXGamePlatform.loginsucceedcallback) { WXGamePlatform.loginsucceedcallback.call(WXGamePlatform.loginCallobj, data); } }; WXGamePlatform.prototype.loadSubpackage = function (name, subcallobj, subcallback, updatecallback, subfailcallback) { if (Laya.Browser.window.wx) { this._subcallobj = subcallobj; this._subcallback = subcallback; this._updatecallback = updatecallback; this._subfailcallback = subfailcallback; var wx = Laya.Browser.window.wx; if (wx.loadSubpackage) { var loadTask = wx.loadSubpackage({ name: name, success: function (res) { // 分包加载成功后通过 success 回调 var wxgamePlatform = WXGamePlatform.Instance; if (wxgamePlatform._subcallback && wxgamePlatform._subcallobj) { wxgamePlatform._subcallback.call(wxgamePlatform._subcallobj); } }, fail: function (res) { // 分包加载失败通过 fail 回调 var wxgamePlatform = WXGamePlatform.Instance; if (wxgamePlatform._subfailcallback && wxgamePlatform._subcallobj) { wxgamePlatform._subfailcallback.call(wxgamePlatform._subcallobj); } } }); if (loadTask.onProgressUpdate) { loadTask.onProgressUpdate(function (res) { var wxgamePlatform = WXGamePlatform.Instance; if (wxgamePlatform._updatecallback && wxgamePlatform._subcallobj) { wxgamePlatform._updatecallback.call(wxgamePlatform._subcallobj, res.progress); } }); } } else { if (subcallobj && subcallback) { subcallback.call(subcallobj); } } } else { if (subcallobj && subcallback) { subcallback.call(subcallobj); } } }; /** * 获取转发详细信息 * @param obj * @param callobj * @param succeedcallback * @param failCallback */ WXGamePlatform.prototype.getShareInfo = function (obj, callobj, succeedcallback, failCallback) { if (failCallback === void 0) { failCallback = null; } if (Laya.Browser.window.wx) { Laya.Browser.window.wx.getShareInfo({ shareTicket: obj.shareTicket, success: function (res) { succeedcallback.call(callobj, res); } }); } }; /** * 监听用户点击右上角菜单的“转发”按钮时触发的事件 * @param title * @param imageUrl */ WXGamePlatform.prototype.onShareAppMessage = function (title, imageUrl) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.onShareAppMessage(function () { return { title: title, imageUrl: imageUrl }; }); } }; /** * 主动拉起转发,进入选择通讯录界面。 * @param title * @param imageUrl */ WXGamePlatform.prototype.shareAppMessage = function (d) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.shareAppMessage(d); } }; /** * 显示当前页面的转发按钮 * @param obj */ WXGamePlatform.prototype.showShareMenu = function (obj) { if (obj === void 0) { obj = null; } if (Laya.Browser.window.wx) { Laya.Browser.window.wx.showShareMenu(obj); } }; /** * 更新转发属性 * @param obj */ WXGamePlatform.prototype.updateShareMenu = function (obj) { if (obj === void 0) { obj = null; } if (Laya.Browser.window.wx) { Laya.Browser.window.wx.updateShareMenu(obj); } }; /** * 显示当前页面的转发按钮 */ WXGamePlatform.prototype.showMenu = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.showShareMenu(); } }; /** * 本地存储 * @param key * @param data */ WXGamePlatform.prototype.setStorageSync = function (key, data) { var wx = Laya.Browser.window.wx; if (wx) { wx.setStorageSync(key, data); } }; /** * 获取本地存储 * @param key */ WXGamePlatform.prototype.getStorageSync = function (key) { var wx = Laya.Browser.window.wx; if (wx) { return wx.getStorageSync(key); } return null; }; WXGamePlatform.prototype.setUserCloudStorage = function (obj, callobj, succeedcallback, failCallback) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (failCallback === void 0) { failCallback = null; } var wx = Laya.Browser.window.wx; if (wx && wx.setUserCloudStorage) { wx.setUserCloudStorage({ KVDataList: obj, success: function (res) { if (succeedcallback) { succeedcallback.call(callobj, res); } }, fail: function (res) { if (failCallback) { failCallback.call(callobj); } } }); } }; /** * 显示消息提示框 * @param word */ WXGamePlatform.prototype.toast = function (word) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.showToast({ title: word }); } }; /** * 向开放数据域发送消息 * @param obj */ WXGamePlatform.prototype.postMessage = function (str, data) { if (data === void 0) { data = null; } var wx = Laya.Browser.window.wx; if (wx) { var context = wx.getOpenDataContext(); context.postMessage({ action: str, data: data }); } }; /** * 创建一个 InnerAudioContext 实例 */ WXGamePlatform.prototype.createInnerAudioContext = function () { if (Laya.Browser.window.wx) { return Laya.Browser.window.wx.createInnerAudioContext(); } return null; }; /** * 获取系统信息 */ WXGamePlatform.prototype.getSystemInfoSync = function () { if (Laya.Browser.window.wx) { return Laya.Browser.window.wx.getSystemInfoSync(); } return null; }; /** * 预览图片,调用之后会在新打开的页面中全屏预览传入的图片,预览的过程中用户可以进行保存图片、发送给朋友等操作 * @param obj */ WXGamePlatform.prototype.previewImage = function (obj) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.previewImage(obj); } }; /** * 监听小游戏隐藏到后台事件。锁屏、按 HOME 键退到桌面、显示在聊天顶部等操作会触发此事件。 * @param callobj * @param succeedcallback */ WXGamePlatform.prototype.onHide = function (callobj, succeedcallback) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.onHide(function (res) { WXGamePlatform.isShowing = false; if (succeedcallback && callobj) { succeedcallback.call(callobj, res); } }); } }; /** * 返回小程序启动参数 * @param callobj * @param succeedcallback */ WXGamePlatform.prototype.getLaunchOptionsSync = function () { if (Laya.Browser.window.wx) { return Laya.Browser.window.wx.getLaunchOptionsSync(); } return null; }; /** * 隐藏消息提示框 * @param obj */ WXGamePlatform.prototype.hideToast = function (obj) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.hideToast(obj); } }; /** * 显示模态对话框 * @param obj */ WXGamePlatform.prototype.showModal = function (obj) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.showModal(obj); } }; /** * 清理存储数据 */ WXGamePlatform.prototype.clearStorage = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.clearStorageSync(); } }; /** * 使手机发生较短时间的振动(15 ms) * @param obj */ WXGamePlatform.prototype.vibrateShort = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.vibrateShort(); } }; /** * 从本地缓存中移除指定 key * @param key */ WXGamePlatform.prototype.removeStorage = function (key) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.removeStorage(key); } }; WXGamePlatform.prototype.onAudioInterruptionBegin = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.onAudioInterruptionBegin(function () { // SoundssManager.Instance.playbgSound("bgm"); AudioControl_1.AudioControl.Instance.ClearAllSOUND(); }); } }; WXGamePlatform.prototype.onAudioInterruptionEnd = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.onAudioInterruptionEnd(function () { var wxgameplatform = WXGamePlatform.Instance; Laya.timer.clear(wxgameplatform, wxgameplatform.onAudioEndCallback); Laya.timer.once(500, wxgameplatform, wxgameplatform.onAudioEndCallback); }); } }; WXGamePlatform.prototype.onAudioEndCallback = function () { DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd); }; /** * 退出游戏 */ WXGamePlatform.prototype.exitGame = function () { var wx = Laya.Browser.window.wx; if (wx) { wx.exitMiniProgram(); } }; /** * 打开客服对话框 */ WXGamePlatform.prototype.openCustomerService = function () { var wx = Laya.Browser.window.wx; if (wx) { var version = wx.getSystemInfoSync().SDKVersion; if (GameUtils_1.GameUtils.compareVersion(version, '2.0.3') >= 0 && wx.openCustomerServiceConversation) { wx.openCustomerServiceConversation({ showMessageCard: true, sendMessageImg: "https://resource.51yoyoyo.com/res/wxsendmessageimg/smi.jpg" }); } else { // AlertUtils.showWordTips("当前微信版本不支持"); } } }; /** * 监听内存不足告警 */ WXGamePlatform.prototype.onMemoryWarning = function () { var wx = Laya.Browser.window.wx; if (wx && wx.onMemoryWarning) { wx.onMemoryWarning(function () { }); } }; WXGamePlatform.prototype.onError = function () { var wx = Laya.Browser.window.wx; if (wx && wx.onError) { wx.onError(function (res) { console.log("*****onError", res); }); } }; /** * 开始分享 */ WXGamePlatform.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) { if (callobj === void 0) { callobj = null; } if (succeedCallback === void 0) { succeedCallback = null; } if (failCallback === void 0) { failCallback = null; } WXGamePlatform.nowShareindex = 0; if (WXGamePlatform.ShareDict[key]) { this.shareApp(WXGamePlatform.ShareDict[key], callobj, succeedCallback, failCallback); } }; WXGamePlatform.prototype.shareApp = function (info, callobj, success, failCallback) { this.nowshareObj = callobj; this.nowshareinfo = info; this.nowsharesucceedfun = success; this.nowsharefailfun = failCallback; this.startShareTime = Laya.Browser.now(); this.isShareing = true; WXGamePlatform.callbackfailstate = 0; this.shareAppMessage({ title: info.tile, imageUrl: Global_1.Global.cdnurl + info.img, query: "", success: function (res) { }, fail: function (res) { GlobalTip_1.GlobalTip.Instance.showWordTips("您取消了分享"); if (failCallback && callobj) { failCallback.call(callobj); } }, cancel: function (res) { WXGamePlatform.callbackfailstate = 1; } }); }; /** * 监听小游戏回到前台的事件 * @param callobj * @param succeedcallback * @param failCallback */ WXGamePlatform.prototype.onShow = function (callobj, succeedcallback, failCallback) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (failCallback === void 0) { failCallback = null; } this.showobj = callobj; this.showCallback = succeedcallback; var wx = Laya.Browser.window.wx; if (wx) { wx.onShow(function (res) { WXGamePlatform.isShowing = true; if (res && res.scene) { WXGamePlatform.fromscene = Number(res.scene); } Laya.timer.frameOnce(1, WXGamePlatform.Instance, WXGamePlatform.Instance.onShowSucceed); }); } }; WXGamePlatform.prototype.onShowSucceed = function () { var wxgameplatform = WXGamePlatform.Instance; if (wxgameplatform.showobj && wxgameplatform.showCallback) { wxgameplatform.showCallback.call(wxgameplatform.showobj); } if (wxgameplatform.isShareing) //如果是分享状态 { wxgameplatform.isShareing = false; var isShareSucceed = false; if (WXGamePlatform.callbackfailstate == 0) { var nowTime = Laya.Browser.now(); var disTime = (nowTime - wxgameplatform.startShareTime) / 1000; if (disTime >= WXGamePlatform.ShareTime || WXGamePlatform.nowShareindex >= 3) { isShareSucceed = true; } } WXGamePlatform.callbackfailstate = 0; if (isShareSucceed) { WXGamePlatform.dayShareNum++; wxgameplatform.updateDayShareInfo(); if (wxgameplatform.nowshareObj && wxgameplatform.nowsharesucceedfun) { wxgameplatform.nowsharesucceedfun.call(wxgameplatform.nowshareObj); } } else { WXGamePlatform.nowShareindex++; wxgameplatform.showModal({ title: "提示", content: "请每次分享到不同群,是否重新分享?", showCancel: true, cancelText: '取消', confirmText: '确定', success: function (res) { var wxplatform = WXGamePlatform.Instance; if (res.confirm) { WXGamePlatform.Instance.shareApp(wxplatform.nowshareinfo, wxplatform.nowshareObj, wxplatform.nowsharesucceedfun, wxplatform.nowsharefailfun); } else { if (wxplatform.nowsharefailfun && wxplatform.nowshareObj) { wxplatform.nowsharefailfun.call(wxplatform.nowshareObj); } } }, fail: function () { }, complete: function () { } }); } } }; /** * 看视频领奖励 * @param callobj * @param succeedcallback */ WXGamePlatform.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) { var _this = this; if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (failCallback === void 0) { failCallback = null; } if (istongjiNum === void 0) { istongjiNum = true; } var wx = Laya.Browser.window.wx; if (wx && wx.createRewardedVideoAd) { if (!WXGamePlatform.videoplaying) { var time = this.lockVideoLeftTime(); if (time > 0) { GlobalTip_1.GlobalTip.Instance.showWordTips("广告尚未准备好,请" + time + "秒后再试"); return; } DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_losefocus); WXGamePlatform.istongjiVideoNum = istongjiNum; this.nowvideokey = key; WXGamePlatform.videoplaying = true; this.videocallobj = callobj; this.videosucceedCallback = succeedcallback; this.videofailCallback = failCallback; this.videoAd = wx.createRewardedVideoAd({ adUnitId: 'adunit-0c687084c908ee89' }); this.videoAd.onClose(this.closeAD); this.videoAd.onError(this.onerro); this.videoAd.load().then(function () { return _this.videoAd.show(); }).catch(function (err) { console.log(err.errMsg), WXGamePlatform.Instance.failVideo(); }); } } }; WXGamePlatform.prototype.lockVideoLeftTime = function () { var time = (Laya.Browser.now() - WXGamePlatform.lastVideoTime) / 1000; time = WXGamePlatform.VideoTime - time; return Math.ceil(time); }; WXGamePlatform.prototype.onerro = function (res) { var wxgamePlatform = WXGamePlatform.Instance; WXGamePlatform.videoplaying = false; wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用 wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用 DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus); }; // 关闭广告 WXGamePlatform.prototype.closeAD = function (status) { WXGamePlatform.lastVideoTime = Laya.Browser.now(); var wxgamePlatform = WXGamePlatform.Instance; if (status && status.isEnded || status == undefined) { if (WXGamePlatform.istongjiVideoNum) { WXGamePlatform.dayVideoNum++; wxgamePlatform.updateDayVideoInfo(); DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_updateVideoNums); } if (wxgamePlatform.videocallobj && wxgamePlatform.videosucceedCallback) { wxgamePlatform.videosucceedCallback.call(wxgamePlatform.videocallobj); } } else { GlobalTip_1.GlobalTip.Instance.showWordTips("未观看完整视频,无法获得奖励"); if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) { wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj); } } WXGamePlatform.videoplaying = false; wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用 wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用 DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus); }; // 广告失败 WXGamePlatform.prototype.failVideo = function () { WXGamePlatform.lastVideoTime = Laya.Browser.now(); WXGamePlatform.videoplaying = false; GlobalTip_1.GlobalTip.Instance.showWordTips("广告加载失败,试试别的方式吧~"); var wxgamePlatform = WXGamePlatform.Instance; wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用 wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用 if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) { wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj); } DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus); }; WXGamePlatform.prototype.isCanVideo = function () { if (WXGamePlatform.dayVideoNum < WXGamePlatform.VideoNum) { if (WXGamePlatform.dayVideoNum == 0) { return true; } var videobs = Math.floor(WXGamePlatform.dayVideoNum / WXGamePlatform.VideotoShare); var sharebs = Math.floor(WXGamePlatform.dayShareNum / WXGamePlatform.SharetoVideo); if (videobs > sharebs) { return false; } else if (videobs < sharebs) { return true; } else { var videoyushu = WXGamePlatform.dayVideoNum % WXGamePlatform.VideotoShare; if (videoyushu != 0) { return true; } var shareyushu = WXGamePlatform.dayShareNum % WXGamePlatform.SharetoVideo; if (shareyushu != 0) { return false; } return true; } } return false; }; WXGamePlatform.prototype.createBanner = function (bannertype, style) { if (bannertype === void 0) { bannertype = ""; } if (Laya.Browser.window.wx) { if (bannertype != "") { var bo = false; for (var i = 0; i < this._bannerTypeList.length; i++) { if (bannertype == this._bannerTypeList[i].type) { this._bannerTypeList[i].style = style; var arr = this._bannerTypeList.splice(i, 1); this._bannerTypeList.push(arr[0]); bo = true; break; } } if (!bo) { this._bannerTypeList.push({ type: bannertype, style: style }); } } else { if (this._bannerTypeList.length == 0) { return; } else { var item = this._bannerTypeList[this._bannerTypeList.length - 1]; style = item.style; } } if (this.bannerAd) { var now = Laya.Browser.now(); //超过3分钟刷新 if (now - this.bannerRunTime > 60000 * 3) { this.bannerAd.offError(this.bannerError); this.bannerAd.offResize(this.bannerResize); this.bannerAd.destory(); this.createNewBanner(style); } else { this.showBanner(style); } } else { this.createNewBanner(style); } } }; WXGamePlatform.prototype.createNewBanner = function (style) { var wx = Laya.Browser.window.wx; if (wx && wx.createBannerAd) { this.nowStype = style; this.bannerRunTime = Laya.Browser.now(); var info = this.getSystemInfoSync(); this._screenwidth = info.screenWidth; var scale = 1; if (style.hasOwnProperty("scale")) { scale = style.scale; } this.bannerAd = wx.createBannerAd({ adUnitId: 'adunit-8c2d586135fa6d4f', adIntervals: 30, style: { left: 0, top: info.screenHeight - 105, width: info.screenWidth * scale } }); if (this.bannerAd) { this.bannerAd.onError(this.bannerError); this.showBanner(style); } } }; WXGamePlatform.prototype.bannerResize = function (res) { var self = WXGamePlatform.Instance; self.bannerAd.offResize(self.bannerResize); self.isonResize = false; var nowstype = self.nowStype; if (!nowstype) { return; } var info = self.getSystemInfoSync(); var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight; var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth; self.bannerwidth = res.width; self.bannerheight = res.height; if (nowstype.hasOwnProperty("x") && nowstype.x != 0) { self.bannerAd.style.left = nowstype.x * percentageW; } else { self.bannerAd.style.left = (info.windowWidth - res.width) * 0.5; } if (nowstype.hasOwnProperty("y") && nowstype.y != 0) { self.bannerAd.style.top = nowstype.y * percentageH; } else { self.bannerAd.style.top = (info.windowHeight - res.height) - 15; } }; WXGamePlatform.prototype.bannerError = function (err) { }; WXGamePlatform.prototype.showBanner = function (style) { if (this.bannerAd) { this.nowStype = style; var info = this.getSystemInfoSync(); var nowstype = this.nowStype; var scale = 1; if (nowstype.hasOwnProperty("scale")) { scale = nowstype.scale; } var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight; var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth; if (nowstype.hasOwnProperty("x") && nowstype.x != 0) { this.bannerAd.style.left = nowstype.x * percentageW; } else { this.bannerAd.style.left = (info.windowWidth - this.bannerwidth) * 0.5; } if (nowstype.hasOwnProperty("y") && nowstype.y != 0) { this.bannerAd.style.top = nowstype.y * percentageH; } else { this.bannerAd.style.top = (info.windowHeight - this.bannerheight) - 15; } this.bannerAd.style.width = info.screenWidth * scale; if (!this.isonResize) { this.isonResize = true; this.bannerAd.onResize(this.bannerResize); } this.bannerAd.show(); } }; WXGamePlatform.prototype.hideBanner = function (type) { if (type === void 0) { type = ""; } if (this.bannerAd) { this.bannerAd.hide(); } if (type != "") { for (var i = 0; i < this._bannerTypeList.length; i++) { if (type == this._bannerTypeList[i].type) { this._bannerTypeList.splice(i, 1); break; } } if (this._bannerTypeList.length > 0) { var item = this._bannerTypeList[this._bannerTypeList.length - 1]; this.createBanner(item.type, item.style); } } }; // private _wxOpenDataViewer:WXOpenDataViewer; /** * 打开好友排行榜 */ WXGamePlatform.prototype.openFriendRank = function (type, viewType, rect, parent, data) { if (parent === void 0) { parent = null; } if (data === void 0) { data = null; } this.closeziyuStage(); this._openrankDict[viewType] = { type: type, viewType: viewType, rect: rect, parent: parent, data: data }; this.initziyuStage(rect, parent); this.postMessage(type, data); }; /** * 排行榜打开状态时候,切换显示类型 * @param type */ WXGamePlatform.prototype.changeFriendRank = function (type) { this.postMessage(type); }; /** * 排行榜上一页 */ WXGamePlatform.prototype.prePageRank = function () { }; /** * 排行榜下一页 */ WXGamePlatform.prototype.nextPageRank = function () { }; /** * 关闭好友排行榜 */ WXGamePlatform.prototype.closeFriendRank = function (viewType) { this.closeziyuStage(); if (this._openrankDict[viewType]) { delete this._openrankDict[viewType]; } for (var s in this._openrankDict) { var itemd = this._openrankDict[s]; this.openFriendRank(itemd.type, itemd.viewType, itemd.rect, itemd.parent, itemd.data); break; } }; /** * 初始化子域 * @param rect * @param parent */ WXGamePlatform.prototype.initziyuStage = function (rect, parent) { // if( !this._wxOpenDataViewer ) // { // this._wxOpenDataViewer = new WXOpenDataViewer(); // if( parent ) // { // parent.addChild( this._wxOpenDataViewer ); // } // else // { // GameLayerManager.Instance.topLayer.displayObject.addChild( this._wxOpenDataViewer ); // } // } // this._wxOpenDataViewer.x = rect.x; // this._wxOpenDataViewer.y = rect.y; // this._wxOpenDataViewer.width = rect.width; // this._wxOpenDataViewer.height = rect.height; }; /** * 销毁子域 */ WXGamePlatform.prototype.closeziyuStage = function () { // if( this._wxOpenDataViewer ) // { // this._wxOpenDataViewer.destroy(); // this._wxOpenDataViewer.removeSelf(); // this._wxOpenDataViewer = null; // } }; /** * 数据上传(用于排行榜数据显示) * @param param1 上报数据 * @param param2 上报数据 */ WXGamePlatform.prototype.storeToCloud = function (param1, param2) { var cacheMager = LocalDataControl_1.LocalDataControl.Instance; var score1 = cacheMager.getnum("param1"); // var score2:number = cacheMager.getnum( "param2" ); param1 = Math.floor(param1); param2 = Math.floor(param2); var result1 = param1; var result2 = param2; if (result1 < score1) { result1 = score1; } else { cacheMager.addstr("param1", result1.toString()); } var arr = []; arr.push({ key: "param1", value: result1.toString() }); arr.push({ key: "param2", value: result2 + "" }); this.setUserCloudStorage(arr); }; WXGamePlatform.prototype.createGameClubButton = function (style, icon) { if (icon === void 0) { icon = "green"; } var wx = Laya.Browser.window.wx; if (wx && style) { style.width = 40; style.height = 40; WXGamePlatform.gameclubButton = wx.createGameClubButton({ icon: icon, style: style }); if (WXGamePlatform.gameclubButton) { WXGamePlatform.gameclubButton.show(); } } }; WXGamePlatform.QuDaoID = ""; //微信广告ID WXGamePlatform.isShowing = true; /** * 授权状态 0:未判断,1:已授权 */ WXGamePlatform.accreditstate = 0; /** * 当天分享次数 */ WXGamePlatform.dayShareNum = 0; /** * 当天看视频次数 */ WXGamePlatform.dayVideoNum = 0; /** * 判断分享是否成功时间间隔 */ WXGamePlatform.ShareTime = 0; /** * 每日最大看视频次数(成功累加一次) */ WXGamePlatform.VideoNum = 0; /** * 看视频冷却时间 */ WXGamePlatform.VideoTime = 0; /** * 8好位cpa可弹出时间间隔(秒) */ WXGamePlatform.jiliweitime = 100; /** * 分享几次切换到视频 */ WXGamePlatform.SharetoVideo = 1; /** * 视频几次切换到分享 */ WXGamePlatform.VideotoShare = 1; /** * 分享数据容器 */ WXGamePlatform.ShareDict = {}; /** * 用户来源id */ WXGamePlatform.fromscene = 0; WXGamePlatform.nowShareindex = 0; WXGamePlatform.callbackfailstate = 0; WXGamePlatform.lastVideoTime = 0; /** * 视频是否在播放中 */ WXGamePlatform.videoplaying = false; WXGamePlatform.istongjiVideoNum = true; return WXGamePlatform; }()); exports.WXGamePlatform = WXGamePlatform; },{"../Control/AudioControl":18,"../Control/DateControl":20,"../Control/LocalDataControl":23,"../Data/UserDataInfo":35,"../Global":41,"../WXSDK/WECHATEVENT":80,"../utils/DispatcherManager":85,"../utils/GameUtils":87,"../utils/GlobalTip":88}],82:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform"); var PlatfromType_1 = require("./PlatfromType"); var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT"); var Global_1 = require("../Global"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var TimesTamper_1 = require("../Time/TimesTamper"); var DateControl_1 = require("../Control/DateControl"); var AudioControl_1 = require("../Control/AudioControl"); /* * name; */ var pingtaiutils = /** @class */ (function () { function pingtaiutils() { this._isenable = false; pingtaiutils.ins = this; } Object.defineProperty(pingtaiutils, "Instance", { get: function () { if (pingtaiutils.ins == null) { return new pingtaiutils(); } return pingtaiutils.ins; }, enumerable: true, configurable: true }); /** * 初始化平台 */ pingtaiutils.prototype.initPlatfrom = function () { if (Laya.Browser.window.tt) { Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.tt; } else if (Laya.Browser.window.wx) //微信小游戏 { Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.wx; } else { Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.pc; } }; pingtaiutils.prototype.init = function () { this.initPlatfrom(); // switch( Global.nowplatfrom ) // { // case PlatfromType.wx: // WXGamePlatform.Instance.init(); // break; // case PlatfromType.qq: // break; // default: // break; // } // this.onShow( this,this.showcallback ); // this.onHide(this,this.hidecallback); }; pingtaiutils.prototype.initData = function () { DateControl_1.DateControl.Instance.SetSelf(); switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.initData(); break; default: break; } }; /** * 合违规判断 true:合规,false:违规 */ pingtaiutils.checkEnable = function () { if (pingtaiutils.islegal == 1) { return true; } return false; }; pingtaiutils.prototype.login = function (callobj, succeedcallback, progressCallback, failcallback) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (progressCallback === void 0) { progressCallback = null; } if (failcallback === void 0) { failcallback = null; } fairygui.GRoot.inst.showModalWait(); this._logincallobj = callobj; this._loginsucceedcallback = succeedcallback; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.createUserAndLogin(this, this.loginSucceed, this.loginprogressCallback, this.loginfailcallback); break; default: this.loginSucceed(null); break; } }; pingtaiutils.prototype.loginprogressCallback = function (value) { }; pingtaiutils.prototype.loginSucceed = function (data) { fairygui.GRoot.inst.closeModalWait(); }; pingtaiutils.prototype.loginfailcallback = function () { }; pingtaiutils.prototype.onShow = function (callobj, succeedcallback, failCallback) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (failCallback === void 0) { failCallback = null; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.onShow(callobj, succeedcallback, failCallback); break; case PlatfromType_1.PlatfromType.qq: break; } }; pingtaiutils.prototype.showcallback = function () { Laya.timer.clear(this, this.againplaybgSound); Laya.timer.once(500, this, this.againplaybgSound); DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onshow); DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus); var fromscene = pingtaiutils.fromscene(); if (fromscene == 1089 || fromscene == 1131) { DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_fromscorfk); } }; pingtaiutils.prototype.againplaybgSound = function () { DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd); }; pingtaiutils.prototype.onHide = function (callobj, succeedcallback) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.onHide(callobj, succeedcallback); break; case PlatfromType_1.PlatfromType.qq: break; } }; pingtaiutils.prototype.hidecallback = function () { TimesTamper_1.TimesTamper.Instance.sendonlineTongji(); AudioControl_1.AudioControl.Instance.ClearAllSOUND(); DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onhide); DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_losefocus); }; Object.defineProperty(pingtaiutils.prototype, "isshow", { /** * 当前游戏是否在显示中 */ get: function () { var bo = true; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: if (WXGamePlatform_1.WXGamePlatform.isShowing) { bo = true; } bo = false; break; } return bo; }, enumerable: true, configurable: true }); /** * 分包加载 */ pingtaiutils.prototype.loadSubpackage = function (typename, callobj, callback, callprogress, failcallback) { if (failcallback === void 0) { failcallback = null; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage(typename, callobj, callback, callprogress, failcallback); break; default: if (callobj && callback) { callback.call(callobj); } break; } }; /** * 获取是否已经授权 * @param callobj * @param callback */ pingtaiutils.prototype.isaccredit = function (callobj, accreditCallback) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.getaccredit(callobj, accreditCallback); break; case PlatfromType_1.PlatfromType.qq: WXGamePlatform_1.WXGamePlatform.Instance.getaccredit(callobj, accreditCallback); break; default: if (accreditCallback && callobj) { accreditCallback.call(callobj, true); } break; } }; /** * 拿角色信息授权 */ pingtaiutils.prototype.createaccredit = function (callobj, callback, failcallback) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.createUserInfoButton(callobj, callback, failcallback); break; } }; pingtaiutils.prototype.closeuserinfoButton = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.closeuserinfobUtton(); break; } }; /** * 退出游戏 */ pingtaiutils.prototype.exitGame = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.exitGame(); break; } }; /** * 打开客服对话框 */ pingtaiutils.prototype.openCustomerService = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.openCustomerService(); break; } }; /** * 短震动 */ pingtaiutils.prototype.vibrateShort = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort(); break; default: break; } }; pingtaiutils.isCanVideo = function () { var bo = false; if (pingtaiutils.checkEnable()) { bo = true; } else { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: bo = WXGamePlatform_1.WXGamePlatform.Instance.isCanVideo(); break; default: bo = true; break; } } return bo; }; pingtaiutils.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) { if (callobj === void 0) { callobj = null; } if (succeedCallback === void 0) { succeedCallback = null; } if (failCallback === void 0) { failCallback = null; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.startShareApp(key, callobj, succeedCallback, failCallback); break; default: if (callobj && succeedCallback) { succeedCallback.call(callobj); } break; } }; pingtaiutils.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (failCallback === void 0) { failCallback = null; } if (istongjiNum === void 0) { istongjiNum = true; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.playVideo(key, callobj, succeedcallback, failCallback, istongjiNum); break; default: if (callobj && succeedcallback) { succeedcallback.call(callobj); } break; } }; pingtaiutils.prototype.createBanner = function (bannertype, style) { if (style === void 0) { style = { x: 0, y: 0, scale: 1 }; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.createBanner(bannertype, style); break; default: break; } }; pingtaiutils.prototype.hideBanner = function (bannertype) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.hideBanner(bannertype); break; default: break; } }; /** * 数据上传(用于排行榜数据显示) * @param param1 上报数据1 * @param param2 上报数据2 */ pingtaiutils.prototype.storeToCloud = function (param1, param2) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.storeToCloud(param1, param2); break; default: break; } }; /** * 打开好友排行榜 */ pingtaiutils.prototype.openFriendRank = function (type, viewType, rect, parent, data) { if (parent === void 0) { parent = null; } if (data === void 0) { data = null; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.openFriendRank(type, viewType, rect, parent, data); break; default: break; } }; /** * 排行榜打开状态时候,切换显示类型 * @param type */ pingtaiutils.prototype.changeFriendRank = function (type) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.changeFriendRank(type); break; default: break; } }; /** * 排行榜上一页 */ pingtaiutils.prototype.prePageRank = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.prePageRank(); break; default: break; } }; /** * 排行榜下一页 */ pingtaiutils.prototype.nextPageRank = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.nextPageRank(); break; default: break; } }; /** * 关闭好友排行榜 */ pingtaiutils.prototype.closeFriendRank = function (viewType) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.closeFriendRank(viewType); break; default: break; } }; pingtaiutils.prototype.lockVideoLeftTime = function () { var time = 0; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: time = WXGamePlatform_1.WXGamePlatform.Instance.lockVideoLeftTime(); break; default: break; } return time; }; pingtaiutils.dayVideoNums = function () { var time = 0; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: time = WXGamePlatform_1.WXGamePlatform.dayVideoNum; break; default: break; } return time; }; /** * 1089:添加到我的小程序,1131:添加到浮窗 */ pingtaiutils.fromscene = function () { var scene = 0; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: scene = WXGamePlatform_1.WXGamePlatform.fromscene; break; default: break; } return scene; }; pingtaiutils.createGameClubButton = function (style, icon) { if (icon === void 0) { icon = "green"; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.PlatfromType.wx: WXGamePlatform_1.WXGamePlatform.Instance.createGameClubButton(style, icon); break; default: break; } }; /** * 是否合规 */ pingtaiutils.islegal = 0; return pingtaiutils; }()); exports.pingtaiutils = pingtaiutils; },{"../Control/AudioControl":18,"../Control/DateControl":20,"../Global":41,"../Time/TimesTamper":60,"../WXSDK/WECHATEVENT":80,"../WXSDK/WXGamePlatform":81,"../utils/DispatcherManager":85,"./PlatfromType":74}],83:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PlayerAccount_1 = require("./PlayerAccount"); // import { Account } from "../Account/Account"; var ttshare = /** @class */ (function () { function ttshare() { } ttshare.share = function () { Laya.Browser.window.tt.shareAppMessage({ channel: "article", templateId: "ocgf9b46464b9anlff", title: "冲啊冲", imageUrl: "jiazai/123.png", query: "res.query", success: function () { }, fail: function () { }, }); }; return ttshare; }()); exports.ttshare = ttshare; var ttad = /** @class */ (function () { function ttad() { ttad.instance = this; } Object.defineProperty(ttad, "Instance", { get: function () { if (ttad.instance) { return ttad.instance; } else { return new ttad(); } }, enumerable: true, configurable: true }); ttad.InitAD = function () { if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video || !Laya.Browser.onMobile) return; ttad.bannerAdUnitId = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.bannerAdUnitId ? PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.bannerAdUnitId : ttad.bannerAdUnitId; console.log("bannerAdUnitId", ttad.bannerAdUnitId); ttad.videlAdUnitId = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.videlAdUnitId ? PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.videlAdUnitId : ttad.videlAdUnitId; console.log("videlAdUnitId", ttad.videlAdUnitId); ttad.videoAd = Laya.Browser.window.tt.createRewardedVideoAd({ adUnitId: this.videlAdUnitId }); ttad.videoAd.onClose(function (res) { if (res.isEnded) { if (ttad.closecallback) { ttad.closecallback(true); } } else { if (ttad.closecallback) { ttad.closecallback(false); } } }); }; ttad.ShowVideo = function (_cb) { var _this = this; if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video || !Laya.Browser.onMobile) return; console.log("show video"); ttad.closecallback = _cb; ttad.videoAd.show().then(function () { console.log("广告显示成功"); }).catch(function (err) { // ttad.ShowTxt("视频正在加载中"); console.log("广告组件出现问题", err); // 可以手动加载一次 Laya.timer.once(200, _this, function () { ttad.videoAd.load().then(function () { console.log("手动加载成功"); // 加载成功后需要再显示广告 return ttad.videoAd.show(); }); }); }); }; ttad.Showbanner = function () { if (!Laya.Browser.onMobile) return; console.log("show banner"); ttad.canshow = true; var infor = Laya.Browser.window.tt.getSystemInfoSync(); var targetBannerAdWidth = 200; if (ttad.bannerAd) ttad.bannerAd.destroy(); Laya.timer.once(200, this, function () { ttad.bannerAd = Laya.Browser.window.tt.createBannerAd({ adUnitId: ttad.bannerAdUnitId, style: { width: targetBannerAdWidth, top: infor.windowHeight - (targetBannerAdWidth / 16) * 9 // 根据系统约定尺寸计算出广告高度 } }); ttad.bannerAd.onLoad(function () { if (ttad.canshow) { ttad.bannerAd.show().then(function () { console.log("广告显示成功"); }).catch(function (err) { console.log("广告组件出现问题", err); }); } }); ttad.bannerAd.onResize(function (size) { console.log(size.width, size.height); ttad.bannerAd.style.top = infor.windowHeight - size.height; ttad.bannerAd.style.left = (infor.windowWidth - size.width) / 2; }); }); }; ttad.Clear = function () { ttad.canshow = false; ttad.closecallback = null; if (ttad.bannerAd) ttad.bannerAd.hide(); }; /**抖音更多游戏方法*/ ttad.CreateMoreGameBtn = function (fun) { if (fun === void 0) { fun = null; } if (!Laya.Browser.onMobile) return; if (Laya.Browser.onIOS) { ttad.ShowTxt("暂未开放"); return; } Laya.Browser.window.tt.showMoreGamesModal({ appLaunchOptions: [ { appId: "tt66d0106df9eaa083", query: "foo=bar&baz=qux", extraData: {} } ], success: function (res) { console.log("success", res.errMsg); if (fun) { fun(); } }, fail: function (res) { console.log("fail", res.errMsg); } }); // 监听弹窗关闭 // this.onMoreGamesModalClose(); }; /*监听弹窗关闭*/ // static onMoreGamesModalClose() // { // if(!Laya.Browser.onMobile)return; // if( Laya.Browser.onIOS) // { // ttad.ShowTxt("暂未开放"); // return; // } // Laya.Browser.window.tt.onMoreGamesModalClose(function() { // console.log("modal closed"); // if(Scene3DManager.getInstance().IsGamePasue) // { // EventUtils.dispatchEvent( GameEvent.continueGame ); // } // }); // } ttad.ShowTxt = function (text) { if (Laya.Browser.window.tt) { Laya.Browser.window.tt.showToast({ title: text }); } else { console.log(text); } }; ttad.videlAdUnitId = "15gfgp58pocp80hbkb"; ttad.bannerAdUnitId = "dsk7cohbl2f4jpjtq5"; ttad.canshow = true; return ttad; }()); exports.ttad = ttad; },{"./PlayerAccount":75}],84:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * 全局侦听类及消息处理 */ var DisPatcherOn = /** @class */ (function (_super) { __extends(DisPatcherOn, _super); function DisPatcherOn() { var _this = _super.call(this) || this; _this.isInit = false; DisPatcherOn.ins = _this; if (_this.isInit) { } if (_this._dispatcher == null) { _this._dispatcher = new Laya.EventDispatcher(); _this.isInit = true; } return _this; } Object.defineProperty(DisPatcherOn, "Instance", { get: function () { if (DisPatcherOn.ins == null) return new DisPatcherOn(); return DisPatcherOn.ins; }, enumerable: true, configurable: true }); DisPatcherOn.prototype.addEventListener = function (type, listener, thisObject, useCapture, priority) { if (useCapture === void 0) { useCapture = false; } if (priority === void 0) { priority = 0; } this._dispatcher.on(type, thisObject, listener); }; DisPatcherOn.prototype.removeEventListener = function (type, listener, thisObject, useCapture) { if (useCapture === void 0) { useCapture = false; } this._dispatcher.off(type, thisObject, listener); }; DisPatcherOn.prototype.hasEventListener = function (type) { return this._dispatcher.hasListener(type); }; DisPatcherOn.prototype.dispatchEvent = function (type, data) { return this._dispatcher.event(type, data); }; return DisPatcherOn; }(Laya.EventDispatcher)); exports.DisPatcherOn = DisPatcherOn; },{}],85:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LEvent_1 = require("./LEvent"); var DisPatcherOn_1 = require("./DisPatcherOn"); /* * name; */ var DispatcherManager = /** @class */ (function () { function DispatcherManager() { } DispatcherManager.init = function () { DisPatcherOn_1.DisPatcherOn.Instance; }; //新建事件 DispatcherManager.Event = function (type, obj, bubbles, cancelable) { if (obj === void 0) { obj = null; } if (bubbles === void 0) { bubbles = false; } if (cancelable === void 0) { cancelable = false; } return new LEvent_1.LEvent(type, obj, bubbles, cancelable); }; //派发事件 DispatcherManager.dispatchEvent = function (type, obj, bubbles, cancelable) { if (obj === void 0) { obj = null; } if (bubbles === void 0) { bubbles = false; } if (cancelable === void 0) { cancelable = false; } DisPatcherOn_1.DisPatcherOn.Instance.dispatchEvent(type, obj); }; //监听事件 DispatcherManager.addEventListener = function (type, thisObject, listener, useCapture, priority) { if (useCapture === void 0) { useCapture = false; } if (priority === void 0) { priority = 0; } DisPatcherOn_1.DisPatcherOn.Instance.addEventListener(type, listener, thisObject, useCapture, priority); }; DispatcherManager.hasEventListener = function (type) { return DisPatcherOn_1.DisPatcherOn.Instance.hasEventListener(type); }; DispatcherManager.removeEventListener = function (type, thisObject, listener, useCapture, priority) { if (useCapture === void 0) { useCapture = false; } if (priority === void 0) { priority = 0; } DisPatcherOn_1.DisPatcherOn.Instance.removeEventListener(type, listener, thisObject); }; return DispatcherManager; }()); exports.DispatcherManager = DispatcherManager; },{"./DisPatcherOn":84,"./LEvent":89}],86:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Sprite = Laya.Sprite; var GameState = /** @class */ (function () { function GameState() { /*********************************************************************** */ this.btnArr = ["res/button.png", "res/button.png", "res/button.png"]; this.nameArr = ["canvas截图", "sprite截图", "清理"]; } GameState.prototype.drawSomething = function () { this.sp = new Sprite(); Laya.stage.addChild(this.sp); //画线 this.sp.graphics.drawLine(10, 58, 146, 58, "#ff0000", 3); //画连续直线 this.sp.graphics.drawLines(176, 58, [0, 0, 39, -50, 78, 0, 117, 50, 156, 0], "#ff0000", 5); //画曲线 this.sp.graphics.drawCurves(352, 58, [0, 0, 19, -100, 39, 0, 58, 100, 78, 0, 97, -100, 117, 0, 136, 100, 156, 0], "#ff0000", 5); //画矩形 this.sp.graphics.drawRect(10, 166, 166, 90, "#ffff00"); //画多边形 this.sp.graphics.drawPoly(264, 166, [0, 0, 60, 0, 78.48, 57, 30, 93.48, -18.48, 57], "#ffff00"); //画三角形 this.sp.graphics.drawPoly(400, 166, [0, 100, 50, 0, 100, 100], "#ffff00"); //画圆 this.sp.graphics.drawCircle(98, 332, 50, "#00ffff"); //画扇形 this.sp.graphics.drawPie(240, 290, 100, 10, 60, "#00ffff"); //绘制圆角矩形,自定义路径 this.sp.graphics.drawPath(400, 310, [["moveTo", 5, 0], ["lineTo", 105, 0], ["arcTo", 110, 0, 110, 5, 5], ["lineTo", 110, 55], ["arcTo", 110, 60, 105, 60, 5], ["lineTo", 5, 60], ["arcTo", 0, 60, 0, 55, 5], ["lineTo", 0, 5], ["arcTo", 0, 0, 5, 0, 5], ["closePath"]], { fillStyle: "#00ffff" }); }; GameState.prototype._onclick = function (e) { switch (e.target.name) { case this.nameArr[0]: var base64Url = this._canvas.toDataURL("image/png", 1); this.drawImage.skin = base64Url; break; case this.nameArr[1]: var text = Laya.stage.drawToTexture(Laya.Browser.clientWidth, Laya.Browser.clientHeight, 0, 0); this.drawSp.graphics.drawTexture(text, 0, 0, this.drawSp.width, this.drawSp.height); break; case this.nameArr[2]: this.drawImage.skin = null; this.drawSp.graphics.clear(); this.drawSp.graphics.drawRect(0, 0, this.drawSp.width, this.drawSp.height, "#ff0000"); break; } }; GameState.removeselect = "GameState_removeselect"; GameState.npcend = "GameState_npcendGame"; /** * 通关成功 */ GameState.win = "GameState_winGame"; /** * 通关失败 */ GameState.fail = "GameState_failGame"; GameState.jump = "GameState_jumpgame"; /** * 暂停游戏 */ GameState.stop = "GameState_stopGame"; /** * 回到主界面 */ GameState.returnMainView = "returnMainView"; GameState.updateSKinView = "GameState_updateSKinView"; /*********************************************************************** */ /** * 开始游戏 */ GameState.start = "GameState_startGame"; /** * 结束游戏 */ GameState.end = "GameState_endGame"; /**失败 */ GameState.lose = "GameState_loseGame"; /** * 复活 */ GameState.revive = "GameState_reviveGame"; /**是否复活 */ GameState.isdie = false; /**允许复活次数 */ GameState.fuhuocishu = 1; /**是否已经发布过录屏 */ GameState.recordscree = false; /**游戏次数*/ GameState.GameNum = 0; return GameState; }()); exports.GameState = GameState; },{}],87:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * 公共接口 */ var GameUtils; (function (GameUtils) { /** * 随机函数(返回整型) */ function randRangeint(min, max) { var value = Math.floor(Math.random() * (max - min + 1)) + min; if (value > max) { value = max; } return value; } GameUtils.randRangeint = randRangeint; /** * 随机函数( 不取整 ) */ function randRangefloat(min, max) { var value = Math.random() * (max - min + 1) + min; if (value > max) { value = max; } return value; } GameUtils.randRangefloat = randRangefloat; function getTexbyPkgAndName(pkgname, texname) { var uipackage = fairygui.UIPackage.getByName(pkgname); if (uipackage) { return uipackage.getItemAssetByName(texname); } return null; } GameUtils.getTexbyPkgAndName = getTexbyPkgAndName; /** * 切割分号变成Point对象 * @param str */ function cutfenhaoPoint(str) { var arr = str.split(";"); return new Laya.Point(Number(arr[0]), Number(arr[1])); } GameUtils.cutfenhaoPoint = cutfenhaoPoint; /** * 切割分号变成数据(number) */ function cutfenhaotoArrnum(str) { var numArr = []; if (str == "") { return numArr; } var arr = str.split(";"); var i = 0; for (i; i < arr.length; i++) { numArr.push(Number(arr[i])); } return numArr; } GameUtils.cutfenhaotoArrnum = cutfenhaotoArrnum; /** * 切割分号变成数据(string) */ function cutfenhaotoArrstr(str) { return str.split(";"); } GameUtils.cutfenhaotoArrstr = cutfenhaotoArrstr; /** * 切割分号变成数据( { key:1,value:1 } ) */ function cutfenhaotoObj(str) { var obj = {}; var arr = str.split(";"); obj.key = arr[0]; obj.value = arr[1]; return obj; } GameUtils.cutfenhaotoObj = cutfenhaotoObj; /**切割str*/ function cutstrtoArr(str) { var arr = str.split("|"); return arr; } GameUtils.cutstrtoArr = cutstrtoArr; /**切割str( 1:1|1:1 ) to Array<{ key:1,value:1 }> */ function cutstrtoArr1(str) { var reslutArr = []; var arr = str.split("|"); var i = 0; for (i = 0; i < arr.length; i++) { var itemarr = arr[i].split(";"); reslutArr.push({ key: itemarr[0], value: itemarr[1] }); } return reslutArr; } GameUtils.cutstrtoArr1 = cutstrtoArr1; function cutstrtoObj(str) { var resultobj = {}; var arr = str.split("|"); var i = 0; for (i = 0; i < arr.length; i++) { var itemarr = arr[i].split(";"); resultobj[itemarr[0]] = itemarr[1]; } return resultobj; } GameUtils.cutstrtoObj = cutstrtoObj; function compareVersion(v1, v2) { v1 = v1.split('.'); v2 = v2.split('.'); var len = Math.max(v1.length, v2.length); while (v1.length < len) { v1.push('0'); } while (v2.length < len) { v2.push('0'); } for (var i = 0; i < len; i++) { var num1 = parseInt(v1[i]); var num2 = parseInt(v2[i]); if (num1 > num2) { return 1; } else if (num1 < num2) { return -1; } } return 0; } GameUtils.compareVersion = compareVersion; })(GameUtils = exports.GameUtils || (exports.GameUtils = {})); },{}],88:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GlobalTipPanel_1 = require("../View/GlobalTipPanel"); var LayoutControl_1 = require("../Control/LayoutControl"); var LayOUT_1 = require("../utils/LayOUT"); var DispatcherManager_1 = require("../utils/DispatcherManager"); var GameState_1 = require("../utils/GameState"); /* * name; */ var GlobalTip = /** @class */ (function () { function GlobalTip() { GlobalTip.ins = this; } Object.defineProperty(GlobalTip, "Instance", { get: function () { if (GlobalTip.ins == null) { return new GlobalTip(); } return GlobalTip.ins; }, enumerable: true, configurable: true }); GlobalTip.prototype.initEvent = function () { GlobalTip.isEvent = true; DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.removeselect, this, this.addwordList); }; GlobalTip.prototype.showWordTips = function (word) { if (!GlobalTip.isEvent) { GlobalTip.Instance.initEvent(); } if (GlobalTip.showWordList.length > 0) { var lastword = GlobalTip.showWordList[GlobalTip.showWordList.length - 1].nowword; // if( lastword == word ) // { // return; // } } if (GlobalTip.wordList.length > 0) { var item = GlobalTip.wordList.shift(); LayoutControl_1.LayoutControl.Instance.AddLayerByName(item, LayOUT_1.LayOUT.TIP); GlobalTip.showWordList.push(item); item.showWord(word); } else { if (GlobalTip.showWordList.length < 10) { var item1 = new GlobalTipPanel_1.WordTipsPanel(); LayoutControl_1.LayoutControl.Instance.AddLayerByName(item1, LayOUT_1.LayOUT.TIP); GlobalTip.showWordList.push(item1); item1.showWord(word); } else { var item1 = GlobalTip.showWordList.shift(); item1.showWord(word); GlobalTip.showWordList.push(item1); } } }; GlobalTip.prototype.addwordList = function (item) { if (item) { item.removeFromParent(); var index = GlobalTip.showWordList.indexOf(item); if (index != -1) { GlobalTip.showWordList.splice(index, 1); } LayoutControl_1.LayoutControl.Instance.ClearLayerByName(LayOUT_1.LayOUT.TIP); GlobalTip.wordList.push(item); } }; GlobalTip.wordList = []; GlobalTip.showWordList = []; GlobalTip.maxNum = 10; GlobalTip.isEvent = false; return GlobalTip; }()); exports.GlobalTip = GlobalTip; },{"../Control/LayoutControl":22,"../View/GlobalTipPanel":64,"../utils/DispatcherManager":85,"../utils/GameState":86,"../utils/LayOUT":90}],89:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LEvent = /** @class */ (function (_super) { __extends(LEvent, _super); function LEvent(type, obj, bubbles, cancelable) { if (obj === void 0) { obj = null; } if (bubbles === void 0) { bubbles = false; } if (cancelable === void 0) { cancelable = false; } var _this = _super.call(this) || this; _this.CLASS_NAME = "LEvent"; if (obj) { _this._obj = obj; } return _this; } LEvent.prototype.clone = function (obj) { return new LEvent(this.type, obj ? obj : this._obj); }; LEvent.prototype.toString = function () { console.log(this.CLASS_NAME, "type", "bubbles", "cancelable"); }; Object.defineProperty(LEvent.prototype, "param", { /** * 传参获取 * @returns {any} */ get: function () { return this._obj; }, enumerable: true, configurable: true }); return LEvent; }(Laya.Event)); exports.LEvent = LEvent; },{}],90:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LayOUT = /** @class */ (function () { function LayOUT() { } /** * 背景层 */ LayOUT.BG = "BG"; /** * ui层 */ LayOUT.UI = "UI"; /** * ui层上层 */ LayOUT.UITop = "UITop"; /** * tips层 */ LayOUT.TIP = "TIP"; /** * 新手引导层 */ LayOUT.GUIDE = "GUIDE"; return LayOUT; }()); exports.LayOUT = LayOUT; },{}],91:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * name; */ var Singleton = /** @class */ (function (_super) { __extends(Singleton, _super); function Singleton() { return _super.call(this) || this; } /** * 获取单例类,若不存在则返回空 * @param ref 继承自Singleton的类 * @return * */ Singleton.Instance = function (ref) { if (ref.key == null) { throw new Error("getinstance erro"); } return this._dict[ref.key]; }; /** * 获取单例类,若不存在则创建 * @param ref 继承自Singleton的类 * @return * */ Singleton.getInstanceOrCreate = function (ref) { if (ref.key == null) { throw new Error("getInstanceOrCreate erro"); } this.create(ref); return this._dict[ref.key]; }; /** * 创建单例类 * @param ref 继承自Singleton的类 * @return void */ Singleton.create = function (ref) { if (ref.key == null) { throw new Error("create erro"); } if (this._dict[ref.key] == null) { this._dict[ref.key] = new ref(); } return this._dict[ref.key]; }; /** * 删除单例类 * @param ref 继承自Singleton的类 * @return void */ Singleton.remove = function (ref) { var key = ref.key; if (this._dict[key] != null) { this._dict[key].destory(); } }; /** * 销毁方法 */ Singleton.prototype.destory = function () { }; Singleton._dict = {}; return Singleton; }(Laya.EventDispatcher)); exports.Singleton = Singleton; },{}],92:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AgencySkin_1 = require("../Agency/AgencySkin"); var PanelResDic_1 = require("../PrefabControl/PanelResDic"); var GlobalTip_1 = require("../utils/GlobalTip"); var AssetPath_1 = require("../Config/AssetPath"); var MovieClip = Laya.MovieClip; var ttad_1 = require("../WXSDK/ttad"); var SkinItem = /** @class */ (function (_super) { __extends(SkinItem, _super); function SkinItem() { var _this = _super.call(this) || this; /********************************************************** */ _this.bgColorChannels = { r: 99, g: 0, b: 0xFF }; /********************************************** */ _this.SWFPath = "res/swf/dragon.swf"; _this.MCWidth = 318; _this.MCHeight = 406; return _this; } SkinItem.prototype.getHexColorString = function () { this.bgColorChannels.r = Math.floor(this.bgColorChannels.r); // 绿色通道使用0 this.bgColorChannels.g = 0; //obj.g = Math.floor(obj.g); this.bgColorChannels.b = Math.floor(this.bgColorChannels.b); var r = this.bgColorChannels.r.toString(16); r = r.length == 2 ? r : "0" + r; var g = this.bgColorChannels.g.toString(16); g = g.length == 2 ? g : "0" + g; var b = this.bgColorChannels.b.toString(16); b = b.length == 2 ? b : "0" + b; return "#" + r + g + b; }; /********************************************************** */ SkinItem.prototype.constructFromXML = function (xml) { _super.prototype.constructFromXML.call(this, xml); for (var str in this._children) { var item = this._children[str]; this[item.name] = item; } this.onInit(); }; SkinItem.prototype.onInit = function () { this.initView(); this.initEvent(); }; SkinItem.prototype.initView = function () { this.agencyskin = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencySkin_1.AgencySkin); this.c_state = this.getController("c_state"); }; SkinItem.prototype.initEvent = function () { this.on(Laya.Event.CLICK, this, this.btnclick); }; SkinItem.prototype.btnclick = function () { if (this.pifuvo) { switch (this.c_state.selectedIndex) { case 0: break; case 1: //拥有 this.agencyskin.GainPifu(this.pifuvo); break; case 2: //活动获取 GlobalTip_1.GlobalTip.Instance.showWordTips("暂未开放"); break; case 3: //看视频获取 this.playvideocallback(); // pingtaiutils.Instance.playVideo( "",this,this.playvideocallback ); break; case 4: //金币购买 this.agencyskin.GainPifu(this.pifuvo); break; } } }; SkinItem.prototype.createMovieClip = function () { var mc = new MovieClip(); mc.load(this.SWFPath); mc.x = (Laya.stage.width - this.MCWidth) / 2; mc.y = (Laya.stage.height - this.MCHeight) / 2; Laya.stage.addChild(mc); }; /********************************************** */ SkinItem.prototype.playvideocallback = function () { var _this = this; ttad_1.ttad.ShowVideo((function (isLoad) { if (isLoad) { _this.agencyskin.GainPifu(_this.pifuvo); } })); }; SkinItem.prototype.showData = function (vo) { this.pifuvo = vo; if (this.pifuvo) { this.load_icon.icon = AssetPath_1.AssetPath.getroleicon(this.pifuvo.roleCFG.icon); if (this.agencyskin.RoleData.CharacterID == this.pifuvo.roleCFG.id) { this.c_state.selectedIndex = 0; } else if (this.pifuvo.state == 1) { this.c_state.selectedIndex = 1; } else { switch (this.pifuvo.roleCFG.getState) { case 1: this.c_state.selectedIndex = 3; this.txt_need.text = this.pifuvo.hasnum + "/" + this.pifuvo.roleCFG.need; break; case 2: this.c_state.selectedIndex = 4; this.txt_need.text = this.pifuvo.roleCFG.need.toString(); break; case 3: this.c_state.selectedIndex = 2; break; } } } }; /******************************************************** */ SkinItem.prototype.preFixNumber = function (num, strLen) { return ("0000000000" + num).slice(-strLen); }; SkinItem.prototype.evalBgColor = function () { var color = Math.random() * 0xFFFFFF; var channels = this.getColorChannals(color); }; SkinItem.prototype.getColorChannals = function (color) { var result = []; result.push(color >> 16); result.push(color >> 8 & 0xFF); result.push(color & 0xFF); return result; }; /******************************************************** */ SkinItem.prototype.dispose = function () { this.off(Laya.Event.CLICK, this, this.btnclick); _super.prototype.dispose.call(this); }; return SkinItem; }(fairygui.GButton)); exports.SkinItem = SkinItem; },{"../Agency/AgencySkin":6,"../Config/AssetPath":15,"../PrefabControl/PanelResDic":48,"../WXSDK/ttad":83,"../utils/GlobalTip":88}],93:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * 继承baseView界面的打开关闭动效类型 */ var ViewAction = /** @class */ (function () { function ViewAction() { /************************ */ this._text = null; } /** * 动画状态开始时执行。 */ ViewAction.prototype.onStateEnter = function () { console.log("动画开始播放了"); this._text.text = "动画状态:动画开始播放"; }; /** * 动画状态更新时执行。 */ ViewAction.prototype.onStateUpdate = function () { console.log("动画状态更新了"); this._text.text = "动画状态:动画更新中"; }; /** * 动画状态退出时执行。 */ ViewAction.prototype.onStateExit = function () { console.log("动画退出了"); this._text.text = "动画状态:动画开始退出"; }; ViewAction.prototype.addBox = function () { for (var i = 0; i < 8; i++) { this.addVerticalBox(-0.65, 0.165 + i * 0.33 * 2, 0); this.addVerticalBox(0, 0.165 + i * 0.33 * 2, 0); this.addVerticalBox(0.65, 0.165 + i * 0.33 * 2, 0); } }; ViewAction.prototype.addVerticalBox = function (x, y, z) { var box = this.scene.addChild(new Laya.MeshSprite3D(this.mesh1)); box.meshRenderer.material = this.mat1; box.meshRenderer.castShadow = true; box.meshRenderer.receiveShadow = true; box.transform.position = new Laya.Vector3(x, y, z); var rigidBody = box.addComponent(Laya.Rigidbody3D); rigidBody.mass = 10; rigidBody.friction = 0.4; rigidBody.restitution = 0.2; var boxShape = new Laya.BoxColliderShape(0.5, 0.33, 2); rigidBody.colliderShape = boxShape; }; /** * 从小变大 */ ViewAction.ActionType_addscaleMinToMax = "ActionType_addscaleMinToMax"; /** * 从大变小移出 */ ViewAction.ActionType_removescaleMaxToMin = "ActionType_removescaleMaxToMin"; /** * 没有动效 */ ViewAction.ActionType_none = "ActionType_none"; /********************************************** */ /** * 从右边移动到中央 */ ViewAction.ActionType_addmoveToMiddle = "ActionType_addmoveToMiddle"; /** * 从最右边移出 */ ViewAction.ActionType_removemoveToRight = "ActionType_removemoveToRight"; /** * 从底部向上移动 */ ViewAction.ActionType_addmoveFromBottom = "ActionType_addmoveFromBottom"; /** * 从上向底部移动 */ ViewAction.ActionType_addmoveFromup = "ActionType_addmoveFromup"; return ViewAction; }()); exports.ViewAction = ViewAction; },{}]},{},[44]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkQ6L0xheWEvMi4zL3Jlc291cmNlcy9hcHAvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInNyYy9BZ2VuY3kvQWdlbmN5QmFzZUNvbnRyb2wudHMiLCJzcmMvQWdlbmN5L0FnZW5jeUluR2FtZS50cyIsInNyYy9BZ2VuY3kvQWdlbmN5TG9naW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeUxvdHRlcnkudHMiLCJzcmMvQWdlbmN5L0FnZW5jeU1haW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeVNraW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeVRyaWFsLnRzIiwic3JjL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZS50cyIsInNyYy9DRkcvQnVpbGRDRkcudHMiLCJzcmMvQ0ZHL0dhbWVDRkcudHMiLCJzcmMvQ0ZHL0xldmVsQ0ZHLnRzIiwic3JjL0NGRy9Mb3R0ZXJ5Q0ZHLnRzIiwic3JjL0NGRy9OcGNDRkcudHMiLCJzcmMvQ0ZHL1JvbGVDRkcudHMiLCJzcmMvQ29uZmlnL0Fzc2V0UGF0aC50cyIsInNyYy9Db25maWcvUmVjQ29uZmlncy50cyIsInNyYy9Db250cm9sL0Fzc2V0TWFuYWdlci50cyIsInNyYy9Db250cm9sL0F1ZGlvQ29udHJvbC50cyIsInNyYy9Db250cm9sL0Nvbm5lY3RDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvRGF0ZUNvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9HYW1lU3RhdGVDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvTGF5b3V0Q29udHJvbC50cyIsInNyYy9Db250cm9sL0xvY2FsRGF0YUNvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9QYW5lbEJhc2VDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9Qb29sTWFuYWdlci50cyIsInNyYy9Db250cm9sL1Jlc0RhdGFDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvUmVzb3VyY2VDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvU2NlbmVDb250cm9sLnRzIiwic3JjL0RhdGEvQ29tcG9uZW50RXZlbnREYXRhLnRzIiwic3JjL0RhdGEvRGF0YUluZm9CYXNlLnRzIiwic3JjL0RhdGEvTG9jYWxEYXRhLnRzIiwic3JjL0RhdGEvUm9sZURhdGEudHMiLCJzcmMvRGF0YS9Ta2luRGF0YS50cyIsInNyYy9EYXRhL1VzZXJEYXRhSW5mby50cyIsInNyYy9EYXRhL1VzZXJJbmZvRXZlbnQudHMiLCJzcmMvR2FtZUNvbnRlbnRzLnRzIiwic3JjL0dhbWUvQ2FtZXJhTWFuYWdlci50cyIsInNyYy9HYW1lL05wY1NjcmlwdC50cyIsInNyYy9HYW1lL1BsYXllci50cyIsInNyYy9HbG9iYWwudHMiLCJzcmMvR2xvYmFsV2FpdGluZy50cyIsInNyYy9Kb3lzdGlja01vZHVsZS50cyIsInNyYy9NYWluLnRzIiwic3JjL1ByZWZhYkNvbnRyb2wvQ2hhcmFjdGVyUG9vbC50cyIsInNyYy9QcmVmYWJDb250cm9sL0NoYXJhY3RlclN0YXRlLnRzIiwic3JjL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2wudHMiLCJzcmMvUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpYy50cyIsInNyYy9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyLnRzIiwic3JjL1B1c2gvQmFvS3VhbkdhbWVWaWV3LnRzIiwic3JjL1B1c2gvQ2hvdXRpUGFuVmlldy50cyIsInNyYy9QdXNoL0NwYURvd25zVmlldy50cyIsInNyYy9QdXNoL0NwYUV2ZW50LnRzIiwic3JjL1B1c2gvQ3BhSXRlbS50cyIsInNyYy9QdXNoL1JlY29tbWVuZFZpZXcudHMiLCJzcmMvUHVzaC9TaGl3YW50dWlqaWFuVmlldy50cyIsInNyYy9QdXNoL1R1aWppYW5WaWV3LnRzIiwic3JjL1RpbWUvVGltZVV0aWxzLnRzIiwic3JjL1RpbWUvVGltZXJTZXJ2aWNlLnRzIiwic3JjL1RpbWUvVGltZXNUYW1wZXIudHMiLCJzcmMvVmlldy9Db21wbGV0ZVBhbmVsLnRzIiwic3JjL1ZpZXcvRWdnUGFuZWwudHMiLCJzcmMvVmlldy9HaWZ0Vmlldy50cyIsInNyYy9WaWV3L0dsb2JhbFRpcFBhbmVsLnRzIiwic3JjL1ZpZXcvTG9hZGluZ1BhbmVsLnRzIiwic3JjL1ZpZXcvTG90dGVyeVBhbmVsLnRzIiwic3JjL1ZpZXcvTWFpblBhbmVsLnRzIiwic3JjL1ZpZXcvU2tpblBhbmVsLnRzIiwic3JjL1ZpZXcvVHJpYWxQYW5lbC50cyIsInNyYy9WaWV3L1ZpZXdNYW5hZ2VyLnRzIiwic3JjL1dYU0RLL0ZZSERfU2RrLnRzIiwic3JjL1dYU0RLL0d1YW5nR2FvLnRzIiwic3JjL1dYU0RLL05ldHdvcmtNYW5hZ2VyLnRzIiwic3JjL1dYU0RLL1BsYXRmcm9tVHlwZS50cyIsInNyYy9XWFNESy9QbGF5ZXJBY2NvdW50LnRzIiwic3JjL1dYU0RLL1JlY29yZE1hbmFnZXIudHMiLCJzcmMvV1hTREsvU2RrLnRzIiwic3JjL1dYU0RLL1NlcnZlclNvY2tldC50cyIsInNyYy9XWFNESy9Tb2NrZXROb2ZpZnkudHMiLCJzcmMvV1hTREsvV0VDSEFURVZFTlQudHMiLCJzcmMvV1hTREsvV1hHYW1lUGxhdGZvcm0udHMiLCJzcmMvV1hTREsvcGluZ3RhaXV0aWxzLnRzIiwic3JjL1dYU0RLL3R0YWQudHMiLCJzcmMvdXRpbHMvRGlzUGF0Y2hlck9uLnRzIiwic3JjL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyLnRzIiwic3JjL3V0aWxzL0dhbWVTdGF0ZS50cyIsInNyYy91dGlscy9HYW1lVXRpbHMudHMiLCJzcmMvdXRpbHMvR2xvYmFsVGlwLnRzIiwic3JjL3V0aWxzL0xFdmVudC50cyIsInNyYy91dGlscy9MYXlPVVQudHMiLCJzcmMvdXRpbHMvU2luZ2xldG9uLnRzIiwic3JjL3V0aWxzL1NraW5JdGVtLnRzIiwic3JjL3V0aWxzL1ZpZXdBY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkEsNERBQXlEO0FBQ3pELGdFQUErRDtBQUMvRCxnREFBNkM7QUFDN0Msc0RBQW1EO0FBQ25ELDZDQUEwQztBQUUxQzs7RUFFRTtBQUNGO0lBQXVDLHFDQUFTO0lBTTVDO1FBQUEsWUFDSSxpQkFBTyxTQUdWO1FBRkcsS0FBSSxDQUFDLFdBQVcsR0FBRyx5QkFBVyxDQUFDLFFBQVEsQ0FBQztRQUN4QyxLQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0lBQ3BCLENBQUM7SUFDUyxvQ0FBUSxHQUFsQjtJQUdBLENBQUM7SUFFRCxnQkFBZ0I7SUFDUix5Q0FBYSxHQUFyQjtRQUNJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUk7UUFDSixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxPQUFPO1FBQ1AsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRixLQUFLO1FBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEksS0FBSztRQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkQsTUFBTTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRyxNQUFNO1FBQ04sSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLElBQUk7UUFDSixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEQsS0FBSztRQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNELGNBQWM7UUFDZCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFF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QyxJQUFJLEVBQUU7UUFDeEMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsY0FBYyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxTQUFTLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUU7UUFDN0MsV0FBVyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDMUMsZUFBZSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDOUMsVUFBVSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDekMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7S0FDMUMsQ0FBQztJQTJOUCxrQkFBQztDQWxURCxBQWtUQyxJQUFBO0FBbFRZLGtDQUFXOzs7O0FDSHhCLGtFQUErRDtBQUMvRCx1Q0FB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LENBQUM7U0FDbkM7UUFDRCxtQkFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELG9DQUFZLEdBQVo7UUFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELG9DQUFZLEdBQVo7UUFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVTLGlDQUFTLEdBQW5CO1FBRUksSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsS0FBSyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFFLENBQUM7UUFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsS0FBSyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFFLENBQUM7UUFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsU0FBUyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsS0FBSyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsS0FBSyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsYUFBYSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMs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QUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hJLEtBQUs7UUFDTCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU07UUFDTixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEcsTUFBTTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRSxJQUFJO1FBQ0osSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELEtBQUs7UUFDTCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRCxjQUFjO1FBQ2QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMs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LEdBQVUsZ0NBQWdDLENBQUM7SUFFaEY7O09BRUc7SUFDSSwwQkFBZSxHQUFVLGlCQUFpQixDQUFDO0lBK0JsRCxrREFBa0Q7SUFHbEQ7O09BRUc7SUFDSSxxQ0FBMEIsR0FBUSw0QkFBNEIsQ0FBQztJQUN0RTs7T0FFRztJQUNJLHVDQUE0QixHQUFVLDhCQUE4QixDQUFDO0lBRTVFOztPQUVHO0lBQ0ksdUNBQTRCLEdBQVEsOEJBQThCLENBQUM7SUFDMUU7O09BRUc7SUFDSSxtQ0FBd0IsR0FBUSwwQkFBMEIsQ0FBQztJQUt0RSxpQkFBQztDQWhHRCxBQWdHQyxJQUFBO0FBaEdZLGdDQUFVIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxuKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsImltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7U2luZ2xldG9ufSBmcm9tIFwiLi4vdXRpbHMvU2luZ2xldG9uXCI7XHJcbmltcG9ydCB7U2VydmVyU29ja2V0fSBmcm9tIFwiLi4vV1hTREsvU2VydmVyU29ja2V0XCI7XHJcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBBZ2VuY3lCYXNlQ29udHJvbCBleHRlbmRzIFNpbmdsZXRvblxyXG57XHJcbiAgICBwcml2YXRlIF9vYmplY3RQb29sOiBQYW5lbFJlc0RpYztcclxuXHJcbiAgICBwcml2YXRlIHNwOkxheWEuU3ByaXRlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLl9vYmplY3RQb29sID0gUGFuZWxSZXNEaWMuSW5zdGFuY2U7XHJcbiAgICAgICAgdGhpcy5pbml0U2VsZigpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGluaXRTZWxmKCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKua3t+a3hiAqL1xyXG4gICAgcHJpdmF0ZSBkcmF3U29tZXRoaW5nKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3AgPSBuZXcgTGF5YS5TcHJpdGUoKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMuc3ApO1xyXG4gICAgICAgIC8v55S757q/XHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3TGluZSgxMCwgNTgsIDE0NiwgNTgsIFwiI2ZmMDAwMFwiLCAzKTtcclxuICAgICAgICAvL+eUu+i/nue7reebtOe6v1xyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0xpbmVzKDE3NiwgNTgsIFswLCAwLCAzOSwgLTUwLCA3OCwgMCwgMTE3LCA1MCwgMTU2LCAwXSwgXCIjZmYwMDAwXCIsIDUpO1xyXG4gICAgICAgIC8v55S75puy57q/XHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3Q3VydmVzKDM1MiwgNTgsIFswLCAwLCAxOSwgLTEwMCwgMzksIDAsIDU4LCAxMDAsIDc4LCAwLCA5NywgLTEwMCwgMTE3LCAwLCAxMzYsIDEwMCwgMTU2LCAwXSwgXCIjZmYwMDAwXCIsIDUpO1xyXG4gICAgICAgIC8v55S755+p5b2iXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UmVjdCgxMCwgMTY2LCAxNjYsIDkwLCBcIiNmZmZmMDBcIik7XHJcbiAgICAgICAgLy/nlLvlpJrovrnlvaJcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQb2x5KDI2NCwgMTY2LCBbMCwgMCwgNjAsIDAsIDc4LjQ4LCA1NywgMzAsIDkzLjQ4LCAtMTguNDgsIDU3XSwgXCIjZmZmZjAwXCIpO1xyXG4gICAgICAgIC8v55S75LiJ6KeS5b2iXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UG9seSg0MDAsIDE2NiwgWzAsIDEwMCwgNTAsIDAsIDEwMCwgMTAwXSwgXCIjZmZmZjAwXCIpO1xyXG4gICAgICAgIC8v55S75ZyGXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3Q2lyY2xlKDk4LCAzMzIsIDUwLCBcIiMwMGZmZmZcIik7XHJcbiAgICAgICAgLy/nlLvmiYflvaJcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQaWUoMjQwLCAyOTAsIDEwMCwgMTAsIDYwLCBcIiMwMGZmZmZcIik7XHJcbiAgICAgICAgLy/nu5jliLblnIbop5Lnn6nlvaLvvIzoh6rlrprkuYnot6/lvoRcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQYXRoKDQwMCwgMzEwLCBbW1wibW92ZVRvXCIsIDUsIDBdLCBbXCJsaW5lVG9cIiwgMTA1LCAwXSwgW1wiYXJjVG9cIiwgMTEwLCAwLCAxMTAsIDUsIDVdLCBbXCJsaW5lVG9cIiwgMTEwLCA1NV0sIFtcImFyY1RvXCIsIDExMCwgNjAsIDEwNSwgNjAsIDVdLCBbXCJsaW5lVG9cIiwgNSwgNjBdLCBbXCJhcmNUb1wiLCAwLCA2MCwgMCwgNTUsIDVdLCBbXCJsaW5lVG9cIiwgMCwgNV0sIFtcImFyY1RvXCIsIDAsIDAsIDUsIDAsIDVdLCBbXCJjbG9zZVBhdGhcIl1dLCB7ZmlsbFN0eWxlOiBcIiMwMGZmZmZcIn0pO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKiogKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqICDms6jlhozlhajlsYDkvqblkKzkuovku7ZcclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgRGlzT24oIHR5cGU6c3RyaW5nLCBjYWxsYmFja29iajphbnksIGNhbGxiYWNrSGFuZGxlcjpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrb2JqLCBjYWxsYmFja0hhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqICDmipvlh7rlhajlsYDkuovku7YgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBEaXNUcmlnZ2VyKHR5cGU6c3RyaW5nLCBkYXRhOmFueSA9IG51bGwpOnZvaWRcclxuXHR7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggdHlwZSwgZGF0YSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5YWo5bGA5L6m5ZCs5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBEaXNPZmYodHlwZTpzdHJpbmcsY2FsbGJhY2tvYmo6YW55LCBjYWxsYmFja0hhbmRsZXI6RnVuY3Rpb24pOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrb2JqLCBjYWxsYmFja0hhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgc2V0dXAoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHRleHRCb3g6TGF5YS5TcHJpdGUgPSBuZXcgTGF5YS5TcHJpdGUoKTtcclxuXHJcbiAgICAgICAgLy8g6ZqP5py65pGG5pS+5paH5pysXHJcbiAgICAgICAgdmFyIHRleHQ6TGF5YS5UZXh0O1xyXG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCAxMDAwOyBpKyspIHtcclxuICAgICAgICAgICAgdGV4dCA9IG5ldyBMYXlhLlRleHQoKTtcclxuICAgICAgICAgICAgdGV4dC5mb250U2l6ZSA9IDIwO1xyXG4gICAgICAgICAgICB0ZXh0LnRleHQgPSAoTWF0aC5yYW5kb20oKSAqIDEwMCkudG9GaXhlZCgwKTtcclxuICAgICAgICAgICAgdGV4dC5yb3RhdGlvbiA9IE1hdGgucmFuZG9tKCkgKiAzNjA7XHJcbiAgICAgICAgICAgIHRleHQuY29sb3IgPSBcIiNDQ0NDQ0NcIjtcclxuXHJcbiAgICAgICAgICAgIHRleHQueCA9IE1hdGgucmFuZG9tKCkgKiBMYXlhLnN0YWdlLndpZHRoO1xyXG4gICAgICAgICAgICB0ZXh0LnkgPSBNYXRoLnJhbmRvbSgpICogTGF5YS5zdGFnZS5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICB0ZXh0Qm94LmFkZENoaWxkKHRleHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL+e8k+WtmOS4uumdmeaAgeWbvuWDj1xyXG4gICAgICAgIHRleHRCb3guY2FjaGVBcyA9IFwiYml0bWFwXCI7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGV4dEJveCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqICoqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuICAgIHByb3RlY3RlZCBnZXRTaW5nbGVUb24ocmVmOmFueSk6YW55XHJcblx0e1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vYmplY3RQb29sLmdldFNpbmdsZVRvbihyZWYpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZW5kTWVzc2FnZSggYWN0OnN0cmluZyxkYXRhOmFueSA9IG51bGwsaXNTaG93V2FpdDpib29sZWFuID0gdHJ1ZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBTZXJ2ZXJTb2NrZXQuSW5zdGFuY2Uuc2VuZE1lc3NhZ2UoYWN0LCBkYXRhLCBpc1Nob3dXYWl0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJvbGVEYXRhOlJvbGVEYXRhO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgUm9sZURhdGEoKTpSb2xlRGF0YVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5yb2xlRGF0YSl7XHJcbiAgICAgICAgICAgIHRoaXMucm9sZURhdGEgPSBSb2xlRGF0YS5JbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm9sZURhdGE7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Q29tcGxldGVQYW5lbH0gZnJvbSBcIi4uL1ZpZXcvQ29tcGxldGVQYW5lbFwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQge1NjZW5lQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvU2NlbmVDb250cm9sXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgUFJPVE9DT0xTLCBOZXR3b3JrTWFuYWdlciB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IHtBZ2VuY3lUcmlhbH0gZnJvbSBcIi4vQWdlbmN5VHJpYWxcIjtcclxuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcclxuaW1wb3J0IEZyaWVuZEludml0ZVZpZXcgZnJvbSBcIi4uL1B1c2gvRnJpZW5kSW52aXRlVmlld1wiO1xyXG5pbXBvcnQgR2lmdFZpZXcgZnJvbSBcIi4uL1ZpZXcvR2lmdFZpZXdcIjtcclxuaW1wb3J0IENob3V0aVBhblZpZXcgZnJvbSBcIi4uL1B1c2gvQ2hvdXRpUGFuVmlld1wiO1xyXG5pbXBvcnQgeyBSZWNvcmRNYW5hZ2VyIH0gZnJvbSBcIi4uL1dYU0RLL1JlY29yZE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgTWFpblBhbmVsIH0gZnJvbSBcIi4uL1ZpZXcvTWFpblBhbmVsXCI7XHJcblxyXG5leHBvcnQgIGNsYXNzIEFnZW5jeUluR2FtZSBleHRlbmRzIEFnZW5jeUJhc2VDb250cm9sIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5SW5HYW1lXCI7XHJcbiAgICBzdGF0aWMgZ2FtZW51bTpudW1iZXIgPSAwO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRTZWxmKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuRGlzT24oIEdhbWVTdGF0ZS5lbmQsdGhpcyx0aGlzLmVuZGdhbWVIYW5kbGVyICk7XHJcbiAgICAgICAgdGhpcy5EaXNPbihHYW1lU3RhdGUucmV2aXZlLHRoaXMsdGhpcy5SZXZpdmVnYW1lSGFuZGxlcik7XHJcbiAgICAgICAgdGhpcy5EaXNPbihHYW1lU3RhdGUubG9zZSx0aGlzLHRoaXMuTG9zZWdhbWVIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIC8qKuWkjea0u+eVjOmdoiAqL1xyXG4gICAgcHJpdmF0ZSBSZXZpdmVnYW1lSGFuZGxlcigpOnZvaWR7XHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDEwMDAsdGhpcyx0aGlzLnJldml2ZVZpZXcpO1xyXG4gICAgfVxyXG4gICAgLyoq5aSx6LSl55WM6Z2iICovXHJcbiAgICBwcml2YXRlIExvc2VnYW1lSGFuZGxlcigpOnZvaWR7XHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDEwMDAsdGhpcyx0aGlzLmxvc2VWaWV3KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgcmV2aXZlVmlldygpe1xyXG4gICAgICAgIFJlY29yZE1hbmFnZXIuSW5zdGFuY2UuUmVjb3JkU3RvcCgpO1xyXG4gICAgICAgIHZhciBub3dtaW5nY3ZpOm51bWJlciA9IEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2Uubm93TWluZ0NpO1xyXG4gICAgICAgIHZhciBnZXRHb2xkOm51bWJlciA9IDA7XHJcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLmiZPlvIDnu5PnrpfnlYzpnaIo5aSN5rS7KVwiKTtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENvbXBsZXRlUGFuZWwsZ2V0R29sZCApO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBsb3NlVmlldygpOnZvaWR7XHJcbiAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5SZWNvcmRTdG9wKCk7XHJcbiAgICAgICAgdmFyIG5vd21pbmdjdmk6bnVtYmVyID0gR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5ub3dNaW5nQ2k7XHJcbiAgICAgICAgdmFyIGdldEdvbGQ6bnVtYmVyID0gMDtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuaJk+W8gOe7k+eul+eVjOmdoijlpLHotKUpXCIpO1xyXG4gICAgICAgIHRoaXMuUmVjcm9wTGV2ZWxFbmQoIGZhbHNlICk7XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDb21wbGV0ZVBhbmVsLGdldEdvbGQgKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZW5kZ2FtZUhhbmRsZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5SZWNvcmRTdG9wKCk7XHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKCAxMDAwLHRoaXMsdGhpcy5zdGFydEVuZFZpZXcpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGFydEVuZFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5vd21pbmdjdmk6bnVtYmVyID0gR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5ub3dNaW5nQ2k7XHJcbiAgICAgICAgdmFyIGdldEdvbGQ6bnVtYmVyID0gMDtcclxuICAgICAgICBpZiggR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5lbmRHYW1lUGxheWVyQXJyLmxlbmd0aCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdldEdvbGQgPSB0aGlzLlJvbGVEYXRhLmxldmVsY2ZnLndpbkdvbGQ7XHJcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5omT5byA57uT566X55WM6Z2iKOa4uOaIj+iDnOWIqSlcIik7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjcm9wTGV2ZWxFbmQoIHRydWUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKCB0aGlzLlJvbGVEYXRhLmxldmVsY2ZnLmZhaWxHb2QgKTtcclxuICAgICAgICAgICAgZ2V0R29sZCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIE51bWJlcihhcnJbMF0pLE51bWJlcihhcnJbMV0pICk7XHJcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5omT5byA57uT566X55WM6Z2iKOa4uOaIj+Wksei0pSlcIik7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjcm9wTGV2ZWxFbmQoIGZhbHNlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ29tcGxldGVQYW5lbCxnZXRHb2xkICk7XHJcbiAgICAgICAgLy8gVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3LDIgKTtcclxuICAgIH1cclxuXHJcbiAgICBSZWNyb3BMZXZlbEVuZChfd2luOmJvb2xlYW4pXHJcbiAgICB7XHJcbiAgICAgICAgLy8gaWYoIUxheWEuQnJvd3Nlci5vbldlaVhpbilyZXR1cm47XHJcbiAgICAgICAgLy8gdmFyIHN0YWdlaWQgPSB0aGlzLlJvbGVEYXRhLkxldmVsSUQudG9TdHJpbmcoKTtcclxuICAgICAgICAvLyB2YXIgdXNlaWQgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLlVzZUlkO1xyXG4gICAgICAgIC8vIHZhciBzdGFnZW5hbWUgPSBcIuesrFwiICsgdGhpcy5Sb2xlRGF0YS5MZXZlbElEICsgXCLlhbNcIjtcclxuICAgICAgICAvLyBpZihfd2luKVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgV3hBcGkubGV2ZWxTdWNjZXNzKHN0YWdlaWQsc3RhZ2VuYW1lLHN0YWdlaWQpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICB2YXIgZXF1aXBpZCA9IHRoaXMuUm9sZURhdGEuQ2hhcmFjdGVySUQudG9TdHJpbmcoKTtcclxuICAgICAgICAvLyAgICAgdmFyIGNhcm5hbWUgPSB0aGlzLlJvbGVEYXRhLnJvbGVDZmcubmFtZTtcclxuICAgICAgICAvLyAgICAgV3hBcGkubGV2ZWxGYWlsKHN0YWdlaWQsc3RhZ2VuYW1lLHN0YWdlaWQsXCIwXCIsY2FybmFtZSk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXR1cm5tYWludmlldyh3aW4/KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHdpbiAmJiBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLldoaXRlVXNlcikge1xyXG4gICAgICAgICAgICBsZXQgcmFuID0gTWF0aC5yYW5kb20oKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLor6/op6blh6DnjofkuLotLS1cIiwgcmFuKTtcclxuICAgICAgICAgICAgaWYgKHJhbiA8PSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkVuZENoZWF0KSB7XHJcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoR2lmdFZpZXcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEdhbWVTdGF0ZS5mdWh1b2Npc2h1ID0gMTtcclxuICAgICAgICAgICAgR2FtZVN0YXRlLnJlY29yZHNjcmVlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIEdhbWVTdGF0ZS5pc2RpZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5DbG9zZUdhbWVPdmVyRWZmZWN0KCk7XHJcbiAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKENvbXBsZXRlUGFuZWwpO1xyXG4gICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoR2FtZVN0YXRlLnJldHVybk1haW5WaWV3KTtcclxuICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLlNob3dUaGVHYW1lU2NlbmUoKTtcclxuICAgICAgICAgICAgdmFyIGFnZW5jeXRyaWFsOiBBZ2VuY3lUcmlhbCA9IHRoaXMuZ2V0U2luZ2xlVG9uKEFnZW5jeVRyaWFsKTtcclxuICAgICAgICAgICAgaWYgKGFnZW5jeXRyaWFsLmlzc2hpeW9uZ2luZykgIHtcclxuICAgICAgICAgICAgICAgIFNjZW5lQ29udHJvbC5JbnN0YW5jZS5DcmVhdGVQbGF5ZXIodGhpcy5Sb2xlRGF0YS5yb2xlQ2ZnKTtcclxuICAgICAgICAgICAgICAgIGFnZW5jeXRyaWFsLmlzc2hpeW9uZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIEdhbWVTdGF0ZS5mdWh1b2Npc2h1ID0gMTtcclxuICAgICAgICAgICAgR2FtZVN0YXRlLnJlY29yZHNjcmVlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIEdhbWVTdGF0ZS5pc2RpZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5DbG9zZUdhbWVPdmVyRWZmZWN0KCk7XHJcbiAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKENvbXBsZXRlUGFuZWwpO1xyXG4gICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoR2FtZVN0YXRlLnJldHVybk1haW5WaWV3KTtcclxuICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLlNob3dUaGVHYW1lU2NlbmUoKTtcclxuICAgICAgICAgICAgdmFyIGFnZW5jeXRyaWFsOiBBZ2VuY3lUcmlhbCA9IHRoaXMuZ2V0U2luZ2xlVG9uKEFnZW5jeVRyaWFsKTtcclxuICAgICAgICAgICAgaWYgKGFnZW5jeXRyaWFsLmlzc2hpeW9uZ2luZykgIHtcclxuICAgICAgICAgICAgICAgIFNjZW5lQ29udHJvbC5JbnN0YW5jZS5DcmVhdGVQbGF5ZXIodGhpcy5Sb2xlRGF0YS5yb2xlQ2ZnKTtcclxuICAgICAgICAgICAgICAgIGFnZW5jeXRyaWFsLmlzc2hpeW9uZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKEdhbWVTdGF0ZS5HYW1lTnVtJTMgPT0gMCl7XHJcbiAgICAgICAgICAgIE1haW5QYW5lbC5pbnN0YW5jZS5za2luY2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/miZPlvIDlpb3lj4vpgoDor7fnlYzpnaJcclxuICAgICAgICAvLyBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoRnJpZW5kSW52aXRlVmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXJ0R2FtZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBBZ2VuY3lJbkdhbWUuZ2FtZW51bSArKztcclxuICAgICAgICB2YXIgc3RhZ2VpZCA9IHRoaXMuUm9sZURhdGEuZ2V0Tm93U2VydmVyTGV2ZWwoKS50b1N0cmluZygpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgdmFyIHN0YWdlbmFtZSA9IFwi56ysXCIgKyBzdGFnZWlkICsgXCLlhbNcIjtcclxuICAgICAgICB2YXIgdXNlaWQgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLlVzZUlkO1xyXG4gICAgICAgIFd4QXBpLmxldmVsU3RhcnQoc3RhZ2VpZCxzdGFnZW5hbWUsdXNlaWQpO1xyXG4gICAgICAgIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2Uuc3RhcnRHYW1lKCk7XHJcbiAgICB9XHJcbiAgIFxyXG59IiwiaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge0xvYWRpbmdQYW5lbH0gZnJvbSBcIi4uL1ZpZXcvTG9hZGluZ1BhbmVsXCI7XHJcblxyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5pbXBvcnQge1dFQ0hBVEVWRU5UfSBmcm9tIFwiLi4vV1hTREsvV0VDSEFURVZFTlRcIjtcclxuaW1wb3J0IHtBZ2VuY3lCYXNlQ29udHJvbH0gZnJvbSBcIi4vQWdlbmN5QmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtBZ2VuY3lNYWlufSBmcm9tIFwiLi9BZ2VuY3lNYWluXCI7XHJcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi9DRkcvUm9sZUNGR1wiO1xyXG5pbXBvcnQgTGV2ZWxDRkcgZnJvbSBcIi4uL0NGRy9MZXZlbENGR1wiO1xyXG5pbXBvcnQgQnVpbGRDRkcgZnJvbSBcIi4uL0NGRy9CdWlsZENGR1wiO1xyXG5pbXBvcnQgTnBjQ0ZHIGZyb20gXCIuLi9DRkcvTnBjQ0ZHXCI7XHJcbmltcG9ydCBHYW1lQ0ZHIGZyb20gXCIuLi9DRkcvR2FtZUNGR1wiO1xyXG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuL0FnZW5jeVNraW5cIjtcclxuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi4vV1hTREsvU2RrXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlciB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBNYWluQ29uZmlnIH0gZnJvbSBcIi4uL01haW5Db25maWdcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgTG90dGVyeUNGRyBmcm9tIFwiLi4vQ0ZHL0xvdHRlcnlDRkdcIjtcclxuaW1wb3J0IHtBZ2VuY3lMb3R0ZXJ5fSBmcm9tIFwiLi9BZ2VuY3lMb3R0ZXJ5XCI7XHJcbmltcG9ydCB7IEZZSERfU2RrIH0gZnJvbSBcIi4uL1dYU0RLL0ZZSERfU2RrXCI7XHJcbmltcG9ydCB7IFNoYXJlVXRpbCB9IGZyb20gXCIuLi9XWFNESy9TaGFyZVV0aWxcIjtcclxuaW1wb3J0IHsgR3VhbmdHYW8gfSBmcm9tIFwiLi4vV1hTREsvR3VhbmdHYW9cIjtcclxuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi9XWFNESy90dGFkXCI7XHJcbmltcG9ydCB7IEFzc2V0TWFuYWdlciB9IGZyb20gXCIuLi9Db250cm9sL0Fzc2V0TWFuYWdlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW5jeUxvZ2luIGV4dGVuZHMgQWdlbmN5QmFzZUNvbnRyb2wgXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJBZ2VuY3lMb2dpblwiO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFNlbGYoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5EaXNPbiggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfbG9naW5TdWNjZWVkLHRoaXMsdGhpcy5TdWNjZXNzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIExvZ2luKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggTG9hZGluZ1BhbmVsICk7XHJcbiAgICAgICAgdGhpcy5sb2dpbnByb2dyZXNzKDApO1xyXG4gICAgICAgIC8vIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbilcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuTG9naW5XWCgpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICB0aGlzLkxvZ2luTG9jYWwoKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcbiAgICBMb2dpbldYKClcclxuICAgIHtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuW8gOWni+W+ruS/oeeZu+W9lVwiKTtcclxuICAgICAgICBXeEFwaS5XWExvZ2luKChyZXMpID0+IFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzICE9IFwiZXJyb3JcIikgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLlvq7kv6HnmbvlvZXmiJDlip9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJocGxvZ2luOlwiICsgXCJxdWVyeWNoYW5uZWwtPlwiKyBXeEFwaS5xdWVyeWNoYW5uZWwgKyBcIiByZWZlcnJlckluZm9hcHBJZC0+XCIgKyBXeEFwaS5yZWZlcnJlckluZm9hcHBJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb2dpbkxvY2FsKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5b6u5L+h55m75b2V5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTG9naW5XWCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBMb2dpbkxvY2FsKHJlcyA9IG51bGwpIFxyXG4gICAge1xyXG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5byA5aeL5pys5Zyw55m75b2VXCIpO1xyXG4gICAgICAgIGlmKHJlcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5ldyBQbGF5ZXJBY2NvdW50KHJlcy5jb2RlLCBcIlwiLCBcIlwiLCAwLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBXeEFwaS5zaGFyZU9wZW5JZCwgV3hBcGkuc2hhcmVPcGVuSWQsR2xvYmFsLmdhbWVWZXJzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgTmV0d29ya01hbmFnZXIuSW5zdGFuY2UubG9naW4obnVsbCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLkxvZ2luQ29tcGxldGUpLCBudWxsKTtcclxuICAgICAgICAvL3RoaXMuTG9hZFNicCgpO1xyXG4gICAgfVxyXG5cclxuICAgIExvZ2luQ29tcGxldGUoKSBcclxuICAgIHtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuacrOWcsOacjeWKoeWZqOeZu+W9leWujOaIkC4uLlwiKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBTaGFyZVV0aWwuSW5zdGFuY2Uub25SZWdpc3RlcigpO1xyXG4gICAgICAgIC8vIEd1YW5nR2FvLkluaXRWaWRlbygpO1xyXG4gICAgICAgIFd4QXBpLmFsZFNlbmRPcGVuaWQoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5vcGVuaWQpO1xyXG4gICAgIFxyXG4gICAgICAgIHRoaXMuU3VjY2VzcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9naW5wcm9ncmVzcyggdmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBsb2FkaW5nUGFuZWw6TG9hZGluZ1BhbmVsID0gVmlld01hbmFnZXIuSW5zdGFuY2UuZ2V0VmlldyggTG9hZGluZ1BhbmVsICk7XHJcbiAgICAgICAgaWYoIGxvYWRpbmdQYW5lbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsb2FkaW5nUGFuZWwuc2hvd1dvcmQoIHZhbHVlICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgU3VjY2VzcygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLlJlc29sdmVEYXRhKCApO1xyXG4gICAgICAgIHRoaXMuaW5pdERhdGEoKTtcclxuICAgICAgICB0aGlzLlN0YXJ0TWFpbigpO1xyXG4gICAgICAgIHR0YWQuSW5pdEFEKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBTdGFydE1haW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coIFwi5b2T5YmN6YWN572u6KGo5oC75YWz5Y2h77yaXCIsTGV2ZWxDRkcudmVjLmxlbmd0aCApO1xyXG4gICAgICAgIFxyXG4gICAgICAgICggdGhpcy5nZXRTaW5nbGVUb24oIEFnZW5jeU1haW4gKSBhcyBBZ2VuY3lNYWluICkuU3RhcnRNYWluKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjb25maWdDbGFzczphbnkgPVxyXG4gICAge1xyXG4gICAgICAgIFJvbGVDRkc6Um9sZUNGRyxcclxuICAgICAgICBMZXZlbENGRzpMZXZlbENGRyxcclxuICAgICAgICBCdWlsZENGRzpCdWlsZENGRyxcclxuICAgICAgICBOcGNDRkc6TnBjQ0ZHLFxyXG4gICAgICAgIEdhbWVDRkc6R2FtZUNGRyxcclxuICAgICAgICBMb3R0ZXJ5Q0ZHOkxvdHRlcnlDRkdcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOino+aekOmFjee9ruaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFJlc29sdmVEYXRhKCk6Ym9vbGVhbiBcclxuICAgIHtcclxuICAgICAgICBsZXQgYnl0ZURhdGE6YW55ID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5ub3dDb25maWcuZ2FtZUNvbmZpZ1swXS5jb25maWc7XHJcbiAgICAgICAgaWYoIGJ5dGVEYXRhICYmIGJ5dGVEYXRhICE9IFwiXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gYnl0ZURhdGEuc3BsaXQoXCIlZmlsZSVcIik7XHJcbiAgICAgICAgICAgIHZhciBpOm51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgZm9yKCBpPTA7aTxudW1zO2krKyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtYXJyOkFycmF5PHN0cmluZz4gPSBhcnJbaV0uc3BsaXQoXCIlY2ZnJVwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBjbGE6IGFueSA9IEFnZW5jeUxvZ2luLmNvbmZpZ0NsYXNzW2l0ZW1hcnJbMF1dO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNsYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsYS5pbml0Q2ZnKGl0ZW1hcnJbMV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMlua4uOaIj+aVsOaNrlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXREYXRhKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgICggdGhpcy5nZXRTaW5nbGVUb24oIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5pbml0KCk7XHJcbiAgICAgICAgKCB0aGlzLmdldFNpbmdsZVRvbiggQWdlbmN5U2tpbiApIGFzIEFnZW5jeVNraW4gKS5pbml0KCk7XHJcbiAgICAgICAgKCB0aGlzLmdldFNpbmdsZVRvbiggQWdlbmN5TG90dGVyeSApIGFzIEFnZW5jeUxvdHRlcnkgKS5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICBcclxufSIsImltcG9ydCB7QWdlbmN5QmFzZUNvbnRyb2x9IGZyb20gXCIuL0FnZW5jeUJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHtMb3R0ZXJ5UGFuZWx9IGZyb20gXCIuLi9WaWV3L0xvdHRlcnlQYW5lbFwiO1xyXG5pbXBvcnQgTG90dGVyeUNGRyBmcm9tIFwiLi4vQ0ZHL0xvdHRlcnlDRkdcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi9DRkcvUm9sZUNGR1wiO1xyXG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuL0FnZW5jeVNraW5cIjtcclxuXHJcbmV4cG9ydCAgY2xhc3MgQWdlbmN5TG90dGVyeSBleHRlbmRzIEFnZW5jeUJhc2VDb250cm9sIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5TG90dGVyeVwiO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZW5WaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggTG90dGVyeVBhbmVsICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQW5pbWF0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBhbmk6TGF5YS5BbmltYXRpb24gPSBuZXcgTGF5YS5BbmltYXRpb24oKTtcclxuICAgICAgICAvLyBhbmkubG9hZEF0bGFzKHRoaXMuQW5pQ29uZlBhdGgpOyAvLyDliqDovb3lm77pm4bliqjnlLtcclxuICAgICAgICBhbmkuaW50ZXJ2YWwgPSAzMDsgLy8g6K6+572u5pKt5pS+6Ze06ZqU77yI5Y2V5L2N77ya5q+r56eS77yJXHJcbiAgICAgICAgYW5pLmluZGV4ID0gMTsgLy8g5b2T5YmN5pKt5pS+57Si5byVXHJcbiAgICAgICAgYW5pLnBsYXkoKTsgLy8g5pKt5pS+5Zu+6ZuG5Yqo55S7XHJcblxyXG4gICAgICAgIC8vIOiOt+WPluWKqOeUu+eahOi+ueeVjOS/oeaBr1xyXG4gICAgICAgIHZhciBib3VuZHM6TGF5YS5SZWN0YW5nbGUgPSBhbmkuZ2V0R3JhcGhpY0JvdW5kcygpO1xyXG4gICAgICAgIGFuaS5waXZvdChib3VuZHMud2lkdGggLyAyLCBib3VuZHMuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIGFuaS5wb3MoTGF5YS5zdGFnZS53aWR0aCAvIDIsIExheWEuc3RhZ2UuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoYW5pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1BbmlQYXRoOnN0cmluZztcclxuICAgIHByaXZhdGUgbVN0YXJ0WDpudW1iZXIgPSA0MDA7XHJcbiAgICBwcml2YXRlIG1TdGFydFk6bnVtYmVyID0gNTAwO1xyXG4gICAgcHJpdmF0ZSBtRmFjdG9yeTpMYXlhLlRlbXBsZXQ7XHJcbiAgICBwcml2YXRlIG1BY3Rpb25JbmRleDpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBtQ3VyckluZGV4Om51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIG1Bcm1hdHVyZTpMYXlhLlNrZWxldG9uO1xyXG4gICAgcHJpdmF0ZSBtQ3VyclNraW5JbmRleDpudW1iZXIgPSAwO1xyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgcHVibGljIGdldHJld2FyZCggY2ZnOkxvdHRlcnlDRkcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGNmZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzd2l0Y2goIGNmZy50eXBlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUm9sZURhdGEuTW9uZXkgKz0gTnVtYmVyKGNmZy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLmga3llpzojrflvpdcIiArIGNmZy52YWx1ZSArIFwi6YeR5biB77yBXCIgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByb2xlY2ZnOlJvbGVDRkcgPSBSb2xlQ0ZHLmRpY3RbIGNmZy52YWx1ZSBdO1xyXG4gICAgICAgICAgICAgICAgICAgICggdGhpcy5nZXRTaW5nbGVUb24oIEFnZW5jeVNraW4gKSBhcyBBZ2VuY3lTa2luICkuc2V0Um9sZVN0YXRlKCByb2xlY2ZnLDEgKTtcclxuICAgICAgICAgICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuaBreWWnOiOt+W+l+inkuiJslwiICsgcm9sZWNmZy5yb2xlbmFtZSApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRSZXdhcmQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZGljdHM6QXJyYXk8TG90dGVyeUNGRz4gPSBMb3R0ZXJ5Q0ZHLnZlYztcclxuICAgICAgICB2YXIgbWF4TnVtOm51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGNmZzpMb3R0ZXJ5Q0ZHO1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yKCBpPTA7aTxkaWN0cy5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNmZyA9IGRpY3RzW2ldO1xyXG4gICAgICAgICAgICBtYXhOdW0gKz0gY2ZnLndlaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHNvcmR2YWx1ZTpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAxLG1heE51bSApO1xyXG4gICAgICAgIHZhciB0b3RhbG51bTpudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IGRpY3RzLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2ZnID0gZGljdHNbaV07XHJcbiAgICAgICAgICAgIHRvdGFsbnVtICs9IGNmZy53ZWlnaHQ7XHJcbiAgICAgICAgICAgIGlmKCB0b3RhbG51bSA+PSBzb3JkdmFsdWUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwdWJsaWMgc3RhcnRGdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tQW5pUGF0aCA9IFwicmVzL3NwaW5lL3NwaW5lUmVzMS9kcmFnb24uc2tcIjtcclxuICAgICAgICAvLyB0aGlzLm1GYWN0b3J5ID0gbmV3IFRlbXBsZXQoKTtcclxuICAgICAgICAvLyB0aGlzLm1GYWN0b3J5Lm9uKEV2ZW50LkNPTVBMRVRFLCB0aGlzLCB0aGlzLnBhcnNlQ29tcGxldGUpO1xyXG4gICAgICAgIC8vIHRoaXMubUZhY3Rvcnkub24oRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMub25FcnJvcik7XHJcbiAgICAgICAgLy8gdGhpcy5tRmFjdG9yeS5sb2FkQW5pKHRoaXMubUFuaVBhdGgpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBvbkVycm9yKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3JcIik7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHBhcnNlQ29tcGxldGUoKTp2b2lkIHtcclxuICAgICAgICAvL+WIm+W7uuaooeW8j+S4ujHvvIzlj6/ku6XlkK/nlKjmjaLoo4VcclxuICAgICAgICB0aGlzLm1Bcm1hdHVyZSA9dGhpcy5tRmFjdG9yeS5idWlsZEFybWF0dXJlKDEpO1xyXG4gICAgICAgIHRoaXMubUFybWF0dXJlLnggPSB0aGlzLm1TdGFydFg7XHJcbiAgICAgICAgdGhpcy5tQXJtYXR1cmUueSA9IHRoaXMubVN0YXJ0WTtcclxuICAgICAgICB0aGlzLm1Bcm1hdHVyZS5zY2FsZSgwLjUsIDAuNSk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLm1Bcm1hdHVyZSk7XHJcbiAgICAgICAgLy8gdGhpcy5tQXJtYXR1cmUub24oRXZlbnQuU1RPUFBFRCwgdGhpcywgdGhpcy5jb21wbGV0ZUhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMucGxheSgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcml2YXRlIGNvbXBsZXRlSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnBsYXkoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBwbGF5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubUN1cnJJbmRleCsrO1xyXG4gICAgICAgIGlmICh0aGlzLm1DdXJySW5kZXggPj0gdGhpcy5tQXJtYXR1cmUuZ2V0QW5pbU51bSgpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tQ3VyckluZGV4ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tQXJtYXR1cmUucGxheSh0aGlzLm1DdXJySW5kZXgsZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbn0iLCJpbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUmVzb3VyY2VDb250cm9sXCI7XHJcbmltcG9ydCB7TG9hZGluZ1BhbmVsfSBmcm9tIFwiLi4vVmlldy9Mb2FkaW5nUGFuZWxcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQge01haW5QYW5lbH0gZnJvbSBcIi4uL1ZpZXcvTWFpblBhbmVsXCI7XHJcbmltcG9ydCB7U2NlbmVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9TY2VuZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9HYW1lU3RhdGVDb250cm9sXCI7XHJcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHtXWEdhbWVQbGF0Zm9ybX0gZnJvbSBcIi4uL1dYU0RLL1dYR2FtZVBsYXRmb3JtXCI7XHJcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi9DRkcvUm9sZUNGR1wiO1xyXG5pbXBvcnQgTnBjQ0ZHIGZyb20gXCIuLi9DRkcvTnBjQ0ZHXCI7XHJcbmltcG9ydCB7TG9jYWxEYXRhQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvTG9jYWxEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50LCBBY2NvdW50VXNlciB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi4vV1hTREsvTmV0d29ya01hbmFnZXJcIjtcclxuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcclxuaW1wb3J0IEdpZnRWaWV3IGZyb20gXCIuLi9WaWV3L0dpZnRWaWV3XCI7XHJcbmltcG9ydCB7IEFzc2V0TWFuYWdlciB9IGZyb20gXCIuLi9Db250cm9sL0Fzc2V0TWFuYWdlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW5jeU1haW4gZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkFnZW5jeU1haW5cIjtcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbG9hZGpkOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9hbGxqZDpudW1iZXIgPSAwO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFNlbGYoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBTdGFydE1haW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbG9hZGpkID0gMDtcclxuICAgICAgICB0aGlzLl9hbGxqZCA9IDIwO1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmxvYWRTdWJwYWNrYWdlKCBcInN1YnBhY2thZ2VcIix0aGlzLHRoaXMuc3ViMWNvbXBsZXRlLHRoaXMubG9hZHByb2dyZXNzLG51bGwgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN1YjFjb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9sb2FkamQgPSAyMDtcclxuICAgICAgICB0aGlzLl9hbGxqZCA9IDMwO1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmxvYWRTdWJwYWNrYWdlKCBcInN1YnBhY2thZ2UxXCIsdGhpcyx0aGlzLlN1YnBhY2thZ2VPdmVyLHRoaXMubG9hZHByb2dyZXNzLG51bGwgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgc2NlbmU6TGF5YS5TY2VuZTNEO1xyXG4gICAgcHVibGljIG9uQ29tcGxldGUoKSB7XHJcblx0XHQvL+a3u+WKoOeItue6p+eMtOWtkFxyXG5cdFx0dmFyIGR1ZGUgPSB0aGlzLnNjZW5lLmFkZENoaWxkKExheWEuTG9hZGVyLmdldFJlcyhcInJlcy90aHJlZURpbWVuL3NraW5Nb2RlbC9kdWRlL2R1ZGUubGhcIikpIGFzIExheWEuU3ByaXRlM0Q7XHJcblx0XHQvL+e8qeaUvlxyXG5cdFx0dmFyIHNjYWxlID0gbmV3IExheWEuVmVjdG9yMygwLjEsIDAuMSwgMC4xKTtcclxuXHRcdGR1ZGUudHJhbnNmb3JtLmxvY2FsU2NhbGUgPSBzY2FsZTtcclxuXHRcdGR1ZGUudHJhbnNmb3JtLnJvdGF0ZShuZXcgTGF5YS5WZWN0b3IzKCAwLCAzLjE0LCAwKSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblx0XHJcblxyXG4gICAgcHJpdmF0ZSBTdWJwYWNrYWdlT3ZlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBBc3NldE1hbmFnZXIuTG9hZEFzc2V0RnVuKCgpPT57XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9sb2FkamQgPSA1MDtcclxuICAgICAgICAgICAgdGhpcy5fYWxsamQgPSA0MDtcclxuICAgICAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgICAgICB2YXIgdXJsQXJyOkFycmF5PHN0cmluZz4gPSBbXTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcInN0YXJ0cGFuZWxcIiApICk7XHJcbiAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJlbmRwYW5lbFwiICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcInNwZWVkdXBlZmZlY3RcIiApICk7XHJcbiAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJjb2xvcl93aGl0ZVwiICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcImNvbG9yX3llbGxvd1wiICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcIndpbmxpbmVcIiApICk7XHJcbiAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJmaXJld29ya3NcIiApICk7XHJcbiAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJEaXJlY3Rpb25hbExpZ2h0XCIgKSApO1xyXG4gICAgICAgICAgICAvLyB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNETW9kZWwoIFwiZGlzdGFudHZpZXdcIiApICk7XHJcbiAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoIHRoaXMuUm9sZURhdGEucm9sZUNmZy5uYW1lICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggXCJBcnJvd1wiICkgKTtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gdGhpcy5Sb2xlRGF0YS5sZXZlbG1hcEFycjtcclxuICAgICAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICAgICAgZm9yKCBpID0gMDtpIDwgYXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdXJsQXJyLmluZGV4T2YoIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBhcnJbaV0gKSApID09IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNETW9kZWwoIGFycltpXSApKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgbnBjQXJyOkFycmF5PGFueT4gPSB0aGlzLlJvbGVEYXRhLmxldmVsY2ZnLm5wYztcclxuICAgICAgICAgICAgZm9yKCBpID0gMDtpIDwgbnBjQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdXJsQXJyLmluZGV4T2YoIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggTnBjQ0ZHLmRpY3RbIG5wY0FycltpXS5pZCBdLm5hbWUgKSApID09IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBOcGNDRkcuZGljdFsgbnBjQXJyW2ldLmlkIF0ubmFtZSApICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yKCBpID0gMDtpIDwgdXJsQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwYXRoQXJyLnB1c2goIHsgdXJsOnVybEFycltpXSB9ICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmxvYWRlcjNEQXJyKCBwYXRoQXJyLHRoaXMsdGhpcy5sb2FkM0Rjb21wbGV0ZSx0aGlzLmxvYWRwcm9ncmVzcyApO1xyXG5cclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZDNEY29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbG9hZGpkID0gOTA7XHJcbiAgICAgICAgdGhpcy5fYWxsamQgPSAxMDtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UubG9hZEdyb3VwKCBcIm1haW5cIix0aGlzLHRoaXMubG9hZGNvbXBsZXRlLHRoaXMubG9hZHByb2dyZXNzLGZhbHNlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkcHJvZ3Jlc3MoIHZhbHVlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbG9hZGluZ3BhbmVsOkxvYWRpbmdQYW5lbCA9IFZpZXdNYW5hZ2VyLkluc3RhbmNlLmdldFZpZXcoIExvYWRpbmdQYW5lbCApO1xyXG4gICAgICAgIGlmKCBsb2FkaW5ncGFuZWwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9sb2FkamQgKyBNYXRoLmNlaWwoIHZhbHVlLzEwMCp0aGlzLl9hbGxqZCApO1xyXG4gICAgICAgICAgICBsb2FkaW5ncGFuZWwuc2hvd1dvcmQoIHZhbHVlICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZGNvbXBsZXRlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmJ1dHRvblNvdW5kID0gXCJ1aTovL2xlY3h5bmgyaXo5eTI2XCI7XHJcbiAgICAgICAgR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5pbml0KCk7XHJcbiAgICAgICAgUmVzRGF0YUNvbnRyb2wuSW5zdGFuY2UuQWRkVmlld1BhY2tCeU5hbWUoIFwibWFpblwiICk7XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIExvYWRpbmdQYW5lbCApO1xyXG4gICAgICAgIC8vIEZZSERfU2RrLkluaXRTZGsoKTtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIE1haW5QYW5lbCApO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5paw55So5oi3RllIRF9TZGsuaXNuZXd1c2VyLS0tXCIsRllIRF9TZGsuaXNuZXd1c2VyKTtcclxuXHJcbiAgICAgICAgbGV0IG5ld3VzZXIgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNfbmV3dXNlclwiKTtcclxuICAgICAgICBpZihGWUhEX1Nkay5pc25ld3VzZXIpe1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoNTAwLHRoaXMsKCk9PntcclxuICAgICAgICAgICAgICAgIGlmKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuV2hpdGVVc2VyKXtcclxuICAgICAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoR2lmdFZpZXcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaXNfbmV3dXNlclwiLFwiMVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLlNldFNjZW5lKCk7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuSW5pdEVmZmVjdCgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtBZ2VuY3lCYXNlQ29udHJvbH0gZnJvbSBcIi4vQWdlbmN5QmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtMb2NhbERhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9Mb2NhbERhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7VXNlckRhdGFJbmZvfSBmcm9tIFwiLi4vRGF0YS9Vc2VyRGF0YUluZm9cIjtcclxuaW1wb3J0IHtTa2luRGF0YX0gZnJvbSBcIi4uL0RhdGEvU2tpbkRhdGFcIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHtTa2luUGFuZWx9IGZyb20gXCIuLi9WaWV3L1NraW5QYW5lbFwiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgTmV0d29ya01hbmFnZXIsIFBST1RPQ09MUyB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW5jeVNraW4gZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkFnZW5jeVNraW5cIjtcclxuICAgIHN0YXRpYyBpbnN0YW5jZTpBZ2VuY3lTa2luO1xyXG4gICAgXHJcbiAgICBsb2NhbGRhdGE6YW55O1xyXG4gICAgcGlmdUFycjpBcnJheTxTa2luRGF0YT47XHJcbiAgICBwaWZ1RGljdDphbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoKTsgXHJcbiAgICAgICAgQWdlbmN5U2tpbi5pbnN0YW5jZSA9IHRoaXM7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0U2VsZigpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5sb2NhbGRhdGEgPSBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLkdldExvY2FsQ2FDaGVEYXRhKCBVc2VyRGF0YUluZm8uc2tpbiApO1xyXG4gICAgICAgIHZhciBwaWZ1RGF0YTphbnk7XHJcbiAgICAgICAgaWYoICF0aGlzLmxvY2FsZGF0YS5oYXNPd25Qcm9wZXJ0eSggXCJwaWZ1XCIgKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxvY2FsZGF0YVtcInBpZnVcIl0gPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGlmdURhdGEgPSB0aGlzLmxvY2FsZGF0YVtcInBpZnVcIl07XHJcbiAgICAgICAgdGhpcy5waWZ1QXJyID0gW107XHJcbiAgICAgICAgdGhpcy5waWZ1RGljdCA9IHt9O1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gUm9sZUNGRy52ZWMubGVuZ3RoO1xyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IG51bXM7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwaWZ1dm86U2tpbkRhdGEgPSBuZXcgU2tpbkRhdGE7XHJcbiAgICAgICAgICAgIHZhciBjZmc6Um9sZUNGRyA9IFJvbGVDRkcudmVjW2ldO1xyXG4gICAgICAgICAgICBwaWZ1dm8ucm9sZUNGRyA9IGNmZztcclxuICAgICAgICAgICAgdmFyIGQ6YW55ID0gcGlmdURhdGFbIGNmZy5pZCBdO1xyXG4gICAgICAgICAgICBpZiggZCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBpZnV2by5zdGF0ZSA9IE51bWJlciggZC5zdGF0ZSApO1xyXG4gICAgICAgICAgICAgICAgcGlmdXZvLmhhc251bSA9IE51bWJlciggZC5oYXNudW0gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBpZnV2by5zdGF0ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBwaWZ1dm8uaGFzbnVtID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggY2ZnLmdldFN0YXRlID09IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwaWZ1dm8uc3RhdGUgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucGlmdUFyci5wdXNoKCBwaWZ1dm8gKTtcclxuICAgICAgICAgICAgdGhpcy5waWZ1RGljdFsgcGlmdXZvLnJvbGVDRkcuaWQgXSA9IHBpZnV2bztcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvcGVudmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIFNraW5QYW5lbCApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRSb2xlU3RhdGUoIGNmZzpSb2xlQ0ZHLHZhbHVlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgcGlmdXZvOlNraW5EYXRhID0gdGhpcy5waWZ1RGljdFsgY2ZnLmlkIF07XHJcbiAgICAgICAgaWYoIHBpZnV2byApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwaWZ1dm8uc3RhdGUgPSAxO1xyXG4gICAgICAgICAgICB0aGlzLkFkZExvY2FsU2tpbkRhdGEocGlmdXZvLnJvbGVDRkcuaWQscGlmdXZvLnN0YXRlLHBpZnV2by5oYXNudW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgIEFkZExvY2FsU2tpbkRhdGEoIGlkOmFueSxzdGF0ZTpudW1iZXIsaGFzbnVtOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmxvY2FsZGF0YVtcInBpZnVcIl1baWRdID0ge307XHJcbiAgICAgICAgdGhpcy5sb2NhbGRhdGFbXCJwaWZ1XCJdW2lkXVtcInN0YXRlXCJdID0gc3RhdGU7XHJcbiAgICAgICAgdGhpcy5sb2NhbGRhdGFbXCJwaWZ1XCJdW2lkXVtcImhhc251bVwiXSA9IGhhc251bTtcclxuICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLkFkZERhdGEoIFVzZXJEYXRhSW5mby5za2luLHRoaXMubG9jYWxkYXRhICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSByZWN0OkxheWEuU3ByaXRlO1xyXG5cclxuXHRcdHByaXZhdGUgY3JlYXRlQ2FudHJhbFJlY3QoKTogdm9pZCB7XHJcblx0XHRcdHRoaXMucmVjdCA9IG5ldyBMYXlhLlNwcml0ZSgpO1xyXG5cdFx0XHR0aGlzLnJlY3QuZ3JhcGhpY3MuZHJhd1JlY3QoLTEwMCwgLTEwMCwgMjAwLCAyMDAsIFwiZ3JheVwiKTtcclxuXHRcdFx0TGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLnJlY3QpO1xyXG5cclxuXHRcdFx0dGhpcy51cGRhdGVSZWN0UG9zKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cHJpdmF0ZSB1cGRhdGVSZWN0UG9zKCk6IHZvaWQge1xyXG5cdFx0XHR0aGlzLnJlY3QueCA9IExheWEuc3RhZ2Uud2lkdGggLyAyO1xyXG5cdFx0XHR0aGlzLnJlY3QueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC8gMjtcclxuXHRcdH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwdWJsaWMgR2FpblBpZnUoIF9za2luaXRlbTpTa2luRGF0YSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggX3NraW5pdGVtLnN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5Sb2xlRGF0YS5DaGFyYWN0ZXJJRCA9IF9za2luaXRlbS5yb2xlQ0ZHLmlkO1xyXG4gICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoIEdhbWVTdGF0ZS51cGRhdGVTS2luVmlldyApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzd2l0Y2goIF9za2luaXRlbS5yb2xlQ0ZHLmdldFN0YXRlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOi8v6KeG6aKR6I635Y+WXHJcbiAgICAgICAgICAgICAgICBfc2tpbml0ZW0uaGFzbnVtKys7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIF9za2luaXRlbS5yb2xlQ0ZHLm5lZWQgPD0gX3NraW5pdGVtLmhhc251bSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfc2tpbml0ZW0uc3RhdGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZExvY2FsU2tpbkRhdGEoX3NraW5pdGVtLnJvbGVDRkcuaWQsX3NraW5pdGVtLnN0YXRlLF9za2luaXRlbS5oYXNudW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRGlzVHJpZ2dlciggR2FtZVN0YXRlLnVwZGF0ZVNLaW5WaWV3ICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjovL+mHkeW4gei0reS5sFxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLlJvbGVEYXRhLk1vbmV5ID49IF9za2luaXRlbS5yb2xlQ0ZHLm5lZWQgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Sb2xlRGF0YS5Nb25leSAtPSBfc2tpbml0ZW0ucm9sZUNGRy5uZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfc2tpbml0ZW0uc3RhdGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZExvY2FsU2tpbkRhdGEoX3NraW5pdGVtLnJvbGVDRkcuaWQsX3NraW5pdGVtLnN0YXRlLF9za2luaXRlbS5oYXNudW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoIEdhbWVTdGF0ZS51cGRhdGVTS2luVmlldyApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIui0reS5sOaIkOWKn1wiICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoXCLph5HluIHkuI3otrNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6Ly/mtLvliqjojrflj5ZcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIFxyXG4gICAgcHVibGljIEdhaW5Ob0hhdmVTa2luKCk6QXJyYXk8U2tpbkRhdGE+XHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxTa2luRGF0YT4gPSBbXTtcclxuICAgICAgICBmb3IoIHZhciBzIGluIHRoaXMucGlmdURpY3QgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoICh0aGlzLnBpZnVEaWN0W3NdIGFzIFNraW5EYXRhKS5zdGF0ZSA9PSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goIHRoaXMucGlmdURpY3Rbc10gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtBZ2VuY3lCYXNlQ29udHJvbH0gZnJvbSBcIi4vQWdlbmN5QmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtTa2luRGF0YX0gZnJvbSBcIi4uL0RhdGEvU2tpbkRhdGFcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge1RyaWFsUGFuZWx9IGZyb20gXCIuLi9WaWV3L1RyaWFsUGFuZWxcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9HYW1lU3RhdGVDb250cm9sXCI7XHJcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7UmVzb3VyY2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNvdXJjZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtTY2VuZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBBZ2VuY3lJbkdhbWUgfSBmcm9tIFwiLi9BZ2VuY3lJbkdhbWVcIjtcclxuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcclxuaW1wb3J0IEVnZ1ZpZXcgZnJvbSBcIi4uL1ZpZXcvRWdnUGFuZWxcIjtcclxuaW1wb3J0IEVnZ1BhbmVsIGZyb20gXCIuLi9WaWV3L0VnZ1BhbmVsXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWdlbmN5VHJpYWwgZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkFnZW5jeVRyaWFsXCI7XHJcblxyXG4gICAgaXNzaGl5b25naW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgIHByaXZhdGUgc3ByaXQ6TGF5YS5TcHJpdGU7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCk7IFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvcGVudmlldyggYXJyOkFycmF5PFNraW5EYXRhPiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIFRyaWFsUGFuZWwsYXJyICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq6YCA5Ye655WM6Z2iICovXHJcbiAgICBwdWJsaWMgRXhpdFBhbmVsKCBfZGF0YTpTa2luRGF0YSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmlzc2hpeW9uZ2luZyA9IF9kYXRhID8gdHJ1ZTpmYWxzZTtcclxuICAgICAgICB0aGlzLl9zZWxlY3R2byA9IF9kYXRhO1xyXG4gICAgICAgIGlmKCBfZGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdXJsQXJyOkFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIHsgdXJsOkFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggX2RhdGEucm9sZUNGRy5uYW1lICl9ICk7XHJcbiAgICAgICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkZXIzREFyciggdXJsQXJyLHRoaXMsdGhpcy5TY2VuZUNyZWF0ZUNvbXBsZXRlLG51bGwsdHJ1ZSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBpZihBZ2VuY3lJbkdhbWUuZ2FtZW51bT4xKXtcclxuICAgICAgICAgICAgICAgIGxldCByYW5kb20gPSBNYXRoLnJhbmRvbSgpO1xyXG4gICAgICAgICAgICAgICAgaWYoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5XaGl0ZVVzZXIgJiYgIHJhbmRvbTw9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuSGl0RWdnKXtcclxuICAgICAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoRWdnUGFuZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmVudGVyZ2FtZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIC8vIGVsc2V7XHJcbiAgICAgICAgICAgIC8vICAgICBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmVudGVyZ2FtZSgpO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggVHJpYWxQYW5lbCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NlbGVjdHZvOlNraW5EYXRhO1xyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgY3JlYXRlU3ByaXRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3ByaXQgPSBuZXcgTGF5YS5TcHJpdGUoKTtcclxuICAgICAgICB0aGlzLnNwcml0LmdyYXBoaWNzLmRyYXdSZWN0KDAsIDAsIDIwMCwgMjAwLCBcIiNEMjY5MUVcIik7XHJcbiAgICAgICAgdGhpcy5zcHJpdC5waXZvdCgxMDAsIDEwMCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3ByaXQueCA9IExheWEuc3RhZ2Uud2lkdGggLyAyO1xyXG4gICAgICAgIHRoaXMuc3ByaXQueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgdGhpcy5zcHJpdC5zaXplKDIwMCwgMjAwKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMuc3ByaXQpO1xyXG5cclxuICAgICAgICAvLyB0aGlzLnNwLm9uKEludGVyYWN0aW9uX0N1c3RvbUV2ZW50LlJPVEFURSwgdGhpcywgdGhpcy5vblJvdGF0ZSk7ICAgIC8vIOS+puWQrOiHquWumuS5ieeahOS6i+S7tlxyXG4gICAgICAgIC8vIHRoaXMuc3ByaXQub24oRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub25TcHJpdGVDbGljayk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblNwcml0ZUNsaWNrKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHJhbmRvbUFuZ2xlOiBudW1iZXIgPSBNYXRoLnJhbmRvbSgpICogMTgwO1xyXG4gICAgICAgIC8v5Y+R6YCB6Ieq5a6a5LmJ5LqL5Lu2XHJcbiAgICAgICAgLy8gdGhpcy5zcHJpdC5ldmVudChJbnRlcmFjdGlvbl9DdXN0b21FdmVudC5ST1RBVEUsIFtyYW5kb21BbmdsZV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOinpuWPkeiHquWumuS5ieeahHJvdGF0ZeS6i+S7tlxyXG4gICAgcHJpdmF0ZSBvblJvdGF0ZShuZXdBbmdsZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgLy8gVHdlZW4udG8odGhpcy5zcCwgeyBcInJvdGF0aW9uXCI6IG5ld0FuZ2xlIH0sIDEwMDAsIEVhc2UuZWxhc3RpY091dCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHByaXZhdGUgU2NlbmVDcmVhdGVDb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuQ3JlYXRlUGxheWVyKHRoaXMuX3NlbGVjdHZvLnJvbGVDRkcpO1xyXG4gICAgICAgIGlmKEFnZW5jeUluR2FtZS5nYW1lbnVtPjEpe1xyXG4gICAgICAgICAgICBpZihQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLldoaXRlVXNlcil7XHJcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoRWdnUGFuZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmVudGVyZ2FtZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2UuZW50ZXJnYW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVUZXh0KCk6IHZvaWQge1xyXG4gICAgICAgIHZhciB0eHQ6IExheWEuVGV4dCA9IG5ldyBMYXlhLlRleHQoKTtcclxuICAgICAgICAvL+e7meaWh+acrOeahHRleHTlsZ7mgKfotYvlgLxcclxuICAgICAgICB0eHQudGV4dCA9IFwiTGF5YWJveOaYr+aAp+iDveacgOW8uueahEhUTUw15byV5pOO5oqA5pyv5o+Q5L6b5ZWG5LiO5LyY56eA55qE5ri45oiP5Y+R6KGM5ZWG77yM6Z2i5ZCRRmxhc2jlvIDlj5HogIXmj5DkvptIVE1MNeW8gOWPkeaKgOacr+aWueahiO+8gVwiO1xyXG4gICAgICAgIC8v6K6+572u5a695bqm77yM6auY5bqm6Ieq5Yqo5Yy56YWNXHJcbiAgICAgICAgdHh0LndpZHRoID0gNDAwO1xyXG4gICAgICAgIC8v6Ieq5Yqo5o2i6KGMXHJcbiAgICAgICAgdHh0LndvcmRXcmFwID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdHh0LmFsaWduID0gXCJjZW50ZXJcIjtcclxuICAgICAgICB0eHQuZm9udFNpemUgPSA0MDtcclxuICAgICAgICB0eHQuZm9udCA9IFwiTWljcm9zb2Z0IFlhSGVpXCI7XHJcbiAgICAgICAgdHh0LmNvbG9yID0gXCIjZmYwMDAwXCI7XHJcbiAgICAgICAgdHh0LmJvbGQgPSB0cnVlO1xyXG4gICAgICAgIHR4dC5sZWFkaW5nID0gNTtcclxuXHJcbiAgICAgICAgLy/orr7nva7mj4/ovrnlsZ7mgKdcclxuICAgICAgICB0eHQuc3Ryb2tlID0gMjtcclxuICAgICAgICB0eHQuc3Ryb2tlQ29sb3IgPSBcIiNmZmZmZmZcIjtcclxuXHJcbiAgICAgICAgdHh0LmJvcmRlckNvbG9yID0gXCIjMDBmZjAwXCJcclxuXHJcbiAgICAgICAgdHh0LnggPSAoTGF5YS5zdGFnZS53aWR0aCAtIHR4dC50ZXh0V2lkdGgpIC8gMjtcclxuICAgICAgICB0eHQueSA9IChMYXlhLnN0YWdlLmhlaWdodCAtIHR4dC50ZXh0SGVpZ2h0KSAvIDI7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodHh0KTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcbiAgICBcclxuXHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVJbnB1dCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgaW5wdXRUZXh0OkxheWEuSW5wdXQgPSBuZXcgTGF5YS5JbnB1dCgpO1xyXG5cclxuICAgICAgICAvLyDnp7vliqjnq6/ovpPlhaXmj5DnpLrnrKZcclxuICAgICAgICBpbnB1dFRleHQucHJvbXB0ID0gXCJUeXBlIHNvbWUgd29yZC4uLlwiO1xyXG5cclxuICAgICAgICAvL+WkmuihjOi+k+WFpVxyXG4gICAgICAgIGlucHV0VGV4dC5tdWx0aWxpbmUgPSB0cnVlO1xyXG4gICAgICAgIGlucHV0VGV4dC53b3JkV3JhcCA9IHRydWU7XHJcblxyXG4gICAgICAgIGlucHV0VGV4dC5zaXplKDM1MCwgMTAwKTtcclxuICAgICAgICBpbnB1dFRleHQueCA9IExheWEuc3RhZ2Uud2lkdGggLSBpbnB1dFRleHQud2lkdGggPj4gMTtcclxuICAgICAgICBpbnB1dFRleHQueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC0gaW5wdXRUZXh0LmhlaWdodCA+PiAxO1xyXG4gICAgICAgIGlucHV0VGV4dC5wYWRkaW5nID0gWzIsIDIsIDIsIDJdO1xyXG5cclxuICAgICAgICBpbnB1dFRleHQuYmdDb2xvciA9IFwiIzY2NjY2NlwiO1xyXG4gICAgICAgIGlucHV0VGV4dC5jb2xvciA9IFwiI2ZmZmZmZlwiO1xyXG4gICAgICAgIGlucHV0VGV4dC5mb250U2l6ZSA9IDIwO1xyXG5cclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGlucHV0VGV4dCk7XHJcbiAgICB9XHJcbiBcclxufSIsImltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVGltZXNUYW1wZXIgfSBmcm9tIFwiLi4vVGltZS9UaW1lc1RhbXBlclwiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCB7V0VDSEFURVZFTlR9IGZyb20gXCIuLi9XWFNESy9XRUNIQVRFVkVOVFwiO1xyXG5pbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQgTGV2ZWxDRkcgZnJvbSBcIi4uL0NGRy9MZXZlbENGR1wiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50LCBBY2NvdW50VXNlciB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi4vV1hTREsvTmV0d29ya01hbmFnZXJcIjtcclxuaW1wb3J0IHtVc2VySW5mb0V2ZW50fSBmcm9tIFwiLi4vRGF0YS9Vc2VySW5mb0V2ZW50XCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW5jeVVzZXJNZXNzYWdlIGV4dGVuZHMgQWdlbmN5QmFzZUNvbnRyb2xcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkFnZW5jeVVzZXJNZXNzYWdlXCI7XHJcblxyXG4gICAgcHJpdmF0ZSByb2xlaXNpbml0OmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFNlbGYoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICBcclxuICAgIH0gICBcclxuXHJcbiAgICAvKirliqDph5HluIEgKi9cclxuICAgIHB1YmxpYyBHb2xkVXAoIF9udW06bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuUm9sZURhdGEuTW9uZXkgKz0gX251bTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVJbnB1dCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgaW5wdXRUZXh0OkxheWEuSW5wdXQgPSBuZXcgTGF5YS5JbnB1dCgpO1xyXG5cclxuICAgICAgICBpbnB1dFRleHQuc2l6ZSgzNTAsIDEwMCk7XHJcbiAgICAgICAgaW5wdXRUZXh0LnggPSBMYXlhLnN0YWdlLndpZHRoIC0gaW5wdXRUZXh0LndpZHRoID4+IDE7XHJcbiAgICAgICAgaW5wdXRUZXh0LnkgPSBMYXlhLnN0YWdlLmhlaWdodCAtIGlucHV0VGV4dC5oZWlnaHQgPj4gMTtcclxuXHJcbiAgICAgICAgaW5wdXRUZXh0LnRleHQgPSBcIui/meauteaWh+acrOS4jeWPr+e8lui+ke+8jOS9huWPr+WkjeWItlwiO1xyXG4gICAgICAgIGlucHV0VGV4dC5lZGl0YWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyDorr7nva7lrZfkvZPmoLflvI9cclxuICAgICAgICBpbnB1dFRleHQuYm9sZCA9IHRydWU7XHJcbiAgICAgICAgaW5wdXRUZXh0LmJnQ29sb3IgPSBcIiM2NjY2NjZcIjtcclxuICAgICAgICBpbnB1dFRleHQuY29sb3IgPSBcIiNmZmZmZmZcIjtcclxuICAgICAgICBpbnB1dFRleHQuZm9udFNpemUgPSAyMDtcclxuXHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChpbnB1dFRleHQpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5Sb2xlRGF0YS5pbml0KCk7XHJcbiAgICAgICAgdGhpcy5yb2xlaXNpbml0ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVRleHQoKTpMYXlhLlRleHQge1xyXG4gICAgICAgIHZhciB0eHQ6TGF5YS5UZXh0ID0gbmV3IExheWEuVGV4dCgpO1xyXG5cclxuICAgICAgICB0eHQudGV4dCA9XHJcbiAgICAgICAgICAgIFwiTGF5YWJveOaYr0hUTUw15byV5pOO5oqA5pyv5o+Q5L6b5ZWG5LiO5LyY56eA55qE5ri45oiP5Y+R6KGM5ZWG77yM6Z2i5ZCRQVMvSlMvVFPlvIDlj5HogIXmj5DkvptIVE1MNeW8gOWPkeaKgOacr+aWueahiO+8gVxcblwiICtcclxuICAgICAgICAgICAgXCJMYXlhYm945pivSFRNTDXlvJXmk47mioDmnK/mj5DkvpvllYbkuI7kvJjnp4DnmoTmuLjmiI/lj5HooYzllYbvvIzpnaLlkJFBUy9KUy9UU+W8gOWPkeiAheaPkOS+m0hUTUw15byA5Y+R5oqA5pyv5pa55qGI77yBXFxuXCIgK1xyXG4gICAgICAgICAgICBcIkxheWFib3jmmK9IVE1MNeW8leaTjuaKgOacr+aPkOS+m+WVhuS4juS8mOengOeahOa4uOaIj+WPkeihjOWVhu+8jOmdouWQkUFTL0pTL1RT5byA5Y+R6ICF5o+Q5L6bSFRNTDXlvIDlj5HmioDmnK/mlrnmoYjvvIFcIjtcclxuXHJcbiAgICAgICAgdHh0LmJvcmRlckNvbG9yID0gXCIjRkZGRjAwXCI7XHJcblxyXG4gICAgICAgIHR4dC5zaXplKDMwMCwgNTApO1xyXG4gICAgICAgIHR4dC5mb250U2l6ZSA9IDIwO1xyXG4gICAgICAgIHR4dC5jb2xvciA9IFwiI2ZmZmZmZlwiO1xyXG5cclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHR4dCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0eHQ7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIC8qKuWNh+e6pyAqL1xyXG4gICAgcHVibGljIExldmVsVXAoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5Sb2xlRGF0YS5MZXZlbFVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbn0iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxyXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mmJ1aWxkLnhsc3jjgIJcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVpbGRDRkdcclxue1xyXG5cdHB1YmxpYyBuYW1lOnN0cmluZzsvL+W7uuetkeWQjVxyXG5cdHB1YmxpYyBidWZmeDpudW1iZXI7Ly9idWZmeFxyXG5cdHB1YmxpYyBidWZmeTpudW1iZXI7Ly9idWZmeVxyXG5cdHB1YmxpYyBidWZmejpudW1iZXI7Ly9idWZmelxyXG5cdHB1YmxpYyB0aW1lOm51bWJlcjsvL+aMgee7reaXtumXtCjnp5IpXHJcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xyXG5cdHB1YmxpYyBzdGF0aWMgdmVjOkFycmF5PEJ1aWxkQ0ZHPiA9IFtdO1xyXG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXHJcblx0e1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdGZvcihpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcclxuXHRcdHtcclxuXHRcdFx0dmFyIHNpbmdsZVN0cjpzdHJpbmcgPSBhcnJbaV07XHJcblx0XHRcdHZhciBzaW5nbGVBcnI6QXJyYXk8c3RyaW5nPiA9IHNpbmdsZVN0ci5zcGxpdChcIiZcIik7XHJcblx0XHRcdGlmKEJ1aWxkQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcclxuXHRcdFx0dmFyIGl0ZW06QnVpbGRDRkc9IG5ldyBCdWlsZENGRygpO1xyXG5cdFx0XHRpdGVtLm5hbWU9c2luZ2xlQXJyWzBdO1xyXG5cdFx0XHRpdGVtLmJ1ZmZ4PSBOdW1iZXIoc2luZ2xlQXJyWzFdKTtcclxuXHRcdFx0aXRlbS5idWZmeT0gTnVtYmVyKHNpbmdsZUFyclsyXSk7XHJcblx0XHRcdGl0ZW0uYnVmZno9IE51bWJlcihzaW5nbGVBcnJbM10pO1xyXG5cdFx0XHRpdGVtLnRpbWU9IE51bWJlcihzaW5nbGVBcnJbNF0pO1xyXG5cdFx0XHRCdWlsZENGRy5kaWN0W2l0ZW0ubmFtZV09aXRlbTtcclxuXHRcdFx0QnVpbGRDRkcudmVjLnB1c2goaXRlbSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8v5bel5YW355Sf5oiQ77yM6K+35Yu/5L+u5pS544CCXHJcbi8v6YWN572u5paH5Lu25ZCN56ew77yaZ2FtZS54bHN444CCXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVDRkdcclxue1xyXG5cdHB1YmxpYyBpZDpudW1iZXI7Ly9pZFxyXG5cdHB1YmxpYyB2YWx1ZTpzdHJpbmc7Ly/lrZfmrrXlgLxcclxuXHRwdWJsaWMgc3RhdGljIGRpY3Q6YW55ID0ge307XHJcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8R2FtZUNGRz4gPSBbXTtcclxuXHRwdWJsaWMgc3RhdGljIGluaXRDZmcoc3RyOnN0cmluZyk6dm9pZFxyXG5cdHtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0dmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiXFxuXCIpO1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHRmb3IoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspXHJcblx0XHR7XHJcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xyXG5cdFx0XHR2YXIgc2luZ2xlQXJyOkFycmF5PHN0cmluZz4gPSBzaW5nbGVTdHIuc3BsaXQoXCImXCIpO1xyXG5cdFx0XHRpZihHYW1lQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcclxuXHRcdFx0dmFyIGl0ZW06R2FtZUNGRz0gbmV3IEdhbWVDRkcoKTtcclxuXHRcdFx0aXRlbS5pZD0gTnVtYmVyKHNpbmdsZUFyclswXSk7XHJcblx0XHRcdGl0ZW0udmFsdWU9c2luZ2xlQXJyWzFdO1xyXG5cdFx0XHRHYW1lQ0ZHLmRpY3RbaXRlbS5pZF09aXRlbTtcclxuXHRcdFx0R2FtZUNGRy52ZWMucHVzaChpdGVtKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG59IiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy/lt6XlhbfnlJ/miJDvvIzor7fli7/kv67mlLnjgIJcclxuLy/phY3nva7mlofku7blkI3np7DvvJpsZXZlbC54bHN444CCXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExldmVsQ0ZHXHJcbntcclxuXHRwdWJsaWMgaWQ6bnVtYmVyOy8v5YWz5Y2hXHJcblx0cHVibGljIHJvYWQ6c3RyaW5nOy8v5YWz5Y2h5qih5Z6LXHJcblx0cHVibGljIHJvbGVpbml0cG9zOmFueTsvL+eOqeWutuinkuiJsuWIneWni+ermeS9jVxyXG5cdHB1YmxpYyBucGM6YW55Oy8vbnBjXHJcblx0cHVibGljIGZpcnN0U2NlbmVwb3M6c3RyaW5nOy8v5Yid5aeL56ys5LiA5Liq5Zy65pmv5qih5Z6L55qE5L2N572uXHJcblx0cHVibGljIHdpbkdvbGQ6bnVtYmVyOy8v6YCa5YWz5oiQ5Yqf6I635b6X6YeR5biBXHJcblx0cHVibGljIGZhaWxHb2Q6c3RyaW5nOy8v6YCa5YWz5aSx6LSl6I635b6X6YeR5biBXHJcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xyXG5cdHB1YmxpYyBzdGF0aWMgdmVjOkFycmF5PExldmVsQ0ZHPiA9IFtdO1xyXG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXHJcblx0e1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdGZvcihpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcclxuXHRcdHtcclxuXHRcdFx0dmFyIHNpbmdsZVN0cjpzdHJpbmcgPSBhcnJbaV07XHJcblx0XHRcdHZhciBzaW5nbGVBcnI6QXJyYXk8c3RyaW5nPiA9IHNpbmdsZVN0ci5zcGxpdChcIiZcIik7XHJcblx0XHRcdGlmKExldmVsQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcclxuXHRcdFx0dmFyIGl0ZW06TGV2ZWxDRkc9IG5ldyBMZXZlbENGRygpO1xyXG5cdFx0XHRpdGVtLmlkPSBOdW1iZXIoc2luZ2xlQXJyWzBdKTtcclxuXHRcdFx0aXRlbS5yb2FkPXNpbmdsZUFyclsxXTtcclxuXHRcdFx0aXRlbS5yb2xlaW5pdHBvcz0gSlNPTi5wYXJzZShzaW5nbGVBcnJbMl0pO1xyXG5cdFx0XHRpdGVtLm5wYz0gSlNPTi5wYXJzZShzaW5nbGVBcnJbM10pO1xyXG5cdFx0XHRpdGVtLmZpcnN0U2NlbmVwb3M9c2luZ2xlQXJyWzRdO1xyXG5cdFx0XHRpdGVtLndpbkdvbGQ9IE51bWJlcihzaW5nbGVBcnJbNV0pO1xyXG5cdFx0XHRpdGVtLmZhaWxHb2Q9c2luZ2xlQXJyWzZdO1xyXG5cdFx0XHRMZXZlbENGRy5kaWN0W2l0ZW0uaWRdPWl0ZW07XHJcblx0XHRcdExldmVsQ0ZHLnZlYy5wdXNoKGl0ZW0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbn0iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxyXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mmxvdHRlcnkueGxzeOOAglxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb3R0ZXJ5Q0ZHXHJcbntcclxuXHRwdWJsaWMgaWQ6bnVtYmVyOy8vaWRcclxuXHRwdWJsaWMgdHlwZTpudW1iZXI7Ly/lsZ7mgKfnsbvlnotcclxuXHRwdWJsaWMgdmFsdWU6c3RyaW5nOy8v57G75Z6L5YC8XHJcblx0cHVibGljIHdlaWdodDpudW1iZXI7Ly/mnYPph41cclxuXHRwdWJsaWMgc3RhdGljIGRpY3Q6YW55ID0ge307XHJcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8TG90dGVyeUNGRz4gPSBbXTtcclxuXHRwdWJsaWMgc3RhdGljIGluaXRDZmcoc3RyOnN0cmluZyk6dm9pZFxyXG5cdHtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0dmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiXFxuXCIpO1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHRmb3IoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspXHJcblx0XHR7XHJcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xyXG5cdFx0XHR2YXIgc2luZ2xlQXJyOkFycmF5PHN0cmluZz4gPSBzaW5nbGVTdHIuc3BsaXQoXCImXCIpO1xyXG5cdFx0XHRpZihMb3R0ZXJ5Q0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcclxuXHRcdFx0dmFyIGl0ZW06TG90dGVyeUNGRz0gbmV3IExvdHRlcnlDRkcoKTtcclxuXHRcdFx0aXRlbS5pZD0gTnVtYmVyKHNpbmdsZUFyclswXSk7XHJcblx0XHRcdGl0ZW0udHlwZT0gTnVtYmVyKHNpbmdsZUFyclsxXSk7XHJcblx0XHRcdGl0ZW0udmFsdWU9c2luZ2xlQXJyWzJdO1xyXG5cdFx0XHRpdGVtLndlaWdodD0gTnVtYmVyKHNpbmdsZUFyclszXSk7XHJcblx0XHRcdExvdHRlcnlDRkcuZGljdFtpdGVtLmlkXT1pdGVtO1xyXG5cdFx0XHRMb3R0ZXJ5Q0ZHLnZlYy5wdXNoKGl0ZW0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbn0iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxyXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mm5wYy54bHN444CCXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5wY0NGR1xyXG57XHJcblx0cHVibGljIGlkOm51bWJlcjsvL+inkuiJsmlkXHJcblx0cHVibGljIG5hbWU6c3RyaW5nOy8v6KeS6Imy6LWE5rqQ5ZCNXHJcblx0cHVibGljIHNwZWVkOm51bWJlcjsvL+inkuiJsuWJjei/m+enu+WKqOmAn+W6pijnsbMv56eSKVxyXG5cdHB1YmxpYyBmcm9udGp1bXA6YW55Oy8v5YmN6Lez5Yqg6YCf5bqmXHJcblx0cHVibGljIGxlZnRqdW1wOmFueTsvL+W3pui3s+WKoOmAn+W6plxyXG5cdHB1YmxpYyByaWdodGp1bXA6YW55Oy8v5Y+z6Lez5Yqg6YCf5bqmXHJcblx0cHVibGljIHVwY2xpbWI6bnVtYmVyOy8v54is5Y2H6YCf5bqmXHJcblx0cHVibGljIHNsaWRlY2xpbWI6YW55Oy8v5pac552A54is5qW86YCf5bqmXHJcblx0cHVibGljIGp1bXBfbGVmdDpudW1iZXI7Ly/lkJHlt6bot7Pot4PmnYPph41cclxuXHRwdWJsaWMganVtcF9yaWdodDpudW1iZXI7Ly/lkJHlj7Pot7PmnYPph41cclxuXHRwdWJsaWMgc3RhcnRfYWhlYWQ6bnVtYmVyOy8v55u06Lez5p2D6YeNXHJcblx0cHVibGljIGRpc3RhbmNlOm51bWJlcjsvL25wY+i2hei/h+eOqeWutui3neemu+WBnOatolxyXG5cdHB1YmxpYyBncmF2aXR5Om51bWJlcjsvL+mHjeWKm+WKoOmAn+W6plxyXG5cdHB1YmxpYyBzdGF0aWMgZGljdDphbnkgPSB7fTtcclxuXHRwdWJsaWMgc3RhdGljIHZlYzpBcnJheTxOcGNDRkc+ID0gW107XHJcblx0cHVibGljIHN0YXRpYyBpbml0Q2ZnKHN0cjpzdHJpbmcpOnZvaWRcclxuXHR7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIlxcblwiKTtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxyXG5cdFx0e1xyXG5cdFx0XHR2YXIgc2luZ2xlU3RyOnN0cmluZyA9IGFycltpXTtcclxuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcclxuXHRcdFx0aWYoTnBjQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcclxuXHRcdFx0dmFyIGl0ZW06TnBjQ0ZHPSBuZXcgTnBjQ0ZHKCk7XHJcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xyXG5cdFx0XHRpdGVtLm5hbWU9c2luZ2xlQXJyWzFdO1xyXG5cdFx0XHRpdGVtLnNwZWVkPSBOdW1iZXIoc2luZ2xlQXJyWzJdKTtcclxuXHRcdFx0aXRlbS5mcm9udGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzNdKTtcclxuXHRcdFx0aXRlbS5sZWZ0anVtcD0gSlNPTi5wYXJzZShzaW5nbGVBcnJbNF0pO1xyXG5cdFx0XHRpdGVtLnJpZ2h0anVtcD0gSlNPTi5wYXJzZShzaW5nbGVBcnJbNV0pO1xyXG5cdFx0XHRpdGVtLnVwY2xpbWI9IE51bWJlcihzaW5nbGVBcnJbNl0pO1xyXG5cdFx0XHRpdGVtLnNsaWRlY2xpbWI9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzddKTtcclxuXHRcdFx0aXRlbS5qdW1wX2xlZnQ9IE51bWJlcihzaW5nbGVBcnJbOF0pO1xyXG5cdFx0XHRpdGVtLmp1bXBfcmlnaHQ9IE51bWJlcihzaW5nbGVBcnJbOV0pO1xyXG5cdFx0XHRpdGVtLnN0YXJ0X2FoZWFkPSBOdW1iZXIoc2luZ2xlQXJyWzEwXSk7XHJcblx0XHRcdGl0ZW0uZGlzdGFuY2U9IE51bWJlcihzaW5nbGVBcnJbMTFdKTtcclxuXHRcdFx0aXRlbS5ncmF2aXR5PSBOdW1iZXIoc2luZ2xlQXJyWzEyXSk7XHJcblx0XHRcdE5wY0NGRy5kaWN0W2l0ZW0uaWRdPWl0ZW07XHJcblx0XHRcdE5wY0NGRy52ZWMucHVzaChpdGVtKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG59IiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy/lt6XlhbfnlJ/miJDvvIzor7fli7/kv67mlLnjgIJcclxuLy/phY3nva7mlofku7blkI3np7DvvJpyb2xlLnhsc3jjgIJcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZUNGR1xyXG57XHJcblx0cHVibGljIGlkOm51bWJlcjsvL+inkuiJsmlkXHJcblx0cHVibGljIG5hbWU6c3RyaW5nOy8v6KeS6Imy6LWE5rqQ5ZCNXHJcblx0cHVibGljIHNwZWVkOm51bWJlcjsvL+inkuiJsuWJjei/m+enu+WKqOmAn+W6pijnsbMv56eSKVxyXG5cdHB1YmxpYyBmcm9udGp1bXA6YW55Oy8v5YmN6Lez5Yqg6YCf5bqmXHJcblx0cHVibGljIGxlZnRqdW1wOmFueTsvL+W3pui3s+WKoOmAn+W6plxyXG5cdHB1YmxpYyByaWdodGp1bXA6YW55Oy8v5Y+z6Lez5Yqg6YCf5bqmXHJcblx0cHVibGljIHVwY2xpbWI6bnVtYmVyOy8v54is5Y2H6YCf5bqmXHJcblx0cHVibGljIHNsaWRlY2xpbWI6YW55Oy8v5pac552A54is5qW86YCf5bqmXHJcblx0cHVibGljIGdldFN0YXRlOm51bWJlcjsvL+iOt+WPluinkuiJsuaWueW8j1xyXG5cdHB1YmxpYyBuZWVkOm51bWJlcjsvL+iOt+WPluinkuiJsuiKsei0uVxyXG5cdHB1YmxpYyBpY29uOnN0cmluZzsvL+Wbvuagh2ljb25cclxuXHRwdWJsaWMgZ3Jhdml0eTpudW1iZXI7Ly/ph43lipvliqDpgJ/luqZcclxuXHRwdWJsaWMgcm9sZW5hbWU6c3RyaW5nOy8v6KeS6Imy5ZCN5a2XXHJcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xyXG5cdHB1YmxpYyBzdGF0aWMgdmVjOkFycmF5PFJvbGVDRkc+ID0gW107XHJcblx0cHVibGljIHN0YXRpYyBpbml0Q2ZnKHN0cjpzdHJpbmcpOnZvaWRcclxuXHR7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIlxcblwiKTtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxyXG5cdFx0e1xyXG5cdFx0XHR2YXIgc2luZ2xlU3RyOnN0cmluZyA9IGFycltpXTtcclxuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcclxuXHRcdFx0aWYoUm9sZUNGRy5kaWN0W3NpbmdsZUFyclswXV0pY29udGludWU7XHJcblx0XHRcdHZhciBpdGVtOlJvbGVDRkc9IG5ldyBSb2xlQ0ZHKCk7XHJcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xyXG5cdFx0XHRpdGVtLm5hbWU9c2luZ2xlQXJyWzFdO1xyXG5cdFx0XHRpdGVtLnNwZWVkPSBOdW1iZXIoc2luZ2xlQXJyWzJdKTtcclxuXHRcdFx0aXRlbS5mcm9udGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzNdKTtcclxuXHRcdFx0aXRlbS5sZWZ0anVtcD0gSlNPTi5wYXJzZShzaW5nbGVBcnJbNF0pO1xyXG5cdFx0XHRpdGVtLnJpZ2h0anVtcD0gSlNPTi5wYXJzZShzaW5nbGVBcnJbNV0pO1xyXG5cdFx0XHRpdGVtLnVwY2xpbWI9IE51bWJlcihzaW5nbGVBcnJbNl0pO1xyXG5cdFx0XHRpdGVtLnNsaWRlY2xpbWI9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzddKTtcclxuXHRcdFx0aXRlbS5nZXRTdGF0ZT0gTnVtYmVyKHNpbmdsZUFycls4XSk7XHJcblx0XHRcdGl0ZW0ubmVlZD0gTnVtYmVyKHNpbmdsZUFycls5XSk7XHJcblx0XHRcdGl0ZW0uaWNvbj1zaW5nbGVBcnJbMTBdO1xyXG5cdFx0XHRpdGVtLmdyYXZpdHk9IE51bWJlcihzaW5nbGVBcnJbMTFdKTtcclxuXHRcdFx0aXRlbS5yb2xlbmFtZT1zaW5nbGVBcnJbMTJdO1xyXG5cdFx0XHRSb2xlQ0ZHLmRpY3RbaXRlbS5pZF09aXRlbTtcclxuXHRcdFx0Um9sZUNGRy52ZWMucHVzaChpdGVtKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG59IiwiaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQge1JlY0NvbmZpZ3N9IGZyb20gXCIuL1JlY0NvbmZpZ3NcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEFzc2V0UGF0aFxyXG57XHJcbiAgICBzdGF0aWMgIHJlczogc3RyaW5nID0gXCJyZXMvXCI7XHJcbiAgICBzdGF0aWMgIHJlc291cmNlczpzdHJpbmcgPSBcInJlc291cmNlcy9cIjtcclxuICAgIC8vIGV4cG9ydCB2YXIgY29uZmlnczpzdHJpbmcgPSBcImNvbmZpZ3MvXCI7XHJcbiAgICBzdGF0aWMgIHVpOnN0cmluZyA9IFwidWkvXCI7XHJcbiAgICBzdGF0aWMgIHN1YnBhY2tzZ2V1aTpzdHJpbmcgPSBcImNoYXJhY3Rlci91aS9cIlxyXG4gICAgc3RhdGljICBtdXNpYzpzdHJpbmcgPSBcIm11c2ljL1wiO1xyXG4gICAgc3RhdGljICB2ZXJzaW9ucmFuZG9tOnN0cmluZyA9IFwiXCI7XHJcbiAgICBzdGF0aWMgIHByb3A6c3RyaW5nID0gXCJwcm9wL1wiXHJcbiAgICBzdGF0aWMgIHNraW5pY29uOnN0cmluZyA9IFwic2tpbmljb24vXCJcclxuXHJcbiAgICBzdGF0aWMgIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgQXNzZXRQYXRoLnZlcnNpb25yYW5kb20gPSBcIj92PVwiICsgTWF0aC5yYW5kb20oKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGdldHNvdW5kKCBpZDpzdHJpbmcgKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlc291cmNlcyArIEFzc2V0UGF0aC5tdXNpYyArIGlkICtcIi5tcDNcIiApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyAgZ2V0UmVzQ29uZmlnKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXNvdXJjZXMgICsgXCJyZXNDb25maWcuanNvblwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBnZXRDb25maWcoIGNvbmZpZ25hbWU6c3RyaW5nICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXNvdXJjZXMgICsgY29uZmlnbmFtZSArXCIuYmluXCIgKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGdldDNEc2NlbmUoIG5hbWU6YW55ICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXMgKyBBc3NldFBhdGgucHJvcCArIFwiQ29udmVudGlvbmFsL1wiICsgbmFtZSArIFwiLmxzXCIgKTtcclxuICAgIH0gXHJcblxyXG4gICAgc3RhdGljICBnZXQzRE1vZGVsKCBuYW1lOmFueSApOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBBc3NldFBhdGgucmVzICsgQXNzZXRQYXRoLnByb3AgKyBcIkNvbnZlbnRpb25hbC9cIiArIG5hbWUgKyBcIi5saFwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBnZXQzRFJvbGVNb2RlbCggbmFtZTphbnkgKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlcyArIFwiY2hhcmFjdGVyL0NvbnZlbnRpb25hbC9cIiArIG5hbWUgKyBcIi5saFwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBnZXRyb2xlaWNvbiggaWQ6c3RyaW5nICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXMgICsgXCJza2luaWNvbi9cIiArIGlkICsgXCIucG5nXCIgKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGdldFZlcmlzb251cmwoKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICBpZiggR2xvYmFsLmlzZGVidWcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXMgKyBcInZlcnNpb24uanNvblwiICkgKyBBc3NldFBhdGgudmVyc2lvbnJhbmRvbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXMgKyBcInZlcnNpb25cIiArIEdsb2JhbC5yZXNjb25maWdWZXJzaW9uICsgXCIuanNvblwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBnZXRHYW1lVmVyc2lvbigpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBcImdhbWV2ZXJzaW9uLmpzb25cIiApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKuiOt+WPluWMuemFjeS6uueJqeWktOWDj2ljb24gKi9cclxuICAgIHN0YXRpYyBwaXBlaWljb24gKGlkOnN0cmluZyk6c3RyaW5ne1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBBc3NldFBhdGgucmVzICArIFwiaWNvbi9cIiArIGlkICsgXCIucG5nXCIgKTtcclxuICAgIH1cclxuXHJcbiAgXHJcbn0gIiwiaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4vQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIFJlY0NvbmZpZ3MgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6UmVjQ29uZmlncztcclxuXHJcbiAgICBwdWJsaWMgUmVzRGljOmFueTtcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5bey57uP5Yid5aeL5YyWXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaW5pdGVkOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlJlY0NvbmZpZ3NcclxuICAgIHtcclxuICAgICAgICBpZiggUmVjQ29uZmlncy5pbnMgPT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlY0NvbmZpZ3MoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFJlY0NvbmZpZ3MuaW5zO1xyXG4gICAgfVxyXG4gICAgY29uc3RydWN0b3IoKVxyXG4gICAge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgUmVjQ29uZmlncy5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuUmVzRGljID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBsb2FkVUkoKTp2b2lkIHtcclxuICAgICAgICBMYXlhLmxvYWRlci5sb2FkKFtcInJlcy90aHJlZURpbWVuL3VpL2J1dHRvbi5wbmdcIl0sIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgZnVuY3Rpb24oKTp2b2lkIHtcclxuICAgICAgICAgICAgdmFyIGNoYW5nZUFjdGlvbkJ1dHRvbjpMYXlhLkJ1dHRvbiA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuQnV0dG9uKFwicmVzL3RocmVlRGltZW4vdWkvYnV0dG9uLnBuZ1wiLCBcIuato+W4uOaooeW8j1wiKSkgYXMgTGF5YS5CdXR0b247XHJcbiAgICAgICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5zaXplKDE2MCwgNDApO1xyXG4gICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ubGFiZWxCb2xkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLmxhYmVsU2l6ZSA9IDMwO1xyXG4gICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24uc2l6ZUdyaWQgPSBcIjQsNCw0LDRcIjtcclxuICAgICAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnNjYWxlKExheWEuQnJvd3Nlci5waXhlbFJhdGlvLCBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5wb3MoTGF5YS5zdGFnZS53aWR0aCAvIDIgLSBjaGFuZ2VBY3Rpb25CdXR0b24ud2lkdGggKiBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyAvIDIsIExheWEuc3RhZ2UuaGVpZ2h0IC0gMTAwICogTGF5YS5Ccm93c2VyLnBpeGVsUmF0aW8pO1xyXG4gICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgZnVuY3Rpb24oKTp2b2lkIHtcclxuICAgICAgICAgICAgICAgIGlmICgrK3RoaXMuY3VyU3RhdGVJbmRleCAlIDIgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ByaXRlM0QuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lU3ByaXRlM0QuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ubGFiZWwgPSBcIue9keagvOaooeW8j1wiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwcml0ZTNELmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lU3ByaXRlM0QuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLmxhYmVsID0gXCLmraPluLjmqKHlvI9cIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHB1YmxpYyBpbml0UmVjKCBfcmVzOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgIGlmKCBfcmVzICE9IG51bGwgJiYgIVJlY0NvbmZpZ3MuaW5pdGVkIClcclxuICAgICAgIHtcclxuICAgICAgICAgICAgUmVjQ29uZmlncy5pbml0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgZ3JvdXBzQXJyOkFycmF5PGFueT4gPSBfcmVzLmdyb3VwcztcclxuICAgICAgICAgICAgdmFyIHJlc291cmNlc0FycjpBcnJheTxhbnk+ID0gX3Jlcy5yZXNvdXJjZXM7XHJcbiAgICAgICAgICAgIHZhciByZXNvdXJjZXNEaWN0OmFueSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IoIHZhciBpdGVtIGluIHJlc291cmNlc0FyciApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjaGlsZDphbnkgPSByZXNvdXJjZXNBcnJbaXRlbV07XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2goIGNoaWxkLnR5cGUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJiaW5cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHlwZSA9IExheWEuTG9hZGVyLkJVRkZFUjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibHNcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHlwZSA9IExheWEuU2NlbmU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxoXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnR5cGUgPSBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsbVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50eXBlID0gTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvdXJjZXNEaWN0W2NoaWxkLm5hbWVdID0gY2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yKCB2YXIgZ3JvdXB0eXBlIGluIGdyb3Vwc0FyciApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBncm91cGNoaWxkOmFueSA9IGdyb3Vwc0Fycltncm91cHR5cGVdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gZ3JvdXBjaGlsZC5rZXlzLnNwbGl0KCBcIixcIiApO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkQXJyOkFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICAgICAgICAgIHZhciBjaGlkc3RyO1xyXG4gICAgICAgICAgICAgICAgZm9yKCBjaGlkc3RyIGluIGFyciApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ckNoaWxkOnN0cmluZyA9IGFycltjaGlkc3RyXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggc3RyQ2hpbGQgIT0gXCJcIiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXJsczpzdHJpbmcgPSByZXNvdXJjZXNEaWN0W3N0ckNoaWxkXS51cmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybHMgPSB1cmxzLnJlcGxhY2UoXCJyZXMvXCIsQXNzZXRQYXRoLnJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQXJyLnB1c2goIHsgdXJsOkdsb2JhbC5nZXRVcmwodXJscyksIHR5cGU6cmVzb3VyY2VzRGljdFtzdHJDaGlsZF0udHlwZSB9ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5SZXNEaWNbZ3JvdXBjaGlsZC5uYW1lXSA9IGNoaWxkQXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIExheWEubG9hZGVyLmNsZWFyUmVzKEFzc2V0UGF0aC5nZXRSZXNDb25maWcoKSk7XHJcbiAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbn0iLCJpbXBvcnQgRXZlbnREaXNwYXRjaGVyPUxheWEuRXZlbnREaXNwYXRjaGVyO1xyXG5pbXBvcnQgU3ByaXRlM0QgPSBMYXlhLlNwcml0ZTNEO1xyXG5pbXBvcnQgVmVjdG9yMz1MYXlhLlZlY3RvcjM7XHJcbmV4cG9ydCBjbGFzcyBBc3NldFBhdGhcclxue1xyXG4gICBcclxuICAgIC8q57KS5a2Q54m55pWI5Zyw5Z2AKi9cclxuICAgIHN0YXRpYyBGeFByZWZhYnNQYXRoPVwicmVzL2NoYXJhY3Rlci9GWC9Db252ZW50aW9uYWwvRlgubGhcIjtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBc3NldE1hbmFnZXJcclxue1xyXG5cclxuICAgIC8qKuaJgOacieWcsOWbviovXHJcbiAgICBzdGF0aWMgQWxsTWFwRGljOlNwcml0ZTNEW109bmV3IEFycmF5KCk7XHJcblxyXG5cclxuICAgIC8qKuWKoOi9vei1hOa6kCovXHJcbiAgICBzdGF0aWMgTG9hZEFzc2V0RnVuKGZ1bjpGdW5jdGlvbilcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVzcGF0aHM6c3RyaW5nW10gPSBbXTtcclxuICAgICAgICByZXNwYXRocz1yZXNwYXRocy5jb25jYXQoQXNzZXRQYXRoLkZ4UHJlZmFic1BhdGgpO1xyXG4gICAgICAgIExheWEubG9hZGVyLmNyZWF0ZShyZXNwYXRocyxMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsKCk9PntcclxuXHJcbiAgICAgICAgICAgdmFyIFBsYXllclByZWZhYnM9TGF5YS5sb2FkZXIuZ2V0UmVzKEFzc2V0UGF0aC5GeFByZWZhYnNQYXRoKSBhcyBTcHJpdGUzRDtcclxuICAgICAgICAgICBpZihQbGF5ZXJQcmVmYWJzKVxyXG4gICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgZm9yKHZhciBpPTA7aTxQbGF5ZXJQcmVmYWJzLm51bUNoaWxkcmVuO2krKylcclxuICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICB2YXIgYXNzZXQ9UGxheWVyUHJlZmFicy5nZXRDaGlsZEF0KGkpIGFzIFNwcml0ZTNEO1xyXG4gICAgICAgICAgICAgICAgICBhc3NldC5hY3RpdmU9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuQWxsTWFwRGljLnB1c2goYXNzZXQpO1xyXG4gICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgIExheWEubG9hZGVyLmNsZWFyUmVzKEFzc2V0UGF0aC5GeFByZWZhYnNQYXRoKTtcclxuICAgICAgICAgICB9ZWxzZVxyXG4gICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJQb2xpY2VQcmVmYWJz5Li656m6XCIpO1xyXG4gICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICBpZihmdW4pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZ1bigpO1xyXG5cclxuICAgICAgICAgICAgfWVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJmdW7kuLrnqbpcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG5cclxufVxyXG5cclxuIiwiaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuXHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0NvbnRyb2wgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6QXVkaW9Db250cm9sO1xyXG4gICAgcHJpdmF0ZSBfaXNiZ09wZW46Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIG9wZW46Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9pc0FsbE9wZW46Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9ub3dCZ05hbWU6c3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgX2lzUGxheWJnaW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKlxyXG4gICAgICog5aOw6Z+z5byA5YWz5byV55So57Si5byVXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NvdW5kSW5kZXg6bnVtYmVyID0gMDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgQXVkaW9Db250cm9sLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpBdWRpb0NvbnRyb2xcclxuICAgIHtcclxuICAgICAgICBpZiggQXVkaW9Db250cm9sLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQXVkaW9Db250cm9sKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBBdWRpb0NvbnRyb2wuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLmF1dG9SZWxlYXNlU291bmQgPSBmYWxzZTtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5hdXRvU3RvcE11c2ljID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGdhbWVzb3VuZE9wZW4odmFsdWU6Ym9vbGVhbilcclxuICAgIHtcclxuICAgICAgICB0aGlzLm9wZW4gPSB2YWx1ZTtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5zb3VuZE11dGVkID0gIXZhbHVlO1xyXG4gICAgICAgIGlmKCB2YWx1ZSA9PSB0cnVlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmJ1dHRvblNvdW5kVm9sdW1lU2NhbGUgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5idXR0b25Tb3VuZFZvbHVtZVNjYWxlID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpn7PmlYjmmK/lkKblvIDlkK9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBHZXRTb3VuZFN3aXRjaCgpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcGVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgaXNiZ09wZW4odmFsdWU6Ym9vbGVhbilcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2JnT3BlbiA9IHZhbHVlO1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLm11c2ljTXV0ZWQgPSAhdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDog4zmma/pn7PkuZDmmK/lkKblvIDlkK9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpc2JnT3BlbigpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNiZ09wZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBpc0FsbE9wZW4oIHZhbHVlOmJvb2xlYW4gKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCB2YWx1ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VuZEluZGV4LS07XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9zb3VuZEluZGV4IDwgMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvdW5kSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLl9pc1BsYXliZ2luZyYmdGhpcy5fc291bmRJbmRleD09MCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzQWxsT3BlbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEdhbWVWb2x1bWUoIDEgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGxheWJnU291bmQoIHRoaXMuX25vd0JnTmFtZSApO1xyXG4gICAgICAgICAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmRWb2x1bWVTY2FsZSA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0FsbE9wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0FsbE9wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX3NvdW5kSW5kZXggPCAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc291bmRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fc291bmRJbmRleCsrO1xyXG4gICAgICAgICAgICBpZih0aGlzLl9pc1BsYXliZ2luZylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wYmdTb3VuZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2V0R2FtZVZvbHVtZSggMCApO1xyXG4gICAgICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5idXR0b25Tb3VuZFZvbHVtZVNjYWxlID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlgZzmraLmkq3mlL7pn7PmlYhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0b3BHYW1lU291bmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuc3RvcEFsbFNvdW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlgZzmraLmiYDmnInlo7Dpn7NcclxuICAgICAqL1xyXG4gICAgcHVibGljIENsZWFyQWxsU09VTkQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdG9wR2FtZVNvdW5kKCk7XHJcbiAgICAgICAgdGhpcy5zdG9wYmdTb3VuZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pKt5pS+6IOM5pmv6Z+z5LmQXHJcbiAgICAgKiBAcGFyYW0gc291bmROYW1lIOWjsOmfs+WQjVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGxheWJnU291bmQoIHNvdW5kTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbm93QmdOYW1lID0gc291bmROYW1lO1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc0FsbE9wZW4gJiYgdGhpcy5fbm93QmdOYW1lICE9IFwiXCIgJiYgdGhpcy5fc291bmRJbmRleDw9IDAgJiYgIXRoaXMuX2lzUGxheWJnaW5nIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzUGxheWJnaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIucGxheU11c2ljKCBBc3NldFBhdGguZ2V0c291bmQoIHRoaXMuX25vd0JnTmFtZSApICk7XHJcbiAgICAgICAgICAgIHRoaXMuYmdTb3VuZFZvbHVtZSA9IDAuNDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlgZzmraLog4zmma/pn7PkuZBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0b3BiZ1NvdW5kKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzUGxheWJnaW5nID0gZmFsc2U7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuc3RvcE11c2ljKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmiYDmnInpn7PkuZDmmK/lkKblvIDlkK9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpc0FsbE9wZW4oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzQWxsT3BlbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiuvue9ruiDjOaZr+mfs+S5kOmfs+mHj1xyXG4gICAgICogQHBhcmFtIHZhbHVlIOmfs+mHj+iMg+WbtOS7jiAw77yI6Z2Z6Z+z77yJ6IezIDHvvIjmnIDlpKfpn7Pph4/vvInjgIJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBiZ1NvdW5kVm9sdW1lKCB2YWx1ZTpudW1iZXIgKVxyXG4gICAge1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLnNldE11c2ljVm9sdW1lKCB2YWx1ZSApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgYmdTb3VuZFZvbHVtZSgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBMYXlhLlNvdW5kTWFuYWdlci5tdXNpY1ZvbHVtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiuvue9ruiDjOaZr+mfs+S5kOmfs+mHj1xyXG4gICAgICogQHBhcmFtIHZhbHVlIOmfs+mHj+iMg+WbtOS7jiAw77yI6Z2Z6Z+z77yJ6IezIDHvvIjmnIDlpKfpn7Pph4/vvInjgIJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBzb3VuZFZvbHVtZSggdmFsdWU6bnVtYmVyIClcclxuICAgIHtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5zZXRTb3VuZFZvbHVtZSggdmFsdWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNvdW5kVm9sdW1lKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIExheWEuU291bmRNYW5hZ2VyLnNvdW5kVm9sdW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K6+572u5omA5pyJ5aOw6Z+z6Z+z6YePXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUg6Z+z6YeP6IyD5Zu05LuOIDDvvIjpnZnpn7PvvInoh7MgMe+8iOacgOWkp+mfs+mHj++8ieOAglxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0R2FtZVZvbHVtZSh2YWx1ZTpudW1iZXIpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJnU291bmRWb2x1bWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnNvdW5kVm9sdW1lID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmkq3mlL7pn7PmlYhcclxuICAgICAqIEBwYXJhbSBzb3VuZE5hbWUg6Z+z5pWI5ZCNXHJcbiAgICAgKiBAcGFyYW0gbG9vcCDmkq3mlL7mrKHmlbBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBsYXlHYW1lU291bmQoIHNvdW5kTmFtZTpzdHJpbmcsIGxvb3A6bnVtYmVyID0gMSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5faXNBbGxPcGVuICYmIHNvdW5kTmFtZSAhPSBcIlwiICYmIExheWEuU291bmRNYW5hZ2VyLnNvdW5kVm9sdW1lICE9IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIucGxheVNvdW5kKCBBc3NldFBhdGguZ2V0c291bmQoIHNvdW5kTmFtZSApLGxvb3AgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbn0iLCJpbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4vUmVzb3VyY2VDb250cm9sXCI7XHJcbmltcG9ydCB7UmVzRGF0YUNvbnRyb2x9IGZyb20gXCIuL1Jlc0RhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7U2tpbkl0ZW19IGZyb20gXCIuLi91dGlscy9Ta2luSXRlbVwiO1xyXG5pbXBvcnQgQ3BhRG93bnNWaWV3IGZyb20gXCIuLi9QdXNoL0NwYURvd25zVmlld1wiO1xyXG5pbXBvcnQgQ3BhSXRlbSBmcm9tIFwiLi4vUHVzaC9DcGFJdGVtXCI7XHJcbmltcG9ydCBCYW9LdWFuR2FtZVZpZXcgZnJvbSBcIi4uL1B1c2gvQmFvS3VhbkdhbWVWaWV3XCI7XHJcbmltcG9ydCBTaGl3YW50dWlqaWFuVmlldyBmcm9tIFwiLi4vUHVzaC9TaGl3YW50dWlqaWFuVmlld1wiO1xyXG5pbXBvcnQgRnJpZW5kSW52aXRlVmlldyBmcm9tIFwiLi4vUHVzaC9GcmllbmRJbnZpdGVWaWV3XCI7XHJcbmltcG9ydCBUdWlqaWFuVmlldyBmcm9tIFwiLi4vUHVzaC9UdWlqaWFuVmlld1wiO1xyXG5pbXBvcnQgR2lmdFZpZXcgZnJvbSBcIi4uL1ZpZXcvR2lmdFZpZXdcIjtcclxuXHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBDb25uZWN0Q29udHJvbCBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnu4Tku7bnu5HlrppcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDb25uZWN0Q29tcG9uZW50KCk6IHZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgLy9tYWluXHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMnB3bGsxYVwiLCBTa2luSXRlbSk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyN1wiLCBDcGFEb3duc1ZpZXcpO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MjhcIiwgQ3BhSXRlbSk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyOVwiLCBCYW9LdWFuR2FtZVZpZXcpO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MmFcIiwgQ3BhSXRlbSk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyYlwiLCBTaGl3YW50dWlqaWFuVmlldyk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyY1wiLCBDcGFJdGVtKTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyZWtzYzIxXCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJla3NjMjJcIiwgQ3BhSXRlbSk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyZVwiLCBDcGFJdGVtKTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgydW90dTZoXCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIC8vIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJpcDYxNmxcIiwgR2lmdFZpZXcpO1xyXG4gICAgICAgIC8vIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MmRcIiwgVHVpamlhblZpZXcpO1xyXG4gICAgICAgIC8vIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrYWxyNmtcIixGcmllbmRJbnZpdGVWaWV3KTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIG1vdGlvbkNyb3NzOkJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIGJsZW5kVHlwZTpudW1iZXIgPSAwO1xyXG5cdHByaXZhdGUgbW90aW9uSW5kZXg6bnVtYmVyID0gMDtcclxuXHRwcml2YXRlIG1vdGlvbnM6QXJyYXk8c3RyaW5nPiA9IFtcInJ1blwiLCBcInJ1bl8yXCIsIFwiYXR0YWNrXCIsIFwiYXR0YWNrXzFcIiwgXCJhdHRhY2tfMlwiLCBcImRlYWRcIiwgXCJpZGxlXzJcIiwgXCJpZGxlXzNcIiwgXCJpZGxlXzRcIiwgXCJpZGxlNFwiLCBcInJlbG9hZFwiLCBcInJlcGxhY2VcIiwgXCJyZXBsYWNlXzJcIiwgXCJzdG9wXCJdO1xyXG5cdFxyXG4gICAgcHJpdmF0ZSBzY2VuZUxvYWRlZChzY2VuZTpMYXlhLlNjZW5lM0QpOnZvaWQge1xyXG4gICAgICAgIFxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoc2NlbmUpO1xyXG4gICAgICAgIHZhciBhbmltYXRvcjpMYXlhLkFuaW1hdG9yID0gc2NlbmUuZ2V0Q2hpbGRBdCgyKS5nZXRDb21wb25lbnQoTGF5YS5BbmltYXRvcik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5hZGRCdXR0b24oMTAwLCAxMDAsIDE2MCwgMzAsIFwi5Yqo55S76L+H5rihOuWQplwiLCAyMCwgZnVuY3Rpb24oZTpMYXlhLkV2ZW50KTp2b2lkIHtcclxuICAgICAgICAgICAgdGhpcy5tb3Rpb25Dcm9zcyA9ICF0aGlzLm1vdGlvbkNyb3NzO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tb3Rpb25Dcm9zcylcclxuICAgICAgICAgICAgICAgIChlLnRhcmdldCBhcyBMYXlhLkJ1dHRvbikubGFiZWwgPSBcIuWKqOeUu+i/h+a4oTrmmK9cIjtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgKGUudGFyZ2V0IGFzIExheWEuQnV0dG9uKS5sYWJlbCA9IFwi5Yqo55S76L+H5rihOuWQplwiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuYWRkQnV0dG9uKDEwMCwgMTYwLCAxNjAsIDMwLCBcIua3t+WQiOaooeW8jzrlhajouqtcIiwgMjAsIGZ1bmN0aW9uKGU6TGF5YS5FdmVudCk6dm9pZCB7XHJcbiAgICAgICAgICAgIHRoaXMuYmxlbmRUeXBlKys7ICAgXHJcbiAgICAgICAgICAgICh0aGlzLmJsZW5kVHlwZSA9PT0gMykgJiYgKHRoaXMuYmxlbmRUeXBlID0gMCk7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5ibGVuZFR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAwOiBcclxuICAgICAgICAgICAgICAgIChlLnRhcmdldCBhcyBMYXlhLkJ1dHRvbikubGFiZWwgPSBcIua3t+WQiOaooeW8jzrlhajouqtcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDE6IFxyXG4gICAgICAgICAgICAgICAgKGUudGFyZ2V0IGFzIExheWEuQnV0dG9uKS5sYWJlbCA9IFwi5re35ZCI5qih5byPOuS4iui6q1wiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMjogXHJcbiAgICAgICAgICAgICAgICAoZS50YXJnZXQgYXMgTGF5YS5CdXR0b24pLmxhYmVsID0gXCLmt7flkIjmqKHlvI865LiL6LqrXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuYWRkQnV0dG9uKDEwMCwgMjIwLCAyNjAsIDQwLCBcIuWIh+aNouWKqOS9nDphdHRhY2tfMlwiLCAyOCwgZnVuY3Rpb24oZTpMYXlhLkV2ZW50KTp2b2lkIHtcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmJsZW5kVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIDA6IFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW90aW9uQ3Jvc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBhbmltYXRvci5jcm9zc0ZhZGUodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAwLjIsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLmNyb3NzRmFkZSh0aGlzLm1vdGlvbnNbdGhpcy5tb3Rpb25JbmRleF0sIDAuMiwgMSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLnBsYXkodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICBhbmltYXRvci5wbGF5KHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XSwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxOiBcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vdGlvbkNyb3NzKVxyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLmNyb3NzRmFkZSh0aGlzLm1vdGlvbnNbdGhpcy5tb3Rpb25JbmRleF0sIDAuMiwgMCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0b3IucGxheSh0aGlzLm1vdGlvbnNbdGhpcy5tb3Rpb25JbmRleF0sIDApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMjogXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb3Rpb25Dcm9zcylcclxuICAgICAgICAgICAgICAgICAgICBhbmltYXRvci5jcm9zc0ZhZGUodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAwLjIsIDEpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLnBsYXkodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAxKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIChlLnRhcmdldCBhcyBMYXlhLkJ1dHRvbikubGFiZWwgPSBcIuWIh+aNouWKqOS9nDpcIiArIHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XTtcclxuICAgICAgICAgICAgdGhpcy5tb3Rpb25JbmRleCsrO1xyXG4gICAgICAgICAgICAodGhpcy5tb3Rpb25JbmRleCA9PT0gdGhpcy5tb3Rpb25zLmxlbmd0aCkgJiYgKHRoaXMubW90aW9uSW5kZXggPSAwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBhZGRCdXR0b24oeDpudW1iZXIsIHk6bnVtYmVyLCB3aWR0aDpudW1iZXIsIGhlaWdodDpudW1iZXIsIHRleHQ6c3RyaW5nLCBzaXplOm51bWJlciwgY2xpY2tGdW46RnVuY3Rpb24pOnZvaWQge1xyXG4gICAgICAgIHZhciB0aGlzcyA9IHRoaXM7XHJcbiAgICAgICAgTGF5YS5sb2FkZXIubG9hZChbXCJyZXMvdGhyZWVEaW1lbi91aS9idXR0b24ucG5nXCJdLCBMYXlhLkhhbmRsZXIuY3JlYXRlKG51bGwsIGZ1bmN0aW9uKCk6dm9pZCB7XHJcbiAgICAgICAgdmFyIGNoYW5nZUFjdGlvbkJ1dHRvbjpMYXlhLkJ1dHRvbiA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuQnV0dG9uKFwicmVzL3RocmVlRGltZW4vdWkvYnV0dG9uLnBuZ1wiLCB0ZXh0KSkgYXMgTGF5YS5CdXR0b247XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnNpemUod2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLmxhYmVsQm9sZCA9IHRydWU7XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLmxhYmVsU2l6ZSA9IHNpemU7XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnNpemVHcmlkID0gXCI0LDQsNCw0XCI7XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnNjYWxlKExheWEuQnJvd3Nlci5waXhlbFJhdGlvLCBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnBvcyh4LCB5KTtcclxuICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ub24oTGF5YS5FdmVudC5DTElDSywgdGhpc3MsIGNsaWNrRnVuKTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOaVsOaNrue7keWumlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbm5uZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuQ29ubmVjdEZhaXJ5Z3VpKCk7XHJcbiAgICAgICAgdGhpcy5Db25uZWN0Q29tcG9uZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB1aeahhuaetueahOe7keWumlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbm5lY3RGYWlyeWd1aSgpOiB2b2lkIHtcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5nYW1lTG9hZGVyTWFuYWdlciA9IFJlc291cmNlQ29udHJvbC5JbnN0YW5jZTtcclxuICAgICAgICAvL+eJueaViOe7keWumiggdXJsIOe7keWumue7hOWQje+8jOWPquacieWFrOWFseeJueaViOmcgOimgee7keWumiApIFwidWk6Ly9mcXBneHIxa2w2bXcwXCI6XCJlZmZlY3QxXCJcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5nYW1lRWZmZWN0RGljdCA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG59IiwiaW1wb3J0IHtMb2NhbERhdGFDb250cm9sfSBmcm9tIFwiLi9Mb2NhbERhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7IFRpbWVVdGlscyB9IGZyb20gXCIuLi9UaW1lL1RpbWVVdGlsc1wiO1xyXG5pbXBvcnQge1VzZXJEYXRhSW5mb30gZnJvbSBcIi4uL0RhdGEvVXNlckRhdGFJbmZvXCI7XHJcbmltcG9ydCB7IFRpbWVzVGFtcGVyIH0gZnJvbSBcIi4uL1RpbWUvVGltZXNUYW1wZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRlQ29udHJvbHtcclxuICAgIHB1YmxpYyBzdGF0aWMgRnJlc2g6Ym9vbGVhbjtcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOkRhdGVDb250cm9sO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBEYXRlQ29udHJvbC5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0ICBJbnN0YW5jZSgpOkRhdGVDb250cm9sXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIERhdGVDb250cm9sLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZUNvbnRyb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIERhdGVDb250cm9sLmlucztcclxuICAgIH1cclxuXHJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBsb2FkVUkoKTp2b2lkIHtcclxuICAgICAgICBMYXlhLmxvYWRlci5sb2FkKFtcInJlcy90aHJlZURpbWVuL3VpL2J1dHRvbi5wbmdcIl0sIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgZnVuY3Rpb24oKTp2b2lkIHtcclxuICAgICAgICAgICAgdmFyIGJ1dHRvbiA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuQnV0dG9uKFwicmVzL3RocmVlRGltZW4vdWkvYnV0dG9uLnBuZ1wiLCBcIuWFs+mXrUhEUlwiKSkgYXMgTGF5YS5CdXR0b247XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zaXplKDIwMCwgNDApO1xyXG4gICAgICAgICAgICBidXR0b24ubGFiZWxCb2xkID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnV0dG9uLmxhYmVsU2l6ZSA9IDMwO1xyXG4gICAgICAgICAgICBidXR0b24uc2l6ZUdyaWQgPSBcIjQsNCw0LDRcIjtcclxuICAgICAgICAgICAgYnV0dG9uLnNjYWxlKExheWEuQnJvd3Nlci5waXhlbFJhdGlvLCBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5wb3MoTGF5YS5zdGFnZS53aWR0aCAvIDIgLSBidXR0b24ud2lkdGggKiBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyAvIDIsIExheWEuc3RhZ2UuaGVpZ2h0IC0gNjAgKiBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCBmdW5jdGlvbigpOnZvaWQge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVuYWJsZUhEUjpCb29sZWFuID0gdGhpcy5jYW1lcmEuZW5hYmxlSERSO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYWJsZUhEUilcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24ubGFiZWwgPSBcIuW8gOWQr0hEUlwiO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5sYWJlbCA9IFwi5YWz6ZetSERSXCI7XHJcblx0XHRcdFx0XHR0aGlzLmNhbWVyYS5lbmFibGVIRFIgPSAhZW5hYmxlSERSO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHVibGljIFNldFNlbGYoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxhc3RkYXk6c3RyaW5nID0gTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5nZXRzdHIoIFVzZXJEYXRhSW5mby5sYXN0RGF5IClcclxuICAgICAgICB2YXIgbm93ZGF5OnN0cmluZyA9IFRpbWVVdGlscy5mb3JtYXRZZWFyTW9udGhEYXRlMSggVGltZXNUYW1wZXIuSW5zdGFuY2Uuc2VydmVyVGltZSApO1xyXG4gICAgICAgIGlmKCBsYXN0ZGF5ICE9IG5vd2RheSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLmxhc3REYXksbm93ZGF5ICk7XHJcbiAgICAgICAgICAgIERhdGVDb250cm9sLkZyZXNoID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRGF0ZUNvbnRyb2wuRnJlc2ggPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBKb3lzdGlja01vZHVsZSB9IGZyb20gXCIuLi9Kb3lzdGlja01vZHVsZVwiO1xyXG5pbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQge1NjZW5lQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvU2NlbmVDb250cm9sXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7TnBjU2NyaXB0fSBmcm9tIFwiLi4vR2FtZS9OcGNTY3JpcHRcIjtcclxuaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgR2FtZUNGRyBmcm9tIFwiLi4vQ0ZHL0dhbWVDRkdcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0F1ZGlvQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IHtSb2xlRGF0YX0gZnJvbSBcIi4uL0RhdGEvUm9sZURhdGFcIjtcclxuaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWNcIjtcclxuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5pbXBvcnQge0FnZW5jeVRyaWFsfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVRyaWFsXCI7XHJcbmltcG9ydCB7QWdlbmN5U2tpbn0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lTa2luXCI7XHJcbmltcG9ydCB7U2tpbkRhdGF9IGZyb20gXCIuLi9EYXRhL1NraW5EYXRhXCI7XHJcbmltcG9ydCB7IERpc1BhdGNoZXJPbiB9IGZyb20gXCIuLi91dGlscy9EaXNQYXRjaGVyT25cIjtcclxuaW1wb3J0IHsgUmVjb3JkTWFuYWdlciB9IGZyb20gXCIuLi9XWFNESy9SZWNvcmRNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgR2FtZVN0YXRlQ29udHJvbCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6R2FtZVN0YXRlQ29udHJvbDtcclxuXHJcbiAgICBwcml2YXRlIF9qb3lzdGlja01vZHVsZTpKb3lzdGlja01vZHVsZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIDA65pyq5byA5aeL77yMMe+8mua4uOaIj+S4re+8jDLvvJrmmoLlgZzkuK1cclxuICAgICAqL1xyXG4gICAgbm93R2FtZVN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfemh1YW54aWFuZ2JlaXNodTpudW1iZXIgPSAwO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBHYW1lU3RhdGVDb250cm9sLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpHYW1lU3RhdGVDb250cm9sXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIEdhbWVTdGF0ZUNvbnRyb2wuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBHYW1lU3RhdGVDb250cm9sKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBHYW1lU3RhdGVDb250cm9sLmlucztcclxuICAgIH0gICBcclxuXHJcbiAgICBwcml2YXRlIF9odWFkb25nU3BlZWRYOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9odWFkb25nQ2xpbWJTcGVlZFg6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgZW5kR2FtZVBsYXllckFycjpBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgcHVibGljIGluaXQoICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2h1YWRvbmdTcGVlZFggPSBOdW1iZXIoR2FtZUNGRy5kaWN0WzRdLnZhbHVlKTtcclxuICAgICAgICB0aGlzLl9odWFkb25nQ2xpbWJTcGVlZFggPSBOdW1iZXIoR2FtZUNGRy5kaWN0WzVdLnZhbHVlKTtcclxuICAgICAgICBpZiggR2FtZUNGRy5kaWN0WzddIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3podWFueGlhbmdiZWlzaHUgPSBOdW1iZXIoIEdhbWVDRkcuZGljdFs3XS52YWx1ZSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl96aHVhbnhpYW5nYmVpc2h1ID0gMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKCBHYW1lU3RhdGUubG9zZSx0aGlzLHRoaXMuZW5kR2FtZSk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lciggR2FtZVN0YXRlLmVuZCx0aGlzLHRoaXMuZW5kR2FtZSApO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVTdGF0ZS5ucGNlbmQsdGhpcyx0aGlzLm5wY2VuZEdhbWVIYW5kbGVyICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBucGNlbmRHYW1lSGFuZGxlciggc3RyOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmVuZEdhbWVQbGF5ZXJBcnIucHVzaCggc3RyICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldENsaWNrUGFuZWwoIHBhbmVsOmZhaXJ5Z3VpLkdMb2FkZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fam95c3RpY2tNb2R1bGUgPSBuZXcgSm95c3RpY2tNb2R1bGUocGFuZWwpO1xyXG4gICAgICAgIHRoaXMuX2pveXN0aWNrTW9kdWxlLnNldEV2ZW50Q2FsbGJhY2soIHRoaXMsdGhpcy5vbmRvd25mdW4sdGhpcy5vbm1vdmVmdW4sdGhpcy5vbnVwZnVuICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNuZWVkU2h1bnlpWDpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9ub3dUaW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIG9uZG93bmZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9sYXN0QW5nbGUgPSAwO1xyXG4gICAgICAgIHRoaXMuX25vd1RpbWUgPSBMYXlhLkJyb3dzZXIubm93KCkvMTAwMDtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2xhc3RBbmdsZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBvbm1vdmVmdW4oIG9mZnNldFg6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLm5vd0dhbWVTdGF0ZSA9PSAxIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkaXNBbmdsZTpudW1iZXIgPSB0aGlzLl9qb3lzdGlja01vZHVsZS5hbmdsZSAtIHRoaXMuX2xhc3RBbmdsZTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdEFuZ2xlID0gdGhpcy5fam95c3RpY2tNb2R1bGUuYW5nbGU7XHJcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5pc2Nhcm1hbnBjIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgKFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3RbXCJucGNfMFwiXSBhcyBOcGNTY3JpcHQpLkpveShvZmZzZXRYID4gMCA/IHRoaXMuX2h1YWRvbmdTcGVlZFg6LXRoaXMuX2h1YWRvbmdTcGVlZFgsZGlzQW5nbGUqdGhpcy5femh1YW54aWFuZ2JlaXNodSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuUGxheWVyU2NyaXB0LkpveSggb2Zmc2V0WCA+IDAgPyB0aGlzLl9odWFkb25nU3BlZWRYOi10aGlzLl9odWFkb25nU3BlZWRYLG9mZnNldFggPiAwID8gdGhpcy5faHVhZG9uZ0NsaW1iU3BlZWRYOi10aGlzLl9odWFkb25nQ2xpbWJTcGVlZFgsZGlzQW5nbGUqdGhpcy5femh1YW54aWFuZ2JlaXNodSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb251cGZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggUHJvcE1hbmFnZXIuaXNjYXJtYW5wYyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAoUHJvcE1hbmFnZXIubnBjc2NyaXB0RGljdFtcIm5wY18wXCJdIGFzIE5wY1NjcmlwdCkuSm95KDAsMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLm5vd0dhbWVTdGF0ZSA9PSAxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLlBsYXllclNjcmlwdC5Kb3koIDAsMCwwICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIG5vd01pbmdDaTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfbnVtczpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfYWxsOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMubm93R2FtZVN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSA9IDA7XHJcbiAgICAgICAgICAgIHZhciBucGNkaWN0OmFueSA9IFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3Q7XHJcbiAgICAgICAgICAgIHRoaXMuX251bXMgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLl9hbGwgPSAwO1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIG5wY3NwOk5wY1NjcmlwdDtcclxuICAgICAgICAgICAgZm9yKCBzIGluIG5wY2RpY3QgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBucGNzcCA9IG5wY2RpY3Rbc107XHJcbiAgICAgICAgICAgICAgICBpZiggbnBjc3AuZ2V0QWN0aW9uKCkgPT0gMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi56IDwgbnBjc3AuZ2V0UG9zdGlvbigpLnogKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbnVtcysrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGwgKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5ub3dNaW5nQ2kgPSB0aGlzLmVuZEdhbWVQbGF5ZXJBcnIubGVuZ3RoICsgKCggdGhpcy5fYWxsICsgMSApIC0gdGhpcy5fbnVtcyk7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLnR4dF9taW5nY2kudGV4dCA9IFwi56ysXCIgKyB0aGlzLm5vd01pbmdDaSArIFwi5ZCNXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGFydEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gKFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSkuUm9sZURhdGE7XHJcbiAgICAgICAgdmFyIGFnZW5jeXNraW46QWdlbmN5U2tpbiA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5U2tpbiApO1xyXG4gICAgICAgIHZhciBub2hhc3NraW5BcnI6QXJyYXk8U2tpbkRhdGE+ID0gYWdlbmN5c2tpbi5HYWluTm9IYXZlU2tpbigpO1xyXG4gICAgICAgIGlmKCBub2hhc3NraW5BcnIubGVuZ3RoID09IDAgIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZW50ZXJnYW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICggUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lUcmlhbCApIGFzIEFnZW5jeVRyaWFsICkub3BlbnZpZXcobm9oYXNza2luQXJyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVudGVyZ2FtZShqaWFzdT8pOnZvaWRcclxuICAgIHtcclxuICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlJlY29yZFN0YXJ0KCk7XHJcbiAgICAgICAgdGhpcy5ub3dNaW5nQ2kgPSAwO1xyXG4gICAgICAgIHRoaXMuZW5kR2FtZVBsYXllckFyci5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMubm93R2FtZVN0YXRlID0gMTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgdGhpcy51cGRhdGUoIDUwMCApO1xyXG4gICAgICAgIGlmKGppYXN1KXtcclxuICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLnN0YXJ0LGppYXN1ICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5zdGFydCApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UucGxheWJnU291bmQoXCJiZ21cIik7XHJcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLkuLvnlYzpnaLngrnlh7vlvIDlp4vmuLjmiI8uLi5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0b3BHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubm93R2FtZVN0YXRlID0gMjtcclxuICAgICAgICB0aGlzLm9udXBmdW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5kR2FtZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggUHJvcE1hbmFnZXIuamlhbnRvdUFyciAmJiBQcm9wTWFuYWdlci5qaWFudG91QXJyLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxMYXlhLk1lc2hTcHJpdGUzRD4gPSBQcm9wTWFuYWdlci5qaWFudG91QXJyO1xyXG4gICAgICAgICAgICBmb3IoIHZhciBpOm51bWJlciA9YXJyLmxlbmd0aC0xO2kgPj0wO2ktLSAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhcnJbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICAgICAgYXJyLnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuamlhbnRvdUFyci5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMubm93R2FtZVN0YXRlID0gMDtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gUHJvcE1hbmFnZXIubnBjc2NyaXB0RGljdDtcclxuICAgICAgICBpZiggbnBjZGljdCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IoIHZhciBzIGluIG5wY2RpY3QgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAobnBjZGljdFtzXSBhcyBOcGNTY3JpcHQpLnN0b3AoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9udXBmdW4oKTtcclxuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2Uuc3RvcGJnU291bmQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHsgTGF5T1VUIH0gZnJvbSBcIi4uL3V0aWxzL0xheU9VVFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgTGF5b3V0Q29udHJvbCBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIGluczpMYXlvdXRDb250cm9sO1xyXG4gICAgcHJpdmF0ZSBfdWlsYXllclpvcmRlcjpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfdXB1aWxheWVyWm9yZGVyOm51bWJlciA9IDIwMDtcclxuICAgIHByaXZhdGUgX3RpcHNsYXllclpvcmRlcjpudW1iZXIgPSAxMDAwO1xyXG4gICAgcHJpdmF0ZSBfZ3VpZGVsYXllclpvcmRlcjpudW1iZXIgPSA2MDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB1aeWxglxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVpTGF5ZXI6ZmFpcnlndWkuR0NvbXBvbmVudCA9IG5ldyBmYWlyeWd1aS5HQ29tcG9uZW50KCk7XHJcbiAgICBcclxuICAgICAvKipcclxuICAgICAgKiDmnIDlrprlsYJcclxuICAgICAgKi9cclxuICAgIHB1YmxpYyB0b3BMYXllcjpmYWlyeWd1aS5HQ29tcG9uZW50ID0gbmV3IGZhaXJ5Z3VpLkdDb21wb25lbnQoKTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDog4zmma/lsYIoIOaIluiAhTNE5Zy65pmv5bGCIClcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJhY2tncm91bmQ6ZmFpcnlndWkuR0NvbXBvbmVudCA9IG5ldyBmYWlyeWd1aS5HQ29tcG9uZW50KCk7XHJcblxyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgTGF5b3V0Q29udHJvbC5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6TGF5b3V0Q29udHJvbFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlvdXRDb250cm9sLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGF5b3V0Q29udHJvbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTGF5b3V0Q29udHJvbC5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbiAgICBwdWJsaWMgQWRkTGF5ZXJCeU5hbWUoIGl0ZW12aWV3OmZhaXJ5Z3VpLkdPYmplY3QsbGF5ZXI6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKGxheWVyID09IExheU9VVC5CRyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLmJhY2tncm91bmQuYWRkQ2hpbGQoIGl0ZW12aWV3ICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYobGF5ZXIgPT0gTGF5T1VULlVJKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdWlsYXllclpvcmRlcisrO1xyXG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLnVpTGF5ZXIuYWRkQ2hpbGQoaXRlbXZpZXcpO1xyXG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgPSB0aGlzLl91aWxheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCBsYXllciA9PSBMYXlPVVQuVUlUb3AgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdXB1aWxheWVyWm9yZGVyKys7XHJcbiAgICAgICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UudWlMYXllci5hZGRDaGlsZCggaXRlbXZpZXcgKTtcclxuICAgICAgICAgICAgaXRlbXZpZXcuc29ydGluZ09yZGVyICA9IHRoaXMuX3VwdWlsYXllclpvcmRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihsYXllciA9PSBMYXlPVVQuVElQKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gR2FtZUxheWVyTWFuYWdlci5JbnN0YW5jZS50aXBzTGF5ZXIuYWRkQ2hpbGQoaXRlbXZpZXcpO1xyXG4gICAgICAgICAgICB0aGlzLl90aXBzbGF5ZXJab3JkZXIrKztcclxuICAgICAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS51aUxheWVyLmFkZENoaWxkKCBpdGVtdmlldyApO1xyXG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgID0gdGhpcy5fdGlwc2xheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCBsYXllciA9PSBMYXlPVVQuR1VJREUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZ3VpZGVsYXllclpvcmRlcisrO1xyXG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLnVpTGF5ZXIuYWRkQ2hpbGQoaXRlbXZpZXcpO1xyXG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgID0gdGhpcy5fZ3VpZGVsYXllclpvcmRlcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8v5Yid5aeL5YyW5bGC57qnXHJcblx0cHVibGljIGluaXRsYXllcigpOnZvaWRcclxuXHR7XHJcblx0XHRHbG9iYWwuc3RhZ2UuYWRkQ2hpbGQoIGZhaXJ5Z3VpLkdSb290Lmluc3QuZGlzcGxheU9iamVjdCApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMuYmFja2dyb3VuZCApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMudWlMYXllciApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMudG9wTGF5ZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIHNjZW5lOkxheWEuU2NlbmUzRDtcclxuICAgIHByaXZhdGUgdG1wVmVjdG9yOkxheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUgbWF0MTpMYXlhLkJsaW5uUGhvbmdNYXRlcmlhbDsgXHJcbiAgICBwcml2YXRlIG1lc2gxOkxheWEuTWVzaDtcclxuICAgIHByaXZhdGUgbWVzaDI6TGF5YS5NZXNoO1xyXG4gICAgcHVibGljIGFkZEhvcml6b250YWxCb3goeDpudW1iZXIsIHk6bnVtYmVyLCB6Om51bWJlcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBib3g6TGF5YS5NZXNoU3ByaXRlM0QgPSB0aGlzLnNjZW5lLmFkZENoaWxkKG5ldyBMYXlhLk1lc2hTcHJpdGUzRCh0aGlzLm1lc2gyKSkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgYm94Lm1lc2hSZW5kZXJlci5tYXRlcmlhbCA9IHRoaXMubWF0MTtcclxuICAgICAgICBib3gubWVzaFJlbmRlcmVyLmNhc3RTaGFkb3cgPSB0cnVlO1xyXG4gICAgICAgIGJveC5tZXNoUmVuZGVyZXIucmVjZWl2ZVNoYWRvdyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy50bXBWZWN0b3Iuc2V0VmFsdWUoeCwgeSwgeik7XHJcbiAgICAgICAgYm94LnRyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMudG1wVmVjdG9yO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciByaWdpZEJvZHk6TGF5YS5SaWdpZGJvZHkzRCA9IGJveC5hZGRDb21wb25lbnQoTGF5YS5SaWdpZGJvZHkzRCkgYXMgTGF5YS5SaWdpZGJvZHkzRDtcclxuICAgICAgICByaWdpZEJvZHkubWFzcyA9IDEwO1xyXG4gICAgICAgIHJpZ2lkQm9keS5mcmljdGlvbiA9IDEuMDtcclxuICAgICAgICByaWdpZEJvZHkucmVzdGl0dXRpb24gPSAwLjI7XHJcbiAgICAgICAgdmFyIGJveFNoYXBlOkxheWEuQm94Q29sbGlkZXJTaGFwZSA9IG5ldyBMYXlhLkJveENvbGxpZGVyU2hhcGUoMiwgMC4zMywgMC41KTtcclxuICAgICAgICByaWdpZEJvZHkuY29sbGlkZXJTaGFwZSA9IGJveFNoYXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwdWJsaWMgQ2xlYXJMYXllckJ5TmFtZSggbGF5ZXI6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggbGF5ZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBMYXlPVVQuVUk6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91aWxheWVyWm9yZGVyLS07XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdWlsYXllclpvcmRlciA8IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VpbGF5ZXJab3JkZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBMYXlPVVQuVUlUb3A6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cHVpbGF5ZXJab3JkZXItLTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl91cHVpbGF5ZXJab3JkZXIgPCAyMDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwdWlsYXllclpvcmRlciA9IDIwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTGF5T1VULlRJUDpcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpcHNsYXllclpvcmRlci0tO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RpcHNsYXllclpvcmRlciA8IDEwMDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpcHNsYXllclpvcmRlciA9IDEwMDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIExheU9VVC5HVUlERTpcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpcHNsYXllclpvcmRlci0tO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RpcHNsYXllclpvcmRlciA8IDYwMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyID0gNjAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBjYW1lcmE6TGF5YS5DYW1lcmE7XHJcbiAgICBwcml2YXRlIGxheWFNb25rZXkzRDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBsYXlhTW9ua2V5MkQ6TGF5YS5JbWFnZTtcclxuICAgIHByaXZhdGUgX3Bvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgcHJpdmF0ZSBfb3V0UG9zID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgcHJpdmF0ZSBzY2FsZURlbHRhOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNvbXBsZXRlKCkge1xyXG4gICAgICAgIC8v5Yqg6L295LiJ57u05Zyw6Z2iXHJcbiAgICAgICAgdmFyIGdyaWQgPSB0aGlzLnNjZW5lLmFkZENoaWxkKExheWEuTG9hZGVyLmdldFJlcyhcInJlcy90aHJlZURpbWVuL3N0YXRpY01vZGVsL2dyaWQvcGxhbmUubGhcIikpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgLy/liqDovb3kuoznu7TnjLTlrZBcclxuICAgICAgICB0aGlzLmxheWFNb25rZXkyRCA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuSW1hZ2UoXCJyZXMvdGhyZWVEaW1lbi9tb25rZXkucG5nXCIpKSBhcyBMYXlhLkltYWdlO1xyXG4gICAgICAgIC8v5byA5ZCv5a6a5pe25Zmo5b6q546vXHJcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoMSwgdGhpcywgdGhpcy5hbmltYXRlKTtcclxuICAgIH1cclxuXHRcdFxyXG5cdHByaXZhdGUgYW5pbWF0ZSgpIHtcclxuICAgICAgICAvL+WPmOaNouS9jee9rlxyXG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uLnggPSBNYXRoLnNpbih0aGlzLnNjYWxlRGVsdGEgKz0gMC4wMSk7XHJcbiAgICAgICAgLy/orqHnrpfkvY3nva5cclxuICAgICAgICB0aGlzLmNhbWVyYS52aWV3cG9ydC5wcm9qZWN0KHRoaXMuX3Bvc2l0aW9uLCB0aGlzLmNhbWVyYS5wcm9qZWN0aW9uVmlld01hdHJpeCwgdGhpcy5fb3V0UG9zKTtcclxuICAgICAgICB0aGlzLmxheWFNb25rZXkyRC5wb3ModGhpcy5fb3V0UG9zLnggLyBMYXlhLnN0YWdlLmNsaWVudFNjYWxlWCwgdGhpcy5fb3V0UG9zLnkgLyBMYXlhLnN0YWdlLmNsaWVudFNjYWxlWSk7XHJcbiAgICB9XHRcclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbn0iLCJpbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4uL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XHJcbmltcG9ydCB7UGxhdGZyb21UeXBlfSBmcm9tIFwiLi4vV1hTREsvUGxhdGZyb21UeXBlXCI7XHJcblxyXG4vKlxyXG4qIOacrOWcsOaVsOaNrue8k+WtmOeuoeeQhuWZqFxyXG4qL1xyXG5leHBvcnQgY2xhc3MgTG9jYWxEYXRhQ29udHJvbCBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGluczogTG9jYWxEYXRhQ29udHJvbDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIExvY2FsRGF0YUNvbnRyb2wuaW5zID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBMb2NhbERhdGFDb250cm9sIHtcclxuICAgICAgICBpZiAoTG9jYWxEYXRhQ29udHJvbC5pbnMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsRGF0YUNvbnRyb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIExvY2FsRGF0YUNvbnRyb2wuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoOacrOWcsOe8k+WtmOaVsOaNriBvYmplY3RcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICB0aGlzLkFkZExvY2FsRGF0YShrZXksIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluacrOWcsOe8k+WtmOaVsOaNriBvYmplY3RcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPYmooa2V5OiBzdHJpbmcpOiBhbnkgXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0TG9jYWxDYUNoZURhdGEoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoOacrOWcsOe8k+WtmOaVsOaNriBzdHJpbmdcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRzdHIoa2V5OiBzdHJpbmcsIHZhbHVlOnN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWRkQ2FjaGVTdHIoa2V5LCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZG51bSgga2V5OnN0cmluZyx2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRDYWNoZVN0cihrZXksIHZhbHVlLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5pys5Zyw57yT5a2Y5pWw5o2uIHN0cmluZ1xyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldHN0cihrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVzdHIoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluacrOWcsOe8k+WtmOaVsOaNriBudW1iZXJcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRudW0oIGtleTpzdHJpbmcgKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMuZ2V0Q2FjaGVzdHIoa2V5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIbmjIflrprmnKzlnLDnvJPlrZjmlbDmja5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDYWNoZShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVtb3Zlc2VsZWN0Q2FjaGUoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4heeQhuaJgOacieacrOWcsOe8k+WtmOaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhckFsbENhY2hlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFkZExvY2FsRGF0YShrZXksIHZhbHVlKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcmFnZVN5bmNXWChrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRKU09OKGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExvY2FsQ2FDaGVEYXRhKGtleTogc3RyaW5nKTogYW55IFxyXG4gICAge1xyXG4gICAgICAgIHZhciBvYmo6YW55O1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgb2JqID0gdGhpcy5nZXRTdG9yYWdlU3luY1dYKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgb2JqID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SlNPTihrZXkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoICFvYmogKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb2JqID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZENhY2hlU3RyKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcmFnZVN5bmNXWChrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENhY2hlc3RyKGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIjBcIjtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRTdG9yYWdlU3luY1dYKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBzdHIgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3RyID09IG51bGwgfHwgc3RyID09IFwiXCIpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3RyID0gXCIwXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZXNlbGVjdENhY2hlKGtleTogc3RyaW5nKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU3RvcmFnZVdYKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBjbGVhckFsbENhY2hlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclN0b3JhZ2VXWCgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOacrOWcsOWtmOWCqFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0U3RvcmFnZVN5bmNXWChrZXk6c3RyaW5nLCBkYXRhOmFueSkgXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3guc2V0U3RvcmFnZVN5bmMoa2V5LCBkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5pys5Zyw5a2Y5YKoXHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U3RvcmFnZVN5bmNXWChrZXk6c3RyaW5nKTphbnkgXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHd4LmdldFN0b3JhZ2VTeW5jKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5pys5Zyw57yT5a2Y5Lit56e76Zmk5oyH5a6aIGtleVxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZVN0b3JhZ2VXWChrZXk6c3RyaW5nKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5yZW1vdmVTdG9yYWdlKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5riF55CG5a2Y5YKo5pWw5o2uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhclN0b3JhZ2VXWCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNsZWFyU3RvcmFnZVN5bmMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUmVzb3VyY2VDb250cm9sXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XHJcbmltcG9ydCB7Vmlld0FjdGlvbn0gZnJvbSBcIi4uL3V0aWxzL1ZpZXdBY3Rpb25cIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XHJcbmltcG9ydCB7Q29tcG9uZW50RXZlbnREYXRhfSBmcm9tIFwiLi4vRGF0YS9Db21wb25lbnRFdmVudERhdGFcIjtcclxuaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuaW1wb3J0IHtHbG9iYWxXYWl0aW5nfSBmcm9tIFwiLi4vR2xvYmFsV2FpdGluZ1wiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgUGFuZWxCYXNlQ29udHJvbCBleHRlbmRzIGZhaXJ5Z3VpLldpbmRvdyB7XHJcbiAgICBzdGF0aWMgdmlld2JnVXJsOnN0cmluZyA9IFwiXCI7XHJcbiAgICBpc2d1aWRlaW5nOmJvb2xlYW49ZmFsc2U7XHJcbiAgICBwcml2YXRlIFBhY2thZ2VOYW1lOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBSZXNvdXJjZXNOYW1lOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBfaXNBZGRwYWNrYWdlOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfaXNjYWNoZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9BY3Rpb25UeXBlOnN0cmluZyA9IFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lO1xyXG5cclxuICAgIGl0ZW1fcGFuZWw6IGZhaXJ5Z3VpLkdDb21wb25lbnQ7XHJcbiAgICBpdGVtX2JnOiBmYWlyeWd1aS5HQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBfY2xpY2tCZzogZmFpcnlndWkuR0xvYWRlcjtcclxuXHJcbiAgICBwcml2YXRlIF9jbGlja0JnSXNDb2xzZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgdmlld0tleTogYW55O1xyXG4gICAgcHVibGljIGdhbWVMYXllcjpzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkuovku7blrrnlmahcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBFdmVudFJlc0RpYzphbnkgPSB7fTtcclxuICAgIC8qKlxyXG4gICAgICog5YWo5bGA5LqL5Lu25a655ZmoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgRXZlbnRHbG9iYWw6YW55ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnlYzpnaLliJ3lp4vljJZcclxuICAgICAqIEBwYXJhbSBwa2dOYW1lIOWMheWQjVxyXG4gICAgICogQHBhcmFtIHJlc05hbWUg55WM6Z2i5ZCNXHJcbiAgICAgKiBAcGFyYW0gaXNBZGRwYWNrYWdlIOaYr+WQpua3u+WKoOWMhSBcclxuICAgICAqIEBwYXJhbSBBY3Rpb25UeXBlIOeVjOmdouaJk+W8gOWKqOeUu+exu+Wei1xyXG4gICAgICogQHBhcmFtIGNsaWNrQmdJc0NvbHNlIOm7keiJsuiDjOaZryAwOuaXoOiDjOaZryAxOuiDjOaZr+aXoOWFs+mXreS6i+S7tiAyOuiDjOaZr+acieWFs+mXreS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzY2FjaGUg5piv5ZCm5re75Yqg5Yiw57yT5a2Y5rGg77yI5aaC5piv5Li6dHJ1ZSzliJnliqDlhaXov5vnvJPlrZjmsaDlrprml7bmoLnmja7mmK/lkKblvJXnlKjmuIXnkIbjgIIg6Iul5piv5Li6ZmFsc2XvvIzliJnkuI3muIXnkIblvZPliY3nvJPlrZjvvIzlpoLoi6XmuIXnkIbvvIzor7fmiYvliqjmuIXnkIYg77yJXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHBrZ05hbWU6IHN0cmluZyA9IFwiXCIsIHJlc05hbWU6IHN0cmluZyA9IFwiXCIsIGlzQWRkcGFja2FnZTogYm9vbGVhbiA9IGZhbHNlLCBcclxuICAgICAgICAgICAgICAgIEFjdGlvblR5cGU6c3RyaW5nPVZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lLCBjbGlja0JnSXNDb2xzZTpudW1iZXI9MCwgaXNjYWNoZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX2lzY2FjaGUgPSBpc2NhY2hlO1xyXG4gICAgICAgIHRoaXMuUGFja2FnZU5hbWUgPSBwa2dOYW1lO1xyXG4gICAgICAgIHRoaXMuUmVzb3VyY2VzTmFtZSA9IHJlc05hbWU7XHJcbiAgICAgICAgdGhpcy5faXNBZGRwYWNrYWdlID0gaXNBZGRwYWNrYWdlO1xyXG4gICAgICAgIHRoaXMuX0FjdGlvblR5cGUgPSBBY3Rpb25UeXBlO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrQmdJc0NvbHNlID0gY2xpY2tCZ0lzQ29sc2U7XHJcbiAgICAgICAgdGhpcy5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByb3RlY3RlZCBSZXNvbHZlVUkocGtnbmFtZTogc3RyaW5nLCByZXNuYW1lOiBzdHJpbmcsIGlzYWRkcGFja2FnZTogYm9vbGVhbixBY3Rpb25UeXBlOnN0cmluZz1WaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZSwgY2xpY2tCZ0lzQ29sc2U6bnVtYmVyPTAsIGlzY2FjaGU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5QYWNrYWdlTmFtZSA9IHBrZ25hbWU7XHJcbiAgICAgICAgdGhpcy5SZXNvdXJjZXNOYW1lID0gcmVzbmFtZTtcclxuICAgICAgICB0aGlzLl9BY3Rpb25UeXBlID0gQWN0aW9uVHlwZTtcclxuICAgICAgICB0aGlzLl9jbGlja0JnSXNDb2xzZSA9IGNsaWNrQmdJc0NvbHNlO1xyXG4gICAgICAgIFJlc0RhdGFDb250cm9sLkluc3RhbmNlLkFkZFZpZXdQYWNrQnlOYW1lKHBrZ25hbWUsIGlzYWRkcGFja2FnZSwgaXNjYWNoZSk7XHJcbiAgICAgICAgdGhpcy5jb250ZW50UGFuZSA9IGZhaXJ5Z3VpLlVJUGFja2FnZS5jcmVhdGVPYmplY3QocGtnbmFtZSwgcmVzbmFtZSkuYXNDb207XHJcbiAgICAgICAgZm9yICh2YXIgc3RyIGluIHRoaXMuY29udGVudFBhbmUuX2NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtOiBmYWlyeWd1aS5HT2JqZWN0ID0gdGhpcy5jb250ZW50UGFuZS5fY2hpbGRyZW5bc3RyXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PSBcIml0ZW1fcGFuZWxcIikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1wYW5lbDogZmFpcnlndWkuR0NvbXBvbmVudCA9IGl0ZW0gYXMgZmFpcnlndWkuR0NvbXBvbmVudDtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtcGFuZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzdHIxIGluIGl0ZW1wYW5lbC5fY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1wYW5lbEl0ZW06IGZhaXJ5Z3VpLkdPYmplY3QgPSBpdGVtcGFuZWwuX2NoaWxkcmVuW3N0cjFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW2l0ZW1wYW5lbEl0ZW0ubmFtZV0gPSBpdGVtcGFuZWxJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHRoaXNbaXRlbS5uYW1lXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fcGFuZWwgPSBpdGVtIGFzIGZhaXJ5Z3VpLkdDb21wb25lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzW2l0ZW0ubmFtZV0gPSBpdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0U2l6ZShmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoLCBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5jb250ZW50UGFuZS5zZXRQaXZvdCgwLjUsMC41KTtcclxuICAgICAgICB0aGlzLnNldFBpdm90KDAuNSwgMC41KTtcclxuICAgICAgICB0aGlzLnNldGNsaWNrQmdJc0NvbHNlKCk7XHJcbiAgICAgICAgdGhpcy5pbml0VmlldygpO1xyXG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5TaG93Vmlld0FDVElPTigpO1xyXG4gICAgfVxyXG4gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBfbG9hZFRhcmdldDphbnk7XHJcbiAgICBwcml2YXRlIF9vbkxvYWRlZEhhbmRsZXI6RnVuY3Rpb247XHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vXVpXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOe7hOWQjVxyXG4gICAgICogQHBhcmFtIHRhcmdldCAgICDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBvbkxvYWRlZEhhbmRsZXIg5Yqg6L295a6M5oiQ5Zue6LCD5Ye95pWwXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBMb2FkVmlld1VJKGdyb3VwTmFtZTogc3RyaW5nLCB0YXJnZXQ6IGFueSwgb25Mb2FkZWRIYW5kbGVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2xvYWRUYXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy5fb25Mb2FkZWRIYW5kbGVyID0gb25Mb2FkZWRIYW5kbGVyO1xyXG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkR3JvdXAoZ3JvdXBOYW1lLCB0aGlzLCB0aGlzLkxvYWRDb21wbGV0ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUxhYmVsKGNvbG9yOiBzdHJpbmcsIHN0cm9rZUNvbG9yOiBzdHJpbmcpOkxheWEuTGFiZWwge1xyXG4gICAgICAgIGNvbnN0IFNUUk9LRV9XSURUSDogbnVtYmVyID0gNDtcclxuICAgICAgICB2YXIgbGFiZWw6TGF5YS5MYWJlbCA9IG5ldyBMYXlhLkxhYmVsKCk7XHJcbiAgICAgICAgbGFiZWwuZm9udCA9IFwiTWljcm9zb2Z0IFlhSGVpXCI7XHJcbiAgICAgICAgbGFiZWwudGV4dCA9IFwiU0FNUExFIERFTU9cIjtcclxuICAgICAgICBsYWJlbC5mb250U2l6ZSA9IDMwO1xyXG4gICAgICAgIGxhYmVsLmNvbG9yID0gY29sb3I7XHJcbiAgICAgICAgaWYgKHN0cm9rZUNvbG9yKSB7XHJcbiAgICAgICAgICAgIGxhYmVsLnN0cm9rZSA9IFNUUk9LRV9XSURUSDtcclxuICAgICAgICAgICAgbGFiZWwuc3Ryb2tlQ29sb3IgPSBzdHJva2VDb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChsYWJlbCk7XHJcbiAgICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L296LWE5rqQ5pWw57uEXHJcbiAgICAgKiBAcGFyYW0gdXJscyDotYTmupDmlbDnu4RcclxuICAgICAqIEBwYXJhbSB0YXJnZXQg5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gb25Mb2FkZWRIYW5kbGVyIOWKoOi9veWujOaIkOWbnuiwg+WHveaVsFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgbG9hZFVpYnlBcnIodXJsczogQXJyYXk8YW55PiwgdGFyZ2V0OiBhbnksIG9uTG9hZGVkSGFuZGxlcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICAvLyB0aGlzLnNob3dNb2RhbFdhaXQoKTtcclxuICAgICAgICB0aGlzLl9sb2FkVGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIHRoaXMuX29uTG9hZGVkSGFuZGxlciA9IG9uTG9hZGVkSGFuZGxlcjtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UuTG9hZGVycyh1cmxzLCB0aGlzLCB0aGlzLkxvYWRDb21wbGV0ZSk7ICAgIFxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgY3JlYXRlUmFkaW9Hcm91cChza2luOiBzdHJpbmcpOkxheWEuIFJhZGlvR3JvdXAge1xyXG4gICAgICAgIHZhciByZzpMYXlhLiBSYWRpb0dyb3VwID0gbmV3IExheWEuUmFkaW9Hcm91cCgpO1xyXG4gICAgICAgIHJnLnNraW4gPSBza2luO1xyXG5cclxuICAgICAgICByZy5zcGFjZSA9IDcwO1xyXG4gICAgICAgIHJnLmRpcmVjdGlvbiA9IFwidlwiO1xyXG5cclxuICAgICAgICByZy5sYWJlbHMgPSBcIkl0ZW0xLCBJdGVtMiwgSXRlbTNcIjtcclxuICAgICAgICByZy5sYWJlbENvbG9ycyA9IFwiIzc4Nzg3OCwjZDNkM2QzLCNGRkZGRkZcIjtcclxuICAgICAgICByZy5sYWJlbFNpemUgPSAyMDtcclxuICAgICAgICByZy5sYWJlbEJvbGQgPSB0cnVlO1xyXG4gICAgICAgIHJnLmxhYmVsUGFkZGluZyA9IFwiNSwwLDAsNVwiO1xyXG5cclxuICAgICAgICByZy5zZWxlY3RIYW5kbGVyID0gbmV3IExheWEuSGFuZGxlcih0aGlzLCB0aGlzLm9uU2VsZWN0Q2hhbmdlKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHJnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJnO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBvblNlbGVjdENoYW5nZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLkvaDpgInmi6nkuobnrKwgXCIgKyAoaW5kZXggKyAxKSArIFwiIOmhuVwiKTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBMb2FkQ29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2xvYWRUYXJnZXQgJiYgdGhpcy5fb25Mb2FkZWRIYW5kbGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX29uTG9hZGVkSGFuZGxlci5jYWxsKCB0aGlzLl9sb2FkVGFyZ2V0ICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZW1vdmVFZmZlY3RQYWNrYWdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBSZXNEYXRhQ29udHJvbC5JbnN0YW5jZS5DbGVhclBhY2tCeU5hbWUocGFja2FnZU5hbWUsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRwYW5lbENvbnRyb2xsZXIobmFtZTogc3RyaW5nKTogZmFpcnlndWkuQ29udHJvbGxlciB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbV9wYW5lbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtX3BhbmVsLmdldENvbnRyb2xsZXIobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgc2V0dXAoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiNGRkZGRkZcIiwgbnVsbCkucG9zKDMwLCA1MCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiMwMEZGRkZcIiwgbnVsbCkucG9zKDI5MCwgNTApO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlTGFiZWwoXCIjRkZGRjAwXCIsIFwiI0ZGRkZGRlwiKS5wb3MoMzAsIDEwMCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiMwMDAwMDBcIiwgXCIjRkZGRkZGXCIpLnBvcygyOTAsIDEwMCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiNGRkZGRkZcIiwgXCIjMDBGRkZGXCIpLnBvcygzMCwgMTUwKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUxhYmVsKFwiIzAwODBGRlwiLCBcIiMwMEZGRkZcIikucG9zKDI5MCwgMTUwKTtcclxuICAgIH1cclxuICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgXHJcbiAgICBwcm90ZWN0ZWQgZ2V0cGFuZWxUcmFuc2l0aW9uKG5hbWU6IHN0cmluZyk6IGZhaXJ5Z3VpLlRyYW5zaXRpb24ge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1fcGFuZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbV9wYW5lbC5nZXRUcmFuc2l0aW9uKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Q2hpbGRmb3JtQ29udGVudFBhbmVsKCBuYW1lOnN0cmluZyApOmZhaXJ5Z3VpLkdPYmplY3RcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLmNvbnRlbnRQYW5lKXtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFBhbmUuZ2V0Q2hpbGQobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8q55WM6Z2i5Yid5aeL5YyWKi9cclxuICAgIHByb3RlY3RlZCBvbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuUGFja2FnZU5hbWUgIT0gXCJcIiAmJiB0aGlzLlJlc291cmNlc05hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICB0aGlzLlJlc29sdmVVSSh0aGlzLlBhY2thZ2VOYW1lLCB0aGlzLlJlc291cmNlc05hbWUsIHRoaXMuX2lzQWRkcGFja2FnZSx0aGlzLl9BY3Rpb25UeXBlLHRoaXMuX2NsaWNrQmdJc0NvbHNlLCB0aGlzLl9pc2NhY2hlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy/op6PmnpB1aVxyXG4gICAgXHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgU2hvd1ZpZXdBQ1RJT04oKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggdGhpcy5fQWN0aW9uVHlwZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53aW5kb3dhbm1vZW5kKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9hZGRtb3ZlVG9NaWRkbGU6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnggPSBmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoO1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLmNvbnRlbnRQYW5lLCB7IHg6MCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLndpbmRvd2FubW9lbmQpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX2FkZG1vdmVGcm9tQm90dG9tOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50UGFuZS55ID0gZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMuY29udGVudFBhbmUsIHsgeTowIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMud2luZG93YW5tb2VuZCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfYWRkc2NhbGVNaW5Ub01heDpcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFBhbmUuc2NhbGVYID0gdGhpcy5jb250ZW50UGFuZS5zY2FsZVkgPSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLmNvbnRlbnRQYW5lLCB7IHNjYWxlWDoxLHNjYWxlWToxIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMud2luZG93YW5tb2VuZCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNoZWNrQm94KHNraW46IHN0cmluZyk6TGF5YS5DaGVja0JveCB7XHJcbiAgICAgICAgdmFyIGNiOkxheWEuIENoZWNrQm94ID0gbmV3IExheWEuQ2hlY2tCb3goc2tpbik7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChjYik7XHJcblxyXG4gICAgICAgIGNiLmxhYmVsQ29sb3JzID0gXCJ3aGl0ZVwiO1xyXG4gICAgICAgIGNiLmxhYmVsU2l6ZSA9IDIwO1xyXG4gICAgICAgIGNiLmxhYmVsRm9udCA9IFwiTWljcm9zb2Z0IFlhSGVpXCI7XHJcbiAgICAgICAgY2IubGFiZWxQYWRkaW5nID0gXCIzLDAsMCw1XCI7XHJcblxyXG4gICAgICAgIHJldHVybiBjYjtcclxuICAgIH1cclxuICAgIHByaXZhdGUgdXBkYXRlTGFiZWwoY2hlY2tCb3g6TGF5YS5DaGVja0JveCk6IHZvaWQge1xyXG4gICAgICAgIGNoZWNrQm94LmxhYmVsID0gY2hlY2tCb3guc2VsZWN0ZWQgPyBcIuW3sumAieS4rVwiIDogXCLmnKrpgInkuK1cIjtcclxuICAgIH1cclxuICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG5cclxuICAgIHByaXZhdGUgd2luZG93YW5tb2VuZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBMYXlhLnRpbWVyLmNhbGxMYXRlciggdGhpcyx0aGlzLm9uU2hvd1ZpZXcgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25TaG93VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgdGhpcy5zaG93Q2xpY2tCZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2hvd0NsaWNrQmcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2NsaWNrQmcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5hbHBoYSA9IDAuNTU7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9jbGlja0JnSXNDb2xzZT09MiAmJiAhdGhpcy5oYXNDbGlja0xpc3RlbmVyKCkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLm9uQ2xpY2sodGhpcywgdGhpcy5DbGlja0V4aXRWaWV3KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKirngrnlh7vlhbPpl63pobXpnaLmjInpkq4gKi9cclxuICAgIHB1YmxpYyBDbGlja0V4aXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCB0aGlzLnZpZXdLZXksdHJ1ZSApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKuiOt+WPlueuoeeQhuaVsOaNruaooeWdlyovXHJcbiAgICBwdWJsaWMgZ2V0UHJveHkoZDogYW55KTogYW55IHtcclxuICAgICAgICByZXR1cm4gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKGQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55WM6Z2i5YWz6Zet5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBFeGl0VmlldyggQWN0aW9uVHlwZTpzdHJpbmcgPSBcIlwiICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9jbGlja0JnIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggQWN0aW9uVHlwZSA9PSBcIlwiIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fQWN0aW9uVHlwZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmU6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3RvcnkoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX2FkZG1vdmVUb01pZGRsZTpcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcywgeyB4OmZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGggfSwzMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5kZXN0b3J5KSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9hZGRtb3ZlRnJvbUJvdHRvbTpcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcywgeyB5OmZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0IH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfYWRkc2NhbGVNaW5Ub01heDpcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcywgeyBzY2FsZVg6MC4wMSxzY2FsZVk6MC4wMSB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLmRlc3RvcnkpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dpdGNoKCBBY3Rpb25UeXBlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZTpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RvcnkoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfcmVtb3Zlc2NhbGVNYXhUb01pbjpcclxuICAgICAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMsIHsgc2NhbGVYOjAuMDEsc2NhbGVZOjAuMDEgfSwzMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5kZXN0b3J5KSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX3JlbW92ZW1vdmVUb1JpZ2h0OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHg6ZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLmRlc3RvcnkpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICBcclxuXHJcbiAgICBwdWJsaWMgZ2V0VHJhbnNpdGlvbkJ5TmFtZShpZDogc3RyaW5nKTogZmFpcnlndWkuVHJhbnNpdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFBhbmUuZ2V0VHJhbnNpdGlvbihpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgLyoq5rOo5YaM5LqL5Lu2ICovXHJcbiAgICBwdWJsaWMgZGlzcGFjaGVEYXRhdHJpZ2dlcih0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KHR5cGUsIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5rOo5YaM5YWo5bGA5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxyXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgYWRkRGF0YUV2ZW50KHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICBpZiggIXRoaXMuRXZlbnRHbG9iYWwuaGFzT3duUHJvcGVydHkoIHR5cGUgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSBHYW1lUG9vbC5HZXRJdGVtKCBDb21wb25lbnRFdmVudERhdGEuUmVzRGljVmFsdWUgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRHbG9iYWxbdHlwZV0gPSB2bztcclxuICAgICAgICAgICAgICAgIHZvLnR5cGUgPSB0eXBlO1xyXG4gICAgICAgICAgICAgICAgdm8udGhpc09iamVjdCA9IHRoaXNPYmplY3Q7XHJcbiAgICAgICAgICAgICAgICB2by5saXN0ZW5lciA9IGxpc3RlbmVyO1xyXG4gICAgICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzT2JqZWN0LGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5YWo5bGA5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxyXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgQ2xlYXJFdmVudERhdGEodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGlmKCB0aGlzLkV2ZW50R2xvYmFsW3R5cGVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSB0aGlzLkV2ZW50R2xvYmFsW3R5cGVdO1xyXG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNPYmplY3QsIGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgdm8uY2xlYXIoKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuRXZlbnRHbG9iYWxbdHlwZV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk57uE5Lu25LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSDml7bpl7TnsbvlnotcclxuICAgICAqIEBwYXJhbSBjYWxsYmFja29iaiDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBjYWxsYmFja0hhbmRsZXIg5LqL5Lu25Zue6LCDIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgQ2xlYXJFdmVudEJ5VHlwZSggdGFyZ2V0OmFueSwgdHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0ICYmIHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8Q29tcG9uZW50RXZlbnREYXRhPiA9IHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdO1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI9MDtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YTtcclxuICAgICAgICAgICAgZm9yKGk7aTxudW1zO2krKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm8gPSBhcnJbaV07XHJcbiAgICAgICAgICAgICAgICBpZiggdm8gJiYgdm8udHlwZT09dHlwZSAmJiB2by50aGlzT2JqZWN0ID09IHRoaXNPYmplY3QgJiYgdm8ubGlzdGVuZXIgPT0gbGlzdGVuZXIgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5vZmYoIHR5cGUsdGhpc09iamVjdCxsaXN0ZW5lciApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDms6jlhoznu4Tku7bkuovku7bvvIzosIPnlKjmraTmlrnms5XvvIznlYzpnaLlhbPpl63kvJroh6rliqjnp7vpmaRcclxuICAgICAqIEBwYXJhbSB0eXBlIOaXtumXtOexu+Wei1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrb2JqIOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciDkuovku7blm57osINcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEV2ZW50QnlUeXBlKCB0YXJnZXQ6YW55LCB0eXBlOiBzdHJpbmcsIHRoaXNPYmplY3Q6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uLGFyZ3M6YW55PW51bGwpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBudWxsIHx8IHRhcmdldC5uYW1lID09IFwiXCIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBcImJhc2V2aWV3IGFkZExpc3RlbmVyIHRhcmdldC5uYW1lIGlzIG51bGxcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhID0gR2FtZVBvb2wuR2V0SXRlbSggQ29tcG9uZW50RXZlbnREYXRhLlJlc0RpY1ZhbHVlICk7XHJcbiAgICAgICAgICAgIHZvLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICAgIHZvLnRoaXNPYmplY3QgPSB0aGlzT2JqZWN0O1xyXG4gICAgICAgICAgICB2by5saXN0ZW5lciA9IGxpc3RlbmVyO1xyXG4gICAgICAgICAgICBpZiggIXRoaXMuRXZlbnRSZXNEaWMuaGFzT3duUHJvcGVydHkoIHRhcmdldC5uYW1lICkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBibzpib29sZWFuID0gdGhpcy5KdWRnZUlzSGF2ZUV2ZW50KCB0YXJnZXQsdHlwZSApO1xyXG4gICAgICAgICAgICBpZiggIWJvIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Lm9uKCB0eXBlLHRoaXNPYmplY3QsbGlzdGVuZXIsYXJncyApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV0ucHVzaCggdm8gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKirliKTmlq3mmK/lkKblkKvmnInkuovku7YgKi9cclxuICAgIHB1YmxpYyBKdWRnZUlzSGF2ZUV2ZW50KCB0YXJnZXQ6YW55LHR5cGU6IHN0cmluZyApOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICB2YXIgZXZlbnRBcnI6QXJyYXk8Q29tcG9uZW50RXZlbnREYXRhPjtcclxuICAgICAgICBldmVudEFyciA9IHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdO1xyXG4gICAgICAgIHZhciBjaGlsZHZvOkNvbXBvbmVudEV2ZW50RGF0YTtcclxuICAgICAgICBmb3IoIHZhciBzIGluIGV2ZW50QXJyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWxkdm8gPSBldmVudEFycltzXTtcclxuICAgICAgICAgICAgaWYoIGNoaWxkdm8gJiYgY2hpbGR2by50eXBlID09IHR5cGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbiAgICBwdWJsaWMgZ2V0Q29tQnlJZChpZDogc3RyaW5nKTogZmFpcnlndWkuR0NvbXBvbmVudCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFBhbmUuZ2V0Q2hpbGQoaWQpLmFzQ29tO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250cm9sbGVyQnlCYW1lKGlkOiBzdHJpbmcpOiBmYWlyeWd1aS5Db250cm9sbGVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRDb250cm9sbGVyKGlkKTtcclxuICAgIH1cclxuICAgIFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ57uE5Lu25LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDbGVhckV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKHRoaXMuRXZlbnRSZXNEaWMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIGRpY3Q6YW55ID0gdGhpcy5FdmVudFJlc0RpYztcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxDb21wb25lbnRFdmVudERhdGE+O1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGE7XHJcbiAgICAgICAgICAgIGZvciggcyBpbiBkaWN0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXJyID0gZGljdFtzXTtcclxuICAgICAgICAgICAgICAgIGlmKCBhcnIgJiYgYXJyLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGk9MDtcclxuICAgICAgICAgICAgICAgICAgICBudW1zID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IoIGk9bnVtcy0xO2k+PTA7aS0tIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvID0gYXJyW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdm8gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdm8udGFyZ2V0IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2by50YXJnZXQub2ZmKCB2by50eXBlLHZvLnRoaXNPYmplY3Qsdm8ubGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuRXZlbnRSZXNEaWNbc107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5FdmVudFJlc0RpYyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhckV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKiDplIDmr4EqL1xyXG4gICAgcHVibGljIGRlc3RvcnkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhckV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5jbG9zZU1vZGFsV2FpdCgpO1xyXG4gICAgICAgIHRoaXMuQ2xlYXJHbG9iYWxFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuQ2xlYXJFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRUYXJnZXQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX29uTG9hZGVkSGFuZGxlciA9IG51bGw7XHJcbiAgICAgICAgTGF5YS5Ud2Vlbi5jbGVhclR3ZWVuKCB0aGlzICk7XHJcbiAgICAgICAgUmVzRGF0YUNvbnRyb2wuSW5zdGFuY2UuQ2xlYXJQYWNrQnlOYW1lKHRoaXMuUGFja2FnZU5hbWUsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLlBhY2thZ2VOYW1lID0gbnVsbDtcclxuICAgICAgICB0aGlzLlJlc291cmNlc05hbWUgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9jbGlja0JnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcub2ZmQ2xpY2sodGhpcywgdGhpcy5DbGlja0V4aXRWaWV3KTtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZpZXdLZXkgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgc2V0Y2xpY2tCZ0lzQ29sc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93aW5nICYmIHRoaXMuX2NsaWNrQmdJc0NvbHNlID4gMCAmJiB0aGlzLmNvbnRlbnRQYW5lKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fY2xpY2tCZyAmJiBQYW5lbEJhc2VDb250cm9sLnZpZXdiZ1VybCAhPSBcIlwiICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZyA9IG5ldyBmYWlyeWd1aS5HTG9hZGVyKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLnRvdWNoYWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLnNldFNpemUoZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCwgZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy51cmwgPSBQYW5lbEJhc2VDb250cm9sLnZpZXdiZ1VybDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcuZmlsbCA9IGZhaXJ5Z3VpLkxvYWRlckZpbGxUeXBlLlNjYWxlRnJlZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcuYWxwaGEgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50UGFuZS5hZGRDaGlsZEF0KHRoaXMuX2NsaWNrQmcsIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOenu+mZpOaJgOacieWFqOWxgOS6i+S7tlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2xlYXJHbG9iYWxFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5FdmVudEdsb2JhbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIGRpY3Q6YW55ID0gdGhpcy5FdmVudEdsb2JhbDtcclxuICAgICAgICAgICAgZm9yKCBzIGluIGRpY3QgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhID0gZGljdFtzXTtcclxuICAgICAgICAgICAgICAgIGlmKCB2byApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5DbGVhckV2ZW50RGF0YSggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5FdmVudEdsb2JhbD17fTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XHJcbmltcG9ydCB7Q29tcG9uZW50RXZlbnREYXRhfSBmcm9tIFwiLi4vRGF0YS9Db21wb25lbnRFdmVudERhdGFcIjtcclxuaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQYW5lbENoaWxkQ29udHJvbCBleHRlbmRzIGZhaXJ5Z3VpLkdDb21wb25lbnQgXHJcbntcclxuICAgIC8qKlxyXG4gICAgICog5LqL5Lu25a655ZmoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgRXZlbnRSZXNEaWM6YW55ID0ge307XHJcbiAgICAvKipcclxuICAgICAqIOWFqOWxgOS6i+S7tuWuueWZqFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEV2ZW50R2xvYmFsOmFueSA9IHt9O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ57uE5Lu25LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDbGVhckV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKHRoaXMuRXZlbnRSZXNEaWMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIGRpY3Q6YW55ID0gdGhpcy5FdmVudFJlc0RpYztcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxDb21wb25lbnRFdmVudERhdGE+O1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGE7XHJcbiAgICAgICAgICAgIGZvciggcyBpbiBkaWN0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXJyID0gZGljdFtzXTtcclxuICAgICAgICAgICAgICAgIGlmKCBhcnIgJiYgYXJyLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGk9MDtcclxuICAgICAgICAgICAgICAgICAgICBudW1zID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IoIGk9bnVtcy0xO2k+PTA7aS0tIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvID0gYXJyW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdm8gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdm8udGFyZ2V0IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2by50YXJnZXQub2ZmKCB2by50eXBlLHZvLnRoaXNPYmplY3Qsdm8ubGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuRXZlbnRSZXNEaWNbc107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5FdmVudFJlc0RpYyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuQ2xlYXJHbG9iYWxFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuQ2xlYXJFdmVudCgpO1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0RnJvbVhNTCh4bWw6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLmNvbnN0cnVjdEZyb21YTUwoeG1sKTtcclxuICAgICAgICBmb3IgKHZhciBzdHIgaW4gdGhpcy5fY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW06IGZhaXJ5Z3VpLkdPYmplY3QgPSB0aGlzLl9jaGlsZHJlbltzdHJdO1xyXG4gICAgICAgICAgICB0aGlzW2l0ZW0ubmFtZV0gPSBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uSW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8q6I635Y+W566h55CG5pWw5o2u5qih5Z2XKi9cclxuICAgIHB1YmxpYyBnZXRQcm94eShkOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRpc3BhY2hlRGF0YXRyaWdnZXIodHlwZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCh0eXBlLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaGFzRGF0YUV2ZW50KHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBEaXNwYXRjaGVyTWFuYWdlci5oYXNFdmVudExpc3RlbmVyKHR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5rOo5YaM5YWo5bGA5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxyXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgQWRkRXZlbnREYXRhKHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICBpZiggIXRoaXMuRXZlbnRHbG9iYWwuaGFzT3duUHJvcGVydHkoIHR5cGUgKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhID0gR2FtZVBvb2wuR2V0SXRlbSggQ29tcG9uZW50RXZlbnREYXRhLlJlc0RpY1ZhbHVlICk7XHJcbiAgICAgICAgICAgIHRoaXMuRXZlbnRHbG9iYWxbdHlwZV0gPSB2bztcclxuICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICAgIHZvLnRoaXNPYmplY3QgPSB0aGlzT2JqZWN0O1xyXG4gICAgICAgICAgICB2by5saXN0ZW5lciA9IGxpc3RlbmVyO1xyXG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsdGhpc09iamVjdCxsaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgICAgIHByaXZhdGUgRElBTE9HX1dJRFRIOiBudW1iZXIgPSAyMjA7XHJcbiAgICAgICAgcHJpdmF0ZSBESUFMT0dfSEVJR0hUOiBudW1iZXIgPSAyNzU7XHJcbiAgICAgICAgcHJpdmF0ZSBDTE9TRV9CVE5fV0lEVEg6IG51bWJlciA9IDQzO1xyXG4gICAgICAgIHByaXZhdGUgQ0xPU0VfQlROX1BBRERJTkc6IG51bWJlciA9IDU7XHJcbiAgICAgICAgcHJpdmF0ZSBhc3NldHM6IEFycmF5PHN0cmluZz47XHJcblxyXG4gICAgICAgIHByaXZhdGUgb25Ta2luTG9hZENvbXBsZXRlKCk6IHZvaWQge1xyXG4gICAgICAgICAgICB2YXIgZGlhbG9nOkxheWEuIERpYWxvZyA9IG5ldyBMYXlhLkRpYWxvZygpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGJnOkxheWEuSW1hZ2UgPSBuZXcgTGF5YS5JbWFnZSh0aGlzLmFzc2V0c1swXSk7XHJcbiAgICAgICAgICAgIGRpYWxvZy5hZGRDaGlsZChiZyk7XHJcbiAgICAgICAgICAgIHZhciBidXR0b246TGF5YS5CdXR0b24gPSBuZXcgTGF5YS5CdXR0b24odGhpcy5hc3NldHNbMV0pO1xyXG4gICAgICAgICAgICAvLyBidXR0b24ubmFtZSA9IERpYWxvZy5DTE9TRTtcclxuICAgICAgICAgICAgYnV0dG9uLnBvcyh0aGlzLkRJQUxPR19XSURUSCAtIHRoaXMuQ0xPU0VfQlROX1dJRFRIIC0gdGhpcy5DTE9TRV9CVE5fUEFERElORywgdGhpcy5DTE9TRV9CVE5fUEFERElORyk7XHJcbiAgICAgICAgICAgIGRpYWxvZy5hZGRDaGlsZChidXR0b24pO1xyXG5cclxuICAgICAgICAgICAgZGlhbG9nLmRyYWdBcmVhID0gXCIwLDAsXCIgKyB0aGlzLkRJQUxPR19XSURUSCArIFwiLFwiICsgdGhpcy5ESUFMT0dfSEVJR0hUO1xyXG4gICAgICAgICAgICBkaWFsb2cuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5YWo5bGA5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxyXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRGF0YUV2ZW50KHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICBpZiggdGhpcy5FdmVudEdsb2JhbFt0eXBlXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhID0gdGhpcy5FdmVudEdsb2JhbFt0eXBlXTtcclxuICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzT2JqZWN0LCBsaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLkV2ZW50R2xvYmFsW3R5cGVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOazqOWGjOe7hOS7tuS6i+S7tu+8jOiwg+eUqOatpOaWueazle+8jOeVjOmdouWFs+mXreS8muiHquWKqOenu+mZpFxyXG4gICAgICogQHBhcmFtIHR5cGUg5pe26Ze057G75Z6LXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tvYmog5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyIOS6i+S7tuWbnuiwg1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgQWRkRXZlbnRCeVR5cGUoIHRhcmdldDphbnksIHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sYXJnczphbnk9bnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0YXJnZXQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRhcmdldC5uYW1lID09IG51bGwgfHwgdGFyZ2V0Lm5hbWUgPT0gXCJcIiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRocm93IFwiY2hpbGRiYXNldmlldyBhZGRMaXN0ZW5lciB0YXJnZXQubmFtZSBpcyBudWxsXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YSA9IEdhbWVQb29sLkdldEl0ZW0oIENvbXBvbmVudEV2ZW50RGF0YS5SZXNEaWNWYWx1ZSApO1xyXG4gICAgICAgICAgICB2by50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgICAgIHZvLnR5cGUgPSB0eXBlO1xyXG4gICAgICAgICAgICB2by50aGlzT2JqZWN0ID0gdGhpc09iamVjdDtcclxuICAgICAgICAgICAgdm8ubGlzdGVuZXIgPSBsaXN0ZW5lcjtcclxuICAgICAgICAgICAgaWYoICF0aGlzLkV2ZW50UmVzRGljLmhhc093blByb3BlcnR5KCB0YXJnZXQubmFtZSApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgYm86Ym9vbGVhbiA9IHRoaXMuSnVkZ2VJc0hhdmVFdmVudCggdGFyZ2V0LHR5cGUgKTtcclxuICAgICAgICAgICAgaWYoICFibyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5vbiggdHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyLGFyZ3MgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdLnB1c2goIHZvICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIEp1ZGdlSXNIYXZlRXZlbnQoIHRhcmdldDphbnksdHlwZTogc3RyaW5nICk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBldmVudEFycjpBcnJheTxDb21wb25lbnRFdmVudERhdGE+O1xyXG4gICAgICAgIGV2ZW50QXJyID0gdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV07XHJcbiAgICAgICAgdmFyIGNoaWxkdm86Q29tcG9uZW50RXZlbnREYXRhO1xyXG4gICAgICAgIGZvciggdmFyIHMgaW4gZXZlbnRBcnIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2hpbGR2byA9IGV2ZW50QXJyW3NdO1xyXG4gICAgICAgICAgICBpZiggY2hpbGR2byAmJiBjaGlsZHZvLnR5cGUgPT0gdHlwZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOenu+mZpOe7hOS7tuS6i+S7tlxyXG4gICAgICogQHBhcmFtIHR5cGUg5pe26Ze057G75Z6LXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tvYmog5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyIOS6i+S7tuWbnuiwgyBcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIENsZWFyRXZlbnRCeVR5cGUoIHRhcmdldDphbnksIHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldCAmJiB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PENvbXBvbmVudEV2ZW50RGF0YT4gPSB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXTtcclxuICAgICAgICAgICAgdmFyIGk6bnVtYmVyPTA7XHJcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IGFyci5sZW5ndGg7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGE7XHJcbiAgICAgICAgICAgIGZvcihpO2k8bnVtcztpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gYXJyW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvICYmIHZvLnR5cGU9PXR5cGUgJiYgdm8udGhpc09iamVjdCA9PSB0aGlzT2JqZWN0ICYmIHZvLmxpc3RlbmVyID09IGxpc3RlbmVyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQub2ZmKCB0eXBlLHRoaXNPYmplY3QsbGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ5YWo5bGA5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDbGVhckdsb2JhbEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLkV2ZW50R2xvYmFsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgZGljdDphbnkgPSB0aGlzLkV2ZW50R2xvYmFsO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSBkaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZURhdGFFdmVudCggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5FdmVudEdsb2JhbD17fTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgcGxhY2VIU2Nyb2xsZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIGhzOkxheWEuSFNjcm9sbEJhciA9IG5ldyBMYXlhLkhTY3JvbGxCYXIoKTtcclxuICAgICAgICBocy5za2luID0gXCJyZXMvdWkvaHNjcm9sbC5wbmdcIjtcclxuICAgICAgICBocy53aWR0aCA9IDMwMDtcclxuICAgICAgICBocy5wb3MoNTAsIDE3MCk7XHJcblxyXG4gICAgICAgIGhzLm1pbiA9IDA7XHJcbiAgICAgICAgaHMubWF4ID0gMTAwO1xyXG5cclxuICAgICAgICBocy5jaGFuZ2VIYW5kbGVyID0gbmV3IExheWEuSGFuZGxlcih0aGlzLCB0aGlzLm9uQ2hhbmdlKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGhzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBsYWNlVlNjcm9sbGVyKCk6IHZvaWQge1xyXG4gICAgICAgIHZhciB2czpMYXlhLlZTY3JvbGxCYXIgPSBuZXcgTGF5YS5WU2Nyb2xsQmFyKCk7XHJcbiAgICAgICAgdnMuc2tpbiA9IFwicmVzL3VpL3ZzY3JvbGwucG5nXCI7XHJcbiAgICAgICAgdnMuaGVpZ2h0ID0gMzAwO1xyXG4gICAgICAgIHZzLnBvcyg0MDAsIDUwKTtcclxuXHJcbiAgICAgICAgdnMubWluID0gMDtcclxuICAgICAgICB2cy5tYXggPSAxMDA7XHJcbiAgICAgICAgdnMuY2hhbmdlSGFuZGxlciA9IG5ldyBMYXlhLkhhbmRsZXIodGhpcywgdGhpcy5vbkNoYW5nZSk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh2cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNoYW5nZSh2YWx1ZTogTnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLmu5rliqjmnaHnmoTkvY3nva7vvJogdmFsdWU9XCIgKyB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBcclxufSIsIlxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9vbE1hbmFnZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUG9vbE1hbmFnZXJJbnN0YW5jZTpQb29sTWFuYWdlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgUG9vbE1hbmFnZXIuUG9vbE1hbmFnZXJJbnN0YW5jZSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKVxyXG4gICAge1xyXG4gICAgICAgIGlmKFBvb2xNYW5hZ2VyLlBvb2xNYW5hZ2VySW5zdGFuY2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gUG9vbE1hbmFnZXIuUG9vbE1hbmFnZXJJbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gbmV3IFBvb2xNYW5hZ2VyKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUG9vbFNpemUgPSA4MDtcclxuICAgIHByaXZhdGUgc3RhdGljIFNwcml0ZTNERGljOntba2V5OnN0cmluZ106QXJyYXk8TGF5YS5TcHJpdGUzRD59ID0ge307XHJcblxyXG5cclxuICAgIHN0YXRpYyBHZXRTcHJpdGUzRChfb2JqOkxheWEuU3ByaXRlM0QpOkxheWEuU3ByaXRlM0RcclxuICAgIHtcclxuICAgICAgICB2YXIgb2JqTmFtZSA9IF9vYmoubmFtZTtcclxuICAgICAgICBpZih0aGlzLlNwcml0ZTNERGljW29iak5hbWVdICE9IG51bGwgJiYgdGhpcy5TcHJpdGUzRERpY1tvYmpOYW1lXSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZih0aGlzLlNwcml0ZTNERGljW29iak5hbWVdLmxlbmd0aD4wKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0gdGhpcy5TcHJpdGUzRERpY1tvYmpOYW1lXVswXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZighb2JqIHx8IG9iai5kZXN0cm95ZWQpb2JqID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShfb2JqKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLlNwcml0ZTNERGljW29iak5hbWVdLnNwbGljZSgwLDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIG9iai50cmFuc2Zvcm0ucG9zaXRpb24gPSBfb2JqLnRyYW5zZm9ybS5wb3NpdGlvbi5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gb2JqLnRyYW5zZm9ybS5yb3RhdGlvbiA9IF9vYmoudHJhbnNmb3JtLnJvdGF0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICBvYmoudHJhbnNmb3JtLnNjYWxlPV9vYmoudHJhbnNmb3JtLnNjYWxlLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICBvYmouYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV3b2JqID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShfb2JqKTtcclxuICAgICAgICAgICAgICAgIG5ld29iai5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld29iajtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbmV3b2JqID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShfb2JqKTtcclxuICAgICAgICAgICAgbmV3b2JqLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBSZWNvdmVyU3ByaXRlM0QoX29iajpMYXlhLlNwcml0ZTNELF9hY3RpdmUgPSBmYWxzZSlcclxuICAgIHtcclxuICAgICAgICBpZighX29iailcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlBvb2xNYW5hZ2VyIFJlY292ZXIgRXJyb3IhXCIsbnVsbCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKF9vYmouZGVzdHJveWVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiUG9vbE1hbmFnZXIgUmVjb3ZlciBFcnJvciFcIixcImRlc3Ryb3llZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIV9hY3RpdmUgJiYgX29iai5hY3RpdmUgPT0gZmFsc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJQb29sTWFuYWdlciBSZWNvdmVyIEVycm9yIVwiLF9vYmoubmFtZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBvYmpOYW1lID0gX29iai5uYW1lO1xyXG5cclxuICAgICAgICBpZih0aGlzLlNwcml0ZTNERGljW29iak5hbWVdICE9IG51bGwgJiYgdGhpcy5TcHJpdGUzRERpY1tvYmpOYW1lXSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLlNwcml0ZTNERGljW29iak5hbWVdO1xyXG4gICAgICAgICAgICBpZihhcnJheS5sZW5ndGggPiB0aGlzLlBvb2xTaXplKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfb2JqLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFycmF5LnB1c2goX29iaik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgYXJyYXkucHVzaChfb2JqKTtcclxuICAgICAgICAgICAgdGhpcy5TcHJpdGUzRERpY1tvYmpOYW1lXSA9IGFycmF5O1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9iak5hbWUsYXJyYXkubGVuZ3RoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF9vYmoudHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMygwLDAsLTEwMCk7XHJcbiAgICAgICAgX29iai5yZW1vdmVTZWxmKCk7XHJcbiAgICAgICAgX29iai5hY3RpdmUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIENsZWFyUG9vbCgpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gdGhpcy5TcHJpdGUzRERpYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBvYmpzID0gdGhpcy5TcHJpdGUzRERpY1trZXldO1xyXG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwO2k8IG9ianMubGVuZ3RoO2krKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb2Jqc1tpXS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5TcHJpdGUzRERpYyA9IHt9O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuL1Jlc291cmNlQ29udHJvbFwiO1xyXG5pbXBvcnQge0xvY2FsRGF0YX0gZnJvbSBcIi4uL0RhdGEvTG9jYWxEYXRhXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgVGFiID0gTGF5YS5UYWI7XHJcbi8qXHJcbiog6LWE5rqQ566h55CG5ZmoO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgUmVzRGF0YUNvbnRyb2wgaW1wbGVtZW50cyBUaW1lckNvbnRyb2xcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlJlc0RhdGFDb250cm9sO1xyXG5cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDkuI3nvJPlrZjnmoTljIXmlbDmja7vvIgg6aKE6Ziy55WM6Z2i5LiK55qE54q25oCB6K6+572u6ZSZ6K+vIO+8iVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIE5vTGl2ZURhdGE6YW55O1xyXG5cclxuICAgXHJcblxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBSZXNEYXRhQ29udHJvbC5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6UmVzRGF0YUNvbnRyb2xcclxuICAgIHtcclxuICAgICAgICBpZiggUmVzRGF0YUNvbnRyb2wuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNEYXRhQ29udHJvbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUmVzRGF0YUNvbnRyb2wuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg5YyFXHJcbiAgICAgKiBAcGFyYW0gcGF0aCDot6/lvoTvvIgg5LqL5L6L77yacmVzL3VpLyDvvIlcclxuICAgICAqIEBwYXJhbSBwa2duYW1lIOWMheWQjVxyXG4gICAgICogQHBhcmFtIGlzYWRkcGFja2FnZSDmmK/lkKbmt7vliqAgXHJcbiAgICAgKiBAcGFyYW0gaXNDYWNoZSDmmK/lkKbnvJPlrZhcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZFBhY2tCeU5hbWUocGF0aDpzdHJpbmcscGtnbmFtZTpzdHJpbmcsaXNhZGRwYWNrYWdlOmJvb2xlYW4gPSB0cnVlLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaXNhZGRwYWNrYWdlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5hZGRQYWNrYWdlKHBhdGggKyBwa2duYW1lLHBrZ25hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkFkZExvY2FsTGl2ZURhdGEoIHBrZ25hbWUsaXNDYWNoZSApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEdhbWVQb29sLk1hcmsoIExvY2FsRGF0YS5SZXNEaWNWYWx1ZSxMb2NhbERhdGEgKTtcclxuICAgICAgICB0aGlzLnVybFJlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMucGFja2FnZVJlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuTm9MaXZlRGF0YSA9IHsgXCJsb2FkaW5nXCI6dHJ1ZSxcIm1haW5cIjp0cnVlLFwidWljb21wb25lbnRcIjp0cnVlfTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgICAvKipcclxuICAgICAqIOa4heeQhui1hOa6kOe8k+WtmChBcnJheSlcclxuICAgICAqIEBwYXJhbSB1cmxzIOi1hOa6kOaVsOe7hFxyXG4gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIOWMheWQjVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmVtb3ZlUmVzb3VyY2VzKCB1cmxzOkFycmF5PGFueT4scGFja2FnZU5hbWU6c3RyaW5nID0gXCJcIiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggcGFja2FnZU5hbWUgIT0gXCJcIiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmYWlyeWd1aS5VSVBhY2thZ2UucmVtb3ZlUGFja2FnZSggcGFja2FnZU5hbWUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiB1cmxzIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuUmVtb3ZlUmVzb3VyY2VzQnl1cmwoIHVybHNbc10udXJsLHRydWUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBwbGFjZUhTbGlkZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIGhzOkxheWEuSFNsaWRlciA9IG5ldyBMYXlhLkhTbGlkZXIoKTtcclxuICAgICAgICBocy5za2luID0gXCJyZXMvdWkvaHNsaWRlci5wbmdcIjtcclxuXHJcbiAgICAgICAgaHMud2lkdGggPSAzMDA7XHJcbiAgICAgICAgaHMucG9zKDUwLCAxNzApO1xyXG4gICAgICAgIGhzLm1pbiA9IDA7XHJcbiAgICAgICAgaHMubWF4ID0gMTAwO1xyXG4gICAgICAgIGhzLnZhbHVlID0gNTA7XHJcbiAgICAgICAgaHMudGljayA9IDE7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoaHMpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBwbGFjZVZTbGlkZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHZzOkxheWEuVlNsaWRlciA9IG5ldyBMYXlhLlZTbGlkZXIoKTtcclxuXHJcbiAgICAgICAgdnMuc2tpbiA9IFwicmVzL3VpL3ZzbGlkZXIucG5nXCI7XHJcblxyXG4gICAgICAgIHZzLmhlaWdodCA9IDMwMDtcclxuICAgICAgICB2cy5wb3MoNDAwLCA1MCk7XHJcbiAgICAgICAgdnMubWluID0gMDtcclxuICAgICAgICB2cy5tYXggPSAxMDA7XHJcbiAgICAgICAgdnMudmFsdWUgPSA1MDtcclxuICAgICAgICB2cy50aWNrID0gMTtcclxuICAgICAgIFxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodnMpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHByaXZhdGUgX3RpbWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl90aW1lICs9IGR0O1xyXG4gICAgICAgIGlmKCB0aGlzLl90aW1lID4gdGhpcy5DaGVja0ludGVydmFsICkgLy8x5YiG6ZKf5qOA5p+l5LiA5qyhXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLnJ1bm5pbmcgKSAvL+WmguaenOW9k+WJjeWcqOWKoOi9veS4re+8jOW7tuaXtjHnp5Lmo4DmtYtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGltZS09MTAwMDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLlJlZnJlc2hHcm91cFJlcygpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIbotYTmupDnvJPlrZgodXJsKVxyXG4gICAgICogQHBhcmFtIHVybCDopoHmuIXnkIbnmoTotYTmupB1cmxcclxuICAgICAqIEBwYXJhbSBpc0NsZWFyIOWvueS6jue8k+WtmOaxoOS4reeahOaVsOaNru+8jOW9k+W8leeUqOS4ujDml7bvvIzmmK/lkKbnm7TmjqXlvLrliLbmuIXpmaTvvIgg5aaC5p6c5Li6ZmFsc2Us5YiZ562J5b6F57yT5a2Y5a6a5pe25Yi35paw5pe25YCZ5YaN5Y675Yik5patIO+8iVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmVtb3ZlUmVzb3VyY2VzQnl1cmwoIHVybDpzdHJpbmcsaXNDbGVhcjpib29sZWFuID0gZmFsc2UgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYodGhpcy51cmxSZXMuaGFzT3duUHJvcGVydHkodXJsKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBpc0NsZWFyIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5jbGVhclJlcyh1cmwpO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXJsUmVzW3VybF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVybFJlc1t1cmxdLS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5sb2FkZXIuY2xlYXJSZXModXJsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDljIXotYTmupDmsaBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwYWNrYWdlUmVzOmFueTtcclxuXHJcblxyXG4gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBDbGVhckxpdmVEYXRhQnlQYWNrTmFtZSggcGtnTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMucGFja2FnZVJlc1sgcGtnTmFtZSBdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2bzpMb2NhbERhdGEgPSB0aGlzLnBhY2thZ2VSZXNbIHBrZ05hbWUgXTtcclxuICAgICAgICAgICAgdm8uY2xlYXIoKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMucGFja2FnZVJlc1sgcGtnTmFtZSBdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiBcclxuICAgIHByaXZhdGUgQ2xlYXJJbnRlcnZhbDpudW1iZXIgPSA1MDAwMDtcclxuXHJcbiAgICBwcml2YXRlIENoZWNrSW50ZXJ2YWw6bnVtYmVyID0gMjAwMDA7XHJcbiAgICAgLyoqXHJcbiAgICAgKiB1cmzotYTmupDmsaBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cmxSZXM6YW55O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75YqgdWnljIVcclxuICAgICAqIEBwYXJhbSBwa2duYW1lIOWMheWQjVxyXG4gICAgICogQHBhcmFtIGlzYWRkcGFja2FnZSDmmK/lkKbliJvlu7p1aXBhY2thZ2VcclxuICAgICAqIEBwYXJhbSBpc0NhY2hlIOaYr+WQpua3u+WKoOWIsOe7hOe8k+WtmOS4re+8iCDlpoLmnpzmt7vliqDvvIzliJnlj4LkuI7lrprml7bmuIXnkIbnmoTpgLvovpEs5bi46am76LWE5rqQ6K+35Yu/6K6+572u5Li6dHVyZSDvvIlcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZFZpZXdQYWNrQnlOYW1lKHBrZ25hbWU6c3RyaW5nLGlzYWRkcGFja2FnZTpib29sZWFuID0gdHJ1ZSxpc0NhY2hlOmJvb2xlYW4gPSB0cnVlKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGlzYWRkcGFja2FnZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggcGtnbmFtZSA9PSBcIm1haW5cIiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5hZGRQYWNrYWdlKEFzc2V0UGF0aC5yZXMgKyBBc3NldFBhdGguc3VicGFja3NnZXVpICsgcGtnbmFtZSxwa2duYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5hZGRQYWNrYWdlKEFzc2V0UGF0aC5yZXNvdXJjZXMgKyBBc3NldFBhdGgudWkgKyBwa2duYW1lLHBrZ25hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkFkZExvY2FsTGl2ZURhdGEoIHBrZ25hbWUsaXNDYWNoZSApO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5YyFXHJcbiAgICAgKiBAcGFyYW0gcGtnbmFtZSDljIXlkI1cclxuICAgICAqIEBwYXJhbSBpc2NsZWFyIOaYr+WQpuW8uuWItua4hemZpO+8iCDlpoLmnpzkuLpmYWxzZeWImeetieW+heWumuaXtuWZqOWIpOaWrea4heeQhu+8jOWmguaenOS4unRydWXliJnlvLrliLbmuIXpmaQg77yJXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDbGVhclBhY2tCeU5hbWUocGtnbmFtZTpzdHJpbmcsaXNjbGVhcjpib29sZWFuID0gZmFsc2UpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggcGtnbmFtZSA9PSBcIlwiIHx8IHBrZ25hbWUgPT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBpc2NsZWFyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmYWlyeWd1aS5VSVBhY2thZ2UucmVtb3ZlUGFja2FnZSggcGtnbmFtZSApO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5wYWNrYWdlUmVzLmhhc093blByb3BlcnR5KCBwa2duYW1lICkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5wYWNrYWdlUmVzW3BrZ25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLnBhY2thZ2VSZXMuaGFzT3duUHJvcGVydHkoIHBrZ25hbWUgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2bzpMb2NhbERhdGEgPSB0aGlzLnBhY2thZ2VSZXNbIHBrZ25hbWUgXTtcclxuICAgICAgICAgICAgICAgIGlmKCB2byApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm8ucmVmLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBSZWZyZXNoR3JvdXBSZXMoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5vd1RpbWU6bnVtYmVyID0gTGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgIHZhciBzO1xyXG4gICAgICAgIGlmKCB0aGlzLnBhY2thZ2VSZXMgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkxvY2FsRGF0YTtcclxuICAgICAgICAgICAgZm9yKCBzIGluIHRoaXMucGFja2FnZVJlcyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gdGhpcy5wYWNrYWdlUmVzW3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvLnJlZiA8PSAwICYmIChub3dUaW1lIC0gdm8udGltZSkgPiB0aGlzLkNsZWFySW50ZXJ2YWwgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2xlYXJQYWNrQnlOYW1lKCB2by5wYWNrYWdlTmFtZSx0cnVlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5DbGVhckxpdmVEYXRhQnlQYWNrTmFtZSggdm8ucGFja2FnZU5hbWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL+a4heeQhuWbvueJh+e8k+WtmFxyXG4gICAgICAgIGlmKCB0aGlzLnVybFJlcyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcmVzb3VyY2V1cmxQb29sOmFueSA9IHRoaXMudXJsUmVzO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gcmVzb3VyY2V1cmxQb29sIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHJlc291cmNldXJsUG9vbFtzXSA8PSAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlJlbW92ZVJlc291cmNlc0J5dXJsKCBzLHRydWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBza2luczogQXJyYXk8c3RyaW5nPiA9IFtcInJlcy91aS90YWIxLnBuZ1wiLCBcInJlcy91aS90YWIyLnBuZ1wiXTtcclxuICAgIHByaXZhdGUgb25Ta2luTG9hZGVkKCk6IHZvaWQge1xyXG4gICAgICAgIHZhciB0YWJBOiBUYWIgPSB0aGlzLmNyZWF0ZVRhYih0aGlzLnNraW5zWzBdKTtcclxuICAgICAgICB0YWJBLnBvcyg0MCwgMTIwKTtcclxuICAgICAgICB0YWJBLmxhYmVsQ29sb3JzID0gXCIjMDAwMDAwLCNkM2QzZDMsIzMzMzMzM1wiO1xyXG5cclxuICAgICAgICB2YXIgdGFiQjogVGFiID0gdGhpcy5jcmVhdGVUYWIodGhpcy5za2luc1sxXSk7XHJcbiAgICAgICAgdGFiQi5wb3MoNDAsIDIyMCk7XHJcbiAgICAgICAgdGFiQi5sYWJlbENvbG9ycyA9IFwiI0ZGRkZGRiwjOEZCMjk5LCNGRkZGRkZcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVRhYihza2luOiBzdHJpbmcpOiBUYWIge1xyXG4gICAgICAgIHZhciB0YWI6IFRhYiA9IG5ldyBUYWIoKTtcclxuICAgICAgICB0YWIuc2tpbiA9IHNraW47XHJcblxyXG4gICAgICAgIHRhYi5sYWJlbEJvbGQgPSB0cnVlO1xyXG4gICAgICAgIHRhYi5sYWJlbFNpemUgPSAyMDtcclxuICAgICAgICB0YWIubGFiZWxTdHJva2VDb2xvciA9IFwiIzAwMDAwMFwiO1xyXG5cclxuICAgICAgICB0YWIubGFiZWxzID0gXCJUYWIgQ29udHJvbCAxLFRhYiBDb250cm9sIDIsVGFiIENvbnRyb2wgM1wiO1xyXG4gICAgICAgIHRhYi5sYWJlbFBhZGRpbmcgPSBcIjAsMCwwLDBcIjtcclxuXHJcbiAgICAgICAgdGFiLnNlbGVjdGVkSW5kZXggPSAxO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGFiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRhYjtcclxuICAgIH1cclxuICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5blt7Lnu4/liqDovb3ov4fnmoTmlbDmja5cclxuICAgICAqIEBwYXJhbSB1cmwg6LWE5rqQdXJsXHJcbiAgICAgKiBAcGFyYW0gaXNDYWNoZSDmmK/lkKblrZjlgqjlnKjnvJPlrZjmsaDkuK3vvIzpu5jorqTkuLp0cnVlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHYWluUmVzb3VyY2VzKCB1cmw6c3RyaW5nLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUgKTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggaXNDYWNoZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZih0aGlzLnVybFJlc1t1cmxdID09IG51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXJsUmVzW3VybF0gPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudXJsUmVzW3VybF0rKztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIExheWEubG9hZGVyLmdldFJlcyh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuXHJcbiAgICBwcml2YXRlIEFkZExvY2FsTGl2ZURhdGEoIHBrZ25hbWU6c3RyaW5nLGlzQ2FjaGU6Ym9vbGVhbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaXNDYWNoZSAmJiAhdGhpcy5Ob0xpdmVEYXRhLmhhc093blByb3BlcnR5KCBwa2duYW1lICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkxvY2FsRGF0YTtcclxuICAgICAgICAgICAgaWYoICF0aGlzLnBhY2thZ2VSZXMuaGFzT3duUHJvcGVydHkoIHBrZ25hbWUgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gR2FtZVBvb2wuR2V0SXRlbSggTG9jYWxEYXRhLlJlc0RpY1ZhbHVlICk7XHJcbiAgICAgICAgICAgICAgICB2by5wYWNrYWdlTmFtZSA9IHBrZ25hbWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhY2thZ2VSZXNbIHBrZ25hbWUgXSA9IHZvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm8gPSB0aGlzLnBhY2thZ2VSZXNbcGtnbmFtZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm8ucmVmKys7XHJcbiAgICAgICAgICAgIHZvLnRpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgXHJcbn0iLCIvKlxyXG4qIG5hbWU7XHJcbiovXHJcbmltcG9ydCBIYW5kbGVyID0gTGF5YS5IYW5kbGVyO1xyXG5pbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi9SZXNEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7UmVjQ29uZmlnc30gZnJvbSBcIi4uL0NvbmZpZy9SZWNDb25maWdzXCI7XHJcbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUNvbnRyb2wgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIF9jb25maWdzOiBBcnJheTxhbnk+O1xyXG4gICAgcHJpdmF0ZSBfb25Db25maWdDb21wbGV0ZTogRnVuY3Rpb247XHJcbiAgICBwcml2YXRlIF9vbkNvbmZpZ1Byb2dyZXNzOiBGdW5jdGlvbjsgXHJcbiAgICBwcml2YXRlIF9vbkNvbmZpZ0NvbXBsZXRlVGFyZ2V0OiBhbnk7XHJcbiAgICBwcml2YXRlIF9ncm91cHM6IGFueTtcclxuICAgIHByaXZhdGUgX2dyb3VwSW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgcnVubmluZzpCb29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9ub3dMb2FkRGF0YTphbnk7XHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6UmVzb3VyY2VDb250cm9sO1xyXG5cclxuXHRwdWJsaWMgY29uc3RydWN0b3IoKSBcclxuXHR7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuaW5zID0gdGhpcztcclxuXHR9XHJcblx0XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBSZXNvdXJjZUNvbnRyb2xcclxuXHR7XHJcbiAgICAgICAgaWYoUmVzb3VyY2VDb250cm9sLmlucyA9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbnRyb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFJlc291cmNlQ29udHJvbC5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdGhpcy5fZ3JvdXBzID0ge307XHJcbiAgICAgICAgTGF5YS5sb2FkZXIucmV0cnlOdW0gPSA0O1xyXG4gICAgICAgIExheWEubG9hZGVyLm9uKExheWEuRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMub25FcnJvcik7XHJcbiAgICAgICAgTGF5YS5sb2FkZXIub24oXCJlcnJvcnNNc2dcIiwgdGhpcywgdGhpcy5lcnJvcnNNc2doYW5kbGVyKTtcclxuICAgICAgICBMYXlhLmxvYWRlci5vbihcImdhbWVlcnJvcnNNc2dcIiwgdGhpcywgdGhpcy5nYW1lZXJyb3JzTXNnaGFuZGxlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvYWRDb25maWdDb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fb25Db25maWdDb21wbGV0ZVRhcmdldCAhPSBudWxsICYmIHRoaXMuX29uQ29uZmlnQ29tcGxldGUgIT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9vbkNvbmZpZ0NvbXBsZXRlLmNhbGwoIHRoaXMuX29uQ29uZmlnQ29tcGxldGVUYXJnZXQgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlcnJvcnNNc2doYW5kbGVyKCBtc2c6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFwibG9hZGZhaWxFdmVudFwiLG1zZyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2FtZWVycm9yc01zZ2hhbmRsZXIoIG1zZzpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggXCJnYW1lc2Vycm9zRXZlbnRcIixtc2cgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vei1hOa6kOe7hFxyXG4gICAgICogQHBhcmFtIGdyb3VwTmFtZSDnu4TlkI1cclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSDlrozmiJDkuovku7ZcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlUHJvZ3Jlc3MgICDliqDovb3ov5vluqbkuovku7ZcclxuICAgICAqIEBwYXJhbSBpc1Nob3cgICAgICAgICAgICAgICDmmK/lkKbmmL7npLrliqDovb3nirbmgIFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvYWRHcm91cChncm91cE5hbWU6c3RyaW5nLG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzU2hvdzpCb29sZWFuID0gdHJ1ZSxhcmdzOmFueT1udWxsKVxyXG4gICAge1xyXG4gICAgICAgIC8vIERlYnVnZXIubG9nKGdyb3VwTmFtZSk7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IFJlY0NvbmZpZ3MuSW5zdGFuY2UuUmVzRGljWyBncm91cE5hbWUgXTtcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzU2hvdztcclxuICAgICAgICBkYXRhLmFyZ3M9YXJncztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcImdyb3VwXCI7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiMkRcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L295Y2V5Liq6LWE5rqQXHJcbiAgICAgKiBAcGFyYW0gdXJsIOi1hOa6kHVybFxyXG4gICAgICogQHBhcmFtIHR5cGUg6LWE5rqQ57G75Z6LXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQg5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUg5a6M5oiQ5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyDmmK/lkKbmmL7npLrliqDovb3nirbmgIFcclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWRlciggdXJsOmFueSwgdHlwZTpzdHJpbmcsb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsaXNTaG93OkJvb2xlYW4gPSB0cnVlLGFyZ3M6YW55PW51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IFt7dXJsOnVybCx0eXBlOnR5cGV9XTtcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzU2hvdztcclxuICAgICAgICBkYXRhLmFyZ3M9YXJncztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcInNpbmdsZVwiO1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjJEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9veaVsOe7hOi1hOa6kFxyXG4gICAgICogQHBhcmFtIHVybHMgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQgXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIFxyXG4gICAgICogQHBhcmFtIGlzU2hvdyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWRlcnMoIHVybHM6QXJyYXk8YW55Piwgb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsaXNTaG93OkJvb2xlYW4gPSB0cnVlLGFyZ3M6YW55PW51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IHVybHM7XHJcbiAgICAgICAgZGF0YS5pc1Nob3cgPSBpc1Nob3c7XHJcbiAgICAgICAgZGF0YS50eXBlID0gXCJhcnJcIjtcclxuICAgICAgICBkYXRhLmFyZ3M9YXJncztcclxuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIyRFwiO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3MucHVzaCggZGF0YSApO1xyXG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDopoHliqDovb3nmoTmgLvmlbDph49cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbG9hZE51bTpudW1iZXIgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlt7Lnu4/liqDovb3nmoTmlbDph49cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbG9hZGVkTnVtOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJlbG9hZE51bTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX2N1dDpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX25vd0xvYWRBcnI6QXJyYXk8YW55PiA9IG51bGw7XHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vei1hOa6kOaVsOe7hO+8jOatpOWKoOi9veaWueazleS8muWNleS4quWKoOi9veaVsOe7hOWGheeahOi1hOa6kO+8jOeUqOS6juaYvuekuuS4pOS4qui/m+W6puadoe+8iCDkuIDkuKrmgLvov5vluqbmnaHvvIzkuIDkuKrljZXkuKrotYTmupDov5vluqbmnaEg77yJXHJcbiAgICAgKiBAcGFyYW0gdXJscyBcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCBcclxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSBcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlUHJvZ3Jlc3MgXHJcbiAgICAgKiBAcGFyYW0gaXNTaG93IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZGVyQXJyKHVybHM6QXJyYXk8YW55Piwgb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsY3V0Om51bWJlciA9IDMpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlID0gUmVzb3VyY2VMb2FkQ29tcGxldGU7XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xyXG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XHJcbiAgICAgICAgZGF0YS51cmxzID0gdXJscztcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgIGRhdGEudHlwZSA9IFwibG9hZGVyQXJyXCI7XHJcbiAgICAgICAgZGF0YS5jdXQgPSBjdXQ7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiMkRcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLnN0YXJ0TG9hZDEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0TG9hZDEoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoICF0aGlzLnJ1bm5pbmcgJiYgdGhpcy5fY29uZmlncy5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhID0gdGhpcy5fY29uZmlncy5zaGlmdCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9ub3dMb2FkQXJyID0gKHRoaXMuX25vd0xvYWREYXRhLnVybHMgYXMgQXJyYXk8YW55PikuY29uY2F0KCkucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkTnVtID0gdGhpcy5fbm93TG9hZEFyci5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZE51bSA9MDtcclxuICAgICAgICAgICAgdGhpcy5fcHJlbG9hZE51bSA9IHRoaXMuX2xvYWRlZE51bTtcclxuICAgICAgICAgICAgdGhpcy5fY3V0ID0gTnVtYmVyKHRoaXMuX25vd0xvYWREYXRhLmN1dCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFN0YXJ0MSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRTdGFydDEoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMucnVubmluZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkQXJyICYmIHRoaXMuX25vd0xvYWRBcnIubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgbmVlZEFycjpBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93TG9hZEFyci5sZW5ndGggPiB0aGlzLl9jdXQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuZWVkQXJyID0gdGhpcy5fbm93TG9hZEFyci5zcGxpY2UoIDAsdGhpcy5fY3V0ICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuZWVkQXJyID0gdGhpcy5fbm93TG9hZEFyci5zcGxpY2UoIDAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9jdXQgPSBuZWVkQXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy5fcHJlbG9hZE51bSA9IHRoaXMuX2xvYWRlZE51bTtcclxuICAgICAgICAgICAgdGhpcy5vbkxvYWRpbmdBcnIoIDAgKTtcclxuICAgICAgICAgICAgdmFyIHJlc291c2VUeXBlOnN0cmluZyA9IHRoaXMuX25vd0xvYWREYXRhLnJlc291c2VUeXBlO1xyXG4gICAgICAgICAgICBpZihyZXNvdXNlVHlwZSA9PSBcIjJEXCJ8fHJlc291c2VUeXBlPT1udWxsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKG5lZWRBcnIsIEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkQ29tcGxldGVBcnIpLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkaW5nQXJyLG51bGwsIGZhbHNlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5jcmVhdGUobmVlZEFyciwgSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRDb21wbGV0ZUFyciksSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRpbmdBcnIsbnVsbCwgZmFsc2UpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRMb2FkMSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uTG9hZGluZ0Fycih2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbG9hZGVkTnVtID0gdGhpcy5fcHJlbG9hZE51bSArIHZhbHVlKnRoaXMuX2N1dDtcclxuICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFsbHZhbHVlOm51bWJlciA9IE1hdGguY2VpbCgodGhpcy5fbG9hZGVkTnVtIC8gdGhpcy5fbG9hZE51bSApKjEwMCk7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YS5wcm9ncmVzcyAhPSBudWxsIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93TG9hZERhdGEucHJvZ3Jlc3MuY2FsbCggdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGVUYXJnZXQsYWxsdmFsdWUsTWF0aC5mbG9vcih2YWx1ZSoxMDApICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvYWRDb21wbGV0ZUFycigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm9uTG9hZGluZ0FyciggMSApO1xyXG4gICAgICAgIHRoaXMuX2xvYWRlZE51bSA9IHRoaXMuX3ByZWxvYWROdW0gKyB0aGlzLl9jdXQ7XHJcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYoIHRoaXMuX2xvYWRlZE51bSA9PSB0aGlzLl9sb2FkTnVtIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YSAmJiB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlLmNhbGwodGhpcy5fbm93TG9hZERhdGEuY29tcGxldGVUYXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEudGltZXIuY2FsbExhdGVyKCB0aGlzLCB0aGlzLmxvYWRTdGFydDEgKTtcclxuICAgICAgICAvLyB0aGlzLmxvYWRTdGFydDEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRTdGFydCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ydW5uaW5nIHx8IHRoaXMuX2NvbmZpZ3MubGVuZ3RoID09IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX25vd0xvYWREYXRhID0gdGhpcy5fY29uZmlnc1swXTtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSB0aGlzLl9ub3dMb2FkRGF0YS51cmxzO1xyXG4gICAgICAgIHZhciBpc1Nob3c6Ym9vbGVhbiA9IHRoaXMuX25vd0xvYWREYXRhLmlzU2hvdztcclxuICAgICAgICBpZiggaXNTaG93IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3Quc2hvd01vZGFsV2FpdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVzb3VzZVR5cGU6c3RyaW5nID0gdGhpcy5fbm93TG9hZERhdGEucmVzb3VzZVR5cGU7XHJcbiAgICAgICAgaWYoIGFyciAhPSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKHJlc291c2VUeXBlID09IFwiMkRcInx8cmVzb3VzZVR5cGU9PW51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIExheWEubG9hZGVyLmxvYWQoYXJyLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkQ29tcGxldGUpLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkaW5nLCBudWxsLCBmYWxzZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIuY3JlYXRlKGFycixIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZENvbXBsZXRlKSxIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZGluZywgbnVsbCwgZmFsc2UpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDliqDovb3ov5vluqbkvqblkKzlmahcclxuICAgIHByaXZhdGUgb25Mb2FkaW5nKHByb2dyZXNzOiBudW1iZXIpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm9ncmVzcyA9IE1hdGguY2VpbCggTnVtYmVyKHByb2dyZXNzICogMTAwKSApO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEucHJvZ3Jlc3MgIT0gbnVsbCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLnByb2dyZXNzLmNhbGwoIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlVGFyZ2V0LHByb2dyZXNzICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvYWRDb21wbGV0ZShhcmdzOmFueT1udWxsKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5jbG9zZU1vZGFsV2FpdCgpO1xyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YSAmJiB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZih0aGlzLl9ub3dMb2FkRGF0YS5hcmdzKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlLmNhbGwodGhpcy5fbm93TG9hZERhdGEuY29tcGxldGVUYXJnZXQsdGhpcy5fbm93TG9hZERhdGEuYXJncyk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGUuY2FsbCh0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZVRhcmdldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fbm93TG9hZERhdGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3Muc2hpZnQoKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25FcnJvcihlcnI6IFN0cmluZyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuY2xvc2VNb2RhbFdhaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vTNE5Y2V5Liq6LWE5rqQXHJcbiAgICAgKiBAcGFyYW0gdXJsIOi1hOa6kHVybFxyXG4gICAgICogQHBhcmFtIHR5cGUg6LWE5rqQ57G75Z6LXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQg5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUg5a6M5oiQ5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyDmmK/lkKbmmL7npLrliqDovb3nirbmgIFcclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWRlcjNEKCB1cmw6YW55LCB0eXBlOmFueSxvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxpc1Nob3c6Qm9vbGVhbiA9IHRydWUgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IFt7dXJsOnVybCx0eXBlOnR5cGV9XTtcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzU2hvdztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcInNpbmdsZVwiO1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjNEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vTNE6LWE5rqQ57uEXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOe7hOWQjVxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIOWujOaIkOS6i+S7tlxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyAgIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyAgICAgICAgICAgICAgIOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZEdyb3VwM0QoZ3JvdXBOYW1lOnN0cmluZyxvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxpc1Nob3c6Qm9vbGVhbiA9IHRydWUsYXJnczphbnk9bnVsbClcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlID0gUmVzb3VyY2VMb2FkQ29tcGxldGU7XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xyXG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XHJcbiAgICAgICAgZGF0YS51cmxzID0gUmVjQ29uZmlncy5JbnN0YW5jZS5SZXNEaWNbIGdyb3VwTmFtZSBdO1xyXG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xyXG4gICAgICAgIGRhdGEuYXJncz1hcmdzO1xyXG4gICAgICAgIGRhdGEudHlwZSA9IFwiZ3JvdXBcIjtcclxuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIzRFwiO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3MucHVzaCggZGF0YSApO1xyXG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3otYTmupDmlbDnu4TvvIzmraTliqDovb3mlrnms5XkvJrljZXkuKrliqDovb3mlbDnu4TlhoXnmoTotYTmupDvvIznlKjkuo7mmL7npLrkuKTkuKrov5vluqbmnaHvvIgg5LiA5Liq5oC76L+b5bqm5p2h77yM5LiA5Liq5Y2V5Liq6LWE5rqQ6L+b5bqm5p2hIO+8iVxyXG4gICAgICogQHBhcmFtIHVybHMgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQgXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIFxyXG4gICAgICogQHBhcmFtIGlzU2hvdyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvYWRlcjNEQXJyKHVybHM6QXJyYXk8YW55Piwgb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsaXNzaG93OmJvb2xlYW4gPSBmYWxzZSxhcmdzOmFueT1udWxsKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IHVybHM7XHJcbiAgICAgICAgZGF0YS5pc1Nob3cgPSBpc3Nob3c7XHJcbiAgICAgICAgZGF0YS5hcmdzPWFyZ3M7XHJcbiAgICAgICAgZGF0YS50eXBlID0gXCJsb2FkZXJBcnJcIjtcclxuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIzRFwiO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3MucHVzaCggZGF0YSApO1xyXG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3nibnmlYhcclxuICAgICAqIEBwYXJhbSBncm91cE5hbWUgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQgXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUgXHJcbiAgICAgKiBAcGFyYW0gYXJncyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvYWRFZmZlY3QoIGdyb3VwTmFtZTpzdHJpbmcsb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLGFyZ3M6YW55PW51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHVybHM6QXJyYXk8YW55PiA9IFJlY0NvbmZpZ3MuSW5zdGFuY2UuUmVzRGljWyBncm91cE5hbWUgXTtcclxuICAgICAgICBpZiggdXJscyAmJiB1cmxzLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5sb2FkZXIubG9hZCh1cmxzLEhhbmRsZXIuY3JlYXRlKCBvblJlc291cmNlTG9hZFRhcmdldCxSZXNvdXJjZUxvYWRDb21wbGV0ZSxbYXJnc10gKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgTGF5b3V0Q29udHJvbCB9IGZyb20gXCIuL0xheW91dENvbnRyb2xcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuaW1wb3J0IHtDYW1lcmFNYW5hZ2VyfSBmcm9tIFwiLi4vR2FtZS9DYW1lcmFNYW5hZ2VyXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7UGxheWVyfSBmcm9tIFwiLi4vR2FtZS9QbGF5ZXJcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IExldmVsQ0ZHIGZyb20gXCIuLi9DRkcvTGV2ZWxDRkdcIjtcclxuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5pbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xyXG5pbXBvcnQge1JvbGVEYXRhfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCBOcGNDRkcgZnJvbSBcIi4uL0NGRy9OcGNDRkdcIjtcclxuaW1wb3J0IHtOcGNTY3JpcHR9IGZyb20gXCIuLi9HYW1lL05wY1NjcmlwdFwiO1xyXG5pbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4vUmVzb3VyY2VDb250cm9sXCI7XHJcbmltcG9ydCBHYW1lQ0ZHIGZyb20gXCIuLi9DRkcvR2FtZUNGR1wiO1xyXG5pbXBvcnQge0NoYXJhY3RlclN0YXRlfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZVwiO1xyXG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQge0NoYXJhY3RlclBvb2x9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclBvb2xcIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHsgTGF5T1VUIH0gZnJvbSBcIi4uL3V0aWxzL0xheU9VVFwiO1xyXG5cclxuXHJcbmltcG9ydCBTcHJpdGUgPSBMYXlhLlNwcml0ZTtcclxuaW1wb3J0IFN0YWdlID0gTGF5YS5TdGFnZTtcclxuaW1wb3J0IEV2ZW50ID0gTGF5YS5FdmVudDtcclxuaW1wb3J0IEJyb3dzZXIgPSBMYXlhLkJyb3dzZXI7XHJcbmltcG9ydCBXZWJHTCA9IExheWEuV2ViR0w7XHJcbmV4cG9ydCBjbGFzcyBTY2VuZUNvbnRyb2xcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlNjZW5lQ29udHJvbDtcclxuXHJcbiAgICBwcml2YXRlIF9pbml0UG9zWTpudW1iZXIgPSAxO1xyXG5cclxuICAgIHB1YmxpYyBjYW1lcmFTY3JpcHQ6Q2FtZXJhTWFuYWdlcjtcclxuICAgIHB1YmxpYyBQbGF5ZXJTY3JpcHQ6UGxheWVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgU2NlbmVDb250cm9sLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyrkvb/nlKjnlYzpnaLmmL7npLrvvIww77ya56C46JuLLDE65a6d566xKi9cclxuICAgIHN0YXRpYyBFZ2dHR3JvdXA6bnVtYmVyPTA7XHJcblxyXG4gICAgLyoq562+5Yiw5piv5ZCm5q2j5Zyo5pi+56S6ICovXHJcbiAgICBzdGF0aWMgSXNTaG93U2lnbjpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpTY2VuZUNvbnRyb2xcclxuICAgIHtcclxuICAgICAgICBpZiggU2NlbmVDb250cm9sLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2NlbmVDb250cm9sKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTY2VuZUNvbnRyb2wuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5Yib5bu65Li76KeSXHJcbiAgICBwdWJsaWMgQ3JlYXRlUGxheWVyKCByb2xlY2ZnOlJvbGVDRkcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGlzY3JlYXRlOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBpZiggIVByb3BNYW5hZ2VyLm1haW5Sb2xlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlzY3JlYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggUHJvcE1hbmFnZXIubWFpblJvbGUubmFtZSAhPSBcIkNoYXJhY3RlclwiICsgcm9sZWNmZy5uYW1lIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlzY3JlYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5DbGVhck1vbWVudENoYXJhY3RlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggaXNjcmVhdGUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gdmFyIHNwOkxheWEuU3ByaXRlM0QgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKFJvbGVEYXRhLnJvbGVDZmcubmFtZSkpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIC8vIFByb3BNYW5hZ2VyLm1haW5Sb2xlID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShzcCwgUHJvcE1hbmFnZXIuc2NlbmUzRCwgZmFsc2UsbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIubWFpblJvbGUgPSBDaGFyYWN0ZXJQb29sLkFkZENoYXJhY3Rlciggcm9sZWNmZy5uYW1lLFBsYXllcixQcm9wTWFuYWdlci5zY2VuZTNEICk7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLm1haW5Sb2xlLm5hbWUgPSBcIkNoYXJhY3RlclwiICsgcm9sZWNmZy5uYW1lO1xyXG4gICAgICAgICAgICB0aGlzLlBsYXllclNjcmlwdCA9IFByb3BNYW5hZ2VyLm1haW5Sb2xlLmdldENvbXBvbmVudCggUGxheWVyICk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyB0aGlzLm1haW5Sb2xlU2NyaXB0LnJlc291c2VOYW1lID0gUm9sZURhdGEucm9sZUNmZy5uYW1lO1xyXG4gICAgICAgICAgICAvLyBpZiggIClcclxuICAgICAgICAgICAgLy8gdGhpcy5tYWluUm9sZVNjcmlwdCA9IFByb3BNYW5hZ2VyLm1haW5Sb2xlLmFkZENvbXBvbmVudCggTWFpblJBb2xlU2NyaXB0ICk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYWdlbmN5dXNlcm1lc3NhZ2U6QWdlbmN5VXNlck1lc3NhZ2UgPSBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oIEFnZW5jeVVzZXJNZXNzYWdlICk7XHJcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGE7XHJcbiAgICAgICAgdmFyIGluZm86YW55ID0gUm9sZURhdGEubGV2ZWxjZmcucm9sZWluaXRwb3M7XHJcbiAgICAgICAgdmFyIGNoaWRhcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FycihpbmZvLm9mZnNldFBvcyk7XHJcbiAgICAgICAgdmFyIG9mZnNldFBvczpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCBOdW1iZXIoIGNoaWRhcnJbMF0pLE51bWJlciggY2hpZGFyclsxXSksTnVtYmVyKCBjaGlkYXJyWzJdKSApO1xyXG4gICAgICAgIHZhciBwb3NWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgICAgICB2YXIgc2VsZWN0VmVjOkxheWEuVmVjdG9yMztcclxuICAgICAgICBpZiggaW5mby5pbml0YnVpbGQgPT0gXCJzdGFydHBhbmVsXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcG9zVmVjLnggPSBQcm9wTWFuYWdlci5zdGFydFBsYW5lLnRyYW5zZm9ybS5wb3NpdGlvbi54ICsgb2Zmc2V0UG9zLng7XHJcbiAgICAgICAgICAgIHBvc1ZlYy55ID0gUHJvcE1hbmFnZXIuc3RhcnRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24ueSArIG9mZnNldFBvcy55O1xyXG4gICAgICAgICAgICBwb3NWZWMueiA9IFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgc2VsZWN0VmVjID0gKCBQcm9wTWFuYWdlci5zdGFydFBsYW5lLmdldENoaWxkQnlOYW1lKCBcImNoaWxkX3Bvc1wiICkgYXMgTGF5YS5TcHJpdGUzRCApLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNoaWxkcG9zOkxheWEuVmVjdG9yMyA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIFJvbGVEYXRhLmxldmVsbWFwQXJyWzBdLGluZm8uaW5pdGJ1aWxkICk7XHJcbiAgICAgICAgICAgIHBvc1ZlYy54ID0gY2hpbGRwb3MueCArIG9mZnNldFBvcy54O1xyXG4gICAgICAgICAgICBwb3NWZWMueSA9IGNoaWxkcG9zLnkgKyBvZmZzZXRQb3MueTtcclxuICAgICAgICAgICAgcG9zVmVjLnogPSBjaGlsZHBvcy56ICsgb2Zmc2V0UG9zLno7XHJcbiAgICAgICAgICAgIHNlbGVjdFZlYyA9IGNoaWxkcG9zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3NWZWM7XHJcbiAgICAgICAgdGhpcy5jYW1lcmFTY3JpcHQuU2V0Q2FtZXJhUG9zaXRpb24oUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uKTtcclxuICAgICAgICB0aGlzLlBsYXllclNjcmlwdC5zZXRub3dTZWxlY3RWZWMoIHNlbGVjdFZlYyApO1xyXG4gICAgICAgIHRoaXMuUGxheWVyU2NyaXB0Lm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnN0YW5kO1xyXG4gICAgICAgIHRoaXMuUGxheWVyU2NyaXB0LlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc3RhbmQgKTtcclxuXHJcbiAgICAgICAgLy8gdmFyIFVJUG9zID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgIC8vIHZhciBOQU1FVUkgPSBuZXcgTGF5YS5UZXh0KCk7XHJcblxyXG4gICAgICAgIC8vIE5BTUVVSS50ZXh0ID0gXCLoh6rlt7FcIjtcclxuICAgICAgICAvLyBOQU1FVUkuZm9udFNpemUgPSA2MDtcclxuICAgICAgICAvLyBOQU1FVUkuY29sb3IgPSBcIiNmZmZmZmZcIjtcclxuICAgICAgICAvLyBOQU1FVUkuc2NhbGVYID0gMC41O1xyXG4gICAgICAgIC8vIE5BTUVVSS5zY2FsZVkgPSAwLjU7XHJcbiAgICAgICAgLy8gTkFNRVVJLmFsaWduID0gXCJjZW50ZXJcIjtcclxuICAgICAgICAvLyBOQU1FVUkudmFsaWduID0gXCJtaWRkbGVcIjtcclxuICAgICAgICAvLyBMYXlhLnN0YWdlLmFkZENoaWxkKE5BTUVVSSk7XHJcbiAgICAgICAgLy8gTGF5YS50aW1lci5mcmFtZUxvb3AoMSwgdGhpcywgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBsZXQgU2NyZWVuUG9zID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgICAgIC8vICAgICBQcm9wTWFuYWdlci5jYXJtYS53b3JsZFRvVmlld3BvcnRQb2ludChVSVBvcywgU2NyZWVuUG9zKTtcclxuICAgICAgICAvLyAgICAgTkFNRVVJLnBvcyhTY3JlZW5Qb3MueCwgU2NyZWVuUG9zLnkpO1xyXG4gICAgICAgIC8vIH0pXHJcbiAgICB9XHJcbiAgICAvL+WIm+W7um5wY1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVOcGMoICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXROcGMtLS1cIik7XHJcbiAgICAgICAgdGhpcy5DbGVhck5wYygpO1xyXG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcclxuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSBhZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSBSb2xlRGF0YS5sZXZlbGNmZy5ucGM7XHJcbiAgICAgICAgdmFyIGNoaWxkZGljdDphbnk7XHJcbiAgICAgICAgdmFyIGluZGV4Om51bWJlciA9IDA7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIubnBjbnVtID0gYXJyLmxlbmd0aDtcclxuICAgICAgICBmb3IoIHZhciBzIGluIGFyciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGlsZGRpY3QgPSBhcnJbc107XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3RWZWM6TGF5YS5WZWN0b3IzID0gbnVsbDtcclxuICAgICAgICAgICAgdmFyIG5wY2NmZzpOcGNDRkcgPSBOcGNDRkcuZGljdFsgY2hpbGRkaWN0LmlkIF07XHJcbiAgICAgICAgICAgIHZhciBzcDpMYXlhLlNwcml0ZTNEID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbChucGNjZmcubmFtZSkpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIHZhciBjaGlkYXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoY2hpbGRkaWN0Lm9mZnNldFBvcyk7XHJcbiAgICAgICAgICAgIHZhciBvZmZzZXRQb3M6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMyggTnVtYmVyKCBjaGlkYXJyWzBdKSxOdW1iZXIoIGNoaWRhcnJbMV0pLE51bWJlciggY2hpZGFyclsyXSkgKTtcclxuICAgICAgICAgICAgdmFyIHBvc1ZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgICAgICAgICBpZiggY2hpbGRkaWN0LnNjZW5lID09IFwic3RhcnRwYW5lbFwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcG9zVmVjLnggPSBQcm9wTWFuYWdlci5zdGFydFBsYW5lLnRyYW5zZm9ybS5wb3NpdGlvbi54ICsgb2Zmc2V0UG9zLng7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueSA9IFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnkgKyAxICsgb2Zmc2V0UG9zLnk7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueiA9IFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgICAgIHNlbGVjdFZlYyA9ICggUHJvcE1hbmFnZXIuc3RhcnRQbGFuZS5nZXRDaGlsZEJ5TmFtZSggXCJjaGlsZF9wb3NcIiApIGFzIExheWEuU3ByaXRlM0QgKS50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRwb3M6TGF5YS5WZWN0b3IzID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZShjaGlsZGRpY3Quc2NlbmUgLGNoaWxkZGljdC5pbml0YnVpbGQgKTtcclxuICAgICAgICAgICAgICAgIHBvc1ZlYy54ID0gY2hpbGRwb3MueCArIG9mZnNldFBvcy54O1xyXG4gICAgICAgICAgICAgICAgcG9zVmVjLnkgPSBjaGlsZHBvcy55ICsgb2Zmc2V0UG9zLnk7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueiA9IGNoaWxkcG9zLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgICAgIHNlbGVjdFZlYyA9IGNoaWxkcG9zO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgbnBjc3A6TGF5YS5TcHJpdGUzRCA9IENoYXJhY3RlclBvb2wuQWRkQ2hhcmFjdGVyKCBucGNjZmcubmFtZSxOcGNTY3JpcHQsUHJvcE1hbmFnZXIuc2NlbmUzRCApO1xyXG4gICAgICAgICAgICBucGNzcC5uYW1lID0gXCJucGNfXCIgKyBpbmRleDtcclxuICAgICAgICAgICAgbnBjc3AudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zVmVjO1xyXG4gICAgICAgICAgICB2YXIgbnBjc2NyaXB0Ok5wY1NjcmlwdCA9IG5wY3NwLmdldENvbXBvbmVudCggTnBjU2NyaXB0ICk7XHJcbiAgICAgICAgICAgIG5wY3NjcmlwdC5zZXRub3dTZWxlY3RWZWMoIHNlbGVjdFZlYyApO1xyXG4gICAgICAgICAgICBucGNzY3JpcHQubnBjaW5mbyggbnBjY2ZnICk7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLm5wY0RpY3RbIG5wY3NwLm5hbWUgXSA9IG5wY3NwO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5ucGNzY3JpcHREaWN0W25wY3NwLm5hbWVdID0gbnBjc2NyaXB0O1xyXG4gICAgICAgICAgICBucGNzY3JpcHQuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5zdGFuZCApO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICAvLyB0aGlzLlNob3dVSShucGNzcCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0TnBjMi0tLVwiKTtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBpbmRleCA9IDA7XHJcbiAgICBTaG93VUkoX3Nwcml0ZTpMYXlhLlNwcml0ZTNEKXtcclxuICAgICAgICB2YXIgVUlQb3MgPSBfc3ByaXRlLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICB2YXIgTkFNRVVJID0gbmV3IExheWEuVGV4dCgpO1xyXG4gICAgICAgIGxldCByYW5kb20gPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KDEsMzApO1xyXG4gICAgICAgXHJcbiAgICAgICAgTkFNRVVJLnRleHQgPSBcIm5wY19cIisgdGhpcy5pbmRleDtcclxuICAgICAgICBOQU1FVUkuZm9udFNpemUgPSA2MDtcclxuICAgICAgICBOQU1FVUkuY29sb3IgPSBcIiNmZmZmZmZcIjtcclxuICAgICAgICBOQU1FVUkuc2NhbGVYID0gMC41O1xyXG4gICAgICAgIE5BTUVVSS5zY2FsZVkgPSAwLjU7XHJcbiAgICAgICAgTkFNRVVJLmFsaWduID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBOQU1FVUkudmFsaWduID0gXCJtaWRkbGVcIjtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKE5BTUVVSSk7XHJcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoMSwgdGhpcywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgU2NyZWVuUG9zID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5jYXJtYS53b3JsZFRvVmlld3BvcnRQb2ludChVSVBvcywgU2NyZWVuUG9zKTtcclxuICAgICAgICAgICAgTkFNRVVJLnBvcyhTY3JlZW5Qb3MueCwgU2NyZWVuUG9zLnkrMjApO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5pbmRleCsrO1xyXG4gICAgfVxyXG4gICAgXHJcblxyXG4gICAgcHVibGljIFNob3dUaGVHYW1lU2NlbmUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHZhciB1cmxBcnI6QXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhU2NyaXB0LmlzY2FuZm9sbG93ID0gdHJ1ZTtcclxuICAgICAgICB2YXIgcm9sZURhdGE6Um9sZURhdGEgPSAoIFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLlJvbGVEYXRhO1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHJvbGVEYXRhLmxldmVsbWFwQXJyO1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yKCBpID0gMDtpIDwgYXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHVybEFyci5pbmRleE9mKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggYXJyW2ldICkgKSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggYXJyW2ldICkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBucGNBcnI6QXJyYXk8YW55PiA9IHJvbGVEYXRhLmxldmVsY2ZnLm5wYztcclxuICAgICAgICBmb3IoIGkgPSAwO2kgPCBucGNBcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdXJsQXJyLmluZGV4T2YoIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggTnBjQ0ZHLmRpY3RbIG5wY0FycltpXS5pZCBdLm5hbWUgKSApID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggTnBjQ0ZHLmRpY3RbIG5wY0FycltpXS5pZCBdLm5hbWUgKSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IHVybEFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhdGhBcnIucHVzaCggeyB1cmw6dXJsQXJyW2ldIH0gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmxvYWRlcjNEQXJyKCBwYXRoQXJyLHRoaXMsdGhpcy5TY2VuZUNyZWF0Q29tcGxldGUsbnVsbCx0cnVlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBTY2VuZUNyZWF0Q29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5SZWZyZXNoVGVycmFpbigpO1xyXG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcclxuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSBhZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcclxuICAgICAgICB0aGlzLkNyZWF0ZVBsYXllciggUm9sZURhdGEucm9sZUNmZyApO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlTnBjKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBMaXN0ZW5PbkV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVTdGF0ZS5zdGFydCx0aGlzLHRoaXMuRW50ZXJHYW1lICk7IFxyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVTdGF0ZS5qdW1wLHRoaXMsdGhpcy5KdW1wICk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lciggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZCx0aGlzLHRoaXMuUmVmcmVzaENoYXJhY3Rlck1vZGVsICk7XHJcbiAgICB9XHJcblxyXG4gICBcclxuXHJcbiAgICBwcml2YXRlIENoYXJhY3RlckxvYWRFbmQoIHVybDpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFnZW5jeXVzZXJtZXNzYWdlOkFnZW5jeVVzZXJNZXNzYWdlID0gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApO1xyXG4gICAgICAgIHZhciBSb2xlRGF0YTpSb2xlRGF0YSA9IGFnZW5jeXVzZXJtZXNzYWdlLlJvbGVEYXRhO1xyXG4gICAgICAgIGlmKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggUm9sZURhdGEucm9sZUNmZy5uYW1lICkgPT0gdXJsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXRlUGxheWVyKCBSb2xlRGF0YS5yb2xlQ2ZnICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgSnVtcCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLlBsYXllclNjcmlwdC5UZXN0SnVtcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZVNwcml0ZSgpO1xyXG5cclxuICAgICAgICBMYXlhLnN0YWdlLm9uKEV2ZW50Lk1PVVNFX1VQLCB0aGlzLCB0aGlzLm9uTW91c2VVcCk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5vbihFdmVudC5NT1VTRV9PVVQsIHRoaXMsIHRoaXMub25Nb3VzZVVwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNwOiBTcHJpdGU7XHJcbiAgICBwcml2YXRlIHByZVJhZGlhbjogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgY3JlYXRlU3ByaXRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3AgPSBuZXcgU3ByaXRlKCk7XHJcbiAgICAgICAgdmFyIHc6IG51bWJlciA9IDIwMCwgaDogbnVtYmVyID0gMzAwO1xyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1JlY3QoMCwgMCwgdywgaCwgXCIjRkY3RjUwXCIpO1xyXG4gICAgICAgIHRoaXMuc3Auc2l6ZSh3LCBoKTtcclxuICAgICAgICB0aGlzLnNwLnBpdm90KHcgLyAyLCBoIC8gMik7XHJcbiAgICAgICAgdGhpcy5zcC5wb3MoTGF5YS5zdGFnZS53aWR0aCAvIDIsIExheWEuc3RhZ2UuaGVpZ2h0IC8gMik7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLnNwKTtcclxuXHJcbiAgICAgICAgdGhpcy5zcC5vbihFdmVudC5NT1VTRV9ET1dOLCB0aGlzLCB0aGlzLm9uTW91c2VEb3duKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uTW91c2VEb3duKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHRvdWNoZXM6IEFycmF5PGFueT4gPSBlLnRvdWNoZXM7XHJcblxyXG4gICAgICAgIGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoID09IDIpIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVSYWRpYW4gPSBNYXRoLmF0YW4yKFxyXG4gICAgICAgICAgICAgICAgdG91Y2hlc1swXS5zdGFnZVkgLSB0b3VjaGVzWzFdLnN0YWdlWSxcclxuICAgICAgICAgICAgICAgIHRvdWNoZXNbMF0uc3RhZ2VYIC0gdG91Y2hlc1sxXS5zdGFnZVgpO1xyXG5cclxuICAgICAgICAgICAgTGF5YS5zdGFnZS5vbihFdmVudC5NT1VTRV9NT1ZFLCB0aGlzLCB0aGlzLm9uTW91c2VNb3ZlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbk1vdXNlTW92ZShlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHZhciB0b3VjaGVzOiBBcnJheTxhbnk+ID0gZS50b3VjaGVzO1xyXG4gICAgICAgIGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoID09IDIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbm93UmFkaWFuOiBudW1iZXIgPSBNYXRoLmF0YW4yKFxyXG4gICAgICAgICAgICAgICAgdG91Y2hlc1swXS5zdGFnZVkgLSB0b3VjaGVzWzFdLnN0YWdlWSxcclxuICAgICAgICAgICAgICAgIHRvdWNoZXNbMF0uc3RhZ2VYIC0gdG91Y2hlc1sxXS5zdGFnZVgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zcC5yb3RhdGlvbiArPSAxODAgLyBNYXRoLlBJICogKG5vd1JhZGlhbiAtIHRoaXMucHJlUmFkaWFuKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucHJlUmFkaWFuID0gbm93UmFkaWFuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uTW91c2VVcChlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIExheWEuc3RhZ2Uub2ZmKEV2ZW50Lk1PVVNFX01PVkUsIHRoaXMsIHRoaXMub25Nb3VzZU1vdmUpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBFbnRlckdhbWUoamlhc3U/KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5QbGF5ZXJTY3JpcHQuc3RhcnRSdW4oamlhc3UpO1xyXG4gICAgICAgIHZhciBucGNkaWN0OmFueSA9IFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3Q7XHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiBucGNkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBucGNzY3JpcHQ6TnBjU2NyaXB0ID0gbnBjZGljdFtzXTtcclxuICAgICAgICAgICAgbnBjc2NyaXB0LnN0YXJ0UnVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgQ2xlYXJNb21lbnRDaGFyYWN0ZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFByb3BNYW5hZ2VyLm1haW5Sb2xlICYmIHRoaXMuUGxheWVyU2NyaXB0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIENoYXJhY3RlclBvb2wuQ2xlYXJDaGFyYWN0ZXIoIFByb3BNYW5hZ2VyLm1haW5Sb2xlLHRoaXMuUGxheWVyU2NyaXB0LnJlc291c2VOYW1lLHRoaXMuUGxheWVyU2NyaXB0ICk7XHJcbiAgICAgICAgICAgIHRoaXMuUGxheWVyU2NyaXB0ID0gbnVsbDtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIubWFpblJvbGUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0U2NlbmUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJhY2tncm91bmRQYXJlbnQ6TGF5YS5TcHJpdGUgPSBMYXlvdXRDb250cm9sLkluc3RhbmNlLmJhY2tncm91bmQuZGlzcGxheU9iamVjdDtcclxuICAgICAgICB2YXIgc2NlbmViZzpmYWlyeWd1aS5HQ29tcG9uZW50ID0gZmFpcnlndWkuVUlQYWNrYWdlLmNyZWF0ZU9iamVjdCggXCJtYWluXCIsXCJnYW1iZ1wiICkgYXMgZmFpcnlndWkuR0NvbXBvbmVudDtcclxuICAgICAgICBzY2VuZWJnLnNldFNpemUoZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCwgZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQpO1xyXG4gICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UuYmFja2dyb3VuZC5hZGRDaGlsZCggc2NlbmViZyApO1xyXG4gICAgICAgIC8vIFVpTWFuYWdlci5pbnN0YW5jZS5hZGQoIEdhbWVCZ1ZpZXcsbnVsbCxMYXllck5vdGlmeS5MQVlFUl9CQUNLR1JPVU5EICk7XHJcblxyXG4gICAgICAgIC8v5re75YqgM0TlnLrmma9cclxuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNEID0gYmFja2dyb3VuZFBhcmVudC5hZGRDaGlsZChuZXcgTGF5YS5TY2VuZTNEKCkpIGFzIExheWEuU2NlbmUzRDtcclxuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELnBoeXNpY3NTaW11bGF0aW9uLmNvbnRpbnVvdXNDb2xsaXNpb25EZXRlY3Rpb24gPSB0cnVlO1xyXG5cclxuICAgICAgICAvL+a3u+WKoOeFp+ebuOaculxyXG4gICAgICAgIFByb3BNYW5hZ2VyLmNhcm1hID0gKFByb3BNYW5hZ2VyLnNjZW5lM0QuYWRkQ2hpbGQobmV3IExheWEuQ2FtZXJhKDAsIDAuMSwgNzApKSkgYXMgTGF5YS5DYW1lcmE7XHJcbiAgICAgICAgdGhpcy5jYW1lcmFTY3JpcHQgPSBQcm9wTWFuYWdlci5jYXJtYS5hZGRDb21wb25lbnQoIENhbWVyYU1hbmFnZXIgKTtcclxuXHJcbiAgICAgICAgUHJvcE1hbmFnZXIuY2FybWEuY2xlYXJGbGFnID0gTGF5YS5CYXNlQ2FtZXJhLkNMRUFSRkxBR19ERVBUSE9OTFk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy/mt7vliqDmlrnlkJHlhYlcclxuICAgICAgICB2YXIgZGlyZWN0aW9uTGlnaHQ6IExheWEuRGlyZWN0aW9uTGlnaHQgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNETW9kZWwoXCJEaXJlY3Rpb25hbExpZ2h0XCIpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0Oy8vUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5EaXJlY3Rpb25MaWdodCgpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0O1xyXG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuYWRkQ2hpbGQoIGRpcmVjdGlvbkxpZ2h0ICk7XHJcbiAgICAgICAgLy8gZGlyZWN0aW9uTGlnaHQudHJhbnNmb3JtLndvcmxkTWF0cml4LnNldEZvcndhcmQobmV3IExheWEuVmVjdG9yMygxLCAtMSwgMCkpO1xyXG5cclxuICAgICAgICAvLyB2YXIgZGlyZWN0aW9uTGlnaHQ6IExheWEuRGlyZWN0aW9uTGlnaHQgPSBQcm9wTWFuYWdlci5zY2VuZTNELmFkZENoaWxkKG5ldyBMYXlhLkRpcmVjdGlvbkxpZ2h0KCkpIGFzIExheWEuRGlyZWN0aW9uTGlnaHQ7XHJcbiAgICAgICAgLy8gZGlyZWN0aW9uTGlnaHQuY29sb3IgPSBuZXcgTGF5YS5WZWN0b3IzKDEsMSwxKTtcclxuICAgICAgICAvLyBkaXJlY3Rpb25MaWdodC5pbnRlbnNpdHkgPSAwLjU7XHJcbiAgICAgICAgLy8gZGlyZWN0aW9uTGlnaHQudHJhbnNmb3JtLndvcmxkTWF0cml4LnNldEZvcndhcmQobmV3IExheWEuVmVjdG9yMygxLCAtMSwgMCkpO1xyXG5cclxuICAgICAgICBQcm9wTWFuYWdlci5zdGFydFBsYW5lID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKEFzc2V0UGF0aC5nZXQzRE1vZGVsKFwic3RhcnRwYW5lbFwiKSk7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChQcm9wTWFuYWdlci5zdGFydFBsYW5lKTtcclxuXHJcbiAgICAgICAgUHJvcE1hbmFnZXIuZW5kUGxhbmUgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNETW9kZWwoXCJlbmRwYW5lbFwiKSk7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChQcm9wTWFuYWdlci5lbmRQbGFuZSk7XHJcblxyXG4gICAgICAgIC8vIFByb3BNYW5hZ2VyLmJnc3ByaXRlM2QgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNETW9kZWwoXCJkaXN0YW50dmlld1wiKSk7XHJcbiAgICAgICAgLy8gUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChQcm9wTWFuYWdlci5iZ3Nwcml0ZTNkKTtcclxuXHJcbiAgICAgICAgLy/pm77ljJbku6PnoIFcclxuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmVuYWJsZUZvZyA9IHRydWU7XHJcbiAgICAgICAgLy/orr7nva7pm77ljJbnmoTpopzoibJcclxuICAgICAgICB2YXIgZm9nQXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIEdhbWVDRkcuZGljdFsyXS52YWx1ZSApO1xyXG4gICAgICAgIGlmKCBHYW1lQ0ZHLmRpY3RbOF0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHd1Y29sb3I6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggR2FtZUNGRy5kaWN0WzhdLnZhbHVlICk7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuZm9nQ29sb3IgPSBuZXcgTGF5YS5WZWN0b3IzKE51bWJlcih3dWNvbG9yWzBdKSxOdW1iZXIod3Vjb2xvclsxXSksTnVtYmVyKHd1Y29sb3JbMl0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIuc2NlbmUzRC5mb2dDb2xvciA9IG5ldyBMYXlhLlZlY3RvcjMoMCwwLDAuNik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v6K6+572u6Zu+5YyW55qE6LW35aeL5L2N572u77yM55u45a+55LqO55u45py655qE6Led56a7XHJcbiAgICAgICAgdmFyIHZhbHVlQXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIEdhbWVDRkcuZGljdFszXS52YWx1ZSApO1xyXG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuZm9nU3RhcnQgPSBOdW1iZXIoIHZhbHVlQXJyWzBdICk7XHJcbiAgICAgICAgLy/orr7nva7pm77ljJbmnIDmtZPlpITnmoTot53nprvjgIJcclxuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmZvZ1JhbmdlID0gTnVtYmVyKCB2YWx1ZUFyclsxXSApO1xyXG4gICAgICAgIHRoaXMuU2hvd1RoZUdhbWVTY2VuZSgpO1xyXG4gICAgICAgIHRoaXMuTGlzdGVuT25FdmVudCgpO1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKirmuIXpmaTmiYDmnIlOUEMgKi9cclxuICAgIHByaXZhdGUgQ2xlYXJOcGMoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gUHJvcE1hbmFnZXIubnBjRGljdDtcclxuICAgICAgICB2YXIgcztcclxuICAgICAgICBmb3IoIHMgaW4gbnBjZGljdCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc3A6TGF5YS5NZXNoU3ByaXRlM0QgPSBucGNkaWN0W3NdO1xyXG4gICAgICAgICAgICB2YXIgbnBjc2NyaXB0Ok5wY1NjcmlwdCA9IFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3Rbc107XHJcbiAgICAgICAgICAgIHZhciByZXNvdXNlbmFtZTpzdHJpbmcgPSBucGNzY3JpcHQucmVzb3VzZU5hbWU7XHJcbiAgICAgICAgICAgIENoYXJhY3RlclBvb2wuQ2xlYXJDaGFyYWN0ZXIoIHNwLHJlc291c2VuYW1lLG5wY3NjcmlwdCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBQcm9wTWFuYWdlci5ucGNzY3JpcHREaWN0W3NdO1xyXG4gICAgICAgICAgICBkZWxldGUgbnBjZGljdFtzXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBQYXR0ZXJuKCBtYXBTcHJpdGUzRDpMYXlhLlNwcml0ZTNEICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiUGF0dGVybjEtLS0tXCIpO1xyXG4gICAgICAgIGlmKCBQcm9wTWFuYWdlci5wYXR0ZXJuRGljdFsgbWFwU3ByaXRlM0QubmFtZSBdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBQcm9wTWFuYWdlci5wYXR0ZXJuRGljdFsgbWFwU3ByaXRlM0QubmFtZSBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgQmxvY2tzU3ByaXRlOkxheWEuU3ByaXRlM0QgPSBtYXBTcHJpdGUzRC5nZXRDaGlsZEJ5TmFtZSggXCJCbG9ja3NcIiApIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIGNoaWRkaWN0OmFueSA9IHt9O1xyXG4gICAgICAgIHZhciBjaGlkc3A6TGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB2YXIgYnVpbGRTcDpMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2FsbF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9hbGxfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2FsbF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udF9cIiArIGluZGV4ICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRzcCA9IGJ1aWxkU3AuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZGRpY3RbIFwiYnVpbGRfZnJvbnRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfbGVmdF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9sZWZ0X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9sZWZ0X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX3JpZ2h0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX3JpZ2h0X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9yaWdodF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udGxlZnRfXCIgKyBpbmRleCApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1aWxkU3AgPSBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRsZWZ0X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9mcm9udGxlZnRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRyaWdodF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udHJpZ2h0X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9mcm9udHJpZ2h0X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2xlZnRyaWdodF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9sZWZ0cmlnaHRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2xlZnRyaWdodF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleD0wO1xyXG4gICAgICAgIHZhciBQcm9wczpMYXlhLlNwcml0ZTNEID0gbWFwU3ByaXRlM0QuZ2V0Q2hpbGRCeU5hbWUoIFwiUHJvcHNcIiApIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgd2hpbGUoIFByb3BzLmdldENoaWxkQnlOYW1lKCBcIlNjYWZmb2xkaW5nX1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBQcm9wcy5nZXRDaGlsZEJ5TmFtZSggXCJTY2FmZm9sZGluZ19cIiArIGluZGV4ICkuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZGRpY3RbIFwiU2NhZmZvbGRpbmdfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXg9MDtcclxuICAgICAgICB3aGlsZSggUHJvcHMuZ2V0Q2hpbGRCeU5hbWUoIFwiZ3JpbGxpbmdfXCIgKyBpbmRleCApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWRzcCA9IFByb3BzLmdldENoaWxkQnlOYW1lKCBcImdyaWxsaW5nX1wiICsgaW5kZXggKS5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJncmlsbGluZ19cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgdmFyIGp1bXBjaGlsZFNwOkxheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBpc2NyZWF0ZWp0OmJvb2xlYW4gPSAoUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlKS5Sb2xlRGF0YS5MZXZlbElEIDwgMyA/IHRydWU6ZmFsc2U7XHJcbiAgICAgICAgd2hpbGUoIFByb3BzLmdldENoaWxkQnlOYW1lKCBcIkp1bXBCb29zdF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAganVtcGNoaWxkU3AgPSBQcm9wcy5nZXRDaGlsZEJ5TmFtZSggXCJKdW1wQm9vc3RfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBpZiggaXNjcmVhdGVqdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBwb3M6TGF5YS5WZWN0b3IzID0ganVtcGNoaWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICBwb3MueSArPSAzO1xyXG4gICAgICAgICAgICAgICAgdmFyIGppYW50b3U6TGF5YS5NZXNoU3ByaXRlM0QgPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKCBMYXlhLmxvYWRlci5nZXRSZXMoIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggXCJBcnJvd1wiICkgKSxQcm9wTWFuYWdlci5zY2VuZTNELGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcG9zICApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuamlhbnRvdUFyci5wdXNoKCBqaWFudG91ICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgUHJvcE1hbmFnZXIucGF0dGVybkRpY3RbIG1hcFNwcml0ZTNELm5hbWUgXSA9IGNoaWRkaWN0O1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIlBhdHRlcm4yLS0tLVwiKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIG9uU3ByaXRlQ2xpY2soZTogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB2YXIgcmFuZG9tQW5nbGU6IG51bWJlciA9IE1hdGgucmFuZG9tKCkgKiAxODA7XHJcbiAgICAgICAgLy/lj5HpgIHoh6rlrprkuYnkuovku7ZcclxuICAgICAgICAvLyB0aGlzLnNwLmV2ZW50KEludGVyYWN0aW9uX0N1c3RvbUV2ZW50LlJPVEFURSwgW3JhbmRvbUFuZ2xlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6Kem5Y+R6Ieq5a6a5LmJ55qEcm90YXRl5LqL5Lu2XHJcbiAgICBwcml2YXRlIG9uUm90YXRlKG5ld0FuZ2xlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgIExheWEuVHdlZW4udG8odGhpcy5zcCwgeyBcInJvdGF0aW9uXCI6IG5ld0FuZ2xlIH0sIDEwMDAsTGF5YS5FYXNlLmVsYXN0aWNPdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLyBcclxuXHJcbiAgICBwcml2YXRlIFJlZnJlc2hDaGFyYWN0ZXJNb2RlbCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgYWdlbmN5dXNlcm1lc3NhZ2U6QWdlbmN5VXNlck1lc3NhZ2UgPSBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oIEFnZW5jeVVzZXJNZXNzYWdlICk7XHJcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGE7XHJcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHBhdGhBcnIucHVzaCgge3VybDpBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoIFJvbGVEYXRhLnJvbGVDZmcubmFtZSApIH0gKTtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLkNoYXJhY3RlckxvYWRFbmQsbnVsbCx0cnVlLEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBSb2xlRGF0YS5yb2xlQ2ZnLm5hbWUgKSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKirmm7TmlrDlnLDlvaIgKi9cclxuICAgIHB1YmxpYyBSZWZyZXNoVGVycmFpbiggICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcclxuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSBhZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcclxuICAgICAgICB2YXIgbm93bGV2ZWxjZmc6TGV2ZWxDRkcgPSBSb2xlRGF0YS5sZXZlbGNmZztcclxuICAgICAgICB2YXIgbWFwQXJyOkFycmF5PHN0cmluZz4gPSBSb2xlRGF0YS5sZXZlbG1hcEFycjtcclxuICAgICAgICB2YXIgbWFwU3ByaXRlM0Q6TGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB2YXIgbWFwbmFtZTpzdHJpbmc7XHJcbiAgICAgICAgdmFyIF9sYXN0bWFwU3ByaXRlM0Q6TGF5YS5TcHJpdGUzRDtcclxuXHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiBQcm9wTWFuYWdlci5ub3dtYXBEaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIChQcm9wTWFuYWdlci5ub3dtYXBEaWN0W3NdIGFzIExheWEuTWVzaFNwcml0ZTNEKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciggdmFyIGk6bnVtYmVyID0gMDtpIDwgbWFwQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbWFwbmFtZSA9IG1hcEFycltpXTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJtYXBuYW1lMS0tLS1cIixtYXBuYW1lKTtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLm5vd21hcERpY3RbIG1hcG5hbWUgXSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG1hcFNwcml0ZTNEID0gUHJvcE1hbmFnZXIubm93bWFwRGljdFsgbWFwbmFtZSBdO1xyXG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWFwbmFtZTItLS0tXCIsbWFwbmFtZSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhBc3NldFBhdGguZ2V0M0RNb2RlbChtYXBuYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWFwbmFtZTMtLS0tXCIsbWFwbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBtYXBTcHJpdGUzRCA9IExheWEuU3ByaXRlM0QuaW5zdGFudGlhdGUoc3AsIFByb3BNYW5hZ2VyLnNjZW5lM0QsIGZhbHNlLG51bGwpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm1hcG5hbWU0LS0tLVwiLG1hcG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIubm93bWFwRGljdFsgbWFwbmFtZSBdID0gbWFwU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm1hcG5hbWU1LS0tLVwiLG1hcG5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCBpID09IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIG5vd2xldmVsY2ZnLmZpcnN0U2NlbmVwb3MgKTtcclxuICAgICAgICAgICAgICAgIG1hcFNwcml0ZTNELnRyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIE51bWJlciggYXJyWzBdKSxOdW1iZXIoIGFyclsxXSksTnVtYmVyKCBhcnJbMl0gKSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVuZFBvczpMYXlhLlZlY3RvcjMgPSAoX2xhc3RtYXBTcHJpdGUzRC5nZXRDaGlsZEJ5TmFtZSggXCJFTkRcIiApIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5wb3NpdGlvbi5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgZW5kUG9zLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgZW5kUG9zLnkgPSAwO1xyXG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QudHJhbnNmb3JtLnBvc2l0aW9uID0gZW5kUG9zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuUGF0dGVybiggbWFwU3ByaXRlM0QgKTtcclxuICAgICAgICAgICAgX2xhc3RtYXBTcHJpdGUzRCA9IG1hcFNwcml0ZTNEO1xyXG4gICAgICAgICAgICB2YXIgZW5kUG9zMTpMYXlhLlZlY3RvcjMgPSAobWFwU3ByaXRlM0QuZ2V0Q2hpbGRCeU5hbWUoIFwiRU5EXCIgKSBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm0ucG9zaXRpb24uY2xvbmUoKTtcclxuICAgICAgICAgICAgZW5kUG9zMS56ICs9IE51bWJlcihHYW1lQ0ZHLmRpY3RbNl0udmFsdWUpO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5lbmRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24gPSBlbmRQb3MxO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5nYW1ld2luUG9zWiA9IGVuZFBvczEuejtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIuZ2FtZXdpblBvc1ogLT0gMjtcclxuICAgICAgICAgICAgLy8gUHJvcE1hbmFnZXIuYmdzcHJpdGUzZC50cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCAwLC0yMCwtNDAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICBcclxuXHJcblxyXG59IiwiaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRFdmVudERhdGFcclxue1xyXG4gICAgc3RhdGljIFJlc0RpY1ZhbHVlOnN0cmluZyA9IFwiQ29tcG9uZW50RXZlbnREYXRhXCI7XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBsb2dnZXI6IFRleHQ7XHJcbiAgICBwcml2YXRlIGtleURvd25MaXN0OiBBcnJheTxib29sZWFuPjtcclxuXHJcblxyXG4gICAgdGFyZ2V0OmFueTtcclxuICAgIHR5cGU6c3RyaW5nO1xyXG4gICAgdGhpc09iamVjdDphbnk7XHJcbiAgICBsaXN0ZW5lcjpGdW5jdGlvbjtcclxuXHJcbiAgICBwcml2YXRlIGxpc3RlbktleWJvYXJkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMua2V5RG93bkxpc3QgPSBbXTtcclxuXHJcbiAgICAgICAgLy/mt7vliqDplK7nm5jmjInkuIvkuovku7Ys5LiA55u05oyJ552A5p+Q5oyJ6ZSu5YiZ5Lya5LiN5pat6Kem5Y+RXHJcbiAgICAgICAgTGF5YS5zdGFnZS5vbihMYXlhLkV2ZW50LktFWV9ET1dOLCB0aGlzLCB0aGlzLm9uS2V5RG93bik7XHJcbiAgICAgICAgLy/mt7vliqDplK7nm5jmiqzotbfkuovku7ZcclxuICAgICAgICBMYXlhLnN0YWdlLm9uKExheWEuRXZlbnQuS0VZX1VQLCB0aGlzLCB0aGlzLm9uS2V5VXApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKumUruebmOaMieS4i+WkhOeQhiovXHJcbiAgICBwcml2YXRlIG9uS2V5RG93bihlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBrZXlDb2RlOiBudW1iZXIgPSBlW1wia2V5Q29kZVwiXTtcclxuICAgICAgICB0aGlzLmtleURvd25MaXN0W2tleUNvZGVdID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIHB1YmxpYyBjbGVhcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50eXBlPW51bGw7XHJcbiAgICAgICAgdGhpcy50aGlzT2JqZWN0PW51bGw7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcj1udWxsO1xyXG4gICAgICAgIEdhbWVQb29sLlJlbW92ZUl0ZW0oIENvbXBvbmVudEV2ZW50RGF0YS5SZXNEaWNWYWx1ZSx0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq6ZSu55uY5oqs6LW35aSE55CGKi9cclxuICAgIHByaXZhdGUgb25LZXlVcChlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmtleURvd25MaXN0W2VbXCJrZXlDb2RlXCJdXTtcclxuICAgIH1cclxuXHJcbn0iLCJcclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgRGF0YUluZm9CYXNlIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioq5re35reGKioqKioqKioqICovXHJcbiAgICBzaG93QXBlKCkge1xyXG5cdFx0Y29uc3QgXHJcblx0XHRcdG1vbmtleTFQYXRoID0gXCIuL3Jlcy9hcGVzL21vbmtleTEucG5nXCIsXHJcblx0XHRcdG1vbmtleTJQYXRoID0gXCIuL3Jlcy9hcGVzL21vbmtleTIucG5nXCI7XHJcblxyXG5cdFx0Ly8g5pa55rOVMe+8muS9v+eUqGxvYWRJbWFnZVxyXG5cdFx0bGV0IGFwZSA9IG5ldyBMYXlhLlNwcml0ZSgpO1xyXG5cdFx0TGF5YS5zdGFnZS5hZGRDaGlsZChhcGUpO1xyXG5cdFx0YXBlLmxvYWRJbWFnZShtb25rZXkxUGF0aCk7XHJcblxyXG5cdFx0Ly8g5pa55rOVMu+8muS9v+eUqGRyYXdUZXh0dXJlXHJcblx0XHRMYXlhLmxvYWRlci5sb2FkKG1vbmtleTJQYXRoLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRsZXQgbW9ua2V5MiA9IExheWEubG9hZGVyLmdldFJlcyhtb25rZXkyUGF0aCk7XHJcblx0XHRcdGxldCBhcGUyID0gbmV3IExheWEuU3ByaXRlKCk7XHJcblx0XHRcdExheWEuc3RhZ2UuYWRkQ2hpbGQoYXBlMik7XHJcblx0XHRcdGFwZTIuZ3JhcGhpY3MuZHJhd1RleHR1cmUobW9ua2V5MiwgMTAwLCAwKTtcclxuXHRcdH0pKTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgXHJcblxyXG4gICAgcHVibGljIERhdGFJbmZvKCBkYXRhOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggZGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IoIHZhciBzIGluIGRhdGEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbWQ6YW55ID0gdGhpc1tzXTtcclxuICAgICAgICAgICAgICAgIGlmKCBpdGVtZCAhPSBudWxsICkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzXSA9IGRhdGFbc107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgRGVidWdlci5sb2coIFwiVk865pyq5a6a5LmJ5bGe5oCnLVwiICsgcyApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKirmt7fmt4YgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQnV0dG9uKHNraW46IHN0cmluZyxuYW1lOnN0cmluZyxjYjpGdW5jdGlvbixpbmRleDpudW1iZXIpOkxheWEuQnV0dG9uIHtcclxuICAgICAgICB2YXIgYnRuOkxheWEuQnV0dG9uID0gbmV3IExheWEuQnV0dG9uKHNraW4sbmFtZSk7XHJcbiAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGJ0bik7XHJcbiAgICAgICAgYnRuLm9uKExheWEuRXZlbnQuQ0xJQ0ssdGhpcyxjYik7XHJcbiAgICAgICAgYnRuLnNpemUoMTQ3LDU1KTtcclxuICAgICAgICBidG4ubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgYnRuLnJpZ2h0ID0gMTA7XHJcbiAgICAgICAgYnRuLnRvcCA9IGluZGV4ICogKGJ0bi5oZWlnaHQgKyAxMCk7XHJcblx0XHRyZXR1cm4gYnRuO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQodHlwZTogc3RyaW5nLCBkYXRhPzogYW55KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ldmVudCh0eXBlLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIFxyXG59IiwiaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuaW1wb3J0IFNwcml0ZSA9IExheWEuU3ByaXRlO1xyXG5pbXBvcnQgRXZlbnQgPSBMYXlhLkV2ZW50O1xyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBMb2NhbERhdGEgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57ICAgXHJcbiAgICBzdGF0aWMgUmVzRGljVmFsdWU6c3RyaW5nID0gXCJMb2NhbERhdGFcIjtcclxuXHJcbiAgICBwcml2YXRlIGxvZ2dlcjpMYXlhLlRleHQ7XHJcbiAgICAvKipcclxuICAgICAqIOW8leeUqOasoeaVsFxyXG4gICAgICovXHJcbiAgICByZWY6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNvcmFsUmVjdCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgY29yYWxSZWN0OiBTcHJpdGUgPSBuZXcgU3ByaXRlKCk7XHJcbiAgICAgICAgY29yYWxSZWN0LmdyYXBoaWNzLmRyYXdSZWN0KDAsIDAsIExheWEuc3RhZ2Uud2lkdGgsIExheWEuc3RhZ2UuaGVpZ2h0IC8gMiwgXCIjRkY3RjUwXCIpO1xyXG5cclxuICAgICAgICAvL+iuvue9ruWQjeensFxyXG4gICAgICAgIGNvcmFsUmVjdC5uYW1lID0gXCLnj4rnkZroibLlrrnlmahcIjtcclxuICAgICAgICBjb3JhbFJlY3Quc2l6ZShMYXlhLnN0YWdlLndpZHRoLCBMYXlhLnN0YWdlLmhlaWdodCAvIDIpO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoY29yYWxSZWN0KTtcclxuXHJcbiAgICAgICAgY29yYWxSZWN0Lm9uKEV2ZW50Lk1PVVNFX0RPV04sIHRoaXMsIHRoaXMub25Eb3duKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZURlZXBTa3libHVlUmVjdCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgZGVlcFNreWJsdWVSZWN0OiBTcHJpdGUgPSBuZXcgU3ByaXRlKCk7XHJcbiAgICAgICAgZGVlcFNreWJsdWVSZWN0LmdyYXBoaWNzLmRyYXdSZWN0KDAsIDAsIDEwMCwgMTAwLCBcIiMwMEJGRkZcIik7XHJcbiAgICAgICAgLy/orr7nva7lkI3np7BcclxuICAgICAgICBkZWVwU2t5Ymx1ZVJlY3QubmFtZSA9IFwi5aSp6JOd6Imy55+p5b2iXCI7XHJcbiAgICAgICAgLy/orr7nva7lrr3pq5jvvIjopoHmjqXmlLbpvKDmoIfkuovku7blv4Xpobvorr7nva7lrr3pq5jvvIzlkKbliJnkuI3kvJrooqvlkb3kuK3vvIkgIFxyXG4gICAgICAgIGRlZXBTa3libHVlUmVjdC5zaXplKDEwMCwgMTAwKTtcclxuICAgICAgICBkZWVwU2t5Ymx1ZVJlY3QucG9zKDEwLCAxMCk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChkZWVwU2t5Ymx1ZVJlY3QpO1xyXG5cclxuICAgICAgICBkZWVwU2t5Ymx1ZVJlY3Qub24oRXZlbnQuTU9VU0VfRE9XTiwgdGhpcywgdGhpcy5vbkRvd24pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOacgOWQjuS4gOasoeiiq+W8leeUqOeahOaXtumXtFxyXG4gICAgICovXHJcbiAgICB0aW1lOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDljIXlkI1cclxuICAgICAqL1xyXG4gICAgcGFja2FnZU5hbWU6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgY2xlYXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZWYgPSAwO1xyXG4gICAgICAgIHRoaXMudGltZSA9IDA7XHJcbiAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IFwiXCI7XHJcbiAgICAgICAgR2FtZVBvb2wuUmVtb3ZlSXRlbSggTG9jYWxEYXRhLlJlc0RpY1ZhbHVlLHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKirkvqblkKzlpITnkIbmlrnms5UqL1xyXG5cdFx0cHJpdmF0ZSBvbkRvd24oZTogRXZlbnQpOiB2b2lkIHtcclxuXHRcdFx0dGhpcy5sb2dnZXIudGV4dCArPSBcIueCueWHuyAtIFwiICsgZS50YXJnZXQubmFtZSArIFwiXFxuXCI7XHJcblx0XHR9XHJcbn0iLCJpbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xyXG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcclxuaW1wb3J0IHtMb2NhbERhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9Mb2NhbERhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7VXNlckRhdGFJbmZvfSBmcm9tIFwiLi4vRGF0YS9Vc2VyRGF0YUluZm9cIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCBMZXZlbENGRyBmcm9tIFwiLi4vQ0ZHL0xldmVsQ0ZHXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBEYXRhSW5mb0Jhc2UgfSBmcm9tIFwiLi9EYXRhSW5mb0Jhc2VcIjtcclxuXHJcblxyXG5pbXBvcnQgRXZlbnREYXRhID0gTGF5YS5FdmVudERhdGE7XHJcblx0aW1wb3J0IFNrZWxldG9uICA9IExheWEuU2tlbGV0b247XHJcblx0aW1wb3J0IFRlbXBsZXQgICA9IExheWEuVGVtcGxldDtcclxuXHRpbXBvcnQgU3ByaXRlICAgID0gTGF5YS5TcHJpdGU7XHJcblx0aW1wb3J0IEV2ZW50ICAgICA9IExheWEuRXZlbnQ7XHJcblx0aW1wb3J0IEJyb3dzZXIgICA9IExheWEuQnJvd3NlcjtcclxuXHRpbXBvcnQgSGFuZGxlciAgID0gTGF5YS5IYW5kbGVyO1xyXG5cdGltcG9ydCBTdGF0ICAgICAgPSBMYXlhLlN0YXQ7XHJcblx0aW1wb3J0IFR3ZWVuICAgICA9IExheWEuVHdlZW47XHJcbiAgICBpbXBvcnQgV2ViR0wgICAgID0gTGF5YS5XZWJHTDtcclxuICAgIFxyXG5leHBvcnQgY2xhc3MgUm9sZURhdGEgZXh0ZW5kcyBEYXRhSW5mb0Jhc2UgXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIGluczpSb2xlRGF0YTtcclxuICAgIC8qKlxyXG4gICAgICog6YeR5biBXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX0dvbGQ6bnVtYmVyPTA7XHJcblxyXG4gICAgcHJpdmF0ZSBfcm9sZWlkOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgcm9sZUNmZzpSb2xlQ0ZHO1xyXG5cclxuICAgIHByaXZhdGUgX2xldmVpZDpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGxldmVsY2ZnOkxldmVsQ0ZHO1xyXG4gICAgcHVibGljIGxldmVsbWFwQXJyOkFycmF5PHN0cmluZz47XHJcblxyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlcigpOyBcclxuICAgICAgICBSb2xlRGF0YS5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFJvbGVEYXRhIHtcclxuICAgICAgICBpZiAoUm9sZURhdGEuaW5zID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSb2xlRGF0YSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUm9sZURhdGEuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGxldCBsb2NhbGRhdGFjb250cm9sOkxvY2FsRGF0YUNvbnRyb2wgPSBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlO1xyXG4gICAgICAgIC8vIHZhciBub3dHb2xkOm51bWJlciA9IE51bWJlcihQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkdldFVzZXIoQWNjb3VudFVzZXIubW9uZXkpKTtcclxuICAgICAgICAvLyB0aGlzLkdvbGQgPSBub3dHb2xkO1xyXG4gICAgICAgIHRoaXMuTW9uZXkgPSBsb2NhbGRhdGFjb250cm9sLmdldG51bSggVXNlckRhdGFJbmZvLmdvbGQgKTtcclxuICAgICAgICB0aGlzLl9yb2xlaWQgPSBsb2NhbGRhdGFjb250cm9sLmdldG51bSggVXNlckRhdGFJbmZvLnJvbGVpZCApO1xyXG4gICAgICAgIGlmKCB0aGlzLkNoYXJhY3RlcklEID09IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5DaGFyYWN0ZXJJRCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuSW5pdENoYXJhY3RlckluZm8oKTtcclxuICAgICAgICB9XHJcbiAgICAgICBcclxuICAgICAgICB0aGlzLl9sZXZlaWQgPSBsb2NhbGRhdGFjb250cm9sLmdldG51bSggVXNlckRhdGFJbmZvLmxldmVsaWQgKTtcclxuICAgICAgICBpZiggdGhpcy5fbGV2ZWlkID09IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbGV2ZWlkID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5SZWZyZXNoTGV2ZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG5vd2xldmVsKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xldmVpZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm93U2VydmVyTGV2ZWwoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWlkO1xyXG4gICAgfVxyXG5cclxuICAgIExldmVsVXAoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbGV2ZWlkKys7XHJcbiAgICAgICAgTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5hZGRzdHIoIFVzZXJEYXRhSW5mby5sZXZlbGlkLHRoaXMuX2xldmVpZC50b1N0cmluZygpICk7XHJcbiAgICAgICAgdGhpcy5SZWZyZXNoTGV2ZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHB1YmxpYyBzdGFydEZ1bigpOnZvaWRcclxuXHRcdHtcclxuXHRcdFx0dGhpcy5tQW5pUGF0aCA9IFwicmVzL3NwaW5lL3NwaW5lUmVzNi9hbGllbi5za1wiO1xyXG5cdFx0XHR0aGlzLm1GYWN0b3J5ID0gbmV3IFRlbXBsZXQoKTtcclxuXHRcdFx0dGhpcy5tRmFjdG9yeS5vbihFdmVudC5DT01QTEVURSwgdGhpcywgdGhpcy5wYXJzZUNvbXBsZXRlKTtcclxuXHRcdFx0dGhpcy5tRmFjdG9yeS5vbihFdmVudC5FUlJPUiwgdGhpcywgdGhpcy5vbkVycm9yKTtcclxuXHRcdFx0dGhpcy5tRmFjdG9yeS5sb2FkQW5pKHRoaXMubUFuaVBhdGgpO1xyXG5cdFx0fVxyXG5cdFx0cHJpdmF0ZSBvbkVycm9yKCk6dm9pZFxyXG5cdFx0e1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcImVycm9yXCIpO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRwcml2YXRlIHBhcnNlQ29tcGxldGUoKTp2b2lkIHtcclxuXHRcdFx0Ly/liJvlu7rmqKHlvI/kuLox77yM5Y+v5Lul5ZCv55So5o2i6KOFXHJcblx0XHRcdHRoaXMubUFybWF0dXJlID0gdGhpcy5tRmFjdG9yeS5idWlsZEFybWF0dXJlKDEpO1xyXG5cdFx0XHR0aGlzLm1Bcm1hdHVyZS54ID0gdGhpcy5tU3RhcnRYO1xyXG5cdFx0XHR0aGlzLm1Bcm1hdHVyZS55ID0gdGhpcy5tU3RhcnRZO1xyXG5cdFx0XHR0aGlzLm1Bcm1hdHVyZS5zY2FsZSgwLjUsIDAuNSk7XHJcblx0XHRcdExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5tQXJtYXR1cmUpO1xyXG5cdFx0XHR0aGlzLm1Bcm1hdHVyZS5vbihFdmVudC5MQUJFTCwgdGhpcywgdGhpcy5vbkV2ZW50KTtcclxuXHRcdFx0dGhpcy5wbGF5KCk7XHJcbiAgICAgICAgfVxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwcml2YXRlIFJlZnJlc2hMZXZlbCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbHYgPSB0aGlzLl9sZXZlaWQ7XHJcbiAgICAgICAgdmFyIG5vd2NmZ2x2Om51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGFsbG51bXM6bnVtYmVyID0gTGV2ZWxDRkcudmVjLmxlbmd0aDtcclxuICAgICAgICBpZiggbHYgPiBhbGxudW1zIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZTpudW1iZXIgPSAobHYtYWxsbnVtcyklKCBhbGxudW1zLTIgKTtcclxuICAgICAgICAgICAgaWYoICB2YWx1ZSA9PSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbm93Y2ZnbHYgPSBhbGxudW1zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbm93Y2ZnbHYgPSB2YWx1ZSArIDI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbm93Y2ZnbHYgPSBsdjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sZXZlbGNmZyA9IExldmVsQ0ZHLmRpY3RbIG5vd2NmZ2x2IF07XHJcbiAgICAgICAgdGhpcy5sZXZlbG1hcEFyciA9IEdhbWVVdGlscy5jdXRzdHJ0b0Fycih0aGlzLmxldmVsY2ZnLnJvYWQpO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFVzZXJJbmZvRXZlbnQudXNlcmluZm9FdmVudF9sZXZlbGlkICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgICAgIHByaXZhdGUgbUFuaVBhdGg6c3RyaW5nO1xyXG5cdFx0cHJpdmF0ZSBtU3RhcnRYOm51bWJlciA9IDQwMDtcclxuXHRcdHByaXZhdGUgbVN0YXJ0WTpudW1iZXIgPSA1MDA7XHJcblx0XHRwcml2YXRlIG1GYWN0b3J5OlRlbXBsZXQ7XHJcblx0XHRwcml2YXRlIG1BY3Rpb25JbmRleDpudW1iZXIgPSAwO1xyXG5cdFx0cHJpdmF0ZSBtQ3VyckluZGV4Om51bWJlciA9IDA7XHJcblx0XHRwcml2YXRlIG1Bcm1hdHVyZTpTa2VsZXRvbjtcclxuXHRcdHByaXZhdGUgbUN1cnJTa2luSW5kZXg6bnVtYmVyID0gMDtcclxuXHRcdHByaXZhdGUgbUZhY3RvcnkyOlRlbXBsZXQ7XHJcblx0XHRwcml2YXRlIG1MYWJlbFNwcml0ZTpTcHJpdGU7XHJcblxyXG4gICAgcHJpdmF0ZSBwbGF5KCk6dm9pZFxyXG5cdFx0e1xyXG5cdFx0XHR0aGlzLm1DdXJySW5kZXgrKztcclxuXHRcdFx0aWYgKHRoaXMubUN1cnJJbmRleCA+PSB0aGlzLm1Bcm1hdHVyZS5nZXRBbmltTnVtKCkpXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0aGlzLm1DdXJySW5kZXggPSAwO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMubUFybWF0dXJlLnBsYXkodGhpcy5tQ3VyckluZGV4LGZhbHNlKTtcclxuXHRcdFx0XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdHByaXZhdGUgb25FdmVudChlKTp2b2lkXHJcblx0XHR7XHJcblx0XHRcdExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5tTGFiZWxTcHJpdGUpO1xyXG5cdFx0XHR0aGlzLm1MYWJlbFNwcml0ZS54ID0gdGhpcy5tU3RhcnRYO1xyXG5cdFx0XHR0aGlzLm1MYWJlbFNwcml0ZS55ID0gdGhpcy5tU3RhcnRZO1xyXG5cdFx0XHR0aGlzLm1MYWJlbFNwcml0ZS5ncmFwaGljcy5jbGVhcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcblxyXG4gICAgbW92ZXNwZWVkOm51bWJlciA9IDA7XHJcbiAgICBmcm9udGp1bXA6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIGxlZnRqdW1wOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICByaWdodGp1bXA6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHVwY2xpbWI6bnVtYmVyID0gMDtcclxuICAgIHNsaWRlY2xpbWI6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUgSW5pdENoYXJhY3RlckluZm8oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yb2xlQ2ZnID0gUm9sZUNGRy5kaWN0WyB0aGlzLl9yb2xlaWQgXTtcclxuICAgICAgICB0aGlzLm1vdmVzcGVlZCA9IHRoaXMucm9sZUNmZy5zcGVlZDtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmZyb250anVtcCA9IHRoaXMucm9sZUNmZy5mcm9udGp1bXA7XHJcbiAgICAgICAgdGhpcy5sZWZ0anVtcCA9IHRoaXMucm9sZUNmZy5sZWZ0anVtcDtcclxuICAgICAgICB0aGlzLnJpZ2h0anVtcCA9IHRoaXMucm9sZUNmZy5yaWdodGp1bXA7XHJcbiAgICAgICAgdGhpcy51cGNsaW1iID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcudXBjbGltYiApO1xyXG4gICAgICAgIHRoaXMuc2xpZGVjbGltYiA9IHRoaXMucm9sZUNmZy5zbGlkZWNsaW1iO1xyXG5cclxuICAgICAgICAvLyB0aGlzLmZyb250anVtcC54ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuZnJvbnRqdW1wLnggKTtcclxuICAgICAgICAvLyB0aGlzLmZyb250anVtcC55ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuZnJvbnRqdW1wLnkgKTtcclxuICAgICAgICAvLyB0aGlzLmZyb250anVtcC56ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuZnJvbnRqdW1wLnogKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyB0aGlzLmxlZnRqdW1wLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5sZWZ0anVtcC54ICk7XHJcbiAgICAgICAgLy8gdGhpcy5sZWZ0anVtcC55ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcubGVmdGp1bXAueSApO1xyXG4gICAgICAgIC8vIHRoaXMubGVmdGp1bXAueiA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLmxlZnRqdW1wLnogKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyB0aGlzLnJpZ2h0anVtcC54ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcucmlnaHRqdW1wLnggKTtcclxuICAgICAgICAvLyB0aGlzLnJpZ2h0anVtcC55ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcucmlnaHRqdW1wLnkgKTtcclxuICAgICAgICAvLyB0aGlzLnJpZ2h0anVtcC56ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcucmlnaHRqdW1wLnogKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5zbGlkZWNsaW1iLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5zbGlkZWNsaW1iLnggKTtcclxuICAgICAgICAvLyB0aGlzLnNsaWRlY2xpbWIueSA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnNsaWRlY2xpbWIueSApO1xyXG4gICAgICAgIC8vIHRoaXMuc2xpZGVjbGltYi56ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuc2xpZGVjbGltYi56ICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHNldCBsZXZlaWQoIHZhbHVlOm51bWJlciApXHJcbiAgICAvLyB7XHJcbiAgICAvLyAgICAgaWYoIHRoaXMuX2xldmVpZCAhPSB2YWx1ZSApXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgICB0aGlzLl9sZXZlaWQgPSB2YWx1ZTtcclxuICAgIC8vICAgICAgICAgdGhpcy5sZXZlbGNmZyA9IExldmVsQ0ZHLmRpY3RbIHRoaXMuX2xldmVpZCBdO1xyXG4gICAgLy8gICAgICAgICB0aGlzLmxldmVsbWFwQXJyID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKHRoaXMubGV2ZWxjZmcucm9hZCk7XHJcbiAgICAvLyAgICAgICAgIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZHN0ciggVXNlckRhdGFJbmZvLmxldmVsaWQsdGhpcy5fbGV2ZWlkLnRvU3RyaW5nKCkgKTtcclxuICAgIC8vICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZCApO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IExldmVsSUQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgQ2hhcmFjdGVySUQoIHZhbHVlOm51bWJlciApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX3JvbGVpZCAhPSB2YWx1ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlaWQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5Jbml0Q2hhcmFjdGVySW5mbygpO1xyXG4gICAgICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLnJvbGVpZCx0aGlzLl9yb2xlaWQudG9TdHJpbmcoKSApO1xyXG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgQ2hhcmFjdGVySUQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcm9sZWlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgTW9uZXkoIHZhbHVlOm51bWJlciApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX0dvbGQgIT0gdmFsdWUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fR29sZCA9IHZhbHVlO1xyXG4gICAgICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLmdvbGQsdGhpcy5fR29sZC50b1N0cmluZygpICk7XHJcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFVzZXJJbmZvRXZlbnQuVXNlckluZm9FdmVudF91cGRhdGVVc2VyRGF0YSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IE1vbmV5KCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX0dvbGQ7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2tpbkRhdGFcclxue1xyXG4gICAgcm9sZUNGRzpSb2xlQ0ZHO1xyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacquaLpeacie+8jDHvvJrlt7Lnu4/mi6XmnIlcclxuICAgICAqL1xyXG4gICAgc3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBoYXNudW06bnVtYmVyID0gMDtcclxuICAgIFxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgY3JlYXRlVGV4dCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgdHh0OkxheWEuVGV4dCA9IG5ldyBMYXlhLlRleHQoKTtcclxuXHJcbiAgICAgICAgdHh0LnRleHQgPSBcIkxheWFib3jmmK9IVE1MNeW8leaTjuaKgOacr+aPkOS+m+WVhuS4juS8mOengOeahOa4uOaIj+WPkeihjOWVhu+8jOmdouWQkUFTL0pTL1RT5byA5Y+R6ICF5o+Q5L6bSFRNTDXlvIDlj5HmioDmnK/mlrnmoYjvvIFcIjtcclxuXHJcbiAgICAgICAgdHh0LndpZHRoID0gMzAwO1xyXG5cclxuICAgICAgICB0eHQuZm9udFNpemUgPSA0MDtcclxuICAgICAgICB0eHQuY29sb3IgPSBcIiNmZmZmZmZcIjtcclxuXHJcbiAgICAgICAgLy/orr7nva7mlofmnKzkuLrlpJrooYzmlofmnKxcclxuICAgICAgICB0eHQud29yZFdyYXAgPSB0cnVlO1xyXG5cclxuICAgICAgICB0eHQueCA9IExheWEuc3RhZ2Uud2lkdGggLSB0eHQudGV4dFdpZHRoID4+IDE7XHJcbiAgICAgICAgdHh0LnkgPSBMYXlhLnN0YWdlLmhlaWdodCAtIHR4dC50ZXh0SGVpZ2h0ID4+IDE7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodHh0KTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgXHJcbn0iLCJpbXBvcnQgRXZlbnQgPSBMYXlhLkV2ZW50O1xyXG5leHBvcnQgY2xhc3MgVXNlckRhdGFJbmZvXHJcbnsgICBcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDorrDlvZXkuIrmrKHnprvlvIDml7bpl7RcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGxhc3R0aW1lOnN0cmluZyA9IFwibGFzdHRpbWVcIjtcclxuXHJcbiAgICBcclxuICAgIHN0YXRpYyBjYXBsYXN0Zmx1c2h0aW1lOnN0cmluZyA9IFwiY2FwdGltZVwiO1xyXG4gICAgc3RhdGljIGNhcHN0b3JhZ2VhcHBpZHM6c3RyaW5nID0gXCJjYXBhcHBpZHNcIjtcclxuICAgIHN0YXRpYyBoYXNnZXRhcHBpZHM6c3RyaW5nID0gXCJoYXNnZXRhcHBpZHNcIjtcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBvbkNhbGxMYXRlcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm9uQ2FsbExhdGVyIHRyaWdnZXJlZFwiKTtcclxuXHJcbiAgICAgICAgdmFyIHRleHQ6TGF5YS5UZXh0ID0gbmV3IExheWEuVGV4dCgpO1xyXG4gICAgICAgIHRleHQuZm9udCA9IFwiU2ltSGVpXCI7XHJcbiAgICAgICAgdGV4dC5mb250U2l6ZSA9IDMwO1xyXG4gICAgICAgIHRleHQuY29sb3IgPSBcIiNGRkZGRkZcIjtcclxuICAgICAgICB0ZXh0LnRleHQgPSBcIuaJk+W8gOaOp+WItuWPsOWPr+ingeivpeWHveaVsOS7heinpuWPkeS6huS4gOasoVwiO1xyXG4gICAgICAgIHRleHQuc2l6ZShMYXlhLnN0YWdlLndpZHRoLCBMYXlhLnN0YWdlLmhlaWdodCk7XHJcbiAgICAgICAgdGV4dC53b3JkV3JhcCA9IHRydWU7XHJcbiAgICAgICAgdGV4dC52YWxpZ24gPSBcIm1pZGRsZVwiO1xyXG4gICAgICAgIHRleHQuYWxpZ24gPSBcImNlbnRlclwiO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGV4dCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOinkuiJsuS/oeaBr1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcm9sZURhdGE6c3RyaW5nID0gXCJyb2xlRGF0YVwiO1xyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBzdGF0aWMgZ29sZDpzdHJpbmcgPSBcImdvbGRcIjtcclxuICAgIHN0YXRpYyByb2xlaWQ6c3RyaW5nID0gXCJyb2xlaWRcIjtcclxuICAgIHN0YXRpYyBsZXZlbGlkOnN0cmluZyA9IFwibGV2ZWxpZFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog55qu6IKkXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBza2luOnN0cmluZyA9IFwic2tpblwiO1xyXG5cclxuICAgIHN0YXRpYyBsYXN0RGF5OnN0cmluZyA9IFwibGFzdERheVwiO1xyXG5cclxuICAgIHN0YXRpYyBub3dkYXlTaGFyZTpzdHJpbmcgPSBcImRheXNoYXJlXCI7XHJcblxyXG4gICAgc3RhdGljIG5vd2RheVZpZGVvOnN0cmluZyA9IFwiZGF5dmlkZW9cIjtcclxuXHJcbiAgICBcclxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgYnV0dG9uMTpMYXlhLlNwcml0ZTtcclxuICAgIHByaXZhdGUgYnV0dG9uMjpMYXlhLlNwcml0ZTtcclxuICAgIHByaXZhdGUgb25EZWNyZWFzZUFscGhhMShlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8v56e76Zmk6byg5qCH5Y2V5Ye75LqL5Lu2XHJcbiAgICAgICAgdGhpcy5idXR0b24xLm9mZihFdmVudC5DTElDSywgdGhpcywgdGhpcy5vbkRlY3JlYXNlQWxwaGExKTtcclxuICAgICAgICAvL+WumuaXtuaJp+ihjOS4gOasoSjpl7TpmpTml7bpl7QpXHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDMwMDAsIHRoaXMsIHRoaXMub25Db21wbGV0ZTEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25EZWNyZWFzZUFscGhhMihlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8v56e76Zmk6byg5qCH5Y2V5Ye75LqL5Lu2XHJcbiAgICAgICAgdGhpcy5idXR0b24yLm9mZihFdmVudC5DTElDSywgdGhpcywgdGhpcy5vbkRlY3JlYXNlQWxwaGEyKTtcclxuICAgICAgICAvL+WumuaXtuaJp+ihjOS4gOasoSjln7rkuo7luKfnjocpXHJcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZU9uY2UoNjAsIHRoaXMsIHRoaXMub25Db21wbGV0ZTIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db21wbGV0ZTEoKTogdm9pZCB7XHJcbiAgICAgICAgLy9zcEJ0bjHnmoTpgI/mmI7luqblh4/lsJEwLjVcclxuICAgICAgICB0aGlzLmJ1dHRvbjEuYWxwaGEgLT0gMC41O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db21wbGV0ZTIoKTogdm9pZCB7XHJcbiAgICAgICAgLy9zcEJ0bjLnmoTpgI/mmI7luqblh4/lsJEwLjVcclxuICAgICAgICB0aGlzLmJ1dHRvbjIuYWxwaGEgLT0gMC41O1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFVzZXJJbmZvRXZlbnQgXHJcbntcclxuICAgIHN0YXRpYyBVc2VySW5mb0V2ZW50X3VwZGF0ZVVzZXJEYXRhOnN0cmluZyA9IFwiVXNlckluZm9FdmVudF91cGRhdGVVc2VyRGF0YVwiO1xyXG5cclxuICAgIHN0YXRpYyB1c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZDpzdHJpbmcgPSBcInVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkXCI7XHJcblxyXG4gICAgc3RhdGljIHVzZXJpbmZvRXZlbnRfbGV2ZWxpZDpzdHJpbmcgPSBcInVzZXJpbmZvRXZlbnRfbGV2ZWxpZFwiO1xyXG5cclxuICAgIHN0YXRpYyB1cGRhdGVQbGF5ZXJJbmZvOnN0cmluZyA9IFwiVXNlckluZm9FdmVudF91cGRhdGVQbGF5ZXJJbmZvXCI7XHJcbn0iLCJpbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi9HbG9iYWxcIjtcclxuaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xyXG5pbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcblxyXG5pbXBvcnQge0NvbXBvbmVudEV2ZW50RGF0YX0gZnJvbSBcIi4vRGF0YS9Db21wb25lbnRFdmVudERhdGFcIjtcclxuaW1wb3J0IHtSZWNDb25maWdzfSBmcm9tIFwiLi9Db25maWcvUmVjQ29uZmlnc1wiO1xyXG5pbXBvcnQgeyBUaW1lc1RhbXBlciB9IGZyb20gXCIuL1RpbWUvVGltZXNUYW1wZXJcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4vVGltZS9UaW1lclNlcnZpY2VcIjtcclxuaW1wb3J0IHtHbG9iYWxXYWl0aW5nfSBmcm9tIFwiLi9HbG9iYWxXYWl0aW5nXCI7XHJcbmltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7R2FtZVBvb2x9IGZyb20gXCIuL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuaW1wb3J0IHsgTGF5b3V0Q29udHJvbCB9IGZyb20gXCIuL0NvbnRyb2wvTGF5b3V0Q29udHJvbFwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuL0NvbnRyb2wvUmVzb3VyY2VDb250cm9sXCI7XHJcbmltcG9ydCB7UmVzRGF0YUNvbnRyb2x9IGZyb20gXCIuL0NvbnRyb2wvUmVzRGF0YUNvbnRyb2xcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRyb2x9IGZyb20gXCIuL0NvbnRyb2wvQXVkaW9Db250cm9sXCI7XHJcbmltcG9ydCB7IENvbm5lY3RDb250cm9sIH0gZnJvbSBcIi4vQ29udHJvbC9Db25uZWN0Q29udHJvbFwiO1xyXG5pbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4vV1hTREsvcGluZ3RhaXV0aWxzXCI7XHJcbmltcG9ydCB7QWdlbmN5TG9naW59IGZyb20gXCIuL0FnZW5jeS9BZ2VuY3lMb2dpblwiO1xyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi9BZ2VuY3kvQWdlbmN5VXNlck1lc3NhZ2VcIjtcclxuaW1wb3J0IHtBZ2VuY3lNYWlufSBmcm9tIFwiLi9BZ2VuY3kvQWdlbmN5TWFpblwiO1xyXG5pbXBvcnQge0FnZW5jeUluR2FtZX0gZnJvbSBcIi4vQWdlbmN5L0FnZW5jeUluR2FtZVwiO1xyXG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuL0FnZW5jeS9BZ2VuY3lTa2luXCI7XHJcbmltcG9ydCB7QWdlbmN5VHJpYWx9IGZyb20gXCIuL0FnZW5jeS9BZ2VuY3lUcmlhbFwiO1xyXG5pbXBvcnQge0FnZW5jeUxvdHRlcnl9IGZyb20gXCIuL0FnZW5jeS9BZ2VuY3lMb3R0ZXJ5XCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBHYW1lQ29udGVudHMgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMlua4uOaIj1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgUmVjQ29uZmlncy5JbnN0YW5jZS5pbml0KCk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuaW5pdCgpO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5pbml0KCk7XHJcbiAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5pbml0bGF5ZXIoKTtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5pbml0KCk7XHJcbiAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICBSZXNEYXRhQ29udHJvbC5JbnN0YW5jZS5pbml0KCk7XHJcbiAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICBDb25uZWN0Q29udHJvbC5Db25ubmVjdCgpO1xyXG4gICAgICAgIFRpbWVzVGFtcGVyLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICBwaW5ndGFpdXRpbHMuSW5zdGFuY2UuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFBvb2xPYmplY3QoKTtcclxuICAgICAgICB0aGlzLmluaXRQcm94eSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdG1hcFZpZXcoKTtcclxuICAgICAgICB0aGlzLmJlZ2luTG9hZEhhbmRsZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMluWvueixoeaxoFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRQb29sT2JqZWN0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEdhbWVQb29sLk1hcmsoIENvbXBvbmVudEV2ZW50RGF0YS5SZXNEaWNWYWx1ZSxDb21wb25lbnRFdmVudERhdGEgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMluaooeWdl+S7o+eQhuexu1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRQcm94eSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbXZjcG9vbDpQYW5lbFJlc0RpYyA9IFBhbmVsUmVzRGljLkluc3RhbmNlO1xyXG4gICAgICAgIG12Y3Bvb2wuQWdlbmN5QWRkKCBBZ2VuY3lMb2dpbiApO1xyXG4gICAgICAgIG12Y3Bvb2wuQWdlbmN5QWRkKCBBZ2VuY3lVc2VyTWVzc2FnZSApO1xyXG4gICAgICAgIG12Y3Bvb2wuQWdlbmN5QWRkKCBBZ2VuY3lNYWluICk7XHJcbiAgICAgICAgbXZjcG9vbC5BZ2VuY3lBZGQoIEFnZW5jeUluR2FtZSApO1xyXG4gICAgICAgIG12Y3Bvb2wuQWdlbmN5QWRkKCBBZ2VuY3lTa2luICk7XHJcbiAgICAgICAgbXZjcG9vbC5BZ2VuY3lBZGQoQWdlbmN5VHJpYWwgKTtcclxuICAgICAgICBtdmNwb29sLkFnZW5jeUFkZCggQWdlbmN5TG90dGVyeSApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdG1hcFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG12Y3Bvb2w6UGFuZWxSZXNEaWMgPSBQYW5lbFJlc0RpYy5JbnN0YW5jZTtcclxuICAgICAgICAvLyBtdmNwb29sLm1hcFZpZXcoIE1hcFZpZXdUeXBlLkRhaWx5cmV3YXJkVmlldyxEYWlseXJld2FyZFZpZXcgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJlZ2luTG9hZEhhbmRsZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBhdGhhcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHBhdGhhcnIucHVzaCggeyB1cmw6QXNzZXRQYXRoLmdldFJlc0NvbmZpZygpLCB0eXBlOiBMYXlhLkxvYWRlci5KU09OIH0gKTtcclxuICAgICAgICBwYXRoYXJyLnB1c2goIHsgdXJsOkFzc2V0UGF0aC5nZXRHYW1lVmVyc2lvbigpLCB0eXBlOiBMYXlhLkxvYWRlci5KU09OIH0gKTtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UuTG9hZGVycyggcGF0aGFycix0aGlzLHRoaXMucmVjbG9hZENvbXBsZXRlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNsb2FkQ29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdhbWV2ZXJzaW9uOmFueSA9IFJlc0RhdGFDb250cm9sLkluc3RhbmNlLkdhaW5SZXNvdXJjZXMoIEFzc2V0UGF0aC5nZXRHYW1lVmVyc2lvbigpLGZhbHNlICk7XHJcbiAgICAgICAgaWYoIGdhbWV2ZXJzaW9uIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEdsb2JhbC5nYW1lVmVyc2lvbiA9IGdhbWV2ZXJzaW9uLnZlcnNpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEdsb2JhbC5nYW1lVmVyc2lvbiA9IFwiMS4wLjBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNvbmZpZ3JlczphbnkgPSBSZXNEYXRhQ29udHJvbC5JbnN0YW5jZS5HYWluUmVzb3VyY2VzKCBBc3NldFBhdGguZ2V0UmVzQ29uZmlnKCksZmFsc2UgKTtcclxuICAgICAgICBSZWNDb25maWdzLkluc3RhbmNlLmluaXRSZWMoIGNvbmZpZ3JlcyApO1xyXG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkR3JvdXAoXCJsb2FkaW5nXCIsdGhpcyx0aGlzLm9uUHJlTG9hZGVkLHRoaXMub25QcmVwcm9ncmVzcyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25QcmVwcm9ncmVzcyh2YWx1ZTpudW1iZXIpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uUHJlTG9hZGVkKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFJlc0RhdGFDb250cm9sLkluc3RhbmNlLkFkZFZpZXdQYWNrQnlOYW1lKCBcImxvYWRpbmdcIix0cnVlLGZhbHNlICk7XHJcbiAgICAgICAgdmFyIGdsb2JhbHdhaXR1cmw6c3RyaW5nID0gZmFpcnlndWkuVUlQYWNrYWdlLmdldEl0ZW1VUkwoXCJsb2FkaW5nXCIsXCJnbG9iYWxXYWl0aW5nXCIpO1xyXG4gICAgICAgIFBhbmVsQmFzZUNvbnRyb2wudmlld2JnVXJsID0gZmFpcnlndWkuVUlQYWNrYWdlLmdldEl0ZW1VUkwoXCJsb2FkaW5nXCIsXCJpbWdfYmxhY2tcIik7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKGdsb2JhbHdhaXR1cmwsIEdsb2JhbFdhaXRpbmcpO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmdsb2JhbE1vZGFsV2FpdGluZyA9IGdsb2JhbHdhaXR1cmw7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcud2luZG93TW9kYWxXYWl0aW5nID0gZ2xvYmFsd2FpdHVybDtcclxuICAgICAgICAvLyBDUEFVdGlscy5pbml0KCk7XHJcbiAgICAgICAgdGhpcy5Mb2dpbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBMb2dpbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAoUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lMb2dpbiApIGFzIEFnZW5jeUxvZ2luKS5Mb2dpbigpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtTY2VuZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCBHYW1lQ0ZHIGZyb20gXCIuLi9DRkcvR2FtZUNGR1wiO1xyXG5cclxuaW1wb3J0IFNwcml0ZSA9IExheWEuU3ByaXRlO1xyXG5cdGltcG9ydCBTdGFnZSA9IExheWEuU3RhZ2U7XHJcblx0aW1wb3J0IE1hcExheWVyID0gTGF5YS5NYXBMYXllcjtcclxuXHRpbXBvcnQgVGlsZWRNYXAgPSBMYXlhLlRpbGVkTWFwO1xyXG5cdGltcG9ydCBQb2ludCA9IExheWEuUG9pbnQ7XHJcblx0aW1wb3J0IFJlY3RhbmdsZSA9IExheWEuUmVjdGFuZ2xlO1xyXG5cdGltcG9ydCBIYW5kbGVyID0gTGF5YS5IYW5kbGVyO1xyXG4gICAgaW1wb3J0IFdlYkdMID0gTGF5YS5XZWJHTDtcclxuICAgIFxyXG5cclxuZXhwb3J0IGNsYXNzIENhbWVyYU1hbmFnZXIgZXh0ZW5kcyBMYXlhLlNjcmlwdDNEXHJcbntcclxuICAgIHByb3RlY3RlZCBjYW1lcmE6IExheWEuQ2FtZXJhO1xyXG4gICAgcHJpdmF0ZSBfdHJhbnNmb3JtOkxheWEuVHJhbnNmb3JtM0Q7XHJcbiAgICBwcml2YXRlIF9kaXNWZWN0b3I6TGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBfdG9WZWM6TGF5YS5WZWN0b3IzO1xyXG4gICAgcHVibGljIGlzY2FuZm9sbG93OmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQXdha2UoKTp2b2lke1xyXG4gICAgICAgIC8v6I635Y+W6ISa5pys5omA5bGe5a+56LGhXHJcbiAgICAgICAgdGhpcy5jYW1lcmEgPSB0aGlzLm93bmVyIGFzIExheWEuQ2FtZXJhO1xyXG4gICAgICAgIHRoaXMuX3RvVmVjID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLmZpZWxkT2ZWaWV3ID0gOTA7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgcHVibGljIG9uU3RhcnQoKTp2b2lke1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybSA9IHRoaXMuY2FtZXJhLnRyYW5zZm9ybTtcclxuICAgICAgICAvL+aXi+i9rOaRhOWDj+acuuinkuW6plxyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybS5yb3RhdGUobmV3IExheWEuVmVjdG9yMyggMCwgMCwgMCksIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAvLyB0aGlzLmNhbWVyYS5jbGVhckNvbG9yID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgdGlsZWRNYXA6IFRpbGVkTWFwO1xyXG5cdFx0cHJpdmF0ZSBsYXllcjogTWFwTGF5ZXI7XHJcblx0XHRwcml2YXRlIHNwcml0ZTogU3ByaXRlO1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVNYXAoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50aWxlZE1hcCA9IG5ldyBUaWxlZE1hcCgpO1xyXG4gICAgICAgIHRoaXMudGlsZWRNYXAuY3JlYXRlTWFwKFwicmVzL3RpbGVkTWFwL2lzb21ldHJpY19ncmFzc19hbmRfd2F0ZXIuanNvblwiLCBuZXcgUmVjdGFuZ2xlKDAsIDAsIExheWEuc3RhZ2Uud2lkdGgsIExheWEuc3RhZ2UuaGVpZ2h0KSwgSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5tYXBMb2FkZWQpLCBudWxsLCBuZXcgUG9pbnQoMTYwMCwgODAwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblN0YWdlQ2xpY2soKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHA6IFBvaW50ID0gbmV3IFBvaW50KDAsIDApO1xyXG4gICAgICAgIHRoaXMubGF5ZXIuZ2V0VGlsZVBvc2l0aW9uQnlTY3JlZW5Qb3MoTGF5YS5zdGFnZS5tb3VzZVgsIExheWEuc3RhZ2UubW91c2VZLCBwKTtcclxuICAgICAgICB0aGlzLmxheWVyLmdldFNjcmVlblBvc2l0aW9uQnlUaWxlUG9zKE1hdGguZmxvb3IocC54KSwgTWF0aC5mbG9vcihwLnkpLCBwKTtcclxuICAgICAgICB0aGlzLnNwcml0ZS5wb3MocC54LCBwLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWFwTG9hZGVkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5ZXIgPSB0aGlzLnRpbGVkTWFwLmdldExheWVyQnlJbmRleCgwKTtcclxuXHJcbiAgICAgICAgdmFyIHJhZGl1c1g6IG51bWJlciA9IDMyO1xyXG4gICAgICAgIHZhciByYWRpdXNZOiBudW1iZXIgPSBNYXRoLnRhbigxODAgLyBNYXRoLlBJICogMzApICogcmFkaXVzWDtcclxuICAgICAgICB2YXIgY29sb3I6IHN0cmluZyA9IFwiI0ZGN0Y1MFwiO1xyXG5cclxuICAgICAgICB0aGlzLnNwcml0ZSA9IG5ldyBTcHJpdGUoKTtcclxuICAgICAgICB0aGlzLnNwcml0ZS5ncmFwaGljcy5kcmF3TGluZSgwLCAwLCAtcmFkaXVzWCwgcmFkaXVzWSwgY29sb3IpO1xyXG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKDAsIDAsIHJhZGl1c1gsIHJhZGl1c1ksIGNvbG9yKTtcclxuICAgICAgICB0aGlzLnNwcml0ZS5ncmFwaGljcy5kcmF3TGluZSgtcmFkaXVzWCwgcmFkaXVzWSwgMCwgcmFkaXVzWSAqIDIsIGNvbG9yKTtcclxuICAgICAgICB0aGlzLnNwcml0ZS5ncmFwaGljcy5kcmF3TGluZShyYWRpdXNYLCByYWRpdXNZLCAwLCByYWRpdXNZICogMiwgY29sb3IpO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5zcHJpdGUpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHJpdmF0ZSBfdXB2ZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMyggMCwxLDAgKTtcclxuICAgIHByaXZhdGUgX2luZGV4Om51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9zbGVycFZhbHVlOm51bWJlciA9IDg7XHJcbiAgICBwcml2YXRlIF9sb29rYXRWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHB1YmxpYyBvblVwZGF0ZSgpOiB2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuaXNjYW5mb2xsb3cgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmlzY2FybWFucGMgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIubnBjRGljdFtcIm5wY18wXCJdIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBMYXlhLlZlY3RvcjMuYWRkKCBQcm9wTWFuYWdlci5ucGNEaWN0W1wibnBjXzBcIl0udHJhbnNmb3JtLnBvc2l0aW9uLHRoaXMuX2Rpc1ZlY3Rvcix0aGlzLl90b1ZlYyApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX3RvVmVjO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54ID0gUHJvcE1hbmFnZXIubnBjRGljdFtcIm5wY18wXCJdLnRyYW5zZm9ybS5wb3NpdGlvbi54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCBQcm9wTWFuYWdlci5ucGNEaWN0W1wibnBjXzBcIl0udHJhbnNmb3JtLnBvc2l0aW9uLHRoaXMuX3VwdmVjICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIubWFpblJvbGUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIExheWEuVmVjdG9yMy5hZGQoIFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbix0aGlzLl9kaXNWZWN0b3IsdGhpcy5fdG9WZWMgKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90b1ZlYy54ID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy5fdG9WZWM7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdHJhbnNmb3JtLmxvb2tBdCggUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLHRoaXMuX3VwdmVjICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIExheWEuVmVjdG9yMy5sZXJwKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24sdGhpcy5fdG9WZWMsMTYvMTAwMCAqIHRoaXMuX3NsZXJwVmFsdWUsdGhpcy5fdG9WZWMgKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90b1ZlYy56ID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnordGhpcy5fZGlzVmVjdG9yLno7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdG9WZWMueSA9IFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi55ICsgdGhpcy5fZGlzVmVjdG9yLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy5fdG9WZWM7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9va2F0VmVjLnggPSB0aGlzLl90b1ZlYy54O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvb2thdFZlYy55ID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9va2F0VmVjLnogPSBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24uejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCB0aGlzLl9sb29rYXRWZWMsdGhpcy5fdXB2ZWMgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2FtZUVuZFJvdGF0ZSh0YXJnZXRQb3M6TGF5YS5WZWN0b3IzLCBzcGVlZDpMYXlhLlZlY3RvcjMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pc2NhbmZvbGxvdyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUoIHNwZWVkLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtLmxvb2tBdCggdGFyZ2V0UG9zLHRoaXMuX3VwdmVjICk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgU2V0Q2FtZXJhUG9zaXRpb24oIHZlYzpMYXlhLlZlY3RvcjMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHZhbHVlQXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIEdhbWVDRkcuZGljdFsxXS52YWx1ZSApO1xyXG4gICAgICAgIHRoaXMuX2Rpc1ZlY3RvciA9IG5ldyBMYXlhLlZlY3RvcjMoTnVtYmVyKCB2YWx1ZUFyclswXSApLE51bWJlciggdmFsdWVBcnJbMV0gKSxOdW1iZXIoIHZhbHVlQXJyWzJdICkpO1xyXG4gICAgICAgIExheWEuVmVjdG9yMy5hZGQodmVjICx0aGlzLl9kaXNWZWN0b3IsdGhpcy5fdG9WZWMgKTtcclxuICAgICAgICB0aGlzLmNhbWVyYS50cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl90b1ZlYztcclxuICAgICAgICB0aGlzLmNhbWVyYS50cmFuc2Zvcm0ucG9zaXRpb24ueCA9IHZlYy54O1xyXG4gICAgICAgIC8vIHRoaXMuY2FtZXJhLnRyYW5zZm9ybS5sb29rQXQoIHZlYyxuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApICk7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xyXG5pbXBvcnQge0NoYXJhY3RlclN0YXRlfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZVwiO1xyXG5pbXBvcnQge1JvbGVEYXRhfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xyXG5pbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVVzZXJNZXNzYWdlXCI7XHJcbmltcG9ydCBCdWlsZENGRyBmcm9tIFwiLi4vQ0ZHL0J1aWxkQ0ZHXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuaW1wb3J0IHtDYW1lcmFNYW5hZ2VyfSBmcm9tIFwiLi9DYW1lcmFNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IE5wY0NGRyBmcm9tIFwiLi4vQ0ZHL05wY0NGR1wiO1xyXG5pbXBvcnQgeyBBc3NldE1hbmFnZXIgfSBmcm9tIFwiLi4vQ29udHJvbC9Bc3NldE1hbmFnZXJcIjtcclxuaW1wb3J0IFBvb2xNYW5hZ2VyIGZyb20gXCIuLi9Db250cm9sL1Bvb2xNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTnBjU2NyaXB0IGV4dGVuZHMgTGF5YS5TY3JpcHQzRCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxyXG57XHJcbiAgICBwcml2YXRlIF90cmFuc2Zvcm06TGF5YS5UcmFuc2Zvcm0zRDtcclxuICAgIHByaXZhdGUgX2lzY2FuTW92ZTpib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfc3BlZWRNb3ZlVjM6TGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIHByaXZhdGUgX25vd0FjdGlvbjpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHByaXZhdGUgX2FuaW1hdG9yOkxheWEuQW5pbWF0b3I7XHJcblxyXG4gICAgcmVzb3VzZU5hbWU6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwcml2YXRlIF9zaGFuZ3BhVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgLyoq5piv5ZCm5Y+R55Sf56Kw5pKeICovXHJcbiAgICBwcml2YXRlIGhhdmVDb2xsaXNpb246Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfVGFyZ2V0Q29sbGlzaW9uOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9ub3JtYWxpemVWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbm93c2VsZWN0VmVjOkxheWEuVmVjdG9yMztcclxuXHJcbiAgICBwcml2YXRlIHN0YXlidWlsZDpzdHJpbmcgPSBcIlwiO1xyXG4gICAgXHJcbiAgICBwcml2YXRlIHN0YXlzY2VuZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacqumUge+8jDHvvJrplIHlt6bovrnvvIwy77ya6ZSB5Y+z6L65XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvY2t4c3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Bd2FrZSgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fYW5pbWF0b3IgPSAodGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEKS5nZXRDb21wb25lbnQoIExheWEuQW5pbWF0b3IgKTtcclxuICAgICAgICBQcm9wTWFuYWdlci5zZXRBbmltYXRvciggdGhpcy5fYW5pbWF0b3IgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIExlZnRUcmlhbDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBSaWdodFRyaWFsOkxheWEuU3ByaXRlM0Q7XHJcblxyXG4gICAgcHVibGljIG9uU3RhcnQoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzID0gbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKTtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSAodGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm07XHJcbiAgICAgICAgdmFyIHNwOkxheWEuU3ByaXRlM0QgPSB0aGlzLm93bmVyIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgLy8gKHNwLmdldENoaWxkQnlOYW1lKFwibGVmdHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRCkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgLy8gKHNwLmdldENoaWxkQnlOYW1lKFwicmlnaHR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0QgKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB2YXIgTGVmdFRyaWFsMSA9IHNwLmdldENoaWxkQnlOYW1lKFwibGVmdHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRDtcclxuICAgICAgICB2YXIgUmlnaHRUcmlhbDEgPSBzcC5nZXRDaGlsZEJ5TmFtZShcInJpZ2h0dHJhaWxcIikgYXMgTGF5YS5UcmFpbFNwcml0ZTNEO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuXHJcbiAgICAgICAgXHJcblxyXG5cclxuICAgICAgICB2YXIgc2NhbGU9MC4wMDE7XHJcbiAgICAgICAgdmFyIGluZGV4PUdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoMCxBc3NldE1hbmFnZXIuQWxsTWFwRGljLmxlbmd0aC0xKTtcclxuICAgICAgICBpbmRleD1pbmRleCVBc3NldE1hbmFnZXIuQWxsTWFwRGljLmxlbmd0aDtcclxuICAgICAgICB2YXIgcHJlZmFicz1Bc3NldE1hbmFnZXIuQWxsTWFwRGljW2luZGV4XTtcclxuICAgICAgICB0aGlzLkxlZnRUcmlhbD1Qb29sTWFuYWdlci5HZXRTcHJpdGUzRChwcmVmYWJzKTtcclxuICAgICAgICBMZWZ0VHJpYWwxLnBhcmVudC5hZGRDaGlsZCggdGhpcy5MZWZ0VHJpYWwpO1xyXG4gICAgICAgIHRoaXMuTGVmdFRyaWFsLnRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uPShMZWZ0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5MZWZ0VHJpYWwudHJhbnNmb3JtLmxvY2FsUm90YXRpb25FdWxlcj0oTGVmdFRyaWFsMSBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm0ubG9jYWxSb3RhdGlvbkV1bGVyLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5MZWZ0VHJpYWwudHJhbnNmb3JtLmxvY2FsU2NhbGU9bmV3IExheWEuVmVjdG9yMyhzY2FsZSxzY2FsZSxzY2FsZSk7XHJcblxyXG4gICAgICAgIHRoaXMuUmlnaHRUcmlhbD1Qb29sTWFuYWdlci5HZXRTcHJpdGUzRChwcmVmYWJzKTtcclxuICAgICAgICBSaWdodFRyaWFsMS5wYXJlbnQuYWRkQ2hpbGQodGhpcy5SaWdodFRyaWFsKTtcclxuICAgICAgICB0aGlzLlJpZ2h0VHJpYWwudHJhbnNmb3JtLmxvY2FsUG9zaXRpb249KFJpZ2h0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5SaWdodFRyaWFsLnRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uRXVsZXI9KFJpZ2h0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uRXVsZXIuY2xvbmUoKTtcclxuICAgICAgICB0aGlzLlJpZ2h0VHJpYWwudHJhbnNmb3JtLmxvY2FsU2NhbGU9bmV3IExheWEuVmVjdG9yMyhzY2FsZSxzY2FsZSxzY2FsZSk7XHJcbiAgICAgICAgUmlnaHRUcmlhbDEuYWN0aXZlPWZhbHNlO1xyXG4gICAgICAgIExlZnRUcmlhbDEuYWN0aXZlPWZhbHNlO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhzcC5uYW1lKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHByaXZhdGUgX2luaXRQb3NWZWM6TGF5YS5WZWN0b3IzO1xyXG4gICAgLyoqXHJcbiAgICAgKiDnirbmgIHvvIww77ya562J5b6F54q25oCB77yMMe+8muW8gOWni+eKtuaAge+8jDLvvJrlrozmiJDnirbmgIFcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbm93Um9sZVN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIHN0YXJ0UnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dOcGNpbmZvLmdyYXZpdHkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5HcmF2aXR5X2cgPSB0aGlzLl9ub3dOcGNpbmZvLmdyYXZpdHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuR3Jhdml0eV9nID0gMTA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NoZWNrdGltZSA9IDUwMDtcclxuICAgICAgICB0aGlzLl9ub3dSb2xlU3RhdGUgPSAxO1xyXG4gICAgICAgIHRoaXMuX2VuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gMDtcclxuICAgICAgICB0aGlzLl9pbml0UG9zVmVjID0gdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5zdGF5YnVpbGQgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc3RheXNjZW5lID0gXCJcIjtcclxuICAgICAgICB0aGlzLl9ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5zdGFuZDtcclxuICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy54ID0gMDtcclxuICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy55ID0gMDtcclxuICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy56ID0gLXRoaXMubW92ZXNwZWVkO1xyXG4gICAgICAgIHRoaXMuX2lzY2FuTW92ZSA9IHRydWU7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX25vd05wY2luZm86TnBjQ0ZHO1xyXG5cclxuICAgIG1vdmVzcGVlZDpudW1iZXIgPSAwO1xyXG4gICAgZnJvbnRqdW1wc3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIGxlZnRqdW1wc3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHJpZ2h0anVtcHNwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBjbGltYnNwZWVkOm51bWJlciA9IDA7XHJcbiAgICBzaWRlY2xpbWJzcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIHB1YmxpYyBucGNpbmZvKCBjZmc6TnBjQ0ZHICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX25vd05wY2luZm8gPSBjZmc7XHJcbiAgICAgICAgdGhpcy5tb3Zlc3BlZWQgPSB0aGlzLl9ub3dOcGNpbmZvLnNwZWVkO1xyXG4gICAgICAgIHRoaXMuY2xpbWJzcGVlZCA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby51cGNsaW1iICk7XHJcbiAgICAgICAgdGhpcy5mcm9udGp1bXBzcGVlZCA9IG5ldyBMYXlhLlZlY3RvcjMoTnVtYmVyKHRoaXMuX25vd05wY2luZm8uZnJvbnRqdW1wLngpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5mcm9udGp1bXAueSksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmZyb250anVtcC56KSlcclxuICAgICAgICB0aGlzLmxlZnRqdW1wc3BlZWQgPSBuZXcgTGF5YS5WZWN0b3IzKE51bWJlcih0aGlzLl9ub3dOcGNpbmZvLmxlZnRqdW1wLngpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5sZWZ0anVtcC55KSxOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ubGVmdGp1bXAueikpXHJcbiAgICAgICAgdGhpcy5yaWdodGp1bXBzcGVlZCA9IG5ldyBMYXlhLlZlY3RvcjMoTnVtYmVyKHRoaXMuX25vd05wY2luZm8ucmlnaHRqdW1wLngpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5yaWdodGp1bXAueSksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnJpZ2h0anVtcC56KSlcclxuICAgICAgICB0aGlzLnNpZGVjbGltYnNwZWVkID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIodGhpcy5fbm93TnBjaW5mby5zbGlkZWNsaW1iLngpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5zbGlkZWNsaW1iLnkpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5zbGlkZWNsaW1iLnopKVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHRoaXMuZnJvbnRqdW1wLnggPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uZnJvbnRqdW1wLnggKTtcclxuICAgICAgICAvLyB0aGlzLmZyb250anVtcC55ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmZyb250anVtcC55ICk7XHJcbiAgICAgICAgLy8gdGhpcy5mcm9udGp1bXAueiA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5mcm9udGp1bXAueiApO1xyXG5cclxuICAgICAgICAvLyB0aGlzLmxlZnRqdW1wLnggPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ubGVmdGp1bXAueCApO1xyXG4gICAgICAgIC8vIHRoaXMubGVmdGp1bXAueSA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5sZWZ0anVtcC55ICk7XHJcbiAgICAgICAgLy8gdGhpcy5sZWZ0anVtcC56ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmxlZnRqdW1wLnogKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyB0aGlzLnJpZ2h0anVtcC54ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnJpZ2h0anVtcC54ICk7XHJcbiAgICAgICAgLy8gdGhpcy5yaWdodGp1bXAueSA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5yaWdodGp1bXAueSApO1xyXG4gICAgICAgIC8vIHRoaXMucmlnaHRqdW1wLnogPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ucmlnaHRqdW1wLnogKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy51cGNsaW1iID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnVwY2xpbWIgKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5zbGlkZWNsaW1iLnggPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uc2xpZGVjbGltYi54ICk7XHJcbiAgICAgICAgLy8gdGhpcy5zbGlkZWNsaW1iLnkgPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uc2xpZGVjbGltYi55ICk7XHJcbiAgICAgICAgLy8gdGhpcy5zbGlkZWNsaW1iLnogPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uc2xpZGVjbGltYi56ICk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog5byA5aeL56Kw5pKe5pe25omn6KGMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbGxpc2lvbkVudGVyKGNvbGxpc2lvbjpMYXlhLkNvbGxpc2lvbik6dm9pZCB7XHJcbiAgICAgICAgaWYoIGNvbGxpc2lvbiAmJiBjb2xsaXNpb24uY29udGFjdHMgJiYgY29sbGlzaW9uLmNvbnRhY3RzLmxlbmd0aCA+IDAgJiYgY29sbGlzaW9uLm90aGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQ6TGF5YS5Db250YWN0UG9pbnQgPSBjb2xsaXNpb24uY29udGFjdHNbMF07XHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlKCBjb250YWN0UG9pbnQubm9ybWFsLGNvbGxpc2lvbi5vdGhlci5vd25lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIHB1YmxpYyBzZXRub3dTZWxlY3RWZWMoIHBvczpMYXlhLlZlY3RvcjMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gcG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xvY2tieUJ1aWxkbmFtZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacquiiq+mUge+8jDHvvJrplIHlrprlt6bovrnvvIwy77ya6ZSB5a6a5Y+z6L6577yMXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvY2tzdGF0ZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBDYWxjdWxhdGUoIG5vcm1hbDpMYXlhLlZlY3RvcjMsdGFyZ2V0OkxheWEuTm9kZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0Lm5hbWUgPT0gXCJTbGlkZXJCb29zdFwiIHx8IHRhcmdldC5uYW1lLmluZGV4T2YoIFwibnBjXCIgKSAhPSAtMSB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcInJvbGVcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fVGFyZ2V0Q29sbGlzaW9uID0gdGFyZ2V0Lm5hbWU7XHJcbiAgICAgICAgdmFyIG46TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgICAgICBMYXlhLlZlY3RvcjMubm9ybWFsaXplKG5vcm1hbCx0aGlzLl9ub3JtYWxpemVWZWMpO1xyXG4gICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgfHwgdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiU2NhZmZvbGRpbmdcIiApICE9IC0xIHx8XHJcbiAgICAgICAgdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApIC8v56Kw5Yiw5bu6562R77yM5Yik5pat5piv5LiK54is77yM5bem54is6L+Y5piv5Y+z54isXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF5YnVpbGQgPSB0aGlzLl9UYXJnZXRDb2xsaXNpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXlzY2VuZSA9IHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQucGFyZW50Lm5hbWUgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWUsdGhpcy5fVGFyZ2V0Q29sbGlzaW9uICk7XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueiA9PSAtMSApIC8v5LiK54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgJiYgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgPiAodGhpcy5fbm93c2VsZWN0VmVjLnkgLSAwLjEpICApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLngsdGhpcy5fbm93c2VsZWN0VmVjLnksdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1idXA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy55ID09IDEgfHx0aGlzLl9ub3JtYWxpemVWZWMueSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy54ID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdDsgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnggPT0gMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5ydW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OyAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ICE9IDEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cGJsb2NrO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJwYW5lbF9qdW1wXCIgKSAhPSAtMSApIC8v5Yqg6YCf5p2/6Lez6LeDXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKFwicGFuZWxfZG93bnNsaXBcIikgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZTtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd0FjdGlvbiApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJib3hfQm9hcmRcIiApICE9IC0xICYmIHRoaXMubm93QWN0aW9uICE9IENoYXJhY3RlclN0YXRlLmRvd25tb3ZlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueiA9PSAtMSApIC8v5LiK54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJib3hfc2lkZWp1bXBcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuc2lkZXNwZWVkdXA7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dBY3Rpb24gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiYm94X1N1cm1vdW50XCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNyb3NzO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwO1xyXG4gICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDmjIHnu63norDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljICBvbkNvbGxpc2lvblN0YXkoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIC8vIERlYnVnZXIubG9nKCBcIueisOaSnuS4rVwiICk7XHJcbiAgICAgICAgaWYoIGNvbGxpc2lvbiAmJiBjb2xsaXNpb24uY29udGFjdHMgJiYgY29sbGlzaW9uLmNvbnRhY3RzLmxlbmd0aCA+IDAgJiYgY29sbGlzaW9uLm90aGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaGF2ZUNvbGxpc2lvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQ6TGF5YS5Db250YWN0UG9pbnQgPSBjb2xsaXNpb24uY29udGFjdHNbMF07XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBjb2xsaXNpb24ub3RoZXIub3duZXI7XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXRuYW1lOnN0cmluZyA9IHRhcmdldC5uYW1lO1xyXG4gICAgICAgICAgICBpZiggdGFyZ2V0bmFtZSAhPSBcIlNsaWRlckJvb3N0XCIgJiYgdGFyZ2V0bmFtZS5pbmRleE9mKCBcIm5wY1wiICkgPT0gLTEgJiYgdGFyZ2V0bmFtZS5pbmRleE9mKCBcInJvbGVcIiApID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fVGFyZ2V0Q29sbGlzaW9uID0gdGFyZ2V0bmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcIlNjYWZmb2xkaW5nXCIgKSAhPSAtMSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApIC8v56Kw5Yiw5bu6562R77yM5Yik5pat5piv5LiK54is77yM5bem54is6L+Y5piv5Y+z54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RheWJ1aWxkID0gdGhpcy5fVGFyZ2V0Q29sbGlzaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RheXNjZW5lID0gdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQucGFyZW50Lm5hbWUsdGFyZ2V0LnBhcmVudC5uYW1lICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0aGlzLl9UYXJnZXRDb2xsaXNpb24gKTtcclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOe7k+adn+eisOaSnuaXtuaJp+ihjFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25Db2xsaXNpb25FeGl0KGNvbGxpc2lvbjpMYXlhLkNvbGxpc2lvbik6dm9pZCBcclxuICAgIHtcclxuICAgICAgICB0aGlzLmhhdmVDb2xsaXNpb24gPSBmYWxzZTtcclxuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcclxuICAgICAgICAgICAgdGhpcy5DaGVja0VuZCggY29udGFjdFBvaW50Lm5vcm1hbCxjb2xsaXNpb24ub3RoZXIub3duZXIgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBDaGVja0VuZCggbm9ybWFsOkxheWEuVmVjdG9yMyx0YXJnZXQ6TGF5YS5Ob2RlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBcIlNsaWRlckJvb3N0XCIgfHwgdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJucGNcIiApICE9IC0xIHx8IHRhcmdldC5uYW1lLmluZGV4T2YoIFwicm9sZVwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5IYXZlRm9yY2VKdW1wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuSGF2ZUZvcmNlSnVtcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAwO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24gIT0gdGFyZ2V0Lm5hbWUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJwYW5lbF9qdW1wXCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCggdGhpcy5ub3dBY3Rpb24gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwOlxyXG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXBibG9jazpcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJib3hfQm9hcmRcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkp1bXBBY3Rpb24oIHRoaXMuX2NoYW5nZU1vdmVYICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OlxyXG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuSnVtcEFjdGlvbiggdGhpcy5fY2hhbmdlTW92ZVggKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucnVuOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5KdW1wQWN0aW9uKCB0aGlzLl9jaGFuZ2VNb3ZlWCApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5Nb3ZlWDpcclxuICAgICAgICAgICAgdGhpcy5KdW1wQWN0aW9uKCB0aGlzLl9zcGVlZE1vdmVWMy54ICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEp1bXBBY3Rpb24oIHZhbHVlOm51bWJlcixpc3F1YW56aG9uZzpib29sZWFuID0gZmFsc2UgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHZhbHVlID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXByaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdmFsdWUgPCAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBpc3F1YW56aG9uZyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhbGx2YWx1ZTpudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZGlyOnN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImxlZnRyaWdodFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsdmFsdWUgPSB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfbGVmdCArIHRoaXMuX25vd05wY2luZm8uanVtcF9yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjaW5mby5qdW1wX2xlZnQgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcImxlZnRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwicmlnaHRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJmcm9udHJpZ2h0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY2luZm8uc3RhcnRfYWhlYWQgKyB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfcmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLGFsbHZhbHVlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzb3J0IDw9IHRoaXMuX25vd05wY2luZm8uc3RhcnRfYWhlYWQgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcImZyb250XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcInJpZ2h0XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiZnJvbnRsZWZ0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY2luZm8uc3RhcnRfYWhlYWQgKyB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfbGVmdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjaW5mby5zdGFydF9haGVhZCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwiZnJvbnRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcInJpZ2h0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcInJpZ2h0XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImxlZnRcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJmcm9udFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY2luZm8uc3RhcnRfYWhlYWQgKyB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfbGVmdCArIHRoaXMuX25vd05wY2luZm8uanVtcF9yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjaW5mby5zdGFydF9haGVhZCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwiZnJvbnRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBzb3J0IDw9IHRoaXMuX25vd05wY2luZm8uc3RhcnRfYWhlYWQgKyB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfbGVmdCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggc2VsZWN0ZGlyIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmcm9udFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBMYXN0QWN0aW9uOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9tb3ZlVGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfY2hpeHVUaW1lOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNBY3Rpb25OdW1zOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2lzbmVlZGFjdGlvbm51bTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfbmVlZGFjdGlvbnRpbWU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIE5vd0xhc3RBY3Rpb25TdGF0ZTpzdHJpbmc9XCJcIjtcclxuICAgIHB1YmxpYyBzZXQgbm93QWN0aW9uKCB2YWx1ZTpzdHJpbmcgKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dSb2xlU3RhdGUgPT0gMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93QWN0aW9uICE9IHZhbHVlIHx8IHRoaXMuTGFzdEFjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcHx8dGhpcy5MYXN0QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmp1bXByaWdodCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuTGFzdEFjdGlvbiA9IHRoaXMuX25vd0FjdGlvbjtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0FjdGlvbiA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoKCB0aGlzLl9ub3dBY3Rpb24gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuc3RhbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc3RhbmQgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnJ1bjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuTGFzdEFjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wIHx8IHRoaXMuTGFzdEFjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdCB8fHRoaXMuTGFzdEFjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsMTAwICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8IDUwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUubGFuZDEgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUubGFuZDIgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuanVtcCApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5mcm9udGp1bXBzcGVlZC54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5mcm9udGp1bXBzcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5mcm9udGp1bXBzcGVlZC56O1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkID0gdGhpcy5sZWZ0anVtcHNwZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5sZWZ0anVtcHNwZWVkLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLmxlZnRqdW1wc3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMubGVmdGp1bXBzcGVlZC56O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUubGVmdGp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXByaWdodDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQgPSB0aGlzLnJpZ2h0anVtcHNwZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5yaWdodGp1bXBzcGVlZC54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5yaWdodGp1bXBzcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5yaWdodGp1bXBzcGVlZC56O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucmlnaHRqdW1wICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJwYW5lbF9qdW1wXCIgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLkxhc3RBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5qdW1wU3BlZWQueipidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLk5vd0xhc3RBY3Rpb25TdGF0ZT09dmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeSoyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsMTAwICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzb3J0IDwgNTAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuaGlnaGp1bXAxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuaGlnaGp1bXAyICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmRvd25tb3ZlOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcInBhbmVsX2Rvd25zbGlwXCIgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGl4dVRpbWUgPSBidWlsZGNmZy50aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuaHVhY2hhbiApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY3Jvc3M6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwiYm94X1N1cm1vdW50XCIgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnkrMC41O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fc3BlZWRNb3ZlVjMueipidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hpeHVUaW1lID0gYnVpbGRjZmcudGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmh1cmRsZSApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXBibG9jazpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLmNsaW1ic3BlZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmNsaW1id2FsbCApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZCA9IG5ldyBMYXlhLlZlY3RvcjMoMCx0aGlzLnNpZGVjbGltYnNwZWVkLnksdGhpcy5zaWRlY2xpbWJzcGVlZC56KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuc2lkZWNsaW1ic3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuc2lkZWNsaW1ic3BlZWQuejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW53YWxsbGVmdCApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQgPSBuZXcgTGF5YS5WZWN0b3IzKDAsdGhpcy5zaWRlY2xpbWJzcGVlZC55LHRoaXMuc2lkZWNsaW1ic3BlZWQueilcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLnNpZGVjbGltYnNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLnNpZGVjbGltYnNwZWVkLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVud2FsbHJpZ2h0ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmVlZGFjdGlvbnRpbWUgPSAwLjM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmNsaW1iZW5kICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLk5vd0xhc3RBY3Rpb25TdGF0ZT12YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG5vd0FjdGlvbigpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ub3dBY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbW92ZVZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBqdW1wU3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUganVtcEhpZ2h0Om51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9kaXN5Om51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgR3Jhdml0eV9nOm51bWJlcj0xMDsvL+mHjeWKm+WKoOmAn+W6plxyXG4gICAgcHJpdmF0ZSBfY2hlY2t0aW1lOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd1JvbGVTdGF0ZSA9PSAxIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGR0ID0gMTY7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrdGltZSArPSBkdDtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmlzY2FybWFucGMgKVxyXG4gICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoZWNrdGltZSA+PSA1MDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrdGltZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd05wY2luZm8gJiYgUHJvcE1hbmFnZXIubWFpblJvbGUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICsgdGhpcy5fbm93TnBjaW5mby5kaXN0YW5jZSA8IFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi56IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9pc2Nhbk1vdmUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBkdC8xMDAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5ub3dBY3Rpb24gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucnVuOi8v6LeR5YqoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IGRpc3RpbWUgKiB0aGlzLl9zcGVlZE1vdmVWMy56O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXA6Ly/niKzljYdcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDEgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9sb2Nrc3RhdGUgPT0gMiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3NoYW5ncGFWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX3NoYW5ncGFWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX25vd3NlbGVjdFZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cGJsb2NrOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSBkaXN0aW1lICogdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9zaGFuZ3BhVmVjIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9zaGFuZ3BhVmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuQ2xpbWJNb3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX25vd3NlbGVjdFZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcDovL+i3s+i3g1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3kgPSB0aGlzLmp1bXBTcGVlZC55IC0gdGhpcy5HcmF2aXR5X2cqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXN5ID0gdGhpcy5qdW1wU3BlZWQueSAtIHRoaXMuR3Jhdml0eV9nKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9kaXN5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC54ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5fZGlzeSpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSBkaXN0aW1lICogdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueSpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5Nb3ZlWDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuX3NwZWVkTW92ZVYzLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX3NwZWVkTW92ZVYzLngqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IDAuMSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX2NoaXh1VGltZSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zaWRlc3BlZWR1cDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX2NoaXh1VGltZSAmJiB0aGlzLkxhc3RBY3Rpb249PUNoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCB8fCB0aGlzLkxhc3RBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gdGhpcy5MYXN0QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd0FjdGlvbiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jcm9zczpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLkdyYXZpdHlfZypkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fZGlzeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuX2Rpc3kqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fbm93c2VsZWN0VmVjKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgPCB0aGlzLl9ub3dzZWxlY3RWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSAoMS8wLjMpKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgJiYgKHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biB8fCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZSApICYmICF0aGlzLmhhdmVDb2xsaXNpb24gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiA8PSB0aGlzLl9ub3dzZWxlY3RWZWMueiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA8IFByb3BNYW5hZ2VyLmRpZVBvc1kgKS8v6KeS6Imy5q275LqhXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuc3RheXNjZW5lID09IFwiXCIgfHwgdGhpcy5zdGF5YnVpbGQgPT0gXCJcIiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl9pbml0UG9zVmVjLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIHRoaXMuc3RheXNjZW5lLHRoaXMuc3RheWJ1aWxkICkuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPCBQcm9wTWFuYWdlci5nYW1ld2luUG9zWiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5XaW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9pc0FjdGlvbk51bXMgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8v5aaC5p6c5b2T5YmN5pKt5pS+c3RhdGXlt7Lnu4/mkq3mlL7lrozkuobkuIDmrKFcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5faXNuZWVkYWN0aW9ubnVtID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9hbmltYXRvci5nZXRDdXJyZW50QW5pbWF0b3JQbGF5U3RhdGUoKS5ub3JtYWxpemVkVGltZSA+PSB0aGlzLl9pc25lZWRhY3Rpb25udW0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fbm93QWN0aW9uTmFtZSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGVmdGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5yaWdodGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odXJkbGU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odWFjaGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCx0aGlzLl9ub3dzZWxlY3RWZWMueSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGFuZDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5sYW5kMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbmVlZGFjdGlvbnRpbWUgIT0gMCAmJiB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX25lZWRhY3Rpb250aW1lIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fbm93QWN0aW9uTmFtZSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGVmdGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5yaWdodGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odXJkbGU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odWFjaGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCx0aGlzLl9ub3dzZWxlY3RWZWMueSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fZW5kaW5nIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBkdC8xMDAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lICs9IGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX21vdmVUaW1lID49IHRoaXMuX2VuZGFubW90aW1lIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR2FtZU92ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkMS54ID0gdGhpcy5fZW5kQW5tb1NwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQxLnkgPSB0aGlzLl9lbmRBbm1vU3BlZWQueSAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueiA9IHRoaXMuX2VuZEFubW9TcGVlZC56ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKCBQcm9wTWFuYWdlci5jYXJtYS5nZXRDb21wb25lbnQoIENhbWVyYU1hbmFnZXIgKSBhcyBDYW1lcmFNYW5hZ2VyICkuR2FtZUVuZFJvdGF0ZSggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLCB0aGlzLl9lbmRBbm1vU3BlZWQxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgR2FtZU92ZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5lbmQgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmRpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfZW5kQW5tb1NwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcclxuICAgIHByaXZhdGUgX2VuZGFubW90aW1lOm51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIF9lbmRBbm1vU3BlZWQxOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIFdpbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgdGhpcy5fbm93Um9sZVN0YXRlID0gMjtcclxuICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5ICk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLm5wY2VuZCx0aGlzLm93bmVyLm5hbWUgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdG9wKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBkZXN0cm95KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhbmdlTW92ZVg6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIEhhdmVGb3JjZUp1bXA6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgcXVhdGVybmlvbjpMYXlhLlF1YXRlcm5pb24gPSBuZXcgTGF5YS5RdWF0ZXJuaW9uOyBcclxuICAgIHB1YmxpYyBKb3koIHZhbHVlOm51bWJlcixhbmdsZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biB8fCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwIHx8IENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCB8fCBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQgJiYgdGhpcy5fY2hhbmdlTW92ZVggPiAwICkgLy/lvLrliLbot7Pot4NcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuSGF2ZUZvcmNlSnVtcCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0ICYmIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLkhhdmVGb3JjZUp1bXAgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcCB8fFxyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdCB8fFxyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQgfHxcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXAgKVxyXG4gICAgICAgICAgICBhbmdsZSA9IC1hbmdsZSAqIE1hdGguUEkvMTgwO1xyXG4gICAgICAgICAgICBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSggbmV3IExheWEuVmVjdG9yMyggMCwxLDAgKSxhbmdsZSx0aGlzLnF1YXRlcm5pb24gKTtcclxuICAgICAgICAgICAgTGF5YS5WZWN0b3IzLnRyYW5zZm9ybVF1YXQoIHRoaXMuanVtcFNwZWVkLHRoaXMucXVhdGVybmlvbix0aGlzLmp1bXBTcGVlZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX25vd0FjdGlvbk5hbWU6c3RyaW5nO1xyXG4gICAgcHVibGljIFBsYXlBbmltYXRvciggYWN0aW9uTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gdGhpcy5fbm93QWN0aW9uTmFtZSA9IGFjdGlvbk5hbWU7XHJcbiAgICAgICAgdmFyIF9hY3Rpb25uYW1lID0gdGhpcy5UcmFuc2l0aW9uQWN0aW9uTmFtZShhY3Rpb25OYW1lKTtcclxuICAgICAgICB0aGlzLl9ub3dBY3Rpb25OYW1lID0gYWN0aW9uTmFtZTtcclxuICAgICAgICBpZiggdGhpcy5fYW5pbWF0b3IgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0FjdGlvbk5hbWUgPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hbmltYXRvci5zcGVlZCA9IDEuNTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnNwZWVkID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9hbmltYXRvci5wbGF5KF9hY3Rpb25uYW1lLDAsMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKui9rOaNouWKqOS9nOWQjeensCAqL1xyXG4gICAgVHJhbnNpdGlvbkFjdGlvbk5hbWUoX2FjdGlvbm5hbWU6c3RyaW5nKTpzdHJpbmd7XHJcbiAgICAgICAgc3dpdGNoIChfYWN0aW9ubmFtZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwicm9sbG92ZXIxXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImNlZmFuMVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJyb2xsb3ZlcjJcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiY2VmYW4yXCJcclxuICAgICAgICAgICAgY2FzZSBcInJ1bndhbGxsZWZ0XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInBhb3FpYW5nbGVmdFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJyaWdodGp1bXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicmlnaHRqdW1wXCJcclxuICAgICAgICAgICAgY2FzZSBcInJ1bndhbGxyaWdodFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJwYW9xaWFuZ3JpZ2h0XCJcclxuICAgICAgICAgICAgY2FzZSBcImxlZnRqdW1wXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImxlZnRqdW1wXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1id2FsbFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJwYXFpYW5nXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1iZW5kXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImNsaW1iZW5kXCJcclxuICAgICAgICAgICAgY2FzZSBcInN0YW5kXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInN0YW5kXCJcclxuICAgICAgICAgICAgY2FzZSBcInNreVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJrb25nemhvbmdcIlxyXG4gICAgICAgICAgICBjYXNlIFwibGFuZDFcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibHVvZGkxXCJcclxuICAgICAgICAgICAgY2FzZSBcImxhbmQyXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImx1b2RpMlwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJoaWdoanVtcDFcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiZGF0aWFvMVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJoaWdoanVtcDJcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiZGF0aWFvMlwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJydW5cIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicnVuXCJcclxuICAgICAgICAgICAgY2FzZSBcImp1bXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwianVtcFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJjbGltYnVwXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcIkNsaW1iXCJcclxuICAgICAgICAgICAgY2FzZSBcImZhbGxkb3duXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcIkZyZWVmYWxsaW5nXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1ibGVmdFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJsZWZ0X2NsaW1iXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1icmlnaHRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicmlnaHRfY2xpbWJcIlxyXG4gICAgICAgICAgICBjYXNlIFwianVtcHJpZ2h0XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInJpZ2h0X2p1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwianVtcGxlZnRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibGVmdF9qdW1wXCJcclxuICAgICAgICAgICAgY2FzZSBcIkNsaW1iTW90aW9uXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcIlBsYXlQYWxvdUFjdGlvblwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJodWFjaGFuXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImh1YWNoYW5cIlxyXG4gICAgICAgICAgICBjYXNlIFwiaHVyZGxlXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImt1YWxhblwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJzcGVlZHVwanVtcFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJqaWFzdUp1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwiTW92ZVhcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwieHNodW55aVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJkb3dubW92ZVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJkb3duU2xpZGVcIlxyXG4gICAgICAgICAgICBjYXNlIFwic2lkZXNwZWVkdXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwic2xpZGVqaWFzdVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJjcm9zc1wiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJzdXJtb3VudFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJjbGltYnVwYmxvY2tcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibG9ja2NsaW1iXCJcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBUZXN0SnVtcCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRQb3N0aW9uKCk6TGF5YS5WZWN0b3IzXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWN0aW9uKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vd1JvbGVTdGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlc3Ryb3koKVxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5ouW5bC+5Zue5pS25oiQ5YqfLS0tLVwiKTtcclxuICAgICAgICBQb29sTWFuYWdlci5SZWNvdmVyU3ByaXRlM0QodGhpcy5MZWZ0VHJpYWwpXHJcbiAgICAgICAgUG9vbE1hbmFnZXIuUmVjb3ZlclNwcml0ZTNEKHRoaXMuUmlnaHRUcmlhbClcclxuICAgIH1cclxuXHJcbiAgIFxyXG59IiwiaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xyXG5pbXBvcnQge0NoYXJhY3RlclN0YXRlfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZVwiO1xyXG5pbXBvcnQge1JvbGVEYXRhfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xyXG5pbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVVzZXJNZXNzYWdlXCI7XHJcbmltcG9ydCBCdWlsZENGRyBmcm9tIFwiLi4vQ0ZHL0J1aWxkQ0ZHXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuaW1wb3J0IHtDYW1lcmFNYW5hZ2VyfSBmcm9tIFwiLi9DYW1lcmFNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9HYW1lU3RhdGVDb250cm9sXCI7XHJcbmltcG9ydCB7QXVkaW9Db250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9BdWRpb0NvbnRyb2xcIjtcclxuaW1wb3J0IHtXWEdhbWVQbGF0Zm9ybX0gZnJvbSBcIi4uL1dYU0RLL1dYR2FtZVBsYXRmb3JtXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBBc3NldE1hbmFnZXIgfSBmcm9tIFwiLi4vQ29udHJvbC9Bc3NldE1hbmFnZXJcIjtcclxuaW1wb3J0IFBvb2xNYW5hZ2VyIGZyb20gXCIuLi9Db250cm9sL1Bvb2xNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUGxheWVyIGV4dGVuZHMgTGF5YS5TY3JpcHQzRCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxyXG57XHJcbiAgICBwdWJsaWMgX3RyYW5zZm9ybTpMYXlhLlRyYW5zZm9ybTNEO1xyXG4gICAgcHVibGljIF9pc2Nhbk1vdmU6Ym9vbGVhbjtcclxuICAgIHB1YmxpYyBfc3BlZWRNb3ZlVjM6TGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIHByaXZhdGUgX2lzQWN0aW9uTnVtczpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pc25lZWRhY3Rpb25udW06bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX25lZWRhY3Rpb250aW1lOm51bWJlciA9IDA7XHJcbiAgICBcclxuICAgIHByaXZhdGUgX25vd0FjdGlvblN0YXRlOnN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgcHVibGljIF9Sb2xlRGF0YTpSb2xlRGF0YTtcclxuXHJcbiAgICBwcml2YXRlIF9hbmltYXRvcjpMYXlhLkFuaW1hdG9yO1xyXG4gICAgcHJpdmF0ZSBfbXVsdGlwbGU6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMyggMSwxLDEgKTtcclxuXHJcbiAgICBwcml2YXRlIExlZnRUcmlhbDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBSaWdodFRyaWFsOkxheWEuU3ByaXRlM0Q7XHJcblxyXG4gICAgcHJpdmF0ZSBMYXN0QWN0aW9uU3RhdGU6c3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgX21vdmVUaW1lOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDpgJ9idWZmdmVjXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xhc3RqaWFzdVN0YXRlOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIGJ1ZmZfc3BlZWR1cHRpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgY2Fuc2hha2U6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBzaGFrZXRpbWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBkb3VibGVzcGVlZHVwOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICByZXNvdXNlTmFtZTpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluczpQbGF5ZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKVxyXG4gICAge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgUGxheWVyLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlBsYXllcntcclxuICAgICAgICBpZihQbGF5ZXIuaW5zID09IG51bGwpe1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFBsYXllcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUGxheWVyLmlucztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Bd2FrZSgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fYW5pbWF0b3IgPSAodGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEKS5nZXRDb21wb25lbnQoIExheWEuQW5pbWF0b3IgKTtcclxuICAgICAgICBQcm9wTWFuYWdlci5zZXRBbmltYXRvciggdGhpcy5fYW5pbWF0b3IgKTtcclxuICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMyA9IG5ldyBMYXlhLlZlY3RvcjMoIDAsMCwwICk7XHJcbiAgICAgICAgdmFyIHNwOkxheWEuU3ByaXRlM0QgPSB0aGlzLm93bmVyIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtID0gc3AudHJhbnNmb3JtO1xyXG4gICAgICAgIHRoaXMuX1JvbGVEYXRhID0gKFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSkuUm9sZURhdGE7XHJcbiAgICAgICAgKCBzcC5nZXRDb21wb25lbnQoIExheWEuUmlnaWRib2R5M0QgKSBhcyBMYXlhLlJpZ2lkYm9keTNEICkuY2NkTW90aW9uVGhyZXNob2xkID0gMC4wMDE7XHJcblxyXG4gICAgICAgIHZhciBMZWZ0VHJpYWwxID0gc3AuZ2V0Q2hpbGRCeU5hbWUoXCJsZWZ0dHJhaWxcIikgYXMgTGF5YS5UcmFpbFNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBSaWdodFRyaWFsMSA9IHNwLmdldENoaWxkQnlOYW1lKFwicmlnaHR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0Q7XHJcbiAgICAgICAgLy8gdGhpcy5MZWZ0VHJpYWwgPSBzcC5nZXRDaGlsZEJ5TmFtZShcImxlZnR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0Q7XHJcbiAgICAgICAgLy8gdGhpcy5SaWdodFRyaWFsID0gc3AuZ2V0Q2hpbGRCeU5hbWUoXCJyaWdodHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRDtcclxuXHJcbiAgICAgICAgdmFyIHNjYWxlPTAuMDAxO1xyXG4gICAgICAgIHZhciBpbmRleD1HYW1lVXRpbHMucmFuZFJhbmdlaW50KDAsQXNzZXRNYW5hZ2VyLkFsbE1hcERpYy5sZW5ndGgtMSk7XHJcbiAgICAgICAgaW5kZXg9aW5kZXglQXNzZXRNYW5hZ2VyLkFsbE1hcERpYy5sZW5ndGg7XHJcbiAgICAgICAgdmFyIHByZWZhYnM9QXNzZXRNYW5hZ2VyLkFsbE1hcERpY1tpbmRleF07XHJcbiAgICAgICAgdGhpcy5MZWZ0VHJpYWw9UG9vbE1hbmFnZXIuR2V0U3ByaXRlM0QocHJlZmFicyk7XHJcbiAgICAgICAgTGVmdFRyaWFsMS5wYXJlbnQuYWRkQ2hpbGQoIHRoaXMuTGVmdFRyaWFsKTtcclxuICAgICAgICB0aGlzLkxlZnRUcmlhbC50cmFuc2Zvcm0ubG9jYWxQb3NpdGlvbj0oTGVmdFRyaWFsMSBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm0ubG9jYWxQb3NpdGlvbi5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuTGVmdFRyaWFsLnRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uRXVsZXI9KExlZnRUcmlhbDEgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLmxvY2FsUm90YXRpb25FdWxlci5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuTGVmdFRyaWFsLnRyYW5zZm9ybS5sb2NhbFNjYWxlPShMZWZ0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFNjYWxlLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5MZWZ0VHJpYWwudHJhbnNmb3JtLmxvY2FsU2NhbGU9bmV3IExheWEuVmVjdG9yMyhzY2FsZSxzY2FsZSxzY2FsZSk7XHJcblxyXG4gICAgICAgIHRoaXMuUmlnaHRUcmlhbD1Qb29sTWFuYWdlci5HZXRTcHJpdGUzRChwcmVmYWJzKTtcclxuICAgICAgICBSaWdodFRyaWFsMS5wYXJlbnQuYWRkQ2hpbGQodGhpcy5SaWdodFRyaWFsKTtcclxuICAgICAgICB0aGlzLlJpZ2h0VHJpYWwudHJhbnNmb3JtLmxvY2FsUG9zaXRpb249KFJpZ2h0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5SaWdodFRyaWFsLnRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uRXVsZXI9KFJpZ2h0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uRXVsZXIuY2xvbmUoKTtcclxuICAgICAgICB0aGlzLlJpZ2h0VHJpYWwudHJhbnNmb3JtLmxvY2FsU2NhbGU9bmV3IExheWEuVmVjdG9yMyhzY2FsZSxzY2FsZSxzY2FsZSk7XHJcbiAgICAgICAgUmlnaHRUcmlhbDEuYWN0aXZlPWZhbHNlO1xyXG4gICAgICAgIExlZnRUcmlhbDEuYWN0aXZlPWZhbHNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgX2luaXRQb3NWZWM6TGF5YS5WZWN0b3IzO1xyXG4gICAgcHVibGljIHN0YXJ0UnVuKGppYXN1Pyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9Sb2xlRGF0YS5yb2xlQ2ZnLmdyYXZpdHkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5nID0gdGhpcy5fUm9sZURhdGEucm9sZUNmZy5ncmF2aXR5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmcgPSAxMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbXVsdGlwbGUueCA9IDE7XHJcbiAgICAgICAgdGhpcy5fbXVsdGlwbGUueSA9IDE7XHJcbiAgICAgICAgdGhpcy5fbXVsdGlwbGUueiA9IDE7XHJcbiAgICAgICAgdGhpcy5idWZmX3NwZWVkdXB0aW1lID0gMDtcclxuICAgICAgICB0aGlzLmRvdWJsZXNwZWVkdXAgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9sYXN0amlhc3VTdGF0ZSA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSAwO1xyXG4gICAgICAgIHRoaXMuX2luaXRQb3NWZWMgPSB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24uY2xvbmUoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIueOqeWutueahOWIneWni+S9jee9ri0tLS1cIix0aGlzLl9pbml0UG9zVmVjKTtcclxuICAgICAgICB0aGlzLl9ub3didWlsZG5hbWUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuX25vd3NjZW5lbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueCA9IDA7XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueSA9IDA7XHJcbiAgICAgICAgaWYoamlhc3Upe1xyXG4gICAgICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy56ID0gLXRoaXMuX1JvbGVEYXRhLm1vdmVzcGVlZCoyO1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMzAwMCx0aGlzLCgpPT57XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy56ID0gLXRoaXMuX1JvbGVEYXRhLm1vdmVzcGVlZDtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueiA9IC10aGlzLl9Sb2xlRGF0YS5tb3Zlc3BlZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzY2FuTW92ZSA9IHRydWU7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgfVxyXG4gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBfaXNDb2xsaW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX25vd0NvbGxUYXJnZXROYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9ub3JtYWxpemVWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUgX25vd3NlbGVjdFZlYzpMYXlhLlZlY3RvcjM7XHJcbiAgICBwdWJsaWMgX25vd2J1aWxkbmFtZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIF9ub3dzY2VuZW5hbWU6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvLyBwcml2YXRlIHB6ZGljdDphbnkgPSB7fTtcclxuICAgIC8vIHByaXZhdGUgcHphcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlvIDlp4vnorDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29sbGlzaW9uRW50ZXIoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIHtcclxuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcclxuICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGUoIGNvbnRhY3RQb2ludC5ub3JtYWwsY29sbGlzaW9uLm90aGVyLm93bmVyLGNvbnRhY3RQb2ludC5wb3NpdGlvbk9uQik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5oyB57ut56Kw5pKe5pe25omn6KGMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyAgb25Db2xsaXNpb25TdGF5KGNvbGxpc2lvbjpMYXlhLkNvbGxpc2lvbik6dm9pZCBcclxuICAgIHtcclxuICAgICAgICAvLyBEZWJ1Z2VyLmxvZyggXCLnorDmkp7kuK1cIiApO1xyXG4gICAgICAgIGlmKCBjb2xsaXNpb24gJiYgY29sbGlzaW9uLmNvbnRhY3RzICYmIGNvbGxpc2lvbi5jb250YWN0cy5sZW5ndGggPiAwICYmIGNvbGxpc2lvbi5vdGhlciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0NvbGxpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgY29udGFjdFBvaW50OkxheWEuQ29udGFjdFBvaW50ID0gY29sbGlzaW9uLmNvbnRhY3RzWzBdO1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gY29sbGlzaW9uLm90aGVyLm93bmVyO1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0bmFtZTpzdHJpbmcgPSB0YXJnZXQubmFtZTtcclxuICAgICAgICAgICAgaWYoIHRhcmdldG5hbWUgIT0gXCJTbGlkZXJCb29zdFwiICYmIHRhcmdldG5hbWUuaW5kZXhPZiggXCJucGNcIiApID09IC0xICApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lID0gdGFyZ2V0bmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgfHwgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJTY2FmZm9sZGluZ1wiICkgIT0gLTEgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApIC8v56Kw5Yiw5bu6562R77yM5Yik5pat5piv5LiK54is77yM5bem54is6L+Y5piv5Y+z54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93YnVpbGRuYW1lID0gdGhpcy5fbm93Q29sbFRhcmdldE5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93c2NlbmVuYW1lID0gdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQucGFyZW50Lm5hbWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5uYW1lLHRoaXMuX25vd0NvbGxUYXJnZXROYW1lICk7XHJcbiAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog57uT5p2f56Kw5pKe5pe25omn6KGMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbGxpc2lvbkV4aXQoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzQ29sbGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCBjb2xsaXNpb24gJiYgY29sbGlzaW9uLmNvbnRhY3RzICYmIGNvbGxpc2lvbi5jb250YWN0cy5sZW5ndGggPiAwICYmIGNvbGxpc2lvbi5vdGhlciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29udGFjdFBvaW50OkxheWEuQ29udGFjdFBvaW50ID0gY29sbGlzaW9uLmNvbnRhY3RzWzBdO1xyXG4gICAgICAgICAgICB0aGlzLkNoZWNrRW5kKCBjb250YWN0UG9pbnQubm9ybWFsLGNvbGxpc2lvbi5vdGhlci5vd25lciApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoq5qOA5rWL57uT5p2f56Kw5pKeICovXHJcbiAgICBwcml2YXRlIENoZWNrRW5kKCBub3JtYWw6TGF5YS5WZWN0b3IzLHRhcmdldDpMYXlhLk5vZGUgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldC5uYW1lID09IFwiU2xpZGVyQm9vc3RcIiB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcIm5wY1wiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5pc2ZvcmNlSnVtcCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzZm9yY2VKdW1wID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX2xvY2t4c3RhdGUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lICE9IHRhcmdldC5uYW1lIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRhcmdldC5uYW1lLmluZGV4T2YoIFwicGFuZWxfanVtcFwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2goIHRoaXMubm93QWN0aW9uIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDpcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwYmxvY2s6XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfQm9hcmRcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkp1bXBBY3Rpb24oIHRoaXMuX2NoYW5nZU1vdmVYICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OlxyXG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuSnVtcEFjdGlvbiggdGhpcy5fY2hhbmdlTW92ZVggKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucnVuOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5KdW1wQWN0aW9uKCB0aGlzLl9jaGFuZ2VNb3ZlWCApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5Nb3ZlWDpcclxuICAgICAgICAgICAgdGhpcy5KdW1wQWN0aW9uKCB0aGlzLl9zcGVlZE1vdmVWMy54ICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogMDrmnKrplIHvvIwx77ya6ZSB5bem6L6577yMMu+8mumUgeWPs+i+uVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9sb2NreHN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIHNldG5vd1NlbGVjdFZlYyggcG9zOkxheWEuVmVjdG9yMyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBwb3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbG9ja2J5QnVpbGRuYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICAvKipcclxuICAgICAqIDA65pyq6KKr6ZSB77yMMe+8mumUgeWumuW3pui+ue+8jDLvvJrplIHlrprlj7PovrnvvIxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbG9ja3N0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfc2hhbmdwYVZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIC8qKuiuoeeul+eisOaSniAqL1xyXG4gICAgcHJpdmF0ZSBDYWxjdWxhdGUoIG5vcm1hbDpMYXlhLlZlY3RvcjMsdGFyZ2V0OkxheWEuTm9kZSxjb2xscG9pbnQ6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBcIlNsaWRlckJvb3N0XCIgfHwgdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJucGNcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgPSB0YXJnZXQubmFtZTtcclxuICAgICAgICB2YXIgbjpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgICAgIExheWEuVmVjdG9yMy5ub3JtYWxpemUobm9ybWFsLHRoaXMuX25vcm1hbGl6ZVZlYyk7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiU2NhZmZvbGRpbmdcIiApICE9IC0xIHx8IFxyXG4gICAgICAgICAgICB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEpIC8v56Kw5Yiw5bu6562R77yM5Yik5pat5piv5LiK54is77yM5bem54is6L+Y5piv5Y+z54isXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3didWlsZG5hbWUgPSB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NjZW5lbmFtZSA9IHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50LnBhcmVudC5uYW1lLHRhcmdldC5wYXJlbnQubmFtZSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSApO1xyXG4gICAgICAgICAgICB9ICAgXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnogPT0gLTEgKSAvL+S4iueIrFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93c2VsZWN0VmVjICYmIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55ID4gKHRoaXMuX25vd3NlbGVjdFZlYy55IC0gMC4yKSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLngsdGhpcy5fbm93c2VsZWN0VmVjLnksdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1idXA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnkgPT0gMSB8fHRoaXMuX25vcm1hbGl6ZVZlYy55ID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnggPT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUucnVuIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1idXAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OyAgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueCA9PSAxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQ7ICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnogIT0gMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwYmxvY2s7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwicGFuZWxfanVtcFwiICkgIT0gLTEgKSAvL+WKoOmAn+adv+i3s+i3g1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZihcInBhbmVsX2Rvd25zbGlwXCIpICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYm94X0JvYXJkXCIgKSAhPSAtMSAmJiB0aGlzLm5vd0FjdGlvbiAhPSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnogPT0gLTEgKSAvL+S4iueIrFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1idXA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfc2lkZWp1bXBcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuc2lkZXNwZWVkdXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYm94X1N1cm1vdW50XCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNyb3NzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwO1xyXG4gICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIHByaXZhdGUgSnVtcEFjdGlvbiggdmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB2YWx1ZSA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dBY3Rpb24gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdmFsdWUgPCAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dBY3Rpb24gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIF9TdGF0ZU5hbWU6c3RyaW5nO1xyXG4gICAgcHVibGljIFBsYXlBbmltYXRvciggYWN0aW9uTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIF9hY3Rpb25uYW1lID0gdGhpcy5UcmFuc2l0aW9uQWN0aW9uTmFtZShhY3Rpb25OYW1lKTtcclxuICAgICAgICB0aGlzLl9TdGF0ZU5hbWUgPSBhY3Rpb25OYW1lO1xyXG4gICAgICAgIGlmKCB0aGlzLl9hbmltYXRvciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fU3RhdGVOYW1lID09IENoYXJhY3RlclN0YXRlLmNsaW1iZW5kIHx8IHRoaXMuX1N0YXRlTmFtZSA9PSBDaGFyYWN0ZXJTdGF0ZS5sYW5kMSB8fCB0aGlzLl9TdGF0ZU5hbWUgPT0gQ2hhcmFjdGVyU3RhdGUubGFuZDIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hbmltYXRvci5zcGVlZCA9IDEuNTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnNwZWVkID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9hbmltYXRvci5wbGF5KF9hY3Rpb25uYW1lLDAsMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKui9rOaNouWKqOS9nOWQjeensCAqL1xyXG4gICAgVHJhbnNpdGlvbkFjdGlvbk5hbWUoX2FjdGlvbm5hbWU6c3RyaW5nKTpzdHJpbmd7XHJcbiAgICAgICAgc3dpdGNoIChfYWN0aW9ubmFtZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwicm9sbG92ZXIxXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImNlZmFuMVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJyb2xsb3ZlcjJcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiY2VmYW4yXCJcclxuICAgICAgICAgICAgY2FzZSBcInJ1bndhbGxsZWZ0XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInBhb3FpYW5nbGVmdFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJyaWdodGp1bXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicmlnaHRqdW1wXCJcclxuICAgICAgICAgICAgY2FzZSBcInJ1bndhbGxyaWdodFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJwYW9xaWFuZ3JpZ2h0XCJcclxuICAgICAgICAgICAgY2FzZSBcImxlZnRqdW1wXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImxlZnRqdW1wXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1id2FsbFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJwYXFpYW5nXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1iZW5kXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImNsaW1iZW5kXCJcclxuICAgICAgICAgICAgY2FzZSBcInN0YW5kXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInN0YW5kXCJcclxuICAgICAgICAgICAgY2FzZSBcInNreVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJrb25nemhvbmdcIlxyXG4gICAgICAgICAgICBjYXNlIFwibGFuZDFcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibHVvZGkxXCJcclxuICAgICAgICAgICAgY2FzZSBcImxhbmQyXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImx1b2RpMlwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJoaWdoanVtcDFcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiZGF0aWFvMVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJoaWdoanVtcDJcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiZGF0aWFvMlwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJydW5cIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicnVuXCJcclxuICAgICAgICAgICAgY2FzZSBcImp1bXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwianVtcFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJjbGltYnVwXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcIkNsaW1iXCJcclxuICAgICAgICAgICAgY2FzZSBcImZhbGxkb3duXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcIkZyZWVmYWxsaW5nXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1ibGVmdFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJsZWZ0X2NsaW1iXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1icmlnaHRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicmlnaHRfY2xpbWJcIlxyXG4gICAgICAgICAgICBjYXNlIFwianVtcHJpZ2h0XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInJpZ2h0X2p1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwianVtcGxlZnRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibGVmdF9qdW1wXCJcclxuICAgICAgICAgICAgY2FzZSBcIkNsaW1iTW90aW9uXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcIlBsYXlQYWxvdUFjdGlvblwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJodWFjaGFuXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImh1YWNoYW5cIlxyXG4gICAgICAgICAgICBjYXNlIFwiaHVyZGxlXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImt1YWxhblwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJzcGVlZHVwanVtcFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJqaWFzdUp1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwiTW92ZVhcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwieHNodW55aVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJkb3dubW92ZVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJkb3duU2xpZGVcIlxyXG4gICAgICAgICAgICBjYXNlIFwic2lkZXNwZWVkdXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwic2xpZGVqaWFzdVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJjcm9zc1wiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJzdXJtb3VudFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJjbGltYnVwYmxvY2tcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibG9ja2NsaW1iXCJcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIE5vd0xhc3RBY3Rpb25TdGF0ZTpzdHJpbmc9XCJcIjtcclxuICAgIHB1YmxpYyBzZXQgbm93QWN0aW9uKCB2YWx1ZTpzdHJpbmcgKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dBY3Rpb25TdGF0ZSAhPSB2YWx1ZSB8fCB0aGlzLkxhc3RBY3Rpb25TdGF0ZSA9PSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcCB8fCB0aGlzLl9ub3dBY3Rpb25TdGF0ZSA9PSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLkxhc3RBY3Rpb25TdGF0ZSA9IHRoaXMuX25vd0FjdGlvblN0YXRlO1xyXG4gICAgICAgICAgICB0aGlzLl9ub3dBY3Rpb25TdGF0ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fuc2hha2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5DaGFuZ2VUcmlhbCggdHJ1ZSApO1xyXG4gICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd0FjdGlvblN0YXRlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zdGFuZDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc3RhbmQgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5ydW46XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuTGFzdEFjdGlvblN0YXRlID09IENoYXJhY3RlclN0YXRlLmp1bXAgfHwgdGhpcy5MYXN0QWN0aW9uU3RhdGUgPT0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQgfHx0aGlzLkxhc3RBY3Rpb25TdGF0ZSA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPCA1MCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5sYW5kMSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmxhbmQyICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuanVtcCApO1xyXG4gICAgICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLkluc3RhbmNlLlNldEVmZmVjdENvbG9yKCBcImNvbG9yX3doaXRlXCIsIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5fUm9sZURhdGEuZnJvbnRqdW1wLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX1JvbGVEYXRhLmZyb250anVtcC55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9Sb2xlRGF0YS5mcm9udGp1bXAuejtcclxuICAgICAgICAgICAgICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UucGxheUdhbWVTb3VuZChcInRpYW9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuU2V0RWZmZWN0Q29sb3IoIFwiY29sb3Jfd2hpdGVcIiwgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMuX1JvbGVEYXRhLmxlZnRqdW1wLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX1JvbGVEYXRhLmxlZnRqdW1wLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX1JvbGVEYXRhLmxlZnRqdW1wLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5sZWZ0anVtcCApO1xyXG4gICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5R2FtZVNvdW5kKFwidGlhb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuU2V0RWZmZWN0Q29sb3IoIFwiY29sb3Jfd2hpdGVcIiwgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMuX1JvbGVEYXRhLnJpZ2h0anVtcC54O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9Sb2xlRGF0YS5yaWdodGp1bXAueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fUm9sZURhdGEucmlnaHRqdW1wLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5yaWdodGp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UucGxheUdhbWVTb3VuZChcInRpYW9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJwYW5lbF9qdW1wXCIgXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5idWZmX3NwZWVkdXB0aW1lID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS54ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnogPSBidWlsZGNmZy5idWZmeiAqIGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvdWJsZXNwZWVkdXAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS54ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnogPSBidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmX3NwZWVkdXB0aW1lID0gYnVpbGRjZmcudGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZnggKiB0aGlzLl9tdWx0aXBsZS54O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLk5vd0xhc3RBY3Rpb25TdGF0ZT09dmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnkqMjtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6ICogdGhpcy5fbXVsdGlwbGUuejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8IDUwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDEgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMiApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UucGxheUdhbWVTb3VuZChcInRpYW9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcyx0aGlzLnBsYXlzcGVlZFNvdW5kICk7XHJcbiAgICAgICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKCAyMDAsdGhpcyx0aGlzLnBsYXlzcGVlZFNvdW5kICk7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmU6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJwYW5lbF9kb3duc2xpcFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuYnVmZl9zcGVlZHVwdGltZSA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS56ID0gYnVpbGRjZmcuYnVmZnogKiBidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3VibGVzcGVlZHVwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS56ID0gYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZl9zcGVlZHVwdGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4ICogdGhpcy5fbXVsdGlwbGUueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnkgKiB0aGlzLl9tdWx0aXBsZS55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6ICogdGhpcy5fbXVsdGlwbGUuejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmh1YWNoYW4gKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlzcGVlZFNvdW5kKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuc2lkZXNwZWVkdXA6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJib3hfc2lkZWp1bXBcIiBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnggPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueiA9IGJ1aWxkY2ZnLmJ1ZmZ6ICogYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG91Ymxlc3BlZWR1cCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnggPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueiA9IGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPSBidWlsZGNmZy50aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeCAqIHRoaXMuX211bHRpcGxlLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5ICogdGhpcy5fbXVsdGlwbGUueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fc3BlZWRNb3ZlVjMueipidWlsZGNmZy5idWZmeiAqIHRoaXMuX211bHRpcGxlLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5c3BlZWRTb3VuZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnZpYnJhdGVTaG9ydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS4gKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jcm9zczpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcImJveF9TdXJtb3VudFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuYnVmZl9zcGVlZHVwdGltZSA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS56ID0gYnVpbGRjZmcuYnVmZnogKiBidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3VibGVzcGVlZHVwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnggPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueiA9IGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPSBidWlsZGNmZy50aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeCAqIHRoaXMuX211bHRpcGxlLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IChidWlsZGNmZy5idWZmeSswLjUpICogdGhpcy5fbXVsdGlwbGUueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fc3BlZWRNb3ZlVjMueipidWlsZGNmZy5idWZmeiAqIHRoaXMuX211bHRpcGxlLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5odXJkbGUgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwYmxvY2s6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX1JvbGVEYXRhLnVwY2xpbWI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmNsaW1id2FsbCApO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnZpYnJhdGVTaG9ydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2Fuc2hha2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hha2V0aW1lID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNoYW5nZVRyaWFsKCBmYWxzZSApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fUm9sZURhdGEuc2xpZGVjbGltYi55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9Sb2xlRGF0YS5zbGlkZWNsaW1iLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1bndhbGxsZWZ0ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5DaGFuZ2VUcmlhbCggZmFsc2UgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9Sb2xlRGF0YS5zbGlkZWNsaW1iLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX1JvbGVEYXRhLnNsaWRlY2xpbWIuejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVud2FsbHJpZ2h0ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5DaGFuZ2VUcmlhbCggZmFsc2UgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmVlZGFjdGlvbnRpbWUgPSAwLjM7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5jbGltYmVuZCApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5Ob3dMYXN0QWN0aW9uU3RhdGU9dmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGxheXNwZWVkU291bmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLnBsYXlHYW1lU291bmQoXCJzcGVlZHVwXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbm93QWN0aW9uKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vd0FjdGlvblN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgQ2hhbmdlVHJpYWwoIGJvOmJvb2xlYW4gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuTGVmdFRyaWFsICYmIHRoaXMuUmlnaHRUcmlhbCAmJiB0aGlzLkxlZnRUcmlhbC5hY3RpdmUgIT0gYm8gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5MZWZ0VHJpYWwuYWN0aXZlID0gYm87XHJcbiAgICAgICAgICAgIHRoaXMuUmlnaHRUcmlhbC5hY3RpdmUgPSBibztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEpveSggdmFsdWU6bnVtYmVyLHZhbHVlMTpudW1iZXIsYW5nbGU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5ydW4gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cCB8fCBDaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQgfHwgQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VNb3ZlWCA9IHZhbHVlMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCAmJiB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKSAvL+W8uuWItui3s+i3g1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pc2ZvcmNlSnVtcCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0ICYmIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzZm9yY2VKdW1wID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmp1bXAgfHxcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQgfHxcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0IHx8XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFuZ2xlID0gLWFuZ2xlICogTWF0aC5QSS8xODA7XHJcbiAgICAgICAgICAgIExheWEuUXVhdGVybmlvbi5jcmVhdGVGcm9tQXhpc0FuZ2xlKCBuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApLGFuZ2xlLHRoaXMucXVhdGVybmlvbiApO1xyXG4gICAgICAgICAgICB2YXIganVtcHo6bnVtYmVyID0gdGhpcy5qdW1wU3BlZWQuejtcclxuICAgICAgICAgICAgTGF5YS5WZWN0b3IzLnRyYW5zZm9ybVF1YXQoIHRoaXMuanVtcFNwZWVkLHRoaXMucXVhdGVybmlvbix0aGlzLmp1bXBTcGVlZCApO1xyXG4gICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0ganVtcHo7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBfbW92ZVZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBqdW1wU3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUganVtcEhpZ2h0Om51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9kaXN5Om51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgZzpudW1iZXI9MTA7Ly/ph43lipvliqDpgJ/luqZcclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgZHQgPSAxNjtcclxuICAgICAgICBpZiggdGhpcy5faXNjYW5Nb3ZlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkaXN0aW1lOm51bWJlciA9IGR0LzEwMDA7XHJcbiAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lICs9IGRpc3RpbWU7XHJcbiAgICAgICAgICAgIHN3aXRjaCggdGhpcy5ub3dBY3Rpb24gKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnJ1bjovL+i3keWKqFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqICh0aGlzLl9zcGVlZE1vdmVWMy56ICogdGhpcy5fbXVsdGlwbGUueik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDIgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXA6Ly/niKzljYdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IGRpc3RpbWUgKiB0aGlzLmp1bXBTcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbG9ja3N0YXRlID09IDIgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fc2hhbmdwYVZlYyApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX3NoYW5ncGFWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuQ2xpbWJNb3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93c2VsZWN0VmVjIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fbm93c2VsZWN0VmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwYmxvY2s6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSBkaXN0aW1lICogdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9zaGFuZ3BhVmVjIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fc2hhbmdwYVZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fbm93c2VsZWN0VmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcDovL+i3s+i3g1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDpcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3kgPSB0aGlzLmp1bXBTcGVlZC55IC0gdGhpcy5nKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5fZGlzeSpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3kgPSB0aGlzLmp1bXBTcGVlZC55IC0gdGhpcy5nKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5fZGlzeSpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdDpcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSBkaXN0aW1lICogdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLmp1bXBTcGVlZC55KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuTW92ZVg6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuX3NwZWVkTW92ZVYzLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fc3BlZWRNb3ZlVjMueCpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IDAuMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmU6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuc2lkZXNwZWVkdXA6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuYnVmZl9zcGVlZHVwdGltZSA8PSAwICYmIHRoaXMuTGFzdEFjdGlvblN0YXRlPT1DaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQgfHwgdGhpcy5MYXN0QWN0aW9uU3RhdGUgPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IHRoaXMuTGFzdEFjdGlvblN0YXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNyb3NzOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3kgPSB0aGlzLmp1bXBTcGVlZC55IC0gdGhpcy5nKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5fZGlzeSpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuQ2xpbWJNb3Rpb246XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fbm93c2VsZWN0VmVjKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55IDwgdGhpcy5fbm93c2VsZWN0VmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gKDEvMC4zKSpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd3NlbGVjdFZlYyAmJiAodGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUucnVuIHx8IHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmRvd25tb3ZlICkgJiYgIXRoaXMuX2lzQ29sbGluZyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiA8PSB0aGlzLl9ub3dzZWxlY3RWZWMueiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55IDwgUHJvcE1hbmFnZXIuZGllUG9zWSAtIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuRGllRGlzdGFuY2UgKS8v6KeS6Imy5q275LqhXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dzY2VuZW5hbWUgPT0gXCJcIiB8fCB0aGlzLl9ub3didWlsZG5hbWUgPT0gXCJcIiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoR2FtZVN0YXRlLmZ1aHVvY2lzaHU+MCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmV2aXZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZihHYW1lU3RhdGUuZnVodW9jaXNodT4wKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXZpdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5zdGFuZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPCBQcm9wTWFuYWdlci5nYW1ld2luUG9zWiApLy/liLDovr7nu4jngrlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5XaW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLnByb19qaW5kdS52YWx1ZSA9ICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiAvIFByb3BNYW5hZ2VyLmdhbWV3aW5Qb3NaICogMTAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9pc0FjdGlvbk51bXMgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5faXNuZWVkYWN0aW9ubnVtID4gMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fYW5pbWF0b3IuZ2V0Q3VycmVudEFuaW1hdG9yUGxheVN0YXRlKCkubm9ybWFsaXplZFRpbWUgPj0gdGhpcy5faXNuZWVkYWN0aW9ubnVtKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCB0aGlzLl9TdGF0ZU5hbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmxlZnRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5yaWdodGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuaGlnaGp1bXAyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odXJkbGU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnNreSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuaHVhY2hhbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1bik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLngsdGhpcy5fbm93c2VsZWN0VmVjLnksdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5sYW5kMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmxhbmQyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odWFjaGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbmVlZGFjdGlvbnRpbWUgIT0gMCAmJiB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX25lZWRhY3Rpb250aW1lIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX1N0YXRlTmFtZSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGVmdGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucmlnaHRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5za3kgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuaHVyZGxlOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmh1YWNoYW46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLngsdGhpcy5fbm93c2VsZWN0VmVjLnksdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPiAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idWZmX3NwZWVkdXB0aW1lIC09IGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5TcGVlZFVwRWZmZWN0KCBcImppYXN1bGl6aVwiLHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiApO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuZG91Ymxlc3BlZWR1cCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuU3BlZWRVcEVmZmVjdDEoIFwiamlhc3VsaXppXCIsdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS54ID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueiA9IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRvdWJsZXNwZWVkdXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLkluc3RhbmNlLkNsb3NlU3BlZWRVcEVmZmVjdCggKTtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLkluc3RhbmNlLkNsb3NlU3BlZWRVcEVmZmVjdDEoICk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5jYW5zaGFrZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hha2V0aW1lKz0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLnNoYWtldGltZSA+PSAwLjUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hha2V0aW1lID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX2VuZGluZyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBkaXN0aW1lOm51bWJlciA9IGR0LzEwMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSArPSBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX21vdmVUaW1lID49IHRoaXMuX2VuZGFubW90aW1lIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkdhbWVPdmVyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkMS54ID0gdGhpcy5fZW5kQW5tb1NwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueSA9IHRoaXMuX2VuZEFubW9TcGVlZC55ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQxLnogPSB0aGlzLl9lbmRBbm1vU3BlZWQueiAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgKCBQcm9wTWFuYWdlci5jYXJtYS5nZXRDb21wb25lbnQoIENhbWVyYU1hbmFnZXIgKSBhcyBDYW1lcmFNYW5hZ2VyICkuR2FtZUVuZFJvdGF0ZSggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLCB0aGlzLl9lbmRBbm1vU3BlZWQxICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICBcclxuICAgIHByaXZhdGUgX2VuZGluZzpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9lbmRBbm1vU3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgcHJpdmF0ZSBfZW5kYW5tb3RpbWU6bnVtYmVyID0gMTtcclxuICAgIHByaXZhdGUgX2VuZEFubW9TcGVlZDE6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUgV2luKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5R2FtZVNvdW5kKFwib3ZlclwiKTtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUuZW5kICk7XHJcbiAgICAgICAgdmFyIGNhcm1hVHJhbnM6TGF5YS5UcmFuc2Zvcm0zRCA9IFByb3BNYW5hZ2VyLmNhcm1hLnRyYW5zZm9ybTtcclxuICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQueiA9ICh0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiAtIDIgLSBjYXJtYVRyYW5zLnBvc2l0aW9uLnopL3RoaXMuX2VuZGFubW90aW1lO1xyXG4gICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZC55ID0gKHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55IC0gY2FybWFUcmFucy5wb3NpdGlvbi55KS90aGlzLl9lbmRhbm1vdGltZTtcclxuICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQueCA9ICggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnggKyAzIC0gY2FybWFUcmFucy5wb3NpdGlvbi54ICkgLyB0aGlzLl9lbmRhbm1vdGltZTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5ICk7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuR2FtZU92ZXJFZmZlY2YoIFwieWFuaHVhXCIsdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2UuZW5kR2FtZVBsYXllckFyci5sZW5ndGggPT0gMD90cnVlOmZhbHNlICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq5Ye6546w5aSN5rS755WM6Z2iICovXHJcbiAgICBwcml2YXRlIFJldml2ZSgpOnZvaWR7XHJcbiAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLnBsYXlHYW1lU291bmQoXCJvdmVyXCIpO1xyXG4gICAgICAgIEdhbWVTdGF0ZS5pc2RpZSA9IHRydWU7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLnJldml2ZSApO1xyXG4gICAgICAgIHRoaXMuX2lzY2FuTW92ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5zdGFuZCApO1xyXG4gICAgICAgIC8vIHRoaXMuX2VuZGluZyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBMb3NlKCk6dm9pZHtcclxuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UucGxheUdhbWVTb3VuZChcIm92ZXJcIik7XHJcbiAgICAgICAgR2FtZVN0YXRlLmlzZGllID0gdHJ1ZTtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUubG9zZSApO1xyXG4gICAgICAgIHRoaXMuX2lzY2FuTW92ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5zdGFuZCApO1xyXG4gICAgICAgIHRoaXMuX2VuZGluZyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBHYW1lT3ZlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9lbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhbmdlTW92ZVg6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIGlzZm9yY2VKdW1wOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIHF1YXRlcm5pb246TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjsgXHJcbiAgICBcclxuXHJcbiAgICBwdWJsaWMgVGVzdEp1bXAoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0cm95KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFhNb3ZlKCBzdGF0ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzLnggPSBzdGF0ZSAqIDIwO1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLk1vdmVYO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25EZXN0cm95KClcclxuICAgIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuaLluWwvuWbnuaUtuaIkOWKnzIyMjIyMjItLS0tXCIpO1xyXG4gICAgICAgIFBvb2xNYW5hZ2VyLlJlY292ZXJTcHJpdGUzRCh0aGlzLkxlZnRUcmlhbClcclxuICAgICAgICBQb29sTWFuYWdlci5SZWNvdmVyU3ByaXRlM0QodGhpcy5SaWdodFRyaWFsKVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIFxyXG59IiwiXHJcbmV4cG9ydCBjbGFzcyBHbG9iYWwge1xyXG4gICAgc3RhdGljICBzdGFnZTogTGF5YS5TdGFnZTtcclxuICAgIHN0YXRpYyAgaHR0cHVybCA9IFwiXCI7XHJcbiAgICBzdGF0aWMgIHJlc291cmNlaHR0dHA6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBzdGF0aWMgIGNkbnVybDpzdHJpbmcgPSBcImh0dHBzOi8vd3hnYW1lLjUxeW95b3lvLmNvbS9cIjtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDotYTmupDlkI7nvIDniYjmnKzlj7dcclxuICAgICAqL1xyXG4gICAgc3RhdGljICB2ZXJzaW9uczpzdHJpbmcgPSBcIlwiOy8vXCI/dj0xLjAuN1wiO1xyXG5cclxuICAgIHN0YXRpYyAgaW5pdFdpZHRoOm51bWJlciA9IDcyMDsgXHJcblxyXG4gICAgc3RhdGljICBpbml0SGVpZ2h0Om51bWJlciA9IDEyODA7IFxyXG4gICAgLyoqXHJcbiAgICAgKiDotYTmupDniYjmnKzlj7dcclxuICAgICAqL1xyXG4gICAgc3RhdGljICByZXNjb25maWdWZXJzaW9uOnN0cmluZyA9IFwiXCI7XHJcbiAgICAvKipcclxuICAgICAqIOW9k+WJjeW5s+WPsFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIG5vd3BsYXRmcm9tOnN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPliY3muLjmiI9hcHBpZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIGFwcGlkOnN0cmluZyA9IFwid3g0NmY0NjI2OTMyZTVmNDhiXCI7IFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ri45oiP54mI5pys5Y+3XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgZ2FtZVZlcnNpb246c3RyaW5nID0gXCIxLjAuMVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm6LCD6K+V54mI5pysXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgaXNkZWJ1Zzpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc3RhdGljICBBcHBLZXlJRDpudW1iZXIgPSAwO1xyXG4gICAgc3RhdGljICBNZW1iZXJJRDpudW1iZXIgPSAwO1xyXG5cclxuXHJcbiAgICBzdGF0aWMgIGN1ckhlaWdodCgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBMYXlhLnN0YWdlLmhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGN1cldpZHRoKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIExheWEuc3RhZ2Uud2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBzZXRWYXJzKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEdsb2JhbC5zdGFnZSA9IExheWEuc3RhZ2U7XHJcbiAgICAgICAgR2xvYmFsLnNldGh0dHB1cmwoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGdldFVybCggdXJsOnN0cmluZyApOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIGlmKHVybC5pbmRleE9mKFwid3hsb2NhbFwiKT09LTEpXHJcbiAgICAgICAgeyBcclxuICAgICAgICAgICAgcmV0dXJuIEdsb2JhbC5yZXNvdXJjZWh0dHRwICsgdXJsICsgR2xvYmFsLnZlcnNpb25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyAgc2V0aHR0cHVybCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggR2xvYmFsLmlzZGVidWcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLmh0dHB1cmwgPSBcImh0dHBzOi8vd3hnYW1lZGV2LjUxeW95b3lvLmNvbS9cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLmh0dHB1cmwgPSBcImh0dHBzOi8vbWlucG9ydC41MXlveW95by5jb20vXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiXHJcbmV4cG9ydCAgY2xhc3MgR2xvYmFsV2FpdGluZyBleHRlbmRzIGZhaXJ5Z3VpLkdDb21wb25lbnRcclxue1xyXG4gICAgaW1nXzA6ZmFpcnlndWkuR0ltYWdlO1xyXG4gICAgcHJpdmF0ZSBfaXNmb3JjZWhpZGU6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcbiAgICBcclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RGcm9tWE1MKHhtbDphbnkpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNldFNpemUoZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCxmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodCk7XHJcbiAgICAgICAgc3VwZXIuY29uc3RydWN0RnJvbVhNTCh4bWwpO1xyXG4gICAgICAgIHRoaXMuaW1nXzAgPSB0aGlzLmdldENoaWxkKFwiaW1nXzBcIikuYXNJbWFnZTtcclxuICAgICAgICB0aGlzLmltZ18wLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9uKExheWEuRXZlbnQuRElTUExBWSx0aGlzLHRoaXMub25BZGRlZFRvU3RhZ2UpO1xyXG4gICAgICAgIHRoaXMub24oIExheWEuRXZlbnQuVU5ESVNQTEFZLHRoaXMsdGhpcy5vblJlbW92ZUZyb21TdGFnZSk7ICAgICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbGFzdFRpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgb25BZGRlZFRvU3RhZ2UoKTp2b2lkIHtcclxuICAgICAgICB0aGlzLl9sYXN0VGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICBMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCB0aGlzLm9uVGltZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25UaW1lcigpOnZvaWQge1xyXG4gICAgICAgIGlmKHRoaXMuaW1nXzApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbm93dGltZTpudW1iZXIgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgICAgIHZhciBkaXN0aW1lOm51bWJlciA9IG5vd3RpbWUtdGhpcy5fbGFzdFRpbWU7XHJcbiAgICAgICAgICAgIGlmKCBkaXN0aW1lIC8xMDAwID49IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggIXRoaXMuX2lzZm9yY2VoaWRlIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmltZ18wLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIGk6bnVtYmVyID0gdGhpcy5pbWdfMC5yb3RhdGlvbjtcclxuICAgICAgICAgICAgICAgIGkgKz0gMTA7XHJcbiAgICAgICAgICAgICAgICBpZihpID4gMzYwKVxyXG4gICAgICAgICAgICAgICAgICAgIGkgPSBpICUgMzYwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbWdfMC5yb3RhdGlvbiA9IGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZ18wLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGlkZWltZygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2ZvcmNlaGlkZSA9IHRydWU7XHJcbiAgICAgICAgaWYoIHRoaXMuaW1nXzAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pbWdfMC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcml2YXRlIG9uUmVtb3ZlRnJvbVN0YWdlKCk6dm9pZCB7XHJcbiAgICAgICAgTGF5YS50aW1lci5jbGVhcih0aGlzLCB0aGlzLm9uVGltZXIpO1xyXG4gICAgfVxyXG59IiwiXHJcbmV4cG9ydCBjbGFzcyBKb3lzdGlja01vZHVsZSBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyIHtcclxuICAgIHByaXZhdGUgX0luaXRYOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9Jbml0WTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfc3RhcnRTdGFnZVg6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX3N0YXJ0U3RhZ2VZOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9sYXN0U3RhZ2VYOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9sYXN0U3RhZ2VZOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9idXR0b246TGF5YS5Qb2ludDtcclxuICAgIHByaXZhdGUgdG91Y2hJZDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfY3VyUG9zOiBMYXlhLlBvaW50O1xyXG4gICAgLy8gcHJpdmF0ZSBfY2VudGVyOmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgIFxyXG4gICAgcHVibGljIHN0YXRpYyBKb3lzdGlja01vdmluZzogc3RyaW5nID0gXCJKb3lzdGlja01vdmluZ1wiO1xyXG4gICAgcHVibGljIHN0YXRpYyBKb3lzdGlja1VwOiBzdHJpbmcgPSBcIkpveXN0aWNrVXBcIjtcclxuXHJcbiAgICBwdWJsaWMgcmFkaXVzOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9jbGlja3BhbmVsOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBwdWJsaWMgZGlzOm51bWJlciA9IDA7IFxyXG4gICAgcHVibGljIGRlZ3JlZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGFuZ2xlOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIG9mZng6bnVtYmVyID0gMDtcclxuXHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWNrcGFuZWw6ZmFpcnlndWkuR0xvYWRlcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fY2xpY2twYW5lbCA9IGNsaWNrcGFuZWw7XHJcbiAgICAgICAgdGhpcy5fYnV0dG9uID0gbmV3IExheWEuUG9pbnQoKTtcclxuICAgICAgICB0aGlzLnRvdWNoSWQgPSAtMTtcclxuICAgICAgICB0aGlzLnJhZGl1cyA9IDQwMDtcclxuICAgICAgICB0aGlzLl9jdXJQb3MgPSBuZXcgTGF5YS5Qb2ludCgpO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrcGFuZWwub24oTGF5YS5FdmVudC5NT1VTRV9ET1dOLHRoaXMsIHRoaXMub25Ub3VjaERvd24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2lzY2FuQ0JhY2s6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBvblRvdWNoRG93bihldnQ6IExheWEuRXZlbnQpIHtcclxuICAgICAgICBpZih0aGlzLnRvdWNoSWQgPT0gLTEpIHsvL0ZpcnN0IHRvdWNoXHJcbiAgICAgICAgICAgIHRoaXMudG91Y2hJZCA9IGV2dC50b3VjaElkO1xyXG4gICAgICAgICAgICB0aGlzLm9mZnggPSAwO1xyXG4gICAgICAgICAgICB0aGlzLl9pc2NhbkNCYWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuZ2xvYmFsVG9Mb2NhbChMYXlhLnN0YWdlLm1vdXNlWCwgTGF5YS5zdGFnZS5tb3VzZVksdGhpcy5fY3VyUG9zKTtcclxuICAgICAgICAgICAgdmFyIGJ4OiBudW1iZXIgPSB0aGlzLl9jdXJQb3MueDtcclxuICAgICAgICAgICAgdmFyIGJ5OiBudW1iZXIgPSB0aGlzLl9jdXJQb3MueTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFN0YWdlWCA9IGJ4O1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0U3RhZ2VZID0gYnk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U3RhZ2VYID0gYng7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U3RhZ2VZID0gYnk7XHJcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbi54ID0gYng7XHJcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbi55ID0gYnk7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9jYWxsb2JqICYmIHRoaXMuX2Rvd25DYWxsYmFjayApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Rvd25DYWxsYmFjay5jYWxsKCB0aGlzLl9jYWxsb2JqICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vbihMYXlhLkV2ZW50Lk1PVVNFX01PVkUsdGhpcyx0aGlzLk9uVG91Y2hNb3ZlKTtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vbihMYXlhLkV2ZW50Lk1PVVNFX1VQLHRoaXMsdGhpcy5PblRvdWNoVXApO1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9uKCBMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMuT25Ub3VjaFVwICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIF9jYWxsb2JqOmFueTtcclxuICAgIHByaXZhdGUgX21vdmVjYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHByaXZhdGUgX3VwZGF0ZWNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHJpdmF0ZSBfZG93bkNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIHNldEV2ZW50Q2FsbGJhY2soIGNhbGxvYmo6YW55LGRvd25DYWxsYmFjayxtb3ZlY2FsbGJhY2s6RnVuY3Rpb24sdXBjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9jYWxsb2JqID0gY2FsbG9iajtcclxuICAgICAgICB0aGlzLl9kb3duQ2FsbGJhY2sgPSBkb3duQ2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5fbW92ZWNhbGxiYWNrID0gbW92ZWNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuX3VwZGF0ZWNhbGxiYWNrID0gdXBjYWxsYmFjaztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVHJpZ2dlcihldnQ6IExheWEuRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uVG91Y2hEb3duKGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgdGlsZWRNYXA6TGF5YS5UaWxlZE1hcDtcclxuXHRcdHByaXZhdGUgbUxhc3RNb3VzZVg6IG51bWJlciA9IDA7XHJcblx0XHRwcml2YXRlIG1MYXN0TW91c2VZOiBudW1iZXIgPSAwO1xyXG5cdFx0cHJpdmF0ZSBtWDogbnVtYmVyID0gMDtcclxuXHRcdHByaXZhdGUgbVk6IG51bWJlciA9IDA7XHJcbiAgICBcdC8v5Yib5bu65Zyw5Zu+XHJcblx0XHRwcml2YXRlIGNyZWF0ZU1hcCgpIHtcclxuXHRcdFx0Ly/liJvlu7rlnLDlm77lr7nosaFcclxuXHRcdFx0dGhpcy50aWxlZE1hcCA9IG5ldyBMYXlhLlRpbGVkTWFwKCk7XHJcblxyXG5cdFx0XHR0aGlzLm1YID0gdGhpcy5tWSA9IDA7XHJcblx0XHRcdC8v5Yib5bu65Zyw5Zu+77yM6YCC5b2T55qE5pe25YCZ6LCD55SoZGVzdG9yeemUgOavgeWcsOWbvlxyXG5cdFx0XHR0aGlzLnRpbGVkTWFwLmNyZWF0ZU1hcChcInJlcy90aWxlZE1hcC9kZXNlcnQuanNvblwiLCBuZXcgTGF5YS5SZWN0YW5nbGUoMCwgMCwgTGF5YS5Ccm93c2VyLndpZHRoLCBMYXlhLkJyb3dzZXIuaGVpZ2h0KSwgbmV3IExheWEuSGFuZGxlcih0aGlzLCB0aGlzLmNvbXBsZXRlSGFuZGxlcikpO1xyXG5cdFx0fVxyXG5cdFx0LyoqXHJcblx0XHQgKiDlnLDlm77liqDovb3lrozmiJDnmoTlm57osINcclxuXHRcdCAqL1xyXG5cdFx0cHJpdmF0ZSBjb21wbGV0ZUhhbmRsZXIoKTogdm9pZCB7XHJcblx0XHRcdGNvbnNvbGUubG9nKFwi5Zyw5Zu+5Yib5bu65a6M5oiQXCIpO1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcIkNsaWVudFc6XCIgKyBMYXlhLkJyb3dzZXIuY2xpZW50V2lkdGggKyBcIiBDbGllbnRIOlwiICsgTGF5YS5Ccm93c2VyLmNsaWVudEhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG5cclxuICAgXHJcblxyXG4gICAgcHJpdmF0ZSBPblRvdWNoVXAoZXZ0OkxheWEuRXZlbnQ9bnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmKHRoaXMudG91Y2hJZCAhPSAtMSAmJiBldnQudG91Y2hJZCA9PSB0aGlzLnRvdWNoSWQpIHtcclxuICAgICAgICAgICAgdGhpcy50b3VjaHVwKCk7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9jYWxsb2JqICYmIHRoaXMuX3VwZGF0ZWNhbGxiYWNrIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlY2FsbGJhY2suY2FsbCggdGhpcy5fY2FsbG9iaiApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2lhY2FuQ2FsbGJhY2s6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHRvdWNodXAoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNjYW5DQmFjayA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudG91Y2hJZCA9IC0xO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrcGFuZWwub2ZmKExheWEuRXZlbnQuTU9VU0VfTU9WRSx0aGlzLHRoaXMuT25Ub3VjaE1vdmUpO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrcGFuZWwub2ZmKExheWEuRXZlbnQuTU9VU0VfVVAsdGhpcyx0aGlzLk9uVG91Y2hVcCk7XHJcbiAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vZmYoIExheWEuRXZlbnQuTU9VU0VfT1VULHRoaXMsdGhpcy5PblRvdWNoVXAgKTtcclxuICAgICAgICB0aGlzLl9pYWNhbkNhbGxiYWNrID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5kZWdyZWUgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgT25Ub3VjaE1vdmUoZXZ0OiBMYXlhLkV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYodGhpcy50b3VjaElkICE9IC0xICYmIGV2dC50b3VjaElkID09IHRoaXMudG91Y2hJZCkge1xyXG4gICAgICAgICAgICB2YXIgYng6IG51bWJlciA9IExheWEuc3RhZ2UubW91c2VYO1xyXG4gICAgICAgICAgICB2YXIgYnk6IG51bWJlciA9IExheWEuc3RhZ2UubW91c2VZO1xyXG4gICAgICAgICAgICB2YXIgbW92ZVg6IG51bWJlciA9IGJ4IC0gdGhpcy5fbGFzdFN0YWdlWDtcclxuICAgICAgICAgICAgdmFyIG1vdmVZOiBudW1iZXIgPSBieSAtIHRoaXMuX2xhc3RTdGFnZVk7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTdGFnZVggPSBieDtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFN0YWdlWSA9IGJ5O1xyXG4gICAgICAgICAgICB2YXIgYnV0dG9uWDogbnVtYmVyID0gdGhpcy5fYnV0dG9uLnggKyBtb3ZlWDtcclxuICAgICAgICAgICAgdmFyIGJ1dHRvblk6IG51bWJlciA9IHRoaXMuX2J1dHRvbi55ICsgbW92ZVk7XHJcblxyXG4gICAgICAgICAgICB2YXIgb2Zmc2V0WDogbnVtYmVyID0gYnV0dG9uWCAtIHRoaXMuX3N0YXJ0U3RhZ2VYO1xyXG4gICAgICAgICAgICB2YXIgb2Zmc2V0WTogbnVtYmVyID0gYnV0dG9uWSAtIHRoaXMuX3N0YXJ0U3RhZ2VZO1xyXG4gICAgICAgICAgICB2YXIgZGlzWDpudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICBpZiggbW92ZVggPj0gMiB8fCBtb3ZlWCA8PSAtMiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzY2FuQ0JhY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNjYW5DQmFjayA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMub2ZmeCA9IG1vdmVYO1xyXG4gICAgICAgICAgICBpZiggb2Zmc2V0WCA9PSAwICYmIG9mZnNldFkgPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggb2Zmc2V0WCA+IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggb2Zmc2V0WCA+IHRoaXMucmFkaXVzIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNYID0gdGhpcy5yYWRpdXM7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmdsZSA9IDkwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc1ggPSB0aGlzLnJhZGl1cyAtIG9mZnNldFg7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmdsZSA9IDkwIC0gZGlzWC90aGlzLnJhZGl1cyAqIDkwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIG9mZnNldFggPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYW5nbGUgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIC1vZmZzZXRYID4gdGhpcy5yYWRpdXMgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc1ggPSB0aGlzLnJhZGl1cztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuZ2xlID0gLTkwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc1ggPSB0aGlzLnJhZGl1cyArIG9mZnNldFg7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmdsZSA9IC0oOTAtZGlzWC90aGlzLnJhZGl1cyAqIDkwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcmFkOiBudW1iZXIgPSBNYXRoLmF0YW4yKG9mZnNldFksb2Zmc2V0WCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGVncmVlID0gcmFkO1xyXG4gICAgICAgICAgICB2YXIgbWF4WDogbnVtYmVyID0gdGhpcy5yYWRpdXMgKiBNYXRoLmNvcyhyYWQpO1xyXG4gICAgICAgICAgICB2YXIgbWF4WTogbnVtYmVyID0gdGhpcy5yYWRpdXMgKiBNYXRoLnNpbihyYWQpO1xyXG4gICAgICAgICAgICBpZihNYXRoLmFicyhvZmZzZXRYKSA+IE1hdGguYWJzKG1heFgpKVxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0WCA9IG1heFg7XHJcbiAgICAgICAgICAgIGlmKE1hdGguYWJzKG9mZnNldFkpID4gTWF0aC5hYnMobWF4WSkpXHJcbiAgICAgICAgICAgICAgICBvZmZzZXRZID0gbWF4WTtcclxuICAgICAgICAgICAgYnV0dG9uWCA9IHRoaXMuX3N0YXJ0U3RhZ2VYICsgb2Zmc2V0WDtcclxuICAgICAgICAgICAgYnV0dG9uWSA9IHRoaXMuX3N0YXJ0U3RhZ2VZICsgb2Zmc2V0WTtcclxuICAgICAgICAgICAgaWYoYnV0dG9uWCA8IDApXHJcbiAgICAgICAgICAgICAgICBidXR0b25YID0gMDtcclxuICAgICAgICAgICAgaWYoYnV0dG9uWSA+IGZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgYnV0dG9uWSA9IGZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0O1xyXG4gICAgICAgICAgICB0aGlzLl9idXR0b24ueCA9IGJ1dHRvblg7XHJcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbi55ID0gYnV0dG9uWTtcclxuICAgICAgICAgICAgdGhpcy5kaXMgPSBNYXRoLnNxcnQoIG9mZnNldFgqb2Zmc2V0WCArIG9mZnNldFkqb2Zmc2V0WSApO1xyXG4gICAgICAgICAgICB0aGlzLl9pYWNhbkNhbGxiYWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX2lzY2FuQ0JhY2sgJiYgdGhpcy5fY2FsbG9iaiAmJiB0aGlzLl9tb3ZlY2FsbGJhY2sgJiYgdGhpcy5faWFjYW5DYWxsYmFjayApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVjYWxsYmFjay5jYWxsKCB0aGlzLl9jYWxsb2JqLHRoaXMub2ZmeCApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2NsaWNrcGFuZWwub2ZmKExheWEuRXZlbnQuTU9VU0VfRE9XTix0aGlzLCB0aGlzLm9uVG91Y2hEb3duKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi9HbG9iYWxcIjtcclxuaW1wb3J0IFN0YWdlID0gTGF5YS5TdGFnZTtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQgeyBHYW1lQ29udGVudHMgfSBmcm9tIFwiLi9HYW1lQ29udGVudHNcIjtcclxuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi9XWFNESy9TZGtcIjtcclxuY2xhc3MgTWFpbiB7XHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHQvL+agueaNrklEReiuvue9ruWIneWni+WMluW8leaTjlx0XHRcclxuICAgICAgICAvLyBMYXlhLmluaXQoR2xvYmFsLmluaXRXaWR0aCwgR2xvYmFsLmluaXRIZWlnaHQsIExheWFbXCJXZWJHTFwiXSk7XHJcbiAgICAgICAgTGF5YTNELmluaXQoR2xvYmFsLmluaXRXaWR0aCwgR2xvYmFsLmluaXRIZWlnaHQpO1xyXG5cdFx0TGF5YS5zdGFnZS5zY2FsZU1vZGUgPSBTdGFnZS5TQ0FMRV9GSVhFRF9XSURUSDtcclxuICAgICAgICBMYXlhLnN0YWdlLmFsaWduSCA9IFN0YWdlLkFMSUdOX0NFTlRFUjtcclxuICAgICAgICBMYXlhLnN0YWdlLmFsaWduViA9IFN0YWdlLkFMSUdOX1RPUDtcclxuICAgICAgICBMYXlhLnN0YWdlLnNjcmVlbk1vZGUgPSBTdGFnZS5TQ1JFRU5fVkVSVElDQUw7XHJcblx0XHRMYXlhLnN0YWdlLmJnQ29sb3IgPSBcIiM1NEI5RjZcIjtcclxuICAgICAgICAvLyBMYXlhLlN0YXQuc2hvdygpO1xyXG4gICAgICAgIExheWEuYWxlcnRHbG9iYWxFcnJvciA9IHRydWU7XHJcbiAgICAgICAgd2luZG93WydDb25maWczRCddICYmICh3aW5kb3dbJ0NvbmZpZzNEJ11bXCJfZGVmYXVsdFwiXVtcIl9kZWZhdWx0UGh5c2ljc01lbW9yeVwiXSA9IDEyOCk7XHJcbiAgICAgICAgaWYoTGF5YS5Ccm93c2VyLndpbmRvdy50dClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIFd4QXBpLld4SW5pdCgpO1xyXG4gICAgICAgICAgICBXeEFwaS5DaGVja1dYVXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuc3RhZ2Uub24oXCJyZXNpemVcIiwgdGhpcywgdGhpcy5vblJlc2l6ZSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIG9uUmVzaXplKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEuc3RhZ2Uub2ZmKFwicmVzaXplXCIsIHRoaXMsIHRoaXMub25SZXNpemUpO1xyXG4gICAgICAgIEdsb2JhbC5zZXRWYXJzKCk7IFxyXG4gICAgICAgIEFzc2V0UGF0aC5pbml0KCk7ICBcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5wYWNrYWdlRmlsZUV4dGVuc2lvbiA9IFwiYmluXCI7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcudGV4dHVyZUxpbmVhclNhbXBsaW5nID0gdHJ1ZTtcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5kZWZhdWx0Rm9udCA9IFwi6buR5L2TXCI7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcudmVyc2lvbnM9R2xvYmFsLnZlcnNpb25zO1xyXG4gICAgICAgIHZhciBnYW1lQ29udGVudDpHYW1lQ29udGVudHMgPSBuZXcgR2FtZUNvbnRlbnRzKCk7XHJcbiAgICAgICAgZ2FtZUNvbnRlbnQuaW5pdEdhbWUoKTtcclxuICAgICAgICBcclxuICAgIH1cclxufVxyXG4vL+a/gOa0u+WQr+WKqOexu1xyXG5uZXcgTWFpbigpO1xyXG4iLCJpbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi9Qcm9wTWFuYWdlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENoYXJhY3RlclBvb2xcclxue1xyXG4gICAgc3RhdGljIHJvbGVkaWN0OmFueSA9IHt9O1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQWRkQ2hhcmFjdGVyKCByZXNvdWNlTmFtZTpzdHJpbmcsY2xhczphbnkscGFyZW50OmFueSApOkxheWEuU3ByaXRlM0RcclxuICAgIHtcclxuICAgICAgICB2YXIgc2tpbm5lZG1lc2g6TGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PExheWEuU3ByaXRlM0Q+ID0gQ2hhcmFjdGVyUG9vbC5yb2xlZGljdFtyZXNvdWNlTmFtZV07XHJcbiAgICAgICAgaWYoIGFyciAmJiBhcnIubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBza2lubmVkbWVzaCA9IGFyci5zaGlmdCgpO1xyXG4gICAgICAgICAgICBza2lubmVkbWVzaC5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQoIHNraW5uZWRtZXNoICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzcDpMYXlhLlNwcml0ZTNEID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbChyZXNvdWNlTmFtZSkpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIHNraW5uZWRtZXNoID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShzcCxwYXJlbnQsIGZhbHNlLG5ldyBMYXlhLlZlY3RvcjMoIDAsMCwwICkpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGNsYXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2xhOmFueSA9IHNraW5uZWRtZXNoLmFkZENvbXBvbmVudCggY2xhcyApO1xyXG4gICAgICAgICAgICBjbGEucmVzb3VzZU5hbWUgPSByZXNvdWNlTmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIF9vdXQ6TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjtcclxuICAgICAgICBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSggbmV3IExheWEuVmVjdG9yMyggMCwxLDAgKSwxODAqTWF0aC5QSS8xODAsX291dCApO1xyXG4gICAgICAgIHNraW5uZWRtZXNoLnRyYW5zZm9ybS5yb3RhdGlvbiA9IF9vdXQ7XHJcbiAgICAgICAgcmV0dXJuIHNraW5uZWRtZXNoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQ2xlYXJDaGFyYWN0ZXIoIHNwOkxheWEuU3ByaXRlM0QscmVzb3VjZU5hbWU6c3RyaW5nLGNsYTpMYXlhLlNjcmlwdDNEICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhQ2hhcmFjdGVyUG9vbC5yb2xlZGljdFtyZXNvdWNlTmFtZV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgQ2hhcmFjdGVyUG9vbC5yb2xlZGljdFtyZXNvdWNlTmFtZV0gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoY2xhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2xhLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3AuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgc3AucmVtb3ZlU2VsZigpO1xyXG4gICAgICAgIENoYXJhY3RlclBvb2wucm9sZWRpY3RbcmVzb3VjZU5hbWVdLnB1c2goIHNwICk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgQ2hhcmFjdGVyU3RhdGVcclxue1xyXG5cclxuICAgIC8qKuS+p+e/uyAgY2VmYW4xICovXHJcbiAgICBzdGF0aWMgcm9sbG92ZXIxOnN0cmluZyA9IFwicm9sbG92ZXIxXCI7XHJcbiAgICAvKirkvqfnv7sgIGNlZmFuMiAqL1xyXG4gICAgc3RhdGljIHJvbGxvdmVyMjpzdHJpbmcgPSBcInJvbGxvdmVyMlwiO1xyXG4gICAgLyoq6LeR5aKZ5bemICBwYW9xaWFuZ2xlZnQgKi9cclxuICAgIHN0YXRpYyBydW53YWxsbGVmdDpzdHJpbmcgPSBcInJ1bndhbGxsZWZ0XCI7XHJcbiAgICAvKirlj7Pot7MgIHJpZ2h0anVtcCAqL1xyXG4gICAgc3RhdGljIHJpZ2h0anVtcDpzdHJpbmcgPSBcInJpZ2h0anVtcFwiO1xyXG4gICAgLyoq6LeR5aKZ5Y+zICBwYW9xaWFuZ3JpZ2h0ICovXHJcbiAgICBzdGF0aWMgcnVud2FsbHJpZ2h0OnN0cmluZyA9IFwicnVud2FsbHJpZ2h0XCI7XHJcbiAgICAvKirlt6bot7MgIGxlZnRqdW1wKi9cclxuICAgIHN0YXRpYyBsZWZ0anVtcDpzdHJpbmcgPSBcImxlZnRqdW1wXCI7XHJcbiAgICAvKirniKzlopkgIHBhcWlhbmcgKi9cclxuICAgIHN0YXRpYyBjbGltYndhbGw6c3RyaW5nID0gXCJjbGltYndhbGxcIjtcclxuICAgIC8qKiDvvJ8gICBjbGltYmVuZCAqL1xyXG4gICAgc3RhdGljIGNsaW1iZW5kOnN0cmluZyA9IFwiY2xpbWJlbmRcIjtcclxuICAgIC8qKuermeeriyAgc3RhbmQqL1xyXG4gICAgc3RhdGljIHN0YW5kOnN0cmluZyA9IFwic3RhbmRcIjtcclxuICAgIC8qKuepuuS4rSAga29uZ3pob25nICovXHJcbiAgICBzdGF0aWMgc2t5OnN0cmluZyA9IFwic2t5XCI7XHJcbiAgICAvKirokL3lnLAgIGx1b2RpMSAqL1xyXG4gICAgc3RhdGljIGxhbmQxOnN0cmluZyA9IFwibGFuZDFcIjtcclxuICAgIC8qKuiQveWcsCAgbHVvZGkyICovXHJcbiAgICBzdGF0aWMgbGFuZDI6c3RyaW5nID0gXCJsYW5kMlwiO1xyXG4gICAgLyoq5aSn6LezICBkYXRpYW8xICovXHJcbiAgICBzdGF0aWMgaGlnaGp1bXAxOnN0cmluZyA9IFwiaGlnaGp1bXAxXCI7XHJcbiAgICAvKirlpKfot7MgIGRhdGlhbzIgKi9cclxuICAgIHN0YXRpYyBoaWdoanVtcDI6c3RyaW5nID0gXCJoaWdoanVtcDJcIjtcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKirot5HliqggcnVuICovXHJcbiAgICBzdGF0aWMgcnVuOnN0cmluZyA9IFwicnVuXCI7XHJcbiAgICAvKirot7Pot4MganVtcCovXHJcbiAgICBzdGF0aWMganVtcDpzdHJpbmcgPSBcImp1bXBcIjtcclxuICAgIC8qKueIrOWNhyAgQ2xpbWIgKi9cclxuICAgIHN0YXRpYyBjbGltYnVwOnN0cmluZyA9IFwiY2xpbWJ1cFwiO1xyXG4gICAgLyoq6Ieq55Sx6JC95L2TIEZyZWVmYWxsaW5nICovXHJcbiAgICBzdGF0aWMgZmFsbGRvd246c3RyaW5nID0gXCJmYWxsZG93blwiO1xyXG4gICAgLyoq5bem54isICBsZWZ0X2NsaW1iICovXHJcbiAgICBzdGF0aWMgY2xpbWJsZWZ0OnN0cmluZyA9IFwiY2xpbWJsZWZ0XCI7XHJcbiAgICAvKirlj7PniKwgIHJpZ2h0X2NsaW1iKi9cclxuICAgIHN0YXRpYyBjbGltYnJpZ2h0OnN0cmluZyA9IFwiY2xpbWJyaWdodFwiO1xyXG4gICAgLyoq5Y+z6LezIHJpZ2h0X2p1bXAgKi9cclxuICAgIHN0YXRpYyBqdW1wcmlnaHQ6c3RyaW5nID0gXCJqdW1wcmlnaHRcIjtcclxuICAgIC8qKuW3pui3syBsZWZ0X2p1bXAgKi9cclxuICAgIHN0YXRpYyBqdW1wbGVmdDpzdHJpbmcgPSBcImp1bXBsZWZ0XCI7XHJcbiAgICAvKiogUGxheVBhbG91QWN0aW9uKi9cclxuICAgIHN0YXRpYyBDbGltYk1vdGlvbjpzdHJpbmcgPSBcIkNsaW1iTW90aW9uXCI7XHJcblxyXG4gICAgLyoqIO+8nyAgaHVhY2hhbiAqL1xyXG4gICAgc3RhdGljIGh1YWNoYW46c3RyaW5nID0gXCJodWFjaGFuXCI7XHJcbiAgICAvKirot6jmoI8gIGt1YWxhbiAqL1xyXG4gICAgc3RhdGljIGh1cmRsZTpzdHJpbmcgPSBcImh1cmRsZVwiO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOmAn+adv+i3s+i3gyBqaWFzdUp1bXBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNwZWVkdXBqdW1wOnN0cmluZyA9IFwic3BlZWR1cGp1bXBcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIHjmlrnlkJHnnqznp7sgIHhzaHVueWlcclxuICAgICAqL1xyXG4gICAgc3RhdGljIE1vdmVYOnN0cmluZyA9IFwiTW92ZVhcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS4i+a7keS9jeenuyBkb3duU2xpZGVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGRvd25tb3ZlOnN0cmluZyA9IFwiZG93bm1vdmVcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS+p+mdouWKoOmAnyAgc2xpZGVqaWFzdVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2lkZXNwZWVkdXA6c3RyaW5nID0gXCJzaWRlc3BlZWR1cFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog57+76LaKICBzdXJtb3VudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3Jvc3M6c3RyaW5nID0gXCJjcm9zc1wiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog6ZSB5a6a54is5Y2HICBsb2NrY2xpbWJcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNsaW1idXBibG9jazpzdHJpbmcgPSBcImNsaW1idXBibG9ja1wiO1xyXG59IiwiLypcclxuKiDlr7nosaHmsaDnsbtcclxuKi9cclxuaW1wb3J0IEFuaW1hdGlvbiA9IExheWEuQW5pbWF0aW9uO1xyXG5cdGltcG9ydCBTdGFnZSA9IExheWEuU3RhZ2U7XHJcblx0aW1wb3J0IFJlY3RhbmdsZSA9IExheWEuUmVjdGFuZ2xlO1xyXG5cdGltcG9ydCBMb2FkZXIgPSBMYXlhLkxvYWRlcjtcclxuXHRpbXBvcnQgQnJvd3NlciA9IExheWEuQnJvd3NlcjtcclxuICAgIGltcG9ydCBXZWJHTCA9IExheWEuV2ViR0w7XHJcbiAgICBcclxuXHJcbmV4cG9ydCBjbGFzcyBHYW1lUG9vbCBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIHNwcml0ZTNEQXJyYXk6YW55ID0ge307XHJcbiAgICBwcml2YXRlIHN0YXRpYyBjb250YWluOmFueT17fTtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEFuaUNvbmZQYXRoOiBzdHJpbmcgPSBcInJlcy9maWdodGVyL2ZpZ2h0ZXIuanNvblwiO1xyXG5cclxuICAgIFxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgUmVtb3ZlSXRlbSgga2V5OnN0cmluZywgb2JqOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggR2FtZVBvb2wuY29udGFpbltrZXldIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpbmRleDpudW1iZXIgPSBHYW1lUG9vbC5jb250YWluW2tleV0uaW5kZXhPZiggb2JqICk7XHJcbiAgICAgICAgICAgIGlmKGluZGV4ID09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBHYW1lUG9vbC5jb250YWluW2tleV0ucHVzaCggb2JqICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBHZXRJdGVtKCBrZXk6c3RyaW5nLC4uLmFyZ3M6YW55W10gKTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggR2FtZVBvb2wuY29udGFpbltrZXldIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8YW55PiA9IEdhbWVQb29sLmNvbnRhaW5ba2V5XTtcclxuICAgICAgICAgICAgaWYoIGFyci5sZW5ndGggPT0wIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNhbHNzb2JqOmFueSA9IEdhbWVQb29sLnNwcml0ZTNEQXJyYXlba2V5XTtcclxuICAgICAgICAgICAgICAgIHZhciB2bzphbnkgPSBuZXcgY2Fsc3NvYmooKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gR2FtZVBvb2wuY29udGFpbltrZXldLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCBcIuatpGtleeWAvOWvueW6lOeahOexu+acquiiq+azqOWGjFwiICk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVBbmltYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIGFuaTogQW5pbWF0aW9uID0gbmV3IEFuaW1hdGlvbigpO1xyXG4gICAgICAgIGFuaS5sb2FkQXRsYXModGhpcy5BbmlDb25mUGF0aCk7IC8vIOWKoOi9veWbvumbhuWKqOeUu1xyXG4gICAgICAgIGFuaS5pbnRlcnZhbCA9IDMwOyAvLyDorr7nva7mkq3mlL7pl7TpmpTvvIjljZXkvY3vvJrmr6vnp5LvvIlcclxuICAgICAgICBhbmkuaW5kZXggPSAxOyAvLyDlvZPliY3mkq3mlL7ntKLlvJVcclxuICAgICAgICBhbmkucGxheSgpOyAvLyDmkq3mlL7lm77pm4bliqjnlLtcclxuXHJcbiAgICAgICAgLy8g6I635Y+W5Yqo55S755qE6L6555WM5L+h5oGvXHJcbiAgICAgICAgdmFyIGJvdW5kczogUmVjdGFuZ2xlID0gYW5pLmdldEdyYXBoaWNCb3VuZHMoKTtcclxuICAgICAgICBhbmkucGl2b3QoYm91bmRzLndpZHRoIC8gMiwgYm91bmRzLmhlaWdodCAvIDIpO1xyXG5cclxuICAgICAgICBhbmkucG9zKExheWEuc3RhZ2Uud2lkdGggLyAyLCBMYXlhLnN0YWdlLmhlaWdodCAvIDIpO1xyXG5cclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGFuaSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldEl0ZW1GYWlyeUdVSSggdXJsOnN0cmluZyApOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhR2FtZVBvb2wuY29udGFpblt1cmxdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEdhbWVQb29sLmNvbnRhaW5bdXJsXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSBHYW1lUG9vbC5jb250YWluW3VybF07XHJcbiAgICAgICAgaWYoIGFyci5sZW5ndGggPT0wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2bzphbnkgPSBmYWlyeWd1aS5VSVBhY2thZ2UuY3JlYXRlT2JqZWN0RnJvbVVSTCggdXJsICk7XHJcbiAgICAgICAgICAgIHJldHVybiB2bztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEdhbWVQb29sLmNvbnRhaW5bdXJsXS5zaGlmdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTWFyaygga2V5OnN0cmluZywgY2xhc3Nhcmc6YW55ICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEdhbWVQb29sLnNwcml0ZTNEQXJyYXlba2V5XSA9IGNsYXNzYXJnO1xyXG4gICAgICAgIEdhbWVQb29sLmNvbnRhaW5ba2V5XSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG59IiwiaW1wb3J0IHtTaW5nbGV0b259IGZyb20gXCIuLi91dGlscy9TaW5nbGV0b25cIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIFBhbmVsUmVzRGljIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlBhbmVsUmVzRGljO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIF9tYXB2aWV3RGljdDphbnk9e307XHJcblxyXG5cdGNvbnN0cnVjdG9yKCkgXHJcblx0e1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgUGFuZWxSZXNEaWMuaW5zID0gdGhpcztcclxuXHR9XHJcblx0XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBQYW5lbFJlc0RpY1xyXG5cdHtcclxuICAgICAgICBpZihQYW5lbFJlc0RpYy5pbnMgPT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFuZWxSZXNEaWMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFBhbmVsUmVzRGljLmlucztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFZpZXcoIHZpZXdrZXk6c3RyaW5nICk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgaWYoICFQYW5lbFJlc0RpYy5fbWFwdmlld0RpY3Rbdmlld2tleV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgXCJlcnIwIOacque7keWumueahHZpZXdrZXk6XCIgKyB2aWV3a2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUGFuZWxSZXNEaWMuX21hcHZpZXdEaWN0W3ZpZXdrZXldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIHB1YmxpYyBnZXRTaW5nbGVUb24ocmVmOmFueSk6YW55XHJcblx0e1xyXG4gICAgICAgIHJldHVybiBTaW5nbGV0b24uSW5zdGFuY2UocmVmKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcblxyXG4gICAgcHVibGljIG1hcFZpZXcoIHZpZXdrZXk6c3RyaW5nLHJlZjphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoICFQYW5lbFJlc0RpYy5fbWFwdmlld0RpY3Rbdmlld2tleV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgUGFuZWxSZXNEaWMuX21hcHZpZXdEaWN0W3ZpZXdrZXldID0gcmVmO1xyXG4gICAgICAgICAgICByZWYua2V5ID0gdmlld2tleTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgcHVibGljIEFnZW5jeUFkZChyZWY6YW55KTp2b2lkXHJcblx0e1xyXG4gICAgICAgIFNpbmdsZXRvbi5jcmVhdGUocmVmKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQWdlbmN5Q2xlYXIocmVmOmFueSk6dm9pZFxyXG5cdHtcclxuICAgICAgICBTaW5nbGV0b24ucmVtb3ZlKHJlZik7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUHJvcE1hbmFnZXJcclxue1xyXG4gICAgc3RhdGljIHNjZW5lM0Q6TGF5YS5TY2VuZTNEO1xyXG4gICAgc3RhdGljIHN0YXJ0UGxhbmU6TGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICBzdGF0aWMgY2FybWE6TGF5YS5DYW1lcmE7XHJcbiAgICBzdGF0aWMgbWFpblJvbGU6TGF5YS5TcHJpdGUzRDtcclxuICAgIHN0YXRpYyBub3dtYXBEaWN0OmFueSA9IHt9O1xyXG4gICAgc3RhdGljIGRpZVBvc1k6bnVtYmVyID0gMDtcclxuICAgIHN0YXRpYyBlbmRQbGFuZTpMYXlhLk1lc2hTcHJpdGUzRDtcclxuXHJcbiAgICBzdGF0aWMgZ2FtZXdpblBvc1o6bnVtYmVyID0gMDtcclxuXHJcbiAgICBzdGF0aWMgcGF0dGVybkRpY3Q6YW55ID0ge307XHJcblxyXG4gICAgc3RhdGljIG5wY0RpY3Q6YW55ID0ge307XHJcbiAgICBzdGF0aWMgbnBjc2NyaXB0RGljdDphbnkgPSB7fTtcclxuICAgIHN0YXRpYyBucGNudW06bnVtYmVyID0gMDtcclxuXHJcbiAgICBzdGF0aWMgaXNjYXJtYW5wYzpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc3RhdGljIHByb19qaW5kdTpmYWlyeWd1aS5HUHJvZ3Jlc3NCYXI7XHJcblxyXG4gICAgc3RhdGljIHR4dF9taW5nY2k6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuXHJcbiAgICBzdGF0aWMgbGl6aURpY3Q6YW55ID0ge307XHJcblxyXG4gICAgc3RhdGljIGppYW50b3VBcnI6QXJyYXk8TGF5YS5NZXNoU3ByaXRlM0Q+PVtdO1xyXG5cclxuICAgIC8vIHN0YXRpYyBiZ3Nwcml0ZTNkOkxheWEuTWVzaFNwcml0ZTNEO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluczpQcm9wTWFuYWdlcjtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuaW5zID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlByb3BNYW5hZ2VyXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcE1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFByb3BNYW5hZ2VyLmlucztcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0UG9zVmVjYnlTY2VuZSggc2NlbmVOYW1lOnN0cmluZyxidWlsZG5hbWU6c3RyaW5nICk6TGF5YS5WZWN0b3IzXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFByb3BNYW5hZ2VyLnBhdHRlcm5EaWN0WyBzY2VuZU5hbWUgXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvcE1hbmFnZXIucGF0dGVybkRpY3RbIHNjZW5lTmFtZSBdW2J1aWxkbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIC8qKlxyXG4gICAgLy8gICog5Yik5pat5piv5ZCm54is5Yiw6aG256uvXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHN0YXRpYyBjaGVja2lzQ2xpbWJUb3AoIHNjZW5lTmFtZTpzdHJpbmcsYnVpbGRuYW1lOnN0cmluZywgcG9zOkxheWEuVmVjdG9yMyApOmJvb2xlYW5cclxuICAgIC8vIHtcclxuICAgIC8vICAgICB2YXIgdmVjOkxheWEuVmVjdG9yMyA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIHNjZW5lTmFtZSxidWlsZG5hbWUgKTtcclxuICAgIC8vICAgICBpZiggdmVjICYmIE1hdGguYWJzKHZlYy55IC0gcG9zLnkpIDwgMS41IClcclxuICAgIC8vICAgICB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgc3RhdGljIGFjdGlvbm51bXM6bnVtYmVyID0gNTc1O1xyXG5cclxuICAgIHN0YXRpYyBhY3Rpb25EaWN0OmFueSA9IHsgXHJcbiAgICAgICAgXCJjbGltYmVuZFwiOnsgczo1NTAsZTo1NzUsaXNsb29waW5nOmZhbHNlIH0sXHJcbiAgICAgICAgXCJzdGFuZFwiOnsgczowLGU6ODAsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcInJ1blwiOnsgczo5MCxlOjEwNixpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwianVtcFwiOnsgczoxMTAsZToxMzIsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImtvbmd6aG9uZ1wiOnsgczoxMzIsZToxNDUsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImx1b2RpMVwiOnsgczoxNDUsZToxNjAsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImx1b2RpMlwiOnsgczoxNzAsZToyMDIsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImRhdGlhbzFcIjp7IHM6MjEwLGU6MjM1LGlzbG9vcGluZzp0cnVlIH0sXHJcbiAgICAgICAgXCJkYXRpYW8yXCI6eyBzOjI0MCxlOjI3Myxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwiaHVhY2hhblwiOnsgczoyODAsZTozMTAsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImt1YWxhblwiOnsgczozMTAsZTozNDYsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImNlZmFuMVwiOnsgczozNTAsZTozOTEsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImNlZmFuMlwiOnsgczo0MDAsZTo0MzQsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcInBhb3FpYW5nbGVmdFwiOnsgczo0NDAsaXNsb29waW5nOnRydWUsZTo0NTYgfSxcclxuICAgICAgICBcInJpZ2h0anVtcFwiOnsgczo0NjAsZTo0NzcsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcInBhb3FpYW5ncmlnaHRcIjp7IHM6NDgwLGU6NDk2LGlzbG9vcGluZzp0cnVlIH0sXHJcbiAgICAgICAgXCJsZWZ0anVtcFwiOnsgczo1MDAsZTo1MTcsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcInBhcWlhbmdcIjp7IHM6NTIwLGU6NTQyLGlzbG9vcGluZzp0cnVlIH1cclxuICAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gYW5pbWF0b3IgXHJcbiAgICAgKiBAcGFyYW0gYW5pbWF0b3JEaWN0IFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2V0QW5pbWF0b3IoIGFuaW1hdG9yOkxheWEuQW5pbWF0b3IgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNoaWRkaWN0OmFueTtcclxuICAgICAgICBmb3IoIHZhciBzIGluIFByb3BNYW5hZ2VyLmFjdGlvbkRpY3QgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoICFhbmltYXRvci5nZXRDb250cm9sbGVyTGF5ZXIoICkuZ2V0QW5pbWF0b3JTdGF0ZSggcyApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2hpZGRpY3QgPSBQcm9wTWFuYWdlci5hY3Rpb25EaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgLy/liJvlu7rkuIDkuKrliqjnlLvliqjkvZznirbmgIFcclxuICAgICAgICAgICAgICAgIHZhciBzdGF0ZTEgPSBuZXcgTGF5YS5BbmltYXRvclN0YXRlKCk7XHJcbiAgICAgICAgICAgICAgICAvL+iuvue9ruWKqOS9nOeKtuaAgeeahOWQjeensFxyXG4gICAgICAgICAgICAgICAgc3RhdGUxLm5hbWUgPSBzO1xyXG4gICAgICAgICAgICAgICAgLy/orr7nva7liqjkvZznirbmgIHmkq3mlL7nmoTotbflp4vml7bpl7TvvIjotbflp4vml7bpl7TkuI7nu5PmnZ/ml7bpl7TnmoTorr7nva7kuLowLTHnmoTnmb7liIbmr5TmlbDlgLzvvIkgIOimgeaIquWPlueahOaXtumXtOeCuSAvIOWKqOeUu+eahOaAu+aXtumVv1xyXG4gICAgICAgICAgICAgICAgc3RhdGUxLmNsaXBTdGFydCA9IGNoaWRkaWN0LnMvUHJvcE1hbmFnZXIuYWN0aW9ubnVtcztcclxuICAgICAgICAgICAgICAgIC8v6K6+572u5Yqo5L2c54q25oCB5pKt5pS+55qE57uT5p2f5pe26Ze0XHJcbiAgICAgICAgICAgICAgICBzdGF0ZTEuY2xpcEVuZCA9IGNoaWRkaWN0LmUvUHJvcE1hbmFnZXIuYWN0aW9ubnVtcztcclxuICAgICAgICAgICAgICAgIC8v5b6X5Yiw6buY6K6k5Yqo55S76LWL5YC857uZQ2xpcO+8iGdldERlZmF1bHRTdGF0Zem7mOiupOWKqOeUu+S4ulVuaXR55LitYW5pbWF0aW9u55qE5pWw57uE6aG65bqPMOS4i+agh+eahOWKqOeUu++8iVxyXG4gICAgICAgICAgICAgICAgc3RhdGUxLmNsaXAgPSBhbmltYXRvci5nZXREZWZhdWx0U3RhdGUoKS5jbGlwO1xyXG4gICAgICAgICAgICAgICAgLy/liqjnlLvmkq3mlL7mmK/lkKblvqrnjq9cclxuICAgICAgICAgICAgICAgIHN0YXRlMS5jbGlwLmlzbG9vcGluZyA9IGNoaWRkaWN0LmlzbG9vcGluZztcclxuICAgICAgICAgICAgICAgIC8v5re75Yqg5Yqo55S754q25oCB5Yiw5Yqo55S757uE5Lu26YeMXHJcbiAgICAgICAgICAgICAgICBhbmltYXRvci5hZGRTdGF0ZShzdGF0ZTEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBJbml0RWZmZWN0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEID0gUHJvcE1hbmFnZXIuZ2V0bGl6aWJ5TmFtZSggXCJzcGVlZHVwZWZmZWN0XCIgKTtcclxuICAgICAgICBsaXppLnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcclxuICAgICAgICBsaXppLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEID0gUHJvcE1hbmFnZXIuZ2V0bGl6aWJ5TmFtZSggXCJjb2xvcl93aGl0ZVwiICk7XHJcbiAgICAgICAgbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgbGl6aS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB2YXIgbGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRCA9IFByb3BNYW5hZ2VyLmdldGxpemlieU5hbWUoIFwiY29sb3JfeWVsbG93XCIgKTtcclxuICAgICAgICBsaXppLnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcclxuICAgICAgICBsaXppLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3RhbnNlbGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgIHB1YmxpYyBTZXRFZmZlY3RDb2xvciggbmFtZTpzdHJpbmcscG9zOkxheWEuVmVjdG9yMyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgY2xvc2V0aW1lOm51bWJlciA9IDA7XHJcbiAgICAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcyx0aGlzLkVmZmVjdEVuZCApO1xyXG4gICAgICAgIHRoaXMuRWZmZWN0RW5kQ29sb3IoKTtcclxuICAgICAgICBpZiggbmFtZSA9PSBcImNvbG9yX3doaXRlXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcclxuICAgICAgICAgICAgaWYoIHNvcnQgPiA1MCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcImNvbG9yX3llbGxvd1wiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNsb3NldGltZSA9IDUwMDtcclxuICAgICAgICB0aGlzLl90YW5zZWxpemkgPSBQcm9wTWFuYWdlci5nZXRsaXppYnlOYW1lKCBuYW1lICk7XHJcbiAgICAgICAgdGhpcy5fdGFuc2VsaXppLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHBvcztcclxuICAgICAgICB0aGlzLl90YW5zZWxpemkucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIGlmKCBjbG9zZXRpbWUgIT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIGNsb3NldGltZSx0aGlzLHRoaXMuRWZmZWN0RW5kQ29sb3IgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBFZmZlY3RFbmRDb2xvcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fdGFuc2VsaXppIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhbnNlbGl6aS5wYXJ0aWNsZVN5c3RlbS5zdG9wKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhbnNlbGl6aS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZW5nYW1lbGl6aTQ6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0Q7XHJcbiAgICBwcml2YXRlIF9vdXRRVWF0ZXJuaW9uNDpMYXlhLlF1YXRlcm5pb24gPSBuZXcgTGF5YS5RdWF0ZXJuaW9uO1xyXG4gICAgcHVibGljIFNwZWVkVXBFZmZlY3QxKG5hbWU6c3RyaW5nLHBvczpMYXlhLlZlY3RvcjMpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2VuZ2FtZWxpemk0IHx8ICh0aGlzLl9lbmdhbWVsaXppNCAmJiAhdGhpcy5fZW5nYW1lbGl6aTQuYWN0aXZlICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQgPSBQcm9wTWFuYWdlci5nZXRsaXppYnlOYW1lKCBcInNwZWVkdXBlZmZlY3RcIiApO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppNC5wYXJ0aWNsZVN5c3RlbS5sb29waW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQudHJhbnNmb3JtLnNjYWxlID0gbmV3IExheWEuVmVjdG9yMyggMjAsMjAsMjAgKTtcclxuICAgICAgICAgICAgTGF5YS5RdWF0ZXJuaW9uLmNyZWF0ZUZyb21BeGlzQW5nbGUoIG5ldyBMYXlhLlZlY3RvcjMoIDEsMCwwICksLTUwLHRoaXMuX291dFFVYXRlcm5pb240ICk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemk0LnRyYW5zZm9ybS5yb3RhdGlvbiA9IHRoaXMuX291dFFVYXRlcm5pb240O1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppNC5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsenBvczpMYXlhLlZlY3RvcjMgPSBwb3MuY2xvbmUoKTtcclxuICAgICAgICBsenBvcy55ICs9IDU7XHJcbiAgICAgICAgbHpwb3MueiAtPSAxMDtcclxuICAgICAgICB0aGlzLl9lbmdhbWVsaXppNC50cmFuc2Zvcm0ucG9zaXRpb24gPSBsenBvcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ2xvc2VTcGVlZFVwRWZmZWN0MSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fZW5nYW1lbGl6aTQgJiYgdGhpcy5fZW5nYW1lbGl6aTQuYWN0aXZlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemk0LmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmdhbWVsaXppMzpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgIHByaXZhdGUgX291dFFVYXRlcm5pb246TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjtcclxuICAgIHB1YmxpYyBTcGVlZFVwRWZmZWN0KG5hbWU6c3RyaW5nLHBvczpMYXlhLlZlY3RvcjMpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2VuZ2FtZWxpemkzIHx8ICh0aGlzLl9lbmdhbWVsaXppMyAmJiAhdGhpcy5fZW5nYW1lbGl6aTMuYWN0aXZlICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMgPSBQcm9wTWFuYWdlci5nZXRsaXppYnlOYW1lKCBcInNwZWVkdXBlZmZlY3RcIiApO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMy5wYXJ0aWNsZVN5c3RlbS5sb29waW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMudHJhbnNmb3JtLnNjYWxlID0gbmV3IExheWEuVmVjdG9yMyggMjAsMjAsMjAgKTtcclxuICAgICAgICAgICAgTGF5YS5RdWF0ZXJuaW9uLmNyZWF0ZUZyb21BeGlzQW5nbGUoIG5ldyBMYXlhLlZlY3RvcjMoIDEsMCwwICksLTUwLHRoaXMuX291dFFVYXRlcm5pb24gKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMudHJhbnNmb3JtLnJvdGF0aW9uID0gdGhpcy5fb3V0UVVhdGVybmlvbjtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbHpwb3M6TGF5YS5WZWN0b3IzID0gcG9zLmNsb25lKCk7XHJcbiAgICAgICAgbHpwb3MueSArPSA1O1xyXG4gICAgICAgIHRoaXMuX2VuZ2FtZWxpemkzLnRyYW5zZm9ybS5wb3NpdGlvbiA9IGx6cG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDbG9zZVNwZWVkVXBFZmZlY3QoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2VuZ2FtZWxpemkzICYmIHRoaXMuX2VuZ2FtZWxpemkzLmFjdGl2ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMy5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZW5nYW1lbGl6aTE6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0Q7XHJcbiAgICBwcml2YXRlIF9lbmdhbWVsaXppMjpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgIHB1YmxpYyBHYW1lT3ZlckVmZmVjZihuYW1lOnN0cmluZyxwb3M6TGF5YS5WZWN0b3IzLGlzd2luOmJvb2xlYW4pOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9lbmdhbWVsaXppMSA9IFByb3BNYW5hZ2VyLmdldGxpemlieU5hbWUoIFwiZmlyZXdvcmtzXCIgKTtcclxuICAgICAgICB0aGlzLl9lbmdhbWVsaXppMS50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3M7XHJcbiAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTEucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIGlmKGlzd2luKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTIgPSBQcm9wTWFuYWdlci5nZXRsaXppYnlOYW1lKCBcIndpbmxpbmVcIiApO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMi50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3M7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkyLnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENsb3NlR2FtZU92ZXJFZmZlY3QoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYodGhpcy5fZW5nYW1lbGl6aTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMS5wYXJ0aWNsZVN5c3RlbS5zdG9wKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkxLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLl9lbmdhbWVsaXppMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkyLnBhcnRpY2xlU3lzdGVtLnN0b3AoKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTIuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBzZXRsaXppUGxheSggbmFtZTpzdHJpbmcscG9zOkxheWEuVmVjdG9yMyApOnZvaWRcclxuICAgIC8vIHtcclxuICAgIC8vICAgICB2YXIgY2xvc2V0aW1lOm51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcyx0aGlzLmxpemllbmQgKTtcclxuICAgIC8vICAgICBzd2l0Y2goIG5hbWUgKVxyXG4gICAgLy8gICAgIHtcclxuICAgIC8vICAgICAgICAgY2FzZSBcInRhbnNlX2JhaVwiOlxyXG4gICAgLy8gICAgICAgICAgICAgaWYoIG5hbWUgPT0gXCJ0YW5zZV9iYWlcIiApXHJcbiAgICAvLyAgICAgICAgICAgICB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiggc29ydCA+IDUwIClcclxuICAgIC8vICAgICAgICAgICAgICAgICB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBcInRhbnNlX2h1YW5nXCI7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgY2xvc2V0aW1lID0gNTAwO1xyXG4gICAgLy8gICAgICAgICBicmVhaztcclxuICAgIC8vICAgICAgICAgY2FzZSBcImppYXN1bGl6aVwiOlxyXG4gICAgLy8gICAgICAgICBicmVhaztcclxuICAgIC8vICAgICAgICAgY2FzZSBcIndpbl94aWFuXCI6XHJcbiAgICAvLyAgICAgICAgICAgICBjbG9zZXRpbWUgPSAwO1xyXG4gICAgLy8gICAgICAgICBicmVhaztcclxuICAgIC8vICAgICAgICAgY2FzZSBcInlhbmh1YVwiOlxyXG4gICAgLy8gICAgICAgICAgICAgY2xvc2V0aW1lID0gMDtcclxuICAgIC8vICAgICAgICAgYnJlYWs7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHZhciBsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEID0gUHJvcE1hbmFnZXIuZ2V0bGl6aWJ5TmFtZSggbmFtZSApO1xyXG4gICAgLy8gICAgIGxpemkudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zO1xyXG4gICAgLy8gICAgIGxpemkucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgLy8gICAgIGlmKCBjbG9zZXRpbWUgIT0gMCApXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIGNsb3NldGltZSx0aGlzLHRoaXMubGl6aWVuZCxbbGl6aV0gKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJpdmF0ZSBFZmZlY3RFbmQobGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBsaXppIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxpemkucGFydGljbGVTeXN0ZW0uc3RvcCgpO1xyXG4gICAgICAgICAgICBsaXppLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0bGl6aWJ5TmFtZSggbmFtZTpzdHJpbmcgKTpMYXlhLlNodXJpS2VuUGFydGljbGUzRFxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaXppc3A6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0Q7XHJcbiAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmxpemlEaWN0W25hbWVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxpemlzcCA9IFByb3BNYW5hZ2VyLmxpemlEaWN0W25hbWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsaXppc3AgPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKExheWEuTG9hZGVyLmdldFJlcyhBc3NldFBhdGguZ2V0M0RNb2RlbChuYW1lKSkpIGFzIExheWEuU2h1cmlLZW5QYXJ0aWNsZTNEO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5saXppRGljdFtuYW1lXSA9IGxpemlzcDtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZCggbGl6aXNwICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxpemlzcC5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBsaXppc3A7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge1BhbmVsQ2hpbGRDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbENoaWxkQ29udHJvbFwiO1xyXG5pbXBvcnQgQ3BhRXZlbnQgZnJvbSBcIi4vQ3BhRXZlbnRcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IFJlY29tbWVuZCB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcclxuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4vQ3BhSXRlbVwiO1xyXG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYW9LdWFuR2FtZVZpZXcgZXh0ZW5kcyBQYW5lbENoaWxkQ29udHJvbCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxyXG57XHJcbiAgICBjX3N0YXRlOmZhaXJ5Z3VpLkNvbnRyb2xsZXI7XHJcbiAgICBpdGVtXzA6Q3BhSXRlbTtcclxuICAgIGl0ZW1fMTpDcGFJdGVtO1xyXG4gICAgaXRlbV8yOkNwYUl0ZW07XHJcbiAgICBpdGVtXzM6Q3BhSXRlbTtcclxuICAgIHQwOmZhaXJ5Z3VpLlRyYW5zaXRpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcclxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyKCBcImNfc3RhdGVcIiApO1xyXG4gICAgICAgIHRoaXMudDAgPSB0aGlzLmdldFRyYW5zaXRpb24oIFwidDBcIiApO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuebkeWQrOS6kuaOqOS6i+S7ti0tLUJhb2t1YW5HYW1lMFwiKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50RGF0YSggQ3BhRXZlbnQuWVFIb21lRGF0YSx0aGlzLHRoaXMueXFob21lZGF0YUhhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHlxaG9tZWRhdGFIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi55uR5ZCs5LqS5o6o5LqL5Lu2LS0tQmFva3VhbkdhbWUxXCIpO1xyXG4gICAgICAgIHRoaXMuUmVmcmVzaEJLWVgoKTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc3RhcnQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSArPSBkdDtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX3RpbWUgPj0gNTAwMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWZyZXNoQktZWCggdHJ1ZSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGtleSA9IDA7XHJcbiAgICBwcml2YXRlIF9pc3RhcnQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgUmVmcmVzaEJLWVgoIGlzYW5tbzpib29sZWFuID0gZmFsc2UgKSAgXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnJlY29tbWVuZCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi55uR5ZCs5LqS5o6o5LqL5Lu2LS0tQmFva3VhbkdhbWUyXCIpO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICB2YXIgZGF0YXMgPSBSZWNvbW1lbmQuY2Fpbml4aWh1YW5EYXRhO1xyXG4gICAgICAgIHZhciBpdGVtOkNwYUl0ZW07XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmtleSArIGkgPj0gZGF0YXMubGVuZ3RoIC0gMSkgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMua2V5ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgY3VyZGF0YSA9IGRhdGFzW3RoaXMua2V5ICsgaV07ICBcclxuICAgICAgICAgICAgaXRlbSA9IHRoaXNbXCJpdGVtX1wiK2ldO1xyXG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCBjdXJkYXRhLHRydWUgKTtcclxuICAgICAgICAgICAgaWYgKGN1cmRhdGEgPT0gbnVsbCkgY29udGludWU7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmtleSArPSA0O1xyXG4gICAgICAgIGlmICh0aGlzLmtleSA+PSBkYXRhcy5sZW5ndGggLSAxKSAge1xyXG4gICAgICAgICAgICB0aGlzLmtleSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzdGFydCA9IHRydWU7XHJcbiAgICAgICAgaWYoIGlzYW5tbyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnQwLnBsYXkoIG51bGwsMSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQgQ3BhSXRlbSBmcm9tIFwiLi9DcGFJdGVtXCI7XHJcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEdhbWVTdGF0ZSB9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IHsgQ29tcGxldGVQYW5lbCB9IGZyb20gXCIuLi9WaWV3L0NvbXBsZXRlUGFuZWxcIjtcclxuaW1wb3J0IHsgUm9sZURhdGEgfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hvdXRpUGFuVmlldyBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2wgaW1wbGVtZW50cyBUaW1lckNvbnRyb2xcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkNob3V0aVBhblZpZXdcIjtcclxuICAgIGJ0bl9yZXR1cm46ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIGxpc3RfMDpmYWlyeWd1aS5HTGlzdDtcclxuICAgIGxpc3RfMTpmYWlyeWd1aS5HTGlzdDtcclxuICAgIGJ0bl9qaXh1Z2FtZTpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgcHJpdmF0ZSBfbm93TGlzdDA6UmVjb21tZW5kSXRlbVtdO1xyXG4gICAgcHJpdmF0ZSBfbm93TGlzdDE6UmVjb21tZW5kSXRlbVtdO1xyXG4gICAgcHJpdmF0ZSBfaXNTdGFydDpib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfaXNjYW5tb3ZlOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2lzZG93bjpib29sZWFuO1xyXG4gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBpc2VuZDpudW1iZXIgPSAwO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGVuZD8pIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJjaG91dGlwYW5WaWV3XCIgKTsgXHJcbiAgICAgICAgdGhpcy5pc2VuZCA9IGVuZDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdCxudWxsLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5saXN0XzEuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8xLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdDEsbnVsbCxmYWxzZSApO1xyXG5cclxuICAgICAgICB0aGlzLl9ub3dMaXN0MCA9IFJlY29tbWVuZC5nZHl4RGF0YTtcclxuICAgICAgICB0aGlzLl9ub3dMaXN0MSA9IFJlY29tbWVuZC5nZHl4RGF0YTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX25vd0xpc3QwLmxlbmd0aDtcclxuICAgICAgICB0aGlzLmxpc3RfMS5udW1JdGVtcyA9IHRoaXMuX25vd0xpc3QxLmxlbmd0aDtcclxuICAgICAgICB0aGlzLl9pc1N0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSB0cnVlO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYnRuX3JldHVybixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmNsb3NlZnVuICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5faml4dWdhbWUsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8xLExheWEuRXZlbnQuTU9VU0VfRE9XTix0aGlzLHRoaXMuZG93bmNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzEsTGF5YS5FdmVudC5NT1VTRV9VUCx0aGlzLHRoaXMudXBjbGljayApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8xLExheWEuRXZlbnQuTU9VU0VfT1VULHRoaXMsdGhpcy51cGNsaWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdCggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaW5kZXggPCB0aGlzLl9ub3dMaXN0MC5sZW5ndGggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93TGlzdDBbaW5kZXhdICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXRlbXJlbmRlcmxpc3QxKCBpbmRleDpudW1iZXIsaXRlbTpDcGFJdGVtICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpbmRleCA8IHRoaXMuX25vd0xpc3QxLmxlbmd0aCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dMaXN0MVtpbmRleF0gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkb3duY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNkb3duID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSBmYWxzZTtcclxuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0aW1lb3V0Q2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzZG93biApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pc2Rvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSB0aGlzLmxpc3RfMS5zY3JvbGxQYW5lLnBlcmNZO1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMDAsdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tb3ZldGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfZmx1c2h0aW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGRpcjpib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX25vd3ZhbHVlOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzU3RhcnQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMubGlzdF8xLnNjcm9sbFBhbmUgJiYgdGhpcy5fbm93TGlzdDEgJiYgdGhpcy5faXNjYW5tb3ZlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuZGlyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSArPSAwLjAwMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPj0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlIC09IDAuMDAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA8PSAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdF8xLnNjcm9sbFBhbmUuc2V0UGVyY1koIHRoaXMuX25vd3ZhbHVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLmlzZW5kID09IDEpe1xyXG4gICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggQ2hvdXRpUGFuVmlldyApO1xyXG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUubG9zZSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLmlzZW5kID09IDIpe1xyXG4gICAgICAgICAgIGxldCBnb2xkID0gIFJvbGVEYXRhLkluc3RhbmNlLmxldmVsY2ZnLndpbkdvbGQ7XHJcbiAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoQ2hvdXRpUGFuVmlldyk7XHJcbiAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKENvbXBsZXRlUGFuZWwsZ29sZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBDaG91dGlQYW5WaWV3ICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcbiAgICBcclxufSIsImltcG9ydCB7UGFuZWxDaGlsZENvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQ2hpbGRDb250cm9sXCI7XHJcbmltcG9ydCBDcGFFdmVudCBmcm9tIFwiLi9DcGFFdmVudFwiO1xyXG5pbXBvcnQgeyBSZWNvbW1lbmQsIFJlY29tbWVuZEl0ZW0gfSBmcm9tIFwiLi9SZWNvbW1lbmRWaWV3XCI7XHJcbmltcG9ydCBDcGFJdGVtIGZyb20gXCIuL0NwYUl0ZW1cIjtcclxuaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG4vLyBpbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL3R0YWRcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IFNjZW5lQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3BhRG93bnNWaWV3IGV4dGVuZHMgUGFuZWxDaGlsZENvbnRyb2wgaW1wbGVtZW50cyBUaW1lckNvbnRyb2xcclxue1xyXG4gICAgY19zdGF0ZTpmYWlyeWd1aS5Db250cm9sbGVyO1xyXG4gICAgbGlzdF8wOmZhaXJ5Z3VpLkdMaXN0O1xyXG4gICAgcHJpdmF0ZSBfbm93TGlzdDpSZWNvbW1lbmRJdGVtW107XHJcbiAgICBwcml2YXRlIF9pc1N0YXJ0OmJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9pc2Nhbm1vdmU6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfaXNkb3duOmJvb2xlYW47XHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkluaXQoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgICAgIHRoaXMuY19zdGF0ZSA9IHRoaXMuZ2V0Q29udHJvbGxlciggXCJjX3N0YXRlXCIgKTtcclxuICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgdGhpcy5pbml0VmlldygpO1xyXG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubGlzdF8wLnNldFZpcnR1YWwoKTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5pdGVtUmVuZGVyZXIgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKCB0aGlzLHRoaXMuaXRlbXJlbmRlcmxpc3QsbnVsbCxmYWxzZSApO1xyXG4gICAgICAgIHRoaXMuX2lzU3RhcnQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudERhdGEoIENwYUV2ZW50LllRSG9tZURhdGEsdGhpcyx0aGlzLnlxaG9tZWRhdGFIYW5kbGVyICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9ET1dOLHRoaXMsdGhpcy5kb3duY2xpY2sgKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX1VQLHRoaXMsdGhpcy51cGNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9PVVQsdGhpcyx0aGlzLnVwY2xpY2sgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRvd25jbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZihTY2VuZUNvbnRyb2wuSXNTaG93U2lnbilyZXR1cm47XHJcbiAgICAgICAgdGhpcy5faXNkb3duID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSBmYWxzZTtcclxuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XHJcblxyXG4gICAgICAgIC8vIHR0YWQuQ3JlYXRlTW9yZUdhbWVCdG4oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRpbWVvdXRDYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZihTY2VuZUNvbnRyb2wuSXNTaG93U2lnbilyZXR1cm47XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoU2NlbmVDb250cm9sLklzU2hvd1NpZ24pcmV0dXJuO1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc2Rvd24gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faXNkb3duID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gdGhpcy5saXN0XzAuc2Nyb2xsUGFuZS5wZXJjWDtcclxuICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKCAyMDAwLHRoaXMsdGhpcy50aW1lb3V0Q2FsbGJhY2sgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbW92ZXRpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2ZsdXNodGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBkaXI6Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9ub3d2YWx1ZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc1N0YXJ0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmxpc3RfMC5zY3JvbGxQYW5lICYmIHRoaXMuX25vd0xpc3QgJiYgdGhpcy5faXNjYW5tb3ZlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuZGlyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSArPSAwLjAwMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPj0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlIC09IDAuMDAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA8PSAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUuc2V0UGVyY1goIHRoaXMuX25vd3ZhbHVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdCggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaW5kZXggPCB0aGlzLl9ub3dMaXN0Lmxlbmd0aCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dMaXN0W2luZGV4XSx0cnVlICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgeXFob21lZGF0YUhhbmRsZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAxO1xyXG4gICAgICAgIHRoaXMuX25vd0xpc3QgPSBSZWNvbW1lbmQuY2Fpbml4aWh1YW5EYXRhO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLm51bUl0ZW1zID0gdGhpcy5fbm93TGlzdC5sZW5ndGg7XHJcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgdGhpcy5fbm93TGlzdC5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzU3RhcnQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IHRydWU7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQodGhpcyk7XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIENwYUV2ZW50XHJcbntcclxuICAgIHN0YXRpYyBZUUhvbWVEYXRhOnN0cmluZyA9IFwiQ3BhRXZlbnRfWVFIb21lRGF0YVwiO1xyXG59IiwiaW1wb3J0IHtQYW5lbENoaWxkQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2xcIjtcclxuaW1wb3J0IHsgUmVjb21tZW5kSXRlbSwgUmVjb21tZW5kIH0gZnJvbSBcIi4vUmVjb21tZW5kVmlld1wiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IENob3V0aVBhblZpZXcgZnJvbSBcIi4vQ2hvdXRpUGFuVmlld1wiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENwYUl0ZW0gZXh0ZW5kcyBQYW5lbENoaWxkQ29udHJvbCBcclxue1xyXG4gICAgaW1nX3RpcDpmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICBsb2FkX2ljb246ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIHR4dF93b3JkOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICB0eHRfd29yZDE6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIHByaXZhdGUgX3ZvOlJlY29tbWVuZEl0ZW07XHJcbiAgICBwcml2YXRlIGlzcGVuY2hvdXRpcGFuOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBvbkluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJjYXBJdGVtXCI7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcyxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmJ0bmNsaWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmJ0bmNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl92byApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZGF0YTpSZWNvbW1lbmRJdGVtID0gdGhpcy5fdm87XHJcbiAgICAgICAgICAgIEZZSERfU2RrLlNob3dIdVR1aUp1bXAoZGF0YSx0aGlzLmlzcGVuY2hvdXRpcGFuKTtcclxuICAgICAgICAgICAgLy8gdmFyIGFwcGlkID0gZGF0YS50b19hcHBpZDtcclxuICAgICAgICAgICAgLy8gdmFyIHBhdGggPSBkYXRhLmp1bXBfcGF0aDtcclxuICAgICAgICAgICAgLy8gbGV0IHBhcmFtID0ge1wiYXBwSWRcIjphcHBpZC50b1N0cmluZygpLFwicGF0aFwiOnBhdGgudG9TdHJpbmcoKX07XHJcbiAgICAgICAgICAgIC8vIGlmKExheWEuQnJvd3Nlci5vbk1vYmlsZSlcclxuICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAvLyAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5uYXZpZ2F0ZVRvTWluaVByb2dyYW0oXHJcbiAgICAgICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgYXBwSWQ6YXBwaWQudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgLy8gICAgICAgICBwYXRoOnBhdGgudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgLy8gICAgICAgICBzdWNjZXNzOnJlcz0+XHJcbiAgICAgICAgICAgIC8vICAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIui3s+i9rOWIsOa4uOaIj+WkseaIkOWKn1wiLFwiMVwiKTtcclxuICAgICAgICAgICAgLy8gICAgICAgICB9LFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIGZhaWw6cmVzPT5cclxuICAgICAgICAgICAgLy8gICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGlmKCB0aGlzLmlzcGVuY2hvdXRpcGFuIClcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3ICk7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd0RhdGEoIGRhdGE6UmVjb21tZW5kSXRlbSxpc29wZW5jaG91dGlwYW46Ym9vbGVhbiA9IGZhbHNlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaXNwZW5jaG91dGlwYW4gPSBpc29wZW5jaG91dGlwYW47XHJcbiAgICAgICAgdGhpcy5fdm8gPSBkYXRhO1xyXG4gICAgICAgIGlmKCBkYXRhIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZF9pY29uLnVybCA9IGRhdGEuaWNvbjtcclxuICAgICAgICAgICAgaWYoIHRoaXMudHh0X3dvcmQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR4dF93b3JkLnRleHQgPSBkYXRhLnRvZ2FtZV9uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmltZ190aXAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZ190aXAudmlzaWJsZSA9IE1hdGgucmFuZG9tKCkgPiAwLjU/dHJ1ZTpmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy50eHRfd29yZDEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR4dF93b3JkMS50ZXh0ID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCgyMzU0NzAsMTU2MTQzMCkudG9TdHJpbmcoKSArIFwi5Lq6546pXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xyXG5pbXBvcnQgQ3BhRXZlbnQgZnJvbSBcIi4vQ3BhRXZlbnRcIjtcclxuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyByZWNvbW1lbmRQYW5cclxue1xyXG4gICAgY29uc3RydWN0b3IoZGF0YTpPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5nYW1lX2ZsZyA9IGRhdGFbXCJnYW1lX2ZsZ1wiXTtcclxuICAgICAgICB0aGlzLmdhbWVfaWQgPSBkYXRhW1wiZ2FtZV9pZFwiXTtcclxuICAgICAgICB0aGlzLmdhbWVfbmFtZSA9IGRhdGFbXCJnYW1lX25hbWVcIl07XHJcbiAgICAgICAgdGhpcy5pZCA9IGRhdGFbXCJpZFwiXTtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uX2ZsZyA9IGRhdGFbXCJsb2NhdGlvbl9mbGdcIl07XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbl9pZCA9IGRhdGFbXCJsb2NhdGlvbl9pZFwiXTtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uX25hbWUgPSBkYXRhW1wibG9jYXRpb25fbmFtZVwiXTtcclxuICAgICAgICB0aGlzLm1hdHRlcl90eXBlID0gZGF0YVtcIm1hdHRlcl90eXBlXCJdO1xyXG4gICAgfVxyXG4gICAgZ2FtZV9mbGc6c3RyaW5nO1xyXG4gICAgZ2FtZV9pZDpudW1iZXI7XHJcbiAgICBnYW1lX25hbWU6c3RyaW5nO1xyXG4gICAgaWQ6c3RyaW5nO1xyXG4gICAgbG9jYXRpb25fZmxnOnN0cmluZztcclxuICAgIGxvY2F0aW9uX2lkOm51bWJlcjtcclxuICAgIGxvY2F0aW9uX25hbWU6c3RyaW5nO1xyXG4gICAgbWF0dGVyX3R5cGU6c3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmVjb21tZW5kXHJcbntcclxuICAgIGNvbnN0cnVjdG9yKClcclxuICAgIHtcclxuICAgICAgICBSZWNvbW1lbmQuSW5pdERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0ZGF0YSA9IGZhbHNlO1xyXG4gICAgc3RhdGljIEluaXREYXRhKClcclxuICAgIHtcclxuICAgICAgICBSZWNvbW1lbmQuY2Fpbml4aWh1YW5EYXRhID0gUmVjb21tZW5kLkdldENhaU5pWGlhSHVhbkRhdGFzKCk7XHJcbiAgICAgICAgUmVjb21tZW5kLmppZXN1YW5EYXRhID0gUmVjb21tZW5kLkdldEpJZVN1YW5EYXRhcygpO1xyXG4gICAgICAgIFJlY29tbWVuZC5nZHl4RGF0YSA9IFJlY29tbWVuZC5HZXRHRFlYRGF0YXMoKTtcclxuICAgICAgICBSZWNvbW1lbmQuYmFva3VhbnlvdXhpRGF0YSA9IFJlY29tbWVuZC5HZXRCYW9LdWFuWW91WGlEYXRhcygpO1xyXG4gICAgICAgIFJlY29tbWVuZC5tb3JlRGF0YSA9IFJlY29tbWVuZC5HZXRNb3JlRGF0YXMoKTtcclxuICAgICAgICBmb3IodmFyIGtleSBpbiBGWUhEX1Nkay5wdXNoRGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFJlY29tbWVuZC5yZWNvbW1lbmREaWNbRllIRF9TZGsucHVzaERhdGFba2V5XS5sb2NhdGlvbl9mbGddICA9IG5ldyByZWNvbW1lbmRQYW4oRllIRF9TZGsucHVzaERhdGFba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFJlY29tbWVuZC5nZXRkYXRhID0gdHJ1ZTtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBDcGFFdmVudC5ZUUhvbWVEYXRhICk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLkupLmjqjmlbDmja7liJ3lp4vljJZyZWNvbW1lbmQtLS0tLS0tLS0tLS0tLVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVjb21tZW5kRGljID0ge307XHJcbiAgICBzdGF0aWMgY2Fpbml4aWh1YW5EYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgc3RhdGljIGJhb2t1YW55b3V4aURhdGE6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICBzdGF0aWMgZ2R5eERhdGE6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICBzdGF0aWMgamllc3VhbkRhdGE6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICBzdGF0aWMgbW9yZURhdGE6UmVjb21tZW5kSXRlbVtdID0gW107XHJcblxyXG5cclxuICAgIHN0YXRpYyBHZXRTU0RhdGFzKCk6UmVjb21tZW5kSXRlbVtdXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW1zOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIGlmKCFGWUhEX1Nkay5wdXNoRGF0YSlyZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgRllIRF9TZGsucHVzaERhdGEubGVuZ3RoO2krKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3IFJlY29tbWVuZEl0ZW0oRllIRF9TZGsucHVzaERhdGFbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBHZXRDYWlOaVhpYUh1YW5EYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtczpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgICAgICBpZighRllIRF9TZGsucHVzaERhdGEpcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IEZZSERfU2RrLnB1c2hEYXRhLmxlbmd0aDtpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKEZZSERfU2RrLnB1c2hEYXRhW2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBHZXRNb3JlRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICAgICAgaWYoIUZZSERfU2RrLnB1c2hEYXRhKXJldHVybiBpdGVtcztcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBGWUhEX1Nkay5wdXNoRGF0YS5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShGWUhEX1Nkay5wdXNoRGF0YVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIEdldEJhb0t1YW5Zb3VYaURhdGFzKCk6UmVjb21tZW5kSXRlbVtdXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW1zOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIGlmKCFGWUhEX1Nkay5wdXNoRGF0YSlyZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgRllIRF9TZGsucHVzaERhdGEubGVuZ3RoO2krKylcclxuICAgICAgICB7IFxyXG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKEZZSERfU2RrLnB1c2hEYXRhW2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgR2V0SkllU3VhbkRhdGFzKCk6UmVjb21tZW5kSXRlbVtdXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW1zOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIGlmKCFGWUhEX1Nkay5wdXNoRGF0YSlyZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgRllIRF9TZGsucHVzaERhdGEubGVuZ3RoO2krKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3IFJlY29tbWVuZEl0ZW0oRllIRF9TZGsucHVzaERhdGFbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBHZXRHRFlYRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICAgICAgaWYoIUZZSERfU2RrLnB1c2hEYXRhKXJldHVybiBpdGVtcztcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBGWUhEX1Nkay5wdXNoRGF0YS5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShGWUhEX1Nkay5wdXNoRGF0YVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSZWNvbW1lbmRJdGVtXHJcbntcclxuICAgIGNvbnN0cnVjdG9yKERhdGE6T2JqZWN0KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaWNvbiA9IERhdGFbXCJpY29uXCJdO1xyXG4gICAgICAgIHRoaXMudG9fYXBwaWQgPSBEYXRhW1widG9fYXBwaWRcIl07XHJcbiAgICAgICAgdGhpcy50b2dhbWVfbmFtZSA9IERhdGFbXCJ0b2dhbWVfbmFtZVwiXTtcclxuICAgICAgICB0aGlzLmp1bXBfcGF0aCA9IERhdGFbXCJqdW1wX3BhdGhcIl07XHJcbiAgICAgICAgdGhpcy5qdW1wX3R5cGUgPSBEYXRhW1wianVtcF90eXBlXCJdO1xyXG4gICAgICAgIHRoaXMucGFuZWwgPSBEYXRhW1wicGFuZWxcIl07XHJcbiAgICAgICAgdGhpcy5xcmNvZGUgPSBEYXRhW1wicXJjb2RlXCJdO1xyXG4gICAgfVxyXG4gICAgaWNvbjpzdHJpbmc7XHJcbiAgICB0b19hcHBpZDpzdHJpbmc7XHJcbiAgICB0b2dhbWVfbmFtZTpzdHJpbmc7XHJcbiAgICBqdW1wX3BhdGg6c3RyaW5nO1xyXG4gICAganVtcF90eXBlOm51bWJlcjtcclxuICAgIHBhbmVsOm51bWJlcjtcclxuICAgIHFyY29kZTpzdHJpbmc7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWNvbW1lbmRWaWV3XHJcbntcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSB7IFxyXG4gICAgICAgIFxyXG4gICAgIH1cclxufSIsImltcG9ydCB7UGFuZWxDaGlsZENvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQ2hpbGRDb250cm9sXCI7XHJcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcclxuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4vQ3BhSXRlbVwiO1xyXG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcbi8vIGltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vdHRhZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hpd2FudHVpamlhblZpZXcgZXh0ZW5kcyBQYW5lbENoaWxkQ29udHJvbCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxyXG57XHJcbiAgICBcclxuICAgIGxpc3RfMDpmYWlyeWd1aS5HTGlzdDtcclxuICAgIHByaXZhdGUgX25vd2xpc3Q6UmVjb21tZW5kSXRlbVtdO1xyXG4gICAgcHJpdmF0ZSBfaXNTdGFydDpib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfaXNjYW5tb3ZlOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2lzZG93bjpib29sZWFuO1xyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubGlzdF8wLnNldFZpcnR1YWwoKTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5pdGVtUmVuZGVyZXIgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKCB0aGlzLHRoaXMuaXRlbXJlbmRlcmxpc3QsbnVsbCxmYWxzZSApO1xyXG4gICAgICAgIHRoaXMuX25vd2xpc3QgPSBSZWNvbW1lbmQuamllc3VhbkRhdGE7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd2xpc3QubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX25vd2xpc3QubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLl9ub3dsaXN0Lmxlbmd0aDtpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2lzU3RhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX0RPV04sdGhpcyx0aGlzLmRvd25jbGljayApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfVVAsdGhpcyx0aGlzLnVwY2xpY2sgKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMudXBjbGljayApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZG93bmNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzZG93biA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xyXG5cclxuICAgICAgICAvLyB0dGFkLkNyZWF0ZU1vcmVHYW1lQnRuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0aW1lb3V0Q2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzZG93biApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pc2Rvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSB0aGlzLmxpc3RfMC5zY3JvbGxQYW5lLnBlcmNZO1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMDAsdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGl0ZW1yZW5kZXJsaXN0KCBpbmRleDpudW1iZXIsaXRlbTpDcGFJdGVtICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpbmRleCA8IHRoaXMuX25vd2xpc3QubGVuZ3RoIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIHRoaXMuX25vd2xpc3RbaW5kZXhdLHRydWUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbW92ZXRpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2ZsdXNodGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBkaXI6Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9ub3d2YWx1ZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc1N0YXJ0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmxpc3RfMC5zY3JvbGxQYW5lICYmIHRoaXMuX25vd2xpc3QgJiYgdGhpcy5fbm93bGlzdC5sZW5ndGggPiAwICYmIHRoaXMuX2lzY2FubW92ZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLmRpciApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgKz0gMC4wMDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3ZhbHVlID49IDEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSAtPSAwLjAwMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPD0gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RfMC5zY3JvbGxQYW5lLnNldFBlcmNZKCB0aGlzLl9ub3d2YWx1ZSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IGZhbHNlO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgICBcclxufSIsImltcG9ydCBDcGFJdGVtIGZyb20gXCIuL0NwYUl0ZW1cIjtcclxuaW1wb3J0IHsgUmVjb21tZW5kSXRlbSwgUmVjb21tZW5kIH0gZnJvbSBcIi4vUmVjb21tZW5kVmlld1wiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFBhbmVsQmFzZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFR1aWppYW5WaWV3IGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIlR1aWppYW5WaWV3XCI7XHJcbiAgICBidG5fY2xvc2U6ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIGxpc3RfMTpmYWlyeWd1aS5HTGlzdDtcclxuICAgIGxpc3RfMjpmYWlyeWd1aS5HTGlzdDtcclxuICAgIHByaXZhdGUgX25vd2xpc3QxOlJlY29tbWVuZEl0ZW1bXTtcclxuICAgIHByaXZhdGUgX25vd2xpc3QyOlJlY29tbWVuZEl0ZW1bXTtcclxuICAgIHByaXZhdGUgbW9yZTpmYWlyeWd1aS5HTG9hZGVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCBcIm1haW5cIixcInR1aWppYW5WaWV3XCIgKTsgXHJcbiAgICB9XHJcbiAgICBcclxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmxpc3RfMS5zZXRWaXJ0dWFsKCk7XHJcbiAgICAgICAgdGhpcy5saXN0XzEuaXRlbVJlbmRlcmVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSggdGhpcyx0aGlzLml0ZW1yZW5kZXJsaXN0MSxudWxsLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5saXN0XzIuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8yLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUodGhpcyx0aGlzLml0ZW1yZW5kZXJsaXN0MixudWxsLGZhbHNlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbm93bGlzdDEgPSBSZWNvbW1lbmQuZ2R5eERhdGE7XHJcbiAgICAgICAgdGhpcy5fbm93bGlzdDIgPSBSZWNvbW1lbmQuZ2R5eERhdGE7XHJcbiAgICAgICAgdGhpcy5saXN0XzEubnVtSXRlbXMgPSA3O1xyXG4gICAgICAgIHRoaXMubGlzdF8yLm51bUl0ZW1zID0gdGhpcy5fbm93bGlzdDIubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fY2xvc2UsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubW9yZSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5KdW1wQXBwICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdDEoIGluZGV4Om51bWJlcixpdGVtOkNwYUl0ZW0gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGluZGV4IDwgNyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dsaXN0MVtpbmRleF0gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHByaXZhdGUgaXRlbXJlbmRlcmxpc3QyKCBpbmRleDpudW1iZXIsaXRlbTpDcGFJdGVtICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpbmRleCA8IHRoaXMuX25vd2xpc3QyLmxlbmd0aCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dsaXN0MltpbmRleF0gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBUdWlqaWFuVmlldyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8v6ZqP5py66Lez6L2s5ri45oiPXHJcbiAgICBwcml2YXRlIEp1bXBBcHAoKTp2b2lke1xyXG4gICAgICAgIGxldCByYW4gPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KDAsdGhpcy5fbm93bGlzdDEubGVuZ3RoLTEpO1xyXG4gICAgICAgIEZZSERfU2RrLlNob3dIdVR1aUp1bXAodGhpcy5fbm93bGlzdDFbcmFuXSxmYWxzZSk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgVGltZVV0aWxzIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaciC/ml6Ug5bCP5pe2OuWIhumSn1xyXG4gICAgICogQHBhcmFtIHZhbHVlIFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIGZvcm1hdERhdGEodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XHJcbiAgICAgICAgc3RyID0gdGhpcy5nZXRUd28oZGF0ZS5nZXRNb250aCgpICsgMSkgKyBcIi9cIiArIHRoaXMuZ2V0VHdvKGRhdGUuZ2V0RGF0ZSgpKSArIFwiIFwiICsgdGhpcy5nZXRUd28oZGF0ZS5nZXRIb3VycygpKSArIFwiOlwiICsgdGhpcy5nZXRUd28oZGF0ZS5nZXRNaW51dGVzKCkpO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmnIgv5pelXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgZm9ybWF0RGF0YTEodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XHJcbiAgICAgICAgc3RyID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpICsgXCLmnIhcIiArIGRhdGUuZ2V0RGF0ZSgpICsgXCLml6VcIjtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5bm05pyI5pelXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgZm9ybWF0WWVhck1vbnRoRGF0ZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgKiAxMDAwKTtcclxuICAgICAgICBzdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIi5cIiArIChkYXRlLmdldE1vbnRoKCkgKyAxKSArIFwiLlwiICsgZGF0ZS5nZXREYXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW5tC3mnIgt5pelXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgZm9ybWF0WWVhck1vbnRoRGF0ZTEodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XHJcbiAgICAgICAgdmFyIG1vbnRoOiBzdHJpbmcgPSAoZGF0ZS5nZXRNb250aCgpICsgMSkgPj0gMTAgPyAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKSA6IFwiMFwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xyXG4gICAgICAgIHZhciBkYXRlczogc3RyaW5nID0gZGF0ZS5nZXREYXRlKCkgPj0gMTAgPyBkYXRlLmdldERhdGUoKS50b1N0cmluZygpIDogXCIwXCIgKyBkYXRlLmdldERhdGUoKTtcclxuICAgICAgICBzdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIi1cIiArIG1vbnRoICsgXCItXCIgKyBkYXRlcztcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgIExYYW5kSlhUaW1lVHlwZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHtcclxuICAgICAgICAgICAgc3RyID0gXCIw56eSXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8IDYwKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IE1hdGguZmxvb3IodmFsdWUpICsgXCLnp5JcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgNjAgKiA2MCkge1xyXG4gICAgICAgICAgICBzdHIgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjApICsgXCLliIbpkp9cIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgaG91cjogbnVtYmVyO1xyXG4gICAgICAgICAgICBob3VyID0gTWF0aC5mbG9vcih2YWx1ZSAvIDYwIC8gNjApO1xyXG4gICAgICAgICAgICBzdHIgPSBob3VyICsgXCLlsI/ml7ZcIjtcclxuICAgICAgICAgICAgc3RyICs9IE1hdGguZmxvb3IoKHZhbHVlIC0gaG91ciAqIDYwICogNjApIC8gNjApICsgXCLliIbpkp9cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOagvOW8j+WMluaXtumXtFxyXG4gICAgICogQHBhcmFtIHRpbWUg56eSXHJcbiAgICAgKiBAcmV0dXJuIOi/lOWbnjI0OjU5OjU5XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgZm9ybWF0VGltZSh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyAzNjAwKTtcclxuICAgICAgICBpZiggaG91cnMgPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN0ciArPSBob3VycyA+PSAxMCA/IChob3VycyArIFwiOlwiKSA6IChcIjBcIiArIGhvdXJzICsgXCI6XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDM2MDApIC8gNjApO1xyXG4gICAgICAgIHN0ciArPSBtaW51dGVzID49IDEwID8gKG1pbnV0ZXMgKyBcIjpcIikgOiAoXCIwXCIgKyBtaW51dGVzICsgXCI6XCIpO1xyXG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIDYwKTtcclxuICAgICAgICBzdHIgKz0gc2Vjb25kID49IDEwID8gKHNlY29uZCArIFwiXCIpIDogKFwiMFwiICsgc2Vjb25kKTtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5qC85byP5YyW5pe26Ze0XHJcbiAgICAgKiBAcGFyYW0gdGltZSDnp5JcclxuICAgICAqIEByZXR1cm4g6L+U5ZueMjTlsI/ml7Y1OeWIhjU556eSIFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIGZvcm1hdFRpbWUxKHRpbWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xyXG4gICAgICAgIGlmKCBob3VycyA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiG6ZKfXCI7XHJcbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgNjApO1xyXG4gICAgICAgIHN0ciArPSBzZWNvbmQgKyBcIuenklwiO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmoLzlvI/ljJbml7bpl7RcclxuICAgICAqIEBwYXJhbSB0aW1lIOenklxyXG4gICAgICogQHJldHVybiDov5Tlm54x5bCP5pe2MjTliIYxMOenklxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIGZvcm1hdFRpbWU1KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xyXG4gICAgICAgIGlmKCBob3VycyA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICBpZihtaW51dGVzPjApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiGXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIDYwKTtcclxuICAgICAgICBzdHIgKz0gc2Vjb25kICsgXCLnp5JcIjtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5qC85byP5YyW5pe26Ze0XHJcbiAgICAgKiBAcGFyYW0gdGltZSDnp5JcclxuICAgICAqIEByZXR1cm4g6L+U5ZueMeWkqTI05bCP5pe2NTnliIY1OeenklxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIGZvcm1hdFRpbWUyKHRpbWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF5OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyA4NjQwMCk7XHJcbiAgICAgICAgaWYoZGF5PjApe1xyXG4gICAgICAgICAgICBzdHIgKz0gZGF5ICsgXCLlpKlcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyAzNjAwKTtcclxuICAgICAgICBpZihob3Vycz4wKXtcclxuICAgICAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICBpZihtaW51dGVzPjApe1xyXG4gICAgICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiG6ZKfXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IE1hdGguY2VpbCh0aW1lICUgNjApO1xyXG4gICAgICAgIHN0ciArPSBzZWNvbmQgKyBcIuenklwiO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmoLzlvI/ljJbml7bpl7RcclxuICAgICAqIEBwYXJhbSB0aW1lIOenklxyXG4gICAgICogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7bvvIgg5Y+q5L+d55WZ5Lik5LiqIO+8iVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIGZvcm1hdFRpbWU2KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZGF5OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyA4NjQwMCk7XHJcbiAgICAgICAgaWYgKGRheT4wKXtcclxuICAgICAgICAgICAgc3RyICs9IGRheSArIFwi5aSpXCI7XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDg2NDAwKSAvIDM2MDApO1xyXG4gICAgICAgIGlmIChob3Vycz4wKXtcclxuICAgICAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluZGV4IDwgMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgMzYwMCkgLyA2MCk7XHJcbiAgICAgICAgICAgIGlmKG1pbnV0ZXM+MCl7XHJcbiAgICAgICAgICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiGXCI7XHJcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbmRleCA8IDIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc2Vjb25kOiBudW1iZXIgPSBNYXRoLmNlaWwodGltZSAlIDYwKTtcclxuICAgICAgICAgICAgc3RyICs9IHNlY29uZCArIFwi56eSXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAqIOagvOW8j+WMluaXtumXtFxyXG4gKiBAcGFyYW0gdGltZSDnp5JcclxuICogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhlxyXG4gKi9cclxuc3RhdGljICBmb3JtYXRUaW1lMyh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGRheTogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gODY0MDApO1xyXG4gICAgICAgIHN0ciArPSBkYXkgKyBcIuWkqVwiO1xyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgODY0MDAgLyAzNjAwKTtcclxuICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG5cclxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDg2NDAwICUgMzYwMCkgLyA2MCk7XHJcbiAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhlwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4qIOagvOW8j+WMluaXtumXtFxyXG4qIEBwYXJhbSB0aW1lIOenklxyXG4qIEByZXR1cm4g6L+U5ZueMeWkqTI05bCP5pe2NTnliIZcclxuKi9cclxuc3RhdGljICBmb3JtYXRUaW1lNCh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRpbWUgPiA4NjQwMCkge1xyXG4gICAgICAgICAgICB2YXIgZGF5OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyA4NjQwMCk7XHJcbiAgICAgICAgICAgIHN0ciArPSBkYXkgKyBcIuWkqVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGltZSA+IDM2MDApIHtcclxuICAgICAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSA4NjQwMCAvIDM2MDApO1xyXG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGltZSA+IDYwKSB7XHJcbiAgICAgICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgODY0MDAgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhumSn1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiog5qC85byP5YyW5pe26Ze0XHJcbiogQHBhcmFtIHRpbWUg56eSXHJcbiogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhlxyXG4qL1xyXG5zdGF0aWMgIGZvcm1hdFRpbWU0QXJyKHRpbWU6IG51bWJlcik6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgICAgIHZhciBhcnJUaW1lOkFycmF5PHN0cmluZz4gPSBbXTtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIC8vIGlmICh0aW1lID49IDg2NDAwKSB7XHJcbiAgICAgICAgLy8gICAgIHZhciBkYXk6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDg2NDAwKTtcclxuICAgICAgICAvLyAgICAgYXJyVGltZS51bnNoaWZ0KFN0cmluZyhkYXkpKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgaWYgKHRpbWUgPj0gMzYwMCkge1xyXG4gICAgICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIDg2NDAwIC8gMzYwMCk7XHJcbiAgICAgICAgICAgIGFyclRpbWUudW5zaGlmdChTdHJpbmcoaG91cnMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRpbWUgPj0gNjApIHtcclxuICAgICAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSA4NjQwMCAlIDM2MDApIC8gNjApO1xyXG4gICAgICAgICAgICBhcnJUaW1lLnVuc2hpZnQoU3RyaW5nKG1pbnV0ZXMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhcnJUaW1lO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgIGdldFR3byh2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBTdHJpbmcodmFsdWUpO1xyXG4gICAgICAgIGlmIChzdHIubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgICBzdHIgPSBcIjBcIiArIHN0cjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaXpeacn+i9rOaXtumXtOaIs1xyXG4gICAgICogQHBhcmFtIHN0ciAyMDE4LTEtMSBcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBkYXRldG9UaW1lKHN0cjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gRGF0ZS5wYXJzZShzdHIpIC8gMTAwMDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIFRpbWVyU2VydmljZSBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIGluczpUaW1lclNlcnZpY2U7XHJcbiAgICBwcml2YXRlIF90aW1lU2NhbGU6bnVtYmVyID0gMTtcclxuXHJcbiAgICBwcml2YXRlIF91bnNjYWxhYmxlTGlzdDpBcnJheTxUaW1lckNvbnRyb2w+ID0gW107XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpUaW1lclNlcnZpY2VcclxuICAgIHtcclxuICAgICAgICBpZiggVGltZXJTZXJ2aWNlLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGltZXJTZXJ2aWNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBUaW1lclNlcnZpY2UuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEudGltZXIuZnJhbWVMb29wKCAxLCB0aGlzLCB0aGlzLm9uVGltZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdG9wKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsIHRoaXMub25UaW1lciApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWNvdmVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgIExheWEudGltZXIuZnJhbWVMb29wKCAxLCB0aGlzLCB0aGlzLm9uVGltZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uVGltZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICBmb3IoaT0wOyBpPHRoaXMuX3Vuc2NhbGFibGVMaXN0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdW5zY2FsYWJsZUxpc3RbaV0udXBkYXRlKExheWEudGltZXIuZGVsdGEgKiB0aGlzLl90aW1lU2NhbGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFzVXBkYXRhVGFyZ2V0KCB1cGRhdGVUYXJnZXQ6VGltZXJDb250cm9sICk6Qm9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleDpudW1iZXI7XHJcbiAgICAgICAgaW5kZXggPSB0aGlzLl91bnNjYWxhYmxlTGlzdC5pbmRleE9mKHVwZGF0ZVRhcmdldCk7XHJcbiAgICAgICAgaWYoIGluZGV4ICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFVwZGF0ZVRhcmdldCh1cGRhdGVUYXJnZXQ6VGltZXJDb250cm9sKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGluZGV4Om51bWJlcjtcclxuICAgICAgICBpbmRleCA9IHRoaXMuX3Vuc2NhbGFibGVMaXN0LmluZGV4T2YodXBkYXRlVGFyZ2V0KTtcclxuICAgICAgICBpZihpbmRleD09LTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl91bnNjYWxhYmxlTGlzdC5wdXNoKHVwZGF0ZVRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVVcGRhdGVUYXJnZXQodXBkYXRlVGFyZ2V0OlRpbWVyQ29udHJvbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleDpudW1iZXIgPSB0aGlzLl91bnNjYWxhYmxlTGlzdC5pbmRleE9mKHVwZGF0ZVRhcmdldCk7XHJcbiAgICAgICAgaWYoaW5kZXghPS0xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdW5zY2FsYWJsZUxpc3Quc3BsaWNlKGluZGV4LDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWVTY2FsZSgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lU2NhbGU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgdGltZVNjYWxlKHZhbHVlOm51bWJlcilcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IGlzTmFOKHZhbHVlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fdGltZVNjYWxlID0gdmFsdWU7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge1VzZXJEYXRhSW5mb30gZnJvbSBcIi4uL0RhdGEvVXNlckRhdGFJbmZvXCI7XHJcbmltcG9ydCB7TG9jYWxEYXRhQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvTG9jYWxEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4uL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRpbWVzVGFtcGVyIGltcGxlbWVudHMgVGltZXJDb250cm9sXHJcbntcclxuXHRwdWJsaWMgbGFzdGdhbWVUaW1lOm51bWJlciA9IDA7XHJcblx0cHVibGljIGNvbnN0cnVjdG9yKCkgXHJcblx0e1xyXG5cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc3RhdGljIGluczogVGltZXNUYW1wZXI7XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFRpbWVzVGFtcGVyIHtcclxuICAgICAgICBpZiAoVGltZXNUYW1wZXIuaW5zID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lc1RhbXBlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gVGltZXNUYW1wZXIuaW5zO1xyXG4gICAgfVxyXG5cclxuXHRwdWJsaWMgaW5pdCggKTp2b2lkXHJcblx0e1xyXG5cdFx0dGhpcy5sYXN0Z2FtZVRpbWUgPSBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmdldG51bSggVXNlckRhdGFJbmZvLmxhc3R0aW1lICk7XHJcblx0XHRMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCB0aGlzLnVwZGF0ZSApO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICog5ZCM5q2l5pyN5Yqh5Zmo5pe26Ze0KOenkilcclxuXHQgKi9cclxuXHRwcml2YXRlIF9zZXJ2ZXJUaW1lOiBudW1iZXIgPSAwO1xyXG5cclxuXHRwcml2YXRlIGlzY2FuOmJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIF9vbmxpbmVkaXN0aW1lOm51bWJlciA9IDA7XHJcblx0XHJcblx0cHVibGljIHVwZGF0ZVNlcnZpY2VUaW1lKHNlcnZlclRpbWU6IG51bWJlcik6IHZvaWQge1xyXG5cdFx0dGhpcy5fc2VydmVyVGltZSA9IE51bWJlcihzZXJ2ZXJUaW1lKTtcclxuXHRcdHRoaXMuaXNjYW4gPSB0cnVlO1xyXG5cdFx0dGhpcy5fb25saW5lZGlzdGltZSA9IHRoaXMuX3NlcnZlclRpbWU7XHJcblx0XHRMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLmxhc3R0aW1lLHRoaXMuX3NlcnZlclRpbWUudG9TdHJpbmcoKSApO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG5cdHByaXZhdGUgX29ubGluZXRpbWU6bnVtYmVyID0gMDtcclxuXHRwdWJsaWMgdXBkYXRlKCk6IHZvaWQgXHJcblx0e1xyXG5cdFx0aWYoIHRoaXMuaXNjYW4gKVxyXG5cdFx0e1xyXG5cdFx0XHR0aGlzLl90aW1lICs9IExheWEudGltZXIuZGVsdGE7XHJcblx0XHRcdHRoaXMuX29ubGluZXRpbWUgKz0gTGF5YS50aW1lci5kZWx0YTtcclxuXHRcdFx0dGhpcy5fc2VydmVyVGltZSArPSBMYXlhLnRpbWVyLmRlbHRhIC8gMTAwMDtcclxuXHRcdFx0aWYoIHRoaXMuX3RpbWUgPj0gMzAwMDAgKVxyXG5cdFx0XHR7XHJcblx0XHRcdFx0dGhpcy5fdGltZSA9IDA7XHJcblx0XHRcdFx0TG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5hZGRzdHIoIFVzZXJEYXRhSW5mby5sYXN0dGltZSx0aGlzLl9zZXJ2ZXJUaW1lLnRvU3RyaW5nKCkgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiggdGhpcy5fb25saW5ldGltZSA+PSA5MDAwMCApXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0aGlzLl9vbmxpbmV0aW1lID0gMDtcclxuXHRcdFx0XHR0aGlzLnNlbmRvbmxpbmVUb25namkoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIHNlbmRvbmxpbmVUb25namkoKTp2b2lkXHJcblx0e1xyXG5cdFx0dmFyIGRpc3RpbWU6bnVtYmVyID0gdGhpcy5zZXJ2ZXJUaW1lIC0gdGhpcy5fb25saW5lZGlzdGltZTtcclxuXHRcdGlmKCBkaXN0aW1lID4gMCApXHJcblx0XHR7XHJcblx0XHRcdHRoaXMuX29ubGluZWRpc3RpbWUgPSB0aGlzLnNlcnZlclRpbWU7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiDmnI3liqHlmajml7bpl7QgKCDnp5IgKSBcclxuXHQgKiBAcmV0dXJuIFxyXG5cdCAqIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXQgc2VydmVyVGltZSgpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3NlcnZlclRpbWU7XHJcblx0fVxyXG5cclxufSIsImltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge1ZpZXdBY3Rpb259IGZyb20gXCIuLi91dGlscy9WaWV3QWN0aW9uXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvR2FtZVN0YXRlQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCB7QWdlbmN5VXNlck1lc3NhZ2V9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VXNlck1lc3NhZ2VcIjtcclxuaW1wb3J0IHtBZ2VuY3lJbkdhbWV9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5SW5HYW1lXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgUFJPVE9DT0xTLCBOZXR3b3JrTWFuYWdlciB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7cGluZ3RhaXV0aWxzfSBmcm9tIFwiLi4vV1hTREsvcGluZ3RhaXV0aWxzXCI7XHJcbmltcG9ydCB7R3VhbmdHYW99IGZyb20gXCIuLi9XWFNESy9HdWFuZ0dhb1wiO1xyXG5pbXBvcnQgeyBHYW1lU3RhdGUgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9HYW1lL1BsYXllclwiO1xyXG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xyXG5pbXBvcnQge0NoYXJhY3RlclN0YXRlfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZVwiO1xyXG5pbXBvcnQgeyBTaGFyZVV0aWwgfSBmcm9tIFwiLi4vV1hTREsvU2hhcmVVdGlsXCI7XHJcbmltcG9ydCB7IFJlY29yZE1hbmFnZXIgfSBmcm9tIFwiLi4vV1hTREsvUmVjb3JkTWFuYWdlclwiO1xyXG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL1dYU0RLL3R0YWRcIjtcclxuLy8gaW1wb3J0IENob3V0aVBhblZpZXcgZnJvbSBcIi4uL1B1c2gvQ2hvdXRpUGFuVmlld1wiO1xyXG5leHBvcnQgY2xhc3MgQ29tcGxldGVQYW5lbCBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2wgXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJDb21wbGV0ZVBhbmVsXCI7XHJcblxyXG4gICAgQnRuQm94OmZhaXJ5Z3VpLkdHcm91cDtcclxuICAgIGNfc3RhdGU6ZmFpcnlndWkuQ29udHJvbGxlcjtcclxuICAgIHR4dF9nb2xkOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICBidG5fMDpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgYnRuXzE6ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIGJ0bl8yOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICB0aW1lbnVtOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICBUaWFuSmlhQW5pOmZhaXJ5Z3VpLlRyYW5zaXRpb247XHJcbiAgICBCYXR0bGVCdG46ZmFpcnlndWkuR0J1dHRvbjtcclxuXHJcbiAgICB0aWFuamlhOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcblxyXG4gICAgLy/liIbkuqvnlYzpnaJcclxuICAgIFNoYXJlVmlkZW86ZmFpcnlndWkuR0NvbXBvbmVudDtcclxuICAgIFNoYXJlVmlkZW9CdG46ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIGppZXN1YW5idG46ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIHNoYXJlX2dvbGRudW06ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuXHJcbiAgICAvL+ahhlxyXG4gICAga3Vhbmc6ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIC8v5a+55Y+3XHJcbiAgICBkdWloYW86ZmFpcnlndWkuR0ltYWdlO1xyXG5cclxuXHJcbiAgICBnZXRnb2xkOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9nYW1lUHJveHk6QWdlbmN5SW5HYW1lO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvciggZ29sZDpudW1iZXIgKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoIFwibWFpblwiLFwiZ2FtZXJlc3VsdFwiLGZhbHNlLFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lLDEgKTsgXHJcbiAgICAgICAgdGhpcy5nZXRnb2xkID0gZ29sZDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBsb2FkU2NlbmUoKTp2b2lkIHtcclxuXHRcdExheWEuU2NlbmUzRC5sb2FkKFwicmVzL3RocmVlRGltZW4vc2NlbmUvUGFydGljbGVTY2VuZS9FeGFtcGxlXzAxLmxzXCIsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgZnVuY3Rpb24oc2NlbmU6TGF5YS5TY2VuZTNEKSB7XHJcblx0XHRcdHRoaXMuc2NlbmUgPSBMYXlhLnN0YWdlLmFkZENoaWxkQXQoc2NlbmUsIDApO1xyXG5cdFx0XHR2YXIgY2FtZXJhOkxheWEuQ2FtZXJhID0gdGhpcy5zY2VuZS5hZGRDaGlsZChuZXcgTGF5YS5DYW1lcmEoMCwgMC4xLCAxMDApKTtcclxuXHRcdFx0Y2FtZXJhLnRyYW5zZm9ybS50cmFuc2xhdGUobmV3IExheWEuVmVjdG9yMygwLCAxLCAwKSk7XHJcblx0XHR9KSk7XHJcblx0fVxyXG5cdHByaXZhdGUgZ2FyYmFnZUNvbGxlY3Rpb24oKTp2b2lkIHtcclxuXHRcdHRoaXMuc2NlbmUuZGVzdHJveSgpOy8v6ZSA5q+B5Zy65pmvXHJcblx0XHR0aGlzLnNjZW5lID0gbnVsbDtcclxuXHRcdExheWEuUmVzb3VyY2UuZGVzdHJveVVudXNlZFJlc291cmNlcygpOy8v6ZSA5q+B5peg55So6LWE5rqQKOayoeacieiiq+WcuuaZr+agkeW8leeUqCzlubbkuJTmsqHmnInliqDotYTmupDplIHnmoQpXHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHJpdmF0ZSBidG4xY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID09IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYodGhpcy5kdWloYW8udmlzaWJsZSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXl2aWRlb2NhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkdvbGRVcCggdGhpcy5nZXRnb2xkICk7XHJcbiAgICAgICAgICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5MZXZlbFVwKCAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dhbWVQcm94eS5yZXR1cm5tYWludmlldyh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZih0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCB0aGlzLmdldGdvbGQgKTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVByb3h5LnJldHVybm1haW52aWV3KCApO1xyXG4gICAgICAgICAgICAvLyBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZih0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAyKXtcclxuICAgICAgICAgICAgLy8gU2hhcmVVdGlsLnNoYXJlSW1hZ2UoXCLliIbkuqvlpI3mtLstLS0tXCIsdGhpcy5zaGFyZXJldml2ZSxcIjFcIilcclxuICAgICAgICAgICAgdGhpcy5zaGFyZXJldml2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db21wbGV0ZSgpOiB2b2lkIHtcclxuICAgICAgICBMYXlhLlNwcml0ZTNELmxvYWQoXCJyZXMvdGhyZWVEaW1lbi9za2luTW9kZWwvTGF5YU1vbmtleS9MYXlhTW9ua2V5LmxoXCIsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgZnVuY3Rpb24obGF5YU1vbmtleTNEOkxheWEuU3ByaXRlM0QpOnZvaWQge1xyXG4gICAgICAgICAgICB0aGlzLmxheWFNb25rZXkzRCA9IGxheWFNb25rZXkzRDtcclxuICAgICAgICAgICAgdGhpcy5zY2VuZS5hZGRDaGlsZChsYXlhTW9ua2V5M0QpO1xyXG4gICAgICAgICAgICB0aGlzLmxheWFNb25rZXkyRCA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuSW1hZ2UoXCJyZXMvdGhyZWVEaW1lbi9tb25rZXkucG5nXCIpKSBhcyBMYXlhLkltYWdlO1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCB0aGlzLmFuaW1hdGUpO1xyXG4gICAgICAgIH0pKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBzY2VuZTpMYXlhLlNjZW5lM0Q7XHJcbiAgICBwcml2YXRlIGNhbWVyYTpMYXlhLkNhbWVyYTtcclxuICAgIHByaXZhdGUgbGF5YU1vbmtleTNEOkxheWEuU3ByaXRlM0Q7XHJcbiAgICBwcml2YXRlIGxheWFNb25rZXkyRDpMYXlhLkltYWdlO1xyXG4gICAgcHJpdmF0ZSBfcG9zaXRpb246TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgcHJpdmF0ZSBfb3V0UG9zOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcclxuICAgIHByaXZhdGUgc2NhbGVEZWx0YTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBzY2FsZTpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKDAuMSwwLjEsMC4xKTtcclxuICAgIHByaXZhdGUgYW5pbWF0ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9wb3NpdGlvbi54ID0gTWF0aC5zaW4odGhpcy5zY2FsZURlbHRhICs9IDAuMDEpO1xyXG4gICAgICAgIHRoaXMubGF5YU1vbmtleTNELnRyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX3Bvc2l0aW9uO1xyXG4gICAgICAgIHRoaXMubGF5YU1vbmtleTNELnRyYW5zZm9ybS5zY2FsZSA9IHRoaXMuc2NhbGU7XHJcbiAgICAgICAgLy/ovazmjaLlnZDmoIdcclxuICAgICAgICB0aGlzLmNhbWVyYS52aWV3cG9ydC5wcm9qZWN0KHRoaXMubGF5YU1vbmtleTNELnRyYW5zZm9ybS5wb3NpdGlvbiwgdGhpcy5jYW1lcmEucHJvamVjdGlvblZpZXdNYXRyaXgsIHRoaXMuX291dFBvcyk7XHJcbiAgICAgICAgLy/otYvlgLznu5kyRFxyXG4gICAgICAgIHRoaXMubGF5YU1vbmtleTJELnBvcyh0aGlzLl9vdXRQb3MueCAvIExheWEuc3RhZ2UuY2xpZW50U2NhbGVYLCB0aGlzLl9vdXRQb3MueSAvIExheWEuc3RhZ2UuY2xpZW50U2NhbGVZKTtcclxuICAgIH1cclxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIGJ0bjBjbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBsYXl2aWRlb2NhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIC8vIHBpbmd0YWl1dGlscy5JbnN0YW5jZS5wbGF5VmlkZW8oIFwiXCIsdGhpcyx0aGlzLnBsYXl2aWRlb2NhbGxiYWNrICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYodGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPT0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkdvbGRVcCggdGhpcy5nZXRnb2xkICk7XHJcbiAgICAgICAgICAgIHRoaXMuX2dhbWVQcm94eS5yZXR1cm5tYWludmlldyggKTtcclxuICAgICAgICAgICAgLy8gVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3ICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYodGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPT0gMil7XHJcbiAgICAgICAgICAgIHRoaXMuY291bnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gcGluZ3RhaXV0aWxzLkluc3RhbmNlLnBsYXlWaWRlbyhcIlwiLHRoaXMsdGhpcy5wbGF5dmlkZW9yZXZpdmUpO1xyXG4gICAgICAgICAgICB0aGlzLnBsYXl2aWRlb3Jldml2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKirnnIvop4bpopHlpI3mtLvmiJDlip8gKi9cclxuICAgIHByaXZhdGUgcGxheXZpZGVvcmV2aXZlKCk6dm9pZHtcclxuICAgICAgICB0dGFkLlNob3dWaWRlbygoaXNMb2FkPT57XHJcbiAgICAgICAgICAgIGlmKGlzTG9hZCl7XHJcbiAgICAgICAgICAgICAgICAvLyBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoQ2hvdXRpUGFuVmlldyk7XHJcbiAgICAgICAgICAgICAgICBHYW1lU3RhdGUuZnVodW9jaXNodSAtLTtcclxuICAgICAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBDb21wbGV0ZVBhbmVsICk7XHJcbiAgICAgICAgICAgICAgICBHYW1lU3RhdGUuaXNkaWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5faXNjYW5Nb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8vIFBsYXllci5JbnN0YW5jZS5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xyXG4gICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICAgICAgICAgIGlmIChQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSA9PSBcIlwiIHx8IFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lID09IFwiXCIpICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLnjqnlrrbkvY3nva4tLS0tXCIsUGxheWVyLkluc3RhbmNlLl9pbml0UG9zVmVjKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIueOqeWutumAn+W6pl9tb3ZlVmVjXCIsUGxheWVyLkluc3RhbmNlLl9tb3ZlVmVjKTtcclxuICAgICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoMCwxLDMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5Zy65pmv5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5bu6562R5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5bu6562R54mp5L2N572uLS0tLVwiLFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUsIFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lLCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSkuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fc3BlZWRNb3ZlVjMueiA9IC1QbGF5ZXIuSW5zdGFuY2UuX1JvbGVEYXRhLm1vdmVzcGVlZCoyO1xyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKDMwMDAsdGhpcywoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fc3BlZWRNb3ZlVjMueiA9IC1QbGF5ZXIuSW5zdGFuY2UuX1JvbGVEYXRhLm1vdmVzcGVlZDtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcbiAgICAvKirliIbkuqvlpI3mtLvmiJDlip8gKi9cclxuICAgIHByaXZhdGUgc2hhcmVyZXZpdmUoKXtcclxuICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlNoYXJlVmlkZW8oKGlzTG9hZCk9PntcclxuICAgICAgICAgICAgIGlmKGlzTG9hZCl7XHJcbiAgICAgICAgICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlJlY29yZFN0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICBHYW1lU3RhdGUuZnVodW9jaXNodSAtLTtcclxuICAgICAgICAgICAgICAgIC8vIEdhbWVTdGF0ZS5yZWNvcmRzY3JlZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggQ29tcGxldGVQYW5lbCApO1xyXG4gICAgICAgICAgICAgICAgR2FtZVN0YXRlLmlzZGllID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX2lzY2FuTW92ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAvLyBQbGF5ZXIuSW5zdGFuY2UuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcclxuICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgICAgICBpZiAoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUgPT0gXCJcIiB8fCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSA9PSBcIlwiKSAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi546p5a625L2N572uLS0tLVwiLFBsYXllci5JbnN0YW5jZS5faW5pdFBvc1ZlYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKDAsMSwzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW9k+WJjeWcuuaZr+WQjeWtly0tLVwiLFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW9k+WJjeW7uuetkeWQjeWtly0tLVwiLFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW7uuetkeeJqeS9jee9ri0tLS1cIixQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lLCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fdHJhbnNmb3JtLnBvc2l0aW9uID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZShQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSwgUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyhcIuWkjea0u+WKoOmAn+aIkOWKn1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3NwZWVkTW92ZVYzLnogPSAtUGxheWVyLkluc3RhbmNlLl9Sb2xlRGF0YS5tb3Zlc3BlZWQqMjtcclxuICAgICAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMzAwMCx0aGlzLCgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fc3BlZWRNb3ZlVjMueiA9IC1QbGF5ZXIuSW5zdGFuY2UuX1JvbGVEYXRhLm1vdmVzcGVlZDtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gdHJ1ZTsgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC8vIGlmKF9zdWNjZXNzKXtcclxuICAgICAgICAvLyAgICAgLy8gVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKENob3V0aVBhblZpZXcpO1xyXG4gICAgICAgIC8vICAgICAgICAgR2FtZVN0YXRlLmZ1aHVvY2lzaHUgLS07XHJcbiAgICAgICAgLy8gICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggQ29tcGxldGVQYW5lbCApO1xyXG4gICAgICAgIC8vICAgICAgICAgR2FtZVN0YXRlLmlzZGllID0gZmFsc2U7XHJcbiAgICAgICAgLy8gICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX2lzY2FuTW92ZSA9IHRydWU7XHJcbiAgICAgICAgLy8gICAgICAgICAvLyBQbGF5ZXIuSW5zdGFuY2UuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcclxuICAgICAgICAvLyAgICAgICAgIFBsYXllci5JbnN0YW5jZS5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUgPT0gXCJcIiB8fCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSA9PSBcIlwiKSAge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi546p5a625L2N572uLS0tLVwiLFBsYXllci5JbnN0YW5jZS5faW5pdFBvc1ZlYyk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBQbGF5ZXIuSW5zdGFuY2UuX2luaXRQb3NWZWMuY2xvbmUoKVxyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgZWxzZSAge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5Zy65pmv5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5bu6562R5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5bu6562R54mp5L2N572uLS0tLVwiLFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUsIFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lLCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSkuY2xvbmUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgICAgICAvLyBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKFwi5aSN5rS75Yqg6YCf5oiQ5YqfXCIpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fc3BlZWRNb3ZlVjMueiA9IC1QbGF5ZXIuSW5zdGFuY2UuX1JvbGVEYXRhLm1vdmVzcGVlZCoyO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIExheWEudGltZXIub25jZSgzMDAwLHRoaXMsKCk9PntcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl9zcGVlZE1vdmVWMy56ID0gLVBsYXllci5JbnN0YW5jZS5fUm9sZURhdGEubW92ZXNwZWVkO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGVsc2V7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuY291bnQgPSB0cnVlO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBsYXl2aWRlb2NhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcclxuICAgICAgICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkdvbGRVcCggdGhpcy5nZXRnb2xkKjMgKTtcclxuICAgICAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkxldmVsVXAoICApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2FtZVByb3h5LnJldHVybm1haW52aWV3KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5CYXR0bGVCdG4udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgLy8gdHRhZC5TaG93VmlkZW8oKGlzTG9hZD0+e1xyXG4gICAgICAgIC8vICAgICBpZihpc0xvYWQpe1xyXG4gICAgICAgIC8vICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCB0aGlzLmdldGdvbGQqMyApO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fZ2FtZVByb3h5LnJldHVybm1haW52aWV3KHRydWUpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSkpXHJcbiAgICB9XHJcblxyXG4gICAgLy/liIbkuqvop4bpopFcclxuICAgIHByaXZhdGUgU2hhcmVWaWRlb0NhbGxCYWNrKCl7XHJcbiAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5TaGFyZVZpZGVvKChpc0xvYWQ9PntcclxuICAgICAgICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkdvbGRVcCggdGhpcy5nZXRnb2xkKjMgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuQmF0dGxlQnRuLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2hhcmVWaWRlby52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgIH1cclxuXHJcbiAgICAvL+eCueWHu+WLvumAieahhlxyXG4gICAgQ2xpY2tLdWFuZygpe1xyXG4gICAgICAgIGlmKHRoaXMuZHVpaGFvLnZpc2libGUpe1xyXG4gICAgICAgICAgICB0aGlzLmR1aWhhby52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuYnRuXzEudmlzaWJsZSA9IHRoaXMuZHVpaGFvLnZpc2libGU7XHJcbiAgICAgICAgICAgIHRoaXMuYnRuXzIudmlzaWJsZSA9ICF0aGlzLmR1aWhhby52aXNpYmxlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICB0aGlzLmR1aWhhby52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5idG5fMS52aXNpYmxlID0gdGhpcy5kdWloYW8udmlzaWJsZTtcclxuICAgICAgICAgICAgdGhpcy5idG5fMi52aXNpYmxlID0gIXRoaXMuZHVpaGFvLnZpc2libGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIodGhpcyx0aGlzLkNvdW50VGltZSk7XHJcbiAgICAgICAgLy8gTGF5YS50aW1lci5jbGVhcih0aGlzLHRoaXMucGxheWFuaW1hdG9yKTtcclxuICAgICAgICAvLyBHdWFuZ0dhby5DbGVhcigpO1xyXG4gICAgICAgIHR0YWQuQ2xlYXIoKTtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMudGlhbmppYS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5UaWFuSmlhQW5pID0gdGhpcy5nZXRUcmFuc2l0aW9uQnlOYW1lKFwidGlhbmppYWFuaVwiKTtcclxuICAgICAgICB0aGlzLlRpYW5KaWFBbmkuc3RvcCgpO1xyXG4gICAgICAgIC8vIExheWEudGltZXIubG9vcCgyMDAwLHRoaXMsdGhpcy5wbGF5YW5pbWF0b3IpO1xyXG4gICAgICAgIHRoaXMuY291bnQgPSB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2dhbWVQcm94eSA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeUluR2FtZSApO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZSA9IHRoaXMuZ2V0Q29udHJvbGxlckJ5QmFtZSggXCJjX3N0YXRlXCIgKTtcclxuICAgICAgICB0aGlzLnR4dF9nb2xkLnRleHQgPSB0aGlzLmdldGdvbGQudG9TdHJpbmcoKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmR1aWhhbyA9IHRoaXMua3VhbmcuZ2V0Q2hpbGRBdCgxKSBhcyBmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICAgICAgdGhpcy5kdWloYW8udmlzaWJsZSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuQ2hvb3NlO1xyXG4gICAgICAgIHRoaXMuc2hhcmVfZ29sZG51bSA9IHRoaXMuU2hhcmVWaWRlby5nZXRDaGlsZEF0KDQpIGFzIGZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICAgICAgdGhpcy5TaGFyZVZpZGVvQnRuID0gdGhpcy5TaGFyZVZpZGVvLmdldENoaWxkQXQoMSkgYXMgZmFpcnlndWkuR0J1dHRvbjtcclxuICAgICAgICB0aGlzLmppZXN1YW5idG4gPSB0aGlzLlNoYXJlVmlkZW8uZ2V0Q2hpbGRBdCgyKSBhcyBmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgICAgIHRoaXMuc2hhcmVfZ29sZG51bS50ZXh0ID0gdGhpcy5nZXRnb2xkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgdGhpcy5idG5fMS52aXNpYmxlID0gdGhpcy5kdWloYW8udmlzaWJsZTtcclxuICAgICAgICB0aGlzLmJ0bl8yLnZpc2libGUgPSAhdGhpcy5kdWloYW8udmlzaWJsZTtcclxuXHJcbiAgICAgICAgaWYoR2FtZVN0YXRlLnJlY29yZHNjcmVlICl7XHJcbiAgICAgICAgICAgIHRoaXMuQmF0dGxlQnRuLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgdGhpcy5CYXR0bGVCdG4udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZihQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLlNob3dCYXR0bGVCdG4pe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5CYXR0bGVCdG4udmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5CYXR0bGVCdG4udmlzaWJsZSA9ICFHYW1lU3RhdGUucmVjb3Jkc2NyZWU7XHJcbiAgICAgICAgaWYoIUdhbWVTdGF0ZS5pc2RpZSl7Ly/njqnlrrbmnKrmrbvkuqHnmoTnirbmgIFcclxuICAgICAgICAgICAgaWYoIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2UuZW5kR2FtZVBsYXllckFyci5sZW5ndGggPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBpZihHYW1lU3RhdGUuZnVodW9jaXNodT4wKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMjtcclxuICAgICAgICAgICAgICAgIExheWEudGltZXIubG9vcCgxMDAwLHRoaXMsdGhpcy5Db3VudFRpbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPT0gMCl7XHJcbiAgICAgICAgICAgIHRoaXMuU2hhcmVWaWRlby52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5qaWVzdWFuYnRuLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKDIwMDAsdGhpcywoKT0+e1xyXG4gICAgICAgICAgICAgICAgdGhpcy5qaWVzdWFuYnRuLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICB0aGlzLlNoYXJlVmlkZW8udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBHdWFuZ0dhby5DaGVhdEJhbm5lcih0aGlzLmJ0bl8xKTtcclxuICAgIH1cclxuICAgIHBsYXlhbmltYXRvcigpe1xyXG4gICAgICAgIHRoaXMuVGlhbkppYUFuaS5wbGF5KG51bGwsMSk7XHJcbiAgICB9XHJcblxyXG4gICAgQ2xpY2tKaWVTdWFuKCl7XHJcbiAgICAgICAgdGhpcy5TaGFyZVZpZGVvLnZpc2libGUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYnRuXzAsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuYnRuMGNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fMSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5idG4xY2xpY2sgKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLkJhdHRsZUJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5TaGFyZUJhdHRsZSk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fMixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5idG4xY2xpY2spO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMua3VhbmcsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuQ2xpY2tLdWFuZyk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5TaGFyZVZpZGVvQnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLlNoYXJlVmlkZW9DYWxsQmFjayk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5qaWVzdWFuYnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLkNsaWNrSmllU3Vhbik7XHJcbiAgICB9XHJcblxyXG4gICAgIHRpbWUgPSA5O1xyXG4gICAgIGNvdW50ID0gZmFsc2U7XHJcbiAgICAgZnVodW8gPSBmYWxzZTtcclxuICAgICAvL+WAkuiuoeaXtlxyXG4gICAgIENvdW50VGltZSgpXHJcbiAgICAge1xyXG4gICAgICAgICBpZih0aGlzLmNvdW50ICYmIHRoaXMudGltZSA+IDApXHJcbiAgICAgICAgIHtcclxuICAgICAgICAgICAgIHRoaXMudGltZSAtPSAxO1xyXG4gICAgICAgICAgICAgdGhpcy50aW1lbnVtLnRleHQgPSB0aGlzLnRpbWUudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgIGlmKHRoaXMudGltZSA8IDEpXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKHRoaXMsdGhpcy5Db3VudFRpbWUpO1xyXG4gICAgICAgICAgICAgICAgR2FtZVN0YXRlLmZ1aHVvY2lzaHUtLTtcclxuICAgICAgICAgICAgICAgIC8vIExheWEudGltZXIuY2xlYXIodGhpcyx0aGlzLnBsYXlhbmltYXRvcik7XHJcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZShDb21wbGV0ZVBhbmVsKTtcclxuICAgICAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5sb3NlICk7XHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgIH1cclxuICAgICB9XHJcblxyXG4gICAgIC8v5b2V5bGP5YiG5LqrXHJcbiAgICAgU2hhcmVCYXR0bGUoKXtcclxuICAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5TaGFyZVZpZGVvKChpc0xvYWQpPT57XHJcbiAgICAgICAgICAgIGlmKGlzTG9hZCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgfSlcclxuICAgICAgICAvLyAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5TaGFyZVZpZGVvKChpc0xvYWQ9PntcclxuICAgICAgICAvLyAgICAgIGlmKGlzTG9hZCl7XHJcbiAgICAgICAgLy8gICAgICAgICAgdGhpcy5CYXR0bGVCdG4udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIC8vICAgICAgfVxyXG4gICAgICAgIC8vICB9KSlcclxuXHJcbiAgICAgfVxyXG59IiwiaW1wb3J0IHsgUGFuZWxCYXNlQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgeyBUaW1lclNlcnZpY2UgfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcclxuaW1wb3J0IHsgR3VhbmdHYW8gfSBmcm9tIFwiLi4vV1hTREsvR3VhbmdHYW9cIjtcclxuaW1wb3J0IHsgVmlld0FjdGlvbiB9IGZyb20gXCIuLi91dGlscy9WaWV3QWN0aW9uXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4vVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHsgQWdlbmN5SW5HYW1lIH0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lJbkdhbWVcIjtcclxuaW1wb3J0IHsgQWdlbmN5TG90dGVyeSB9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5TG90dGVyeVwiO1xyXG5pbXBvcnQgTG90dGVyeUNGRyBmcm9tIFwiLi4vQ0ZHL0xvdHRlcnlDRkdcIjtcclxuaW1wb3J0IHsgU2NlbmVDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvU2NlbmVDb250cm9sXCI7XHJcbmltcG9ydCB7IEdhbWVTdGF0ZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9HYW1lU3RhdGVDb250cm9sXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi4vV1hTREsvU2RrXCI7XHJcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vV1hTREsvdHRhZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWdnUGFuZWwgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sIGltcGxlbWVudHMgVGltZXJDb250cm9sXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJFZ2dQYW5lbFwiO1xyXG5cclxuICAgIGxvYWRfY2xpY2s6ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIHByb18wOmZhaXJ5Z3VpLkdQcm9ncmVzc0JhcjtcclxuICAgIGJ0bl8xOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBidG5fY2xvc2U6ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIGhpdGFuaTpmYWlyeWd1aS5UcmFuc2l0aW9uO1xyXG4gICAgZ2V0cmV3YXJkYnRuOmZhaXJ5Z3VpLkdCdXR0b247XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNDb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfaXNTaG93QmFubmVyID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9iYW5uZXJWYWwgPSAwLjU7XHJcbiAgICBwcml2YXRlIF9tYXhDbGlja0NudCA9IDE4O1xyXG4gICAgcHJpdmF0ZSBfY2xpY2tDbnQgPSAwO1xyXG4gICAgcHJpdmF0ZSBfaW50ZXJ2YWwgPSAxMDA7XHJcbiAgICBwcml2YXRlIF9kZWNyZW1lbnQgPSAxO1xyXG5cclxuICAgIG42OmZhaXJ5Z3VpLkdHcm91cDtcclxuICAgIENoZXN0OmZhaXJ5Z3VpLkdHcm91cDtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoIFwibWFpblwiLFwiZWdndmlld1wiLGZhbHNlLFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lLDEgKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaGl0YW5pID0gdGhpcy5nZXRUcmFuc2l0aW9uQnlOYW1lKCBcImhpdGFuaVwiICk7XHJcbiAgICAgICAgdGhpcy5wcm9fMC52YWx1ZSA9IDE7XHJcbiAgICAgICAgdGhpcy5fYmFubmVyVmFsID0gR2FtZVV0aWxzLnJhbmRSYW5nZWZsb2F0KDAuMiwgMC40KTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgLy8gR3VhbmdHYW8uQ2hlYXRCYW5uZXIodGhpcy5idG5fMSk7XHJcbiAgICAgICAgLy8gR3VhbmdHYW8uQ2xlYXIoKTsvL2hbXCJkZWZhdWx0XCJdLkNsZWFyKClyW1wiZGVmYXVsdFwiXVxyXG4gICAgICAgIHR0YWQuQ2xlYXIoKTtcclxuICAgICAgICB2YXIgc2NlbmVoZWlnaHQgPSBMYXlhLnN0YWdlLmhlaWdodDtcclxuICAgICAgICB0aGlzLmJ0bl8xLnk9c2NlbmVoZWlnaHQtdGhpcy5idG5fMS5oZWlnaHQtMTU7XHJcbiAgICAgICAgdGhpcy5nZXRyZXdhcmRidG4ueSA9IHRoaXMuYnRuXzEueTtcclxuICAgICAgICB0aGlzLmdldHJld2FyZGJ0bi52aXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmKFNjZW5lQ29udHJvbC5FZ2dHR3JvdXA9PTApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm42LnZpc2libGU9dHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmFubmVyY2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fMSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5xaWFvRGEgKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl9jbG9zZSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsRWdnUGFuZWwub25jbG9zZWZ1biApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuZ2V0cmV3YXJkYnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyxFZ2dQYW5lbC5WaWRlb0dldFJld2FyZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3RpbWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl90aW1lICs9IGR0O1xyXG4gICAgICAgIGlmKCB0aGlzLl90aW1lID49IHRoaXMuX2ludGVydmFsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWUgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLkRhb2ppc2hpKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIERhb2ppc2hpKCkge1xyXG4gICAgICAgIGxldCBwdiA9IHRoaXMucHJvXzAudmFsdWU7XHJcbiAgICAgICAgcHYgLT0gdGhpcy5fZGVjcmVtZW50O1xyXG4gICAgICAgIGlmIChwdiA8PSAwKSBwdiA9IDE7XHJcbiAgICAgICAgdGhpcy5wcm9fMC52YWx1ZSA9IHB2O1xyXG4gICAgICAgIHRoaXMuX2NsaWNrQ250ID0gTWF0aC5jZWlsKHB2ICp0aGlzLl9tYXhDbGlja0NudCAvMTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHFpYW9EYSgpIFxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5faXNDb21wbGV0ZSkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZih0aGlzLmhpdGFuaSE9bnVsbCYmICF0aGlzLmhpdGFuaS5wbGF5aW5nIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaXRhbmkucGxheSggbnVsbCwxICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tDbnQrKztcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NsaWNrQ250ID4gdGhpcy5fbWF4Q2xpY2tDbnQpIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tDbnQgPSB0aGlzLl9tYXhDbGlja0NudDtcclxuICAgICAgICAgICAgbGV0IHB2ID0gdGhpcy5fY2xpY2tDbnQgLyB0aGlzLl9tYXhDbGlja0NudDtcclxuICAgICAgICAgICAgaWYoIHB2ID4gMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHB2ID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnByb18wLnZhbHVlID0gcHYqMTAwO1xyXG4gICAgICAgICAgICBpZiAocHYgPj0gdGhpcy5fYmFubmVyVmFsICYmICF0aGlzLl9pc1Nob3dCYW5uZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd0Jhbm5lciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldHJld2FyZGJ0bi52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8vIEd1YW5nR2FvLk9wZW5CYW5uZXIoKTtcclxuICAgICAgICAgICAgICAgIExheWEudGltZXIub25jZSggMjAwMCx0aGlzLCgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRyZXdhcmRidG4udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwdiA+PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0NvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIEVnZ1BhbmVsLmdldHJld2FyZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRyZXdhcmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gdmFyIHpwcHJveHk6QWdlbmN5TG90dGVyeSA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeUxvdHRlcnkgKSBhcyBBZ2VuY3lMb3R0ZXJ5O1xyXG4gICAgICAgIC8vIHZhciBpbmRleCA9ICggdGhpcy5nZXRQcm94eSggQWdlbmN5TG90dGVyeSApIGFzIEFnZW5jeUxvdHRlcnkgKS5HZXRSZXdhcmQoKTtcclxuICAgICAgICAvLyB2YXIgc2VsZWN0Y2ZnOkxvdHRlcnlDRkcgPSBMb3R0ZXJ5Q0ZHLnZlY1sgaW5kZXggXTtcclxuICAgICAgICAvLyB6cHByb3h5LmdldHJld2FyZCggc2VsZWN0Y2ZnICk7XHJcbiAgICAgICAgLy8gVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi6I635b6X5byA5bGA5Yqg6YCfXCIgKTtcclxuICAgICAgICBFZ2dQYW5lbC5vbmNsb3NlZnVuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/nnIvop4bpopHlvpflpZblirFcclxuICBzdGF0aWMgVmlkZW9HZXRSZXdhcmQoKXtcclxuICAgICAgICB0dGFkLlNob3dWaWRlbygoaXNMb2FkPT57XHJcbiAgICAgICAgICAgIGlmKGlzTG9hZCl7XHJcbiAgICAgICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuiOt+W+l+W8gOWxgOWKoOmAn1wiICk7XHJcbiAgICAgICAgICAgICAgICBFZ2dQYW5lbC5vbmNsb3NlZnVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIEVnZ1BhbmVsLm9uY2xvc2VmdW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBoaWRlYmFubmVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIC8vIFBsYXRmb3JtVG9vbC5nZXRJbnN0YW5jZSgpLmhpZGVCYW5uZXIoXCJFZ2dWaWV3XCIpO1xyXG4gICAgICAgIEd1YW5nR2FvLmhpZGViYW5uZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgb25jbG9zZWZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggRWdnUGFuZWwgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAvLyBQbGF0Zm9ybVRvb2wuZ2V0SW5zdGFuY2UoKS5oaWRlQmFubmVyKFwiRWdnVmlld1wiKTtcclxuICAgICAgICAvLyBHdWFuZ0dhby5oaWRlYmFubmVyKCk7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRlc3RvcnkoKTtcclxuICAgICAgICBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmVudGVyZ2FtZSh0cnVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgXHJcbn0iLCJpbXBvcnQgeyBQYW5lbEJhc2VDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7IFRpbWVyU2VydmljZSB9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgeyBHdWFuZ0dhbyB9IGZyb20gXCIuLi9XWFNESy9HdWFuZ0dhb1wiO1xyXG5pbXBvcnQgeyBWaWV3QWN0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL1ZpZXdBY3Rpb25cIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBBZ2VuY3lJbkdhbWUgfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeUluR2FtZVwiO1xyXG5pbXBvcnQgeyBBZ2VuY3lMb3R0ZXJ5IH0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lMb3R0ZXJ5XCI7XHJcbmltcG9ydCBMb3R0ZXJ5Q0ZHIGZyb20gXCIuLi9DRkcvTG90dGVyeUNGR1wiO1xyXG5pbXBvcnQgeyBTY2VuZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9TY2VuZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgR2FtZVN0YXRlQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IHsgQWdlbmN5VXNlck1lc3NhZ2UgfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVVzZXJNZXNzYWdlXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBHYW1lU3RhdGUgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcbmltcG9ydCB7IFByb3BNYW5hZ2VyIH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgQ29tcGxldGVQYW5lbCB9IGZyb20gXCIuL0NvbXBsZXRlUGFuZWxcIjtcclxuaW1wb3J0IHsgQWdlbmN5VHJpYWwgfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVRyaWFsXCI7XHJcbmltcG9ydCB7IFJvbGVEYXRhIH0gZnJvbSBcIi4uL0RhdGEvUm9sZURhdGFcIjtcclxuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi9XWFNESy90dGFkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHaWZ0VmlldyBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2wgXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJHaWZ0Vmlld1wiO1xyXG5cclxuICAgIHByaXZhdGUgY2xpY2thbmk6ZmFpcnlndWkuVHJhbnNpdGlvbjtcclxuICAgIHByaXZhdGUgamluZHU6ZmFpcnlndWkuR1Byb2dyZXNzQmFyO1xyXG4gICAgcHJpdmF0ZSBidG5ib3g6ZmFpcnlndWkuR0dyb3VwO1xyXG4gICAgcHJpdmF0ZSBhbm5pdTpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgcHJpdmF0ZSBzaG91OmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBwcml2YXRlIGt1YWlzdWRpYW5qaTpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgcHJpdmF0ZSBkaTpmYWlyeWd1aS5HTG9hZGVyO1xyXG5cclxuICAgIHByaXZhdGUgZ2V0cmV3YXJkYnRuOmZhaXJ5Z3VpLkdCdXR0b247XHJcblxyXG4gICAgcHJpdmF0ZSBpdGVtOmZhaXJ5Z3VpLkdDb21wb25lbnQ7XHJcblxyXG5cclxuICAgIHByaXZhdGUgX2lzQ29tcGxldGUgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2lzU2hvd0Jhbm5lciA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfYmFubmVyVmFsID0gMC41O1xyXG4gICAgcHJpdmF0ZSBfbWF4Q2xpY2tDbnQgPSAxODtcclxuICAgIHByaXZhdGUgX2NsaWNrQ250ID0gMDtcclxuICAgIHByaXZhdGUgX2ludGVydmFsID0gMTAwO1xyXG4gICAgcHJpdmF0ZSBfZGVjcmVtZW50ID0gMTtcclxuXHJcbiAgICBuNjpmYWlyeWd1aS5HR3JvdXA7XHJcbiAgICBDaGVzdDpmYWlyeWd1aS5HR3JvdXA7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCBcIm1haW5cIixcImdpZnRjaGVhdHZpZXdcIiApOyBcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hbm5pdSA9IHRoaXMuaXRlbS5hc0NvbS5nZXRDaGlsZEF0KDIpIGFzIGZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICAgICAgdGhpcy5rdWFpc3VkaWFuamkgPSB0aGlzLml0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgwKSBhcyBmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgICAgIHRoaXMuc2hvdSA9IHRoaXMuaXRlbS5hc0NvbS5nZXRDaGlsZEF0KDMpIGFzIGZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICAgICAgdGhpcy5kaSA9IHRoaXMuaXRlbS5hc0NvbS5nZXRDaGlsZEF0KDEpIGFzIGZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICAgICAgdGhpcy5nZXRyZXdhcmRidG4gPSB0aGlzLml0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg0KSBhcyBmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgICAgIHRoaXMuZ2V0cmV3YXJkYnRuLnZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5jbGlja2FuaSA9IHRoaXMuaXRlbS5nZXRUcmFuc2l0aW9uKCBcImNsaWNrYnRuYW5pXCIgKTtcclxuICAgICAgICB0aGlzLmppbmR1LnZhbHVlID0gMTtcclxuICAgICAgICB0aGlzLl9iYW5uZXJWYWwgPSBHYW1lVXRpbHMucmFuZFJhbmdlZmxvYXQoMC4yLCAwLjQpO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICAvLyBHdWFuZ0dhby5DbGVhcigpO1xyXG4gICAgICAgIHR0YWQuQ2xlYXIoKTtcclxuICAgICAgICBMYXlhLnRpbWVyLmxvb3AoMjAwMCx0aGlzLHRoaXMucGxheUFuaW1hdG9yKTtcclxuICAgICAgICAvLyB2YXIgc2NlbmVoZWlnaHQgPSBMYXlhLnN0YWdlLmhlaWdodDtcclxuICAgICAgICAvLyB0aGlzLmJ0bmJveC55PXNjZW5laGVpZ2h0LXRoaXMuYnRuYm94LnktMTU7XHJcbiAgICB9XHJcblxyXG4gICAgcGxheUFuaW1hdG9yKCl7XHJcbiAgICAgICAgdGhpcy5jbGlja2FuaS5wbGF5KG51bGwsMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmFubml1LExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLnFpYW9EYSApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuZ2V0cmV3YXJkYnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLlZpZGVvR2V0UmV3YXJkICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3RpbWUgKz0gZHQ7XHJcbiAgICAgICAgaWYoIHRoaXMuX3RpbWUgPj0gdGhpcy5faW50ZXJ2YWwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuRGFvamlzaGkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgRGFvamlzaGkoKSB7XHJcbiAgICAgICAgbGV0IHB2ID0gdGhpcy5qaW5kdS52YWx1ZTtcclxuICAgICAgICBwdiAtPSB0aGlzLl9kZWNyZW1lbnQ7XHJcbiAgICAgICAgaWYgKHB2IDw9IDApIHB2ID0gMTtcclxuICAgICAgICB0aGlzLmppbmR1LnZhbHVlID0gcHY7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tDbnQgPSBNYXRoLmNlaWwocHYgKnRoaXMuX21heENsaWNrQ250IC8xMDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcWlhb0RhKCkgXHJcbiAgICB7XHJcbiAgICAgICAgaWYodGhpcy5zaG91LnZpc2libGUpe1xyXG4gICAgICAgICAgICB0aGlzLnNob3UudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmt1YWlzdWRpYW5qaS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIExheWEudGltZXIuY2xlYXIodGhpcyx0aGlzLnBsYXlBbmltYXRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghdGhpcy5faXNDb21wbGV0ZSkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja0NudCsrO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fY2xpY2tDbnQgPiB0aGlzLl9tYXhDbGlja0NudCkgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0NudCA9IHRoaXMuX21heENsaWNrQ250O1xyXG4gICAgICAgICAgICBsZXQgcHYgPSB0aGlzLl9jbGlja0NudCAvIHRoaXMuX21heENsaWNrQ250O1xyXG4gICAgICAgICAgICBpZiggcHYgPiAxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcHYgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuamluZHUudmFsdWUgPSBwdioxMDA7XHJcbiAgICAgICAgICAgIGlmIChwdiA+PSB0aGlzLl9iYW5uZXJWYWwgJiYgIXRoaXMuX2lzU2hvd0Jhbm5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNTaG93QmFubmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0cmV3YXJkYnRuLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKCAyMDAwLHRoaXMsKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldHJld2FyZGJ0bi52aXNpYmxlID0gZmFsc2VcclxuICAgICAgICAgICAgICAgIH0gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocHYgPj0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNDb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBHaWZ0Vmlldy5nZXRyZXdhcmQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0cmV3YXJkKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFxyXG4gICAgICAgIFJvbGVEYXRhLkluc3RhbmNlLk1vbmV5ICs9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuQ2hlYXRSZXdhcmQ7XHJcbiAgICAgICAgLy8gKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkNoZWF0UmV3YXJkICk7XHJcbiAgICAgICAgLy8gdmFyIGluZGV4ID0gKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lMb3R0ZXJ5ICkgYXMgQWdlbmN5TG90dGVyeSApLkdldFJld2FyZCgpO1xyXG4gICAgICAgIC8vIHZhciBzZWxlY3RjZmc6TG90dGVyeUNGRyA9IExvdHRlcnlDRkcudmVjWyBpbmRleCBdO1xyXG4gICAgICAgIC8vIHpwcHJveHkuZ2V0cmV3YXJkKCBzZWxlY3RjZmcgKTtcclxuICAgICAgICAvLyBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLojrflvpdcIitQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkNoZWF0UmV3YXJkK1wi6YeR5biBXCIgKTtcclxuICAgICAgICBHaWZ0Vmlldy5vbmNsb3NlZnVuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/nnIvop4bpopHlvpflpZblirFcclxuICAgIFZpZGVvR2V0UmV3YXJkKCl7XHJcbiAgICAgICAgdHRhZC5TaG93VmlkZW8oKGlzTG9hZD0+e1xyXG4gICAgICAgICAgICBpZihpc0xvYWQpe1xyXG4gICAgICAgICAgICAgICAgUm9sZURhdGEuSW5zdGFuY2UuTW9uZXkgKz0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5DaGVhdFJld2FyZDtcclxuICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi6I635b6XXCIrUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5DaGVhdFJld2FyZCtcIumHkeW4gVwiICk7XHJcbiAgICAgICAgICAgICAgICBHaWZ0Vmlldy5vbmNsb3NlZnVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIEdpZnRWaWV3Lm9uY2xvc2VmdW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGlkZWJhbm5lcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBHdWFuZ0dhby5oaWRlYmFubmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG9uY2xvc2VmdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIEdpZnRWaWV3ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgR3VhbmdHYW8uaGlkZWJhbm5lcigpO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIFxyXG59IiwiaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBXb3JkVGlwc1BhbmVsIGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbFxyXG57XHJcbiAgICBwdWJsaWMgc3RhdGljIGtleTpzdHJpbmcgPSBcIldvcmRUaXBzUGFuZWxcIjtcclxuICAgIHRleHRfd29yZDpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgdDE6ZmFpcnlndWkuVHJhbnNpdGlvbjtcclxuICAgIHB1YmxpYyBub3d3b3JkOnN0cmluZyA9IFwiXCI7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCBcImxvYWRpbmdcIixcIndvcmRUaXBzXCIgKTtcclxuICAgIH0gICBcclxuXHJcbiAgICBcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIHNob3dUZXh0KCk6IHZvaWQge1xyXG4gICAgICAgIHZhciB0ZXh0OkxheWEuIFRleHQgPSBuZXcgTGF5YS5UZXh0KCk7XHJcblxyXG4gICAgICAgIHRleHQudGV4dCA9IFwiT3JpZW50YXRpb24tUG9ydHJhaXRcIjtcclxuICAgICAgICB0ZXh0LmNvbG9yID0gXCJncmF5XCI7XHJcbiAgICAgICAgdGV4dC5mb250ID0gXCJJbXBhY3RcIjtcclxuICAgICAgICB0ZXh0LmZvbnRTaXplID0gNTA7XHJcblxyXG4gICAgICAgIHRleHQueCA9IExheWEuc3RhZ2Uud2lkdGggLSB0ZXh0LndpZHRoID4+IDE7XHJcbiAgICAgICAgdGV4dC55ID0gTGF5YS5zdGFnZS5oZWlnaHQgLSB0ZXh0LmhlaWdodCA+PiAxO1xyXG5cclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRleHQpO1xyXG4gICAgfVxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG5cclxuICAgIHB1YmxpYyBzaG93V29yZCggd29yZDpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3d3b3JkID0gd29yZDtcclxuICAgICAgICB0aGlzLnRleHRfd29yZC50ZXh0ID0gd29yZDtcclxuICAgICAgICB0aGlzLnQxLnBsYXkoIExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsIHRoaXMucGxheUVuZENhbGxiYWNrICksMSApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XHJcbiAgICAgICAgdGhpcy50MSA9IHRoaXMuZ2V0cGFuZWxUcmFuc2l0aW9uKFwidDFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cdHByaXZhdGUgcmVjdDpMYXlhLiBTcHJpdGU7XHJcbiAgICBwcml2YXRlIGNyZWF0ZUNhbnRyYWxSZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVjdCA9IG5ldyBMYXlhLlNwcml0ZSgpO1xyXG4gICAgICAgIHRoaXMucmVjdC5ncmFwaGljcy5kcmF3UmVjdCgtMTAwLCAtMTAwLCAyMDAsIDIwMCwgXCJncmF5XCIpO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5yZWN0KTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVSZWN0UG9zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVSZWN0UG9zKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVjdC54ID0gTGF5YS5zdGFnZS53aWR0aCAvIDI7XHJcbiAgICAgICAgdGhpcy5yZWN0LnkgPSBMYXlhLnN0YWdlLmhlaWdodCAvIDI7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHJpdmF0ZSBwbGF5RW5kQ2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLnJlbW92ZXNlbGVjdCx0aGlzICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2FkaW5nUGFuZWwgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJMb2FkaW5nUGFuZWxcIjtcclxuICAgIHBybzpmYWlyeWd1aS5HUHJvZ3Jlc3NCYXI7XHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlcihcImxvYWRpbmdcIixcImxvYWRpbmdcIik7IFxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbiAgICBwdWJsaWMgc2hvd1dvcmQoIHZhbHVlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnByby52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Cb3lDbGljayhlOkxheWEuRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICAvL+eCueWHu+WQjuWwj+S6uuS8muaUvuWkp+e8qeWwj1xyXG4gICAgICAgIHZhciBib3k6TGF5YS4gU3ByaXRlID0gZS50YXJnZXQ7XHJcbiAgICAgICAgaWYgKGJveS5zY2FsZVggPT09IDEpIHtcclxuICAgICAgICAgICAgYm95LnNjYWxlKDEuMiwgMS4yKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBib3kuc2NhbGUoMSwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25UeHRDbGljayhlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8v54K55Ye75ZCO5YiH5o2i6YCC6YWN5qih5byPXHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgXHJcblxyXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jbGVhckV2ZW50KCk7XHJcbiAgICAgICAgc3VwZXIuZGVzdG9yeSgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7Vmlld0FjdGlvbn0gZnJvbSBcIi4uL3V0aWxzL1ZpZXdBY3Rpb25cIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4uL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xyXG5pbXBvcnQgTG90dGVyeUNGRyBmcm9tIFwiLi4vQ0ZHL0xvdHRlcnlDRkdcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHtBZ2VuY3lMb3R0ZXJ5fSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeUxvdHRlcnlcIjtcclxuaW1wb3J0IHtHdWFuZ0dhb30gZnJvbSBcIi4uL1dYU0RLL0d1YW5nR2FvXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi9XWFNESy90dGFkXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTG90dGVyeVBhbmVsIGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkxvdHRlcnlQYW5lbFwiO1xyXG5cclxuICAgIGJhY2tidG46ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIGxvdHRlcnlidG46ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIGljb25fMDpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgdHh0XzA6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIGljb25fMTpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgdHh0XzE6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIGljb25fMjpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgdHh0XzI6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIGljb25fMzpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgdHh0XzM6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIGljb25fNDpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgdHh0XzQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIGljb25fNTpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgdHh0XzU6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIGljb25fNjpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgdHh0XzY6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIGljb25fNzpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgdHh0Xzc6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuXHJcbiAgICBwcml2YXRlIGFnZW5jeWxvdHRlcnk6QWdlbmN5TG90dGVyeTtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoIFwibWFpblwiLFwiTG90dGVyeVZpZXdcIixmYWxzZSxWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZSwxICk7IFxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGxvZ2dlcjpMYXlhLlRleHQ7XHJcbiAgICBwcml2YXRlIHNob3dMb2dnZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBuZXcgTGF5YS5UZXh0KCk7XHJcblxyXG4gICAgICAgIHRoaXMubG9nZ2VyLmZvbnRTaXplID0gMzA7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuY29sb3IgPSBcIiNGRkZGRkZcIjtcclxuICAgICAgICB0aGlzLmxvZ2dlci5hbGlnbiA9ICdjZW50ZXInO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZhbGlnbiA9ICdtaWRkbGUnO1xyXG5cclxuICAgICAgICB0aGlzLmxvZ2dlci5zaXplKExheWEuc3RhZ2Uud2lkdGgsIExheWEuc3RhZ2UuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLmxvZ2dlci50ZXh0ID0gXCLnrYnlvoXlk43lupQuLi5cXG5cIjtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMubG9nZ2VyKTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG5cclxuICAgIHByaXZhdGUgb25IdHRwUmVxdWVzdEVycm9yKGU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5iYWNrYnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLm9uY2xvc2VmdW4gKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxvdHRlcnlidG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuY2hvdWppYW5nY2xpY2sgKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfdHdlZU9iamVjdDphbnk7XHJcbiAgICBwcml2YXRlIF9ub3dnZXRJbmRleDpudW1iZXI7XHJcbiAgICBwcml2YXRlIF9wcmVJbmRleDpudW1iZXI7XHJcbiAgICBwcml2YXRlIHR3OiBsYXlhLnV0aWxzLlR3ZWVuO1xyXG4gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBwbGF5Q29tcGx0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy50dyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnR3LmNsZWFyKCk7XHJcbiAgICAgICAgICAgIHRoaXMudHcgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmJhY2tidG4uZW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5sb3R0ZXJ5YnRuLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuYWdlbmN5bG90dGVyeS5nZXRyZXdhcmQoIHRoaXMuX3NlbGVjdGNmZyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25jbG9zZWZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy50dyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnR3LmNsZWFyKCk7XHJcbiAgICAgICAgICAgIHRoaXMudHcgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBHdWFuZ0dhby5DbGVhcigpO1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBMb3R0ZXJ5UGFuZWwgKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWdlbmN5bG90dGVyeSA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeUxvdHRlcnkgKTtcclxuICAgICAgICB2YXIgdmVjOkFycmF5PExvdHRlcnlDRkc+ID0gTG90dGVyeUNGRy52ZWM7XHJcbiAgICAgICAgZm9yKCB2YXIgaTpudW1iZXIgPSAwO2kgPCB2ZWMubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2ZnOkxvdHRlcnlDRkcgPSB2ZWNbaV07XHJcbiAgICAgICAgICAgIGlmKCBjZmcudHlwZSA9PSAxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpc1tcImljb25fXCIraV0udXJsID0gZmFpcnlndWkuVUlQYWNrYWdlLmdldEl0ZW1VUkwoIFwibWFpblwiLFwiaW1nX2dvbGRcIiApO1xyXG4gICAgICAgICAgICAgICAgdGhpc1tcInR4dF9cIitpXS50ZXh0ID0gXCJYXCIgKyBjZmcudmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcm9sZWNmZzpSb2xlQ0ZHID0gUm9sZUNGRy5kaWN0W2NmZy52YWx1ZV07XHJcbiAgICAgICAgICAgICAgICB0aGlzW1wiaWNvbl9cIitpXS51cmwgPSBBc3NldFBhdGguZ2V0cm9sZWljb24oIHJvbGVjZmcuaWNvbiApO1xyXG4gICAgICAgICAgICAgICAgdGhpc1tcInR4dF9cIitpXS50ZXh0ID0gcm9sZWNmZy5yb2xlbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBHdWFuZ0dhby5DaGVhdEJhbm5lcih0aGlzLmxvdHRlcnlidG4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIG9uU29ja2V0Q2xvc2UoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJTb2NrZXQgY2xvc2VkXCIpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBvbk1lc3NhZ2VSZXZlaXZlZChtZXNzYWdlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIk1lc3NhZ2UgZnJvbSBzZXJ2ZXI6XCIpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG5cclxuICAgIHByaXZhdGUgY2hvdWppYW5nY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy52aWRlb2NhbGxiYWNrKCk7XHJcbiAgICAgICAgLy8gcGluZ3RhaXV0aWxzLkluc3RhbmNlLnBsYXlWaWRlbyggXCJcIix0aGlzLHRoaXMudmlkZW9jYWxsYmFjayApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NlbGVjdGNmZzpMb3R0ZXJ5Q0ZHO1xyXG4gICAgcHJpdmF0ZSB2aWRlb2NhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcclxuICAgICAgICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRQbGF5KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0UGxheSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmFnZW5jeWxvdHRlcnkuR2V0UmV3YXJkKCk7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0Y2ZnID0gTG90dGVyeUNGRy52ZWNbIGluZGV4IF07XHJcbiAgICAgICAgdGhpcy5iYWNrYnRuLmVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxvdHRlcnlidG4uZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX25vd2dldEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgdmFyIGFuZ2xlOm51bWJlciA9IDM2MCAqIDYgKyAodGhpcy5fbm93Z2V0SW5kZXgpKiA0NSAtIDE1O1xyXG4gICAgICAgIGlmKCB0aGlzLml0ZW1fcGFuZWwucm90YXRpb24gPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90d2VlT2JqZWN0ID0geyB2YWx1ZTowIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3R3ZWVPYmplY3QgPSB7IHZhbHVlOnRoaXMuX3ByZUluZGV4ICogNDUgLSAxNSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wcmVJbmRleCA9IHRoaXMuX25vd2dldEluZGV4O1xyXG4gICAgICAgIHRoaXMudHcgPSBsYXlhLnV0aWxzLlR3ZWVuLnRvKHRoaXMuX3R3ZWVPYmplY3QsIHsgdmFsdWU6YW5nbGUgfSwgMzAwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCxMYXlhLkhhbmRsZXIuY3JlYXRlKCB0aGlzLHRoaXMucGxheUNvbXBsdGUgKSk7XHJcbiAgICAgICAgdGhpcy50dy51cGRhdGUgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIGZ1bmN0aW9uICgpOiB2b2lkIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZTpudW1iZXIgPSB0aGlzLl90d2VlT2JqZWN0LnZhbHVlICUgMzYwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtX3BhbmVsLnJvdGF0aW9uID0gIHZhbHVlO1xyXG4gICAgICAgICAgICB9LCBudWxsLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBcclxufSIsImltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcclxuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5pbXBvcnQge1JvbGVEYXRhfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xyXG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcclxuaW1wb3J0IHtBZ2VuY3lTa2lufSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVNraW5cIjtcclxuaW1wb3J0IHtBZ2VuY3lJbkdhbWV9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5SW5HYW1lXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge0FnZW5jeUxvdHRlcnl9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5TG90dGVyeVwiO1xyXG5pbXBvcnQgQ2hvdXRpUGFuVmlldyBmcm9tIFwiLi4vUHVzaC9DaG91dGlQYW5WaWV3XCI7XHJcbmltcG9ydCBUdWlqaWFuVmlldyBmcm9tIFwiLi4vUHVzaC9UdWlqaWFuVmlld1wiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xyXG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL1dYU0RLL3R0YWRcIjtcclxuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi4vV1hTREsvU2RrXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQgeyBMb2NhbERhdGFDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvTG9jYWxEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBVc2VyRGF0YUluZm8gfSBmcm9tIFwiLi4vRGF0YS9Vc2VyRGF0YUluZm9cIjtcclxuaW1wb3J0IHsgU2tpbkRhdGEgfSBmcm9tIFwiLi4vRGF0YS9Ta2luRGF0YVwiO1xyXG5pbXBvcnQgeyBTY2VuZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9TY2VuZUNvbnRyb2xcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNYWluUGFuZWwgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJNYWluUGFuZWxcIjtcclxuICAgIHN0YXRpYyBpbnN0YW5jZTpNYWluUGFuZWw7XHJcblxyXG4gICAgY19zdGF0ZTpmYWlyeWd1aS5Db250cm9sbGVyO1xyXG4gICAgbG9hZF9jbGlja3BhbmVsOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBsb2FkX3N0YXJ0OmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICB0eHRfbHY6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIHByb19kaXM6ZmFpcnlndWkuR1Byb2dyZXNzQmFyO1xyXG4gICAgdHh0X21pbmdjaTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgdHh0X2dvbGQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIFNraW5CdG46ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIE1vcmVHYW1lQnRuOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBFeGl0QnRuOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBMb3R0ZXJ5QnRuOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBTZXRCdG46ZmFpcnlndWkuR0J1dHRvbjtcclxuXHJcbiAgICBNb3JlRnVuQnRuU2NhbGU6ZmFpcnlndWkuVHJhbnNpdGlvbjtcclxuXHJcbiAgICAvL+abtOWkmuWlveeOqeaMiemSrlxyXG4gICAgTW9yZUZ1bkJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xyXG5cclxuICAgIC8v55qu6IKk5oyJ6ZKu5Yqo5pWIXHJcbiAgICBTa2luQW5pOmZhaXJ5Z3VpLlRyYW5zaXRpb247XHJcbiAgICAvL+abtOWkmuWlveeOqeaMiemSruWKqOaViFxyXG4gICAgTW9yZUFuaTpmYWlyeWd1aS5UcmFuc2l0aW9uO1xyXG4gICAgLy/mir3lpZbmjInpkq7liqjmlYhcclxuICAgIExvdHRlcnlBbmk6ZmFpcnlndWkuVHJhbnNpdGlvbjtcclxuXHJcbiAgICBwcml2YXRlIGFnZW5jeXVzZXJtZXNzYWdlOkFnZW5jeVVzZXJNZXNzYWdlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKFwibWFpblwiLFwibWFpbnZpZXdcIik7IFxyXG4gICAgICAgIE1haW5QYW5lbC5pbnN0YW5jZSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVVc2VyRGF0YUhhbmRsZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50eHRfZ29sZC50ZXh0ID0gdGhpcy5hZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YS5Nb25leS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmV0dXJubWFpbkhhbmRsZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gdGhpcy5hZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcclxuICAgICAgICAvLyBpZiggUm9sZURhdGEubm93bGV2ZWwgPD0gMiApXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGVsc2VcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzdXBlci5vbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICAgLy8g5LiA5Y+q5Yek5Yew55qE5YiG6L6o546H5pivNTUwICogNDAwXHJcbiAgICAgcHJpdmF0ZSBwaG9lbml4V2lkdGg6IG51bWJlciA9IDU1MDtcclxuICAgICBwcml2YXRlIHBob2VuaXhIZWlnaHQ6IG51bWJlciA9IDQwMDtcclxuXHJcbiAgICAgcHJpdmF0ZSBiZ0NvbG9yVHdlZW5lcjpMYXlhLlR3ZWVuID0gbmV3IExheWEuVHdlZW4oKTtcclxuICAgICBwcml2YXRlIGdyYWRpZW50SW50ZXJ2YWw6IG51bWJlciA9IDIwMDA7XHJcbiAgICAgcHJpdmF0ZSBiZ0NvbG9yQ2hhbm5lbHM6IGFueSA9IHsgcjogOTksIGc6IDAsIGI6IDB4RkYgfTtcclxuICAgIHByaXZhdGUgY3JlYXRlUGhvZW5peGVzKCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBzY2FsZUZhY3RvcjogbnVtYmVyID0gTWF0aC5taW4oXHJcbiAgICAgICAgICAgIExheWEuc3RhZ2Uud2lkdGggLyAodGhpcy5waG9lbml4V2lkdGggKiAyKSxcclxuICAgICAgICAgICAgTGF5YS5zdGFnZS5oZWlnaHQgLyB0aGlzLnBob2VuaXhIZWlnaHQpO1xyXG5cclxuICAgICAgICAvLyDliqDkuobmt7flkIjmqKHlvI/nmoTlh6Tlh7BcclxuICAgICAgICB2YXIgYmxlbmRlZFBob2VuaXg6TGF5YS5BbmltYXRpb24gXHJcbiAgICAgICAgYmxlbmRlZFBob2VuaXguYmxlbmRNb2RlID0gXCJsaWdodGVyXCI7XHJcbiAgICAgICAgYmxlbmRlZFBob2VuaXguc2NhbGUoc2NhbGVGYWN0b3IsIHNjYWxlRmFjdG9yKTtcclxuICAgICAgICBibGVuZGVkUGhvZW5peC55ID0gKExheWEuc3RhZ2UuaGVpZ2h0IC0gdGhpcy5waG9lbml4SGVpZ2h0ICogc2NhbGVGYWN0b3IpIC8gMjtcclxuXHJcbiAgICAgICAgLy8g5q2j5bi45qih5byP55qE5Yek5YewXHJcbiAgICAgICAgdmFyIG5vcm1hbFBob2VuaXg6TGF5YS5BbmltYXRpb247XHJcbiAgICAgICAgbm9ybWFsUGhvZW5peC5zY2FsZShzY2FsZUZhY3Rvciwgc2NhbGVGYWN0b3IpO1xyXG4gICAgICAgIG5vcm1hbFBob2VuaXgueCA9IHRoaXMucGhvZW5peFdpZHRoICogc2NhbGVGYWN0b3I7XHJcbiAgICAgICAgbm9ybWFsUGhvZW5peC55ID0gKExheWEuc3RhZ2UuaGVpZ2h0IC0gdGhpcy5waG9lbml4SGVpZ2h0ICogc2NhbGVGYWN0b3IpIC8gMjtcclxuICAgIH1cclxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgXHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuRXhpdEJ0bi52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5Nb3JlRnVuQnRuLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLk1vcmVHYW1lQnRuLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0dGFkLlNob3diYW5uZXIoKTtcclxuICAgICAgICAvLyBMYXlhLnRpbWVyLm9uY2UoNTAwLHRoaXMsKCk9PntcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJtYWlu55WM6Z2i55m95ZCN5Y2VLS0tLVwiLEZZSERfU2RrLmlzd2hpdGUpO1xyXG4gICAgICAgIC8vICAgICBpZihGWUhEX1Nkay5pc3doaXRlKXtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuRXhpdEJ0bi52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICAgICBlbHNle1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5FeGl0QnRuLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pXHJcbiAgICAgICAgdGhpcy5Nb3JlRnVuQnRuU2NhbGUgPSB0aGlzLmdldFRyYW5zaXRpb25CeU5hbWUoXCJtb3JlZnVuYnRuc2NhbGVcIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgTGF5YS50aW1lci5sb29wKDEwMDAsdGhpcyx0aGlzLnBsYXlhbmltYXRvcjIpO1xyXG4gICAgICAgIHRoaXMuU2tpbkFuaSA9IHRoaXMuU2tpbkJ0bi5nZXRUcmFuc2l0aW9uKFwic2tpbmFuaVwiKTtcclxuICAgICAgICB0aGlzLkxvdHRlcnlBbmkgPSB0aGlzLkxvdHRlcnlCdG4uZ2V0VHJhbnNpdGlvbihcImxvdHRlcnlhbmlcIik7XHJcbiAgICAgICAgdGhpcy5Nb3JlQW5pID0gdGhpcy5Nb3JlR2FtZUJ0bi5nZXRUcmFuc2l0aW9uKFwibW9yZWFuaVwiKTtcclxuICAgICAgICBMYXlhLnRpbWVyLmxvb3AoMzAwMCx0aGlzLHRoaXMucGxheWFuaW1hdG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5hZ2VuY3l1c2VybWVzc2FnZSA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICk7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIucHJvX2ppbmR1ID0gdGhpcy5wcm9fZGlzO1xyXG4gICAgICAgIFByb3BNYW5hZ2VyLnR4dF9taW5nY2kgPSB0aGlzLnR4dF9taW5nY2k7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyQnlCYW1lKCBcImNfc3RhdGVcIiApO1xyXG4gICAgICAgIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2Uuc2V0Q2xpY2tQYW5lbCggdGhpcy5sb2FkX2NsaWNrcGFuZWwgKTtcclxuICAgICAgICB0aGlzLnJldHVybm1haW5IYW5kbGVyKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVVc2VyRGF0YUhhbmRsZXIoKTtcclxuICAgICAgICB0aGlzLkluaXRTaWduSXRlbSgpO1xyXG4gICAgfVxyXG4gICAgcGxheWFuaW1hdG9yKCl7XHJcbiAgICAgICAgdGhpcy5Ta2luQW5pLnBsYXkobnVsbCwxKTtcclxuICAgICAgICB0aGlzLkxvdHRlcnlBbmkucGxheShudWxsLDEpO1xyXG4gICAgICAgIHRoaXMuTW9yZUFuaS5wbGF5KG51bGwsMSk7XHJcbiAgICB9XHJcbiAgICBwbGF5YW5pbWF0b3IyKCl7XHJcbiAgICAgICAgdGhpcy5Nb3JlRnVuQnRuU2NhbGUucGxheShudWxsLDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hvdWppYW5nY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoU2NlbmVDb250cm9sLklzU2hvd1NpZ24pcmV0dXJuXHJcbiAgICAgICAgdHRhZC5DbGVhcigpO1xyXG4gICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5TG90dGVyeSApIGFzIEFnZW5jeUxvdHRlcnkgKS5vcGVuVmlldygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdHVpamlhbmNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKFNjZW5lQ29udHJvbC5Jc1Nob3dTaWduKXJldHVyblxyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggVHVpamlhblZpZXcgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2tpbmNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKFNjZW5lQ29udHJvbC5Jc1Nob3dTaWduKXJldHVyblxyXG4gICAgICAgIHR0YWQuQ2xlYXIoKTtcclxuICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeVNraW4gKSBhcyBBZ2VuY3lTa2luICkub3BlbnZpZXcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1vcmVjbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZihTY2VuZUNvbnRyb2wuSXNTaG93U2lnbilyZXR1cm5cclxuICAgICAgICAvLyBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcclxuICAgICAgICB0dGFkLkNyZWF0ZU1vcmVHYW1lQnRuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidG5jbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZihTY2VuZUNvbnRyb2wuSXNTaG93U2lnbilyZXR1cm5cclxuICAgICAgICBHYW1lU3RhdGUuR2FtZU51bSsrO1xyXG4gICAgICAgIHR0YWQuQ2xlYXIoKTtcclxuICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDI7XHJcbiAgICAgICAgdGhpcy50eHRfbHYudGV4dCA9IHRoaXMuYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGEuZ2V0Tm93U2VydmVyTGV2ZWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5SW5HYW1lICkgYXMgQWdlbmN5SW5HYW1lICkuc3RhcnRHYW1lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRjbGljaygpOnZvaWR7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSB0aWxlZE1hcDpMYXlhLlRpbGVkTWFwO1xyXG4gICAgcHJpdmF0ZSBsYXllcjpMYXlhLk1hcExheWVyO1xyXG4gICAgcHJpdmF0ZSBzcHJpdGU6TGF5YS5TcHJpdGU7XHJcbiAgICBwcml2YXRlIG1hcExvYWRlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheWVyID0gdGhpcy50aWxlZE1hcC5nZXRMYXllckJ5SW5kZXgoMCk7XHJcblxyXG4gICAgICAgIHZhciByYWRpdXNYOiBudW1iZXIgPSAzMjtcclxuICAgICAgICB2YXIgcmFkaXVzWTogbnVtYmVyID0gTWF0aC50YW4oMTgwIC8gTWF0aC5QSSAqIDMwKSAqIHJhZGl1c1g7XHJcbiAgICAgICAgdmFyIGNvbG9yOiBzdHJpbmcgPSBcIiNGRjdGNTBcIjtcclxuICAgICAgICB0aGlzLnNwcml0ZSA9IG5ldyBMYXlhLlNwcml0ZSgpO1xyXG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKDAsIDAsIC1yYWRpdXNYLCByYWRpdXNZLCBjb2xvcik7XHJcbiAgICAgICAgdGhpcy5zcHJpdGUuZ3JhcGhpY3MuZHJhd0xpbmUoMCwgMCwgcmFkaXVzWCwgcmFkaXVzWSwgY29sb3IpO1xyXG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKC1yYWRpdXNYLCByYWRpdXNZLCAwLCByYWRpdXNZICogMiwgY29sb3IpO1xyXG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKHJhZGl1c1gsIHJhZGl1c1ksIDAsIHJhZGl1c1kgKiAyLCBjb2xvcik7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLnNwcml0ZSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxvYWRfc3RhcnQsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuYnRuY2xpY2sgKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLlNraW5CdG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuc2tpbmNsaWNrICk7XHJcbiAgICAgICAgLy8gdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5Nb3JlR2FtZUJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5tb3JlY2xpY2sgKTtcclxuICAgICAgICAvLyB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLk1vcmVGdW5CdG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMubW9yZWNsaWNrICk7XHJcbiAgICAgICAgLy8gdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5FeGl0QnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLnR1aWppYW5jbGljayApO1xyXG4gICAgICAgIHRoaXMuYWRkRGF0YUV2ZW50KCBHYW1lU3RhdGUucmV0dXJuTWFpblZpZXcsdGhpcyx0aGlzLnJldHVybm1haW5IYW5kbGVyICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5Mb3R0ZXJ5QnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmNob3VqaWFuZ2NsaWNrICk7XHJcbiAgICAgICAgdGhpcy5hZGREYXRhRXZlbnQoIFVzZXJJbmZvRXZlbnQuVXNlckluZm9FdmVudF91cGRhdGVVc2VyRGF0YSx0aGlzLHRoaXMudXBkYXRlVXNlckRhdGFIYW5kbGVyICk7XHJcbiAgICB9XHJcblxyXG4gICAgIC8vI3JlZ2lvbiDnrb7liLBcclxuICAgICBidG5fU2lnbjpmYWlyeWd1aS5HQnV0dG9uO1xyXG5cclxuICAgICBTaWduUGFuZWw6ZmFpcnlndWkuR0dyb3VwO1xyXG4gICAgIFNpZ25JdGVtMTpmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICAgU2lnbkl0ZW0yOmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgICBTaWduSXRlbTM6ZmFpcnlndWkuR0ltYWdlO1xyXG4gICAgIFNpZ25JdGVtNDpmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICAgU2lnbkl0ZW01OmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgICBTaWduSXRlbTY6ZmFpcnlndWkuR0ltYWdlO1xyXG4gICAgIFNpZ25JdGVtNzpmYWlyeWd1aS5HSW1hZ2U7XHJcbiBcclxuICAgICBTaWduQWQ6ZmFpcnlndWkuR0ltYWdlO1xyXG4gXHJcbiAgICAgU2lnbkl0ZW06ZmFpcnlndWkuR0ltYWdlW107XHJcbiAgICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgXHJcbiAgICAvLyNyZWdpb24g5Yid5aeL5YyW562+5YiwXHJcblxyXG4gICAgcHJpdmF0ZSBpc1Nob3dTaWduOmJvb2xlYW49ZmFsc2U7XHJcblxyXG4gICAgLyrli77pgInlm74qL1xyXG4gICAgcHJpdmF0ZSBTaWduVGlja0ltYWdlOmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgIHByaXZhdGUgc2lnbk5vcmFtQnV0dG9uOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBwcml2YXRlIHNpZ25BZEJ1dHRvbjpmYWlyeWd1aS5HQnV0dG9uO1xyXG5cclxuICAgIHByaXZhdGUgU2lnbkRhbmJlaUJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xyXG5cclxuICAgIHByaXZhdGUgSW5pdFNpZ25JdGVtKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLkxvYWRTaWduRGF0YSgpO1xyXG4gICAgICAgIHZhciBfYm89dHJ1ZTtcclxuICAgICAgICBpZih0aGlzLmdldFN5c3RlbVRpbWUoKT09dGhpcy5TaWduSW5mb1tcInRpbWVcIl0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfYm89ZmFsc2U7XHJcbiAgICAgICAgfWVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuU2lnbkluZm9bXCJGaXNzdExvYWRcIl09MDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy5TaWduSW5mb1tcIkZpc3N0TG9hZFwiXT09MSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF9ibz1mYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5TaWduRGVidWcpXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICBfYm89dHJ1ZTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgU2NlbmVDb250cm9sLklzU2hvd1NpZ249X2JvO1xyXG4gICAgICAgIHRoaXMuU2lnblBhbmVsLnZpc2libGU9X2JvO1xyXG4gICAgICAgIGlmKCFfYm8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLlNpZ25GdW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBidG5fU2lnbkZ1bigpXHJcbiAgICB7XHJcbiAgICAgICAgaWYodGhpcy5nZXRTeXN0ZW1UaW1lKCk9PXRoaXMuU2lnbkluZm9bXCJ0aW1lXCJdKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pc1Nob3dTaWduPXRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLlNpZ25GdW4oKTtcclxuXHJcbiAgICAgICAgaWYodGhpcy5pc1Nob3dTaWduKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgV3hBcGkuU2hvd1R4dChcIuW3suetvuWIsFwiKTsvL3kuV3hBcGkuU2hvd1R4dChcIuW3suetvuWIsFwiKVxyXG4gICAgICAgICAgICB0aGlzLlNpZ25TZWxlY3RlZE1vbmV5PTArXCJcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgU2lnbkZ1bigpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5TaWduSXRlbT1uZXcgQXJyYXkoKTtcclxuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTEpO1xyXG4gICAgICAgIHRoaXMuU2lnbkl0ZW0ucHVzaCh0aGlzLlNpZ25JdGVtMik7XHJcbiAgICAgICAgdGhpcy5TaWduSXRlbS5wdXNoKHRoaXMuU2lnbkl0ZW0zKTtcclxuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTQpO1xyXG4gICAgICAgIHRoaXMuU2lnbkl0ZW0ucHVzaCh0aGlzLlNpZ25JdGVtNSk7XHJcbiAgICAgICAgdGhpcy5TaWduSXRlbS5wdXNoKHRoaXMuU2lnbkl0ZW02KTtcclxuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTcpO1xyXG5cclxuICAgICAgICB0aGlzLlNpZ25UaWNrSW1hZ2U9dGhpcy5TaWduQWQuYXNDb20uZ2V0Q2hpbGRBdCgyKSBhcyBmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICAgICAgdmFyIHNpZ25UaWNrQnV0dG9uPXRoaXMuU2lnbkFkLmFzQ29tLmdldENoaWxkQXQoMSkgYXMgZmFpcnlndWkuR0J1dHRvbjtcclxuICAgICAgICB0aGlzLnNpZ25BZEJ1dHRvbj10aGlzLlNpZ25BZC5hc0NvbS5nZXRDaGlsZEF0KDMpIGFzIGZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICAgICAgdGhpcy5zaWduTm9yYW1CdXR0b249dGhpcy5TaWduQWQuYXNDb20uZ2V0Q2hpbGRBdCg0KSBhcyBmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgICAgIHRoaXMuU2lnbkRhbmJlaUJ0biA9IHRoaXMuU2lnbkFkLmFzQ29tLmdldENoaWxkQXQoNSkgYXMgZmFpcnlndWkuR0J1dHRvbjtcclxuICAgICAgICB0aGlzLlNpZ25UaWNrSW1hZ2UudmlzaWJsZT0oUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5TaG93U2lnbik7XHJcbiAgICAgICAgLy8gdGhpcy5zaWduTm9yYW1CdXR0b24udmlzaWJsZSA9IHRoaXMuU2lnblRpY2tJbWFnZS52aXNpYmxlO1xyXG4gICAgICAgIC8vIHRoaXMuU2lnbkFkLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLlNpZ25EYW5iZWlCdG4udmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCBzaWduVGlja0J1dHRvbixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5TaWduVGlja0J1dHRvbkZ1biApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuc2lnbkFkQnV0dG9uLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLlNpZ25BZEJ1dHRvbkZ1biApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuc2lnbk5vcmFtQnV0dG9uLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLlNpZ25Ob3JtYWxCdXR0b25GdW4gKTtcclxuICAgICAgICAvLyB0aGlzLkFkZEV2ZW50QnlUeXBlKHRoaXMuU2lnbkRhbmJlaUJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5TaWduTm9ybWFsQnV0dG9uRnVuKTtcclxuICAgICAgICBcclxuICAgICAgICB2YXIgbnVtPXRoaXMuU2lnbkluZm9bXCJkYXlcIl07XHJcbiAgICAgICAgdmFyIG51bUluZGV4PTEwMDtcclxuICAgICAgICBpZihudW08NylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG51bUluZGV4PTEwMDtcclxuICAgICAgICB9ZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbnVtSW5kZXg9MTA3O1xyXG4gICAgICAgICAgICBudW09bnVtJTc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuU2lnblBpRnU9bnVsbDtcclxuICAgICAgICB0aGlzLlNpZ25TZWxlY3RlZE1vbmV5PTArXCJcIjtcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5TaWduSXRlbS5sZW5ndGg7IGluZGV4KyspIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBkYXRhPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkdldFJld2FyZENvbmZpZygobnVtSW5kZXgrMStpbmRleCkpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHBpZnU9bnVsbDtcclxuICAgICAgICAgICAgaWYoZGF0YVtcInJld2FyZF9pdGVtXCJdIT0xMDAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZihOdW1iZXIoZGF0YVtcInJld2FyZF9pdGVtXCJdKT42MDAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwaWZ1SW5kZWR4PU51bWJlcihkYXRhW1wicmV3YXJkX2l0ZW1cIl0pJTYwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgcGlmdT1QbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkdldFNraW5BdHRyKHBpZnVJbmRlZHgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBpZnUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgaXNPaz10cnVlO1xyXG4gICAgICAgICAgICB2YXIgaXNDbmFTaWduPXRydWU7XHJcbiAgICAgICAgICAgIGlmKGluZGV4PG51bSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaXNPaz10cnVlO1xyXG4gICAgICAgICAgICAgICAgaXNDbmFTaWduPWZhbHNlO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihpbmRleD09bnVtKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpc09rPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaXNDbmFTaWduPXRydWU7XHJcbiAgICAgICBcclxuICAgICAgICAgICAgfWVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaXNPaz1mYWxzZTtcclxuICAgICAgICAgICAgICAgIGlzQ25hU2lnbj1mYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdGV4dDtcclxuICAgICAgICAgICAgaWYoaW5kZXg8Nil7XHJcbiAgICAgICAgICAgICAgICB0ZXh0PVwi56ysIFwiKyhpbmRleCsxKStcIiDlpKlcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgdGV4dD1cIuixquWNjuearuiCpFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuU2V0U2lnbkl0ZW1JbmZvKHRoaXMuU2lnbkl0ZW1baW5kZXhdLHRleHQsZGF0YSxpc09rLGlzQ25hU2lnbixwaWZ1KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHR0YWQuU2hvd2Jhbm5lcigpOy8vXHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgLyoq562+5YiwKi9cclxuICAgIHByaXZhdGUgU2V0U2lnbkl0ZW1JbmZvKF9zaWduSXRlbTpmYWlyeWd1aS5HSW1hZ2UsdGV4dDpzdHJpbmcsZGF0YTphbnksX2lzT2s6Ym9vbGVhbixfaXNDYW5TaWduOmJvb2xlYW4scGlmdTphbnkpXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZGF0YSk7XHJcbiAgICAgICAgaWYocGlmdT09bnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKDExMTExMTExMTExMSk7XHJcbiAgICAgICAgICAgIHZhciBteXRleHQ9X3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoMikgYXMgZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgICAgICAgICAgbXl0ZXh0LnRleHQ9dGV4dDtcclxuICAgICAgICAgICAgdmFyIG15bW9uZXk9X3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoMykgYXMgZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgICAgICAgICAgbXltb25leS50ZXh0PWRhdGFbXCJyZXdhcmRfbnVtXCJdO1xyXG4gICAgXHJcbiAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDUpLnZpc2libGU9ZmFsc2U7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZihfaXNPaylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoMSkudmlzaWJsZT1mYWxzZTtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDYpLnZpc2libGU9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDcpLnZpc2libGU9dHJ1ZTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoX2lzQ2FuU2lnbilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoMSkudmlzaWJsZT10cnVlO1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNykudmlzaWJsZT1mYWxzZTtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDYpLnZpc2libGU9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNpZ25TZWxlY3RlZEl0ZW09X3NpZ25JdGVtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TaWduU2VsZWN0ZWRUZXh0PXRleHQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNpZ25TZWxlY3RlZE1vbmV5PWRhdGFbXCJyZXdhcmRfbnVtXCJdO1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGNoaWxkMT1fc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg3KSBhcyBmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgICAgICAgICAgICAgLy8gY2hpbGQxLnZpc2libGU9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYWRkTGlzdGVuZXIoY2hpbGQxLExheWEuRXZlbnQuQ0xJQ0ssdGhpcy5TaWduQnV0dG9uRnVuLG51bGwpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5hZGRMaXN0ZW5lciggY2hpbGQxLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLlNpZ25CdXR0b25GdW4gKTtcclxuICAgICAgICAgICAgfWVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoMSkudmlzaWJsZT1mYWxzZTtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDYpLnZpc2libGU9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg3KS52aXNpYmxlPWZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKDIyMjIyMjIyMjIpO1xyXG4gICAgICAgICAgICB2YXIgbXl0ZXh0PV9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDIpIGFzIGZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICAgICAgICAgIHZhciBteW1vbmV5PV9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDMpIGFzIGZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICAgICAgICAgIG15bW9uZXkudmlzaWJsZT1mYWxzZTtcclxuICAgICAgICAgICAgdmFyIG15aW1hZ2U9X3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNCkgYXMgZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgICAgICAgICAgbXlpbWFnZS52aXNpYmxlPWZhbHNlO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHZhciBHTG9hZGVyPV9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDUpIGFzIGZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZihfaXNPaylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgR0xvYWRlci5pY29uID0gQXNzZXRQYXRoLmdldHJvbGVpY29uKCBwaWZ1Lmljb24gKTtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDEpLnZpc2libGU9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg2KS52aXNpYmxlPXRydWU7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg3KS52aXNpYmxlPXRydWU7XHJcbiAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9ZWxzZSBpZihfaXNDYW5TaWduKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgxKS52aXNpYmxlPXRydWU7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg3KS52aXNpYmxlPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNikudmlzaWJsZT1mYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2lnblNlbGVjdGVkSXRlbT1fc2lnbkl0ZW07XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNpZ25TZWxlY3RlZFRleHQ9dGV4dDtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2lnblNlbGVjdGVkTW9uZXk9MCtcIlwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TaWduUGlGdT1waWZ1O1xyXG4gICAgICAgICAgICAgICAgR0xvYWRlci52aXNpYmxlPXRydWU7XHJcbiAgICAgICAgICAgICAgICBHTG9hZGVyLmljb24gPSBBc3NldFBhdGguZ2V0cm9sZWljb24oIHRoaXMuU2lnblBpRnUuaWNvbiApO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5hZGRMaXN0ZW5lcihjaGlsZDEsTGF5YS5FdmVudC5DTElDSyx0aGlzLlNpZ25CdXR0b25GdW4sbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmFkZExpc3RlbmVyKCBjaGlsZDEsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuU2lnbkJ1dHRvbkZ1biApO1xyXG4gICAgICAgICAgICB9ZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBHTG9hZGVyLmljb24gPSBBc3NldFBhdGguZ2V0cm9sZWljb24oIHBpZnUuaWNvbiApO1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoMSkudmlzaWJsZT1mYWxzZTtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDYpLnZpc2libGU9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg3KS52aXNpYmxlPWZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIFNpZ25TZWxlY3RlZEl0ZW06ZmFpcnlndWkuR0ltYWdlO1xyXG4gICAgcHJpdmF0ZSBTaWduU2VsZWN0ZWRUZXh0OnN0cmluZztcclxuICAgIHByaXZhdGUgU2lnblNlbGVjdGVkTW9uZXk6c3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgU2lnblBpRnU6YW55O1xyXG5cclxuICAgIHB1YmxpYyBTaWduQnV0dG9uRnVuKClcclxuICAgIHtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCLmlLblj5bkuoZcIik7XHJcbiAgICAgICAgaWYodGhpcy5nZXRTeXN0ZW1UaW1lPT10aGlzLlNpZ25JbmZvW1widGltZVwiXSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5TaWduQWQudmlzaWJsZT10cnVlO1xyXG4gICAgICAgIExheWEudGltZXIub25jZSgzMDAwLHRoaXMsKCk9Pnt0aGlzLnNpZ25Ob3JhbUJ1dHRvbi52aXNpYmxlPXRydWV9KTtcclxuXHJcbiAgICAgICAgdGhpcy5TZXRTaWduSXRlbUluZm8odGhpcy5TaWduU2VsZWN0ZWRJdGVtLHRoaXMuU2lnblNlbGVjdGVkVGV4dCx0aGlzLlNpZ25TZWxlY3RlZE1vbmV5LHRydWUsZmFsc2UsdGhpcy5TaWduUGlGdSk7XHJcbiAgICAgICAgdGhpcy5TYXZlU2lnbkRhdGEoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyrli77pgInmlrnms5UqL1xyXG4gICAgcHJpdmF0ZSBTaWduVGlja0J1dHRvbkZ1bigpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5TaWduVGlja0ltYWdlLnZpc2libGU9IXRoaXMuU2lnblRpY2tJbWFnZS52aXNpYmxlO1xyXG4gICAgICAgIC8vIHRoaXMuU2lnbkRhbmJlaUJ0bi52aXNpYmxlID0gIXRoaXMuU2lnblRpY2tJbWFnZS52aXNpYmxlO1xyXG4gICAgICAgIC8vIHRoaXMuc2lnbk5vcmFtQnV0dG9uLnZpc2libGUgPSB0aGlzLlNpZ25UaWNrSW1hZ2UudmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKueCueWHu+inhumikeWPjOWAjemihuWPliovXHJcbiAgICBwcml2YXRlIFNpZ25BZEJ1dHRvbkZ1bigpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5XaW5BZEJ1dHRvbkZ1bigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8q5pmu6YCa6aKG5Y+WKi9cclxuICAgIHByaXZhdGUgU2lnbk5vcm1hbEJ1dHRvbkZ1bigpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5TYXZlU2lnbkRhdGEoKTtcclxuICAgICAgICBpZih0aGlzLlNpZ25UaWNrSW1hZ2UudmlzaWJsZT09dHJ1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuV2luQWRCdXR0b25GdW4oKTtcclxuICAgICAgICB9ZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgKHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5Hb2xkVXAoIE51bWJlcih0aGlzLlNpZ25TZWxlY3RlZE1vbmV5KSAqIDEgKTtcclxuICAgICAgICAgICAgaWYodGhpcy5TaWduUGlGdSE9bnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TaWduQWRkUGlmdSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXNlckRhdGFIYW5kbGVyKCk7XHJcbiAgICAgICAgICAgIFNjZW5lQ29udHJvbC5Jc1Nob3dTaWduPWZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLlNpZ25QYW5lbC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHR0YWQuQ2xlYXIoKTsvLzt5Lld4QXBpLlNob3dUeHQoXCLnrb7liLDmiJDlip9cIilcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgICAgICAgICAvKirog5zliKnnlYzpnaLlub/lkYrmjInpkq4qL1xyXG4gICAgICAgIHByaXZhdGUgV2luQWRCdXR0b25GdW4oKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLnrb7liLAuLi5cIik7XHJcbiAgICAgICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0dGFkLlNob3dWaWRlbygoZmxhZyk9PlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pKt5pS+6KeG6aKR6L+U5Zue5oiQ5YqfXCIrZmxhZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZmxhZylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pKt5pS+6KeG6aKR6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5Hb2xkVXAoIE51bWJlcih0aGlzLlNpZ25TZWxlY3RlZE1vbmV5KSAqIDIgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5TaWduUGlGdSE9bnVsbClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TaWduQWRkUGlmdSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2F2ZVNpZ25EYXRhKCk7Ly90aGlzLlNhdmVTaWduRGF0YSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2lnblBhbmVsLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgU2NlbmVDb250cm9sLklzU2hvd1NpZ249ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVXNlckRhdGFIYW5kbGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR0YWQuQ2xlYXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHByaXZhdGUgUGFvS3VTaWduOnN0cmluZz1cIlBhb0t1U2lnbkluZm9cIjtcclxuICAgICAgICBTaWduSW5mbzphbnk9bnVsbDtcclxuICAgICAgICBwcml2YXRlIExvYWRTaWduRGF0YSgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyB0aGlzLlNpZ25JbmZvPXtcImRheVwiOjAsXCJ0aW1lXCI6MCxcIkZpc3N0TG9hZFwiOjB9O1xyXG4gICAgICAgICAgICAvLyAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihcIlBhb0t1U2lnblwiLHRoaXMuU2lnbkluZm8pO1xyXG4gICAgICAgICAgICB0aGlzLlNpZ25JbmZvPUxheWEuTG9jYWxTdG9yYWdlLmdldEpTT04odGhpcy5QYW9LdVNpZ24pO1xyXG4gICAgICAgICAgICBpZih0aGlzLlNpZ25JbmZvPT0wfHx0aGlzLlNpZ25JbmZvPT1udWxsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGltZT10aGlzLmdldFN5c3RlbVRpbWUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2lnbkluZm89e1wiZGF5XCI6MCxcInRpbWVcIjowLFwiRmlzc3RMb2FkXCI6MH07XHJcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRKU09OKHRoaXMuUGFvS3VTaWduLHRoaXMuU2lnbkluZm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYXNkYXNkXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSBTYXZlU2lnbkRhdGEoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5TaWduSW5mb1tcIkZpc3N0TG9hZFwiXT0xO1xyXG4gICAgICAgICAgICB0aGlzLlNpZ25JbmZvW1wiZGF5XCJdKys7XHJcblxyXG4gICAgICAgICAgICB0aGlzLlNpZ25JbmZvW1widGltZVwiXT10aGlzLmdldFN5c3RlbVRpbWUoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04odGhpcy5QYW9LdVNpZ24sdGhpcy5TaWduSW5mbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcml2YXRlIGdldFN5c3RlbVRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgdmFyIGN1ckRhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICB2YXIgbW9udGg6IG51bWJlciA9IGN1ckRhdGUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pyIOlwiICsgbW9udGgudG9TdHJpbmcoKSk7XHJcbiAgICBcclxuICAgICAgICAgICAgdmFyIGRhdGU6IG51bWJlciA9IGN1ckRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaXpTpcIiArIGRhdGUudG9TdHJpbmcoKSk7XHJcbiAgICBcclxuICAgICAgICAgICAgcmV0dXJuIE51bWJlciggKG1vbnRoICsgXCJcIiArIGRhdGUpKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgICAgcHJpdmF0ZSBTaWduQWRkUGlmdSgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2FjaGVkYXRhID0gTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5HZXRMb2NhbENhQ2hlRGF0YSggVXNlckRhdGFJbmZvLnNraW4gKTtcclxuICAgICAgICAgICAgLy8gdmFyIGNhY2hlZGF0YSA9IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENhY2hlT2JqKCBVc2VyQ2FjaGVUeXBlLnNraW4gKTtcclxuICAgICAgICAgICAgdmFyIGlkPXRoaXMuU2lnblBpRnVbXCJpZFwiXTtcclxuICAgICAgICAgICAgdmFyIF9za2luUHJveHk6QWdlbmN5U2tpbiA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeVNraW4gKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwaUZ1Vk86U2tpbkRhdGE9bnVsbFxyXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgX3NraW5Qcm94eS5waWZ1QXJyLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBwaUZ1Vk89X3NraW5Qcm94eS5waWZ1QXJyW2luZGV4XTtcclxuICAgICAgICAgICAgICAgIGlmKHBpRnVWTy5yb2xlQ0ZHLmlkPT1pZClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwaUZ1Vk8uc3RhdGUgPSAxO1xyXG4gICAgICAgICAgICBBZ2VuY3lTa2luLmluc3RhbmNlLkFkZExvY2FsU2tpbkRhdGEocGlGdVZPLnJvbGVDRkcuaWQscGlGdVZPLnN0YXRlLHBpRnVWTy5oYXNudW0pO1xyXG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUudXBkYXRlU0tpblZpZXcpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+WPluearuiCpFwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2FjaGVkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIFxyXG5cclxufSIsImltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge1ZpZXdBY3Rpb259IGZyb20gXCIuLi91dGlscy9WaWV3QWN0aW9uXCI7XHJcbmltcG9ydCB7QWdlbmN5U2tpbn0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lTa2luXCI7XHJcbmltcG9ydCB7U2tpbkl0ZW19IGZyb20gXCIuLi91dGlscy9Ta2luSXRlbVwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcclxuaW1wb3J0IHtSb2xlRGF0YX0gZnJvbSBcIi4uL0RhdGEvUm9sZURhdGFcIjtcclxuaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1Jlc291cmNlQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xyXG5pbXBvcnQge0NoYXJhY3RlclN0YXRlfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZVwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Q2hhcmFjdGVyUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvQ2hhcmFjdGVyUG9vbFwiO1xyXG5pbXBvcnQge1BsYXllcn0gZnJvbSBcIi4uL0dhbWUvUGxheWVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2tpblBhbmVsIGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIlNraW5QYW5lbFwiO1xyXG4gICAgY190aXRsZTpmYWlyeWd1aS5Db250cm9sbGVyO1xyXG4gICAgbGlzdF8wOmZhaXJ5Z3VpLkdMaXN0O1xyXG4gICAgYnRuX2Nsb3NlOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBwcml2YXRlIF91aTNEU2NlbmU6TGF5YS5TY2VuZTNEO1xyXG4gICAgcHJpdmF0ZSBfdWljYXJtYTNEOkxheWEuQ2FtZXJhO1xyXG4gICAgLy8gcHJpdmF0ZSBfdWlsaWdodDpMYXlhLkRpcmVjdGlvbkxpZ2h0O1xyXG4gICAgcHJpdmF0ZSBhZ2VuY3lza2luOkFnZW5jeVNraW47XHJcbiAgICBwcml2YXRlIF9yb2xlbW86TGF5YS5TcHJpdGUzRDtcclxuICAgIHByaXZhdGUgX2lzZGVzdG9yeXM6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoIFwibWFpblwiLFwic2tpbnZpZXdcIixmYWxzZSxWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZSwwICk7IFxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2Rlc3RvcnlzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jX3RpdGxlID0gdGhpcy5nZXRDb250cm9sbGVyQnlCYW1lKCBcImNfdGl0bGVcIiApO1xyXG4gICAgICAgIHRoaXMuYWdlbmN5c2tpbiA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeVNraW4gKTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5zZXRWaXJ0dWFsKCk7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuaXRlbVJlbmRlcmVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSggdGhpcyx0aGlzLml0ZW1saXN0cmVuZGVyLG51bGwsZmFsc2UgKTtcclxuICAgICAgICB0aGlzLmNfdGl0bGUuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgdGhpcy5vbmNoYW5nZSgpO1xyXG4gICAgICAgIC8v5re75YqgM0TlnLrmma9cclxuICAgICAgICB0aGlzLl91aTNEU2NlbmUgPSB0aGlzLmRpc3BsYXlPYmplY3QuYWRkQ2hpbGRBdChuZXcgTGF5YS5TY2VuZTNEKCksMCkgYXMgTGF5YS5TY2VuZTNEO1xyXG4gICAgICAgIC8v5re75Yqg54Wn55u45py6XHJcbiAgICAgICAgdGhpcy5fdWljYXJtYTNEID0gKHRoaXMuX3VpM0RTY2VuZS5hZGRDaGlsZChuZXcgTGF5YS5DYW1lcmEoMCwgMC4xLCA4MCkpKSBhcyBMYXlhLkNhbWVyYTtcclxuICAgICAgICAvLyB0aGlzLl91aWNhcm1hM0QuY2xlYXJDb2xvciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdWljYXJtYTNELnZpZXdwb3J0ID0gbmV3IExheWEuVmlld3BvcnQodGhpcy54LHRoaXMueSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLl91aWNhcm1hM0QudHJhbnNmb3JtLnRyYW5zbGF0ZShuZXcgTGF5YS5WZWN0b3IzKDAsMS4yLDUpLGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gLy/mt7vliqDmlrnlkJHlhYlcclxuICAgICAgICAvLyB0aGlzLl91aWxpZ2h0ID0gUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5EaXJlY3Rpb25MaWdodCgpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0O1xyXG4gICAgICAgIC8vIHRoaXMuX3VpbGlnaHQuY29sb3IgPSBuZXcgTGF5YS5WZWN0b3IzKDAuNiwwLjYsMC42KTtcclxuICAgICAgICAvLyB0aGlzLl91aWxpZ2h0LnRyYW5zZm9ybS53b3JsZE1hdHJpeC5zZXRGb3J3YXJkKG5ldyBMYXlhLlZlY3RvcjMoMSwgLTEsIDApKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVyb2xlSGFuZGxlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fY2xvc2UsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuY190aXRsZSxmYWlyeWd1aS5FdmVudHMuU1RBVEVfQ0hBTkdFRCx0aGlzLHRoaXMub25jaGFuZ2UgKTtcclxuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggR2FtZVN0YXRlLnVwZGF0ZVNLaW5WaWV3LHRoaXMsdGhpcy5vbmNoYW5nZSApO1xyXG4gICAgICAgIHRoaXMuYWRkRGF0YUV2ZW50KCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkLHRoaXMsdGhpcy51cGRhdGVyb2xlSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIHByaXZhdGUgQ2xlYXJDaGFyYWN0ZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX3JvbGVtbyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc2NyaXB0OlBsYXllciA9IHRoaXMuX3JvbGVtby5nZXRDb21wb25lbnQoIFBsYXllciApIGFzIFBsYXllcjtcclxuICAgICAgICAgICAgQ2hhcmFjdGVyUG9vbC5DbGVhckNoYXJhY3RlciggdGhpcy5fcm9sZW1vLHNjcmlwdC5yZXNvdXNlTmFtZSxzY3JpcHQgKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9sZW1vID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBTa2luUGFuZWwgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2Rlc3RvcnlzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkNsZWFyQ2hhcmFjdGVyKCk7XHJcbiAgICAgICAgaWYoIHRoaXMuX3VpY2FybWEzRCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl91aWNhcm1hM0QuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl91aWNhcm1hM0QgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5fdWkzRFNjZW5lIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VpM0RTY2VuZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3VpM0RTY2VuZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN1cGVyLmRlc3RvcnkoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uY2hhbmdlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLmNfdGl0bGUuc2VsZWN0ZWRJbmRleCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdF8wLm51bUl0ZW1zID0gdGhpcy5hZ2VuY3lza2luLnBpZnVBcnIubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXRlbWxpc3RyZW5kZXIoIGluZGV4Om51bWJlcixpdGVtOlNraW5JdGVtICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLmNfdGl0bGUuc2VsZWN0ZWRJbmRleCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBpbmRleCA8IHRoaXMuYWdlbmN5c2tpbi5waWZ1QXJyLmxlbmd0aCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIHRoaXMuYWdlbmN5c2tpbi5waWZ1QXJyW2luZGV4XSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlcm9sZUhhbmRsZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gdGhpcy5hZ2VuY3lza2luLlJvbGVEYXRhO1xyXG4gICAgICAgIHRoaXMuQ2xlYXJDaGFyYWN0ZXIoKTtcclxuICAgICAgICB2YXIgcGF0aEFycjpBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgcGF0aEFyci5wdXNoKCB7IHVybDpBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoIFJvbGVEYXRhLnJvbGVDZmcubmFtZSApfSApO1xyXG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkZXIzREFyciggcGF0aEFycix0aGlzLHRoaXMubG9hZGNvbXBsZXRlLG51bGwsdHJ1ZSxSb2xlRGF0YS5yb2xlQ2ZnLm5hbWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9vdXQ6TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjtcclxuICAgIHByaXZhdGUgbG9hZGNvbXBsZXRlKCByZXNvdXNlbmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gdGhpcy5hZ2VuY3lza2luLlJvbGVEYXRhO1xyXG4gICAgICAgIGlmKCAhdGhpcy5faXNkZXN0b3J5cyAmJiB0aGlzLl91aTNEU2NlbmUgJiYgcmVzb3VzZW5hbWUgPT0gUm9sZURhdGEucm9sZUNmZy5uYW1lIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JvbGVtbyA9IENoYXJhY3RlclBvb2wuQWRkQ2hhcmFjdGVyKCByZXNvdXNlbmFtZSxQbGF5ZXIsdGhpcy5fdWkzRFNjZW5lICk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JvbGVtby50cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCAwLDIsMCApO1xyXG4gICAgICAgICAgICBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSggbmV3IExheWEuVmVjdG9yMyggMCwxLDAgKSwtMTM1KjE4MC9NYXRoLlBJLHRoaXMuX291dCApO1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlbW8udHJhbnNmb3JtLnJvdGF0aW9uID0gdGhpcy5fb3V0O1xyXG4gICAgICAgICAgICAoIHRoaXMuX3JvbGVtby5nZXRDb21wb25lbnQoIFBsYXllciApIGFzIFBsYXllciApLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc3RhbmQgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICBcclxuXHJcbn0iLCJpbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4uL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xyXG5pbXBvcnQge1ZpZXdBY3Rpb259IGZyb20gXCIuLi91dGlscy9WaWV3QWN0aW9uXCI7XHJcbmltcG9ydCB7U2tpbkRhdGF9IGZyb20gXCIuLi9EYXRhL1NraW5EYXRhXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuaW1wb3J0IHtBZ2VuY3lUcmlhbH0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lUcmlhbFwiO1xyXG5pbXBvcnQge0d1YW5nR2FvfSBmcm9tIFwiLi4vV1hTREsvR3VhbmdHYW9cIjtcclxuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi9XWFNESy90dGFkXCI7XHJcbmltcG9ydCB7IFRpbWVyU2VydmljZSB9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRyaWFsUGFuZWwgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiVHJpYWxQYW5lbFwiO1xyXG5cclxuXHJcbiAgICBsb2FkX2ljb246ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIGJ0bl92aWRlbzpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgYnRuX2Nsb3NlOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcblxyXG4gICAgc2tpbmFycjpBcnJheTxTa2luRGF0YT47XHJcbiAgICBwcml2YXRlIF9zZWxlY3R2bzpTa2luRGF0YTtcclxuICAgIHByaXZhdGUgYWdlbmN5dHJpYWw6QWdlbmN5VHJpYWw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoIGFycjpBcnJheTxTa2luRGF0YT4gKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoXCJtYWluXCIsXCJzaGl5b25nVmlld1wiLGZhbHNlLFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lLDEpOyBcclxuICAgICAgICB0aGlzLnNraW5hcnIgPSBhcnI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzdXBlci5vbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZ2VuY3l0cmlhbCA9IHRoaXMuZ2V0UHJveHkoIEFnZW5jeVRyaWFsICk7XHJcbiAgICAgICAgdmFyIGluZGV4Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsdGhpcy5za2luYXJyLmxlbmd0aC0xICk7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0dm8gPSB0aGlzLnNraW5hcnJbIGluZGV4IF07XHJcbiAgICAgICAgdGhpcy5sb2FkX2ljb24udXJsID0gQXNzZXRQYXRoLmdldHJvbGVpY29uKCB0aGlzLl9zZWxlY3R2by5yb2xlQ0ZHLmljb24gKTtcclxuICAgICAgICAvLyBwaW5ndGFpdXRpbHMuSW5zdGFuY2UuY3JlYXRlQmFubmVyKCBcIlNoaVlvbmdWaWV3XCIgKTtcclxuICAgICAgICBHdWFuZ0dhby5DaGVhdEJhbm5lcih0aGlzLmJ0bl9jbG9zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl9jbG9zZSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmNsb3NlZnVuICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fdmlkZW8sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMudmlkZW9mdW4gKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHZpZGVvZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIC8vIHBpbmd0YWl1dGlscy5JbnN0YW5jZS5wbGF5VmlkZW8oIFwiXCIsdGhpcyx0aGlzLnZpZGVvY2FsbGJhY2sgKTtcclxuICAgICAgICB0aGlzLnZpZGVvY2FsbGJhY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHZpZGVvY2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdHRhZC5TaG93VmlkZW8oKGlzTG9hZD0+e1xyXG4gICAgICAgICAgICBpZihpc0xvYWQpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZ2VuY3l0cmlhbC5FeGl0UGFuZWwoIHRoaXMuX3NlbGVjdHZvICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uY2xvc2VmdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZ2VuY3l0cmlhbC5FeGl0UGFuZWwoIG51bGwgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAvLyBHdWFuZ0dhby5DbGVhcigpO1xyXG4gICAgICAgIHR0YWQuQ2xlYXIoKTtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBMYXlPVVQgfSBmcm9tIFwiLi4vdXRpbHMvTGF5T1VUXCI7XHJcbmltcG9ydCB7IExheW91dENvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9MYXlvdXRDb250cm9sXCI7XHJcbmltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAYXV0aG9yIFxyXG4gKlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFZpZXdNYW5hZ2VyIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6IFZpZXdNYW5hZ2VyO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlt7Lms6jlhoznmoRVSVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF92aWV3czogYW55O1xyXG5cclxuXHRwdWJsaWMgY29uc3RydWN0b3IoKSBcclxuXHR7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBWaWV3TWFuYWdlci5pbnMgPSB0aGlzO1xyXG5cdH1cclxuXHRcclxuXHRwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlZpZXdNYW5hZ2VyXHJcblx0e1xyXG5cdCAgICBpZiggVmlld01hbmFnZXIuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3TWFuYWdlcigpOyAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFZpZXdNYW5hZ2VyLmlucztcclxuXHR9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fdmlld3MgPSB7fTtcclxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICB9XHJcblx0XHJcbiAgICAvKipcclxuICAgICAqICB2aWV3IOinhuWbvuWvueixoeexu1xyXG4gICAgICogIGRhdGEg57uR5a6a5pWw5o2uIO+8iCBkYXRhIOWmguaenOS4jeS4uuepuu+8jOS7o+ihqOaehOmAoOWHveaVsOS8oOWPgiDvvIlcclxuICAgICAqICBsYXllciDlsYLnuqdcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZCggdmlldzphbnksZGF0YTphbnkgPSBudWxsLGxheWVyOiBzdHJpbmcgPSBMYXlPVVQuVUkgKTphbnlcclxuXHR7XHJcbiAgICAgICAgaWYoIHZpZXcua2V5ID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmlldyBoYXZlIG5vIGtleVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHR5cGU6IHN0cmluZyA9IHZpZXcua2V5O1xyXG4gICAgICAgIGlmKHRoaXMuX3ZpZXdzW3R5cGVdKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW12aWV3OmZhaXJ5Z3VpLkdDb21wb25lbnQgPSB0aGlzLl92aWV3c1t0eXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW12aWV3O1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZDogYW55O1xyXG4gICAgICAgIGlmKGRhdGEgIT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkID0gbmV3IHZpZXcoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGQgPSBuZXcgdmlldygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkLnZpZXdLZXkgPSB2aWV3O1xyXG4gICAgICAgIGQuZ2FtZUxheWVyID0gbGF5ZXI7XHJcbiAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5BZGRMYXllckJ5TmFtZSggZCxsYXllciApO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdzW3R5cGVdID0gZDtcclxuICAgICAgICByZXR1cm4gZDtcclxuXHR9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog5YWz6Zet55WM6Z2iXHJcbiAgICAgKiBAcGFyYW0gdmlldyDnlYzpnaIgXHJcbiAgICAgKiBAcGFyYW0gaXNiZ2Nsb3NlIOaYr+WQpuaYr+eCueWHu+iDjOaZr+WFs+mXreeahOeKtuaAgSBcclxuICAgICAqIEBwYXJhbSBpc3BsYXlBbm1vIOaYr+WQpuaSreaUvuWFs+mXreWKqOeUu++8iCDkuLvopoHnlKjkuo7lvLrliLblhbPpl60g77yJXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbG9zZSggdmlldzogYW55LGlzYmdjbG9zZTpib29sZWFuPWZhbHNlLGlzcGxheUFubW86Ym9vbGVhbj10cnVlICk6dm9pZFxyXG5cdHtcclxuICAgICAgICB2YXIgdHlwZTogc3RyaW5nID0gdmlldy5rZXk7XHJcbiAgICAgICAgdmFyIGl0ZW06IFBhbmVsQmFzZUNvbnRyb2wgPSB0aGlzLl92aWV3c1t0eXBlXTtcclxuICAgICAgICBpZighaXRlbSkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UuQ2xlYXJMYXllckJ5TmFtZSggaXRlbS5nYW1lTGF5ZXIgKTtcclxuICAgICAgICBpZihpc3BsYXlBbm1vKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5FeGl0VmlldygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLmRlc3RvcnkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX3ZpZXdzW3R5cGVdO1xyXG5cdH1cclxuXHJcbiAgICBwdWJsaWMgb25yZXNpemUoIHc6bnVtYmVyLGg6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl92aWV3cyAhPSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtdmlldzpQYW5lbEJhc2VDb250cm9sO1xyXG4gICAgICAgICAgICBmb3IoIHZhciBpdGVtIGluIHRoaXMuX3ZpZXdzIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaXRlbXZpZXcgPSB0aGlzLl92aWV3c1tpdGVtXTtcclxuICAgICAgICAgICAgICAgIGl0ZW12aWV3LnNldFNpemUoIHcsaCApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cdFxyXG4gICAgcHVibGljIGdldFZpZXcoIHZpZXc6IGFueSApOmFueVxyXG5cdHtcclxuICAgICAgICB2YXIgdHlwZTogc3RyaW5nID0gdmlldy5rZXk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdzW3R5cGVdO1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgeyBSZWNvbW1lbmQgfSBmcm9tIFwiLi4vUHVzaC9SZWNvbW1lbmRWaWV3XCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IENob3V0aVBhblZpZXcgZnJvbSBcIi4uL1B1c2gvQ2hvdXRpUGFuVmlld1wiO1xyXG5cclxuLy8gaW1wb3J0IHsgTWFpbiB9IGZyb20gXCIuLi9NYWluXCI7XHJcbi8vIGltcG9ydCBMaXN0SXRlbSBmcm9tIFwiLi4vR2FtZVRvb2xzL0xpc3RJdGVtXCI7XHJcbi8vIGltcG9ydCB7IFBhbmVsTWFuYWdlciwgUGFuZWxUeXBlIH0gZnJvbSBcIi4uL1ZpZXcvUGFuZWxNYW5hZ2VyXCI7XHJcbi8vIGltcG9ydCBHdWFuZ0dhbyBmcm9tIFwiLi9HdWFuZ0dhb1wiO1xyXG4vLyBpbXBvcnQgeyBXWFNESyB9IGZyb20gXCIuL1dYU0RLXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRllIRF9TZGsge1xyXG4gICAgcHVibGljIHN0YXRpYyBBZF9DbGlja1R5cGUgPSB7XHJcbiAgICAgICAgVmlkZW86IFwidmlkZW9fY2xpY2tcIixcclxuICAgICAgICBXYXRjaDogXCJ3YXRjaFwiLFxyXG4gICAgICAgIFNoYXJlOiBcInNoYXJlXCIsXHJcbiAgICAgICAgQmFubmVyOiBcImJhbm5lclwiLFxyXG4gICAgICAgIFB1c2g6IFwicHVzaFwiLFxyXG4gICAgICAgIFB1c2hDbGljazpcImljb25fY2xpY2tcIlxyXG4gICAgfVxyXG5cclxuICAgIC8v5piv5ZCm5Li655m95ZCN5Y2V55So5oi3XHJcbiAgICBwdWJsaWMgc3RhdGljIGlzd2hpdGU6Ym9vbGVhbjtcclxuICAgIC8v5piv5ZCm5Li65paw55So5oi3XHJcbiAgICBwdWJsaWMgc3RhdGljIGlzbmV3dXNlcjpib29sZWFuO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcHVzaERhdGEgPSBbXTtcclxuICAgIHByaXZhdGUgc3RhdGljIG9wZW5pZDogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNIYXZlRGF0ZSA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd0FkID0gXCJTaG93QWRcIjtcclxuICAgIC8v5Yid5aeL5YyWc2RrXHJcbiAgICBwdWJsaWMgc3RhdGljIEluaXRTZGsoKSB7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLnN0YXJ0U2RrKCk7XHJcbiAgICAgICAgRllIRF9TZGsuVXNlckluZm9BdXRoKCk7XHJcbiAgICAgICAgLy8gbGV0IHdoaXRlID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImlzX3doaXRlXCIpO1xyXG4gICAgICAgIC8vIGlmKHdoaXRlKXtcclxuICAgICAgICAvLyAgICAgRllIRF9TZGsuaXN3aGl0ZSA9IHRydWU7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGVsc2V7XHJcbiAgICAgICAgLy8gICAgIEZZSERfU2RrLmdldFdoaXRlQ29uZmlnKCk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyBsZXQgbmV3dXNlciA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJpc19uZXd1c2VyXCIpO1xyXG4gICAgICAgIC8vIGlmKCFuZXd1c2VyKXtcclxuICAgICAgICAvLyAgICAgRllIRF9TZGsuaXNuZXd1c2VyID0gdHJ1ZTtcclxuICAgICAgICAvLyAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImlzX25ld3VzZXJcIixcIjFcIik7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGVsc2V7XHJcbiAgICAgICAgLy8gICAgIEZZSERfU2RrLmlzbmV3dXNlciA9IGZhbHNlO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBGWUhEX1Nkay5QdXNoRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v55So5oi35o6I5p2DXHJcbiAgICBwdWJsaWMgc3RhdGljIFVzZXJJbmZvQXV0aCgpIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5nZXRGeWhkVXNlckluZm8obnVsbCwgZmFsc2UsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5peg5o6I5p2D5Zue6LCDOlwiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQudXNlcikge1xyXG4gICAgICAgICAgICAgICAgRllIRF9TZGsub3BlbmlkID0gZGF0YS5yZXN1bHQudXNlci5vcGVuaWQ7XHJcbiAgICAgICAgICAgICAgICBGWUhEX1Nkay5BdXRoSW5mbygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHN0YXRpYyBBdXRoSW5mbygpIHtcclxuICAgICAgICB2YXIgYXJncyA9IHtcclxuICAgICAgICAgICAgb3BlbmlkOiBGWUhEX1Nkay5vcGVuaWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5sb2dpbkRhdGEoYXJncywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmjojmnYPkuIrmiqXlm57osIM6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgICAgIEZZSERfU2RrLlZhbHVlVXNlcigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVVc2VyKCkge1xyXG4gICAgICAgIHZhciBhcmdzID0ge1xyXG4gICAgICAgICAgICBvcGVuaWQ6IEZZSERfU2RrLm9wZW5pZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLnZhbHVldXNlcihhcmdzLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuacieaViOeUqOaIt+S4iuaKpTpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAgIFxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0V2hpdGVDb25maWcoKXtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkud2hpdGVDb25maWcoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgRllIRF9TZGsuaXN3aGl0ZSA9IGUuZGF0YS5pc193aGl0ZTtcclxuICAgICAgICAgICAgaWYoRllIRF9TZGsuaXN3aGl0ZSl7XHJcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaXNfd2hpdGVcIixcIjFcIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIueZveWQjeWNlS0tLVwiLGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2V0SHVUdWlMaXN0KGxpc3Q6IExheWEuTGlzdCwgc2Nyb2w6IG51bWJlciA9IDEsIHR5cGU6IHN0cmluZyA9IFwiXCIpIHsgLy9zY3JvbCAxOuerlueahCAgMuaoqueahFxyXG4gICAgICAgIGxldCBhcnIgPSB0aGlzLnB1c2hEYXRhO1xyXG4gICAgICAgIGlmICghYXJyIHx8IGFyci5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG4gICAgICAgIGxpc3Quc2VsZWN0RW5hYmxlID0gZmFsc2U7XHJcbiAgICAgICAgc2Nyb2wgPT0gMSA/IGxpc3QudlNjcm9sbEJhclNraW4gPSBcIlwiIDogbGlzdC5oU2Nyb2xsQmFyU2tpbiA9IFwiXCI7XHJcbiAgICAgICAgbGlzdC5yZW5kZXJIYW5kbGVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLnVwZGF0ZUl0ZW0sIFt0eXBlXSwgZmFsc2UpO1xyXG4gICAgICAgIGxpc3QuYXJyYXkgPSBhcnI7XHJcbiAgICAgICAgbGlzdC5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHN0YXRpYyB1cGRhdGVJdGVtKHR5cGU6IHN0cmluZywgY2VsbDogTGF5YS5Cb3gsIGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICAvLyB2YXIgYWRpdGVtID0gY2VsbC5nZXRDb21wb25lbnQoTGlzdEl0ZW0pIGFzIExpc3RJdGVtO1xyXG4gICAgICAgIC8vIGFkaXRlbS5SZWZyZXNoKHR5cGUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL+eCueWHu+S6i+S7tuS4iuaKpVxyXG4gICAgcHVibGljIHN0YXRpYyBDbGlja0FkKGFkX3R5cGU6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql57G75Z6LLS0tXCIsYWRfdHlwZSk7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcclxuICAgICAgICB2YXIgcGFyYW0gPSB7XHJcbiAgICAgICAgICAgIGFkX3R5cGU6IGFkX3R5cGUsXHJcbiAgICAgICAgICAgIC8v5q2k5aSE5re75Yqgb3BlbmlkXHJcbiAgICAgICAgICAgIG9wZW5pZDpGWUhEX1Nkay5vcGVuaWRcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLngrnlh7vlj4LmlbA6XCIgKyBwYXJhbSk7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLmFkdmVydGlzZW1lbnQocGFyYW0sIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi54K55Ye757uT5p6cOlwiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgLy/kupLmjqjkv6Hmga9cclxuICAgIHB1YmxpYyBzdGF0aWMgUHVzaERhdGEoKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcInB1c2hkYXRhLS1cIixNYWluLldYKTtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG4gICAgICAgIHZhciBwYXJhbSA9IHt9O1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5zaGFyZVJlY29tbWVuZChwYXJhbSwgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLng63pl6jmuLjmiI/mlbDmja4tLVwiLGRhdGEpXHJcbiAgICAgICAgICAgIGlmIChkYXRhLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgIEZZSERfU2RrLnB1c2hEYXRhID0gZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgRllIRF9TZGsucHVzaERhdGEuc29ydChGWUhEX1Nkay5MaXN0U29ydCk7XHJcbiAgICAgICAgICAgICAgICBGWUhEX1Nkay5pc0hhdmVEYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8v5q2k5aSE5rS+5Y+R5LqL5Lu277yM5bGV56S65LqS5o6oXHJcbiAgICAgICAgICAgICAgICAvL0V2ZW50TWFuYWdlci5ldmVudChGWUhEX1Nkay5TaG93QWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6I635Y+W5LqS5o6o5L+h5oGvOlwiICsgSlNPTi5zdHJpbmdpZnkoRllIRF9TZGsucHVzaERhdGEpKTtcclxuICAgICAgICAgICAgbmV3IFJlY29tbWVuZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBTaG93SHVUdWlKdW1wKGRhdGEsb3Blbikge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGRhdGEuanVtcF90eXBlID09IDIpIC8v5LqM57u056CB6Lez6L2s5pa55rOVXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnByZXZpZXdJbWFnZSh7IGN1cnJlbnQ6IGRhdGEucXJjb2RlLCB1cmxzOiBbZGF0YS5xcmNvZGVdIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhLmp1bXBfdHlwZSA9PSAxKSAvL+ebtOi3s+aWueazlVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5uYXZpZ2F0ZVRvTWluaVByb2dyYW0oe1xyXG4gICAgICAgICAgICAgICAgYXBwSWQ6IGRhdGEudG9fYXBwaWQsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiBkYXRhLmp1bXBfcGF0aCxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5omT5byA5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrmiqXmiJDlip86XCIgKyBKU09OLnN0cmluZ2lmeShyZXMpKTtcclxuICAgICAgICAgICAgICAgICAgICBGWUhEX1Nkay5QdXNoQ2xpY2soZGF0YS50b19hcHBpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbChyZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKG9wZW4pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGRhdGEuanVtcF90eXBlID09IDApLy/lubPlj7Dot7Povazmlrnms5VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gubmF2aWdhdGVUb01pbmlQcm9ncmFtKHtcclxuICAgICAgICAgICAgICAgIGFwcElkOiBkYXRhLnBsYXRmb3JtX2FwcGlkLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogZGF0YS5qdW1wX3BhdGgsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOaJk+W8gOaIkOWKn1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql5oiQ5YqfOlwiICsgSlNPTi5zdHJpbmdpZnkocmVzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgRllIRF9TZGsuUHVzaENsaWNrKGRhdGEudG9fYXBwaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGZhaWwocmVzKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihvcGVuKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8v5LqS5o6o54K55Ye7XHJcbiAgICBwdWJsaWMgc3RhdGljIFB1c2hDbGljayh0b19hcHBpZCkge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XHJcbiAgICAgICAgdmFyIHBhcmFtID0ge1xyXG4gICAgICAgICAgICBvcGVuaWQ6IEZZSERfU2RrLm9wZW5pZCxcclxuICAgICAgICAgICAgdG9fYXBwaWQ6IHRvX2FwcGlkLFxyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkuc2hhcmVQbGF5KHBhcmFtLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIueCueWHu+S4iuaKpee7k+aenDpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBMaXN0U29ydChhLCBiKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAoTnVtYmVyKGFbXCJwYW5lbFwiXSkgPCBOdW1iZXIoYltcInBhbmVsXCJdKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChOdW1iZXIoYVtcInBhbmVsXCJdKSA9PSBOdW1iZXIoYltcInBhbmVsXCJdKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE51bWJlcihhW1wicGFuZWxcIl0pID4gTnVtYmVyKGJbXCJwYW5lbFwiXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiXHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4vU2RrXCI7XHJcbmltcG9ydCB7IFNoYXJlVXRpbCB9IGZyb20gXCIuL1NoYXJlVXRpbFwiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4vUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuL0ZZSERfU2RrXCI7XHJcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi90dGFkXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgV3hHYW1lSXRlbVxyXG57XHJcbiAgICBhcHBOYW1lSGlkZGVuOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbG9yOnN0cmluZyA9IFwiQzkzQjNCRkZcIjtcclxuICAgIHNpemU6bnVtYmVyID0gMTAwO1xyXG4gICAgYm9yZGVyV2lkdGg6bnVtYmVyID0gNTA7XHJcbiAgICBib3JkZXJDb2xvcjpzdHJpbmcgPSBcIkExQTBBMEZGXCI7XHJcbiAgICBsZWZ0Om51bWJlcjtcclxuICAgIHRvcDpudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHdWFuZ0dhbyBcclxue1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGZzYWFzZmFmc3NmYTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBjdXJiYW5uZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgdmlkZWxBZFVuaXRJZCA9IFwiYWR1bml0LTBjNjg3MDg0YzkwOGVlODlcIjtcclxuICAgIHByaXZhdGUgc3RhdGljIGJhbm5lckFkVW5pdElkID0gXCJhZHVuaXQtOGMyZDU4NjEzNWZhNmQ0ZlwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYWZzZnNhYWZzZnNhOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvL+inhuWxj+W5v+WRiuaYr+WQpuWKoOi9veaIkOWKn1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXNmYXNmc2FmZnNhOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc3RhdGljIGdldCBoYXNiYW5uZXIoKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgaWYoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5iYW5uZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGhhc3ZpZGVvKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbiAmJiBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnZpZGVvKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZpZGVvbnVtID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5HZXRHbG9iZVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL+mihOWFiOWKoOi9veinhuWxj+W5v+WRilxyXG4gICAgcHVibGljIHN0YXRpYyBJbml0VmlkZW8oKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluIHx8ICFQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnZpZGVvKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuYmFubmVyQWRVbml0SWQpO1xyXG5cclxuICAgICAgICAvL3ZlZGlvXHJcbiAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZVJld2FyZGVkVmlkZW9BZCh7IGFkVW5pdElkOiB0aGlzLnZpZGVsQWRVbml0SWQgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLm9uTG9hZCgoKSA9PiBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmv4DlirHop4bpopEg5bm/5ZGK5Yqg6L295oiQ5YqfJyk7XHJcbiAgICAgICAgICAgIHRoaXMuYXNmYXNmc2FmZnNhID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub25FcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIua/gOWKseinhuWxj+WKoOi9veWksei0pTpcIiArIGVycik7XHJcbiAgICAgICAgICAgIHRoaXMuYXNmYXNmc2FmZnNhID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWZzZnNhYWZzZnNhID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvL+eci+inhumikVxyXG4gICAgcHVibGljIHN0YXRpYyBTaG93VmlkZW8oY2FsbGJhY2s6IEZ1bmN0aW9uKSBcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5oYXN2aWRlbykgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZih0aGlzLmFzZmFzZnNhZmZzYSlcclxuICAgICAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzaG93VmlkZW9BZDpcIiArIHRoaXMuYXNmYXNmc2FmZnNhKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuU2V0VmlkZW9DYWxsQmFjayhjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5zaG93KCkuY2F0Y2goZXJyID0+IFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLmxvYWQoKS50aGVuKCgpID0+IFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TZXRWaWRlb0NhbGxCYWNrKGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNoYXJlVXRpbC5zaGFyZUltYWdlKFwi6KeG6aKR5rKh5pyJ5YiG5LqrXCIsIGNhbGxiYWNrXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgLCBcIjFcIik7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBcclxuICAgICAgICB9IFxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gU2hhcmVVdGlsLnNoYXJlSW1hZ2UoXCLop4bpopHmsqHmnInliIbkuqtcIiwgY2FsbGJhY2tcclxuICAgICAgICAgICAgLy8gICAgICAgICAsIFwiMVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgU2V0VmlkZW9DYWxsQmFjayhjYWxsYmFjazpGdW5jdGlvbilcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5vZmZDbG9zZSgpO1xyXG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLm9uQ2xvc2UocmVzID0+IFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmv4DlirHop4bpopHlhbPpl606XCIrcmVzLmlzRW5kZWQpO1xyXG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5pc0VuZGVkIHx8IHJlcyA9PT0gdW5kZWZpbmVkKSB7Y2FsbGJhY2sgJiYgY2FsbGJhY2sodHJ1ZSl9XHJcbiAgICAgICAgICAgIGVsc2UgeyBjYWxsYmFjayAmJiBjYWxsYmFjayhmYWxzZSkgfVxyXG4gICAgICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5vZmZDbG9zZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjYW5zaG93YmFubmVyID0gdHJ1ZTtcclxuICAgIC8v5omT5byAYmFubmVyXHJcbiAgICBwdWJsaWMgc3RhdGljIE9wZW5CYW5uZXIoZ2FwOiBudW1iZXIgPSAwLGNhbGxWYWNrOiBGdW5jdGlvbiA9IG51bGwsIGlzd2FpdDogYm9vbGVhbiA9IGZhbHNlKSBcclxuICAgIHtcclxuICAgICAgICAvLyBpZiAoIXRoaXMuaGFzYmFubmVyKVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgY2FsbFZhY2sobnVsbCk7XHJcbiAgICAgICAgLy8gICAgIHJldHVybjtcclxuICAgICAgICAvLyB9IFxyXG5cclxuICAgICAgICBpZighTGF5YS5Ccm93c2VyLm9uV2VpWGluKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FsbFZhY2sobnVsbCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2Fuc2hvd2Jhbm5lciA9IHRydWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIGlkZCA9IHRoaXMuYmFubmVyQWRVbml0SWQ7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJhZFVuaXRJZDpcIitpZGQpO1xyXG4gICAgICAgIGxldCBuZXdCYW5uZXIgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZUJhbm5lckFkKHtcclxuICAgICAgICAgICAgYWRVbml0SWQ6IGlkZCxcclxuICAgICAgICAgICAgc3R5bGU6IFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0OiAwLFxyXG4gICAgICAgICAgICAgICAgdG9wOiAwLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDQ2MFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbmV3QmFubmVyLm9uRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgY2FsbFZhY2sobnVsbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbmV3QmFubmVyLm9uTG9hZCgoKSA9PiBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cmJhbm5lcikgdGhpcy5jdXJiYW5uZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lciA9IG5ld0Jhbm5lcjtcclxuICAgICAgICAgICAgdmFyIGhpZ2h0OiBudW1iZXIgPSB0aGlzLkdldFJlYWxIaWdodChnYXApO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhbGxWYWNrICE9IG51bGwpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYWxsVmFjayhoaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodGhpcy5jYW5zaG93YmFubmVyICYmICFpc3dhaXQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0UmVhbEhpZ2h0KGdhcClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJiYW5uZXIpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGV0IGluZm8gPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLndpZHRoID0gaW5mby53aW5kb3dXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLnRvcCA9IGluZm8ud2luZG93SGVpZ2h0IC0gdGhpcy5jdXJiYW5uZXIuc3R5bGUucmVhbEhlaWdodCAtIGdhcDtcclxuICAgICAgICAgICAgcmV0dXJuIExheWEuc3RhZ2UuaGVpZ2h0IC8gaW5mby53aW5kb3dIZWlnaHQgKiB0aGlzLmN1cmJhbm5lci5zdHlsZS5yZWFsSGVpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL2NsZWFyXHJcbiAgICBzdGF0aWMgQ2xlYXIoKVxyXG4gICAge1xyXG4gICAgICAgIEd1YW5nR2FvLmNsZWFyVHdlZW4oKTtcclxuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyQWxsKHRoaXMpO1xyXG4gICAgICAgIExheWEuVHdlZW4uY2xlYXJBbGwodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jYW5zaG93YmFubmVyID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5oaWRlKCk7XHJcblxyXG4gICAgICAgIC8vIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBoaWRlYmFubmVyKCkgXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5jdXJiYW5uZXIpIHRoaXMuY3VyYmFubmVyLmhpZGUoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgc2hvd2Jhbm5lcigpIFxyXG4gICAge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5zaG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgY2FuY2hlYXQoKTpib29sZWFuXHJcblx0e1xyXG4gICAgICAgIGlmKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuY2hlYXQpe1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZighUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5jaGVhdClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiY2hlYXQ6ZmFsc2UtPiBDdXJBY2NvdW50RGF0YS5jaGVhdCAhPSAxXCIpO1xyXG4gICAgICAgIC8vICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgLy8gfVxyXG5cdFx0Ly8gdmFyIGNoZWNrc2NlbmNlID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5jaGVja3NjZW5jZTtcclxuICAgICAgICAvLyBpZiAoY2hlY2tzY2VuY2UgPT0gZmFsc2UpXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImNoZWF0OnRydWUtPiBcIiArIFd4QXBpLnNjZW5lVmFsdWUpO1xyXG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gaWYgKFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDM3XCIgfHwgV3hBcGkuc2NlbmVWYWx1ZSA9PSBcIjEwNThcInx8IFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDY3XCIgfHwgV3hBcGkuc2NlbmVWYWx1ZSA9PSBcIjEwOTVcIikgXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImNoZWF0OnRydWUtPiBcIiArIFd4QXBpLnNjZW5lVmFsdWUpO1xyXG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVhdDpmYWxzZS0+IFwiICsgV3hBcGkuc2NlbmVWYWx1ZSk7XHJcbiAgICAgICAgLy8gcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgYmFubmVyaGlndCA9IDA7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNldFBvc0Jhbm5lcihidG46TGF5YS5VSUNvbXBvbmVudCxjb21wbGV0ZTpGdW5jdGlvbilcclxuICAgIHtcclxuICAgICAgICBpZihMYXlhLkJyb3dzZXIub25QQylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbXBsZXRlKGZhbHNlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGluZm8gPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhpbmZvKTtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGJ0bik7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhidG4ueSxMYXlhLnN0YWdlLmhlaWdodCxpbmZvLndpbmRvd0hlaWdodCk7XHJcbiAgICAgICAgdmFyIHJlc2hpZ2h0ID0gYnRuLnkgKiBpbmZvLndpbmRvd0hlaWdodCAvIExheWEuc3RhZ2UuaGVpZ2h0O1xyXG5cclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwicmVzaGlnaHRcIixyZXNoaWdodCk7XHJcblxyXG4gICAgICAgIHZhciBpZGQgPSB0aGlzLmJhbm5lckFkVW5pdElkO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWRVbml0SWQ6XCIraWRkKTtcclxuICAgICAgICBpZiAodGhpcy5jdXJiYW5uZXIpIHRoaXMuY3VyYmFubmVyLmRlc3Ryb3koKTtcclxuICAgICAgICBsZXQgbmV3QmFubmVyID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVCYW5uZXJBZCh7XHJcbiAgICAgICAgICAgIGFkVW5pdElkOiBpZGQsXHJcbiAgICAgICAgICAgIHN0eWxlOiBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGVmdDogMCxcclxuICAgICAgICAgICAgICAgIHRvcDogMCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiA3MjBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG5ld0Jhbm5lci5vbkVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgIGNvbXBsZXRlKGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICBuZXdCYW5uZXIub25Mb2FkKCgpID0+IFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIgPSBuZXdCYW5uZXI7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zdHlsZS50b3AgPSByZXNoaWdodDtcclxuXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJ0b3BcIix0aGlzLmFzZ2FnYXNzZ2Euc3R5bGUudG9wKTtcclxuICAgICAgICAgICAgaWYodGhpcy5jdXJiYW5uZXIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmFubmVyIHNob3dcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMjMwMCx0aGlzLCgpPT5cclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zdHlsZS50b3AgPSBpbmZvLndpbmRvd0hlaWdodCAtIEd1YW5nR2FvLmJhbm5lcmhpZ3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbmV3QmFubmVyLm9uUmVzaXplKChyZXMpPT5cclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEd1YW5nR2FvLmJhbm5lcmhpZ3QgPSByZXMuaGVpZ2h0O1xyXG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zdHlsZS53aWR0aCA9IGluZm8ud2luZG93V2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLnRvcCA9IHJlc2hpZ2h0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0d2VlbjpMYXlhLlR3ZWVuO1xyXG4gICAgLy/mjInpkq7or6/lr7xcclxuICAgIHN0YXRpYyBDaGVhdEJhbm5lcihidG46ZmFpcnlndWkuR09iamVjdCxjb21wbGV0ZTpGdW5jdGlvbiA9IG51bGwsZ2FwID0gMClcclxuICAgIHtcclxuICAgICAgICB0dGFkLlNob3diYW5uZXIoKTtcclxuICAgICAgICAvLyBpZighR3VhbmdHYW8uY2FuY2hlYXQpXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImlnbm9yZWNoZWF0XCIpO1xyXG4gICAgICAgIC8vICAgICBHdWFuZ0dhby5PcGVuQmFubmVyKDAsKGhlaWdodCkgPT5cclxuICAgICAgICAvLyAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYoaGVpZ2h0ID09IG51bGwpXHJcbiAgICAgICAgLy8gICAgICAgICB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICBidG4ueSA9IExheWEuc3RhZ2UuaGVpZ2h0LWJ0bi5oZWlnaHQgLSAxMDA7XHJcbiAgICAgICAgLy8gICAgIEd1YW5nR2FvLk9wZW5CYW5uZXIoZ2FwLChoZWlnaHQpID0+IFxyXG4gICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZihoZWlnaHQgPT0gbnVsbClcclxuICAgICAgICAvLyAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgZWxzZVxyXG4gICAgICAgIC8vICAgICAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2hlYXRzdGFydFwiLFwiYm90dG9tOjEwMFwiKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICAvLyBidG4ubW91c2VFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdmFyIGVuZD1MYXlhLnN0YWdlLmhlaWdodC1oZWlnaHQtYnRuLmhlaWdodCAtIDgwO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwieTpcIiArIGVuZCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuY2hlYXR0aW1lKjEwMDAsdGhpcywoKT0+XHJcbiAgICAgICAgLy8gICAgICAgICAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyBidG4ubW91c2VFbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5zaG93YmFubmVyKCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIEd1YW5nR2FvLmNsZWFyVHdlZW4oKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgIEd1YW5nR2FvLnR3ZWVuID0gTGF5YS5Ud2Vlbi50byhidG4se3k6ZW5kfSwyMDAsbnVsbCxMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsKCk9PlxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBpZihjb21wbGV0ZSAhPSBudWxsKVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgIC8vICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH0sdHJ1ZSk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJUd2VlbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggR3VhbmdHYW8udHdlZW4gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR3VhbmdHYW8udHdlZW4uY2xlYXIoKTtcclxuICAgICAgICAgICAgR3VhbmdHYW8udHdlZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9yZXdhcmRlZFZpZGVvQWQ7XHJcbiAgICBwcml2YXRlIF9nYW1lQmFubmVyO1xyXG4gICAgcHJpdmF0ZSBfb25WaWRlb0Nsb3NlOiBGdW5jdGlvbjtcclxuICAgIHByaXZhdGUgX29uTG9hZFZpZGVvOiBGdW5jdGlvbjtcclxuXHJcbiAgICBwcml2YXRlIGlzVmlkZW9Mb2FkQ29tID0gZmFsc2U7XHJcbiAgIHB1YmxpYyAgbG9hZFZpZGVvKGNiPzogRnVuY3Rpb24pIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgeyBpZiAoY2IpIGNiKHRydWUpOyByZXR1cm4gfTtcclxuXHJcbiAgICAgICAgdGhpcy5fb25Mb2FkVmlkZW8gPSBjYjtcclxuICAgICAgICBpZiAoIXRoaXMuX3Jld2FyZGVkVmlkZW9BZCkge1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBHdWFuZ0dhby52aWRlbEFkVW5pdElkO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXdhcmRlZFZpZGVvQWQgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZVJld2FyZGVkVmlkZW9BZCh7IGFkVW5pdElkOiBpbmRleCB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBpc2MgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fcmV3YXJkZWRWaWRlb0FkLm9uTG9hZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIltMT0ddIOa/gOWKseinhumikeW5v+WRiuWKoOi9veaIkOWKn1wiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNWaWRlb0xvYWRDb20gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzYykgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgaXNjID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvICYmIHRoaXMuX29uTG9hZFZpZGVvKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkVmlkZW8gPSBudWxsO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5fcmV3YXJkZWRWaWRlb0FkLm9uRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW0xPR10g5r+A5Yqx6KeG6aKR5bm/5ZGK5Yqg6L295aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNWaWRlb0xvYWRDb20gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvICYmIHRoaXMuX29uTG9hZFZpZGVvKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvID0gbnVsbDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jld2FyZGVkVmlkZW9BZC5vbkNsb3NlKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlcyB8fCByZXMuaXNFbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uVmlkZW9DbG9zZSAmJiB0aGlzLl9vblZpZGVvQ2xvc2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25WaWRlb0Nsb3NlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uVmlkZW9DbG9zZSAmJiB0aGlzLl9vblZpZGVvQ2xvc2UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uVmlkZW9DbG9zZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaWRlb0xvYWRDb20pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvICYmIHRoaXMuX29uTG9hZFZpZGVvKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkVmlkZW8gPSBudWxsO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvICYmIHRoaXMuX29uTG9hZFZpZGVvKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93VmlkZW8oY2I/OiBGdW5jdGlvbikge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSB7IGlmIChjYikgY2IodHJ1ZSk7IHJldHVybiB9O1xyXG4gICAgICAgIHRoaXMuX29uVmlkZW9DbG9zZSA9IGNiO1xyXG4gICAgICAgIHRoaXMuX3Jld2FyZGVkVmlkZW9BZC5zaG93KCkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmV3YXJkZWRWaWRlb0FkLmxvYWQoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jld2FyZGVkVmlkZW9BZC5zaG93KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IFN0YWdlID0gTGF5YS5TdGFnZTtcclxuaW1wb3J0IFdlYkdMID0gTGF5YS5XZWJHTDtcclxuaW1wb3J0IEV2ZW50ID0gTGF5YS5FdmVudDtcclxuaW1wb3J0IEh0dHBSZXF1ZXN0ID0gTGF5YS5IdHRwUmVxdWVzdDtcclxuaW1wb3J0IFRleHQgPSBMYXlhLlRleHQ7XHJcbmltcG9ydCBCcm93c2VyID0gTGF5YS5Ccm93c2VyO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4vUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBNYWluQ29uZmlnIH0gZnJvbSBcIi4uL01haW5Db25maWdcIjtcclxuaW1wb3J0IHsgU2hhcmVVdGlsIH0gZnJvbSBcIi4vU2hhcmVVdGlsXCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4vU2RrXCI7XHJcbmltcG9ydCB7IFRpbWVzVGFtcGVyIH0gZnJvbSBcIi4uL1RpbWUvVGltZXNUYW1wZXJcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5cclxuLy8gY29uc3QgUFJPVE9DT0xfVVJMOnN0cmluZyA9IFwiaHR0cHM6Ly9waXBlbGluZWFwaS54d3hnYW1lLmNvbS9cIjtcclxuY29uc3QgUFJPVE9DT0xfVVJMOnN0cmluZyA9IFwiaHR0cHM6Ly9wYXJrb3VycmFjZXRvdXRpYW8yYXBpLnh3eGdhbWUuY29tL1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBST1RPQ09MUyB7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBMb2dpblx0XHRcdFx0PSBcInVzZXIvbG9naW5cIjtcdFx0XHRcdC8vIG5vdCB0b2tlblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2FtZSAgICAgICAgICAgICAgICAgPSBcImdhbWUvc3RhcnRcIjtcclxuICAgIHB1YmxpYyBzdGF0aWMgZW5kICAgICAgICAgICAgICAgICAgPSBcImdhbWUvcGxheVwiO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2lnbiAgICAgICAgICAgICAgPSBcInNpZ24vc2lnblwiO1xyXG5cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgRXF1aXBIZXJvICAgICAgICAgICA9IFwidGhlbWUvZXF1aXBIZXJvXCI7XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIEJ1eUhlcm8gICAgICAgICAgICAgPSBcInRoZW1lL2J1eUhlcm9cIjtcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgRXF1aXBIYXQgICAgICAgICAgID0gXCJ0aGVtZS9lcXVpcEhhdFwiO1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyBCdXlIYXQgICAgICAgICAgICAgPSBcInRoZW1lL2J1eUhhdFwiO1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyBCdXlEYW5jZSAgICAgICAgICAgICA9IFwidGhlbWUvYnV5RGFuY2VcIjtcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgRXF1aXBEYW5jZSAgICAgICAgICAgPSBcInRoZW1lL2VxdWlwRGFuY2VcIjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEJ1eT1cInRoZW1lL2J1eVwiO1xyXG4gICAgcHVibGljIHN0YXRpYyBFcXVpcD1cInRoZW1lL2VxdWlwXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIHNoYXJlICAgICAgICAgICAgICAgID0gXCJmaXNzaW9uL3NoYXJlXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIHZkICAgICAgICAgICAgICAgICAgID0gXCJmaXNzaW9uL3ZkXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJldml2YWwgICAgICAgICAgICAgID0gXCJnYW1lL3Jldml2YWxcIjtcclxuICAgIHB1YmxpYyBzdGF0aWMgZmlzc2lvbiAgICAgICAgICAgPSBcInRoZW1lL2Zpc3Npb25cIjtcclxuICAgIHB1YmxpYyBzdGF0aWMgdGhlbWVmaXNzaW9uICAgICAgICAgID1cInRoZW1lL2Zpc3Npb25cIjtcclxuICAgIHB1YmxpYyBzdGF0aWMgdHJlYXN1cmUgICAgICAgPSBcInRyZWFzdXJlL2NsaWNrXCI7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBDb25maWcgICAgICAgICAgICA9IFwiY29uZmlnL3RhYmxlXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIExvdHRlcnk9XCJsb3R0ZXJ5L2xvdHRlcnlcIjtcclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0QWNoaWV2ZT1cImFjaGlldmVtZW50L2dldFJld2FyZHNcIjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHVzZXJzeW5jID0gXCJ1c2VyL3N5bmNcIjtcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBOZXR3b3JrTWFuYWdlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTpOZXR3b3JrTWFuYWdlcjtcclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKClcclxuICAgIHtcclxuICAgICAgICBpZihOZXR3b3JrTWFuYWdlci5pbnN0YW5jZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBOZXR3b3JrTWFuYWdlci5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOZXR3b3JrTWFuYWdlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgTmV0d29ya01hbmFnZXIuaW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiDnmbvlhaVcclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGxvZ2luICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gICAgcHVibGljIGxvZ2luKHByb2dyZXNzY2I6TGF5YS5IYW5kbGVyLCBjb21wbGV0ZWNiOkxheWEuSGFuZGxlciwgZXJyb3JjYjpMYXlhLkhhbmRsZXIpOiB2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHVzZXJJbmZvciA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQ7XHJcbiAgICAgICAgdmFyIHZlciA9IEdsb2JhbC5nYW1lVmVyc2lvbjtcclxuXHJcbiAgICAgICAgbGV0IGFyZ3M6c3RyaW5nID0gYGNvZGU9JHt1c2VySW5mb3IuQ29kZX0mbmlja25hbWU9JHt1c2VySW5mb3IuTmlja05hbWV9JmF2YXRhcj0ke3VzZXJJbmZvci5BdmF0YXJ9JmdlbmRlcj0ke3VzZXJJbmZvci5HZW5kZXJ9JmNvdW50cnk9JHt1c2VySW5mb3IuQ291bnRyeX0mcHJvdmluY2U9JHt1c2VySW5mb3IuUHJvdmluY2V9JmNpdHk9JHt1c2VySW5mb3IuQ2l0eX0mIGRldmljZT0ke3VzZXJJbmZvci5EZXZpY2V9JCZzaGFyZV9pZD0ke3VzZXJJbmZvci5TaGFyZUlkfSZzY2VuZT0ke3VzZXJJbmZvci5TY2VuZX0mdj0ke3Zlcn1gO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBodHRwUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgIGh0dHBSZXF1ZXN0Lm9uY2UoRXZlbnQuUFJPR1JFU1MsIHRoaXMsIHRoaXMub25IdHRwUmVxdWVzdFByb2dyZXNzLCBbcHJvZ3Jlc3NjYiwgaHR0cFJlcXVlc3RdKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LkNPTVBMRVRFLCB0aGlzLCB0aGlzLm9uTG9naW5SZXF1ZXN0Q29tcGxldGUsIFtjb21wbGV0ZWNiLCBodHRwUmVxdWVzdF0pO1xyXG4gICAgICAgIGh0dHBSZXF1ZXN0Lm9uY2UoRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMub25IdHRwUmVxdWVzdEVycm9yLCBbZXJyb3JjYiwgaHR0cFJlcXVlc3RdKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5zZW5kKFBST1RPQ09MX1VSTCtQUk9UT0NPTFMuTG9naW4gLCBhcmdzLCBcInBvc3RcIiwgXCJ0ZXh0XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25IdHRwUmVxdWVzdFByb2dyZXNzKHByb2dyZXNzY2I6TGF5YS5IYW5kbGVyLGh0dHBSZXF1ZXN0Okh0dHBSZXF1ZXN0KVxyXG4gICAge1xyXG4gICAgICAgIGlmKHByb2dyZXNzY2IpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkh0dHBSZXF1ZXN0UHJvZ3Jlc3M6Li4uXCIpO1xyXG4gICAgICAgICAgICBwcm9ncmVzc2NiLnJ1bigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uTG9naW5SZXF1ZXN0Q29tcGxldGUoY29tcGxldGVjYjpMYXlhLkhhbmRsZXIsaHR0cFJlcXVlc3Q6SHR0cFJlcXVlc3QpXHJcbiAgICB7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIueZu+W9leaVsOaNru+8mlwiLCBodHRwUmVxdWVzdC5kYXRhKTtcclxuICAgICAgICBsZXQgZGF0YTogSlNPTiA9IEpTT04ucGFyc2UoaHR0cFJlcXVlc3QuZGF0YSk7XHJcblx0XHRcdGlmIChkYXRhW1wiY29kZVwiXSAhPSBcIjBcIikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLnmbvlvZXlvILluLjplJnor6/vvIHplJnor6/kv6Hmga/vvJpcIiwgaHR0cFJlcXVlc3QuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIueZu+W9leW8guW4uOmUmeivr++8gemUmeivr+S/oeaBr++8mj0gXCIgKyBkYXRhW1wiY29kZVwiXSxcImh0dHBSZXF1ZXN0LmRhdFwiKTtcclxuXHRcdFx0XHQvL2NvbXBsZXRlY2IucnVuV2l0aChkYXRhKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgUGxheWVyQWNjb3VudC5TZXJ2ZXJUaW1lID0gZGF0YVtcInRcIl07XHJcbiAgICAgICAgICAgIFRpbWVzVGFtcGVyLkluc3RhbmNlLnVwZGF0ZVNlcnZpY2VUaW1lKCBOdW1iZXIoZGF0YVtcInRcIl0pICk7XHJcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi55m75b2V5q2j5byP5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LlNldEFjY291bnREYXRhKGRhdGEsY29tcGxldGVjYik7XHJcbiAgICAgICAgICAgIC8vIFNoYXJlVXRpbC5TaGFyZU1lc3NhZ2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RFcnJvcihlcnJvcmNiOkxheWEuSGFuZGxlcixodHRwUmVxdWVzdDpIdHRwUmVxdWVzdClcclxuICAgIHtcclxuICAgICAgICBpZiAoZXJyb3JjYiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGVycm9yY2IucnVuV2l0aChodHRwUmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBlcnJvci4uIFwiICxcImh0dHBSZXF1ZXN0LmRhdFwiKTtcclxuICAgICAgICBXeEFwaS5TaG93TG9hZGluZyhcIui/nuaOpee9kee7nOWksei0pS4uLlwiKTtcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoODAwMCx0aGlzLCgpPT57V3hBcGkuSGlkZUxvYWRpbmcoKTt9KVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBlcnJvci4uLlwiICsgaHR0cFJlcXVlc3QuZGF0YSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICAgIFxyXG5cclxuICAgIC8qXHJcbiAgICAqIOmAmueUqEh0dHAgUG9zdOWNj+iuruWPkemAgVxyXG4gICAgKiBwcm90b2NvbCBcdFx05a+55bqU4oCcUFJPVE9DT0xT4oCd5a2X5YW45Lit5Y2P6K6u5ZCN56ewXHJcbiAgICAqIGhhc1Rva2VuXHRcdOaYr+WQpuS9v+eUqHRva2Vu77yM55uu5YmN5Y+q5pyJbG9naW7ljY/orq7kuI3pnIDopoF0b2tlbu+8jOWFtuS7lumDvemcgOimgXRva2Vu77yM5omA5Lul5q2k5aSE6Ieq5Yqo57uE5ZCIXHJcbiAgICAqIHBhcmFtXHRcdFx05Y+C5pWw5YiX6KGo77yMa2V55piv5a2X5q615ZCN77yMdmFs5piv5YC877yM5YC86ZyA6KaB5YWI6L2sc3RyaW5nXHJcbiAgICAqIGNvbXBsZXRlY2JcdOWNj+iuruWPkemAgeaIkOWKn+Wbnuiwg+WHveaVsFxyXG4gICAgKiBlcnJvcmNiXHRcdOWNj+iuruWPkemAgeWksei0peWbnuiwg+WHveaVsFxyXG4gICAgKiByZXR1cm5cdFx06L+U5Zue5YC85Li6dm9pZFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBIdHRwUG9zdFJlcXVlc3QocHJvdG9jb2w6c3RyaW5nLCBwYXJhbTpBcnJheTx7W2tleTpzdHJpbmddOnN0cmluZ30+LCBjb21wbGV0ZWNiOkxheWEuSGFuZGxlciwgZXJyb3JjYjpMYXlhLkhhbmRsZXIsIGhhc1Rva2VuOmJvb2xlYW4gPSB0cnVlKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIGxldCBhcmdzOnN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgbGV0IHVybDpzdHJpbmcgPSBQUk9UT0NPTF9VUkwgKyBwcm90b2NvbDtcclxuICAgICAgICAvLyBjaGVjaGsgYWRkIHRva2VuXHJcbiAgICAgICAgdmFyIGFjY291bnQgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50O1xyXG4gICAgICAgIHZhciBhY2NvdW50ZGF0YSA9IGFjY291bnQuQ3VyQWNjb3VudERhdGE7XHJcbiAgICAgICAgaWYgKGhhc1Rva2VuID09IHRydWUpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXJncyA9IGB0b2tlbj0ke2FjY291bnRkYXRhLm1fdG9rZW59JmA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBXeEFwaS5TaG93TG9hZGluZyhcIui/nuaOpee9kee7nOS4rS4uLlwiKTtcclxuICAgICAgICBpZiAocHJvdG9jb2wgPT0gUFJPVE9DT0xTLmdhbWUgfHwgcHJvdG9jb2wgPT0gUFJPVE9DT0xTLmVuZCB8fCBwcm90b2NvbCA9PSBQUk9UT0NPTFMuZmlzc2lvbiB8fCBwcm90b2NvbCA9PSBQUk9UT0NPTFMudmR8fFxyXG4gICAgICAgICAgICBwcm90b2NvbD09UFJPVE9DT0xTLnRoZW1lZmlzc2lvbnx8cHJvdG9jb2w9PVBST1RPQ09MUy5Mb3R0ZXJ5IHx8IHByb3RvY29sID09IFBST1RPQ09MUy51c2Vyc3luYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBzdHIgID0gXCJhYmNkZWZnaGlqa2ltbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtcclxuICAgICAgICAgICAgbGV0IGNvZGUgPSBcIntcIjtcclxuICAgICAgICAgICAgbGV0IG1hc2sgPSBcIlwiO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG1hc2sgKz0gc3RyW01hdGguZmxvb3IoIE1hdGgucmFuZG9tKCkgKiAxMDApICUgc3RyLmxlbmd0aF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbS5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHBhcmFtW2ldKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2RlICs9IGBcXFwiJHtrZXl9XFxcIjpcXFwiJHtwYXJhbVtpXVtrZXldfVxcXCJgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGkgPCBwYXJhbS5sZW5ndGggLSAxKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2RlICs9IFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZGUgKz0gXCJ9XCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXJncyArPSBcIl9yPVwiICsgbWFzayArIHRoaXMuYmFzZTY0RW5jb2RlKGNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW0ubGVuZ3RoOyBpKyspIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBwYXJhbVtpXSkgXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsOnN0cmluZyA9IHBhcmFtW2ldW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gYCR7a2V5fT0ke3ZhbH1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHBhcmFtLmxlbmd0aCAtIDEpIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzICs9IFwiJlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBodHRwUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgIGh0dHBSZXF1ZXN0Lm9uY2UoRXZlbnQuQ09NUExFVEUsIHRoaXMsIHRoaXMub25IdHRwUmVxdWVzdENvbXBsZXRlLCBbY29tcGxldGVjYiwgZXJyb3JjYiwgaHR0cFJlcXVlc3RdKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RFcnJvciwgW2Vycm9yY2IsIGh0dHBSZXF1ZXN0XSk7XHJcbiAgICAgICAgaHR0cFJlcXVlc3Quc2VuZCh1cmwsIGFyZ3MsIFwicG9zdFwiLCBcInRleHRcIik7XHJcbiAgICB9XHJcbiAgICAgICAgXHJcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RDb21wbGV0ZShzdWNjZWVkY2I6TGF5YS5IYW5kbGVyLCBmYWlsdXJlY2I6TGF5YS5IYW5kbGVyLCBodHRwUmVxdWVzdDpIdHRwUmVxdWVzdCk6dm9pZCBcclxuICAgIHtcclxuICAgICAgICBXeEFwaS5IaWRlTG9hZGluZygpO1xyXG4gICAgICAgIGxldCBkYXRhOiBKU09OID0gSlNPTi5wYXJzZShodHRwUmVxdWVzdC5kYXRhKTtcclxuICAgICAgICBpZiAoZGF0YVtcImNvZGVcIl0gPT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuU2V0QWNjb3VudERhdGEoZGF0YSxudWxsKTtcclxuICAgICAgICAgICAgaWYgKHN1Y2NlZWRjYiAhPSBudWxsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdWNjZWVkY2IucnVuV2l0aChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZmFpbHVyZWNiICE9IG51bGwpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmYWlsdXJlY2IucnVuV2l0aChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciEgSHR0cCByZXF1ZXN0IGNvbXBsZXRlIGVycm9yLCBjb2RlOiBcIiArIGRhdGFbXCJjb2RlXCJdICsgXCIgbWVzc2FnZTogXCIgKyBkYXRhW1wibWVzc2FnZVwiXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmFzZTY0RW5jb2RlIChzdHIpOnN0cmluZyB7XHJcbiAgICAgICAgdmFyIGMxLCBjMiwgYzM7XHJcbiAgICAgICAgdmFyIGJhc2U2NEVuY29kZUNoYXJzID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7XHJcbiAgICAgICAgdmFyIGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoLCBzdHJpbmcgPSAnJztcclxuICAgICAgICB3aGlsZSAoaSA8IGxlbikge1xyXG4gICAgICAgICAgYzEgPSBzdHIuY2hhckNvZGVBdChpKyspICYgMHhmZjtcclxuICAgICAgICAgIGlmIChpID09IGxlbikge1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMxID4+IDIpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KChjMSAmIDB4MykgPDwgNCk7XHJcbiAgICAgICAgICAgIHN0cmluZyArPSBcIj09XCI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgICAgaWYgKGkgPT0gbGVuKSB7XHJcbiAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoYzEgPj4gMik7XHJcbiAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoKChjMSAmIDB4MykgPDwgNCkgfCAoKGMyICYgMHhGMCkgPj4gNCkpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KChjMiAmIDB4RikgPDwgMik7XHJcbiAgICAgICAgICAgIHN0cmluZyArPSBcIj1cIjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjMyA9IHN0ci5jaGFyQ29kZUF0KGkrKyk7XHJcbiAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMxID4+IDIpO1xyXG4gICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoKGMxICYgMHgzKSA8PCA0KSB8ICgoYzIgJiAweEYwKSA+PiA0KSk7XHJcbiAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KCgoYzIgJiAweEYpIDw8IDIpIHwgKChjMyAmIDB4QzApID4+IDYpKTtcclxuICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoYzMgJiAweDNGKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyaW5nO1xyXG4gICAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgUGxhdGZyb21UeXBlXHJcbiB7XHJcbiAgICAvKipcclxuICAgICAqIOeUteiEkVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGM6c3RyaW5nID0gXCJwY1wiO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlvq7kv6HlsI/muLjmiI9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHd4OnN0cmluZyA9IFwid3hcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIHFx5bCP5ri45oiPXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBxcTpzdHJpbmcgPSBcInFxXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmipbpn7NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHR0OnN0cmluZyA9IFwidHRcIjtcclxufSIsImltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uL1dYU0RLL1Nka1wiO1xyXG5pbXBvcnQge0RpY3Rpb25hcnl9IGZyb20gXCIuLi91dGlscy9EaWN0aW9uYXJ5XCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHsgTmV0d29ya01hbmFnZXIsIFBST1RPQ09MUyB9IGZyb20gXCIuL05ldHdvcmtNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7VXNlckluZm9FdmVudH0gZnJvbSBcIi4uL0RhdGEvVXNlckluZm9FdmVudFwiO1xyXG5cclxuXHJcbmV4cG9ydCBlbnVtIHJlcXVpcmV0eXBlIHtcclxuICAgIOezu+e7n+i1oOmAgSA9IDEsIOmHkeW4gei0reS5sCA9IDIsIOingueci+inhumikSA9IDMsIOWIhuS6qyA9IDQsIOetvuWIsCA9IDUsIOa0u+WKqCA9IDYsIOmAmui/h+WFs+WNoSA9IDcsIOe0r+iuoeeZu+mZhiA9IDgsIOmCgOivt+S6uuaVsOi+vuWIsCA9IDksIOegluefs+i0reS5sCA9IDEwXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEFjY291bnRDb25maWcge1xyXG4gICAgY3JvcCx0aGluZ3MsIGxhbmQsIGdsb2JhbCwgZW50aXR5LCBzaWduLCByZXdhcmRzLCBhY2hpZXZlbWVudCwgaW52aXRlLCBtaXNzaW9uLCB0cmVhc3VyZV9jbGljaywgdGhlbWUsIGxvdHRlcnlcclxufVxyXG5cclxuZXhwb3J0IGVudW0gQWNjb3VudFVzZXIge1xyXG4gICAgbW9uZXksIGRpYW1vbmQsIHVzZXJfaWQsIGdhbWVfdGltZXMsIGdldF90aGVtZXMsIHZpZGVvX3RpbWVzLCBlcXVpcF90aGVtZXMsIGxhc3RfYWN0aW9uX3RpbWUsIGxhc3RfZmF2b3JpdGVfdGltZSwgcHJvZ3Jlc3NfdGhlbWVzLCByZXZpdmFsLCBzdGFnZSx2bW9uZXlcclxufVxyXG5cclxuZXhwb3J0IGVudW0gaGVyb0F0dHIge1xyXG4gICAgaWQsIG5hbWUsIHF1YWxpdHksIGljb24sIHByZWZhYiwgcmVxdWlyZV9udW0sIHJlcXVpcmVfdHlwZVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBzaWduZGF0YSB7XHJcbiAgICBzaWduX2RheXMsIHNpZ25fdGltZVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBlbnRpdHkge1xyXG4gICAgaWQsIG5hbWUsIGVudGl0eV9pZCwgaWNvblxyXG59XHJcblxyXG5leHBvcnQgZW51bSBza2luYXR0ciB7XHJcbiAgICBlZmZlY3RWYWx1ZV8xLFxyXG4gICAgZWZmZWN0VmFsdWVfMixcclxuICAgIGVmZmVjdFZhbHVlXzMsXHJcbiAgICBlZmZlY3RWYWx1ZV80XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBY2NvdW50RGF0YSB7XHJcbiAgICBjb25zdHJ1Y3RvcihfdG9rZW46IHN0cmluZywgX2NvbmZpZzogT2JqZWN0LCBfYXBwU2V0dGluZzogT2JqZWN0LCBfdXNlcjogT2JqZWN0LCBfdXNlcmJhc2U6IE9iamVjdCwgX3VzZUludml0ZTogT2JqZWN0ID0gbnVsbCwgX3VzZXJfc3RhZ2U6IE9iamVjdCA9IG51bGwsIF91c2VyX3NpZ24sIF91c2VyX2FjaGlldmVtZW50LCBfbG90dGVyeSxfdXNlX2xhbmRfdGFzayxfdXNlcl92aWRlbykge1xyXG4gICAgICAgIHRoaXMubV90b2tlbiA9IF90b2tlbjtcclxuICAgICAgICB0aGlzLm1fYXBwX3NldHRpbmcgPSBfYXBwU2V0dGluZztcclxuICAgICAgICB0aGlzLm1fdXNlciA9IF91c2VyO1xyXG4gICAgICAgIHRoaXMubV91c2VyX2Jhc2UgPSBfdXNlcmJhc2U7XHJcbiAgICAgICAgdGhpcy5tX3NpZ24gPSBfdXNlcl9zaWduO1xyXG4gICAgICAgIHRoaXMubV90YXNrID0gX3VzZXJfYWNoaWV2ZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5sb3R0ZXJ5ID0gX2xvdHRlcnk7XHJcbiAgICAgICAgdGhpcy5tX3VzZV9sYW5kX3Rhc2sgPSBfdXNlX2xhbmRfdGFzaztcclxuICAgICAgICB0aGlzLm1fdXNlcl92aWRlbyA9IF91c2VyX3ZpZGVvO1xyXG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5tX3VzZXJbXCJ1c2VyX2lkXCJdO1xyXG4gICAgICAgIHRoaXMub3BlbmlkID0gdGhpcy5tX3VzZXJfYmFzZVtcIm9wZW5pZFwiXTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInVzZXJfaWQ6XCIgKyB0aGlzLnVzZXJJZCk7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIm9wZW5faWQ6XCIrdGhpcy5vcGVuaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtX3Rva2VuOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgbV9jb25maWdzOiBPYmplY3Q7XHJcbiAgICBwdWJsaWMgbV9hcHBfc2V0dGluZzogT2JqZWN0O1xyXG4gICAgcHVibGljIG1fdXNlcjogT2JqZWN0O1xyXG4gICAgcHVibGljIG1fdXNlcl9iYXNlOiBPYmplY3Q7XHJcbiAgICBwdWJsaWMgbV9zaWduOiBPYmplY3Q7XHJcbiAgICBwdWJsaWMgbV90YXNrOiBPYmplY3Q7XHJcbiAgICBwdWJsaWMgbV91c2VfbGFuZF90YXNrOmFueTtcclxuICAgIHB1YmxpYyBtX3VzZXJfdmlkZW86T2JqZWN0O1xyXG4gICAgcHVibGljIG9wZW5pZDogc3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgdXNlcklkOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIGxvdHRlcnk6IGFueTtcclxuICAgIHB1YmxpYyByb2FkY29uZmlnOiB7IFtrZXk6IG51bWJlcl06IGFueSB9ID0ge307XHJcbiAgICBwdWJsaWMgbV9SZXdhcmREaWM6IE9iamVjdCA9IHt9O1xyXG4gICAgcHVibGljIG1fRW50aXR5RGljOiB7IFtrZXk6IG51bWJlcl06IGFueSB9ID0ge307XHJcbiAgICBwdWJsaWMgbV9BY2hpZXZlbWVudERpYzogT2JqZWN0ID0ge307XHJcbiAgICAvLyBwdWJsaWMgbV9za2luRGljOkRpY3Rpb25hcnk8bnVtYmVyLFNraW5EYXRhPiA9IG5ldyBEaWN0aW9uYXJ5KCk7XHJcblxyXG4gICAgLy/ojrflj5bnjqnlrrbokL3lhaXnqbrkuK3mrbvkuqHot53nprtcclxuICAgIHB1YmxpYyBnZXQgRGllRGlzdGFuY2UoKTpudW1iZXJ7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJEaWVEaXN0YW5jZVwiXSk7XHJcbiAgICB9XHJcbiAgICAvL+iOt+WPluW8gOWxgOeguOibi+WHoOeOh1xyXG4gICAgcHVibGljIGdldCBIaXRFZ2coKTpudW1iZXJ7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJIaXRFZ2dcIl0pO1xyXG4gICAgfVxyXG4gICAgLy/ojrflj5bnu5PnrpflkI7noLjom4vlh7rnjrDlh6DnjodcclxuICAgIHB1YmxpYyBnZXQgRW5kQ2hlYXQoKTpudW1iZXJ7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJFbmRDaGVhdFwiXSk7XHJcbiAgICB9XHJcbiAgICAvL+iOt+WPluivr+inpuWlluWKsemHkeW4geaVsFxyXG4gICAgcHVibGljIGdldCBDaGVhdFJld2FyZCgpOm51bWJlcntcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcIkNoZWF0UmV3YXJkXCJdKTtcclxuICAgIH1cclxuICAgIC8v55m95ZCN5Y2V55So5oi3XHJcbiAgICBwdWJsaWMgZ2V0IFdoaXRlVXNlcigpOmJvb2xlYW57XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcIldoaXRlVXNlclwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuXHJcbiAgICAvL+etvuWIsOWKn+iDveaYr+WQpuW8gOWQr1xyXG4gICAgcHVibGljIGdldCBTdHJhdGVneVN3aXRjaCgpOmJvb2xlYW57XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcIlN0cmF0ZWd5U3dpdGNoXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8v562+5Yiw5Yqf6IO95piv5ZCm5byA5ZCvXHJcbiAgICBwdWJsaWMgZ2V0IFNob3dTaWduKCk6Ym9vbGVhbntcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiU2hvd1NpZ25cIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICAvL+iHquWKqOWLvumAiVxyXG4gICAgcHVibGljIGdldCBDaG9vc2UoKTpib29sZWFue1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJjaG9vc2VcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICAvL+WPkei1t+aMkeaImOaMiemSruW8gOWFs1xyXG4gICAgcHVibGljIGdldCBTaG93QmF0dGxlQnRuKCk6Ym9vbGVhbntcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiU2hvd0JhdHRsZUJ0blwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGxvdHRlcnl0aW1lKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLmxvdHRlcnlbXCJkYXlfdmlkZW9fdGltZXNcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc2hhcmUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYXJlXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc2hhcmVjb250ZW50KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYXJlY29udGVudFwiXTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgU2hhcmVJbWFnZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJTaGFyZUltYWdlXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjaGVhdHRpbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJjaGVhdHRpbWVcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiYW5uZXIoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lclwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgdmlkZW8oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInZpZGVvXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBCdG5DYW5Nb3ZlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJCdG5DYW5Nb3ZlXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjaGVja3NjZW5jZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiY2hlY2tzY2VuY2VcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGJhbm5lcl9kaXMoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lcl9kaXNcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiYW5uZXJNb3ZlVGltZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiYmFubmVyTW92ZVRpbWVcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjcmVhdGVCYW5uZXJUaW1lcygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiY3JlYXRlQmFubmVyVGltZXNcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiYW5uZXJNb3ZlUHJvcCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiYmFubmVyTW92ZVByb3BcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBpc1NoYXJlVGhlblZpZGVvKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJpc1NoYXJlVGhlblZpZGVvXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBpc1Nob3dIdWlUdWkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImlzU2hvd0h1aVR1aVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc3RhcnRfc3ByaW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJzdGFydF9zcHJpbnRcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgSXNWaWRlb01vZGVsKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJJc1ZpZGVvTW9kZWxcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHZpZGVvTW9kZWxOdW0oKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcInZpZGVvTW9kZWxOdW1cIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBWaWRlb01vZGVsVGl0bGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiVmlkZW9Nb2RlbFRpdGxlXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBmYWlsY291bnQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImZhaWxjb3VudFwiXSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHNwbWluc3BlZWQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcInNwbWluc3BlZWRcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiZ20oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImJnbVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNhbWVyYWhpZ2h0KCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJjYW1lcmFoaWdodFwiXSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGN0bmZpbGVuYW1lKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImN0bmZpbGVuYW1lXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjaGVhdCgpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiY2hlYXRcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHNoYWtlc3RhZ2UoKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYWtlc3RhZ2VcIl0gJiYgdGhpcy5tX2FwcF9zZXR0aW5nW1wic2hha2VzdGFnZVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc3RhZ2Vjb25maWdjZG4oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInN0YWdlY29uZmlnY2RuXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBwbGF5ZXJzcGVlZCgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wicGxheWVyc3BlZWRcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB2aWRlbEFkVW5pdElkKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInZpZGVsQWRVbml0SWRcIl07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGJhbm5lckFkVW5pdElkKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lckFkVW5pdElkXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB0cmkoKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInRyaVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgcmVjb21tZW5kKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJyZWNvbW1lbmRcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHJlY29tbWVuZGZsZygpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJyZWNvbW1lbmRmbGdcIl07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGVnZygpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiZWdnXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBlZ2dyYXRlKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJlZ2dyYXRlXCJdKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgVXNlSWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldENvbmZpZyhfdHlwZTogQWNjb3VudENvbmZpZyk6IGFueSB7XHJcbiAgICAgICAgdmFyIHR5cGUgPSBBY2NvdW50Q29uZmlnW190eXBlXTtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2NvbmZpZ3NbdHlwZV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFVzZXIoX3R5cGU6IEFjY291bnRVc2VyKSB7XHJcbiAgICAgICAgdmFyIHR5cGUgPSBBY2NvdW50VXNlcltfdHlwZV07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV91c2VyW3R5cGVdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBHZXRWaWRlb1RvdGFsKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV91c2VyX3ZpZGVvW1widG90YWxcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTaWduKF9kYXRhdHlwZTogc2lnbmRhdGEpIHtcclxuICAgICAgICB2YXIgdHlwZSA9IHNpZ25kYXRhW19kYXRhdHlwZV07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9zaWduW3R5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRSZXdhcmRDb25maWcoX3Jld2FyZGlkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgICAgIHZhciByZXdhcmQgPSB0aGlzLm1fUmV3YXJkRGljW19yZXdhcmRpZF07XHJcbiAgICAgICAgcmV0dXJuIHJld2FyZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RW50aXR5KF9pZDogc3RyaW5nLCBhdHRyOiBlbnRpdHkpIHtcclxuICAgICAgICBpZighdGhpcy5tX0VudGl0eURpY1tfaWRdKXJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fRW50aXR5RGljW19pZF1bZW50aXR5W2F0dHJdXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEdldFJld2FyZERpYygpIHtcclxuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5HZXRDb25maWcoQWNjb3VudENvbmZpZy5yZXdhcmRzKTtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29uZmlnKSB7XHJcbiAgICAgICAgICAgIHRoaXMubV9SZXdhcmREaWNbY29uZmlnW2tleV0uaWRdID0gY29uZmlnW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRFbnRpdHlEaWMoKSB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcuZW50aXR5KTtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29uZmlnKSB7XHJcbiAgICAgICAgICAgIHRoaXMubV9FbnRpdHlEaWNbY29uZmlnW2tleV0uZW50aXR5X2lkXSA9IGNvbmZpZ1trZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBHZXRUaGVtZUJ5SWQoX2lkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZXRDb25maWcoQWNjb3VudENvbmZpZy50aGVtZSk7XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGEubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZGF0YVtpbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pZCA9PSBfaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2tpbkF0dHIoX2lkOiBudW1iZXIpICB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcudGhlbWUpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZmlnLmxlbmd0aDsgaSsrKSAge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnW2ldLmlkID09IF9pZCkgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFjaGlldmVtZW50RGF0YSgpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcuYWNoaWV2ZW1lbnQpO1xyXG4gICAgICAgIHZhciBkaWMgPSB7fTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIga2V5MSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciB0eXBlMSA9IGRhdGFba2V5MV0udHlwZTtcclxuICAgICAgICAgICAgLy92YXIgb2JqID0ge307XHJcblxyXG4gICAgICAgICAgICBpZiAoZGljW3R5cGUxXSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkyIGluIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZhciB0eXBlMiA9IGRhdGFba2V5Ml0udHlwZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZTEgPT0gdHlwZTIpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRhdGFba2V5Ml0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkaWNbdHlwZTFdID0gYXJyYXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubV9BY2hpZXZlbWVudERpYyA9IGRpYztcclxuICAgIH1cclxuXHJcbiAgICBIYXNUaGVtZShfaWQ6bnVtYmVyKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGhhcyA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBnZXR0aGVtZXMgPSB0aGlzLkdldFVzZXIoQWNjb3VudFVzZXIuZ2V0X3RoZW1lcyk7XHJcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGdldHRoZW1lcy5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoZ2V0dGhlbWVzW2ldID09IF9pZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaGFzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGFzO1xyXG4gICAgfVxyXG5cclxuICAgIEdldFNraW5EaWMoX2NvbmZpZzphbnkpXHJcbiAgICB7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEhlcm9Qcm9ncmVzcyhfaWQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMubV91c2VyW1wicHJvZ3Jlc3NfaGVyb2VzXCJdO1xyXG4gICAgICAgIHZhciBwcm9ncmVzcyA9IGNvbmZpZ1tfaWRdID8gY29uZmlnW19pZF0gOiAwO1xyXG4gICAgICAgIHJldHVybiBwcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0SGF0UHJvZ3Jlc3MoX2lkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm1fdXNlcltcInByb2dyZXNzX2hhdHNcIl07XHJcbiAgICAgICAgdmFyIHByb2dyZXNzID0gY29uZmlnW19pZF0gPyBjb25maWdbX2lkXSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRDYlByb2dyZXNzKF9pZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5tX3VzZXJbXCJwcm9ncmVzc19kYW5jZXNcIl07XHJcbiAgICAgICAgdmFyIHByb2dyZXNzID0gY29uZmlnW19pZF0gPyBjb25maWdbX2lkXSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBIYXNNb3RvcihfaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZXRVc2VyKEFjY291bnRVc2VyLmdldF90aGVtZXMpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgaGQgPSBkYXRhW2ldO1xyXG4gICAgICAgICAgICBpZiAoX2lkID09IGhkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvL+iOt+WPluearuiCpOeahOi/m+W6plxyXG4gICAgcHVibGljIEdldE1vdG9yUHJvZ3Jlc3MoX2lkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm1fdXNlcltcInByb2dyZXNzX3RoZW1lc1wiXTtcclxuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBjb25maWdbX2lkXSA/IGNvbmZpZ1tfaWRdIDogMDtcclxuICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNldmVyQ29uZmlnKF9jb25maWc6IGFueSkge1xyXG4gICAgICAgIHRoaXMubV9jb25maWdzID0gX2NvbmZpZztcclxuICAgICAgICB0aGlzLkdldFNraW5EaWModGhpcy5tX2NvbmZpZ3MpO1xyXG4gICAgICAgIHRoaXMuR2V0UmV3YXJkRGljKCk7XHJcbiAgICAgICAgdGhpcy5HZXRFbnRpdHlEaWMoKTtcclxuICAgICAgICAvLyB0aGlzLkdldEFjaGlldmVtZW50RGF0YSgpO1xyXG4gICAgICAgIGxldCBfZ2xvYmU9X2NvbmZpZ1tcImdsb2JhbFwiXTtcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgX2dsb2JlLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gX2dsb2JlW2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQua2V5ID09IFwidGlsaXJlY1wiKSB7XHJcbiAgICAgICAgICAgICAgICBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LnRpbGlyZWM9IE51bWJlcihlbGVtZW50LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBVcGRhdGVTa2luRGljKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLkdldFNraW5EaWModGhpcy5tX2NvbmZpZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRHbG9iZShfa2V5OnN0cmluZylcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2xvYmUgPSB0aGlzLkdldENvbmZpZyhBY2NvdW50Q29uZmlnLmdsb2JhbCk7XHJcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gZ2xvYmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgb2JqID0gZ2xvYmVba2V5XTtcclxuICAgICAgICAgICAgdmFyIGtrayA9IG9ialtcImtleVwiXTtcclxuICAgICAgICAgICAgaWYoa2trID09IF9rZXkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9ialtcInZhbHVlXCJdO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUGxheWVyQWNjb3VudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihfY29kZTogc3RyaW5nLCBfbmlja25hbWU6IHN0cmluZywgX2F2YXRhcjogc3RyaW5nLCBfZ2VuZGVyOiBudW1iZXIsIF9jb3VudHJ5OiBzdHJpbmcsIF9wcm92aW5jZTogc3RyaW5nLCBfY2l0eTogc3RyaW5nLCBfZGV2aWNlOiBzdHJpbmcsIF9zaGFyZWlkOiBzdHJpbmcsIF9zY2VuY2U6IHN0cmluZywgX3Zlcjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhbFRpbWUgPSBMYXlhLnRpbWVyLmN1cnJUaW1lcjtcclxuXHJcbiAgICAgICAgdGhpcy5Db2RlID0gX2NvZGU7XHJcbiAgICAgICAgdGhpcy5OaWNrTmFtZSA9IF9uaWNrbmFtZTtcclxuICAgICAgICB0aGlzLkF2YXRhciA9IF9hdmF0YXI7XHJcbiAgICAgICAgdGhpcy5HZW5kZXIgPSBfZ2VuZGVyO1xyXG4gICAgICAgIHRoaXMuQ291bnRyeSA9IF9jb3VudHJ5O1xyXG4gICAgICAgIHRoaXMuUHJvdmluY2UgPSBfcHJvdmluY2U7XHJcbiAgICAgICAgdGhpcy5DaXR5ID0gX2NpdHk7XHJcbiAgICAgICAgdGhpcy5EZXZpY2UgPSBfZGV2aWNlO1xyXG4gICAgICAgIHRoaXMuU2hhcmVJZCA9IF9zaGFyZWlkO1xyXG4gICAgICAgIHRoaXMuU2NlbmUgPSBfc2NlbmNlO1xyXG4gICAgICAgIHRoaXMudmVyID0gX3ZlcjtcclxuICAgICAgICB0aGlzLklzVGVzdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBQbGF5ZXJBY2NvdW50Lmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogUGxheWVyQWNjb3VudDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBDdXJyZW50QWNjb3VudCgpIHtcclxuICAgICAgICBpZiAoUGxheWVyQWNjb3VudC5pbnN0YW5jZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi55Sf5oiQ5pys5Zyw5rWL6K+V6LSm5Y+3Li4uXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUGxheWVyQWNjb3VudC5UZXN0QWNjb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFBsYXllckFjY291bnQuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBUZXN0QWNjb3VudCgpIHtcclxuICAgICAgICB2YXIgY29kZSA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJsb2NhbGNvZGVcIik7XHJcbiAgICAgICAgaWYoIWNvZGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIHZhciByYW5kb20gPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KDEwMDAwLDk5OTk5KS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjb2RlID0gXCJ4al9cIiArIHRpbWUgKyByYW5kb207XHJcbiAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJsb2NhbGNvZGVcIixjb2RlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2codGltZSxyYW5kb20pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaWsOeUqOaIt1wiLGNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiAgeeUqOaIt1wiLGNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY3VyYWNjb3VudCA9IG5ldyBQbGF5ZXJBY2NvdW50KGNvZGUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGN1cmFjY291bnQuSXNUZXN0ID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gY3VyYWNjb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ29kZTogc3RyaW5nO1xyXG4gICAgcHVibGljIE5pY2tOYW1lOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQXZhdGFyOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgR2VuZGVyOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgQ291bnRyeTogc3RyaW5nO1xyXG4gICAgcHVibGljIFByb3ZpbmNlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ2l0eTogc3RyaW5nO1xyXG4gICAgcHVibGljIERldmljZTogc3RyaW5nO1xyXG4gICAgcHVibGljIFNoYXJlSWQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBTY2VuZTogc3RyaW5nO1xyXG4gICAgcHVibGljIHZlcjogc3RyaW5nO1xyXG4gICAgcHVibGljIHN0YXRpYyBTZXJ2ZXJUaW1lOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGxvY2FsVGltZTtcclxuICAgIHN0YXRpYyBsb2NhbGNvZmlna2V5ID0gXCJtY29uZmlnXCI7XHJcblxyXG4gICAgcHVibGljIElzVGVzdCA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBDdXJBY2NvdW50RGF0YTogQWNjb3VudERhdGE7XHJcblxyXG4gICAgcHVibGljIHRpbGlyZWM6bnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBub3dDb25maWc6YW55O1xyXG5cclxuICAgIHB1YmxpYyBTZXRBY2NvdW50RGF0YShkYXRhLGNvbXBsZXRlY2I6TGF5YS5IYW5kbGVyKSB7XHJcbiAgICAgICAgdmFyIHRva2VuID0gZGF0YVtcInRva2VuXCJdO1xyXG4gICAgICAgIHZhciBjb25maWdzID0gZGF0YVtcImNvbmZpZ3NcIl07XHJcbiAgICAgICAgdmFyIGFwcF9zZXR0aW5nID0gZGF0YVtcImFwcF9zZXR0aW5nXCJdO1xyXG4gICAgICAgIHZhciB1c2VyID0gZGF0YVtcInVzZXJcIl07XHJcbiAgICAgICAgdmFyIHVzZXJfYmFzZSA9IGRhdGFbXCJ1c2VyX2Jhc2VcIl07XHJcbiAgICAgICAgdmFyIHVzZXJfc2lnbiA9IGRhdGFbXCJ1c2VyX3NpZ25cIl07XHJcbiAgICAgICAgdmFyIHVzZXJfYWNoaWV2ZW1lbnQgPSBkYXRhW1widXNlcl9hY2hpZXZlbWVudFwiXTtcclxuICAgICAgICB2YXIgdXNlcl9sb3R0ZXJ5ID0gZGF0YVtcInVzZXJfbG90dGVyeVwiXTtcclxuICAgICAgICB2YXIgdXNlcl9sYW5kX3Rhc2sgPSBkYXRhW1widXNlcl9sYW5kX3Rhc2tcIl07XHJcbiAgICAgICAgdmFyIHVzZXJfdmlkZW8gPSBkYXRhW1widXNlcl92aWRlb1wiXTtcclxuICAgICAgICBpZiAodGhpcy5DdXJBY2NvdW50RGF0YSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5byA5aeL6I635Y+WY29uZmln5pWw5o2uXCIpO1xyXG4gICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhID0gbmV3IEFjY291bnREYXRhKHRva2VuLCBjb25maWdzLCBhcHBfc2V0dGluZywgdXNlciwgdXNlcl9iYXNlLCBudWxsLCBudWxsLCB1c2VyX3NpZ24sIHVzZXJfYWNoaWV2ZW1lbnQsIHVzZXJfbG90dGVyeSx1c2VyX2xhbmRfdGFzayx1c2VyX3ZpZGVvKTtcclxuICAgICAgICAgICAgdGhpcy5DaGVja0xvY2FsQ29uZmlnKGRhdGEudGFibGVfdmVyc2lvbiwgKF9jb25maWcpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEuR2V0U2V2ZXJDb25maWcoX2NvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vd0NvbmZpZyA9IF9jb25maWc7XHJcbiAgICAgICAgICAgICAgICBpZihjb21wbGV0ZWNiICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVjYi5ydW5XaXRoKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChjb25maWdzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fY29uZmlncyA9IGNvbmZpZ3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFwcF9zZXR0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fYXBwX3NldHRpbmcgPSBhcHBfc2V0dGluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3VzZXIgPSB1c2VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh1c2VyX2Jhc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV91c2VyX2Jhc2UgPSB1c2VyX2Jhc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHVzZXJfc2lnbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3NpZ24gPSB1c2VyX3NpZ247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHVzZXJfYWNoaWV2ZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV90YXNrID0gdXNlcl9hY2hpZXZlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodXNlcl9sb3R0ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLmxvdHRlcnkgPSB1c2VyX2xvdHRlcnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodXNlcl9sYW5kX3Rhc2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV91c2VfbGFuZF90YXNrID0gdXNlcl9sYW5kX3Rhc2s7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodXNlcl92aWRlbylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3VzZXJfdmlkZW8gPSB1c2VyX3ZpZGVvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFVzZXJJbmZvRXZlbnQudXBkYXRlUGxheWVySW5mbyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgQ2hlY2tMb2NhbENvbmZpZyhfdmVyOiBzdHJpbmcsIGNiOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBjdXJjb25maWcgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRKU09OKFBsYXllckFjY291bnQubG9jYWxjb2ZpZ2tleSk7XHJcbiAgICAgICAgaWYgKGN1cmNvbmZpZykge1xyXG4gICAgICAgICAgICAvL0xheWEuTG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oUGxheWVyQWNjb3VudC5sb2NhbGNvZmlna2V5KTtcclxuICAgICAgICAgICAgaWYgKGN1cmNvbmZpZy52ZXIgPT0gX3Zlcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZXZlcumFjee9ruaYr+acgOaWsOeahC4uLlwiLCBfdmVyKTtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgY2IoY3VyY29uZmlnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyLkluc3RhbmNlLkh0dHBQb3N0UmVxdWVzdChQUk9UT0NPTFMuQ29uZmlnLCBudWxsLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb25maWdzLnZlciA9IF92ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihQbGF5ZXJBY2NvdW50LmxvY2FsY29maWdrZXksIGRhdGEuY29uZmlncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZXZlcumFjee9ruabtOaWsOWujOaIkC4uLlwiLCBfdmVyKTtcclxuICAgICAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcImNvbmZpZ+aOpeWPo+iOt+WPluaIkOWKn1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBjYihkYXRhLmNvbmZpZ3MpO1xyXG4gICAgICAgICAgICAgICAgfSksIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIumFjee9ruiOt+WPluWksei0pVwiICsgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCJjb25maWfmjqXlj6Pojrflj5blpLHotKVcIik7XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyLkluc3RhbmNlLkh0dHBQb3N0UmVxdWVzdChQUk9UT0NPTFMuQ29uZmlnLCBudWxsLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbmZpZ3MudmVyID0gX3ZlcjtcclxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04oUGxheWVyQWNjb3VudC5sb2NhbGNvZmlna2V5LCBkYXRhLmNvbmZpZ3MpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZXZlcuS/neWtmOmFjee9ruWujOaIkC4uLlwiLCBfdmVyKTtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjYihkYXRhLmNvbmZpZ3MpO1xyXG5cclxuICAgICAgICAgICAgfSksIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6YWN572u6I635Y+W5aSx6LSlXCIgKyBkYXRhKTtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgU2VydmVyVGltZSgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0aW1lID0gTGF5YS50aW1lci5jdXJyVGltZXI7XHJcbiAgICAgICAgbGV0IHN0aW1lID0gUGxheWVyQWNjb3VudC5TZXJ2ZXJUaW1lICsgTWF0aC5jZWlsKCh0aW1lIC0gdGhpcy5sb2NhbFRpbWUpIC8gMTAwMCk7XHJcbiAgICAgICAgcmV0dXJuIHN0aW1lO1xyXG4gICAgfVxyXG59IiwiXHJcblxyXG5leHBvcnQgY2xhc3MgUmVjb3JkTWFuYWdlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTpSZWNvcmRNYW5hZ2VyO1xyXG4gICAgY29uc3RydWN0b3IoKVxyXG4gICAge1xyXG4gICAgICAgIFJlY29yZE1hbmFnZXIuaW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibmV3IHJlY29yZFwiKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6UmVjb3JkTWFuYWdlclxyXG4gICAge1xyXG4gICAgICAgIGlmKFJlY29yZE1hbmFnZXIuaW5zdGFuY2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVjb3JkTWFuYWdlci5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGN1cm1hbmFnZXIgPSBuZXcgUmVjb3JkTWFuYWdlcigpO1xyXG4gICAgICAgICAgICBjdXJtYW5hZ2VyLk9uTmV3KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBjdXJtYW5hZ2VyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBSZWNvcmRTdGFydCgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJSZWNvcmRTdGFydFwiKTtcclxuICAgICAgICB0aGlzLnJlY29yZC5zdGFydCh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiA2MCxcclxuICAgICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBSZWNvcmRTdG9wKClcclxuICAgIHtcclxuICAgICAgICBpZighTGF5YS5Ccm93c2VyLm9uTW9iaWxlKXJldHVybjtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlJlY29yZFN0b3BcIik7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQuc3RvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBsZXRlcGF0aDpzdHJpbmc7XHJcblxyXG4gICAgU2hhcmVWaWRlbyhfY2I6RnVuY3Rpb24pXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy50dC5zaGFyZUFwcE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICBjaGFubmVsOiBcInZpZGVvXCIsXHJcbiAgICAgICAgICAgIHF1ZXJ5OiBcIlwiLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZUlkOiBcIjI2NnE0ZmdiOGFsN2kzZTdpZVwiLCAvLyDmm7/mjaLmiJDpgJrov4flrqHmoLjnmoTliIbkuqtJRFxyXG4gICAgICAgICAgICB0aXRsZTogXCLotaLlvpfkuobmiJHvvIzorqTkvaDlgZrlpKflk6Xlj4jlpoLkvZVcIixcclxuICAgICAgICAgICAgZGVzYzogXCLotaLlvpfkuobmiJHvvIzorqTkvaDlgZrlpKflk6Xlj4jlpoLkvZVcIixcclxuICAgICAgICAgICAgZXh0cmE6IHtcclxuICAgICAgICAgICAgICB2aWRlb1BhdGg6IHRoaXMuY29tcGxldGVwYXRoLCAvLyDlj6/nlKjlvZXlsY/lvpfliLDnmoTmnKzlnLDmlofku7bot6/lvoRcclxuICAgICAgICAgICAgICB2aWRlb1RvcGljczogW1wi6LWi5b6X5LqG5oiR77yM6K6k5L2g5YGa5aSn5ZOl5Y+I5aaC5L2VXCJdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHN1Y2Nlc3MoKSB7XHJcbiAgICAgICAgICAgICAgICBfY2IgJiYgX2NiKHRydWUpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YiG5Lqr6KeG6aKR5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBmYWlsKGUpIHtcclxuICAgICAgICAgICAgICAgIF9jYiAmJiBfY2IoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YiG5Lqr6KeG6aKR5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZWNvcmQ6YW55O1xyXG4gICAgT25OZXcoKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucmVjb3JkID0gTGF5YS5Ccm93c2VyLndpbmRvdy50dC5nZXRHYW1lUmVjb3JkZXJNYW5hZ2VyKCk7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQub25TdGFydChyZXMgPT4ge1xyXG4gICAgICAgICAgICAvLyDlvZXlsY/lvIDlp4tcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5yZWNvcmQub25TdG9wKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVwYXRoID0gcmVzLnZpZGVvUGF0aDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzLnZpZGVvUGF0aCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuXHJcbn0iLCJcclxuXHJcblxyXG5cclxuZXhwb3J0IGVudW0gc3lzdGVtdHlwZSB7XHJcbiAgICBpb3MsIGFuZHJvaWQsIG90aGVyXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBXeEFwaVxyXG57XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlY29yZEFsZEV2ZW50KGtleTpzdHJpbmcsdmFsdWU6c3RyaW5nPVwiXCIpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAvLyBpZihMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFNlbmRFdmVudChrZXkse2tleTp2YWx1ZX0pO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBjb25zb2xlLmxvZyhcIuS6i+S7tjogXCIsa2V5KTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBuZXdhY2NvdW50ID0gZmFsc2U7XHJcbiAgICBzdGF0aWMgc2NlbmVWYWx1ZSA9IFwiXCI7XHJcbiAgICBzdGF0aWMgc2hhcmVPcGVuSWQgPSBcIlwiO1xyXG4gICAgc3RhdGljIHF1ZXJ5Y2hhbm5lbCA9IFwiXCI7XHJcbiAgICBzdGF0aWMgcmVmZXJyZXJJbmZvYXBwSWQgPSBcIlwiO1xyXG4gICAgc3RhdGljIFdYTG9naW4oY2I6IEZ1bmN0aW9uKSBcclxuICAgIHtcclxuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5sb2dpbih7XHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXMuY29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY29kZTpcIixyZXMuY29kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2IocmVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfojrflj5bnlKjmiLfnmbvlvZXmgIHlpLHotKXvvIEnICsgcmVzLmVyck1zZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChyZXMpIHsgY29uc29sZS5sb2coXCJ3eC5sb2dpbjogZmFpbGVkLCByZXM9XCIgKyByZXMpOyB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIFd4SW5pdCgpIFxyXG4gICAge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XHJcblxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1NoYXJlTWVudShcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgd2l0aFNoYXJlVGlja2V0OiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25TaG93KChvcHRpb24pID0+IFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cob3B0aW9uKTtcclxuICAgICAgICAgICAgdGhpcy5zaGFyZU9wZW5JZCA9IG9wdGlvbi5xdWVyeS51c2VySWQ7XHJcbiAgICAgICAgICAgIHRoaXMucXVlcnljaGFubmVsID0gb3B0aW9uLnF1ZXJ5LmNoYW5uZWw7XHJcbiAgICAgICAgICAgIGlmKG9wdGlvbi5yZWZlcnJlckluZm8pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVmZXJyZXJJbmZvYXBwSWQgPSBvcHRpb24ucmVmZXJyZXJJbmZvLmFwcElkO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvblNob3cgYXBwSWQgaXM6XCIsIG9wdGlvbi5yZWZlcnJlckluZm8uYXBwSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2NlbmVWYWx1ZSA9IG9wdGlvbi5zY2VuZTtcclxuICAgICAgICAgICAgdmFyIHNjZW5lID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInNjZW5lXCIpO1xyXG4gICAgICAgICAgICBpZiAoc2NlbmUpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lVmFsdWUgPSBzY2VuZTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6K+75Y+W6YWN572u5Zy65pmv5YC8OlwiICsgc2NlbmUpO1xyXG4gICAgICAgICAgICB9ICBcclxuICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuesrOS4gOasoeaLieWPluWcuuaZr+WAvDpcIiArIHRoaXMuc2NlbmVWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJzY2VuZVwiLCB0aGlzLnNjZW5lVmFsdWUpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL+aYvuekuuWKoOi9veS/oeaBr1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNTaG93aW5nID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNob3dMb2FkaW5nKHRpdGxlOiBzdHJpbmcgPSBcIuWKoOi9veS4rS4uLlwiKSBcclxuICAgIHtcclxuICAgICAgICAvLyBpZiAodGhpcy5pc1Nob3dpbmcpIHJldHVybjtcclxuICAgICAgICAvLyB0aGlzLmlzU2hvd2luZyA9IHRydWU7XHJcbiAgICAgICAgLy8gKExheWEuQnJvd3Nlci5vbk1pbmlHYW1lKSAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dMb2FkaW5nKHsgdGl0bGU6IHRpdGxlLCBtYXNrOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgSGlkZUxvYWRpbmcoKSBcclxuICAgIHtcclxuICAgICAgICAvLyB0aGlzLmlzU2hvd2luZyA9IGZhbHNlO1xyXG4gICAgICAgIC8vIChMYXlhLkJyb3dzZXIub25NaW5pR2FtZSkgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5oaWRlTG9hZGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBhbGRTZW5kT3BlbmlkKF9vcGVuaWQ6c3RyaW5nKVxyXG4gICAge1xyXG4gICAgICAgIC8vIGlmKExheWEuQnJvd3Nlci5vbk1pbmlHYW1lKVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJhbGRTZW5kT3BlbmlkXCIsX29wZW5pZCk7XHJcbiAgICAgICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU2VuZE9wZW5pZChfb3BlbmlkKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8v5qOA5rWL5pu05pawXHJcbiAgICBzdGF0aWMgQ2hlY2tXWFVwZGF0ZSgpIFxyXG4gICAge1xyXG4gICAgICAgIGNvbnN0IHVwZGF0ZU1hbmFnZXIgPSBMYXlhLkJyb3dzZXIud2luZG93LnR0LmdldFVwZGF0ZU1hbmFnZXIoKTtcclxuXHJcbiAgICAgICAgdXBkYXRlTWFuYWdlci5vbkNoZWNrRm9yVXBkYXRlKChyZXMpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnIDmlrDniYjmnKw6XCIgKyByZXMuaGFzVXBkYXRlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZVJlYWR5KCgpID0+IHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy50dC5zaG93TW9kYWwoe1xyXG4gICAgICAgICAgICAgICAgc2hvd0NhbmNlbDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+abtOaWsOaPkOekuicsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiAn5paw54mI5pys5bey57uP5YeG5aSH5aW977yM5piv5ZCm6YeN5ZCv5bqU55So77yfJyxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5hcHBseVVwZGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGZhaWwocmVzPykge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIuYXBwbHlVcGRhdGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGxldmVsU3RhcnQoc3RhZ2VJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5byA5aeL6K6w5b2V5YWz5Y2hOlwiICsgc3RhZ2VJZCk7XHJcbiAgICAgICAgLy8gaWYgKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eCkge1xyXG4gICAgICAgIC8vICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uU3RhcnQoXHJcbiAgICAgICAgLy8gICAgICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VJZDogc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCAvL+eUqOaIt0lEIOWPr+mAiVxyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICApO1xyXG4gICAgICAgIC8vICAgICBpZihXeEFwaS5uZXdhY2NvdW50KVxyXG4gICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uU3RhcnQoXHJcbiAgICAgICAgLy8gICAgICAgICAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBzdGFnZUlkOiBcIuaWsOeUqOaItzpcIiArIHN0YWdlSWQsICAgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBzdGFnZU5hbWU6IHN0YWdlTmFtZSwgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCAvL+eUqOaIt0lEIOWPr+mAiVxyXG4gICAgICAgIC8vICAgICAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgICk7IFxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBsZXZlbFJ1bm5pbmcoc3RhZ2VJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsdXNlcmV2aXZlOnN0cmluZylcclxuICAgIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuiusOW9leWFs+WNoeS4rTpcIiArIHN0YWdlSWQpO1xyXG4gICAgICAgIC8vIGlmKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25SdW5uaW5nKHtcclxuICAgICAgICAvLyAgICAgICAgIHN0YWdlSWQgICA6IHN0YWdlSWQsICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgIHN0YWdlTmFtZSA6IHN0YWdlTmFtZSwgIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgIHVzZXJJZCAgICA6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcclxuICAgICAgICAvLyAgICAgICAgIGV2ZW50ICAgICA6IFwicmV2aXZlXCIsICAvL+S9v+eUqOmBk+WFtyAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgcGFyYW1zICAgIDoge1xyXG4gICAgICAgIC8vICAgICAgICAgICBpdGVtTmFtZSAgOiBcIuS9v+eUqOWkjea0u1wiLC8v5L2/55So6YGT5YW35ZCN56ewIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICBpdGVtQ291bnQgOiAxLCAgIC8v5L2/55So6YGT5YW35pWw6YePICDlj6/pgIlcclxuICAgICAgICAvLyAgICAgICAgICAgZGVzYyAgICAgIDogdXNlcmV2aXZlIC8v5L2/55So6YGT5YW35o+P6L+wXHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgICAgaWYoV3hBcGkubmV3YWNjb3VudClcclxuICAgICAgICAvLyAgICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uUnVubmluZyh7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VJZCAgIDpcIuaWsOeUqOaItzpcIiArICBzdGFnZUlkLCAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VOYW1lIDogc3RhZ2VOYW1lLCAgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHVzZXJJZCAgICA6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcclxuICAgICAgICAvLyAgICAgICAgICAgICBldmVudCAgICAgOiBcInJldml2ZVwiLCAgLy/kvb/nlKjpgZPlhbcgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICBwYXJhbXMgICAgOiB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICBpdGVtTmFtZSAgOiBcIuS9v+eUqOWkjea0u1wiLC8v5L2/55So6YGT5YW35ZCN56ewIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgaXRlbUNvdW50IDogMSwgICAvL+S9v+eUqOmBk+WFt+aVsOmHjyAg5Y+v6YCJXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICBkZXNjICAgICAgOiB1c2VyZXZpdmUgLy/kvb/nlKjpgZPlhbfmj4/ov7BcclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgIH0pXHJcbiAgICAgICAgLy8gICAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbGV2ZWxTdWNjZXNzKHN0YWdlSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuiusOW9leWFs+WNoTrlrozmiJBcIiArIHN0YWdlSWQpO1xyXG4gICAgICAgIC8vIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcclxuICAgICAgICAvLyAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vbkVuZChcclxuICAgICAgICAvLyAgICAgICAgIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBzdGFnZUlkOiBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICBzdGFnZU5hbWU6IHN0YWdlTmFtZSwgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHVzZXJJZDogdXNlcklkLCAvL+eUqOaIt0lEIOWPr+mAiVxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGV2ZW50OiBcImNvbXBsZXRlXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICBwYXJhbXM6XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5YWz5Y2h5a6M5oiQXCIgICAvL+aPj+i/sFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAvLyAgICAgKTtcclxuICAgICAgICAvLyAgICAgaWYoV3hBcGkubmV3YWNjb3VudClcclxuICAgICAgICAvLyAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vbkVuZChcclxuICAgICAgICAvLyAgICAgICAgICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHN0YWdlSWQ6XCLmlrDnlKjmiLc6XCIgKyBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdXNlcklkOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50OiBcImNvbXBsZXRlXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgcGFyYW1zOlxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5YWz5Y2h5a6M5oiQXCIgICAvL+aPj+i/sFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAvLyAgICAgICAgICk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGxldmVsRmFpbChzdGFnZUlkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgc2NvcmU6IHN0cmluZywgY2FybmFtZTogc3RyaW5nKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuiusOW9leWFs+WNoTrlpLHotKVcIiArIHN0YWdlSWQpO1xyXG4gICAgICAgIC8vIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcclxuICAgICAgICAvLyAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vbkVuZChcclxuICAgICAgICAvLyAgICAgICAgIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBzdGFnZUlkOiBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICBzdGFnZU5hbWU6IHN0YWdlTmFtZSwgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHVzZXJJZDogdXNlcklkLCAvL+eUqOaIt0lEIOWPr+mAiVxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGV2ZW50OiBcImZhaWxcIiwgICAvL+WFs+WNoeWujOaIkCAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHBhcmFtczpcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZGVzYzogXCLlpLHotKVcIixcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHNjb3JlOiBzY29yZSwvL+aPj+i/sFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgY2FyOiBjYXJuYW1lLy/mj4/ov7BcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICApO1xyXG4gICAgICAgIC8vICAgICBpZihXeEFwaS5uZXdhY2NvdW50KVxyXG4gICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uRW5kKFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgc3RhZ2VJZDpcIuaWsOeUqOaItzpcIiArIHN0YWdlSWQsICAgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBzdGFnZU5hbWU6IHN0YWdlTmFtZSwgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgZXZlbnQ6IFwiZmFpbFwiLCAgIC8v5YWz5Y2h5a6M5oiQICDlhbPljaHov5vooYzkuK3vvIznlKjmiLfop6blj5HnmoTmk43kvZwgICAg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHBhcmFtczpcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBcIuWksei0pVwiLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlOiBzY29yZSwvL+aPj+i/sFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNhcjogY2FybmFtZS8v5o+P6L+wXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgT25TaG93KGNiOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLndpbmRvdy50dCkgcmV0dXJuO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQub25TaG93KGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgT2ZmU2hvdyhjYjogRnVuY3Rpb24pIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQub2ZmU2hvdyhjYik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIENhblNoYWtlID0gdHJ1ZTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBzaGFrZSgpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQudmlicmF0ZVNob3J0KHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBzaGFrZUxvbmcoKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnZpYnJhdGVMb25nKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNoYWtlKF9zaG9ydCA9IHRydWUpIFxyXG4gICAge1xyXG4gICAgICAgIGlmKExheWEuQnJvd3Nlci53aW5kb3cudHQgJiYgV3hBcGkuQ2FuU2hha2UpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoX3Nob3J0KSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFrZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hha2VMb25nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIV9zaG9ydClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhZ2VTaGFrZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiog5piv5ZCm6ZyH5Yqo5LitICovXHJcbiAgICBzdGF0aWMgaXNTaGFrZTpib29sZWFuO1xyXG4gICAgc3RhdGljIHRpbWVzID0gMS4zO1xyXG4gICAgc3RhdGljIG51bTpudW1iZXIgPSAwO1xyXG4gICAgc3RhdGljIG9mZnNldEFyciA9IFswLCAwXTtcclxuICAgIHN0YXRpYyBvZmZzZXQgPSAxNDtcclxuICAgIHN0YXRpYyBjYW5zaGFrZXN0YWdlID0gZmFsc2U7XHJcblxyXG4gICAgc3RhdGljIHN0YWdlU2hha2UoY2FsbEJhY2s6RnVuY3Rpb24gPSBudWxsLHNwZWVkOm51bWJlciA9IDMyKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYodGhpcy5pc1NoYWtlIHx8ICF0aGlzLmNhbnNoYWtlc3RhZ2UpIHJldHVybjtcclxuICAgICAgICB0aGlzLmlzU2hha2UgPSB0cnVlO1xyXG5cclxuICAgICAgICB2YXIgcG9pbnQ6TGF5YS5WZWN0b3IyID0gbmV3IExheWEuVmVjdG9yMihMYXlhLnN0YWdlLngsIExheWEuc3RhZ2UueSk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS50aW1lckxvb3Aoc3BlZWQsIHRoaXMsIHRoaXMuc2hha2VPYmplY3QsW3BvaW50LGNhbGxCYWNrXSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNoYWtlT2JqZWN0KF9wb2ludDpMYXlhLlZlY3RvcjIsX2NhbGxCYWNrKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNvdW50Om51bWJlciA9ICh0aGlzLm51bSsrKSAlIDQ7XHJcbiAgICAgICAgdGhpcy5vZmZzZXRBcnJbdGhpcy5udW0gJSAyXSA9IGNvdW50IDwgMiA/IDAgOiB0aGlzLm9mZnNldDtcclxuICAgICAgICBMYXlhLnN0YWdlLnggPSB0aGlzLm9mZnNldEFyclswXSArIF9wb2ludC54O1xyXG4gICAgICAgIExheWEuc3RhZ2UueSA9IHRoaXMub2Zmc2V0QXJyWzFdICsgX3BvaW50Lnk7XHJcblxyXG4gICAgICAgIGlmKHRoaXMubnVtID4gKHRoaXMudGltZXMgKiA0ICsgMSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLnN0YWdlLmNsZWFyVGltZXIodGhpcywgdGhpcy5zaGFrZU9iamVjdCk7XHJcbiAgICAgICAgICAgIExheWEuc3RhZ2UucG9zKDAsMCk7XHJcbiAgICAgICAgICAgIHRoaXMubnVtID0gMDtcclxuICAgICAgICAgICAgdGhpcy5pc1NoYWtlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmKF9jYWxsQmFjayAhPSBudWxsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfY2FsbEJhY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNob3dUeHQodGV4dDogc3RyaW5nKSBcclxuICAgIHtcclxuICAgICAgICBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdy50dCkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnNob3dUb2FzdCh7IHRpdGxlOiB0ZXh0IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2codGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFN5c3RlbUZyb20oKTogc3lzdGVtdHlwZSBcclxuICAgIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuIHN5c3RlbXR5cGUub3RoZXI7XHJcblxyXG4gICAgICAgIGxldCBpbmZvID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgIHZhciBzeXN0ZW06IHN0cmluZyA9IGluZm8uc3lzdGVtO1xyXG4gICAgICAgIHZhciBJT1MgPSBzeXN0ZW0uaW5kZXhPZihcImlPU1wiKSAhPSAtMTtcclxuICAgICAgICB2YXIgQW5kcm9pZCA9IHN5c3RlbS5pbmRleE9mKFwiQW5kcm9pZFwiKSAhPSAtMTtcclxuXHJcbiAgICAgICAgaWYgKElPUykge1xyXG4gICAgICAgICAgICByZXR1cm4gc3lzdGVtdHlwZS5pb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKEFuZHJvaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN5c3RlbXR5cGUuYW5kcm9pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzeXN0ZW10eXBlLm90aGVyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IElzTG9uZ1NjcmVlblN5c3RlbSgpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGxldCBzeXN0ZW1JbmZvID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgIGxldCBwbGF0Zm9ybU1vZGVsID0gXCJpcHhcIjtcclxuICAgICAgICBpZiAoc3lzdGVtSW5mbyAhPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIG1vZGVsID0gc3lzdGVtSW5mby5tb2RlbDtcclxuICAgICAgICBwbGF0Zm9ybU1vZGVsID0gYCR7c3lzdGVtSW5mby5icmFuZH1fJHttb2RlbH1fJHtzeXN0ZW1JbmZvLnN5c3RlbX1fd3gke3N5c3RlbUluZm8udmVyc2lvbn1fU0RLVmVyJHtzeXN0ZW1JbmZvLlNES1ZlcnNpb259YDtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInBsYXRmb3JtTW9kZWw6XCIgKyBwbGF0Zm9ybU1vZGVsKTtcclxuICAgICAgICByZXR1cm4gICEobW9kZWwuaW5kZXhPZihcIlhcIikgPCAwKSB8fFxyXG4gICAgICAgICgobW9kZWwuaW5kZXhPZihcIm9wcG9cIikgPj0gMCB8fCBtb2RlbC5pbmRleE9mKFwiT1BQT1wiKSA+PSAwKSAmJiAobW9kZWwuaW5kZXhPZihcIlIxNVwiKSA+PSAwIHx8IG1vZGVsLmluZGV4T2YoXCJyMTVcIikgPj0gMCkpIHx8XHJcbiAgICAgICAgc3lzdGVtSW5mby5zdGF0dXNCYXJIZWlnaHQgPiAyMCB8fFxyXG4gICAgICAgIChtb2RlbC5pbmRleE9mKFwiTm90ZVwiKSA+PSAwICYmIChtb2RlbC5pbmRleE9mKFwiN1wiKSA+PSAwIHx8IG1vZGVsLmluZGV4T2YoXCI4XCIpID49IDApKSB8fFxyXG4gICAgICAgICgobW9kZWwuaW5kZXhPZihcImlQaG9uZVwiKSA+PSAwKSAmJiAobW9kZWwuaW5kZXhPZihcIjExXCIpID49IDApKVxyXG59XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB3cml0ZVN0YWdlKHN0YWdlOiBudW1iZXIpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGt2RGF0YUxpc3QgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIHZhciBteVZhbHVlID0gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBcInd4Z2FtZVwiOiBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgXCJzdGFnZVwiOiBzdGFnZSxcclxuICAgICAgICAgICAgICAgIFwidXBkYXRlX3RpbWVcIjogZGF0ZS50b1N0cmluZygpLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGt2RGF0YUxpc3QucHVzaCh7a2V5Olwic3RhZ2VcIiwgdmFsdWU6IG15VmFsdWV9KTtcclxuICAgICAgXHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3gpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNldFVzZXJDbG91ZFN0b3JhZ2UoXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgS1ZEYXRhTGlzdDoga3ZEYXRhTGlzdCxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiByPT5cclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5Lyg5YiG5pWw5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcFZlcnNpb25HcmVhdGVyT3JFcXVhbCh2MTogc3RyaW5nLCB2Mjogc3RyaW5nKSBcclxuICAgIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgW0xPR13ln7rnoYDlupPniYjmnKzlj7cgY3VyVmVyOiR7djF9IHRhcmdWZXI6JHt2Mn1gKTtcclxuICAgICAgICBsZXQgdjFBcnIgPSB2MS5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgbGV0IHYyQXJyID0gdjIuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGxldCBsZW4gPSB2MUFyci5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHYyQXJyLmxlbmd0aCA8IGxlbikge1xyXG4gICAgICAgICAgICBsZW4gPSB2MkFyci5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHZlcjEgPSBOdW1iZXIodjFBcnJbaV0pO1xyXG4gICAgICAgICAgICBsZXQgdmVyMiA9IE51bWJlcih2MkFycltpXSk7XHJcbiAgICAgICAgICAgIGlmICh2ZXIxID4gdmVyMikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmVyMSA8IHZlcjIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdjFBcnIubGVuZ3RoID49IHYyQXJyLmxlbmd0aDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7U29ja2V0Tm9maWZ5fSBmcm9tIFwiLi4vV1hTREsvU29ja2V0Tm9maWZ5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmVyU29ja2V0XHJcbntcclxuICAgIHByaXZhdGUgc29jazogTGF5YS5Tb2NrZXQ7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOiBTZXJ2ZXJTb2NrZXQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAxOuiHquWKqOaWree6v++8jDLvvJrkuLvliqjmlq3nur9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb2ZmbGluZXN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmlq3nur/ph43ov57mrKHmlbBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfY29ubmV0TnVtczpudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogc29ja2V06L+e5o6l5LitXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgU2VydmVyU29ja2V0LmlucyA9IHRoaXM7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9zb2NrZXRjb25uZXRpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFNlcnZlclNvY2tldCB7XHJcbiAgICAgICAgaWYgKFNlcnZlclNvY2tldC5pbnMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlclNvY2tldCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gU2VydmVyU29ja2V0LmlucztcclxuICAgIH1cclxuXHJcbiAgICAvL+i/nuaOpeacjeWKoeWZqFxyXG4gICAgcHVibGljIGNvbm5lY3RTZXJ2ZXIoZ2FtZUhvc3Q6c3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fc29ja2V0Y29ubmV0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlbW92ZVNvY2tldCgpO1xyXG4gICAgICAgIGlmICghdGhpcy5zb2NrIHx8ICF0aGlzLnNvY2suY29ubmVjdGVkKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbndhaXRwYW5lbCgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc29jaykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrID0gbmV3IExheWEuU29ja2V0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2sub24oTGF5YS5FdmVudC5PUEVOLCB0aGlzLCB0aGlzLm9uU29ja2V0T3Blbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2sub24oTGF5YS5FdmVudC5NRVNTQUdFLCB0aGlzLCB0aGlzLm9uUmVjZWl2ZU1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrLm9uKExheWEuRXZlbnQuQ0xPU0UsIHRoaXMsIHRoaXMub25Tb2NrZXRDbG9zZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2sub24oTGF5YS5FdmVudC5FUlJPUiwgdGhpcywgdGhpcy5pb0Vycm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc29jay5jb25uZWN0QnlVcmwoZ2FtZUhvc3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNDb25uZWN0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNvY2sgJiYgdGhpcy5zb2NrLmNvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW9FcnJvKGU6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zb2NrZXRjb25uZXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jb25uZXROdW1zKys7XHJcbiAgICAgICAgdGhpcy5jbG9zZXdhaXRwYW5lbCgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlU29ja2V0KCk7XHJcbiAgICAgICAgdGhpcy5fb2ZmbGluZXN0YXRlPTE7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVTb2NrZXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fc29ja2V0Y29ubmV0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYodGhpcy5zb2NrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50Lk9QRU4sIHRoaXMsIHRoaXMub25Tb2NrZXRPcGVuKTtcclxuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50Lk1FU1NBR0UsIHRoaXMsIHRoaXMub25SZWNlaXZlTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc29jay5vZmYoTGF5YS5FdmVudC5DTE9TRSwgdGhpcywgdGhpcy5vblNvY2tldENsb3NlKTtcclxuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLmlvRXJybyk7XHJcbiAgICAgICAgICAgIHRoaXMuc29jay5jbGVhblNvY2tldCgpO1xyXG4gICAgICAgICAgICB0aGlzLnNvY2suY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5zb2NrID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmiYvliqjlhbPpl63muLjmiI9zb2NrZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbHNlU29ja2V0KCBvZmZsaW5lc3RhdGU6bnVtYmVyID0gMSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5pc0Nvbm5lY3QoKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3Nld2FpdHBhbmVsKCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU29ja2V0KCk7XHJcbiAgICAgICAgICAgIGlmKCBvZmZsaW5lc3RhdGUgIT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZsaW5lc3RhdGU9IG9mZmxpbmVzdGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBTb2NrZXROb2ZpZnkuU09DS0VUX0NMT1NFICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Tb2NrZXRDbG9zZShlOiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc29ja2V0Y29ubmV0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jbG9zZXdhaXRwYW5lbCgpO1xyXG4gICAgICAgIHRoaXMuX29mZmxpbmVzdGF0ZT0xO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFNvY2tldE5vZmlmeS5TT0NLRVRfQ0xPU0UgKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBjbG9zZXdhaXRwYW5lbCgpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuY2xvc2VNb2RhbFdhaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9wZW53YWl0cGFuZWwoKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LnNob3dNb2RhbFdhaXQoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy/ov57mjqXmiJDlip/ov5Tlm55cclxuICAgIHByaXZhdGUgb25Tb2NrZXRPcGVuKGV2ZW50OiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29ubmV0TnVtcyA9IDA7XHJcbiAgICAgICAgdGhpcy5jbG9zZXdhaXRwYW5lbCgpO1xyXG4gICAgICAgIHRoaXMuX29mZmxpbmVzdGF0ZSA9IDA7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudChTb2NrZXROb2ZpZnkuU09DS0VUX0NPTk5FQ1RfU1VDQ0VFRCwgbnVsbCwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5ZCR5pyN5Yqh56uv5Y+R6YCB5raI5oGvXHJcbiAgICBwdWJsaWMgc2VuZE1lc3NhZ2UoYWN0OiBzdHJpbmcsIGRhdGE6IGFueSwgaXNTaG93V2FpdDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBpZiggdGhpcy5zb2NrICYmIHRoaXMuc29jay5jb25uZWN0ZWQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIGlzU2hvd1dhaXQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW53YWl0cGFuZWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggIWRhdGEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkYXRhPXt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGEuQUNUSU9OID0gYWN0O1xyXG4gICAgICAgICAgICB0aGlzLnNvY2suc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL+a2iOaBr+i/lOWbnuWQju+8jOS8muW5v+aSreWHuuWOu1xyXG4gICAgLy9HbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIuS9oOWPkemAgeeahGNtZOWQjeensFwiLOebkeWQrOaWueazlSx0aGlzKVxyXG4gICAgcHJpdmF0ZSBvblJlY2VpdmVNZXNzYWdlKG1zZzogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBzb2NrZXRkYXRhOiBhbnkgPSBKU09OLnBhcnNlKG1zZyk7XHJcblxyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFNvY2tldE5vZmlmeVxyXG57ICAgXHJcbiAgICAvKipcclxuICAgICAqIHNvY2tldOi/nuaOpeaIkOWKn1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgU09DS0VUX0NPTk5FQ1RfU1VDQ0VFRDpzdHJpbmcgPSBcIlNPQ0tFVF9DT05ORUNUX1NVQ0NFRURcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIHNvY2tldOWFs+mXrVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgU09DS0VUX0NMT1NFOnN0cmluZyA9IFwiU09DS0VUX0NMT1NFXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuLjmiI/ph43mlrDov57mjqVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIEdhbWVfYWdhaW5Db25uZXRTb2NrZXQ6c3RyaW5nID0gXCJHYW1lX2FnYWluQ29ubmV0U29ja2V0XCI7XHJcbn0iLCJleHBvcnQgY2xhc3MgV0VDSEFURVZFTlQgXHJcbntcclxuICAgIFxyXG5cclxuICAgICAvKipcclxuICAgICAqIOa4uOaIj+i/m+WFpeWQjuWPsOS6i+S7tlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgV0VDSEFURVZFTlRfb25oaWRlOnN0cmluZyA9IFwiV0VDSEFURVZFTlRfb25oaWRlXCI7XHJcblxyXG4gICAgc3RhdGljIFdFQ0hBVEVWRU5UX29uQXVkaW9JbnRlcnJ1cHRpb25FbmQ6c3RyaW5nID0gXCJXRUNIQVRFVkVOVF9vbkF1ZGlvSW50ZXJydXB0aW9uRW5kXCI7XHJcblxyXG4gICAgc3RhdGljIFdFQ0hBVEVWRU5UX2xvc2Vmb2N1czpzdHJpbmcgPSBcIldFQ0hBVEVWRU5UX2xvc2Vmb2N1c1wiO1xyXG4gICAgc3RhdGljIFdFQ0hBVEVWRU5UX2dldGZvY3VzOnN0cmluZyA9IFwiV0VDSEFURVZFTlRfZ2V0Zm9jdXNcIjtcclxuXHJcbiAgICBzdGF0aWMgV0VDSEFURVZFTlRfdXBkYXRlVmlkZW9OdW1zOnN0cmluZyA9IFwiV0VDSEFURVZFTlRfdXBkYXRlVmlkZW9OdW1zXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnlKjmiLfmiZPngrlcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTAwMjpzdHJpbmcgPSBcIjk4OTEwMDJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluWQjuWPsOaVsOaNrlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbWVzc2FnZV85ODkxMTAxOnN0cmluZyA9IFwiOTg5MTEwMVwiO1xyXG5cclxuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9sb2dpblN1Y2NlZWQ6c3RyaW5nID0gXCJXRUNIQVRFVkVOVF9sb2dpblN1Y2NlZWRcIjtcclxuICAgIC8qKlxyXG4gICAgICog5ri45oiP5LuO5ZCO5Y+w5oGi5aSN5pi+56S65LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9vbnNob3c6c3RyaW5nID0gXCJXRUNIQVRFVkVOVF9vbnNob3dcIjtcclxuXHJcbiAgIFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5pS26JeP5oiW6ICF5rWu56qX6L+b5YWl5ri45oiPXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9mcm9tc2NvcmZrOnN0cmluZyA9IFwiV0VDSEFURVZFTlRfZnJvbXNjb3Jma1wiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog55m75b2VXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBtZXNzYWdlXzk4OTEwMDE6c3RyaW5nID0gXCI5ODkxMDAxXCI7XHJcbiAgICAvKipcclxuICAgICAqIOW5v+WRiueCueWHu1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbWVzc2FnZV85ODkxMTAyOnN0cmluZyA9IFwiOTg5MTEwMlwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiDngrnlh7vnoa7lrprot7PovazliLDlpJbpg6jmuLjmiI9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTEwMzpzdHJpbmcgPSBcIjk4OTExMDNcIjtcclxufSIsImltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHtTZXJ2ZXJIdHRwc30gZnJvbSBcIi4uL1dYU0RLL1NlcnZlckh0dHBzXCI7XHJcbmltcG9ydCB7V0VDSEFURVZFTlR9IGZyb20gXCIuLi9XWFNESy9XRUNIQVRFVkVOVFwiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XHJcbmltcG9ydCB7RGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0RhdGVDb250cm9sXCI7XHJcbmltcG9ydCB7TG9jYWxEYXRhQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvTG9jYWxEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQge1VzZXJEYXRhSW5mb30gZnJvbSBcIi4uL0RhdGEvVXNlckRhdGFJbmZvXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0F1ZGlvQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBMYXlvdXRDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvTGF5b3V0Q29udHJvbFwiO1xyXG5pbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4uL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgIGNsYXNzIFdYR2FtZVBsYXRmb3JtXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIGluczpXWEdhbWVQbGF0Zm9ybTtcclxuXHJcbiAgICBzdGF0aWMgY29kZTpzdHJpbmc7XHJcbiAgICBzdGF0aWMgbmlja05hbWU6c3RyaW5nO1xyXG4gICAgc3RhdGljIFF1RGFvSUQ6c3RyaW5nID0gXCJcIjsvL+W+ruS/oeW5v+WRiklEXHJcblxyXG4gICAgc3RhdGljIGlzU2hvd2luZzpib29sZWFuPXRydWU7XHJcbiAgICAvKipcclxuICAgICAqIOaOiOadg+eKtuaAgSAwOuacquWIpOaWre+8jDHvvJrlt7LmjojmnYNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFjY3JlZGl0c3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOW9k+WkqeWIhuS6q+asoeaVsFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZGF5U2hhcmVOdW06bnVtYmVyID0gMDtcclxuICAgIC8qKlxyXG4gICAgICog5b2T5aSp55yL6KeG6aKR5qyh5pWwXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBkYXlWaWRlb051bTpudW1iZXIgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiDliKTmlq3liIbkuqvmmK/lkKbmiJDlip/ml7bpl7Tpl7TpmpRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFNoYXJlVGltZTpudW1iZXIgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiDmr4/ml6XmnIDlpKfnnIvop4bpopHmrKHmlbDvvIjmiJDlip/ntK/liqDkuIDmrKHvvIlcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFZpZGVvTnVtOm51bWJlciA9IDA7XHJcbiAgICAvKipcclxuICAgICAqIOeci+inhumikeWGt+WNtOaXtumXtFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgVmlkZW9UaW1lOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiA45aW95L2NY3Bh5Y+v5by55Ye65pe26Ze06Ze06ZqUKOenkilcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGppbGl3ZWl0aW1lOm51bWJlciA9IDEwMDtcclxuICAgIC8qKlxyXG4gICAgICog5YiG5Lqr5Yeg5qyh5YiH5o2i5Yiw6KeG6aKRXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBTaGFyZXRvVmlkZW86bnVtYmVyID0gMTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOinhumikeWHoOasoeWIh+aNouWIsOWIhuS6q1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgVmlkZW90b1NoYXJlOm51bWJlciA9IDE7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliIbkuqvmlbDmja7lrrnlmahcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFNoYXJlRGljdDphbnkgPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOeUqOaIt+adpea6kGlkXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmcm9tc2NlbmU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmlucyA9IHRoaXM7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6V1hHYW1lUGxhdGZvcm1cclxuICAgIHtcclxuICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXWEdhbWVQbGF0Zm9ybSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gV1hHYW1lUGxhdGZvcm0uaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2hvd1NoYXJlTWVudSh7d2l0aFNoYXJlVGlja2V0OnRydWV9KTtcclxuICAgICAgICB0aGlzLm9uQXVkaW9JbnRlcnJ1cHRpb25CZWdpbigpO1xyXG4gICAgICAgIHRoaXMub25BdWRpb0ludGVycnVwdGlvbkVuZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0U2hhcmVEaWFuKCBkYXRhOkFycmF5PGFueT4gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtZDphbnk7XHJcbiAgICAgICAgICAgIGZvciggdmFyIHMgaW4gZGF0YSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1kID0gZGF0YVtzXTtcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLlNoYXJlRGljdFtpdGVtZC5rZXldID0gaXRlbWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGZpcnN0ZDphbnkgPSBkYXRhWzBdO1xyXG4gICAgICAgICAgICB0aGlzLm9uU2hhcmVBcHBNZXNzYWdlKGZpcnN0ZC50aWxlLEdsb2JhbC5jZG51cmwgKyBmaXJzdGQuaW1nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXREYXRhKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBEYXRlQ29udHJvbC5GcmVzaCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlTaGFyZU51bT0wO1xyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bT0wO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURheVNoYXJlSW5mbygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURheVZpZGVvSW5mbygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlTaGFyZU51bT1Mb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmdldG51bShVc2VyRGF0YUluZm8ubm93ZGF5U2hhcmUpO1xyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bT1Mb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmdldG51bShVc2VyRGF0YUluZm8ubm93ZGF5VmlkZW8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlrZjlgqjlvZPlpKnliIbkuqvnmoTkv6Hmga9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZURheVNoYXJlSW5mbygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLm5vd2RheVNoYXJlLFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtLnRvU3RyaW5nKCkgKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZURheVZpZGVvSW5mbygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLm5vd2RheVZpZGVvLFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtLnRvU3RyaW5nKCkgKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVzZXJpbmZvYnV0dG9uO1xyXG4gICAgc3RhdGljIGxvZ2luQ2FsbG9iajphbnk7XHJcbiAgICBzdGF0aWMgbG9naW5zdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBzdGF0aWMgbG9naW5wcm9ncmVzc0NhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIGNyZWF0ZVVzZXJBbmRMb2dpbiggY2FsbG9iajphbnksc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uLHByb2dyZXNzQ2FsbGJhY2s6RnVuY3Rpb24gPW51bGwsIGZhaWxjYWxsYmFjazpGdW5jdGlvbj1udWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5zdWNjZWVkY2FsbGJhY2sgPSBzdWNjZWVkY2FsbGJhY2s7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrID0gcHJvZ3Jlc3NDYWxsYmFjaztcclxuICAgICAgICB2YXIgd3g6YW55ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGV0IGxvZ2luX2luZm86YW55ID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuZ2V0TGF1bmNoT3B0aW9uc1N5bmMoKTtcclxuICAgICAgICAgICAgaWYobG9naW5faW5mbylcclxuICAgICAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBxdWVyeSA9bG9naW5faW5mby5xdWVyeTtcclxuICAgICAgICAgICAgICAgIGlmKHF1ZXJ5ICYmIHF1ZXJ5LkNoYW5JRCl7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uUXVEYW9JRCA9IHF1ZXJ5LkNoYW5JRDtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVmZXJyZXJJbmZvID0gbG9naW5faW5mby5yZWZlcnJlckluZm87XHJcbiAgICAgICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uUXVEYW9JRCA9PSBcIlwiICYmIHJlZmVycmVySW5mbyAmJiByZWZlcnJlckluZm8uYXBwSWQgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLlF1RGFvSUQgPSByZWZlcnJlckluZm8uYXBwSWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoIGxvZ2luX2luZm8uc2NlbmUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmZyb21zY2VuZSA9IE51bWJlciggbG9naW5faW5mby5zY2VuZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBzeXN0ZW1yZXMgPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgICAgICB2YXIgdmVyc2lvbiA9IHN5c3RlbXJlcy5TREtWZXJzaW9uO1xyXG4gICAgICAgICAgICBpZiAod3guZ2V0VXBkYXRlTWFuYWdlcikgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB1cGRhdGVNYW5hZ2VyID0gd3guZ2V0VXBkYXRlTWFuYWdlcigpO1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5vbkNoZWNrRm9yVXBkYXRlKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyDor7fmsYLlrozmlrDniYjmnKzkv6Hmga/nmoTlm57osINcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHJlcy5oYXNVcGRhdGU9PXRydWUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZVJlYWR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd01vZGFsKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+abtOaWsOaPkOekuicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogJ+aWsOeJiOacrOW3sue7j+WHhuWkh+Wlve+8jOaYr+WQpumHjeWQr+W6lOeUqO+8nycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmNvbmZpcm0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaWsOeahOeJiOacrOW3sue7j+S4i+i9veWlve+8jOiwg+eUqCBhcHBseVVwZGF0ZSDlupTnlKjmlrDniYjmnKzlubbph43lkK9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIuYXBwbHlVcGRhdGUoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmV4aXRHYW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZUZhaWxlZChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmlrDniYjmnKzkuIvovb3lpLHotKVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmV4aXRHYW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiggV1hHYW1lUGxhdGZvcm0ubG9naW5DYWxsb2JqICYmIFdYR2FtZVBsYXRmb3JtLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIFdYR2FtZVBsYXRmb3JtLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjay5jYWxsKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmosMTAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLmxvZ2luKGNhbGxvYmosc3VjY2VlZGNhbGxiYWNrLGZhaWxjYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmogJiYgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrIClcclxuICAgICAgICAgICAgICAgIC8vIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICBXWEdhbWVQbGF0Zm9ybS5sb2dpbnByb2dyZXNzQ2FsbGJhY2suY2FsbCggV1hHYW1lUGxhdGZvcm0ubG9naW5DYWxsb2JqLDEwICk7XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbihjYWxsb2JqLHN1Y2NlZWRjYWxsYmFjayxmYWlsY2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVzZXJpbmZvY2FsbG9iajphbnk7XHJcbiAgICB1c2VyaW5mb3N1Y2NhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgdXNlcmluZm9mYWlsY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgY3JlYXRlVXNlckluZm9CdXR0b24oICBjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnVzZXJpbmZvY2FsbG9iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgdGhpcy51c2VyaW5mb3N1Y2NhbGxiYWNrID0gY2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy51c2VyaW5mb2ZhaWxjYWxsYmFjayA9IGZhaWxjYWxsYmFjaztcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGxldCByZXMgPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgIGlmKCByZXMgKVxyXG4gICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBwb3N4Om51bWJlciA9IChyZXMud2luZG93V2lkdGgtMTUxKS8yO1xyXG4gICAgICAgICAgICB2YXIgcG9zeTpudW1iZXIgPSByZXMud2luZG93SGVpZ2h0LTE3MiAtIDQwO1xyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS51c2VyaW5mb2J1dHRvbiA9IHd4LmNyZWF0ZVVzZXJJbmZvQnV0dG9uKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW1hZ2UnLFxyXG4gICAgICAgICAgICAgICAgaW1hZ2U6J3d4bG9jYWwvbG9naW4ucG5nJyxcclxuICAgICAgICAgICAgICAgIHN0eWxlOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IHBvc3gsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBwb3N5LFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxNTEsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA3MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudXNlcmluZm9idXR0b24ub25UYXAoIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnVzZXJpbmZvQnV0dG9uQ2xpY2sgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliKTmlq3mmK/lkKblt7Lnu4/mjojmnYNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldGFjY3JlZGl0KCBjYWxsb2JqOmFueSxhY2NyZWRpdENhbGxiYWNrOkZ1bmN0aW9uICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5hY2NyZWRpdHN0YXRlID09IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICAgICAgaWYoIHd4IClcclxuICAgICAgICAgICAgeyAgIFxyXG4gICAgICAgICAgICAgICAgd3guZ2V0U2V0dGluZyhcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzIChyZXMpIFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1kID0gcmVzLmF1dGhTZXR0aW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggaXRlbWQuaGFzT3duUHJvcGVydHkoIFwic2NvcGUudXNlckluZm9cIiApICYmIGl0ZW1kW1wic2NvcGUudXNlckluZm9cIl0gPT0gdHJ1ZSApIC8v5bey57uP5o6I5p2D6L+HXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFjY3JlZGl0Q2FsbGJhY2smJmNhbGxvYmopXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjcmVkaXRDYWxsYmFjay5jYWxsKCBjYWxsb2JqLHRydWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFjY3JlZGl0Q2FsbGJhY2smJmNhbGxvYmopXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjcmVkaXRDYWxsYmFjay5jYWxsKCBjYWxsb2JqLGZhbHNlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKGFjY3JlZGl0Q2FsbGJhY2smJmNhbGxvYmopXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjcmVkaXRDYWxsYmFjay5jYWxsKCBjYWxsb2JqLHRydWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZihhY2NyZWRpdENhbGxiYWNrJiZjYWxsb2JqKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosdHJ1ZSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1c2VyaW5mb0J1dHRvbkNsaWNrKCByZXM6YW55ICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eHBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XHJcblxyXG4gICAgICAgIGlmKCByZXMgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGVyck1zZzpzdHJpbmcgPSByZXMuZXJyTXNnO1xyXG4gICAgICAgICAgICBpZiggZXJyTXNnID09IFwiZ2V0VXNlckluZm86b2tcIiApXHJcbiAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5hY2NyZWRpdHN0YXRlID0gMTtcclxuICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0uY2xvc2V1c2VyaW5mb2JVdHRvbigpO1xyXG4gICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5nZXRVc2VySW5mbyggZmFsc2Usd3hwbGF0Zm9ybS51c2VyaW5mb2NhbGxvYmosd3hwbGF0Zm9ybS51c2VyaW5mb3N1Y2NhbGxiYWNrLHd4cGxhdGZvcm0udXNlcmluZm9mYWlsY2FsbGJhY2sgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiggd3hwbGF0Zm9ybS51c2VyaW5mb2NhbGxvYmogJiYgd3hwbGF0Zm9ybS51c2VyaW5mb2ZhaWxjYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS51c2VyaW5mb2ZhaWxjYWxsYmFjay5jYWxsKCB3eHBsYXRmb3JtLnVzZXJpbmZvY2FsbG9iaiApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZXVzZXJpbmZvYlV0dG9uKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eHBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XHJcbiAgICAgICAgaWYod3hwbGF0Zm9ybS51c2VyaW5mb2J1dHRvbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9idXR0b24ub2ZmVGFwKHd4cGxhdGZvcm0udXNlcmluZm9CdXR0b25DbGljayk7XHJcbiAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9idXR0b24uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB3eHBsYXRmb3JtLnVzZXJpbmZvYnV0dG9uPW51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRVc2VySW5mbyggaXNsb2dpbjpib29sZWFuLGNhbGxvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LnNob3dNb2RhbFdhaXQoKTtcclxuICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4LmdldFVzZXJJbmZvKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB1c2VySW5mbyA9IHJlcy51c2VySW5mbztcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5uaWNrTmFtZSA9IHVzZXJJbmZvLm5pY2tOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBpc2xvZ2luIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0ubG9naW4oY2FsbG9iaixjYWxsYmFjayxmYWlsY2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsbG9iaiAmJiBjYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoIGNhbGxvYmosV1hHYW1lUGxhdGZvcm0ubmlja05hbWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnmbvlvZVcclxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxyXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcclxuICAgICAqIEBwYXJhbSBmYWlsQ2FsbGJhY2sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2dpbiggY2FsbG9iajphbnksY2FsbGJhY2s6RnVuY3Rpb24sZmFpbGNhbGxiYWNrOkZ1bmN0aW9uICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eHBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5sb2dpbih7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoIHJlcyApIFxyXG4gICAgICAgICAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5jb2RlID0gcmVzLmNvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1kOmFueSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEICE9IFwiXCIgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbWQuQ2hhbklEID0gV1hHYW1lUGxhdGZvcm0uUXVEYW9JRDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbWQuQ29kZSA9IFdYR2FtZVBsYXRmb3JtLmNvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbWQuQXBwSUQgPSBHbG9iYWwuYXBwaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbWQuVmVyc2lvbiA9IEdsb2JhbC5nYW1lVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBmYWlsOmZ1bmN0aW9uKHJlcyl7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0ubG9naW4oIGNhbGxvYmosY2FsbGJhY2ssZmFpbGNhbGxiYWNrICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9naW5TdWNjZWVkQ2FsbGJhY2soIGRhdGE6YW55ICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmogJiYgV1hHYW1lUGxhdGZvcm0ubG9naW5zdWNjZWVkY2FsbGJhY2sgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5zdWNjZWVkY2FsbGJhY2suY2FsbCggV1hHYW1lUGxhdGZvcm0ubG9naW5DYWxsb2JqLGRhdGEgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBfc3ViY2FsbG9iajphbnk7XHJcbiAgICBwdWJsaWMgX3N1YmNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIF91cGRhdGVjYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBfc3ViZmFpbGNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIGxvYWRTdWJwYWNrYWdlKCBuYW1lOnN0cmluZyxzdWJjYWxsb2JqOmFueSxzdWJjYWxsYmFjazpGdW5jdGlvbix1cGRhdGVjYWxsYmFjazpGdW5jdGlvbixzdWJmYWlsY2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fc3ViY2FsbG9iaiA9IHN1YmNhbGxvYmo7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1YmNhbGxiYWNrID0gc3ViY2FsbGJhY2s7XHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWNhbGxiYWNrID0gdXBkYXRlY2FsbGJhY2s7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1YmZhaWxjYWxsYmFjayA9IHN1YmZhaWxjYWxsYmFjaztcclxuICAgICAgICAgICAgdmFyIHd4OmFueSA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgICAgIGlmKCB3eC5sb2FkU3VicGFja2FnZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRUYXNrID0gd3gubG9hZFN1YnBhY2thZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6bmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiG5YyF5Yqg6L295oiQ5Yqf5ZCO6YCa6L+HIHN1Y2Nlc3Mg5Zue6LCDXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3hnYW1lUGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLl9zdWJjYWxsYmFjayAmJiB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbG9iaiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLl9zdWJjYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbG9iaiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBmYWlsOiBmdW5jdGlvbihyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiG5YyF5Yqg6L295aSx6LSl6YCa6L+HIGZhaWwg5Zue6LCDXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0uX3N1YmZhaWxjYWxsYmFjayAmJiB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbG9iaiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLl9zdWJmYWlsY2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pOyAgXHJcbiAgICAgICAgICAgICAgICBpZihsb2FkVGFzay5vblByb2dyZXNzVXBkYXRlKXtcclxuICAgICAgICAgICAgICAgICAgICBsb2FkVGFzay5vblByb2dyZXNzVXBkYXRlKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0uX3VwZGF0ZWNhbGxiYWNrICYmIHd4Z2FtZVBsYXRmb3JtLl9zdWJjYWxsb2JqIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3hnYW1lUGxhdGZvcm0uX3VwZGF0ZWNhbGxiYWNrLmNhbGwoIHd4Z2FtZVBsYXRmb3JtLl9zdWJjYWxsb2JqLHJlcy5wcm9ncmVzcyApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCBzdWJjYWxsb2JqICYmIHN1YmNhbGxiYWNrIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWJjYWxsYmFjay5jYWxsKCBzdWJjYWxsb2JqICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHN1YmNhbGxvYmogJiYgc3ViY2FsbGJhY2sgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdWJjYWxsYmFjay5jYWxsKCBzdWJjYWxsb2JqICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bovazlj5Hor6bnu4bkv6Hmga9cclxuICAgICAqIEBwYXJhbSBvYmogXHJcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcclxuICAgICAqIEBwYXJhbSBzdWNjZWVkY2FsbGJhY2sgXHJcbiAgICAgKiBAcGFyYW0gZmFpbENhbGxiYWNrIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U2hhcmVJbmZvKCBvYmo6YW55LGNhbGxvYmo6YW55LCBzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb24sZmFpbENhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTaGFyZUluZm8oe1xyXG4gICAgICAgICAgICAgICAgc2hhcmVUaWNrZXQ6b2JqLnNoYXJlVGlja2V0LFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlcylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZWVkY2FsbGJhY2suY2FsbCggY2FsbG9iaixyZXMgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnm5HlkKznlKjmiLfngrnlh7vlj7PkuIrop5Loj5zljZXnmoTigJzovazlj5HigJ3mjInpkq7ml7bop6blj5HnmoTkuovku7ZcclxuICAgICAqIEBwYXJhbSB0aXRsZSBcclxuICAgICAqIEBwYXJhbSBpbWFnZVVybCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uU2hhcmVBcHBNZXNzYWdlKCB0aXRsZTpzdHJpbmcsaW1hZ2VVcmw6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25TaGFyZUFwcE1lc3NhZ2UoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTp0aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZVVybDppbWFnZVVybFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS4u+WKqOaLiei1t+i9rOWPke+8jOi/m+WFpemAieaLqemAmuiur+W9leeVjOmdouOAglxyXG4gICAgICogQHBhcmFtIHRpdGxlIFxyXG4gICAgICogQHBhcmFtIGltYWdlVXJsIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hhcmVBcHBNZXNzYWdlKCBkOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNoYXJlQXBwTWVzc2FnZShkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmL7npLrlvZPliY3pobXpnaLnmoTovazlj5HmjInpkq5cclxuICAgICAqIEBwYXJhbSBvYmogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG93U2hhcmVNZW51KCBvYmo6YW55ID0gbnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dTaGFyZU1lbnUob2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmm7TmlrDovazlj5HlsZ7mgKdcclxuICAgICAqIEBwYXJhbSBvYmogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFyZU1lbnUoIG9iajphbnkgPSBudWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gudXBkYXRlU2hhcmVNZW51KG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pi+56S65b2T5YmN6aG16Z2i55qE6L2s5Y+R5oyJ6ZKuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG93TWVudSgpIFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1NoYXJlTWVudSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOacrOWcsOWtmOWCqFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0U3RvcmFnZVN5bmMoa2V5OnN0cmluZywgZGF0YTphbnkpIFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4LnNldFN0b3JhZ2VTeW5jKGtleSwgZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluacrOWcsOWtmOWCqFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN0b3JhZ2VTeW5jKGtleTpzdHJpbmcpOmFueSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gd3guZ2V0U3RvcmFnZVN5bmMoa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFVzZXJDbG91ZFN0b3JhZ2Uob2JqLGNhbGxvYmo6YW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwpIFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4ICYmIHd4LnNldFVzZXJDbG91ZFN0b3JhZ2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3guc2V0VXNlckNsb3VkU3RvcmFnZSh7XHJcbiAgICAgICAgICAgICAgICBLVkRhdGFMaXN0OiBvYmosXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoc3VjY2VlZGNhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmoscmVzICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZihmYWlsQ2FsbGJhY2spXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsQ2FsbGJhY2suY2FsbCggY2FsbG9iaiApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pi+56S65raI5oGv5o+Q56S65qGGXHJcbiAgICAgKiBAcGFyYW0gd29yZCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvYXN0KHdvcmQ6c3RyaW5nKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1RvYXN0KHsgdGl0bGU6IHdvcmQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ZCR5byA5pS+5pWw5o2u5Z+f5Y+R6YCB5raI5oGvXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9zdE1lc3NhZ2Uoc3RyOnN0cmluZyxkYXRhOmFueT1udWxsKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB3eC5nZXRPcGVuRGF0YUNvbnRleHQoKTtcclxuICAgICAgICAgICAgY29udGV4dC5wb3N0TWVzc2FnZSh7IGFjdGlvbjogc3RyLGRhdGE6ZGF0YSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJvlu7rkuIDkuKogSW5uZXJBdWRpb0NvbnRleHQg5a6e5L6LXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVJbm5lckF1ZGlvQ29udGV4dCgpOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZUlubmVyQXVkaW9Db250ZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W57O757uf5L+h5oGvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTeXN0ZW1JbmZvU3luYygpOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6aKE6KeI5Zu+54mH77yM6LCD55So5LmL5ZCO5Lya5Zyo5paw5omT5byA55qE6aG16Z2i5Lit5YWo5bGP6aKE6KeI5Lyg5YWl55qE5Zu+54mH77yM6aKE6KeI55qE6L+H56iL5Lit55So5oi35Y+v5Lul6L+b6KGM5L+d5a2Y5Zu+54mH44CB5Y+R6YCB57uZ5pyL5Y+L562J5pON5L2cXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJldmlld0ltYWdlKG9iaikgXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5wcmV2aWV3SW1hZ2Uob2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnm5HlkKzlsI/muLjmiI/pmpDol4/liLDlkI7lj7Dkuovku7bjgILplIHlsY/jgIHmjIkgSE9NRSDplK7pgIDliLDmoYzpnaLjgIHmmL7npLrlnKjogYrlpKnpobbpg6jnrYnmk43kvZzkvJrop6blj5HmraTkuovku7bjgIJcclxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxyXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSGlkZShjYWxsb2JqOmFueSwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5vbkhpZGUoZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uaXNTaG93aW5nPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYoc3VjY2VlZGNhbGxiYWNrJiZjYWxsb2JqKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2NlZWRjYWxsYmFjay5jYWxsKGNhbGxvYmosIHJlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6L+U5Zue5bCP56iL5bqP5ZCv5Yqo5Y+C5pWwXHJcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcclxuICAgICAqIEBwYXJhbSBzdWNjZWVkY2FsbGJhY2sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRMYXVuY2hPcHRpb25zU3luYygpOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldExhdW5jaE9wdGlvbnNTeW5jKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDpmpDol4/mtojmga/mj5DnpLrmoYZcclxuICAgICAqIEBwYXJhbSBvYmogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoaWRlVG9hc3Qob2JqKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5oaWRlVG9hc3Qob2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmL7npLrmqKHmgIHlr7nor53moYZcclxuICAgICAqIEBwYXJhbSBvYmogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG93TW9kYWwob2JqKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93TW9kYWwob2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIblrZjlgqjmlbDmja5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyU3RvcmFnZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNsZWFyU3RvcmFnZVN5bmMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkvb/miYvmnLrlj5HnlJ/ovoPnn63ml7bpl7TnmoTmjK/liqjvvIgxNSBtc++8iVxyXG4gICAgICogQHBhcmFtIG9iaiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHZpYnJhdGVTaG9ydCgpIFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5pys5Zyw57yT5a2Y5Lit56e76Zmk5oyH5a6aIGtleVxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZVN0b3JhZ2Uoa2V5OnN0cmluZyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gucmVtb3ZlU3RvcmFnZShrZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25BdWRpb0ludGVycnVwdGlvbkJlZ2luKCk6dm9pZHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApe1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uQXVkaW9JbnRlcnJ1cHRpb25CZWdpbihmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgLy8gU291bmRzc01hbmFnZXIuSW5zdGFuY2UucGxheWJnU291bmQoXCJiZ21cIik7XHJcbiAgICAgICAgICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UuQ2xlYXJBbGxTT1VORCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQXVkaW9JbnRlcnJ1cHRpb25FbmQoKTp2b2lke1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4ICl7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25BdWRpb0ludGVycnVwdGlvbkVuZChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHd4Z2FtZXBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB3eGdhbWVwbGF0Zm9ybSx3eGdhbWVwbGF0Zm9ybS5vbkF1ZGlvRW5kQ2FsbGJhY2sgKTtcclxuICAgICAgICAgICAgICAgIExheWEudGltZXIub25jZSggNTAwLHd4Z2FtZXBsYXRmb3JtLHd4Z2FtZXBsYXRmb3JtLm9uQXVkaW9FbmRDYWxsYmFjayApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQXVkaW9FbmRDYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9vbkF1ZGlvSW50ZXJydXB0aW9uRW5kICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgIDlh7rmuLjmiI9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGV4aXRHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4LmV4aXRNaW5pUHJvZ3JhbSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaJk+W8gOWuouacjeWvueivneahhlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkN1c3RvbWVyU2VydmljZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmICh3eClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gd3guZ2V0U3lzdGVtSW5mb1N5bmMoKS5TREtWZXJzaW9uO1xyXG4gICAgICAgICAgICBpZiggR2FtZVV0aWxzLmNvbXBhcmVWZXJzaW9uKHZlcnNpb24sICcyLjAuMycpID49IDAgJiYgd3gub3BlbkN1c3RvbWVyU2VydmljZUNvbnZlcnNhdGlvbiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHd4Lm9wZW5DdXN0b21lclNlcnZpY2VDb252ZXJzYXRpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlQ2FyZDp0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlSW1nOlwiaHR0cHM6Ly9yZXNvdXJjZS41MXlveW95by5jb20vcmVzL3d4c2VuZG1lc3NhZ2VpbWcvc21pLmpwZ1wiXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vIEFsZXJ0VXRpbHMuc2hvd1dvcmRUaXBzKFwi5b2T5YmN5b6u5L+h54mI5pys5LiN5pSv5oyBXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55uR5ZCs5YaF5a2Y5LiN6Laz5ZGK6K2mXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbk1lbW9yeVdhcm5pbmcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggJiYgd3gub25NZW1vcnlXYXJuaW5nIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4Lm9uTWVtb3J5V2FybmluZyhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkVycm9yKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4ICYmIHd4Lm9uRXJyb3IgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3gub25FcnJvcihmdW5jdGlvbiggcmVzICl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqb25FcnJvclwiLHJlcyk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBub3dTaGFyZWluZGV4Om51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbm93c2hhcmVPYmo6YW55O1xyXG4gICAgcHVibGljIG5vd3NoYXJlc3VjY2VlZGZ1bjpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBub3dzaGFyZWZhaWxmdW46RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgbm93c2hhcmVpbmZvOmFueTtcclxuICAgIHB1YmxpYyBzdGFydFNoYXJlVGltZTpudW1iZXI7XHJcbiAgICBwdWJsaWMgaXNTaGFyZWluZzpib29sZWFuID0gZmFsc2U7XHJcbiAgICBzdGF0aWMgY2FsbGJhY2tmYWlsc3RhdGU6bnVtYmVyID0gMDtcclxuICAgIC8qKlxyXG4gICAgICog5byA5aeL5YiG5LqrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGFydFNoYXJlQXBwKGtleTpzdHJpbmcsY2FsbG9iajphbnk9bnVsbCxzdWNjZWVkQ2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsQ2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubm93U2hhcmVpbmRleD0wO1xyXG4gICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5TaGFyZURpY3Rba2V5XSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNoYXJlQXBwKCBXWEdhbWVQbGF0Zm9ybS5TaGFyZURpY3Rba2V5XSxjYWxsb2JqLHN1Y2NlZWRDYWxsYmFjayxmYWlsQ2FsbGJhY2sgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzaGFyZUFwcChpbmZvOmFueSxjYWxsb2JqOmFueSwgc3VjY2VzczogRnVuY3Rpb24sZmFpbENhbGxiYWNrOkZ1bmN0aW9uKSBcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5vd3NoYXJlT2JqID0gY2FsbG9iajtcclxuICAgICAgICB0aGlzLm5vd3NoYXJlaW5mbyA9IGluZm87XHJcbiAgICAgICAgdGhpcy5ub3dzaGFyZXN1Y2NlZWRmdW4gPSBzdWNjZXNzO1xyXG4gICAgICAgIHRoaXMubm93c2hhcmVmYWlsZnVuID0gZmFpbENhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuc3RhcnRTaGFyZVRpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgdGhpcy5pc1NoYXJlaW5nID0gdHJ1ZTtcclxuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5jYWxsYmFja2ZhaWxzdGF0ZSA9IDA7XHJcbiAgICAgICAgdGhpcy5zaGFyZUFwcE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICB0aXRsZTppbmZvLnRpbGUsaW1hZ2VVcmw6R2xvYmFsLmNkbnVybCArIGluZm8uaW1nLHF1ZXJ5OlwiXCIsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24gKHJlcylcclxuICAgICAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgfSwgXHJcbiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChyZXMpe1xyXG4gICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyhcIuaCqOWPlua2iOS6huWIhuS6q1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsQ2FsbGJhY2sgJiYgY2FsbG9iaiApIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGZhaWxDYWxsYmFjay5jYWxsKGNhbGxvYmopO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBcclxuICAgICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5jYWxsYmFja2ZhaWxzdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgICAgIFxyXG5cclxuICAgIHB1YmxpYyBzaG93b2JqOmFueTtcclxuICAgIHB1YmxpYyBzaG93Q2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICAvKipcclxuICAgICAqIOebkeWQrOWwj+a4uOaIj+WbnuWIsOWJjeWPsOeahOS6i+S7tlxyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxyXG4gICAgICogQHBhcmFtIGZhaWxDYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uU2hvdyhjYWxsb2JqOmFueT1udWxsLCBzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsQ2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsKSBcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNob3dvYmogPSBjYWxsb2JqO1xyXG4gICAgICAgIHRoaXMuc2hvd0NhbGxiYWNrID0gc3VjY2VlZGNhbGxiYWNrO1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4Lm9uU2hvdyhmdW5jdGlvbiAocmVzKSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uaXNTaG93aW5nPXRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoIHJlcyAmJiByZXMuc2NlbmUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmZyb21zY2VuZSA9IE51bWJlciggcmVzLnNjZW5lICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLmZyYW1lT25jZSggMSxXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZSxXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5vblNob3dTdWNjZWVkICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TaG93U3VjY2VlZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3hnYW1lcGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcclxuICAgICAgICBpZiggd3hnYW1lcGxhdGZvcm0uc2hvd29iaiAmJiB3eGdhbWVwbGF0Zm9ybS5zaG93Q2FsbGJhY2sgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0uc2hvd0NhbGxiYWNrLmNhbGwoIHd4Z2FtZXBsYXRmb3JtLnNob3dvYmogKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHd4Z2FtZXBsYXRmb3JtLmlzU2hhcmVpbmcgKSAvL+WmguaenOaYr+WIhuS6q+eKtuaAgVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0uaXNTaGFyZWluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YXIgaXNTaGFyZVN1Y2NlZWQ6Ym9vbGVhbj1mYWxzZTtcclxuICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmNhbGxiYWNrZmFpbHN0YXRlPT0wICkgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBub3dUaW1lOm51bWJlciA9TGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRpc1RpbWU6bnVtYmVyID0obm93VGltZSAtIHd4Z2FtZXBsYXRmb3JtLnN0YXJ0U2hhcmVUaW1lKS8xMDAwO1xyXG4gICAgICAgICAgICAgICAgaWYoIGRpc1RpbWU+PVdYR2FtZVBsYXRmb3JtLlNoYXJlVGltZSB8fCBXWEdhbWVQbGF0Zm9ybS5ub3dTaGFyZWluZGV4ID49IDMgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzU2hhcmVTdWNjZWVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5jYWxsYmFja2ZhaWxzdGF0ZT0wO1xyXG4gICAgICAgICAgICBpZiggaXNTaGFyZVN1Y2NlZWQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlTaGFyZU51bSsrO1xyXG4gICAgICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0udXBkYXRlRGF5U2hhcmVJbmZvKCk7XHJcbiAgICAgICAgICAgICAgICBpZiggd3hnYW1lcGxhdGZvcm0ubm93c2hhcmVPYmogJiYgd3hnYW1lcGxhdGZvcm0ubm93c2hhcmVzdWNjZWVkZnVuIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZXN1Y2NlZWRmdW4uY2FsbCggd3hnYW1lcGxhdGZvcm0ubm93c2hhcmVPYmogKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLm5vd1NoYXJlaW5kZXgrKztcclxuICAgICAgICAgICAgICAgIHd4Z2FtZXBsYXRmb3JtLnNob3dNb2RhbChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCLmj5DnpLpcIiwgY29udGVudDogXCLor7fmr4/mrKHliIbkuqvliLDkuI3lkIznvqQs5piv5ZCm6YeN5paw5YiG5Lqr77yfXCIsIHNob3dDYW5jZWw6IHRydWUsIGNhbmNlbFRleHQ6ICflj5bmtognLCBjb25maXJtVGV4dDogJ+ehruWumicsXHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlcylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eHBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuY29uZmlybSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnNoYXJlQXBwKCB3eHBsYXRmb3JtLm5vd3NoYXJlaW5mbyx3eHBsYXRmb3JtLm5vd3NoYXJlT2JqLHd4cGxhdGZvcm0ubm93c2hhcmVzdWNjZWVkZnVuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0ubm93c2hhcmVmYWlsZnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3eHBsYXRmb3JtLm5vd3NoYXJlZmFpbGZ1biAmJiB3eHBsYXRmb3JtLm5vd3NoYXJlT2JqIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLm5vd3NoYXJlZmFpbGZ1bi5jYWxsKCB3eHBsYXRmb3JtLm5vd3NoYXJlT2JqICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCBcclxuICAgICAgICAgICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAoKSBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ZnVuY3Rpb24oKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGxhc3RWaWRlb1RpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgdmlkZW9BZDtcclxuICAgIHB1YmxpYyB2aWRlb2NhbGxvYmo6YW55O1xyXG4gICAgcHVibGljIHZpZGVvc3VjY2VlZENhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHJpdmF0ZSB2aWRlb2ZhaWxDYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBub3d2aWRlb2tleTpzdHJpbmc7XHJcbiAgICAgLyoqXHJcbiAgICAgKiDop4bpopHmmK/lkKblnKjmkq3mlL7kuK1cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHZpZGVvcGxheWluZzpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc3RhdGljIGlzdG9uZ2ppVmlkZW9OdW06Ym9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnnIvop4bpopHpooblpZblirFcclxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxyXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBsYXlWaWRlbygga2V5OnN0cmluZywgY2FsbG9iajphbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uPW51bGwsaXN0b25namlOdW06Ym9vbGVhbiA9IHRydWUgKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4ICYmIHd4LmNyZWF0ZVJld2FyZGVkVmlkZW9BZCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggIVdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB0aW1lOm51bWJlciA9IHRoaXMubG9ja1ZpZGVvTGVmdFRpbWUoKTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aW1lID4gMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLlub/lkYrlsJrmnKrlh4blpIflpb3vvIzor7dcIisgdGltZSArXCLnp5LlkI7lho3or5VcIiApO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2xvc2Vmb2N1cyApO1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uaXN0b25namlWaWRlb051bSA9IGlzdG9uZ2ppTnVtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3d2aWRlb2tleSA9IGtleTtcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZz10cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb2NhbGxvYmogPSBjYWxsb2JqO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb3N1Y2NlZWRDYWxsYmFjayA9IHN1Y2NlZWRjYWxsYmFjaztcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9mYWlsQ2FsbGJhY2sgPSBmYWlsQ2FsbGJhY2s7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvQWQgPSB3eC5jcmVhdGVSZXdhcmRlZFZpZGVvQWQoXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWRVbml0SWQ6J2FkdW5pdC0wYzY4NzA4NGM5MDhlZTg5J1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvQWQub25DbG9zZSh0aGlzLmNsb3NlQUQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkLm9uRXJyb3IoIHRoaXMub25lcnJvICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvQWQubG9hZCgpLnRoZW4oKCkgPT4gdGhpcy52aWRlb0FkLnNob3coKSkuY2F0Y2goZXJyID0+IHsgY29uc29sZS5sb2coZXJyLmVyck1zZyksV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuZmFpbFZpZGVvKCkgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9ja1ZpZGVvTGVmdFRpbWUoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICB2YXIgdGltZTpudW1iZXIgPSAoTGF5YS5Ccm93c2VyLm5vdygpLVdYR2FtZVBsYXRmb3JtLmxhc3RWaWRlb1RpbWUpLzEwMDA7IFxyXG4gICAgICAgIHRpbWUgPSBXWEdhbWVQbGF0Zm9ybS5WaWRlb1RpbWUgLSB0aW1lO1xyXG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwodGltZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgb25lcnJvKHJlcyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZz1mYWxzZTtcclxuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkVycm9yKHd4Z2FtZVBsYXRmb3JtLm9uZXJybyk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxyXG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmQ2xvc2Uod3hnYW1lUGxhdGZvcm0uY2xvc2VBRCk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2dldGZvY3VzICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5YWz6Zet5bm/5ZGKXHJcbiAgICBwdWJsaWMgY2xvc2VBRChzdGF0dXMpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5sYXN0VmlkZW9UaW1lID0gTGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgIGlmIChzdGF0dXMgJiYgc3RhdHVzLmlzRW5kZWQgfHwgc3RhdHVzID09IHVuZGVmaW5lZCkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uaXN0b25namlWaWRlb051bSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtKys7XHJcbiAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS51cGRhdGVEYXlWaWRlb0luZm8oKTtcclxuICAgICAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX3VwZGF0ZVZpZGVvTnVtcyApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogJiYgd3hnYW1lUGxhdGZvcm0udmlkZW9zdWNjZWVkQ2FsbGJhY2sgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb3N1Y2NlZWRDYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gXHJcbiAgICAgICAgZWxzZSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi5pyq6KeC55yL5a6M5pW06KeG6aKR77yM5peg5rOV6I635b6X5aWW5YqxXCIgKTtcclxuICAgICAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiAmJiB3eGdhbWVQbGF0Zm9ybS52aWRlb2ZhaWxDYWxsYmFjayApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvZmFpbENhbGxiYWNrLmNhbGwoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZz1mYWxzZTtcclxuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkVycm9yKHd4Z2FtZVBsYXRmb3JtLm9uZXJybyk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxyXG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmQ2xvc2Uod3hnYW1lUGxhdGZvcm0uY2xvc2VBRCk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2dldGZvY3VzICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5bm/5ZGK5aSx6LSlXHJcbiAgICBwdWJsaWMgZmFpbFZpZGVvKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxhc3RWaWRlb1RpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0udmlkZW9wbGF5aW5nPWZhbHNlO1xyXG4gICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi5bm/5ZGK5Yqg6L295aSx6LSlLOivleivleWIq+eahOaWueW8j+WQp35cIiApO1xyXG4gICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmRXJyb3Iod3hnYW1lUGxhdGZvcm0ub25lcnJvKTsgLy/np7vpmaQg5LiN54S26KKr5aSa5qyh6LCD55SoXHJcbiAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9BZC5vZmZDbG9zZSh3eGdhbWVQbGF0Zm9ybS5jbG9zZUFEKTsgLy/np7vpmaQg5LiN54S26KKr5aSa5qyh6LCD55SoXHJcbiAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiAmJiB3eGdhbWVQbGF0Zm9ybS52aWRlb2ZhaWxDYWxsYmFjayApIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9mYWlsQ2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0udmlkZW9jYWxsb2JqICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2dldGZvY3VzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzQ2FuVmlkZW8oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtIDwgV1hHYW1lUGxhdGZvcm0uVmlkZW9OdW0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtID09IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdmlkZW9iczpudW1iZXIgPSBNYXRoLmZsb29yKFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtL1dYR2FtZVBsYXRmb3JtLlZpZGVvdG9TaGFyZSk7XHJcbiAgICAgICAgICAgIHZhciBzaGFyZWJzOm51bWJlciA9IE1hdGguZmxvb3IoV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW0vV1hHYW1lUGxhdGZvcm0uU2hhcmV0b1ZpZGVvKTtcclxuICAgICAgICAgICAgaWYoIHZpZGVvYnMgPiBzaGFyZWJzIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHZpZGVvYnMgPCBzaGFyZWJzIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmlkZW95dXNodTpudW1iZXIgPSBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bSVXWEdhbWVQbGF0Zm9ybS5WaWRlb3RvU2hhcmU7XHJcbiAgICAgICAgICAgICAgICBpZiggdmlkZW95dXNodSAhPSAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBzaGFyZXl1c2h1Om51bWJlciA9IFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtJVdYR2FtZVBsYXRmb3JtLlNoYXJldG9WaWRlbztcclxuICAgICAgICAgICAgICAgIGlmKCBzaGFyZXl1c2h1ICE9IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJhbm5lclJ1blRpbWU6bnVtYmVyPTA7XHJcbiAgICBwcml2YXRlIGJhbm5lckFkO1xyXG4gICAgcHVibGljIG5vd1N0eXBlOmFueTtcclxuICAgIHByaXZhdGUgX2Jhbm5lclR5cGVMaXN0OkFycmF5PGFueT4gPSBbXTtcclxuICAgIHB1YmxpYyBjcmVhdGVCYW5uZXIoIGJhbm5lcnR5cGU6c3RyaW5nPVwiXCIsc3R5bGU6YW55KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIGJhbm5lcnR5cGUgIT0gXCJcIiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBibzpib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IoIHZhciBpOm51bWJlciA9IDA7aSA8IHRoaXMuX2Jhbm5lclR5cGVMaXN0Lmxlbmd0aDtpKysgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBiYW5uZXJ0eXBlID09IHRoaXMuX2Jhbm5lclR5cGVMaXN0W2ldLnR5cGUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmFubmVyVHlwZUxpc3RbaV0uc3R5bGUgPSBzdHlsZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFycjpBcnJheTxhbnk+ID0gdGhpcy5fYmFubmVyVHlwZUxpc3Quc3BsaWNlKCBpLDEgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmFubmVyVHlwZUxpc3QucHVzaCggYXJyWzBdICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoICFibyApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmFubmVyVHlwZUxpc3QucHVzaCggeyB0eXBlOmJhbm5lcnR5cGUsc3R5bGU6c3R5bGUgfSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX2Jhbm5lclR5cGVMaXN0Lmxlbmd0aD09MCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtOmFueSA9IHRoaXMuX2Jhbm5lclR5cGVMaXN0W3RoaXMuX2Jhbm5lclR5cGVMaXN0Lmxlbmd0aC0xXTtcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IGl0ZW0uc3R5bGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuYmFubmVyQWQpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbm93ID0gTGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgLy/otoXov4cz5YiG6ZKf5Yi35pawXHJcbiAgICAgICAgICAgICAgICBpZiAobm93IC0gdGhpcy5iYW5uZXJSdW5UaW1lID4gNjAwMDAgKiAzKSBcclxuICAgICAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5vZmZFcnJvcih0aGlzLmJhbm5lckVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLm9mZlJlc2l6ZSh0aGlzLmJhbm5lclJlc2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5kZXN0b3J5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVOZXdCYW5uZXIoc3R5bGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Jhbm5lcihzdHlsZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTmV3QmFubmVyKHN0eWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9zY3JlZW53aWR0aDpudW1iZXIgPSAwO1xyXG4gICAgYmFubmVyaGVpZ2h0Om51bWJlciA9IDA7XHJcbiAgICBiYW5uZXJ3aWR0aDpudW1iZXIgPSAwO1xyXG4gICAgaXNvblJlc2l6ZTpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVOZXdCYW5uZXIoc3R5bGU6IGFueSkge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4ICYmIHd4LmNyZWF0ZUJhbm5lckFkIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93U3R5cGUgPSBzdHlsZTtcclxuICAgICAgICAgICAgdGhpcy5iYW5uZXJSdW5UaW1lID0gTGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgICAgICB2YXIgaW5mbyA9IHRoaXMuZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgICAgICAgICAgdGhpcy5fc2NyZWVud2lkdGggPSBpbmZvLnNjcmVlbldpZHRoO1xyXG4gICAgICAgICAgICB2YXIgc2NhbGU6bnVtYmVyID0gMTtcclxuICAgICAgICAgICAgaWYoIHN0eWxlLmhhc093blByb3BlcnR5KFwic2NhbGVcIikgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzY2FsZSA9IHN0eWxlLnNjYWxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYmFubmVyQWQgPSB3eC5jcmVhdGVCYW5uZXJBZCh7XHJcbiAgICAgICAgICAgICAgICBhZFVuaXRJZDogJ2FkdW5pdC04YzJkNTg2MTM1ZmE2ZDRmJyxcclxuICAgICAgICAgICAgICAgIGFkSW50ZXJ2YWxzOjMwLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogaW5mby5zY3JlZW5IZWlnaHQgLSAxMDUsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGluZm8uc2NyZWVuV2lkdGggKiBzY2FsZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYmFubmVyQWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQub25FcnJvcih0aGlzLmJhbm5lckVycm9yKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Jhbm5lcihzdHlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiYW5uZXJSZXNpemUoIHJlcyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgc2VsZiA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgIHNlbGYuYmFubmVyQWQub2ZmUmVzaXplKHNlbGYuYmFubmVyUmVzaXplKTtcclxuICAgICAgICBzZWxmLmlzb25SZXNpemUgPSBmYWxzZTtcclxuICAgICAgICB2YXIgbm93c3R5cGU6YW55ID0gc2VsZi5ub3dTdHlwZTtcclxuICAgICAgICBpZiggIW5vd3N0eXBlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGluZm8gPSBzZWxmLmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgdmFyIHBlcmNlbnRhZ2VIOm51bWJlciA9IExheWEuQnJvd3Nlci5jbGllbnRIZWlnaHQvTGF5YS5zdGFnZS5kaXNwbGF5SGVpZ2h0O1xyXG4gICAgICAgIHZhciBwZXJjZW50YWdlVzpudW1iZXIgPSBMYXlhLkJyb3dzZXIuY2xpZW50V2lkdGgvTGF5YS5zdGFnZS5kaXNwbGF5V2lkdGg7XHJcbiAgICAgICAgc2VsZi5iYW5uZXJ3aWR0aCA9IHJlcy53aWR0aDtcclxuICAgICAgICBzZWxmLmJhbm5lcmhlaWdodCA9IHJlcy5oZWlnaHQ7XHJcbiAgICAgICAgaWYoIG5vd3N0eXBlLmhhc093blByb3BlcnR5KFwieFwiKSAmJiBub3dzdHlwZS54ICE9IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2VsZi5iYW5uZXJBZC5zdHlsZS5sZWZ0ID0gbm93c3R5cGUueCAqIHBlcmNlbnRhZ2VXO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzZWxmLmJhbm5lckFkLnN0eWxlLmxlZnQgPSAoaW5mby53aW5kb3dXaWR0aCAtIHJlcy53aWR0aCkgKiAwLjU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInlcIikgJiYgbm93c3R5cGUueSAhPSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNlbGYuYmFubmVyQWQuc3R5bGUudG9wID0gbm93c3R5cGUueSAqIHBlcmNlbnRhZ2VIO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzZWxmLmJhbm5lckFkLnN0eWxlLnRvcCA9IChpbmZvLndpbmRvd0hlaWdodCAtIHJlcy5oZWlnaHQpIC0gMTU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmFubmVyRXJyb3IoZXJyOmFueSk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNob3dCYW5uZXIoIHN0eWxlICkge1xyXG4gICAgICAgIGlmICh0aGlzLmJhbm5lckFkKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93U3R5cGUgPSBzdHlsZTtcclxuICAgICAgICAgICAgdmFyIGluZm8gPSB0aGlzLmdldFN5c3RlbUluZm9TeW5jKCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgbm93c3R5cGU6YW55ID0gdGhpcy5ub3dTdHlwZTtcclxuICAgICAgICAgICAgdmFyIHNjYWxlOm51bWJlciA9IDE7XHJcbiAgICAgICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInNjYWxlXCIpIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2NhbGUgPSBub3dzdHlwZS5zY2FsZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcGVyY2VudGFnZUg6bnVtYmVyID0gTGF5YS5Ccm93c2VyLmNsaWVudEhlaWdodC9MYXlhLnN0YWdlLmRpc3BsYXlIZWlnaHQ7XHJcbiAgICAgICAgICAgIHZhciBwZXJjZW50YWdlVzpudW1iZXIgPSBMYXlhLkJyb3dzZXIuY2xpZW50V2lkdGgvTGF5YS5zdGFnZS5kaXNwbGF5V2lkdGg7XHJcbiAgICAgICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInhcIikgJiYgbm93c3R5cGUueCAhPSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5zdHlsZS5sZWZ0ID0gbm93c3R5cGUueCAqIHBlcmNlbnRhZ2VXO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5zdHlsZS5sZWZ0ID0gKGluZm8ud2luZG93V2lkdGggLSB0aGlzLmJhbm5lcndpZHRoKSAqIDAuNTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggbm93c3R5cGUuaGFzT3duUHJvcGVydHkoXCJ5XCIpICYmIG5vd3N0eXBlLnkgIT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuc3R5bGUudG9wID0gbm93c3R5cGUueSAqIHBlcmNlbnRhZ2VIO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5zdHlsZS50b3AgPSAoaW5mby53aW5kb3dIZWlnaHQgLSB0aGlzLmJhbm5lcmhlaWdodCkgLSAxNTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLndpZHRoID0gaW5mby5zY3JlZW5XaWR0aCAqIHNjYWxlO1xyXG4gICAgICAgICAgICBpZiggIXRoaXMuaXNvblJlc2l6ZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNvblJlc2l6ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLm9uUmVzaXplKHRoaXMuYmFubmVyUmVzaXplKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmJhbm5lckFkLnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhpZGVCYW5uZXIoIHR5cGU6c3RyaW5nID0gXCJcIiApIHtcclxuICAgICAgICBpZiAodGhpcy5iYW5uZXJBZCkge1xyXG4gICAgICAgICAgICB0aGlzLmJhbm5lckFkLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHR5cGUgIT0gXCJcIiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IoIHZhciBpOm51bWJlciA9IDA7aSA8IHRoaXMuX2Jhbm5lclR5cGVMaXN0Lmxlbmd0aDtpKysgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdHlwZSA9PSB0aGlzLl9iYW5uZXJUeXBlTGlzdFtpXS50eXBlIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYW5uZXJUeXBlTGlzdC5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9iYW5uZXJUeXBlTGlzdC5sZW5ndGggPiAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW06YW55ID0gdGhpcy5fYmFubmVyVHlwZUxpc3RbdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVCYW5uZXIoIGl0ZW0udHlwZSxpdGVtLnN0eWxlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjpLooYzmppzmiZPlvIDnsbvlnovlrZjlgqhcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb3BlbnJhbmtEaWN0OmFueT17fTtcclxuICAgIC8vIHByaXZhdGUgX3d4T3BlbkRhdGFWaWV3ZXI6V1hPcGVuRGF0YVZpZXdlcjtcclxuICAgIC8qKlxyXG4gICAgICog5omT5byA5aW95Y+L5o6S6KGM5qacXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvcGVuRnJpZW5kUmFuayggdHlwZTpzdHJpbmcsdmlld1R5cGU6c3RyaW5nLHJlY3Q6TGF5YS5SZWN0YW5nbGUscGFyZW50OkxheWEuU3ByaXRlID0gbnVsbCxkYXRhOmFueSA9IG51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jbG9zZXppeXVTdGFnZSgpO1xyXG4gICAgICAgIHRoaXMuX29wZW5yYW5rRGljdFt2aWV3VHlwZV0gPSB7dHlwZTp0eXBlLHZpZXdUeXBlOnZpZXdUeXBlLHJlY3Q6cmVjdCxwYXJlbnQ6cGFyZW50LGRhdGE6ZGF0YX07XHJcbiAgICAgICAgdGhpcy5pbml0eml5dVN0YWdlKHJlY3QscGFyZW50KTtcclxuICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKCB0eXBlLGRhdGEgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaOkuihjOamnOaJk+W8gOeKtuaAgeaXtuWAme+8jOWIh+aNouaYvuekuuexu+Wei1xyXG4gICAgICogQHBhcmFtIHR5cGUgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjaGFuZ2VGcmllbmRSYW5rKCB0eXBlOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKCB0eXBlICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjpLooYzmppzkuIrkuIDpobVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByZVBhZ2VSYW5rKCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaOkuihjOamnOS4i+S4gOmhtVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmV4dFBhZ2VSYW5rKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YWz6Zet5aW95Y+L5o6S6KGM5qacXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbG9zZUZyaWVuZFJhbmsoIHZpZXdUeXBlOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICAgICAgdGhpcy5jbG9zZXppeXVTdGFnZSgpO1xyXG4gICAgICAgIGlmKCB0aGlzLl9vcGVucmFua0RpY3Rbdmlld1R5cGVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9vcGVucmFua0RpY3Rbdmlld1R5cGVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IoIHZhciBzIGluIHRoaXMuX29wZW5yYW5rRGljdCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaXRlbWQ6YW55ID0gdGhpcy5fb3BlbnJhbmtEaWN0W3NdO1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5GcmllbmRSYW5rKCBpdGVtZC50eXBlLGl0ZW1kLnZpZXdUeXBlLGl0ZW1kLnJlY3QsaXRlbWQucGFyZW50LGl0ZW1kLmRhdGEgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5a2Q5Z+fXHJcbiAgICAgKiBAcGFyYW0gcmVjdCBcclxuICAgICAqIEBwYXJhbSBwYXJlbnQgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdHppeXVTdGFnZSggcmVjdDpMYXlhLlJlY3RhbmdsZSxwYXJlbnQ6TGF5YS5TcHJpdGUgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gaWYoICF0aGlzLl93eE9wZW5EYXRhVmlld2VyIClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIgPSBuZXcgV1hPcGVuRGF0YVZpZXdlcigpO1xyXG4gICAgICAgIC8vICAgICBpZiggcGFyZW50IClcclxuICAgICAgICAvLyAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgcGFyZW50LmFkZENoaWxkKCB0aGlzLl93eE9wZW5EYXRhVmlld2VyICk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgZWxzZVxyXG4gICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICBHYW1lTGF5ZXJNYW5hZ2VyLkluc3RhbmNlLnRvcExheWVyLmRpc3BsYXlPYmplY3QuYWRkQ2hpbGQoIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIgKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyB0aGlzLl93eE9wZW5EYXRhVmlld2VyLnggPSByZWN0Lng7XHJcbiAgICAgICAgLy8gdGhpcy5fd3hPcGVuRGF0YVZpZXdlci55ID0gcmVjdC55O1xyXG4gICAgICAgIC8vIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIud2lkdGggPSByZWN0LndpZHRoO1xyXG4gICAgICAgIC8vIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIuaGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDplIDmr4HlrZDln59cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjbG9zZXppeXVTdGFnZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAvLyBpZiggdGhpcy5fd3hPcGVuRGF0YVZpZXdlciApXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLl93eE9wZW5EYXRhVmlld2VyLmRlc3Ryb3koKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5fd3hPcGVuRGF0YVZpZXdlci5yZW1vdmVTZWxmKCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIgPSBudWxsO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaVsOaNruS4iuS8oO+8iOeUqOS6juaOkuihjOamnOaVsOaNruaYvuekuu+8iVxyXG4gICAgICogQHBhcmFtIHBhcmFtMSDkuIrmiqXmlbDmja5cclxuICAgICAqIEBwYXJhbSBwYXJhbTIg5LiK5oql5pWw5o2uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdG9yZVRvQ2xvdWQocGFyYW0xOm51bWJlcixwYXJhbTI6bnVtYmVyKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNhY2hlTWFnZXI6TG9jYWxEYXRhQ29udHJvbCA9IExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2U7XHJcbiAgICAgICAgdmFyIHNjb3JlMTpudW1iZXIgPSBjYWNoZU1hZ2VyLmdldG51bSggXCJwYXJhbTFcIiApO1xyXG4gICAgICAgIC8vIHZhciBzY29yZTI6bnVtYmVyID0gY2FjaGVNYWdlci5nZXRudW0oIFwicGFyYW0yXCIgKTtcclxuICAgICAgICBwYXJhbTEgPSBNYXRoLmZsb29yKHBhcmFtMSk7XHJcbiAgICAgICAgcGFyYW0yID0gTWF0aC5mbG9vcihwYXJhbTIpO1xyXG4gICAgICAgIHZhciByZXN1bHQxOm51bWJlciA9IHBhcmFtMTtcclxuICAgICAgICB2YXIgcmVzdWx0MjpudW1iZXIgPSBwYXJhbTI7XHJcblxyXG4gICAgICAgIGlmKCByZXN1bHQxIDwgc2NvcmUxIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlc3VsdDEgPSBzY29yZTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhY2hlTWFnZXIuYWRkc3RyKCBcInBhcmFtMVwiLHJlc3VsdDEudG9TdHJpbmcoKSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICBhcnIucHVzaCggeyBrZXk6XCJwYXJhbTFcIix2YWx1ZTpyZXN1bHQxLnRvU3RyaW5nKCkgfSApO1xyXG4gICAgICAgIGFyci5wdXNoKCB7IGtleTpcInBhcmFtMlwiLHZhbHVlOnJlc3VsdDIgKyBcIlwiIH0gKTtcclxuICAgICAgICB0aGlzLnNldFVzZXJDbG91ZFN0b3JhZ2UoYXJyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2FtZWNsdWJCdXR0b246YW55O1xyXG4gICAgcHVibGljIGNyZWF0ZUdhbWVDbHViQnV0dG9uKCBzdHlsZTphbnksaWNvbjpzdHJpbmcgPSBcImdyZWVuXCIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4OmFueSA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4ICYmIHN0eWxlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN0eWxlLndpZHRoID0gNDA7XHJcbiAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IDQwO1xyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nYW1lY2x1YkJ1dHRvbiA9IHd4LmNyZWF0ZUdhbWVDbHViQnV0dG9uKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGljb246IGljb24sXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgaWYoV1hHYW1lUGxhdGZvcm0uZ2FtZWNsdWJCdXR0b24pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdhbWVjbHViQnV0dG9uLnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgIH1cclxufVxyXG5cclxuIiwiaW1wb3J0IHtXWEdhbWVQbGF0Zm9ybX0gZnJvbSBcIi4uL1dYU0RLL1dYR2FtZVBsYXRmb3JtXCI7XHJcbmltcG9ydCB7UGxhdGZyb21UeXBlfSBmcm9tIFwiLi9QbGF0ZnJvbVR5cGVcIjtcclxuaW1wb3J0IHtXRUNIQVRFVkVOVH0gZnJvbSBcIi4uL1dYU0RLL1dFQ0hBVEVWRU5UXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHsgVGltZXNUYW1wZXIgfSBmcm9tIFwiLi4vVGltZS9UaW1lc1RhbXBlclwiO1xyXG5pbXBvcnQge0RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9EYXRlQ29udHJvbFwiO1xyXG5pbXBvcnQge0F1ZGlvQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvQXVkaW9Db250cm9sXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi8gXHJcbmV4cG9ydCBjbGFzcyBwaW5ndGFpdXRpbHNcclxue1xyXG4gICAgcHJpdmF0ZSBfaXNlbmFibGU6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKblkIjop4RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNsZWdhbDpudW1iZXIgPSAwO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBwaW5ndGFpdXRpbHMuaW5zID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6IHBpbmd0YWl1dGlscztcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBwaW5ndGFpdXRpbHMge1xyXG4gICAgICAgIGlmIChwaW5ndGFpdXRpbHMuaW5zID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBwaW5ndGFpdXRpbHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBpbmd0YWl1dGlscy5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJ3lp4vljJblubPlj7BcclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaXRQbGF0ZnJvbSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy50dCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHbG9iYWwubm93cGxhdGZyb20gPSBQbGF0ZnJvbVR5cGUudHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKExheWEuQnJvd3Nlci53aW5kb3cud3gpIC8v5b6u5L+h5bCP5ri45oiPXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHbG9iYWwubm93cGxhdGZyb20gPSBQbGF0ZnJvbVR5cGUud3g7XHJcbiAgICAgICAgfSBcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHbG9iYWwubm93cGxhdGZyb20gPSBQbGF0ZnJvbVR5cGUucGM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZCBcclxuICAgIHtcclxuICAgICAgICB0aGlzLmluaXRQbGF0ZnJvbSgpO1xyXG4gICAgICAgIC8vIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuaW5pdCgpO1xyXG4gICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAvLyAgICAgY2FzZSBQbGF0ZnJvbVR5cGUucXE6XHJcbiAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgIC8vICAgICBkZWZhdWx0OlxyXG4gICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gdGhpcy5vblNob3coIHRoaXMsdGhpcy5zaG93Y2FsbGJhY2sgKTtcclxuICAgICAgICAvLyB0aGlzLm9uSGlkZSh0aGlzLHRoaXMuaGlkZWNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXREYXRhKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERhdGVDb250cm9sLkluc3RhbmNlLlNldFNlbGYoKTtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmluaXREYXRhKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlkIjov53op4TliKTmlq0gdHJ1Ze+8muWQiOinhO+8jGZhbHNlOui/neinhFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrRW5hYmxlKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIGlmIChwaW5ndGFpdXRpbHMuaXNsZWdhbCA9PSAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9sb2dpbmNhbGxvYmo6YW55O1xyXG4gICAgcHJpdmF0ZSBfbG9naW5zdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgbG9naW4oIGNhbGxvYmo6YW55PW51bGwsc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwscHJvZ3Jlc3NDYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxjYWxsYmFjazpGdW5jdGlvbiA9IG51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICAgICAgdGhpcy5fbG9naW5jYWxsb2JqID0gY2FsbG9iajtcclxuICAgICAgICB0aGlzLl9sb2dpbnN1Y2NlZWRjYWxsYmFjayA9IHN1Y2NlZWRjYWxsYmFjaztcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNyZWF0ZVVzZXJBbmRMb2dpbih0aGlzLHRoaXMubG9naW5TdWNjZWVkLHRoaXMubG9naW5wcm9ncmVzc0NhbGxiYWNrLHRoaXMubG9naW5mYWlsY2FsbGJhY2spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRoaXMubG9naW5TdWNjZWVkKG51bGwpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpbnByb2dyZXNzQ2FsbGJhY2soIHZhbHVlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvZ2luU3VjY2VlZCggZGF0YTphbnkgKTp2b2lkXHJcbiAgICB7IFxyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuY2xvc2VNb2RhbFdhaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvZ2luZmFpbGNhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TaG93KGNhbGxvYmo6IGFueT1udWxsLCBzdWNjZWVkY2FsbGJhY2s6IEZ1bmN0aW9uPW51bGwsIGZhaWxDYWxsYmFjazogRnVuY3Rpb24gPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5vblNob3coY2FsbG9iaiwgc3VjY2VlZGNhbGxiYWNrLCBmYWlsQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUucXE6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNob3djYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMuYWdhaW5wbGF5YmdTb3VuZCApO1xyXG4gICAgICAgIExheWEudGltZXIub25jZSggNTAwLHRoaXMsdGhpcy5hZ2FpbnBsYXliZ1NvdW5kICk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfb25zaG93ICk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfZ2V0Zm9jdXMgKTtcclxuICAgICAgICB2YXIgZnJvbXNjZW5lOm51bWJlciA9IHBpbmd0YWl1dGlscy5mcm9tc2NlbmUoKTtcclxuICAgICAgICBpZiggZnJvbXNjZW5lID09IDEwODkgfHwgZnJvbXNjZW5lID09IDExMzEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfZnJvbXNjb3JmayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFnYWlucGxheWJnU291bmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfb25BdWRpb0ludGVycnVwdGlvbkVuZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkhpZGUoY2FsbG9iajogYW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazogRnVuY3Rpb249bnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uub25IaWRlKGNhbGxvYmosIHN1Y2NlZWRjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS5xcTpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBoaWRlY2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXNUYW1wZXIuSW5zdGFuY2Uuc2VuZG9ubGluZVRvbmdqaSgpO1xyXG4gICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5DbGVhckFsbFNPVU5EKCk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfb25oaWRlICk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfbG9zZWZvY3VzICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPliY3muLjmiI/mmK/lkKblnKjmmL7npLrkuK1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpc3Nob3coKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJvOmJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmlzU2hvd2luZyApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYm8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYm8gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBibztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIhuWMheWKoOi9vVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZFN1YnBhY2thZ2UoIHR5cGVuYW1lOnN0cmluZyxjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixjYWxscHJvZ3Jlc3M6RnVuY3Rpb24sZmFpbGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5sb2FkU3VicGFja2FnZSggdHlwZW5hbWUsY2FsbG9iaixjYWxsYmFjayxjYWxscHJvZ3Jlc3MsZmFpbGNhbGxiYWNrICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaWYoIGNhbGxvYmogJiYgY2FsbGJhY2sgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoIGNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5piv5ZCm5bey57uP5o6I5p2DXHJcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzYWNjcmVkaXQoIGNhbGxvYmo6YW55LGFjY3JlZGl0Q2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5nZXRhY2NyZWRpdCggY2FsbG9iaixhY2NyZWRpdENhbGxiYWNrICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS5xcTpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmdldGFjY3JlZGl0KCBjYWxsb2JqLGFjY3JlZGl0Q2FsbGJhY2sgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBpZihhY2NyZWRpdENhbGxiYWNrJiZjYWxsb2JqKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY3JlZGl0Q2FsbGJhY2suY2FsbCggY2FsbG9iaix0cnVlICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaLv+inkuiJsuS/oeaBr+aOiOadg1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlYWNjcmVkaXQoIGNhbGxvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNyZWF0ZVVzZXJJbmZvQnV0dG9uKGNhbGxvYmosY2FsbGJhY2ssZmFpbGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZXVzZXJpbmZvQnV0dG9uKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuY2xvc2V1c2VyaW5mb2JVdHRvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgIDlh7rmuLjmiI9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGV4aXRHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuZXhpdEdhbWUoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5omT5byA5a6i5pyN5a+56K+d5qGGXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvcGVuQ3VzdG9tZXJTZXJ2aWNlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uub3BlbkN1c3RvbWVyU2VydmljZSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnn63pnIfliqhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHZpYnJhdGVTaG9ydCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnZpYnJhdGVTaG9ydCgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNDYW5WaWRlbygpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICB2YXIgYm86Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCBwaW5ndGFpdXRpbHMuY2hlY2tFbmFibGUoKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBibyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICAgICAgYm8gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5pc0NhblZpZGVvKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgYm8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJvO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGFydFNoYXJlQXBwKGtleTpzdHJpbmcsY2FsbG9iajphbnk9bnVsbCxzdWNjZWVkQ2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsQ2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5zdGFydFNoYXJlQXBwKCBrZXksY2FsbG9iaixzdWNjZWVkQ2FsbGJhY2ssZmFpbENhbGxiYWNrICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaWYoIGNhbGxvYmogJiYgc3VjY2VlZENhbGxiYWNrIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZWVkQ2FsbGJhY2suY2FsbCggY2FsbG9iaiApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBsYXlWaWRlbygga2V5OnN0cmluZywgY2FsbG9iajphbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uPW51bGwsaXN0b25namlOdW06Ym9vbGVhbiA9IHRydWUgKVxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UucGxheVZpZGVvKCBrZXksY2FsbG9iaixzdWNjZWVkY2FsbGJhY2ssZmFpbENhbGxiYWNrLGlzdG9uZ2ppTnVtICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaWYoIGNhbGxvYmogJiYgc3VjY2VlZGNhbGxiYWNrIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZWVkY2FsbGJhY2suY2FsbCggY2FsbG9iaiApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNyZWF0ZUJhbm5lcihiYW5uZXJ0eXBlOnN0cmluZyxzdHlsZTphbnk9e3g6MCx5OjAsc2NhbGU6MX0pOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNyZWF0ZUJhbm5lciggYmFubmVydHlwZSxzdHlsZSApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoaWRlQmFubmVyKCBiYW5uZXJ0eXBlOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmhpZGVCYW5uZXIoIGJhbm5lcnR5cGUgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaVsOaNruS4iuS8oO+8iOeUqOS6juaOkuihjOamnOaVsOaNruaYvuekuu+8iVxyXG4gICAgICogQHBhcmFtIHBhcmFtMSDkuIrmiqXmlbDmja4xXHJcbiAgICAgKiBAcGFyYW0gcGFyYW0yIOS4iuaKpeaVsOaNrjJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0b3JlVG9DbG91ZChwYXJhbTE6bnVtYmVyLHBhcmFtMjpudW1iZXIpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnN0b3JlVG9DbG91ZCggcGFyYW0xLHBhcmFtMiApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5omT5byA5aW95Y+L5o6S6KGM5qacXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvcGVuRnJpZW5kUmFuayggdHlwZTpzdHJpbmcsdmlld1R5cGU6c3RyaW5nLHJlY3Q6TGF5YS5SZWN0YW5nbGUscGFyZW50OkxheWEuU3ByaXRlID0gbnVsbCxkYXRhOmFueSA9IG51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5vcGVuRnJpZW5kUmFuayggdHlwZSx2aWV3VHlwZSxyZWN0LHBhcmVudCxkYXRhICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjpLooYzmppzmiZPlvIDnirbmgIHml7blgJnvvIzliIfmjaLmmL7npLrnsbvlnotcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2hhbmdlRnJpZW5kUmFuayggdHlwZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5jaGFuZ2VGcmllbmRSYW5rKHR5cGUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o6S6KGM5qac5LiK5LiA6aG1XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcmVQYWdlUmFuaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnByZVBhZ2VSYW5rKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjpLooYzmppzkuIvkuIDpobVcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5leHRQYWdlUmFuaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLm5leHRQYWdlUmFuaygpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YWz6Zet5aW95Y+L5o6S6KGM5qacXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbG9zZUZyaWVuZFJhbmsoIHZpZXdUeXBlOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNsb3NlRnJpZW5kUmFuayh2aWV3VHlwZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGxvY2tWaWRlb0xlZnRUaW1lKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRpbWU6bnVtYmVyID0gMDtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIHRpbWUgPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5sb2NrVmlkZW9MZWZ0VGltZSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGF5VmlkZW9OdW1zKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRpbWU6bnVtYmVyID0gMDtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIHRpbWUgPSBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGltZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIDEwODk65re75Yqg5Yiw5oiR55qE5bCP56iL5bqP77yMMTEzMTrmt7vliqDliLDmta7nqpdcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBmcm9tc2NlbmUoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICB2YXIgc2NlbmU6bnVtYmVyID0gMDtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgc2NlbmUgPSBXWEdhbWVQbGF0Zm9ybS5mcm9tc2NlbmU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNjZW5lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlR2FtZUNsdWJCdXR0b24oIHN0eWxlOmFueSxpY29uOnN0cmluZyA9IFwiZ3JlZW5cIiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNyZWF0ZUdhbWVDbHViQnV0dG9uKCBzdHlsZSxpY29uICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4vUGxheWVyQWNjb3VudFwiO1xyXG5cclxuLy8gaW1wb3J0IHsgQWNjb3VudCB9IGZyb20gXCIuLi9BY2NvdW50L0FjY291bnRcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgdHRzaGFyZVxyXG57XHJcbiAgICBzdGF0aWMgc2hhcmUoKVxyXG4gICAge1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQuc2hhcmVBcHBNZXNzYWdlKHtcclxuICAgICAgICAgICAgY2hhbm5lbDogXCJhcnRpY2xlXCIsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlSWQ6IFwib2NnZjliNDY0NjRiOWFubGZmXCIsIC8vIOabv+aNouaIkOmAmui/h+WuoeaguOeahOWIhuS6q0lEXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIuWGsuWViuWGslwiLFxyXG4gICAgICAgICAgICBpbWFnZVVybDogXCJqaWF6YWkvMTIzLnBuZ1wiLFxyXG4gICAgICAgICAgICBxdWVyeTogXCJyZXMucXVlcnlcIixcclxuICAgICAgICAgICAgc3VjY2VzczogKCkgPT57fSxcclxuICAgICAgICAgICAgZmFpbDogKCkgPT57fSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgdHRhZFxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTp0dGFkO1xyXG4gICAgY29uc3RydWN0b3IoKVxyXG4gICAge1xyXG4gICAgICAgIHR0YWQuaW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTp0dGFkXHJcbiAgICB7XHJcbiAgICAgICAgaWYodHRhZC5pbnN0YW5jZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0dGFkLmluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IHR0YWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdmlkZWxBZFVuaXRJZCA9IFwiMTVnZmdwNThwb2NwODBoYmtiXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBiYW5uZXJBZFVuaXRJZCA9IFwiZHNrN2NvaGJsMmY0anBqdHE1XCI7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdmlkZW9BZDtcclxuICAgIFxyXG4gICAgc3RhdGljIGNsb3NlY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgc3RhdGljIEluaXRBRCgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEudmlkZW8gfHwgIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcblxyXG4gICAgICAgIHR0YWQuYmFubmVyQWRVbml0SWQgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLmJhbm5lckFkVW5pdElkP1BsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuYmFubmVyQWRVbml0SWQ6dHRhZC5iYW5uZXJBZFVuaXRJZDtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImJhbm5lckFkVW5pdElkXCIsdHRhZC5iYW5uZXJBZFVuaXRJZCk7XHJcbiAgICAgICAgdHRhZC52aWRlbEFkVW5pdElkID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS52aWRlbEFkVW5pdElkP1BsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEudmlkZWxBZFVuaXRJZDp0dGFkLnZpZGVsQWRVbml0SWQ7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ2aWRlbEFkVW5pdElkXCIsdHRhZC52aWRlbEFkVW5pdElkKTtcclxuXHJcbiAgICAgICAgdHRhZC52aWRlb0FkID0gTGF5YS5Ccm93c2VyLndpbmRvdy50dC5jcmVhdGVSZXdhcmRlZFZpZGVvQWQoeyBhZFVuaXRJZDogdGhpcy52aWRlbEFkVW5pdElkIH0pO1xyXG4gICAgICAgIHR0YWQudmlkZW9BZC5vbkNsb3NlKHJlcyA9PiBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcy5pc0VuZGVkKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0dGFkLmNsb3NlY2FsbGJhY2spXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0dGFkLmNsb3NlY2FsbGJhY2sodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR0YWQuY2xvc2VjYWxsYmFjaylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR0YWQuY2xvc2VjYWxsYmFjayhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIFNob3dWaWRlbyhfY2I6RnVuY3Rpb24pXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEudmlkZW8gfHwgIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJzaG93IHZpZGVvXCIpO1xyXG4gICAgICAgIHR0YWQuY2xvc2VjYWxsYmFjayA9IF9jYjtcclxuICAgICAgICB0dGFkLnZpZGVvQWQuc2hvdygpLnRoZW4oKCkgPT4gXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW5v+WRiuaYvuekuuaIkOWKn1wiKTtcclxuICAgICAgICB9KS5jYXRjaChlcnIgPT4gXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vIHR0YWQuU2hvd1R4dChcIuinhumikeato+WcqOWKoOi9veS4rVwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5bm/5ZGK57uE5Lu25Ye6546w6Zeu6aKYXCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICAvLyDlj6/ku6XmiYvliqjliqDovb3kuIDmrKFcclxuICAgICAgICAgICAgICAgIExheWEudGltZXIub25jZSgyMDAsdGhpcywoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHR0YWQudmlkZW9BZC5sb2FkKCkudGhlbigoKSA9PiBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5omL5Yqo5Yqg6L295oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDliqDovb3miJDlip/lkI7pnIDopoHlho3mmL7npLrlub/lkYpcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR0YWQudmlkZW9BZC5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY2Fuc2hvdyA9IHRydWU7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBiYW5uZXJBZDtcclxuICAgIHN0YXRpYyBTaG93YmFubmVyKClcclxuICAgIHtcclxuICAgICAgICBpZighTGF5YS5Ccm93c2VyLm9uTW9iaWxlKXJldHVybjtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInNob3cgYmFubmVyXCIpO1xyXG4gICAgICAgIHR0YWQuY2Fuc2hvdyA9IHRydWU7XHJcbiAgICAgICAgdmFyIGluZm9yID0gTGF5YS5Ccm93c2VyLndpbmRvdy50dC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgIHZhciB0YXJnZXRCYW5uZXJBZFdpZHRoID0gMjAwO1xyXG4gICAgICAgIGlmKHR0YWQuYmFubmVyQWQpdHRhZC5iYW5uZXJBZC5kZXN0cm95KCk7XHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDIwMCx0aGlzLCgpPT57XHJcbiAgICAgICAgICAgIHR0YWQuYmFubmVyQWQgPSBMYXlhLkJyb3dzZXIud2luZG93LnR0LmNyZWF0ZUJhbm5lckFkKHtcclxuICAgICAgICAgICAgICAgIGFkVW5pdElkOiB0dGFkLmJhbm5lckFkVW5pdElkLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGFyZ2V0QmFubmVyQWRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGluZm9yLndpbmRvd0hlaWdodCAtICh0YXJnZXRCYW5uZXJBZFdpZHRoIC8gMTYpICogOSAvLyDmoLnmja7ns7vnu5/nuqblrprlsLrlr7jorqHnrpflh7rlub/lkYrpq5jluqZcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIFxyXG4gICAgICAgICAgICB0dGFkLmJhbm5lckFkLm9uTG9hZCgoKT0+XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKHR0YWQuY2Fuc2hvdylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0dGFkLmJhbm5lckFkLnNob3coKS50aGVuKCgpID0+XHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW5v+WRiuaYvuekuuaIkOWKn1wiKTtcclxuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5bm/5ZGK57uE5Lu25Ye6546w6Zeu6aKYXCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIFxyXG4gICAgICAgICAgICB0dGFkLmJhbm5lckFkLm9uUmVzaXplKHNpemUgPT4gXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHR0YWQuYmFubmVyQWQuc3R5bGUudG9wID0gaW5mb3Iud2luZG93SGVpZ2h0IC0gc2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdHRhZC5iYW5uZXJBZC5zdHlsZS5sZWZ0ID0gKGluZm9yLndpbmRvd1dpZHRoIC0gc2l6ZS53aWR0aCkgLyAyO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgQ2xlYXIoKVxyXG4gICAge1xyXG4gICAgICAgIHR0YWQuY2Fuc2hvdyA9IGZhbHNlO1xyXG4gICAgICAgIHR0YWQuY2xvc2VjYWxsYmFjayA9IG51bGw7XHJcbiAgICAgICAgaWYodHRhZC5iYW5uZXJBZCl0dGFkLmJhbm5lckFkLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKirmipbpn7Pmm7TlpJrmuLjmiI/mlrnms5UqL1xyXG4gICAgc3RhdGljIENyZWF0ZU1vcmVHYW1lQnRuKGZ1bjpGdW5jdGlvbj1udWxsKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vbklPUylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHR0YWQuU2hvd1R4dChcIuaaguacquW8gOaUvlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnNob3dNb3JlR2FtZXNNb2RhbCh7XHJcbiAgICAgICAgICAgIGFwcExhdW5jaE9wdGlvbnM6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhcHBJZDogXCJ0dDY2ZDAxMDZkZjllYWEwODNcIixcclxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBcImZvbz1iYXImYmF6PXF1eFwiLFxyXG4gICAgICAgICAgICAgICAgZXh0cmFEYXRhOiB7fVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWNjZXNzXCIsIHJlcy5lcnJNc2cpO1xyXG4gICAgICAgICAgICAgIGlmKGZ1bilcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmdW4oKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGZhaWwocmVzKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJmYWlsXCIsIHJlcy5lcnJNc2cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIOebkeWQrOW8ueeql+WFs+mXrVxyXG4gICAgICAgIC8vICAgdGhpcy5vbk1vcmVHYW1lc01vZGFsQ2xvc2UoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyrnm5HlkKzlvLnnqpflhbPpl60qL1xyXG4gICAgLy8gc3RhdGljIG9uTW9yZUdhbWVzTW9kYWxDbG9zZSgpXHJcbiAgICAvLyB7XHJcbiAgICAvLyAgICAgaWYoIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcbiAgICAvLyAgICAgaWYoIExheWEuQnJvd3Nlci5vbklPUylcclxuICAgIC8vICAgICB7XHJcbiAgICAvLyAgICAgICAgIHR0YWQuU2hvd1R4dChcIuaaguacquW8gOaUvlwiKTtcclxuICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0Lm9uTW9yZUdhbWVzTW9kYWxDbG9zZShmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coXCJtb2RhbCBjbG9zZWRcIik7XHJcbiAgICAvLyAgICAgICAgIGlmKFNjZW5lM0RNYW5hZ2VyLmdldEluc3RhbmNlKCkuSXNHYW1lUGFzdWUpXHJcbiAgICAvLyAgICAgICAgIHtcclxuICAgIC8vICAgICAgICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggR2FtZUV2ZW50LmNvbnRpbnVlR2FtZSApO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBTaG93VHh0KHRleHQ6IHN0cmluZykgXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cudHQpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy50dC5zaG93VG9hc3QoeyB0aXRsZTogdGV4dCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRleHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8qKlxyXG4gKiDlhajlsYDkvqblkKznsbvlj4rmtojmga/lpITnkIZcclxuICovXHJcbmV4cG9ydCAgY2xhc3MgRGlzUGF0Y2hlck9uIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHVibGljIHN0YXRpYyBpbnM6RGlzUGF0Y2hlck9uO1xyXG4gICAgcHJpdmF0ZSBfZGlzcGF0Y2hlcjpMYXlhLkV2ZW50RGlzcGF0Y2hlcjtcclxuICAgIHByaXZhdGUgaXNJbml0OmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgRGlzUGF0Y2hlck9uLmlucyA9IHRoaXM7XHJcbiAgICAgICAgaWYodGhpcy5pc0luaXQpeyAgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy5fZGlzcGF0Y2hlciA9PSBudWxsKXtcclxuICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hlciA9IG5ldyBMYXlhLkV2ZW50RGlzcGF0Y2hlcigpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5pdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6RGlzUGF0Y2hlck9ue1xyXG4gICAgICAgIGlmKERpc1BhdGNoZXJPbi5pbnM9PW51bGwpXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGlzUGF0Y2hlck9uKCk7XHJcbiAgICAgICAgcmV0dXJuIERpc1BhdGNoZXJPbi5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcsbGlzdGVuZXI6RnVuY3Rpb24sdGhpc09iamVjdDphbnksdXNlQ2FwdHVyZTpib29sZWFuPWZhbHNlLHByaW9yaXR5Om51bWJlcj0wKTp2b2lke1xyXG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoZXIub24oIHR5cGUsdGhpc09iamVjdCwgbGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nLGxpc3RlbmVyOkZ1bmN0aW9uLHRoaXNPYmplY3Q6YW55LHVzZUNhcHR1cmU6Ym9vbGVhbj1mYWxzZSk6dm9pZHtcclxuICAgICAgICB0aGlzLl9kaXNwYXRjaGVyLm9mZiggdHlwZSx0aGlzT2JqZWN0LCBsaXN0ZW5lciApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuaGFzTGlzdGVuZXIodHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQodHlwZTpzdHJpbmcsZGF0YT86IGFueSk6Ym9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuZXZlbnQodHlwZSxkYXRhKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7TEV2ZW50fSBmcm9tIFwiLi9MRXZlbnRcIjtcclxuaW1wb3J0IHtEaXNQYXRjaGVyT259IGZyb20gXCIuL0Rpc1BhdGNoZXJPblwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgRGlzcGF0Y2hlck1hbmFnZXJcclxue1xyXG4gICAgc3RhdGljICBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERpc1BhdGNoZXJPbi5JbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvL+aWsOW7uuS6i+S7tlxyXG4gICAgc3RhdGljICBFdmVudCh0eXBlOiBzdHJpbmcsIG9iajogT2JqZWN0ID0gbnVsbCwgYnViYmxlczogYm9vbGVhbiA9IGZhbHNlLCBjYW5jZWxhYmxlOiBib29sZWFuID0gZmFsc2UpOiBMYXlhLkV2ZW50IHtcclxuICAgICAgICByZXR1cm4gbmV3IExFdmVudCh0eXBlLCBvYmosIGJ1YmJsZXMsIGNhbmNlbGFibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5rS+5Y+R5LqL5Lu2XHJcbiAgICBzdGF0aWMgIGRpc3BhdGNoRXZlbnQodHlwZTogc3RyaW5nLCBvYmo6IE9iamVjdCA9IG51bGwsIGJ1YmJsZXM6IGJvb2xlYW4gPSBmYWxzZSwgY2FuY2VsYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgRGlzUGF0Y2hlck9uLkluc3RhbmNlLmRpc3BhdGNoRXZlbnQodHlwZSwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+ebkeWQrOS6i+S7tlxyXG4gICAgc3RhdGljICBhZGRFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIHVzZUNhcHR1cmU6IGJvb2xlYW4gPSBmYWxzZSwgcHJpb3JpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcclxuICAgICAgICBEaXNQYXRjaGVyT24uSW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpc09iamVjdCwgdXNlQ2FwdHVyZSwgcHJpb3JpdHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyAgaGFzRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gRGlzUGF0Y2hlck9uLkluc3RhbmNlLmhhc0V2ZW50TGlzdGVuZXIodHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIHVzZUNhcHR1cmU6IGJvb2xlYW4gPSBmYWxzZSwgcHJpb3JpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcclxuICAgICAgICBEaXNQYXRjaGVyT24uSW5zdGFuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpc09iamVjdCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgU3ByaXRlID0gTGF5YS5TcHJpdGU7XHJcbmV4cG9ydCAgY2xhc3MgR2FtZVN0YXRlXHJcbntcclxuICAgIHN0YXRpYyByZW1vdmVzZWxlY3Q6c3RyaW5nID0gXCJHYW1lU3RhdGVfcmVtb3Zlc2VsZWN0XCI7XHJcblxyXG4gICAgXHJcblxyXG4gICAgc3RhdGljIG5wY2VuZDpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9ucGNlbmRHYW1lXCI7XHJcblxyXG4gICAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgJrlhbPmiJDlip9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdpbjpzdHJpbmcgPSBcIkdhbWVTdGF0ZV93aW5HYW1lXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBzcDogU3ByaXRlO1xyXG4gICAgcHJpdmF0ZSBkcmF3U29tZXRoaW5nKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3AgPSBuZXcgU3ByaXRlKCk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLnNwKTtcclxuICAgICAgICAvL+eUu+e6v1xyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0xpbmUoMTAsIDU4LCAxNDYsIDU4LCBcIiNmZjAwMDBcIiwgMyk7XHJcbiAgICAgICAgLy/nlLvov57nu63nm7Tnur9cclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdMaW5lcygxNzYsIDU4LCBbMCwgMCwgMzksIC01MCwgNzgsIDAsIDExNywgNTAsIDE1NiwgMF0sIFwiI2ZmMDAwMFwiLCA1KTtcclxuICAgICAgICAvL+eUu+absue6v1xyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0N1cnZlcygzNTIsIDU4LCBbMCwgMCwgMTksIC0xMDAsIDM5LCAwLCA1OCwgMTAwLCA3OCwgMCwgOTcsIC0xMDAsIDExNywgMCwgMTM2LCAxMDAsIDE1NiwgMF0sIFwiI2ZmMDAwMFwiLCA1KTtcclxuICAgICAgICAvL+eUu+efqeW9olxyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1JlY3QoMTAsIDE2NiwgMTY2LCA5MCwgXCIjZmZmZjAwXCIpO1xyXG4gICAgICAgIC8v55S75aSa6L655b2iXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UG9seSgyNjQsIDE2NiwgWzAsIDAsIDYwLCAwLCA3OC40OCwgNTcsIDMwLCA5My40OCwgLTE4LjQ4LCA1N10sIFwiI2ZmZmYwMFwiKTtcclxuICAgICAgICAvL+eUu+S4ieinkuW9olxyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1BvbHkoNDAwLCAxNjYsIFswLCAxMDAsIDUwLCAwLCAxMDAsIDEwMF0sIFwiI2ZmZmYwMFwiKTtcclxuICAgICAgICAvL+eUu+WchlxyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0NpcmNsZSg5OCwgMzMyLCA1MCwgXCIjMDBmZmZmXCIpO1xyXG4gICAgICAgIC8v55S75omH5b2iXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UGllKDI0MCwgMjkwLCAxMDAsIDEwLCA2MCwgXCIjMDBmZmZmXCIpO1xyXG4gICAgICAgIC8v57uY5Yi25ZyG6KeS55+p5b2i77yM6Ieq5a6a5LmJ6Lev5b6EXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UGF0aCg0MDAsIDMxMCwgW1tcIm1vdmVUb1wiLCA1LCAwXSwgW1wibGluZVRvXCIsIDEwNSwgMF0sIFtcImFyY1RvXCIsIDExMCwgMCwgMTEwLCA1LCA1XSwgW1wibGluZVRvXCIsIDExMCwgNTVdLCBbXCJhcmNUb1wiLCAxMTAsIDYwLCAxMDUsIDYwLCA1XSwgW1wibGluZVRvXCIsIDUsIDYwXSwgW1wiYXJjVG9cIiwgMCwgNjAsIDAsIDU1LCA1XSwgW1wibGluZVRvXCIsIDAsIDVdLCBbXCJhcmNUb1wiLCAwLCAwLCA1LCAwLCA1XSwgW1wiY2xvc2VQYXRoXCJdXSwge2ZpbGxTdHlsZTogXCIjMDBmZmZmXCJ9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog6YCa5YWz5aSx6LSlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmYWlsOnN0cmluZyA9IFwiR2FtZVN0YXRlX2ZhaWxHYW1lXCI7XHJcblxyXG4gICAgc3RhdGljIGp1bXA6c3RyaW5nID0gXCJHYW1lU3RhdGVfanVtcGdhbWVcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaaguWBnOa4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc3RvcDpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9zdG9wR2FtZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Zue5Yiw5Li755WM6Z2iXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZXR1cm5NYWluVmlldzpzdHJpbmcgPSBcInJldHVybk1haW5WaWV3XCI7XHJcblxyXG4gICAgc3RhdGljIHVwZGF0ZVNLaW5WaWV3OnN0cmluZyA9IFwiR2FtZVN0YXRlX3VwZGF0ZVNLaW5WaWV3XCI7XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGJ0bkFycjpBcnJheTxzdHJpbmc+ID0gW1wicmVzL2J1dHRvbi5wbmdcIiwgXCJyZXMvYnV0dG9uLnBuZ1wiLCBcInJlcy9idXR0b24ucG5nXCJdO1xyXG4gICAgcHJpdmF0ZSBuYW1lQXJyOkFycmF5PHN0cmluZz4gPSBbXCJjYW52YXPmiKrlm75cIixcInNwcml0ZeaIquWbvlwiLFwi5riF55CGXCJdO1xyXG4gICAgcHJpdmF0ZSBfY2FudmFzOkhUTUxDYW52YXNFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBhaW1TcDpTcHJpdGU7XHJcbiAgICBwcml2YXRlIGRyYXdJbWFnZTpMYXlhLkltYWdlO1xyXG4gICAgcHJpdmF0ZSBkcmF3U3A6U3ByaXRlO1xyXG5cdHByaXZhdGUgbW9ua2V5VGV4dHVyZTpMYXlhLlRleHR1cmU7XHJcblxyXG4gICAgcHJpdmF0ZSBfb25jbGljayhlOkxheWEuRXZlbnQpe1xyXG4gICAgICAgIHN3aXRjaCAoZS50YXJnZXQubmFtZSkge1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMubmFtZUFyclswXTpcclxuICAgICAgICAgICAgICAgIHZhciBiYXNlNjRVcmw6c3RyaW5nID0gdGhpcy5fY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiLDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3SW1hZ2Uuc2tpbiA9IGJhc2U2NFVybDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMubmFtZUFyclsxXTpcclxuICAgICAgICAgICAgICAgIHZhciB0ZXh0OkxheWEuVGV4dHVyZSA9IExheWEuc3RhZ2UuZHJhd1RvVGV4dHVyZShMYXlhLkJyb3dzZXIuY2xpZW50V2lkdGgsTGF5YS5Ccm93c2VyLmNsaWVudEhlaWdodCwwLDApIGFzIExheWEuVGV4dHVyZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1NwLmdyYXBoaWNzLmRyYXdUZXh0dXJlKHRleHQsMCwwLHRoaXMuZHJhd1NwLndpZHRoLHRoaXMuZHJhd1NwLmhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSB0aGlzLm5hbWVBcnJbMl06XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyYXdJbWFnZS5za2luID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1NwLmdyYXBoaWNzLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyYXdTcC5ncmFwaGljcy5kcmF3UmVjdCgwLDAsdGhpcy5kcmF3U3Aud2lkdGgsdGhpcy5kcmF3U3AuaGVpZ2h0LFwiI2ZmMDAwMFwiKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgLyoqXHJcbiAgICAgKiDlvIDlp4vmuLjmiI9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHN0YXJ0OnN0cmluZyA9IFwiR2FtZVN0YXRlX3N0YXJ0R2FtZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog57uT5p2f5ri45oiPXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBlbmQ6c3RyaW5nID0gXCJHYW1lU3RhdGVfZW5kR2FtZVwiO1xyXG4gICAgXHJcbiAgICAvKirlpLHotKUgKi9cclxuICAgIHN0YXRpYyBsb3NlOnN0cmluZyA9IFwiR2FtZVN0YXRlX2xvc2VHYW1lXCJcclxuICAgIC8qKlxyXG4gICAgICog5aSN5rS7XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZXZpdmU6c3RyaW5nID0gXCJHYW1lU3RhdGVfcmV2aXZlR2FtZVwiO1xyXG5cclxuICAgIC8qKuaYr+WQpuWkjea0uyAqL1xyXG4gICAgc3RhdGljIGlzZGllOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKirlhYHorrjlpI3mtLvmrKHmlbAgKi9cclxuICAgIHN0YXRpYyBmdWh1b2Npc2h1Om51bWJlciA9IDE7XHJcblxyXG4gICAgLyoq5piv5ZCm5bey57uP5Y+R5biD6L+H5b2V5bGPICovXHJcbiAgICBzdGF0aWMgcmVjb3Jkc2NyZWU6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKua4uOaIj+asoeaVsCovXHJcbiAgICBzdGF0aWMgR2FtZU51bTpudW1iZXIgPSAwO1xyXG5cclxuXHJcblxyXG59IiwiXHJcbi8qXHJcbiog5YWs5YWx5o6l5Y+jXHJcbiovXHJcbmV4cG9ydCBtb2R1bGUgR2FtZVV0aWxzIHtcclxuICAgIC8qKlxyXG4gICAgICog6ZqP5py65Ye95pWwKOi/lOWbnuaVtOWeiylcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJhbmRSYW5nZWludChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIgIHtcclxuICAgICAgICB2YXIgdmFsdWU6bnVtYmVyPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XHJcbiAgICAgICAgaWYodmFsdWU+bWF4KXtcclxuICAgICAgICAgICAgdmFsdWUgPSBtYXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmaj+acuuWHveaVsCgg5LiN5Y+W5pW0IClcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJhbmRSYW5nZWZsb2F0KG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciAge1xyXG4gICAgICAgIHZhciB2YWx1ZTpudW1iZXIgPSBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluO1xyXG4gICAgICAgIGlmKHZhbHVlPm1heCl7XHJcbiAgICAgICAgICAgIHZhbHVlID0gbWF4O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFRleGJ5UGtnQW5kTmFtZSggcGtnbmFtZTpzdHJpbmcsdGV4bmFtZTpzdHJpbmcgKTpMYXlhLlRleHR1cmVcclxuICAgIHtcclxuICAgICAgICB2YXIgdWlwYWNrYWdlOmZhaXJ5Z3VpLlVJUGFja2FnZSA9IGZhaXJ5Z3VpLlVJUGFja2FnZS5nZXRCeU5hbWUocGtnbmFtZSk7XHJcbiAgICAgICAgaWYoIHVpcGFja2FnZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdWlwYWNrYWdlLmdldEl0ZW1Bc3NldEJ5TmFtZSh0ZXhuYW1lKSBhcyBMYXlhLlRleHR1cmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YiH5Ymy5YiG5Y+35Y+Y5oiQUG9pbnTlr7nosaFcclxuICAgICAqIEBwYXJhbSBzdHIgXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRmZW5oYW9Qb2ludCggc3RyOnN0cmluZyApOkxheWEuUG9pbnRcclxuICAgIHtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCI7XCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgTGF5YS5Qb2ludCggTnVtYmVyKCBhcnJbMF0gKSxOdW1iZXIoIGFyclsxXSApICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliIflibLliIblj7flj5jmiJDmlbDmja4obnVtYmVyKVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0ZmVuaGFvdG9BcnJudW0oIHN0cjpzdHJpbmcgKTpBcnJheTxudW1iZXI+XHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG51bUFycjpBcnJheTxudW1iZXI+PVtdO1xyXG4gICAgICAgIGlmIChzdHIgPT0gXCJcIilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBudW1BcnI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIjtcIik7XHJcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICBmb3IoIGk7aTxhcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBudW1BcnIucHVzaCggTnVtYmVyKCBhcnJbaV0gKSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVtQXJyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YiH5Ymy5YiG5Y+35Y+Y5oiQ5pWw5o2uKHN0cmluZylcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dGZlbmhhb3RvQXJyc3RyKCBzdHI6c3RyaW5nICk6QXJyYXk8c3RyaW5nPlxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBzdHIuc3BsaXQoXCI7XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YiH5Ymy5YiG5Y+35Y+Y5oiQ5pWw5o2uKCB7IGtleToxLHZhbHVlOjEgfSApXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRmZW5oYW90b09iaiggc3RyOnN0cmluZyApOmFueVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvYmo6YW55ID0ge307XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KCBcIjtcIiApO1xyXG4gICAgICAgIG9iai5rZXkgPSBhcnJbMF07XHJcbiAgICAgICAgb2JqLnZhbHVlID0gYXJyWzFdO1xyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq5YiH5Ymyc3RyKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRzdHJ0b0Fyciggc3RyOnN0cmluZyApOkFycmF5PHN0cmluZz5cclxuICAgIHtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoIFwifFwiICk7XHJcbiAgICAgICAgcmV0dXJuIGFycjtcclxuICAgIH1cclxuXHJcbiAgICAvKirliIflibJzdHIoIDE6MXwxOjEgKSB0byBBcnJheTx7IGtleToxLHZhbHVlOjEgfT4gKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRzdHJ0b0FycjEoIHN0cjpzdHJpbmcgKTpBcnJheTxhbnk+XHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJlc2x1dEFycjpBcnJheTxhbnk+PVtdO1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdCggXCJ8XCIgKTtcclxuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvciggaT0wO2k8YXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW1hcnI6QXJyYXk8c3RyaW5nPiA9IGFycltpXS5zcGxpdCggXCI7XCIgKTtcclxuICAgICAgICAgICAgcmVzbHV0QXJyLnB1c2goIHsga2V5Oml0ZW1hcnJbMF0sdmFsdWU6aXRlbWFyclsxXSB9ICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNsdXRBcnI7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dHN0cnRvT2JqKCBzdHI6c3RyaW5nICk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJlc3VsdG9iajphbnkgPSB7fTtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoIFwifFwiICk7XHJcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICBmb3IoIGk9MDtpPGFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtYXJyOkFycmF5PHN0cmluZz4gPSBhcnJbaV0uc3BsaXQoIFwiO1wiICk7XHJcbiAgICAgICAgICAgIHJlc3VsdG9ialtpdGVtYXJyWzBdXSA9IGl0ZW1hcnJbMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHRvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uKHYxLCB2Mik6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgdjEgPSB2MS5zcGxpdCgnLicpO1xyXG4gICAgICAgIHYyID0gdjIuc3BsaXQoJy4nKTtcclxuICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1heCh2MS5sZW5ndGgsIHYyLmxlbmd0aCk7XHJcbiAgICAgICAgd2hpbGUgKHYxLmxlbmd0aCA8IGxlbikge1xyXG4gICAgICAgICAgICB2MS5wdXNoKCcwJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlICh2Mi5sZW5ndGggPCBsZW4pIHtcclxuICAgICAgICAgICAgdjIucHVzaCgnMCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bTEgPSBwYXJzZUludCh2MVtpXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bTIgPSBwYXJzZUludCh2MltpXSk7XHJcbiAgICAgICAgICAgIGlmIChudW0xID4gbnVtMikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtMSA8IG51bTIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFdvcmRUaXBzUGFuZWwgfSBmcm9tIFwiLi4vVmlldy9HbG9iYWxUaXBQYW5lbFwiO1xyXG5pbXBvcnQgeyBMYXlvdXRDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvTGF5b3V0Q29udHJvbFwiO1xyXG5pbXBvcnQgeyBMYXlPVVQgfSBmcm9tIFwiLi4vdXRpbHMvTGF5T1VUXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBHbG9iYWxUaXBcclxue1xyXG4gICAgc3RhdGljIHdvcmRMaXN0OkFycmF5PFdvcmRUaXBzUGFuZWw+ID0gW107XHJcbiAgICBzdGF0aWMgc2hvd1dvcmRMaXN0OkFycmF5PFdvcmRUaXBzUGFuZWw+ID0gW107XHJcbiAgICBzdGF0aWMgbWF4TnVtOm51bWJlciA9IDEwO1xyXG4gICAgc3RhdGljIGlzRXZlbnQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOkdsb2JhbFRpcDtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgR2xvYmFsVGlwLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpHbG9iYWxUaXBcclxuICAgIHtcclxuICAgICAgICBpZiggR2xvYmFsVGlwLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2xvYmFsVGlwKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBHbG9iYWxUaXAuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgR2xvYmFsVGlwLmlzRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVTdGF0ZS5yZW1vdmVzZWxlY3QsdGhpcyx0aGlzLmFkZHdvcmRMaXN0ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dXb3JkVGlwcyggd29yZDpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoICFHbG9iYWxUaXAuaXNFdmVudCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2UuaW5pdEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0Lmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGxhc3R3b3JkOnN0cmluZyA9IEdsb2JhbFRpcC5zaG93V29yZExpc3RbR2xvYmFsVGlwLnNob3dXb3JkTGlzdC5sZW5ndGgtMV0ubm93d29yZDtcclxuICAgICAgICAgICAgLy8gaWYoIGxhc3R3b3JkID09IHdvcmQgKVxyXG4gICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIEdsb2JhbFRpcC53b3JkTGlzdC5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtOldvcmRUaXBzUGFuZWwgPSBHbG9iYWxUaXAud29yZExpc3Quc2hpZnQoKTtcclxuICAgICAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5BZGRMYXllckJ5TmFtZSggaXRlbSxMYXlPVVQuVElQICk7XHJcbiAgICAgICAgICAgIEdsb2JhbFRpcC5zaG93V29yZExpc3QucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgaXRlbS5zaG93V29yZCggd29yZCApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggR2xvYmFsVGlwLnNob3dXb3JkTGlzdC5sZW5ndGggPCAxMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtMTpXb3JkVGlwc1BhbmVsID0gbmV3IFdvcmRUaXBzUGFuZWwoKTtcclxuICAgICAgICAgICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UuQWRkTGF5ZXJCeU5hbWUoIGl0ZW0xLExheU9VVC5USVAgKTtcclxuICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5zaG93V29yZExpc3QucHVzaChpdGVtMSk7XHJcbiAgICAgICAgICAgICAgICBpdGVtMS5zaG93V29yZCggd29yZCApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0xOldvcmRUaXBzUGFuZWwgPSBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0LnNoaWZ0KCk7XHJcbiAgICAgICAgICAgICAgICBpdGVtMS5zaG93V29yZCggd29yZCApO1xyXG4gICAgICAgICAgICAgICAgR2xvYmFsVGlwLnNob3dXb3JkTGlzdC5wdXNoKGl0ZW0xKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBhZGR3b3JkTGlzdCggaXRlbTpXb3JkVGlwc1BhbmVsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpdGVtIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRnJvbVBhcmVudCgpO1xyXG4gICAgICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gR2xvYmFsVGlwLnNob3dXb3JkTGlzdC5pbmRleE9mKCBpdGVtICk7XHJcbiAgICAgICAgICAgIGlmKCBpbmRleCAhPSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5zaG93V29yZExpc3Quc3BsaWNlKCBpbmRleCwxICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5DbGVhckxheWVyQnlOYW1lKExheU9VVC5USVAgKTtcclxuICAgICAgICAgICAgR2xvYmFsVGlwLndvcmRMaXN0LnB1c2goIGl0ZW0gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsImV4cG9ydCAgY2xhc3MgTEV2ZW50IGV4dGVuZHMgTGF5YS5FdmVudFxyXG57XHJcbiAgICBwdWJsaWMgQ0xBU1NfTkFNRTpzdHJpbmcgPSBcIkxFdmVudFwiO1xyXG4gICAgcHJpdmF0ZSBfb2JqOmFueTtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOnN0cmluZywgb2JqOmFueSA9IG51bGwsIGJ1YmJsZXM6Ym9vbGVhbiA9IGZhbHNlLCBjYW5jZWxhYmxlOmJvb2xlYW4gPSBmYWxzZSl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBpZihvYmope1xyXG4gICAgICAgICAgICB0aGlzLl9vYmogPSBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9uZShvYmo/Ok9iamVjdCk6TEV2ZW50e1xyXG4gICAgICAgIHJldHVybiBuZXcgTEV2ZW50KHRoaXMudHlwZSwgb2JqP29iajp0aGlzLl9vYmopO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOnZvaWR7XHJcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5DTEFTU19OQU1FLCBcInR5cGVcIiwgXCJidWJibGVzXCIsIFwiY2FuY2VsYWJsZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS8oOWPguiOt+WPllxyXG4gICAgICogQHJldHVybnMge2FueX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwYXJhbSgpOmFueXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb2JqO1xyXG4gICAgfVxyXG5cclxufSIsIlxyXG5leHBvcnQgY2xhc3MgTGF5T1VUIHtcclxuICAgIC8qKlxyXG4gICAgICog6IOM5pmv5bGCXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgQkc6IHN0cmluZyA9IFwiQkdcIjtcclxuICAgIC8qKlxyXG4gICAgICogdWnlsYJcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBVSTogc3RyaW5nID0gXCJVSVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogdWnlsYLkuIrlsYJcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBVSVRvcDogc3RyaW5nID0gXCJVSVRvcFwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiB0aXBz5bGCXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgVElQOiBzdHJpbmcgPSBcIlRJUFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5paw5omL5byV5a+85bGCXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgR1VJREU6c3RyaW5nID0gXCJHVUlERVwiO1xyXG5cclxufVxyXG4iLCIvKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCAgY2xhc3MgU2luZ2xldG9uIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2RpY3Q6YW55ID0ge307XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgIC8qKlxyXG4gICAgICog6I635Y+W5Y2V5L6L57G777yM6Iul5LiN5a2Y5Zyo5YiZ6L+U5Zue56m6XHJcbiAgICAgKiBAcGFyYW1cdHJlZiDnu6fmib/oh6pTaW5nbGV0b27nmoTnsbtcclxuICAgICAqIEByZXR1cm5cdCpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBJbnN0YW5jZShyZWY6YW55KTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggcmVmLmtleSA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdldGluc3RhbmNlIGVycm9cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaWN0W3JlZi5rZXldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluWNleS+i+exu++8jOiLpeS4jeWtmOWcqOWImeWIm+W7ulxyXG4gICAgICogQHBhcmFtXHRyZWZcdFx057un5om/6IeqU2luZ2xldG9u55qE57G7XHJcbiAgICAgKiBAcmV0dXJuXHQqXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2VPckNyZWF0ZShyZWY6YW55KTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggcmVmLmtleSA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdldEluc3RhbmNlT3JDcmVhdGUgZXJyb1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jcmVhdGUocmVmKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGljdFtyZWYua2V5XTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICog5Yib5bu65Y2V5L6L57G7XHJcbiAgICogQHBhcmFtXHRyZWZcdFx057un5om/6IeqU2luZ2xldG9u55qE57G7XHJcbiAgICogQHJldHVyblx0dm9pZFxyXG4gICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUocmVmOmFueSk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHJlZi5rZXkgPT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjcmVhdGUgZXJyb1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy5fZGljdFtyZWYua2V5XSA9PSBudWxsKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RpY3RbcmVmLmtleV0gPSBuZXcgcmVmKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaWN0W3JlZi5rZXldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAgICAgKiDliKDpmaTljZXkvovnsbtcclxuICAgICAgICAgKiBAcGFyYW1cdHJlZlx0XHTnu6fmib/oh6pTaW5nbGV0b27nmoTnsbtcclxuICAgICAgICAgKiBAcmV0dXJuXHR2b2lkXHJcbiAgICAgICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZShyZWY6YW55KTp2b2lkXHJcblx0e1xyXG4gICAgICAgIHZhciBrZXk6c3RyaW5nID0gcmVmLmtleTtcclxuICAgICAgICBpZih0aGlzLl9kaWN0W2tleV0gIT0gbnVsbCkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9kaWN0W2tleV0uZGVzdG9yeSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAqIOmUgOavgeaWueazlVxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtQYW5lbENoaWxkQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2xcIjtcclxuaW1wb3J0IHtTa2luRGF0YX0gZnJvbSBcIi4uL0RhdGEvU2tpbkRhdGFcIjtcclxuaW1wb3J0IHtBZ2VuY3lTa2lufSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVNraW5cIjtcclxuaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWNcIjtcclxuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xyXG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4uL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xyXG5pbXBvcnQgTW92aWVDbGlwID0gTGF5YS5Nb3ZpZUNsaXA7XHJcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vV1hTREsvdHRhZFwiO1xyXG5leHBvcnQgY2xhc3MgU2tpbkl0ZW0gZXh0ZW5kcyBmYWlyeWd1aS5HQnV0dG9uIFxyXG57XHJcbiAgICBsb2FkX2ljb246ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIGNfc3RhdGU6ZmFpcnlndWkuQ29udHJvbGxlcjtcclxuICAgIHR4dF9uZWVkOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICBwaWZ1dm86U2tpbkRhdGE7XHJcbiAgICBidG5fMDpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgcHJpdmF0ZSBhZ2VuY3lza2luOkFnZW5jeVNraW47XHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlcigpOyBcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBiZ0NvbG9yQ2hhbm5lbHM6IGFueSA9IHsgcjogOTksIGc6IDAsIGI6IDB4RkYgfTtcclxuICAgIHByaXZhdGUgZ2V0SGV4Q29sb3JTdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgICB0aGlzLmJnQ29sb3JDaGFubmVscy5yID0gTWF0aC5mbG9vcih0aGlzLmJnQ29sb3JDaGFubmVscy5yKTtcclxuICAgICAgICAvLyDnu7/oibLpgJrpgZPkvb/nlKgwXHJcbiAgICAgICAgdGhpcy5iZ0NvbG9yQ2hhbm5lbHMuZyA9IDA7XHJcbiAgICAgICAgLy9vYmouZyA9IE1hdGguZmxvb3Iob2JqLmcpO1xyXG4gICAgICAgIHRoaXMuYmdDb2xvckNoYW5uZWxzLmIgPSBNYXRoLmZsb29yKHRoaXMuYmdDb2xvckNoYW5uZWxzLmIpO1xyXG5cclxuICAgICAgICB2YXIgcjogU3RyaW5nID0gdGhpcy5iZ0NvbG9yQ2hhbm5lbHMuci50b1N0cmluZygxNik7XHJcbiAgICAgICAgciA9IHIubGVuZ3RoID09IDIgPyByIDogXCIwXCIgKyByO1xyXG4gICAgICAgIHZhciBnOiBTdHJpbmcgPSB0aGlzLmJnQ29sb3JDaGFubmVscy5nLnRvU3RyaW5nKDE2KTtcclxuICAgICAgICBnID0gZy5sZW5ndGggPT0gMiA/IGcgOiBcIjBcIiArIGc7XHJcbiAgICAgICAgdmFyIGI6IFN0cmluZyA9IHRoaXMuYmdDb2xvckNoYW5uZWxzLmIudG9TdHJpbmcoMTYpO1xyXG4gICAgICAgIGIgPSBiLmxlbmd0aCA9PSAyID8gYiA6IFwiMFwiICsgYjtcclxuICAgICAgICByZXR1cm4gXCIjXCIgKyByICsgZyArIGI7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RGcm9tWE1MKHhtbDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuY29uc3RydWN0RnJvbVhNTCh4bWwpO1xyXG4gICAgICAgIGZvciAodmFyIHN0ciBpbiB0aGlzLl9jaGlsZHJlbikge1xyXG4gICAgICAgICAgICB2YXIgaXRlbTogZmFpcnlndWkuR09iamVjdCA9IHRoaXMuX2NoaWxkcmVuW3N0cl07XHJcbiAgICAgICAgICAgIHRoaXNbaXRlbS5uYW1lXSA9IGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25Jbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWdlbmN5c2tpbiA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5U2tpbiApO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZSA9IHRoaXMuZ2V0Q29udHJvbGxlciggXCJjX3N0YXRlXCIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm9uKCBMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5idG5jbGljayApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnRuY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMucGlmdXZvIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN3aXRjaCggdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTogLy/mi6XmnIlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFnZW5jeXNraW4uR2FpblBpZnUoIHRoaXMucGlmdXZvICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjovL+a0u+WKqOiOt+WPllxyXG4gICAgICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoXCLmmoLmnKrlvIDmlL5cIik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMzovL+eci+inhumikeiOt+WPllxyXG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5dmlkZW9jYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHBpbmd0YWl1dGlscy5JbnN0YW5jZS5wbGF5VmlkZW8oIFwiXCIsdGhpcyx0aGlzLnBsYXl2aWRlb2NhbGxiYWNrICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDovL+mHkeW4gei0reS5sFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWdlbmN5c2tpbi5HYWluUGlmdSggdGhpcy5waWZ1dm8gKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIFNXRlBhdGg6IHN0cmluZyA9IFwicmVzL3N3Zi9kcmFnb24uc3dmXCI7XHJcblxyXG5cdFx0cHJpdmF0ZSBNQ1dpZHRoOiBudW1iZXIgPSAzMTg7XHJcblx0XHRwcml2YXRlIE1DSGVpZ2h0OiBudW1iZXIgPSA0MDY7XHJcbiAgICBwcml2YXRlIGNyZWF0ZU1vdmllQ2xpcCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgbWM6IE1vdmllQ2xpcCA9IG5ldyBNb3ZpZUNsaXAoKTtcclxuICAgICAgICBtYy5sb2FkKHRoaXMuU1dGUGF0aCk7XHJcblxyXG4gICAgICAgIG1jLnggPSAoTGF5YS5zdGFnZS53aWR0aCAtIHRoaXMuTUNXaWR0aCkgLyAyO1xyXG4gICAgICAgIG1jLnkgPSAoTGF5YS5zdGFnZS5oZWlnaHQgLSB0aGlzLk1DSGVpZ2h0KSAvIDI7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQobWMpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwcml2YXRlIHBsYXl2aWRlb2NhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcclxuICAgICAgICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWdlbmN5c2tpbi5HYWluUGlmdSggdGhpcy5waWZ1dm8gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKSBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd0RhdGEoIHZvOlNraW5EYXRhICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucGlmdXZvID0gdm87XHJcbiAgICAgICAgaWYoIHRoaXMucGlmdXZvIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZF9pY29uLmljb24gPSBBc3NldFBhdGguZ2V0cm9sZWljb24oIHRoaXMucGlmdXZvLnJvbGVDRkcuaWNvbiApO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5hZ2VuY3lza2luLlJvbGVEYXRhLkNoYXJhY3RlcklEID09IHRoaXMucGlmdXZvLnJvbGVDRkcuaWQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5waWZ1dm8uc3RhdGUgPT0gMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5waWZ1dm8ucm9sZUNGRy5nZXRTdGF0ZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHh0X25lZWQudGV4dCA9IHRoaXMucGlmdXZvLmhhc251bSArIFwiL1wiICsgdGhpcy5waWZ1dm8ucm9sZUNGRy5uZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSA0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR4dF9uZWVkLnRleHQgPSB0aGlzLnBpZnV2by5yb2xlQ0ZHLm5lZWQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgcHJlRml4TnVtYmVyKG51bTpudW1iZXIsIHN0ckxlbjpudW1iZXIpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAoXCIwMDAwMDAwMDAwXCIgKyBudW0pLnNsaWNlKC1zdHJMZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXZhbEJnQ29sb3IoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIGNvbG9yOiBudW1iZXIgPSBNYXRoLnJhbmRvbSgpICogMHhGRkZGRkY7XHJcbiAgICAgICAgdmFyIGNoYW5uZWxzOiBBcnJheTxudW1iZXI+ID0gdGhpcy5nZXRDb2xvckNoYW5uYWxzKGNvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENvbG9yQ2hhbm5hbHMoY29sb3I6IG51bWJlcik6IEFycmF5PG51bWJlcj4ge1xyXG4gICAgICAgIHZhciByZXN1bHQ6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuICAgICAgICByZXN1bHQucHVzaChjb2xvciA+PiAxNik7XHJcbiAgICAgICAgcmVzdWx0LnB1c2goY29sb3IgPj4gOCAmIDB4RkYpO1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKGNvbG9yICYgMHhGRik7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5vZmYoIExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bmNsaWNrICk7XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gICAgXHJcbn0iLCIvKipcclxuICog57un5om/YmFzZVZpZXfnlYzpnaLnmoTmiZPlvIDlhbPpl63liqjmlYjnsbvlnotcclxuICovXHJcbmV4cG9ydCBjbGFzcyBWaWV3QWN0aW9uIFxyXG57ICAgXHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBfdGV4dDpMYXlhLlRleHQgPSBudWxsO1xyXG4gICAgXHQvKipcclxuXHQgKiDliqjnlLvnirbmgIHlvIDlp4vml7bmiafooYzjgIJcclxuXHQgKi9cclxuXHRwdWJsaWMgb25TdGF0ZUVudGVyKCk6dm9pZCB7XHJcblx0XHRjb25zb2xlLmxvZyhcIuWKqOeUu+W8gOWni+aSreaUvuS6hlwiKTtcclxuXHRcdHRoaXMuX3RleHQudGV4dCA9IFwi5Yqo55S754q25oCB77ya5Yqo55S75byA5aeL5pKt5pS+XCI7XHJcblx0fVxyXG5cdFx0XHJcblx0LyoqXHJcblx0ICog5Yqo55S754q25oCB5pu05paw5pe25omn6KGM44CCXHJcblx0ICovXHJcblx0cHVibGljIG9uU3RhdGVVcGRhdGUoKTp2b2lkIHtcclxuXHRcdGNvbnNvbGUubG9nKFwi5Yqo55S754q25oCB5pu05paw5LqGXCIpO1xyXG5cdFx0dGhpcy5fdGV4dC50ZXh0ID0gXCLliqjnlLvnirbmgIHvvJrliqjnlLvmm7TmlrDkuK1cIjtcclxuXHR9XHJcblx0XHRcclxuXHQvKipcclxuXHQgKiDliqjnlLvnirbmgIHpgIDlh7rml7bmiafooYzjgIJcclxuXHQgKi9cclxuXHRwdWJsaWMgb25TdGF0ZUV4aXQoKTp2b2lkIHtcclxuXHRcdGNvbnNvbGUubG9nKFwi5Yqo55S76YCA5Ye65LqGXCIpO1xyXG5cdFx0dGhpcy5fdGV4dC50ZXh0ID0gXCLliqjnlLvnirbmgIHvvJrliqjnlLvlvIDlp4vpgIDlh7pcIjtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog5LuO5bCP5Y+Y5aSnXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBBY3Rpb25UeXBlX2FkZHNjYWxlTWluVG9NYXg6c3RyaW5nID0gXCJBY3Rpb25UeXBlX2FkZHNjYWxlTWluVG9NYXhcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS7juWkp+WPmOWwj+enu+WHulxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgQWN0aW9uVHlwZV9yZW1vdmVzY2FsZU1heFRvTWluOnN0cmluZyA9IFwiQWN0aW9uVHlwZV9yZW1vdmVzY2FsZU1heFRvTWluXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmsqHmnInliqjmlYhcclxuICAgICAqL1xyXG4gICAgc3RhdGljIEFjdGlvblR5cGVfbm9uZTpzdHJpbmcgPSBcIkFjdGlvblR5cGVfbm9uZVwiO1xyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIHNjZW5lOkxheWEuU2NlbmUzRDtcclxuICAgIHByaXZhdGUgbWF0MTpMYXlhLkJsaW5uUGhvbmdNYXRlcmlhbDsgXHJcbiAgICBwcml2YXRlIG1lc2gxOkxheWEuTWVzaDtcclxuICAgIHByaXZhdGUgbWVzaDI6TGF5YS5NZXNoO1xyXG4gICAgcHVibGljIGFkZEJveCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBmb3IgKGxldCBpOm51bWJlciA9IDA7IGkgPCA4OyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRWZXJ0aWNhbEJveCgtMC42NSwgMC4xNjUgKyBpICogMC4zMyAqIDIsIDApO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFZlcnRpY2FsQm94KDAsIDAuMTY1ICsgaSAqIDAuMzMgKiAyLCAwKTtcclxuICAgICAgICAgICAgdGhpcy5hZGRWZXJ0aWNhbEJveCgwLjY1LCAwLjE2NSArIGkgKiAwLjMzICogMiwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIGFkZFZlcnRpY2FsQm94KHg6bnVtYmVyLCB5Om51bWJlciwgejpudW1iZXIpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgYm94OkxheWEuTWVzaFNwcml0ZTNEID0gdGhpcy5zY2VuZS5hZGRDaGlsZChuZXcgTGF5YS5NZXNoU3ByaXRlM0QodGhpcy5tZXNoMSkpIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgIGJveC5tZXNoUmVuZGVyZXIubWF0ZXJpYWwgPSB0aGlzLm1hdDE7XHJcbiAgICAgICAgYm94Lm1lc2hSZW5kZXJlci5jYXN0U2hhZG93ID0gdHJ1ZTtcclxuICAgICAgICBib3gubWVzaFJlbmRlcmVyLnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xyXG4gICAgICAgIGJveC50cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKHgsIHksIHopO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciByaWdpZEJvZHk6TGF5YS5SaWdpZGJvZHkzRCA9IGJveC5hZGRDb21wb25lbnQoTGF5YS5SaWdpZGJvZHkzRCkgYXMgTGF5YS5SaWdpZGJvZHkzRDtcclxuICAgICAgICByaWdpZEJvZHkubWFzcyA9IDEwO1xyXG4gICAgICAgIHJpZ2lkQm9keS5mcmljdGlvbiA9IDAuNDtcclxuICAgICAgICByaWdpZEJvZHkucmVzdGl0dXRpb24gPSAwLjI7XHJcbiAgICAgICAgdmFyIGJveFNoYXBlOkxheWEuQm94Q29sbGlkZXJTaGFwZSA9IG5ldyBMYXlhLkJveENvbGxpZGVyU2hhcGUoMC41LCAwLjMzLCAyKTtcclxuICAgICAgICByaWdpZEJvZHkuY29sbGlkZXJTaGFwZSA9IGJveFNoYXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5Y+z6L6556e75Yqo5Yiw5Lit5aSuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBBY3Rpb25UeXBlX2FkZG1vdmVUb01pZGRsZTpzdHJpbmc9XCJBY3Rpb25UeXBlX2FkZG1vdmVUb01pZGRsZVwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiDku47mnIDlj7Povrnnp7vlh7pcclxuICAgICAqL1xyXG4gICAgc3RhdGljIEFjdGlvblR5cGVfcmVtb3ZlbW92ZVRvUmlnaHQ6c3RyaW5nID0gXCJBY3Rpb25UeXBlX3JlbW92ZW1vdmVUb1JpZ2h0XCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDku47lupXpg6jlkJHkuIrnp7vliqhcclxuICAgICAqL1xyXG4gICAgc3RhdGljIEFjdGlvblR5cGVfYWRkbW92ZUZyb21Cb3R0b206c3RyaW5nPVwiQWN0aW9uVHlwZV9hZGRtb3ZlRnJvbUJvdHRvbVwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiDku47kuIrlkJHlupXpg6jnp7vliqhcclxuICAgICAqL1xyXG4gICAgc3RhdGljIEFjdGlvblR5cGVfYWRkbW92ZUZyb211cDpzdHJpbmc9XCJBY3Rpb25UeXBlX2FkZG1vdmVGcm9tdXBcIjtcclxuXHJcbiAgICBcclxuXHJcbiAgICBcclxufSJdfQ==