difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/guide/guide_controller.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, 'bb271us3xdCWoCufE4ruTzR', 'guide_controller');
// Scripts/mod/guide/guide_controller.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: 2019-04-15 14:38:52
// --------------------------------------------------------------------
var StoryController = require("story_controller");
 
var GuideMainView = require("guide_main_window");
 
var StoryEvent = require("story_event");
 
var GuideEvent = require("guide_event");
 
var GuideController = cc.Class({
  "extends": BaseController,
  ctor: function ctor() {},
  // 初始化配置数据
  initConfig: function initConfig() {
    var GuideModel = require("guide_model");
 
    this.model = new GuideModel();
    this.model.initConfig();
    this.is_guiding = false;
    this.guide_list = []; // 缓存的引导id
  },
  // 返回当前的model
  getModel: function getModel() {
    return this.model;
  },
  // 注册监听事件
  registerEvents: function registerEvents() {
    // this.init_role_event = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function() {
    //     var data = {};
    //     data.id = 10185;
    //     this.handle11120(data);
    // }.bind(this))
    this.init_role_event = gcore.GlobalEvent.bind(StoryEvent.STORY_OVER, function () {
      if (this.guide_list && this.guide_list.length > 0) {
        var cur_guide = this.guide_list.shift();
        this.checkGuideToPlay(cur_guide);
      }
    }.bind(this));
    this.can_play_drama_event = gcore.GlobalEvent.bind(StoryEvent.PREPARE_PLAY_PLOT, function () {
      if (this.guide_list != null && Utils.next(this.guide_list) != null) {
        if (this.guide_list.length) {
          var config = this.guide_list.splice(0, 1); //table.remove(self.guide_list, 1)
 
          this.checkGuideToPlay(config);
        }
      }
    }.bind(this));
  },
  // 注册协议接受事件
  registerProtocals: function registerProtocals() {
    this.RegisterProtocal(11120, this.handle11120.bind(this)); // 播放引导
 
    this.RegisterProtocal(11121, this.handle11121.bind(this)); // 引导心跳包
 
    this.RegisterProtocal(11123, this.handle11123.bind(this)); // 清除所有剧情和引导        
  },
  handle11120: function handle11120(data) {
    cc.log("收到服务端执行引导协议");
    cc.log(data); // return;
 
    if (!data || !data.id) return;
    if (this.cur_guide_config && this.cur_guide_config.id == data.id) return; // 如果没有引导数据,直接结束掉
 
    var config = Config.drama_data.data_guide[data.id];
 
    if (!config) {
      this.startPlayGuide(false, data.id);
      return;
    } // 储存服务器发送过来的该引导已经完成的步数
 
 
    this.startPlayGuide(true, data.id);
  },
  send11121: function send11121(guide_id, step) {
    var protocal = {};
    protocal.id = guide_id;
    protocal.n = step;
    this.SendProtocal(11121, protocal);
  },
  handle11121: function handle11121(data) {
    if (this.guide_view) {
      cc.log("保存成功,服务器返回");
      this.guide_view.doNextGuideFromServer(data.id, data.n);
    }
  },
  handle11123: function handle11123() {},
  // ==============================--
  // desc:开始播放客户端引导
  // time:2017-07-24 08:06:26
  // @status:
  // @id:
  // @return  
  // ==============================--
  startPlayGuide: function startPlayGuide(status, id, is_skip) {
    gcore.GlobalEvent.fire(GuideEvent.CloseButtonListPanelEffect);
 
    if (!status) {
      // 这个时候做一个处理吧
      this.delayTouchEnabled();
 
      if (this.guide_view) {
        this.guide_view.close();
        this.guide_view = null;
      }
 
      this.is_guiding = false;
      this.cur_guide_config = null;
      this.send11122(id, is_skip); // 是否有下一个引导
 
      if (this.guide_list && this.guide_list.length > 0) {
        cc.log("执行缓存中的引导");
        var config = this.guide_list.shift();
        this.checkGuideToPlay(config);
      } else {
        // 主ui的聊天气泡
        var MainuiController = require("mainui_controller");
 
        MainuiController.getInstance().setMainUIChatBubbleStatus(true);
      }
    } else {
      cc.log("222"); // 如果客户端缓存已经完成了该引导则不需要继续了
      // var guide_cache = RoleEnv:getInstance():get(RoleEnv.keys.guide_step_list, {})
      // if guide_cache[id] ~= nil then
      //     if guide_cache[id][RoleEnv.keys.guide_over_step] == true then
      //         this.startPlayGuide(false, id)
      //         return 
      //     end
      // end
 
      var config = Config.drama_data.data_guide[id];
 
      var RoleController = require("role_controller");
 
      var role_vo = RoleController.getInstance().getRoleVo();
      var guide_cache_data = cc.sys.localStorage.getItem("guide_data" + role_vo.srv_id + role_vo.rid);
 
      if (guide_cache_data) {
        guide_cache_data = JSON.parse(guide_cache_data);
 
        if (guide_cache_data[id] && guide_cache_data[id][config.over_step]) {
          this.startPlayGuide(false, id);
          return;
        }
      }
 
      if (!config || !config.act || config.act.length == 0) {
        this.startPlayGuide(false, id);
        return;
      }
 
      cc.log("111"); // 判断播放引导
 
      this.checkGuideToPlay(config);
    }
  },
  send11122: function send11122(id, is_skip) {
    if (is_skip) {
      is_skip = true;
    } else {
      is_skip = false;
    }
 
    var protocal = {};
    protocal.id = id;
    protocal.is_skip = is_skip;
    this.SendProtocal(11122, protocal);
  },
  checkGuideToPlay: function checkGuideToPlay(config) {
    if (!config) return; // 正在播放当前引导,不需要储存了
 
    if (this.cur_guide_config && this.cur_guide_config.id == config.id) return; // 待播放引导列表里面存在,也不需要存了
 
    for (var guide_i in this.guide_list) {
      if (this.guide_list[guide_i].id == config.id) return;
    } // 剧情状态下.不播放引导
 
 
    var story_status = StoryController.getInstance().getModel().isStoryState() || false;
 
    if (story_status) {
      this.guide_list.push(config);
      return;
    } // 如果出升级提示
    // var is_inlevipgrade = LevupgradeController:getInstance():waitLevupgrade()
    // if is_inlevipgrade then
    //     table_insert( self.guide_list, 1, config )
    //     return
    // end
    // 如果在引导中的时候,不播,缓存这吧
 
 
    if (this.cur_guide_config) {
      this.guide_list.push(config);
      return;
    }
 
    cc.log("3333");
 
    if (config.act.length > 0) {
      this.playGuide(config);
    } else {
      this.startPlayGuide(false, config.bid);
    }
  },
  playGuide: function playGuide(config) {
    if (this.is_guiding) return;
    this.cur_guide_config = config;
    this.is_guiding = true;
 
    if (config.is_close == 1) {
      Utils.closeAllWindow(); // BaseView.closeAllView()
    } // BaseView.closeSomeWin()
    // 主ui的聊天气泡
    // var MainuiController = require("mainui_controller")
    // MainuiController.getInstance().setMainUIChatBubbleStatus(false)
 
 
    if (!this.guide_view) {
      this.guide_view = new GuideMainView(this);
    }
 
    this.guide_view.open();
    this.guide_view.addGuid(config);
  },
  delayTouchEnabled: function delayTouchEnabled() {},
  isInGuide: function isInGuide() {
    return this.is_guiding;
  },
  //打开任务引导
  openTaskGuideWindow: function openTaskGuideWindow(status, config) {
    if (status) {
      if (this.task_guide_window == null) {
        this.task_guide_window = Utils.createClass("task_guide_window");
      }
 
      this.task_guide_window.open(config);
    } else {
      if (this.task_guide_window) {
        this.task_guide_window.close();
      }
 
      this.task_guide_window = null;
    }
  },
  getTaskGuideWindow: function getTaskGuideWindow() {
    return this.task_guide_window;
  },
  getTaskGuideEffectStatus: function getTaskGuideEffectStatus() {
    if (this.task_guide_window) {
      return this.task_guide_window.getEffectActive();
    }
 
    return false;
  },
  setGuideMainRootWnd: function setGuideMainRootWnd(status) {
    if (this.guide_view) {
      this.guide_view.root_wnd.active = status;
    }
  }
});
module.exports = GuideController;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlkZVxcZ3VpZGVfY29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJTdG9yeUNvbnRyb2xsZXIiLCJyZXF1aXJlIiwiR3VpZGVNYWluVmlldyIsIlN0b3J5RXZlbnQiLCJHdWlkZUV2ZW50IiwiR3VpZGVDb250cm9sbGVyIiwiY2MiLCJDbGFzcyIsIkJhc2VDb250cm9sbGVyIiwiY3RvciIsImluaXRDb25maWciLCJHdWlkZU1vZGVsIiwibW9kZWwiLCJpc19ndWlkaW5nIiwiZ3VpZGVfbGlzdCIsImdldE1vZGVsIiwicmVnaXN0ZXJFdmVudHMiLCJpbml0X3JvbGVfZXZlbnQiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiYmluZCIsIlNUT1JZX09WRVIiLCJsZW5ndGgiLCJjdXJfZ3VpZGUiLCJzaGlmdCIsImNoZWNrR3VpZGVUb1BsYXkiLCJjYW5fcGxheV9kcmFtYV9ldmVudCIsIlBSRVBBUkVfUExBWV9QTE9UIiwiVXRpbHMiLCJuZXh0IiwiY29uZmlnIiwic3BsaWNlIiwicmVnaXN0ZXJQcm90b2NhbHMiLCJSZWdpc3RlclByb3RvY2FsIiwiaGFuZGxlMTExMjAiLCJoYW5kbGUxMTEyMSIsImhhbmRsZTExMTIzIiwiZGF0YSIsImxvZyIsImlkIiwiY3VyX2d1aWRlX2NvbmZpZyIsIkNvbmZpZyIsImRyYW1hX2RhdGEiLCJkYXRhX2d1aWRlIiwic3RhcnRQbGF5R3VpZGUiLCJzZW5kMTExMjEiLCJndWlkZV9pZCIsInN0ZXAiLCJwcm90b2NhbCIsIm4iLCJTZW5kUHJvdG9jYWwiLCJndWlkZV92aWV3IiwiZG9OZXh0R3VpZGVGcm9tU2VydmVyIiwic3RhdHVzIiwiaXNfc2tpcCIsImZpcmUiLCJDbG9zZUJ1dHRvbkxpc3RQYW5lbEVmZmVjdCIsImRlbGF5VG91Y2hFbmFibGVkIiwiY2xvc2UiLCJzZW5kMTExMjIiLCJNYWludWlDb250cm9sbGVyIiwiZ2V0SW5zdGFuY2UiLCJzZXRNYWluVUlDaGF0QnViYmxlU3RhdHVzIiwiUm9sZUNvbnRyb2xsZXIiLCJyb2xlX3ZvIiwiZ2V0Um9sZVZvIiwiZ3VpZGVfY2FjaGVfZGF0YSIsInN5cyIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJzcnZfaWQiLCJyaWQiLCJKU09OIiwicGFyc2UiLCJvdmVyX3N0ZXAiLCJhY3QiLCJndWlkZV9pIiwic3Rvcnlfc3RhdHVzIiwiaXNTdG9yeVN0YXRlIiwicHVzaCIsInBsYXlHdWlkZSIsImJpZCIsImlzX2Nsb3NlIiwiY2xvc2VBbGxXaW5kb3ciLCJvcGVuIiwiYWRkR3VpZCIsImlzSW5HdWlkZSIsIm9wZW5UYXNrR3VpZGVXaW5kb3ciLCJ0YXNrX2d1aWRlX3dpbmRvdyIsImNyZWF0ZUNsYXNzIiwiZ2V0VGFza0d1aWRlV2luZG93IiwiZ2V0VGFza0d1aWRlRWZmZWN0U3RhdHVzIiwiZ2V0RWZmZWN0QWN0aXZlIiwic2V0R3VpZGVNYWluUm9vdFduZCIsInJvb3Rfd25kIiwiYWN0aXZlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxlQUFlLEdBQUdDLE9BQU8sQ0FBQyxrQkFBRCxDQUE3Qjs7QUFDQSxJQUFJQyxhQUFhLEdBQUtELE9BQU8sQ0FBQyxtQkFBRCxDQUE3Qjs7QUFDQSxJQUFJRSxVQUFVLEdBQVFGLE9BQU8sQ0FBQyxhQUFELENBQTdCOztBQUNBLElBQUlHLFVBQVUsR0FBUUgsT0FBTyxDQUFDLGFBQUQsQ0FBN0I7O0FBRUEsSUFBSUksZUFBZSxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUMzQixhQUFTQyxjQURrQjtBQUUzQkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZLENBQ2pCLENBSDBCO0FBSzNCO0FBQ0FDLEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQixRQUFJQyxVQUFVLEdBQUdWLE9BQU8sQ0FBQyxhQUFELENBQXhCOztBQUVBLFNBQUtXLEtBQUwsR0FBYSxJQUFJRCxVQUFKLEVB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QyxNQUF6QixHQUFrQzFDLE1BQWxDO0FBQ0g7QUFDSjtBQTlRMEIsQ0FBVCxDQUF0QjtBQWlSQTJDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjVGLGVBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTA0LTE1IDE0OjM4OjUyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFN0b3J5Q29udHJvbGxlciA9IHJlcXVpcmUoXCJzdG9yeV9jb250cm9sbGVyXCIpO1xudmFyIEd1aWRlTWFpblZpZXcgICA9IHJlcXVpcmUoXCJndWlkZV9tYWluX3dpbmRvd1wiKTtcbnZhciBTdG9yeUV2ZW50ICAgICAgPSByZXF1aXJlKFwic3RvcnlfZXZlbnRcIik7XG52YXIgR3VpZGVFdmVudCAgICAgID0gcmVxdWlyZShcImd1aWRlX2V2ZW50XCIpO1xuXG52YXIgR3VpZGVDb250cm9sbGVyID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDb250cm9sbGVyLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgR3VpZGVNb2RlbCA9IHJlcXVpcmUoXCJndWlkZV9tb2RlbFwiKTtcblxuICAgICAgICB0aGlzLm1vZGVsID0gbmV3IEd1aWRlTW9kZWwoKTtcbiAgICAgICAgdGhpcy5tb2RlbC5pbml0Q29uZmlnKCk7XG4gICAgICAgIHRoaXMuaXNfZ3VpZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmd1aWRlX2xpc3QgPSBbXTsgICAgICAgIC8vIOe8k+WtmOeahOW8leWvvGlkXG4gICAgfSxcblxuICAgIC8vIOi/lOWbnuW9k+WJjeeahG1vZGVsXG4gICAgZ2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOebkeWQrOS6i+S7tlxuICAgIHJlZ2lzdGVyRXZlbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHRoaXMuaW5pdF9yb2xlX2V2ZW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChFdmVudElkLkVWVF9ST0xFX0NSRUFURV9TVUNDRVNTLCBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gICAgIHZhciBkYXRhID0ge307XG4gICAgICAgIC8vICAgICBkYXRhLmlkID0gMTAxODU7XG4gICAgICAgIC8vICAgICB0aGlzLmhhbmRsZTExMTIwKGRhdGEpO1xuICAgICAgICAvLyB9LmJpbmQodGhpcykpXG4gICAgICAgIHRoaXMuaW5pdF9yb2xlX2V2ZW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChTdG9yeUV2ZW50LlNUT1JZX09WRVIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3VpZGVfbGlzdCAmJiB0aGlzLmd1aWRlX2xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBjdXJfZ3VpZGUgPSB0aGlzLmd1aWRlX2xpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrR3VpZGVUb1BsYXkoY3VyX2d1aWRlKTsgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSkgICBcbiAgICAgICAgdGhpcy5jYW5fcGxheV9kcmFtYV9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoU3RvcnlFdmVudC5QUkVQQVJFX1BMQVlfUExPVCwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKHRoaXMuZ3VpZGVfbGlzdCAhPSBudWxsICYmIFV0aWxzLm5leHQodGhpcy5ndWlkZV9saXN0KSAhPSBudWxsKXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmd1aWRlX2xpc3QubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IHRoaXMuZ3VpZGVfbGlzdC5zcGxpY2UoMCwxKS8vdGFibGUucmVtb3ZlKHNlbGYuZ3VpZGVfbGlzdCwgMSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0d1aWRlVG9QbGF5KGNvbmZpZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSkgICAgIFxuICAgIH0sXG5cbiAgICAvLyDms6jlhozljY/orq7mjqXlj5fkuovku7ZcbiAgICByZWdpc3RlclByb3RvY2FsczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTExMjAsIHRoaXMuaGFuZGxlMTExMjAuYmluZCh0aGlzKSk7ICAgLy8g5pKt5pS+5byV5a+8XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTEyMSwgdGhpcy5oYW5kbGUxMTEyMS5iaW5kKHRoaXMpKTsgICAvLyDlvJXlr7zlv4Pot7PljIVcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMTIzLCB0aGlzLmhhbmRsZTExMTIzLmJpbmQodGhpcykpOyAgIC8vIOa4hemZpOaJgOacieWJp+aDheWSjOW8leWvvCAgICAgICAgXG4gICAgfSxcblxuICAgIGhhbmRsZTExMTIwOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIGNjLmxvZyhcIuaUtuWIsOacjeWKoeerr+aJp+ihjOW8leWvvOWNj+iurlwiKTtcbiAgICAgICAgY2MubG9nKGRhdGEpO1xuICAgICAgICAvLyByZXR1cm47XG4gICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5pZCkgcmV0dXJuIFxuICAgICAgICBpZiAodGhpcy5jdXJfZ3VpZGVfY29uZmlnICYmIHRoaXMuY3VyX2d1aWRlX2NvbmZpZy5pZCA9PSBkYXRhLmlkKSByZXR1cm47XG4gICAgICAgIC8vIOWmguaenOayoeacieW8leWvvOaVsOaNriznm7TmjqXnu5PmnZ/mjolcbiAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5kcmFtYV9kYXRhLmRhdGFfZ3VpZGVbZGF0YS5pZF07XG4gICAgICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0UGxheUd1aWRlKGZhbHNlLCBkYXRhLmlkKTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8g5YKo5a2Y5pyN5Yqh5Zmo5Y+R6YCB6L+H5p2l55qE6K+l5byV5a+85bey57uP5a6M5oiQ55qE5q2l5pWwXG4gICAgICAgIHRoaXMuc3RhcnRQbGF5R3VpZGUodHJ1ZSwgZGF0YS5pZCk7XG4gICAgfSxcblxuICAgIHNlbmQxMTEyMTogZnVuY3Rpb24oZ3VpZGVfaWQsIHN0ZXApIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmlkID0gZ3VpZGVfaWQ7XG4gICAgICAgIHByb3RvY2FsLm4gPSBzdGVwO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTEyMSwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMTEyMTogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5ndWlkZV92aWV3KSB7XG4gICAgICAgICAgICBjYy5sb2coXCLkv53lrZjmiJDlip/vvIzmnI3liqHlmajov5Tlm55cIik7XG4gICAgICAgICAgICB0aGlzLmd1aWRlX3ZpZXcuZG9OZXh0R3VpZGVGcm9tU2VydmVyKGRhdGEuaWQsIGRhdGEubik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaGFuZGxlMTExMjM6IGZ1bmN0aW9uKCkge1xuXG4gICAgfSxcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gZGVzYzrlvIDlp4vmkq3mlL7lrqLmiLfnq6/lvJXlr7xcbiAgICAvLyB0aW1lOjIwMTctMDctMjQgMDg6MDY6MjZcbiAgICAvLyBAc3RhdHVzOlxuICAgIC8vIEBpZDpcbiAgICAvLyBAcmV0dXJuICBcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIHN0YXJ0UGxheUd1aWRlOiBmdW5jdGlvbihzdGF0dXMsIGlkLCBpc19za2lwKSB7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpZGVFdmVudC5DbG9zZUJ1dHRvbkxpc3RQYW5lbEVmZmVjdClcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgICAgIC8vIOi/meS4quaXtuWAmeWBmuS4gOS4quWkhOeQhuWQp1xuICAgICAgICAgICAgdGhpcy5kZWxheVRvdWNoRW5hYmxlZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3VpZGVfdmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3VpZGVfdmlldy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3VpZGVfdmlldyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzX2d1aWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY3VyX2d1aWRlX2NvbmZpZyA9IG51bGxcbiAgICAgICAgICAgIHRoaXMuc2VuZDExMTIyKGlkLCBpc19za2lwKTtcblxuICAgICAgICAgICAgLy8g5piv5ZCm5pyJ5LiL5LiA5Liq5byV5a+8XG4gICAgICAgICAgICBpZiAodGhpcy5ndWlkZV9saXN0ICYmIHRoaXMuZ3VpZGVfbGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY2MubG9nKFwi5omn6KGM57yT5a2Y5Lit55qE5byV5a+8XCIpO1xuICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSB0aGlzLmd1aWRlX2xpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0d1aWRlVG9QbGF5KGNvbmZpZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIOS4u3Vp55qE6IGK5aSp5rCU5rOhXG4gICAgICAgICAgICAgICAgdmFyIE1haW51aUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIilcbiAgICAgICAgICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0TWFpblVJQ2hhdEJ1YmJsZVN0YXR1cyh0cnVlKSAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNjLmxvZyhcIjIyMlwiKTtcbiAgICAgICAgICAgIC8vIOWmguaenOWuouaIt+err+e8k+WtmOW3sue7j+WujOaIkOS6huivpeW8leWvvOWImeS4jemcgOimgee7p+e7reS6hlxuICAgICAgICAgICAgLy8gdmFyIGd1aWRlX2NhY2hlID0gUm9sZUVudjpnZXRJbnN0YW5jZSgpOmdldChSb2xlRW52LmtleXMuZ3VpZGVfc3RlcF9saXN0LCB7fSlcbiAgICAgICAgICAgIC8vIGlmIGd1aWRlX2NhY2hlW2lkXSB+PSBuaWwgdGhlblxuICAgICAgICAgICAgLy8gICAgIGlmIGd1aWRlX2NhY2hlW2lkXVtSb2xlRW52LmtleXMuZ3VpZGVfb3Zlcl9zdGVwXSA9PSB0cnVlIHRoZW5cbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5zdGFydFBsYXlHdWlkZShmYWxzZSwgaWQpXG4gICAgICAgICAgICAvLyAgICAgICAgIHJldHVybiBcbiAgICAgICAgICAgIC8vICAgICBlbmRcbiAgICAgICAgICAgIC8vIGVuZFxuXG4gICAgICAgICAgICB2YXIgY29uZmlnID0gQ29uZmlnLmRyYW1hX2RhdGEuZGF0YV9ndWlkZVtpZF07XG5cbiAgICAgICAgICAgIHZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIilcbiAgICAgICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcblxuICAgICAgICAgICAgdmFyIGd1aWRlX2NhY2hlX2RhdGEgPSBjYy5zeXMubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJndWlkZV9kYXRhXCIgKyByb2xlX3ZvLnNydl9pZCArIHJvbGVfdm8ucmlkKTsgICBcblxuICAgICAgICAgICAgaWYgKGd1aWRlX2NhY2hlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBndWlkZV9jYWNoZV9kYXRhID0gSlNPTi5wYXJzZShndWlkZV9jYWNoZV9kYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3VpZGVfY2FjaGVfZGF0YVtpZF0gJiYgZ3VpZGVfY2FjaGVfZGF0YVtpZF1bY29uZmlnLm92ZXJfc3RlcF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFBsYXlHdWlkZShmYWxzZSwgaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghY29uZmlnIHx8ICFjb25maWcuYWN0IHx8IGNvbmZpZy5hY3QubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0UGxheUd1aWRlKGZhbHNlLCBpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYy5sb2coXCIxMTFcIik7XG5cbiAgICAgICAgICAgIC8vIOWIpOaWreaSreaUvuW8leWvvFxuICAgICAgICAgICAgdGhpcy5jaGVja0d1aWRlVG9QbGF5KGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2VuZDExMTIyOiBmdW5jdGlvbihpZCwgaXNfc2tpcCkge1xuICAgICAgICBpZiAoaXNfc2tpcCkge1xuICAgICAgICAgICAgaXNfc2tpcCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpc19za2lwID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwuaWQgPSBpZDtcbiAgICAgICAgcHJvdG9jYWwuaXNfc2tpcCA9IGlzX3NraXA7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMTIyLCBwcm90b2NhbCkgICAgICAgIFxuICAgIH0sXG5cbiAgICBjaGVja0d1aWRlVG9QbGF5OiBmdW5jdGlvbihjb25maWcpIHtcbiAgICAgICAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICAgICAgICAvLyDmraPlnKjmkq3mlL7lvZPliY3lvJXlr7ws5LiN6ZyA6KaB5YKo5a2Y5LqGXG4gICAgICAgIGlmICh0aGlzLmN1cl9ndWlkZV9jb25maWcgJiYgdGhpcy5jdXJfZ3VpZGVfY29uZmlnLmlkID09IGNvbmZpZy5pZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIOW+heaSreaUvuW8leWvvOWIl+ihqOmHjOmdouWtmOWcqCzkuZ/kuI3pnIDopoHlrZjkuoZcbiAgICAgICAgZm9yICh2YXIgZ3VpZGVfaSBpbiB0aGlzLmd1aWRlX2xpc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmd1aWRlX2xpc3RbZ3VpZGVfaV0uaWQgPT0gY29uZmlnLmlkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWJp+aDheeKtuaAgeS4iy7kuI3mkq3mlL7lvJXlr7xcbiAgICAgICAgdmFyIHN0b3J5X3N0YXR1cyA9IFN0b3J5Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuaXNTdG9yeVN0YXRlKCkgfHwgZmFsc2U7IFxuICAgICAgICBpZiAoc3Rvcnlfc3RhdHVzKSB7XG4gICAgICAgICAgICB0aGlzLmd1aWRlX2xpc3QucHVzaChjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyDlpoLmnpzlh7rljYfnuqfmj5DnpLpcbiAgICAgICAgLy8gdmFyIGlzX2lubGV2aXBncmFkZSA9IExldnVwZ3JhZGVDb250cm9sbGVyOmdldEluc3RhbmNlKCk6d2FpdExldnVwZ3JhZGUoKVxuICAgICAgICAvLyBpZiBpc19pbmxldmlwZ3JhZGUgdGhlblxuICAgICAgICAvLyAgICAgdGFibGVfaW5zZXJ0KCBzZWxmLmd1aWRlX2xpc3QsIDEsIGNvbmZpZyApXG4gICAgICAgIC8vICAgICByZXR1cm5cbiAgICAgICAgLy8gZW5kXG5cbiAgICAgICAgLy8g5aaC5p6c5Zyo5byV5a+85Lit55qE5pe25YCZLOS4jeaSrSznvJPlrZjov5nlkKdcbiAgICAgICAgaWYgKHRoaXMuY3VyX2d1aWRlX2NvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5ndWlkZV9saXN0LnB1c2goY29uZmlnKTsgICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNjLmxvZyhcIjMzMzNcIik7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5hY3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wbGF5R3VpZGUoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQbGF5R3VpZGUoZmFsc2UsIGNvbmZpZy5iaWQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHBsYXlHdWlkZTogZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgIGlmICh0aGlzLmlzX2d1aWRpbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5jdXJfZ3VpZGVfY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmlzX2d1aWRpbmcgPSB0cnVlO1xuICAgICAgICBcbiAgICAgICAgaWYgKGNvbmZpZy5pc19jbG9zZSA9PSAxKSB7XG4gICAgICAgICAgICBVdGlscy5jbG9zZUFsbFdpbmRvdygpO1xuICAgICAgICAgICAgLy8gQmFzZVZpZXcuY2xvc2VBbGxWaWV3KClcbiAgICAgICAgfVxuICAgICAgICAvLyBCYXNlVmlldy5jbG9zZVNvbWVXaW4oKVxuXG4gICAgICAgIC8vIOS4u3Vp55qE6IGK5aSp5rCU5rOhXG4gICAgICAgIC8vIHZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpXG4gICAgICAgIC8vIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRNYWluVUlDaGF0QnViYmxlU3RhdHVzKGZhbHNlKVxuXG4gICAgICAgIGlmICghdGhpcy5ndWlkZV92aWV3KSB7XG4gICAgICAgICAgICB0aGlzLmd1aWRlX3ZpZXcgPSBuZXcgR3VpZGVNYWluVmlldyh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ3VpZGVfdmlldy5vcGVuKCk7XG4gICAgICAgIHRoaXMuZ3VpZGVfdmlldy5hZGRHdWlkKGNvbmZpZyk7XG4gICAgfSxcblxuICAgIGRlbGF5VG91Y2hFbmFibGVkOiBmdW5jdGlvbigpIHtcblxuICAgIH0sXG5cbiAgICBpc0luR3VpZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc19ndWlkaW5nO1xuICAgIH0sXG5cblxuXG4gICAgLy/miZPlvIDku7vliqHlvJXlr7xcbiAgICBvcGVuVGFza0d1aWRlV2luZG93OmZ1bmN0aW9uKHN0YXR1cyxjb25maWcpe1xuICAgICAgICBpZihzdGF0dXMpe1xuICAgICAgICAgICAgaWYodGhpcy50YXNrX2d1aWRlX3dpbmRvdyA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tfZ3VpZGVfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJ0YXNrX2d1aWRlX3dpbmRvd1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudGFza19ndWlkZV93aW5kb3cub3Blbihjb25maWcpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMudGFza19ndWlkZV93aW5kb3cpe1xuICAgICAgICAgICAgICAgIHRoaXMudGFza19ndWlkZV93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudGFza19ndWlkZV93aW5kb3cgPSBudWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFRhc2tHdWlkZVdpbmRvdzpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrX2d1aWRlX3dpbmRvd1xuICAgIH0sXG5cbiAgICBnZXRUYXNrR3VpZGVFZmZlY3RTdGF0dXM6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy50YXNrX2d1aWRlX3dpbmRvdyl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXNrX2d1aWRlX3dpbmRvdy5nZXRFZmZlY3RBY3RpdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgc2V0R3VpZGVNYWluUm9vdFduZDpmdW5jdGlvbihzdGF0dXMpe1xuICAgICAgICBpZih0aGlzLmd1aWRlX3ZpZXcpe1xuICAgICAgICAgICAgdGhpcy5ndWlkZV92aWV3LnJvb3Rfd25kLmFjdGl2ZSA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEd1aWRlQ29udHJvbGxlcjsiXX0=