BattleScene.js 71.1 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435

                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/scripts/scenes/BattleScene.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '42eafpA7wRDZ6zpdAZ7t9KK', 'BattleScene');
// scripts/scenes/BattleScene.ts

"use strict";
// Learn TypeScript:
//  - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
//  - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
var SaveDataManager_1 = require("../component/SaveDataManager");
var Global_1 = require("../Global");
var BattleConst_1 = require("../kernel/battle/BattleConst");
var BattleManager_1 = require("../kernel/battle/BattleManager");
var PhysicsControl_1 = require("../kernel/physics/PhysicsControl");
var IntroTableMgr_1 = require("../kernel/table/IntroTableMgr");
var TableDefine_1 = require("../kernel/table/TableDefine");
var Ball_1 = require("../prefabs/Ball");
var UIManager_1 = require("../ui/UIManager");
var UIBattle_1 = require("../ui/uiView/UIBattle");
var UITitleData_1 = require("../ui/uiView/UITitleData");
var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property;
var BattleScene = /** @class */ (function (_super) {
    __extends(BattleScene, _super);
    function BattleScene() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this.prefabCollection = null;
        _this._pointerVec = cc.v2();
        _this._ballWorldP = cc.v2();
        _this._hitPList = [];
        _this._hitBallList = [];
        _this._minShootDeg = 1;
        return _this;
        //#endregion
    }
    Object.defineProperty(BattleScene.prototype, "mapView", {
        get: function () { return this._mapView; },
        enumerable: false,
        configurable: true
    });
    //#region  LIFE-CYCLE CALLBACKS:
    BattleScene.prototype.onLoad = function () {
        this._gameRoot = this.node.getChildByName('GameRoot');
        BattleManager_1.BattleManager.ins.eventNode.on(BattleConst_1.BattleEvent.ROUND_END, this.onRoundEnd, this);
        BattleManager_1.BattleManager.ins.eventNode.on(BattleConst_1.BattleEvent.SKILL_START, this.onSkillStart, this);
        BattleManager_1.BattleManager.ins.eventNode.on(BattleConst_1.BattleEvent.SKILL_END, this.onSkillEnd, this);
        BattleManager_1.BattleManager.ins.eventNode.on(BattleConst_1.BattleEvent.BORN_POS_CHANGE, this.onBornPosChange, this);
        this._minShootDeg = Global_1.tMgr.getConfig(TableDefine_1.TableName.GAME_PLAY, 10).Value;
    };
    BattleScene.prototype.onEnable = function () {
        this._gameRoot.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);
        UIManager_1.UIManager.ins.widgetLayer.active = false;
        this.schedule(this.onLazyUpdate, 1 / 20);
        //预加载弹窗
        cc.resources.preload([Global_1.WindowName.BATTLE_RESULT, Global_1.WindowName.USER_SKILL_INFO, Global_1.WindowName.BATTLE_RESULT_PRE_ANI], cc.Prefab);
        BattleConst_1.getGlobalNode().on(Global_1.GlobalEvent.SHAKE, this.onShake, this);
    };
    BattleScene.prototype.onDisable = function () {
        this._gameRoot.off(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);
        this.unschedule(this.onLazyUpdate);
    };
    BattleScene.prototype.onDestroy = function () {
        BattleManager_1.BattleManager.ins.eventNode.targetOff(this);
        BattleConst_1.getGlobalNode().targetOff(this);
        // BattleManager.ins.eventNode.on(BattleEvent.SKILL_START, this.onSkillStart, this);
    };
    BattleScene.prototype.start = function () {
        this._gameRoot.getComponent(cc.Widget).updateAlignment(); //第二次进场景时 widiget没有更新,手动更新下
        // this._diagonal = Math.sqrt(this._gameRoot.width * this._gameRoot.width + this._gameRoot.height * this._gameRoot.height); //对角线长
        if (UITitleData_1.UITitleData.id == 0) {
            BattleManager_1.BattleManager.ins.startBattle(0, this.onMapLoaded, this, this.prefabCollection);
        }
        else {
            BattleManager_1.BattleManager.ins.startBattle(UITitleData_1.UITitleData.id, this.onMapLoaded, this, this.prefabCollection);
        }
        var introConfig = IntroTableMgr_1.IntroTableMgr.ins.getTableByLevel(UITitleData_1.UITitleData.id);
        if (introConfig) {
            //需要弹提示
            UIManager_1.UIManager.ins.openWindow(Global_1.WindowName.INTRO, introConfig.Level);
        }
        else {
            //不需要弹提示,且未使用黄金瞄准期间,概率弹出黄金瞄准
            if (Date.now() > SaveDataManager_1.SaveDataManager.ins.runtimeData.goldenAimEndTime) {
                var rate = Global_1.tMgr.getConfig(TableDefine_1.TableName.GAME_PLAY, 30).Value;
                if (slib.MathUtil.getRandom(0, 100) < rate) {
                    UIManager_1.UIManager.ins.openWindow(Global_1.WindowName.GOLDEN_AIM);
                }
            }
        }
        this._gameRoot.getChildByName('tips1').active = false;
        this._gameRoot.getChildByName('tips2').active = false;
        this._gameRoot.getChildByName('guideAim').active = false;
        if (UITitleData_1.UITitleData.id == 1 || UITitleData_1.UITitleData.id == 2) {
            //提示
            this._gameRoot.getChildByName('tips1').active = true;
            this._gameRoot.getChildByName('tips2').active = true;
            this._gameRoot.getChildByName('guideAim').active = true;
            this._gameRoot.getChildByName('tips1').getComponent(cc.Label).string = Global_1.tMgr.getConfig(TableDefine_1.TableName.GAME_PLAY, 28).Comment;
            this._gameRoot.getChildByName('tips2').getComponent(cc.Label).string = Global_1.tMgr.getConfig(TableDefine_1.TableName.GAME_PLAY, 29).Comment;
        }
    };
    BattleScene.prototype.onLazyUpdate = function () {
        if (BattleManager_1.BattleManager.ins.curBattle) {
            if (BattleManager_1.BattleManager.ins.curBattle.roundRunning) {
                this._ballNumNode.getComponentInChildren(cc.Label).string = BattleManager_1.BattleManager.ins.curBattle.marblesCollectCount.toString();
            }
            else {
                var rate = (BattleManager_1.BattleManager.ins.curBattle.doubleShoot ? 2 : 1);
                this._ballNumNode.getComponentInChildren(cc.Label).string = (BattleManager_1.BattleManager.ins.curBattle.marblesNum * rate).toString();
            }
        }
    };
    // update (dt) {}
    //#endregion
    //#region public method
    //#endregion
    //#region private method
    BattleScene.prototype.onMapLoaded = function () {
        this._mapView = BattleManager_1.BattleManager.ins.curBattle.mapView;
        var scale = this._gameRoot.width / this._mapView.width;
        this._mapView.setScale(scale, scale); // 按宽度缩放
        this._mapView.setPosition(0, -this._gameRoot.height / 2 + this._mapView.height * scale / 2); //将 mapView和gameRoot底端对齐
        BattleManager_1.BattleManager.ins.curBattle.scale = scale;
        this._gameRoot.addChild(this._mapView);
        this._spliterNode = this._gameRoot.getChildByName('spliter');
        this._spliterNode.removeFromParent();
        this._mapView.addChild(this._spliterNode);
        this._pointerNode = this._gameRoot.getChildByName('imgPointer');
        this._pointerNode.removeFromParent();
        this._mapView.addChild(this._pointerNode);
        this._ballNumNode = this._pointerNode.getChildByName('numNode');
        if (UITitleData_1.UITitleData.id == 1 || UITitleData_1.UITitleData.id == 2) {
            //提示
            var tips = this._gameRoot.getChildByName('tips1');
            var gridPos = (UITitleData_1.UITitleData.id == 1 ? cc.v2(4, 5) : cc.v2(5, 7));
            var pos = BattleManager_1.BattleManager.ins.curBattle.mapData.getPixelPosByGridPos(gridPos);
            this.mapView.convertToWorldSpaceAR(pos, pos);
            this._gameRoot.convertToNodeSpaceAR(pos, pos);
            tips.setPosition(pos);
            gridPos = (UITitleData_1.UITitleData.id == 1 ? cc.v2(7, 4) : cc.v2(10, 6));
            pos = BattleManager_1.BattleManager.ins.curBattle.mapData.getPixelPosByGridPos(gridPos);
            this.mapView.convertToWorldSpaceAR(pos, pos);
            this._gameRoot.convertToNodeSpaceAR(pos, pos);
            this._gameRoot.getChildByName('guideAim').active = true;
            this._gameRoot.getChildByName('guideAim').setPosition(pos);
        }
        this.onRoundEnd();
    };
    BattleScene.prototype.testRayLineNew = function (vec) {
        this._hitPList.length = 0;
        var v = cc.v2();
        vec.normalize(v);
        // let speed = (tMgr.getConfig(TableName.GAME_PLAY, 3) as GamePlayTable).Value
        v.multiplyScalar(200); //速度固定为200,避免高速带来的误差,避免速度太慢带来的性能开销
        PhysicsControl_1.PhysicsControl.ins.setPhysicsEnable(true);
        this._mapView.testBall.setPosition(BattleManager_1.BattleManager.ins.curBattle.marblesBornPos);
        this._mapView.testBall.getComponent(cc.RigidBody).linearVelocity = v;
        // let len = (tMgr.getConfig(TableName.GAME_PLAY, 9) as GamePlayTable).Value
        // let time = len / speed;
        // for (let i = 0; i < 10; ++i) {
        // PhysicsControl.ins.update(time);
        // }
        // PhysicsControl.ins.setPhysicsEnable(false);
        var goldenAim = (SaveDataManager_1.SaveDataManager.ins.runtimeData.goldenAimTry || Date.now() <= SaveDataManager_1.SaveDataManager.ins.runtimeData.goldenAimEndTime);
        var hitCount = (goldenAim ? 3 : 1);
        while (this._hitPList.length < hitCount) {
            PhysicsControl_1.PhysicsControl.ins.update(1 / 60);
        }
        PhysicsControl_1.PhysicsControl.ins.update(2 / 60);
        PhysicsControl_1.PhysicsControl.ins.setPhysicsEnable(false);
        this._hitPList = this._hitPList.slice(0, hitCount);
        var i = 0;
        for (i; i < this._hitPList.length; ++i) {
            if (i == 0) {
                this.drawLine(this._ballWorldP, this._hitPList[i]);
            }
            else {
                this.drawLine(this._hitPList[i - 1], this._hitPList[i]);
            }
            var ball = void 0;
            if (i < this._hitBallList.length) {
                ball = this._hitBallList[i];
            }
            else {
                ball = cc.instantiate(BattleManager_1.BattleManager.ins.curBattle.prefabCollection.getChildByName('ball'));
                ball.getComponent(Ball_1.default).scaleEnable = false;
                ball.getComponent(cc.Collider).enabled = false;
                ball.getChildByName('img').getComponent(cc.Sprite).sizeMode = cc.Sprite.SizeMode.CUSTOM;
                var colliderSize = ball.getComponent(cc.PhysicsCircleCollider).radius * 2;
                ball.getChildByName('img').setContentSize(colliderSize, colliderSize);
                ball.getChildByName('img').scale = 1;
                // ball.scale = 0.5;
                this._hitBallList.push(ball);
                this._gameRoot.addChild(ball);
            }
            ball.active = true;
            var pos = this._gameRoot.convertToNodeSpaceAR(this._hitPList[i]);
            ball.setPosition(pos);
        }
        for (i; i < this._hitBallList.length; ++i) {
            this._hitBallList[i].active = false;
        }
        // let t = this._mapView.convertToWorldSpaceAR(this._mapView.testBall.position);
        // let tt = cc.v2(t.x, t.y);
        // if (this._hitPList.length == 0) {
        //     this.drawLine(this._ballWorldP, tt);
        // }
        // else {
        // this.drawLine(this._hitPList[this._hitPList.length - 1], tt);
        // }
        // this._lastCollisionV.normalizeSelf();
        // this._lastCollisionV.multiplyScalar(100);
        var lastPoint = this._hitPList[this._hitPList.length - 1];
        var t = this._mapView.convertToWorldSpaceAR(this._mapView.testBall.position);
        var tt = cc.v2(t.x - lastPoint.x, t.y - lastPoint.y); //从终点指向小球的向量
        tt.normalizeSelf();
        tt.multiplyScalar(Global_1.tMgr.getConfig(TableDefine_1.TableName.GAME_PLAY, 9).Value);
        tt.x = lastPoint.x + tt.x;
        tt.y = lastPoint.y + tt.y;
        this.drawLine(this._hitPList[this._hitPList.length - 1], tt);
    };
    // private _lastCollisionV: cc.Vec2 = new cc.Vec2();
    BattleScene.prototype.onTestBallCollision = function (contact, selfCollider, otherCollider) {
        // let manifold = contact.getWorldManifold();
        // if (manifold.points.length > 0) {
        //     this._hitPList.push(cc.v2(manifold.points[0].x, manifold.points[0].y));
        // }
        this._hitPList.push(selfCollider.node.convertToWorldSpaceAR(cc.Vec2.ZERO));
    };
    BattleScene.prototype.drawLine = function (worldStart, worldEnd) {
        var goldenAim = (SaveDataManager_1.SaveDataManager.ins.runtimeData.goldenAimTry || Date.now() <= SaveDataManager_1.SaveDataManager.ins.runtimeData.goldenAimEndTime);
        var g = this._gameRoot.getComponent(cc.Graphics);
        g.fillColor.fromHEX(goldenAim ? '#FFFF00' : '#FFFFFF');
        var gStart = this._gameRoot.convertToNodeSpaceAR(worldStart);
        var gEnd = this._gameRoot.convertToNodeSpaceAR(worldEnd);
        var vec = cc.v2();
        cc.Vec2.subtract(vec, gEnd, gStart);
        var len = vec.mag();
        var step = 0;
        var lerpVec = cc.v2();
        while (true) {
            var ratio = step / len;
            var end = false;
            if (ratio > 1) {
                ratio = 1;
                end = true;
            }
            gEnd.lerp(gStart, ratio, lerpVec);
            // g.moveTo();
            g.circle(lerpVec.x, lerpVec.y, 3);
            g.fill();
            step += 20;
            if (end) {
                break;
            }
        }
    };
    BattleScene.prototype.changePointer = function (double) {
        // let ballNode = this._pointerNode.getChildByName('ball');
        // ballNode.active = !double;
        this._spliterNode.active = double;
        if (double) {
            BattleManager_1.BattleManager.ins.shootTouchEnable = false;
            this._spliterNode.getComponent(cc.Animation).once('finished', function () { BattleManager_1.BattleManager.ins.shootTouchEnable = true; }, this);
            this._spliterNode.getComponent(cc.Animation).play('ani_gun001');
            this._spliterNode.setPosition(BattleManager_1.BattleManager.ins.curBattle.marblesBornPos);
        }
    };
    //#endregion
    //#region event
    BattleScene.prototype.onTouchStart = function (e) {
        if (!BattleManager_1.BattleManager.ins.shootTouchEnable) {
            return;
        }
        this.node.getChildByName('UIBattle').getComponent(UIBattle_1.default).setCancelNodeVisible(true);
        this._gameRoot.on(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
        this._gameRoot.on(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);
        this._gameRoot.on(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);
        this._mapView.testBall.active = true;
        this.onTouchMove(e);
        var chargingNode = this._pointerNode.getChildByName('chargingNode');
        chargingNode.active = true;
        chargingNode.getComponent(cc.Animation).play('fx_xuli_001');
    };
    BattleScene.prototype.onTouchMove = function (e) {
        var touchP = e.getLocation();
        // cc.Vec2.subtract(this._pointerVec, touchP, this._ballWorldP);
        var deg = slib.MathUtil.get360DegByVec(touchP.x - this._ballWorldP.x, touchP.y - this._ballWorldP.y);
        if (deg < this._minShootDeg || deg > 180 - this._minShootDeg) {
            this.node.getChildByName('UIBattle').getComponent(UIBattle_1.default).setCancelNodeHit(true);
            return;
        }
        this.node.getChildByName('UIBattle').getComponent(UIBattle_1.default).setCancelNodeHit(false);
        cc.Vec2.subtract(this._pointerVec, touchP, this._ballWorldP);
        this._gameRoot.getComponent(cc.Graphics).clear();
        this.testRayLineNew(this._pointerVec);
        //旋转指针
        if (BattleManager_1.BattleManager.ins.curBattle.doubleShoot) {
            var deg_1 = slib.MathUtil.get360DegByVec(this._pointerVec.x, this._pointerVec.y);
            var nodeA = this._spliterNode.getChildByName('ani_guna');
            var nodeB = this._spliterNode.getChildByName('ani_gunb');
            nodeA.angle = deg_1 - 90; //指向正上方
            nodeB.angle = (90 - deg_1);
            var otherPointer = cc.v2(-this._pointerVec.x, this._pointerVec.y);
            this.testRayLineNew(otherPointer);
        }
    };
    BattleScene.prototype.onTouchCancel = function () {
        var pointer = this._mapView.getChildByName('imgPointer');
        pointer.angle = 0;
        // let g = this._gameRoot.getComponent(cc.Graphics);
        // g.clear();
        this._gameRoot.off(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
        this._gameRoot.off(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);
        this._gameRoot.off(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);
        this.node.getChildByName('UIBattle').getComponent(UIBattle_1.default).setCancelNodeVisible(false);
        var chargingNode = this._pointerNode.getChildByName('chargingNode');
        chargingNode.getComponent(cc.Animation).stop('fx_xuli_001');
        chargingNode.active = false;
        this._mapView.testBall.active = false;
        this._gameRoot.getComponent(cc.Graphics).clear();
        for (var i = 0; i < this._hitBallList.length; ++i) {
            this._hitBallList[i].active = false;
        }
    };
    BattleScene.prototype.onTouchEnd = function () {
        this.onTouchCancel();
        BattleManager_1.BattleManager.ins.curBattle.shoot(this._pointerVec);
        this._gameRoot.getChildByName('tips1').active = false;
        this._gameRoot.getChildByName('guideAim').active = false;
    };
    BattleScene.prototype.onSkillStart = function (skillId) {
        if (skillId == BattleConst_1.UserSkill.DOUBLE_SHOOT) {
            this.changePointer(true);
        }
        else if (skillId == BattleConst_1.UserSkill.SHIELD) {
            this.setShieldEnable(true);
        }
    };
    BattleScene.prototype.onSkillEnd = function (skillId) {
        if (skillId == BattleConst_1.UserSkill.SHIELD) {
            this.setShieldEnable(false);
        }
    };
    BattleScene.prototype.onBornPosChange = function () {
        this._pointerNode.getChildByName('ball').active = true;
        this._pointerNode.setPosition(BattleManager_1.BattleManager.ins.curBattle.marblesBornPosNextRound);
    };
    BattleScene.prototype.onRoundEnd = function () {
        this._ballWorldP = this._mapView.convertToWorldSpaceAR(BattleManager_1.BattleManager.ins.curBattle.marblesBornPos);
        this._pointerNode.setPosition(BattleManager_1.BattleManager.ins.curBattle.marblesBornPos);
        this.changePointer(false);
    };
    BattleScene.prototype.setShieldEnable = function (value) {
        var effectNode = cc.find('GameRoot/borderCollector/effect', this.node);
        effectNode.active = value;
        if (value) {
            var duration = effectNode.getComponent(cc.Animation).play('fx_gl_chzd_001').duration;
            this.schedule(function () {
                effectNode.getComponent(cc.Animation).play('fx_gl_chzd_002');
            }, duration, 1);
        }
        else {
            // this.unscheduleAllCallbacks();
        }
    };
    BattleScene.prototype.onShake = function (value) {
        var ani = this.node.getChildByName('Main Camera').getComponent(cc.Animation);
        if (value) {
            ani.stop('ani_shake');
            ani.play('ani_shake');
        }
        else {
            this.node.getChildByName('Main Camera').setPosition(0, 0, 0);
            // let state = ani.getAnimationState('ani_shake');
            // state.time = 0;
            // state.stop();
            ani.stop('ani_shake');
        }
        // ani.play('ani_shake');
    };
    __decorate([
        property(cc.Prefab)
    ], BattleScene.prototype, "prefabCollection", void 0);
    BattleScene = __decorate([
        ccclass
    ], BattleScene);
    return BattleScene;
}(cc.Component));
exports.default = BattleScene;

cc._RF.pop();
                    }
                    if (nodeEnv) {
                        __define(__module.exports, __require, __module);
                    }
                    else {
                        __quick_compile_project__.registerModuleFunc(__filename, function () {
                            __define(__module.exports, __require, __module);
                        });
                    }
                })();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcc2NyaXB0c1xcc2NlbmVzXFxCYXR0bGVTY2VuZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0JBQW9CO0FBQ3BCLHdFQUF3RTtBQUN4RSxtQkFBbUI7QUFDbkIsa0ZBQWtGO0FBQ2xGLDhCQUE4QjtBQUM5QixrRkFBa0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVsRixnRUFBK0Q7QUFDL0Qsb0NBQTBEO0FBQzFELDREQUFxRjtBQUNyRixnRUFBK0Q7QUFFL0QsbUVBQWtFO0FBQ2xFLCtEQUE4RDtBQUM5RCwyREFBdUU7QUFDdkUsd0NBQW1DO0FBQ25DLDZDQUE0QztBQUM1QyxrREFBNkM7QUFDN0Msd0RBQXVEO0FBRWpELElBQUEsS0FBd0IsRUFBRSxDQUFDLFVBQVUsRUFBbkMsT0FBTyxhQUFBLEVBQUUsUUFBUSxjQUFrQixDQUFDO0FBRzVDO0lBQXlDLCtCQUFZO0lBQXJEO1FBQUEscUVBZ2VDO1FBNWRHLHNCQUFnQixHQUFjLElBQUksQ0FBQztRQVEzQixpQkFBVyxHQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMvQixpQkFBVyxHQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQU8vQixlQUFTLEdBQWMsRUFBRSxDQUFDO1FBQzFCLGtCQUFZLEdBQWMsRUFBRSxDQUFDO1FBQzdCLGtCQUFZLEdBQVcsQ0FBQyxDQUFDOztRQXdjakMsWUFBWTtJQUVoQixDQUFDO0lBdGRHLHNCQUFJLGdDQUFPO2FBQVgsY0FBeUIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFjaEQsZ0NBQWdDO0lBRWhDLDRCQUFNLEdBQU47UUFDSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELDZCQUFhLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMseUJBQVcsQ0FBQyxTQUFT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O1lBQ2hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDekI7UUFFRCx5QkFBeUI7SUFDN0IsQ0FBQztJQXhkRDtRQURDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO3lEQUNlO0lBSmxCLFdBQVc7UUFEL0IsT0FBTztPQUNhLFdBQVcsQ0FnZS9CO0lBQUQsa0JBQUM7Q0FoZUQsQUFnZUMsQ0FoZXdDLEVBQUUsQ0FBQyxTQUFTLEdBZ2VwRDtrQkFoZW9CLFdBQVciLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBMZWFybiBUeXBlU2NyaXB0OlxyXG4vLyAgLSBodHRwczovL2RvY3MuY29jb3MuY29tL2NyZWF0b3IvbWFudWFsL2VuL3NjcmlwdGluZy90eXBlc2NyaXB0Lmh0bWxcclxuLy8gTGVhcm4gQXR0cmlidXRlOlxyXG4vLyAgLSBodHRwczovL2RvY3MuY29jb3MuY29tL2NyZWF0b3IvbWFudWFsL2VuL3NjcmlwdGluZy9yZWZlcmVuY2UvYXR0cmlidXRlcy5odG1sXHJcbi8vIExlYXJuIGxpZmUtY3ljbGUgY2FsbGJhY2tzOlxyXG4vLyAgLSBodHRwczovL2RvY3MuY29jb3MuY29tL2NyZWF0b3IvbWFudWFsL2VuL3NjcmlwdGluZy9saWZlLWN5Y2xlLWNhbGxiYWNrcy5odG1sXHJcblxyXG5pbXBvcnQgeyBTYXZlRGF0YU1hbmFnZXIgfSBmcm9tIFwiLi4vY29tcG9uZW50L1NhdmVEYXRhTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBHbG9iYWxFdmVudCwgdE1nciwgV2luZG93TmFtZSB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHsgQmF0dGxlRXZlbnQsIGdldEdsb2JhbE5vZGUsIFVzZXJTa2lsbCB9IGZyb20gXCIuLi9rZXJuZWwvYmF0dGxlL0JhdHRsZUNvbnN0XCI7XHJcbmltcG9ydCB7IEJhdHRsZU1hbmFnZXIgfSBmcm9tIFwiLi4va2VybmVsL2JhdHRsZS9CYXR0bGVNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IE1hcFZpZXcgfSBmcm9tIFwiLi4va2VybmVsL2JhdHRsZS9tYXAvTWFwVmlld1wiO1xyXG5pbXBvcnQgeyBQaHlzaWNzQ29udHJvbCB9IGZyb20gXCIuLi9rZXJuZWwvcGh5c2ljcy9QaHlzaWNzQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBJbnRyb1RhYmxlTWdyIH0gZnJvbSBcIi4uL2tlcm5lbC90YWJsZS9JbnRyb1RhYmxlTWdyXCI7XHJcbmltcG9ydCB7IEdhbWVQbGF5VGFibGUsIFRhYmxlTmFtZSB9IGZyb20gXCIuLi9rZXJuZWwvdGFibGUvVGFibGVEZWZpbmVcIjtcclxuaW1wb3J0IEJhbGwgZnJvbSBcIi4uL3ByZWZhYnMvQmFsbFwiO1xyXG5pbXBvcnQgeyBVSU1hbmFnZXIgfSBmcm9tIFwiLi4vdWkvVUlNYW5hZ2VyXCI7XHJcbmltcG9ydCBVSUJhdHRsZSBmcm9tIFwiLi4vdWkvdWlWaWV3L1VJQmF0dGxlXCI7XHJcbmltcG9ydCB7IFVJVGl0bGVEYXRhIH0gZnJvbSBcIi4uL3VpL3VpVmlldy9VSVRpdGxlRGF0YVwiO1xyXG5cclxuY29uc3QgeyBjY2NsYXNzLCBwcm9wZXJ0eSB9ID0gY2MuX2RlY29yYXRvcjtcclxuXHJcbkBjY2NsYXNzXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhdHRsZVNjZW5lIGV4dGVuZHMgY2MuQ29tcG9uZW50IHtcclxuXHJcblxyXG4gICAgQHByb3BlcnR5KGNjLlByZWZhYilcclxuICAgIHByZWZhYkNvbGxlY3Rpb246IGNjLlByZWZhYiA9IG51bGw7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBfZGlhZ29uYWw6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9nYW1lUm9vdDogY2MuTm9kZTtcclxuXHJcbiAgICBwcml2YXRlIF9tYXBWaWV3OiBNYXBWaWV3O1xyXG4gICAgZ2V0IG1hcFZpZXcoKTogTWFwVmlldyB7IHJldHVybiB0aGlzLl9tYXBWaWV3OyB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcG9pbnRlclZlYzogY2MuVmVjMiA9IGNjLnYyKCk7XHJcbiAgICBwcml2YXRlIF9iYWxsV29ybGRQOiBjYy5WZWMyID0gY2MudjIoKTtcclxuICAgIC8vIHByaXZhdGUgX2VuZFA6IGNjLlZlYzIgPSBjYy52MigpO1xyXG4gICAgcHJpdmF0ZSBfcG9pbnRlck5vZGU6IGNjLk5vZGU7XHJcbiAgICAvKirliIboo4Lngq7oioLngrkgKi9cclxuICAgIHByaXZhdGUgX3NwbGl0ZXJOb2RlOiBjYy5Ob2RlO1xyXG4gICAgcHJpdmF0ZSBfYmFsbE51bU5vZGU6IGNjLk5vZGU7XHJcblxyXG4gICAgcHJpdmF0ZSBfaGl0UExpc3Q6IGNjLlZlYzJbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfaGl0QmFsbExpc3Q6IGNjLk5vZGVbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfbWluU2hvb3REZWc6IG51bWJlciA9IDE7XHJcblxyXG4gICAgLy8jcmVnaW9uICBMSUZFLUNZQ0xFIENBTExCQUNLUzpcclxuXHJcbiAgICBvbkxvYWQoKSB7XHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3QgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ0dhbWVSb290Jyk7XHJcbiAgICAgICAgQmF0dGxlTWFuYWdlci5pbnMuZXZlbnROb2RlLm9uKEJhdHRsZUV2ZW50LlJPVU5EX0VORCwgdGhpcy5vblJvdW5kRW5kLCB0aGlzKTtcclxuICAgICAgICBCYXR0bGVNYW5hZ2VyLmlucy5ldmVudE5vZGUub24oQmF0dGxlRXZlbnQuU0tJTExfU1RBUlQsIHRoaXMub25Ta2lsbFN0YXJ0LCB0aGlzKTtcclxuICAgICAgICBCYXR0bGVNYW5hZ2VyLmlucy5ldmVudE5vZGUub24oQmF0dGxlRXZlbnQuU0tJTExfRU5ELCB0aGlzLm9uU2tpbGxFbmQsIHRoaXMpO1xyXG4gICAgICAgIEJhdHRsZU1hbmFnZXIuaW5zLmV2ZW50Tm9kZS5vbihCYXR0bGVFdmVudC5CT1JOX1BPU19DSEFOR0UsIHRoaXMub25Cb3JuUG9zQ2hhbmdlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWluU2hvb3REZWcgPSAodE1nci5nZXRDb25maWcoVGFibGVOYW1lLkdBTUVfUExBWSwgMTApIGFzIEdhbWVQbGF5VGFibGUpLlZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkVuYWJsZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9nYW1lUm9vdC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9TVEFSVCwgdGhpcy5vblRvdWNoU3RhcnQsIHRoaXMpO1xyXG4gICAgICAgIFVJTWFuYWdlci5pbnMud2lkZ2V0TGF5ZXIuYWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuc2NoZWR1bGUodGhpcy5vbkxhenlVcGRhdGUsIDEgLyAyMCk7XHJcblxyXG4gICAgICAgIC8v6aKE5Yqg6L295by556qXXHJcbiAgICAgICAgY2MucmVzb3VyY2VzLnByZWxvYWQoW1dpbmRvd05hbWUuQkFUVExFX1JFU1VMVCwgV2luZG93TmFtZS5VU0VSX1NLSUxMX0lORk8sIFdpbmRvd05hbWUuQkFUVExFX1JFU1VMVF9QUkVfQU5JXSwgY2MuUHJlZmFiKTtcclxuXHJcbiAgICAgICAgZ2V0R2xvYmFsTm9kZSgpLm9uKEdsb2JhbEV2ZW50LlNIQUtFLCB0aGlzLm9uU2hha2UsIHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkRpc2FibGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3Qub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCB0aGlzLm9uVG91Y2hTdGFydCwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy51bnNjaGVkdWxlKHRoaXMub25MYXp5VXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIEJhdHRsZU1hbmFnZXIuaW5zLmV2ZW50Tm9kZS50YXJnZXRPZmYodGhpcyk7XHJcbiAgICAgICAgZ2V0R2xvYmFsTm9kZSgpLnRhcmdldE9mZih0aGlzKTtcclxuICAgICAgICAvLyBCYXR0bGVNYW5hZ2VyLmlucy5ldmVudE5vZGUub24oQmF0dGxlRXZlbnQuU0tJTExfU1RBUlQsIHRoaXMub25Ta2lsbFN0YXJ0LCB0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuXHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3QuZ2V0Q29tcG9uZW50KGNjLldpZGdldCkudXBkYXRlQWxpZ25tZW50KCk7IC8v56ys5LqM5qyh6L+b5Zy65pmv5pe2IHdpZGlnZXTmsqHmnInmm7TmlrDvvIzmiYvliqjmm7TmlrDkuItcclxuICAgICAgICAvLyB0aGlzLl9kaWFnb25hbCA9IE1hdGguc3FydCh0aGlzLl9nYW1lUm9vdC53aWR0aCAqIHRoaXMuX2dhbWVSb290LndpZHRoICsgdGhpcy5fZ2FtZVJvb3QuaGVpZ2h0ICogdGhpcy5fZ2FtZVJvb3QuaGVpZ2h0KTsgLy/lr7nop5Lnur/plb9cclxuXHJcbiAgICAgICAgaWYgKFVJVGl0bGVEYXRhLmlkID09IDApIHtcclxuICAgICAgICAgICAgQmF0dGxlTWFuYWdlci5pbnMuc3RhcnRCYXR0bGUoMCwgdGhpcy5vbk1hcExvYWRlZCwgdGhpcywgdGhpcy5wcmVmYWJDb2xsZWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIEJhdHRsZU1hbmFnZXIuaW5zLnN0YXJ0QmF0dGxlKFVJVGl0bGVEYXRhLmlkLCB0aGlzLm9uTWFwTG9hZGVkLCB0aGlzLCB0aGlzLnByZWZhYkNvbGxlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGludHJvQ29uZmlnID0gSW50cm9UYWJsZU1nci5pbnMuZ2V0VGFibGVCeUxldmVsKFVJVGl0bGVEYXRhLmlkKTtcclxuICAgICAgICBpZiAoaW50cm9Db25maWcpIHtcclxuICAgICAgICAgICAgLy/pnIDopoHlvLnmj5DnpLpcclxuICAgICAgICAgICAgVUlNYW5hZ2VyLmlucy5vcGVuV2luZG93KFdpbmRvd05hbWUuSU5UUk8sIGludHJvQ29uZmlnLkxldmVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAvL+S4jemcgOimgeW8ueaPkOekuu+8jOS4lOacquS9v+eUqOm7hOmHkeeehOWHhuacn+mXtO+8jOamgueOh+W8ueWHuum7hOmHkeeehOWHhlxyXG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IFNhdmVEYXRhTWFuYWdlci5pbnMucnVudGltZURhdGEuZ29sZGVuQWltRW5kVGltZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJhdGUgPSAodE1nci5nZXRDb25maWcoVGFibGVOYW1lLkdBTUVfUExBWSwgMzApIGFzIEdhbWVQbGF5VGFibGUpLlZhbHVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNsaWIuTWF0aFV0aWwuZ2V0UmFuZG9tKDAsIDEwMCkgPCByYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgVUlNYW5hZ2VyLmlucy5vcGVuV2luZG93KFdpbmRvd05hbWUuR09MREVOX0FJTSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCd0aXBzMScpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCd0aXBzMicpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCdndWlkZUFpbScpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChVSVRpdGxlRGF0YS5pZCA9PSAxIHx8IFVJVGl0bGVEYXRhLmlkID09IDIpIHtcclxuICAgICAgICAgICAgLy/mj5DnpLpcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuZ2V0Q2hpbGRCeU5hbWUoJ3RpcHMxJykuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuZ2V0Q2hpbGRCeU5hbWUoJ3RpcHMyJykuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuZ2V0Q2hpbGRCeU5hbWUoJ2d1aWRlQWltJykuYWN0aXZlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCd0aXBzMScpLmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gKHRNZ3IuZ2V0Q29uZmlnKFRhYmxlTmFtZS5HQU1FX1BMQVksIDI4KSBhcyBHYW1lUGxheVRhYmxlKS5Db21tZW50O1xyXG4gICAgICAgICAgICB0aGlzLl9nYW1lUm9vdC5nZXRDaGlsZEJ5TmFtZSgndGlwczInKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9ICh0TWdyLmdldENvbmZpZyhUYWJsZU5hbWUuR0FNRV9QTEFZLCAyOSkgYXMgR2FtZVBsYXlUYWJsZSkuQ29tbWVudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25MYXp5VXBkYXRlKCkge1xyXG4gICAgICAgIGlmIChCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUpIHtcclxuICAgICAgICAgICAgaWYgKEJhdHRsZU1hbmFnZXIuaW5zLmN1ckJhdHRsZS5yb3VuZFJ1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2JhbGxOdW1Ob2RlLmdldENvbXBvbmVudEluQ2hpbGRyZW4oY2MuTGFiZWwpLnN0cmluZyA9IEJhdHRsZU1hbmFnZXIuaW5zLmN1ckJhdHRsZS5tYXJibGVzQ29sbGVjdENvdW50LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmF0ZSA9IChCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUuZG91YmxlU2hvb3QgPyAyIDogMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9iYWxsTnVtTm9kZS5nZXRDb21wb25lbnRJbkNoaWxkcmVuKGNjLkxhYmVsKS5zdHJpbmcgPSAoQmF0dGxlTWFuYWdlci5pbnMuY3VyQmF0dGxlLm1hcmJsZXNOdW0gKiByYXRlKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHVwZGF0ZSAoZHQpIHt9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIHB1YmxpYyBtZXRob2RcclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gcHJpdmF0ZSBtZXRob2RcclxuXHJcbiAgICBwcml2YXRlIG9uTWFwTG9hZGVkKCkge1xyXG5cclxuICAgICAgICB0aGlzLl9tYXBWaWV3ID0gQmF0dGxlTWFuYWdlci5pbnMuY3VyQmF0dGxlLm1hcFZpZXc7XHJcblxyXG4gICAgICAgIGxldCBzY2FsZSA9IHRoaXMuX2dhbWVSb290LndpZHRoIC8gdGhpcy5fbWFwVmlldy53aWR0aDtcclxuICAgICAgICB0aGlzLl9tYXBWaWV3LnNldFNjYWxlKHNjYWxlLCBzY2FsZSk7IC8vIOaMieWuveW6pue8qeaUvlxyXG4gICAgICAgIHRoaXMuX21hcFZpZXcuc2V0UG9zaXRpb24oMCwgLSB0aGlzLl9nYW1lUm9vdC5oZWlnaHQgLyAyICsgdGhpcy5fbWFwVmlldy5oZWlnaHQgKiBzY2FsZSAvIDIpOyAvL+WwhiBtYXBWaWV35ZKMZ2FtZVJvb3TlupXnq6/lr7npvZBcclxuICAgICAgICBCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUuc2NhbGUgPSBzY2FsZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3QuYWRkQ2hpbGQodGhpcy5fbWFwVmlldyk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NwbGl0ZXJOb2RlID0gdGhpcy5fZ2FtZVJvb3QuZ2V0Q2hpbGRCeU5hbWUoJ3NwbGl0ZXInKTtcclxuICAgICAgICB0aGlzLl9zcGxpdGVyTm9kZS5yZW1vdmVGcm9tUGFyZW50KCk7XHJcbiAgICAgICAgdGhpcy5fbWFwVmlldy5hZGRDaGlsZCh0aGlzLl9zcGxpdGVyTm9kZSk7XHJcbiAgICAgICAgdGhpcy5fcG9pbnRlck5vZGUgPSB0aGlzLl9nYW1lUm9vdC5nZXRDaGlsZEJ5TmFtZSgnaW1nUG9pbnRlcicpO1xyXG4gICAgICAgIHRoaXMuX3BvaW50ZXJOb2RlLnJlbW92ZUZyb21QYXJlbnQoKTtcclxuICAgICAgICB0aGlzLl9tYXBWaWV3LmFkZENoaWxkKHRoaXMuX3BvaW50ZXJOb2RlKTtcclxuICAgICAgICB0aGlzLl9iYWxsTnVtTm9kZSA9IHRoaXMuX3BvaW50ZXJOb2RlLmdldENoaWxkQnlOYW1lKCdudW1Ob2RlJyk7XHJcblxyXG4gICAgICAgIGlmIChVSVRpdGxlRGF0YS5pZCA9PSAxIHx8IFVJVGl0bGVEYXRhLmlkID09IDIpIHtcclxuICAgICAgICAgICAgLy/mj5DnpLpcclxuICAgICAgICAgICAgbGV0IHRpcHMgPSB0aGlzLl9nYW1lUm9vdC5nZXRDaGlsZEJ5TmFtZSgndGlwczEnKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBncmlkUG9zID0gKFVJVGl0bGVEYXRhLmlkID09IDEgPyBjYy52Mig0LCA1KSA6IGNjLnYyKDUsIDcpKTtcclxuICAgICAgICAgICAgbGV0IHBvcyA9IEJhdHRsZU1hbmFnZXIuaW5zLmN1ckJhdHRsZS5tYXBEYXRhLmdldFBpeGVsUG9zQnlHcmlkUG9zKGdyaWRQb3MpO1xyXG4gICAgICAgICAgICB0aGlzLm1hcFZpZXcuY29udmVydFRvV29ybGRTcGFjZUFSKHBvcywgcG9zKTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuY29udmVydFRvTm9kZVNwYWNlQVIocG9zLCBwb3MpO1xyXG4gICAgICAgICAgICB0aXBzLnNldFBvc2l0aW9uKHBvcyk7XHJcblxyXG4gICAgICAgICAgICBncmlkUG9zID0gKFVJVGl0bGVEYXRhLmlkID09IDEgPyBjYy52Mig3LCA0KSA6IGNjLnYyKDEwLCA2KSk7XHJcbiAgICAgICAgICAgIHBvcyA9IEJhdHRsZU1hbmFnZXIuaW5zLmN1ckJhdHRsZS5tYXBEYXRhLmdldFBpeGVsUG9zQnlHcmlkUG9zKGdyaWRQb3MpO1xyXG4gICAgICAgICAgICB0aGlzLm1hcFZpZXcuY29udmVydFRvV29ybGRTcGFjZUFSKHBvcywgcG9zKTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuY29udmVydFRvTm9kZVNwYWNlQVIocG9zLCBwb3MpO1xyXG4gICAgICAgICAgICB0aGlzLl9nYW1lUm9vdC5nZXRDaGlsZEJ5TmFtZSgnZ3VpZGVBaW0nKS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9nYW1lUm9vdC5nZXRDaGlsZEJ5TmFtZSgnZ3VpZGVBaW0nKS5zZXRQb3NpdGlvbihwb3MpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vblJvdW5kRW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0ZXN0UmF5TGluZU5ldyh2ZWM6IGNjLlZlYzIpIHtcclxuXHJcbiAgICAgICAgdGhpcy5faGl0UExpc3QubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgbGV0IHYgPSBjYy52MigpO1xyXG4gICAgICAgIHZlYy5ub3JtYWxpemUodik7XHJcbiAgICAgICAgLy8gbGV0IHNwZWVkID0gKHRNZ3IuZ2V0Q29uZmlnKFRhYmxlTmFtZS5HQU1FX1BMQVksIDMpIGFzIEdhbWVQbGF5VGFibGUpLlZhbHVlXHJcbiAgICAgICAgdi5tdWx0aXBseVNjYWxhcigyMDApOyAvL+mAn+W6puWbuuWumuS4ujIwMO+8jOmBv+WFjemrmOmAn+W4puadpeeahOivr+W3ru+8jOmBv+WFjemAn+W6puWkquaFouW4puadpeeahOaAp+iDveW8gOmUgFxyXG5cclxuICAgICAgICBQaHlzaWNzQ29udHJvbC5pbnMuc2V0UGh5c2ljc0VuYWJsZSh0cnVlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFwVmlldy50ZXN0QmFsbC5zZXRQb3NpdGlvbihCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUubWFyYmxlc0Jvcm5Qb3MpO1xyXG4gICAgICAgIHRoaXMuX21hcFZpZXcudGVzdEJhbGwuZ2V0Q29tcG9uZW50KGNjLlJpZ2lkQm9keSkubGluZWFyVmVsb2NpdHkgPSB2O1xyXG5cclxuICAgICAgICAvLyBsZXQgbGVuID0gKHRNZ3IuZ2V0Q29uZmlnKFRhYmxlTmFtZS5HQU1FX1BMQVksIDkpIGFzIEdhbWVQbGF5VGFibGUpLlZhbHVlXHJcbiAgICAgICAgLy8gbGV0IHRpbWUgPSBsZW4gLyBzcGVlZDtcclxuXHJcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgKytpKSB7XHJcbiAgICAgICAgLy8gUGh5c2ljc0NvbnRyb2wuaW5zLnVwZGF0ZSh0aW1lKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIFBoeXNpY3NDb250cm9sLmlucy5zZXRQaHlzaWNzRW5hYmxlKGZhbHNlKTtcclxuXHJcbiAgICAgICAgbGV0IGdvbGRlbkFpbTogYm9vbGVhbiA9IChTYXZlRGF0YU1hbmFnZXIuaW5zLnJ1bnRpbWVEYXRhLmdvbGRlbkFpbVRyeSB8fCBEYXRlLm5vdygpIDw9IFNhdmVEYXRhTWFuYWdlci5pbnMucnVudGltZURhdGEuZ29sZGVuQWltRW5kVGltZSk7XHJcbiAgICAgICAgbGV0IGhpdENvdW50ID0gKGdvbGRlbkFpbSA/IDMgOiAxKTtcclxuXHJcbiAgICAgICAgd2hpbGUgKHRoaXMuX2hpdFBMaXN0Lmxlbmd0aCA8IGhpdENvdW50KSB7XHJcbiAgICAgICAgICAgIFBoeXNpY3NDb250cm9sLmlucy51cGRhdGUoMSAvIDYwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgUGh5c2ljc0NvbnRyb2wuaW5zLnVwZGF0ZSgyIC8gNjApO1xyXG5cclxuICAgICAgICBQaHlzaWNzQ29udHJvbC5pbnMuc2V0UGh5c2ljc0VuYWJsZShmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hpdFBMaXN0ID0gdGhpcy5faGl0UExpc3Quc2xpY2UoMCwgaGl0Q291bnQpO1xyXG5cclxuICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgZm9yIChpOyBpIDwgdGhpcy5faGl0UExpc3QubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICAgICAgaWYgKGkgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3TGluZSh0aGlzLl9iYWxsV29ybGRQLCB0aGlzLl9oaXRQTGlzdFtpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyYXdMaW5lKHRoaXMuX2hpdFBMaXN0W2kgLSAxXSwgdGhpcy5faGl0UExpc3RbaV0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgYmFsbDogY2MuTm9kZTtcclxuICAgICAgICAgICAgaWYgKGkgPCB0aGlzLl9oaXRCYWxsTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGJhbGwgPSB0aGlzLl9oaXRCYWxsTGlzdFtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJhbGwgPSBjYy5pbnN0YW50aWF0ZShCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUucHJlZmFiQ29sbGVjdGlvbi5nZXRDaGlsZEJ5TmFtZSgnYmFsbCcpKTtcclxuICAgICAgICAgICAgICAgIGJhbGwuZ2V0Q29tcG9uZW50KEJhbGwpLnNjYWxlRW5hYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBiYWxsLmdldENvbXBvbmVudChjYy5Db2xsaWRlcikuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYmFsbC5nZXRDaGlsZEJ5TmFtZSgnaW1nJykuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkuc2l6ZU1vZGUgPSBjYy5TcHJpdGUuU2l6ZU1vZGUuQ1VTVE9NO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbGxpZGVyU2l6ZSA9IGJhbGwuZ2V0Q29tcG9uZW50KGNjLlBoeXNpY3NDaXJjbGVDb2xsaWRlcikucmFkaXVzICogMjtcclxuICAgICAgICAgICAgICAgIGJhbGwuZ2V0Q2hpbGRCeU5hbWUoJ2ltZycpLnNldENvbnRlbnRTaXplKGNvbGxpZGVyU2l6ZSwgY29sbGlkZXJTaXplKTtcclxuICAgICAgICAgICAgICAgIGJhbGwuZ2V0Q2hpbGRCeU5hbWUoJ2ltZycpLnNjYWxlID0gMTtcclxuICAgICAgICAgICAgICAgIC8vIGJhbGwuc2NhbGUgPSAwLjU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oaXRCYWxsTGlzdC5wdXNoKGJhbGwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2FtZVJvb3QuYWRkQ2hpbGQoYmFsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYmFsbC5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgcG9zID0gdGhpcy5fZ2FtZVJvb3QuY29udmVydFRvTm9kZVNwYWNlQVIodGhpcy5faGl0UExpc3RbaV0pO1xyXG4gICAgICAgICAgICBiYWxsLnNldFBvc2l0aW9uKHBvcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGk7IGkgPCB0aGlzLl9oaXRCYWxsTGlzdC5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICB0aGlzLl9oaXRCYWxsTGlzdFtpXS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGxldCB0ID0gdGhpcy5fbWFwVmlldy5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIodGhpcy5fbWFwVmlldy50ZXN0QmFsbC5wb3NpdGlvbik7XHJcbiAgICAgICAgLy8gbGV0IHR0ID0gY2MudjIodC54LCB0LnkpO1xyXG4gICAgICAgIC8vIGlmICh0aGlzLl9oaXRQTGlzdC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLmRyYXdMaW5lKHRoaXMuX2JhbGxXb3JsZFAsIHR0KTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgLy8gdGhpcy5kcmF3TGluZSh0aGlzLl9oaXRQTGlzdFt0aGlzLl9oaXRQTGlzdC5sZW5ndGggLSAxXSwgdHQpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gdGhpcy5fbGFzdENvbGxpc2lvblYubm9ybWFsaXplU2VsZigpO1xyXG4gICAgICAgIC8vIHRoaXMuX2xhc3RDb2xsaXNpb25WLm11bHRpcGx5U2NhbGFyKDEwMCk7XHJcblxyXG4gICAgICAgIGxldCBsYXN0UG9pbnQgPSB0aGlzLl9oaXRQTGlzdFt0aGlzLl9oaXRQTGlzdC5sZW5ndGggLSAxXTtcclxuICAgICAgICBsZXQgdCA9IHRoaXMuX21hcFZpZXcuY29udmVydFRvV29ybGRTcGFjZUFSKHRoaXMuX21hcFZpZXcudGVzdEJhbGwucG9zaXRpb24pO1xyXG4gICAgICAgIGxldCB0dCA9IGNjLnYyKHQueCAtIGxhc3RQb2ludC54LCB0LnkgLSBsYXN0UG9pbnQueSk7IC8v5LuO57uI54K55oyH5ZCR5bCP55CD55qE5ZCR6YePXHJcbiAgICAgICAgdHQubm9ybWFsaXplU2VsZigpO1xyXG4gICAgICAgIHR0Lm11bHRpcGx5U2NhbGFyKCh0TWdyLmdldENvbmZpZyhUYWJsZU5hbWUuR0FNRV9QTEFZLCA5KSBhcyBHYW1lUGxheVRhYmxlKS5WYWx1ZSk7XHJcbiAgICAgICAgdHQueCA9IGxhc3RQb2ludC54ICsgdHQueDtcclxuICAgICAgICB0dC55ID0gbGFzdFBvaW50LnkgKyB0dC55O1xyXG5cclxuICAgICAgICB0aGlzLmRyYXdMaW5lKHRoaXMuX2hpdFBMaXN0W3RoaXMuX2hpdFBMaXN0Lmxlbmd0aCAtIDFdLCB0dCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vIHByaXZhdGUgX2xhc3RDb2xsaXNpb25WOiBjYy5WZWMyID0gbmV3IGNjLlZlYzIoKTtcclxuXHJcbiAgICBvblRlc3RCYWxsQ29sbGlzaW9uKGNvbnRhY3Q6IGNjLlBoeXNpY3NDb250YWN0LCBzZWxmQ29sbGlkZXI6IGNjLkNvbGxpZGVyLCBvdGhlckNvbGxpZGVyOiBjYy5Db2xsaWRlcikge1xyXG5cclxuICAgICAgICAvLyBsZXQgbWFuaWZvbGQgPSBjb250YWN0LmdldFdvcmxkTWFuaWZvbGQoKTtcclxuICAgICAgICAvLyBpZiAobWFuaWZvbGQucG9pbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5faGl0UExpc3QucHVzaChjYy52MihtYW5pZm9sZC5wb2ludHNbMF0ueCwgbWFuaWZvbGQucG9pbnRzWzBdLnkpKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIHRoaXMuX2hpdFBMaXN0LnB1c2goc2VsZkNvbGxpZGVyLm5vZGUuY29udmVydFRvV29ybGRTcGFjZUFSKGNjLlZlYzIuWkVSTykpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZHJhd0xpbmUod29ybGRTdGFydDogY2MuVmVjMiwgd29ybGRFbmQ6IGNjLlZlYzIpIHtcclxuXHJcbiAgICAgICAgbGV0IGdvbGRlbkFpbTogYm9vbGVhbiA9IChTYXZlRGF0YU1hbmFnZXIuaW5zLnJ1bnRpbWVEYXRhLmdvbGRlbkFpbVRyeSB8fCBEYXRlLm5vdygpIDw9IFNhdmVEYXRhTWFuYWdlci5pbnMucnVudGltZURhdGEuZ29sZGVuQWltRW5kVGltZSk7XHJcblxyXG4gICAgICAgIGxldCBnID0gdGhpcy5fZ2FtZVJvb3QuZ2V0Q29tcG9uZW50KGNjLkdyYXBoaWNzKTtcclxuXHJcbiAgICAgICAgZy5maWxsQ29sb3IuZnJvbUhFWChnb2xkZW5BaW0gPyAnI0ZGRkYwMCcgOiAnI0ZGRkZGRicpO1xyXG5cclxuICAgICAgICBsZXQgZ1N0YXJ0ID0gdGhpcy5fZ2FtZVJvb3QuY29udmVydFRvTm9kZVNwYWNlQVIod29ybGRTdGFydCk7XHJcbiAgICAgICAgbGV0IGdFbmQgPSB0aGlzLl9nYW1lUm9vdC5jb252ZXJ0VG9Ob2RlU3BhY2VBUih3b3JsZEVuZCk7XHJcblxyXG4gICAgICAgIGxldCB2ZWMgPSBjYy52MigpO1xyXG4gICAgICAgIGNjLlZlYzIuc3VidHJhY3QodmVjLCBnRW5kLCBnU3RhcnQpO1xyXG4gICAgICAgIGxldCBsZW4gPSB2ZWMubWFnKCk7XHJcbiAgICAgICAgbGV0IHN0ZXAgPSAwO1xyXG4gICAgICAgIGxldCBsZXJwVmVjID0gY2MudjIoKTtcclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgbGV0IHJhdGlvID0gc3RlcCAvIGxlbjtcclxuICAgICAgICAgICAgbGV0IGVuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAocmF0aW8gPiAxKSB7XHJcbiAgICAgICAgICAgICAgICByYXRpbyA9IDE7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdFbmQubGVycChnU3RhcnQsIHJhdGlvLCBsZXJwVmVjKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGcubW92ZVRvKCk7XHJcbiAgICAgICAgICAgIGcuY2lyY2xlKGxlcnBWZWMueCwgbGVycFZlYy55LCAzKTtcclxuICAgICAgICAgICAgZy5maWxsKCk7XHJcblxyXG4gICAgICAgICAgICBzdGVwICs9IDIwO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVuZCkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VQb2ludGVyKGRvdWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG5cclxuICAgICAgICAvLyBsZXQgYmFsbE5vZGUgPSB0aGlzLl9wb2ludGVyTm9kZS5nZXRDaGlsZEJ5TmFtZSgnYmFsbCcpO1xyXG5cclxuICAgICAgICAvLyBiYWxsTm9kZS5hY3RpdmUgPSAhZG91YmxlO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0ZXJOb2RlLmFjdGl2ZSA9IGRvdWJsZTtcclxuXHJcbiAgICAgICAgaWYgKGRvdWJsZSkge1xyXG4gICAgICAgICAgICBCYXR0bGVNYW5hZ2VyLmlucy5zaG9vdFRvdWNoRW5hYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwbGl0ZXJOb2RlLmdldENvbXBvbmVudChjYy5BbmltYXRpb24pLm9uY2UoJ2ZpbmlzaGVkJywgKCkgPT4geyBCYXR0bGVNYW5hZ2VyLmlucy5zaG9vdFRvdWNoRW5hYmxlID0gdHJ1ZSB9LCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5fc3BsaXRlck5vZGUuZ2V0Q29tcG9uZW50KGNjLkFuaW1hdGlvbikucGxheSgnYW5pX2d1bjAwMScpO1xyXG4gICAgICAgICAgICB0aGlzLl9zcGxpdGVyTm9kZS5zZXRQb3NpdGlvbihCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUubWFyYmxlc0Jvcm5Qb3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICAvLyNyZWdpb24gZXZlbnRcclxuXHJcbiAgICBwcml2YXRlIG9uVG91Y2hTdGFydChlOiBjYy5FdmVudC5FdmVudFRvdWNoKSB7XHJcblxyXG4gICAgICAgIGlmICghQmF0dGxlTWFuYWdlci5pbnMuc2hvb3RUb3VjaEVuYWJsZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ1VJQmF0dGxlJykuZ2V0Q29tcG9uZW50KFVJQmF0dGxlKS5zZXRDYW5jZWxOb2RlVmlzaWJsZSh0cnVlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3Qub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfTU9WRSwgdGhpcy5vblRvdWNoTW92ZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3Qub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLm9uVG91Y2hFbmQsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2dhbWVSb290Lm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgdGhpcy5vblRvdWNoQ2FuY2VsLCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFwVmlldy50ZXN0QmFsbC5hY3RpdmUgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLm9uVG91Y2hNb3ZlKGUpO1xyXG5cclxuICAgICAgICBsZXQgY2hhcmdpbmdOb2RlID0gdGhpcy5fcG9pbnRlck5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ2NoYXJnaW5nTm9kZScpO1xyXG4gICAgICAgIGNoYXJnaW5nTm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIGNoYXJnaW5nTm9kZS5nZXRDb21wb25lbnQoY2MuQW5pbWF0aW9uKS5wbGF5KCdmeF94dWxpXzAwMScpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Ub3VjaE1vdmUoZTogY2MuRXZlbnQuRXZlbnRUb3VjaCkge1xyXG5cclxuICAgICAgICBsZXQgdG91Y2hQID0gZS5nZXRMb2NhdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBjYy5WZWMyLnN1YnRyYWN0KHRoaXMuX3BvaW50ZXJWZWMsIHRvdWNoUCwgdGhpcy5fYmFsbFdvcmxkUCk7XHJcblxyXG4gICAgICAgIGxldCBkZWcgPSBzbGliLk1hdGhVdGlsLmdldDM2MERlZ0J5VmVjKHRvdWNoUC54IC0gdGhpcy5fYmFsbFdvcmxkUC54LCB0b3VjaFAueSAtIHRoaXMuX2JhbGxXb3JsZFAueSk7XHJcblxyXG4gICAgICAgIGlmIChkZWcgPCB0aGlzLl9taW5TaG9vdERlZyB8fCBkZWcgPiAxODAgLSB0aGlzLl9taW5TaG9vdERlZykge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ1VJQmF0dGxlJykuZ2V0Q29tcG9uZW50KFVJQmF0dGxlKS5zZXRDYW5jZWxOb2RlSGl0KHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ1VJQmF0dGxlJykuZ2V0Q29tcG9uZW50KFVJQmF0dGxlKS5zZXRDYW5jZWxOb2RlSGl0KGZhbHNlKTtcclxuXHJcbiAgICAgICAgY2MuVmVjMi5zdWJ0cmFjdCh0aGlzLl9wb2ludGVyVmVjLCB0b3VjaFAsIHRoaXMuX2JhbGxXb3JsZFApO1xyXG5cclxuICAgICAgICB0aGlzLl9nYW1lUm9vdC5nZXRDb21wb25lbnQoY2MuR3JhcGhpY3MpLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy50ZXN0UmF5TGluZU5ldyh0aGlzLl9wb2ludGVyVmVjKTtcclxuXHJcbiAgICAgICAgLy/ml4vovazmjIfpkohcclxuICAgICAgICBpZiAoQmF0dGxlTWFuYWdlci5pbnMuY3VyQmF0dGxlLmRvdWJsZVNob290KSB7XHJcbiAgICAgICAgICAgIGxldCBkZWcgPSBzbGliLk1hdGhVdGlsLmdldDM2MERlZ0J5VmVjKHRoaXMuX3BvaW50ZXJWZWMueCwgdGhpcy5fcG9pbnRlclZlYy55KTtcclxuICAgICAgICAgICAgbGV0IG5vZGVBID0gdGhpcy5fc3BsaXRlck5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ2FuaV9ndW5hJyk7XHJcbiAgICAgICAgICAgIGxldCBub2RlQiA9IHRoaXMuX3NwbGl0ZXJOb2RlLmdldENoaWxkQnlOYW1lKCdhbmlfZ3VuYicpO1xyXG5cclxuICAgICAgICAgICAgbm9kZUEuYW5nbGUgPSBkZWcgLSA5MDsgLy/mjIflkJHmraPkuIrmlrlcclxuICAgICAgICAgICAgbm9kZUIuYW5nbGUgPSAoOTAgLSBkZWcpO1xyXG5cclxuICAgICAgICAgICAgbGV0IG90aGVyUG9pbnRlciA9IGNjLnYyKC10aGlzLl9wb2ludGVyVmVjLngsIHRoaXMuX3BvaW50ZXJWZWMueSk7XHJcbiAgICAgICAgICAgIHRoaXMudGVzdFJheUxpbmVOZXcob3RoZXJQb2ludGVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblRvdWNoQ2FuY2VsKCkge1xyXG4gICAgICAgIGxldCBwb2ludGVyID0gdGhpcy5fbWFwVmlldy5nZXRDaGlsZEJ5TmFtZSgnaW1nUG9pbnRlcicpO1xyXG4gICAgICAgIHBvaW50ZXIuYW5nbGUgPSAwO1xyXG5cclxuICAgICAgICAvLyBsZXQgZyA9IHRoaXMuX2dhbWVSb290LmdldENvbXBvbmVudChjYy5HcmFwaGljcyk7XHJcbiAgICAgICAgLy8gZy5jbGVhcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9nYW1lUm9vdC5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfTU9WRSwgdGhpcy5vblRvdWNoTW92ZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5fZ2FtZVJvb3Qub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5vblRvdWNoRW5kLCB0aGlzKTtcclxuICAgICAgICB0aGlzLl9nYW1lUm9vdC5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfQ0FOQ0VMLCB0aGlzLm9uVG91Y2hDYW5jZWwsIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ1VJQmF0dGxlJykuZ2V0Q29tcG9uZW50KFVJQmF0dGxlKS5zZXRDYW5jZWxOb2RlVmlzaWJsZShmYWxzZSk7XHJcblxyXG4gICAgICAgIGxldCBjaGFyZ2luZ05vZGUgPSB0aGlzLl9wb2ludGVyTm9kZS5nZXRDaGlsZEJ5TmFtZSgnY2hhcmdpbmdOb2RlJyk7XHJcbiAgICAgICAgY2hhcmdpbmdOb2RlLmdldENvbXBvbmVudChjYy5BbmltYXRpb24pLnN0b3AoJ2Z4X3h1bGlfMDAxJyk7XHJcbiAgICAgICAgY2hhcmdpbmdOb2RlLmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXBWaWV3LnRlc3RCYWxsLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENvbXBvbmVudChjYy5HcmFwaGljcykuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9oaXRCYWxsTGlzdC5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICB0aGlzLl9oaXRCYWxsTGlzdFtpXS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblRvdWNoRW5kKCkge1xyXG5cclxuICAgICAgICB0aGlzLm9uVG91Y2hDYW5jZWwoKTtcclxuICAgICAgICBCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUuc2hvb3QodGhpcy5fcG9pbnRlclZlYyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCd0aXBzMScpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2dhbWVSb290LmdldENoaWxkQnlOYW1lKCdndWlkZUFpbScpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Ta2lsbFN0YXJ0KHNraWxsSWQ6IFVzZXJTa2lsbCkge1xyXG4gICAgICAgIGlmIChza2lsbElkID09IFVzZXJTa2lsbC5ET1VCTEVfU0hPT1QpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VQb2ludGVyKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChza2lsbElkID09IFVzZXJTa2lsbC5TSElFTEQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTaGllbGRFbmFibGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Ta2lsbEVuZChza2lsbElkOiBVc2VyU2tpbGwpIHtcclxuICAgICAgICBpZiAoc2tpbGxJZCA9PSBVc2VyU2tpbGwuU0hJRUxEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2hpZWxkRW5hYmxlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkJvcm5Qb3NDaGFuZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5fcG9pbnRlck5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ2JhbGwnKS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3BvaW50ZXJOb2RlLnNldFBvc2l0aW9uKEJhdHRsZU1hbmFnZXIuaW5zLmN1ckJhdHRsZS5tYXJibGVzQm9yblBvc05leHRSb3VuZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblJvdW5kRW5kKCkge1xyXG5cclxuICAgICAgICB0aGlzLl9iYWxsV29ybGRQID0gdGhpcy5fbWFwVmlldy5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIoQmF0dGxlTWFuYWdlci5pbnMuY3VyQmF0dGxlLm1hcmJsZXNCb3JuUG9zKTtcclxuICAgICAgICB0aGlzLl9wb2ludGVyTm9kZS5zZXRQb3NpdGlvbihCYXR0bGVNYW5hZ2VyLmlucy5jdXJCYXR0bGUubWFyYmxlc0Jvcm5Qb3MpO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlUG9pbnRlcihmYWxzZSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0U2hpZWxkRW5hYmxlKHZhbHVlOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIGxldCBlZmZlY3ROb2RlID0gY2MuZmluZCgnR2FtZVJvb3QvYm9yZGVyQ29sbGVjdG9yL2VmZmVjdCcsIHRoaXMubm9kZSk7XHJcbiAgICAgICAgZWZmZWN0Tm9kZS5hY3RpdmUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IGVmZmVjdE5vZGUuZ2V0Q29tcG9uZW50KGNjLkFuaW1hdGlvbikucGxheSgnZnhfZ2xfY2h6ZF8wMDEnKS5kdXJhdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlZmZlY3ROb2RlLmdldENvbXBvbmVudChjYy5BbmltYXRpb24pLnBsYXkoJ2Z4X2dsX2NoemRfMDAyJylcclxuICAgICAgICAgICAgfSwgZHVyYXRpb24sIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdGhpcy51bnNjaGVkdWxlQWxsQ2FsbGJhY2tzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBvblNoYWtlKHZhbHVlOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIGxldCBhbmkgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ01haW4gQ2FtZXJhJykuZ2V0Q29tcG9uZW50KGNjLkFuaW1hdGlvbik7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBhbmkuc3RvcCgnYW5pX3NoYWtlJyk7XHJcbiAgICAgICAgICAgIGFuaS5wbGF5KCdhbmlfc2hha2UnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZSgnTWFpbiBDYW1lcmEnKS5zZXRQb3NpdGlvbigwLCAwLCAwKTtcclxuICAgICAgICAgICAgLy8gbGV0IHN0YXRlID0gYW5pLmdldEFuaW1hdGlvblN0YXRlKCdhbmlfc2hha2UnKTtcclxuICAgICAgICAgICAgLy8gc3RhdGUudGltZSA9IDA7XHJcbiAgICAgICAgICAgIC8vIHN0YXRlLnN0b3AoKTtcclxuICAgICAgICAgICAgYW5pLnN0b3AoJ2FuaV9zaGFrZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYW5pLnBsYXkoJ2FuaV9zaGFrZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxufVxyXG4iXX0=